/*
User profile API

Usage:  1. get user profile class via "var userProfile = embGetProfileManager()"
		2. get profile information via public methods of returned object, e.g.
		   "userProfile.getFirstName()" or directly via "embGetProfileManager().getFirstName()"

*/

// (hide everything except the things we make public explicitly)
(function() {

var embProfileManager = new EmbProfileManager();

// user profile is singleton
window.embGetProfileManager = function () {
  return embProfileManager;
};

function EmbProfileManager() {
	var callbacks = [];
	var callbacksSingleShot = [];

	//  private variables
	this.MODEL_COOKIE = "model";
	this.PROFILE_REF_COOKIE = "_pr";
	this.CMA_PROFILES_COOKIE = "cma_profiles";
	this.COOKIE_LAST_CC_BM_CODE = "lastCCBmCode";
	
	var userData = new Object();
	var metaData = new Object();
	var hasData = false;

	this.PROFILE_REF_COOKIE_VALUE = get_cookie(this.PROFILE_REF_COOKIE);
	this.CMA_PROFILES_COOKIE_VALUE = get_cookie(this.CMA_PROFILES_COOKIE);
	
	// Save during first use of loadData for reuse in updateProfile
	this.secureHost = "";
	this.signonHandle = "";
	this.locale = "";
	
	userData.isLoggedIn = false;
	userData.isSoftLoggedIn = false;
	
	this.addUpdateCallback = function(callback, singleshot) {
		if (!callback) {
			return;
		}
		var l = (singleshot? callbacksSingleShot : callbacks);
		l[l.length] = callback;
		if (!singleshot && hasData) {
			callback();
		}
	};

	this.removeUpdateCallback = function(callback) {
		callbacks.remove(callback);
		callbacksSingleShot.remove(callback);
	};
	this.updateCallbacks = function() {
		for (var i in callbacks) {
			try {
				callbacks[i]();
			} catch (e) {}
		}
		for (var i in callbacksSingleShot) {
			try {
				callbacksSingleShot[i]();
			} catch (e) {}
		}
		callbacksSingleShot = [];
	};
	
	this.updateProfile = function(/*Function*/ callback) {
		var cookie;
		cookie = get_cookie(this.PROFILE_REF_COOKIE);
		if (cookie) {
			this.PROFILE_REF_COOKIE_VALUE = cookie;
		}
		cookie = get_cookie(this.CMA_PROFILES_COOKIE);
		if (cookie) {
			this.CMA_PROFILES_COOKIE_VALUE = cookie;
		}

		if (this.PROFILE_REF_COOKIE_VALUE && this.secureHost && this.signonHandle && this.locale) {
			// register callback if set
			this.addUpdateCallback(callback, true);
			
			var scriptTag = document.createElement("script");
			var srcAttribute = document.createAttribute("src");
			srcAttribute.nodeValue = this.secureHost + this.signonHandle +".profiledata." + this.PROFILE_REF_COOKIE_VALUE + ".js?locale=" + this.locale;
			scriptTag.setAttributeNode(srcAttribute);
			document.getElementsByTagName("head")[0].appendChild(scriptTag);
		}
		
	};

	this.setUserData = function(data) {
		userData = data;
		hasData = true;
		this.updateCallbacks();
	};
	
	this.setMetaData = function(data) {
		metaData = data;
	};
	
	this.fixNumberFormatting = function(formattedNumber) {
		// Workaround which will only work in german market!
		var newval = formattedNumber;
		var dotIndex = formattedNumber.lastIndexOf(".");
		var commaIndex = formattedNumber.lastIndexOf(",");
		if (dotIndex > commaIndex) {
			newval = newval.replace(",", ".");
			newval = newval.substring(0, dotIndex) + "," + newval.substring(dotIndex + 1, newval.length);
		}
		return newval;
	};
	
	// public methods
	
	this.getUserId = function() {
		return userData.userId;
	};
	
	// DEPRECATED
/*	this.isRegistered = function () {
		return (null != this.PROFILE_REF_COOKIE_VALUE && this.PROFILE_REF_COOKIE_VALUE.length) > 0
				|| (null != this.CMA_PROFILES_COOKIE_VALUE && this.CMA_PROFILES_COOKIE_VALUE.length > 0); 
	};
*/
	this.isLoggedIn = function () {
		if(userData.isLoggedIn && !userData.isSoftLoggedIn){
			return true;
		}else{
			return false;
		}
	};
	
	this.isSoftLoggedIn = function () {
		if(userData.isLoggedIn && userData.isSoftLoggedIn){
			return true;
		}else{
			return false;
		}
	};

	this.hasFavorite = function() {
		if(userData && userData.favoriteName) {
			return true;
		}
		return false;
	};

	function avoidNull(userDataAttribut) { 
		if(userDataAttribut == undefined || userDataAttribut == null){
			return "";
		}else{
			return userDataAttribut;
		}
	}
	function gluePaths(a,b) {
		b = avoidNull(b);
		if (!a || "" == a || "" == b) {
			return b;
		}
		var r = a;
		if (b.indexOf("/") != 0 && a.lastIndexOf("/") != a.length - 1) {
			r = r + "/";
		}
		r = r + b;

		return r;
	}
	function addBypass(imgUrl) {
		return gluePaths(metaData.crmServiceBypass, imgUrl);
	}
	this.isUnregistered = function () {
		if(!userData.isLoggedIn && !userData.isSoftLoggedIn){
			return true;
		}else{
			return false;
		}
	};

	this.getFirstName = function () {
		return avoidNull(userData.firstName);
	};

	this.getSecondFirstName = function () {
		return  avoidNull(userData.secondFirstName);
	};
	
	this.getLastName = function () {
		return  avoidNull(userData.lastName);
	};

	this.getSecondLastName = function () {
		return avoidNull(userData.secondLastName);
	};
	
	this.getTitle = function () {
		return avoidNull(userData.title);
	};
	
	this.getSalutation = function () {
		return avoidNull(userData.salutation);
	};
	
	this.getDealerName1 = function () {
		return avoidNull(userData.dealerName1);
	};
	
	this.getDealerName2 = function () {
		return avoidNull(userData.dealerName2);
	};
	
	this.getDealerStreet = function () {
		return avoidNull(userData.dealerStreet);
 	};
 	
 	this.getDealerZIP = function () {
 		return avoidNull(userData.dealerZIP);
 	};
 	
 	this.getDealerCity = function () {
 		return  avoidNull(userData.dealerCity);
	};
	
 	this.getZipCode = function () {
		return avoidNull(userData.zipCode);
	};
	
	this.getBirthday = function () {
		return avoidNull(userData.birthday);
	};
	
	this.getFavoriteName = function () {
		return avoidNull(userData.favoriteName);
	};
	
	this.getVehicles = function () {
		return avoidNull(userData.Vehicles);
	};
	this.getConfiguredBmCode = function () {
		return  avoidNull(userData.configuredBmCode);
	};
	
	this.getFavoriteBmCode = function () {
		return avoidNull(userData.favoriteBmCode);
	};
	
	this.getFavoritePrice = function () {
		return this.fixNumberFormatting( avoidNull(userData.favoritePrice));
	};
	
	this.getFavoriteCurrency = function () {
		return avoidNull(userData.favoriteCurrency);
	};
	
	this.getFavoriteRate = function () {
		//return userData.favoriteRate;
		// Rate disabled, just return empty string.
		return "";
	};
	
	this.getFavoriteDate = function () {
		return avoidNull(userData.favoriteDate);
	};
	this.getConfiguredVehiclesCount= function () {
		return avoidNull(userData.configuredVehiclesCount);
	};
	this.getOwnedVehiclesCount= function () {
		return avoidNull(userData.ownedVehiclesCount);
	};
	this.getOwnedMainVehicleByCustomer= function () {
		return avoidNull(userData.ownedMainVehicleByCustomer);
	};
	this.getOwnedMainVehicleName = function () {
		return avoidNull(userData.ownedMainVehicleName);
	};
	this.getOwnedMainVehicleBmCode= function () {
		return avoidNull(userData.ownedMainVehicleBmCode);
	};
	
	this.getSingleOwnedVehicleName= function () {
		return userData.singleOwnedVehicleName;
	};
	this.getSingleOwnedVehicleBmCode= function () {
		return avoidNull(userData.singleOwnedVehicleBmCode);
	};
	this.getSingleOwnedVehicleImgSmallUrl = function () {
		var imgUrl =  addBypass(userData.singleOwnedVehicleImgSmallUrl);
		return imgUrl;
	};
	
	this.getSingleConfiguredVehicleName= function () {
		return avoidNull(userData.singleConfiguredVehicleName);
	};
	this.getSingleConfiguredVehicleBmCode= function () {
		return avoidNull(userData.singleConfiguredVehicleBmCode);
	};
	this.getSingleConfiguredVehicleImgSmallUrl = function () {
		var imgUrl = addBypass(userData.singleConfiguredVehicleImgSmallUrl);
		return imgUrl;
	};
	
	this.getOwnedMainVehicleImgSmallUrl = function () {
		var imgUrl = addBypass(userData.ownedMainVehicleImgSmallUrl);
		return imgUrl;
	};
	
	this.getStageImageUrl = function(){
		var imgUrl = addBypass(userData.stageImageUrl);
		return imgUrl;
	};
	
	this.getFavoritePriceLabel = function () {
		if(userData.favoritePriceLabel == undefined || userData.favoritePriceLabel == null){
			return "";
		}else{
			return userData.favoritePriceLabel;
		}
	};

	this.getFavoriteRateLabel = function () {
		/*
		if(userData.getFavoriteRateLabel == undefined || userData.getFavoriteRateLabel == null){
			return "";
		}else{
			return userData.favoriteRateLabel;
		}*/
		// Rate disabled, just return empty string.
		return "";
	};
	

	this.getConfigurationBmCode = function () {
		if(get_cookie(this.COOKIE_LAST_CC_BM_CODE)){
			return get_cookie(this.COOKIE_LAST_CC_BM_CODE);
		}else{
			return get_cookie(this.MODEL_COOKIE);
		}
	};
	
	this.getFavoriteImgSmallUrl = function () {
		var imgUrl = addBypass(userData.favoriteImgSmallUrl);
		return imgUrl;
	};
	
	this.getFavoriteImgLargeUrl = function () {
		var imgUrl =  addBypass(userData.favoriteImgLargeUrl);
		return imgUrl;
	};
	
	this.getCCiUrl = function () {
		return "/cci";
	};
	
	this.getSavedVehiclesUrl = function () {
		return "/saved_vehicles";
	};
	
	/**
	 * @returns either the bmcode of the vehicle the user is interested in or null if he has no vehicle interest yet.
	 */
	this.getVehicleInterestBmCode = function () {
		// read out model cookie value;
		return get_cookie(this.MODEL);
	};
	
	this.getGroups = function () {
		var groups =  avoidNull(userData.groups);
		return groups[0];
	};
	
	this.getFlGroups = function () {
		var flgroups = avoidNull(userData.flgroups);
		return flgroups[0];
	};
	
	this.getWPCampaignCodes = function () {
		var wpcampaignCodes = avoidNull(userData.wpcampaignCodes);
		return wpcampaignCodes[0];
	};
	
	this.getCampaignCodes = function () {
		var campaignCodes = avoidNull(userData.campaignCodes);
		return campaignCodes[0];
	};
	
	this.getBusinessUnitType = function () {
		var businessUnit = avoidNull(userData.businessUnitType);
		return businessUnit;
	}
	
	this.isBusinessUnitCar = function() {
		var isBusinessUnitCar = false;
		var but = this.getBusinessUnitType();
		if(but === 'PassengerCar'){
			isBusinessUnitCar = true;
		} 
		return isBusinessUnitCar;
	}
	
	this.isBusinessUnitVan = function() {
		var isBusinessUnitVan = false;
		var but = this.getBusinessUnitType();
		if(but === 'PrivateVan'){
			isBusinessUnitVan = true;
		} 
		return isBusinessUnitVan;
	}
	
	this.loadData = function(secureHost, signonHandle, locale, callback) {
		this.addUpdateCallback(callback);
		this.secureHost = secureHost;
		this.signonHandle = signonHandle;
		this.locale = locale;

		this.PROFILE_REF_COOKIE_VALUE = get_cookie(this.PROFILE_REF_COOKIE);
		this.CMA_PROFILES_COOKIE_VALUE = get_cookie(this.CMA_PROFILES_COOKIE);
		
		if (this.PROFILE_REF_COOKIE_VALUE && this.PROFILE_REF_COOKIE_VALUE!= "null") {
			var scriptpath = 
				this.secureHost + 
				this.signonHandle +
				".profiledata." + 
				this.PROFILE_REF_COOKIE_VALUE + 
				".js?locale=" + 
				this.locale;
			var scriptTag = 
				"<script src='" +
				scriptpath +
				"' type='text/javascript'></script>";
			document.write(scriptTag);
		}
	};
}

})();
