var path_to_ep_files = '/html/Ajax/';

/* --------------------------
 *       Ajax Cart
 * -------------------------- */
/**
 * Refresh the cart.
 * Callback : callbackAjaxCart(json)
 */
function callAjaxGetCart(){
	He.Application.User.Cart = null;
	extShoppingCartAjaxController.getShoppingCart(callbackAjaxCart);
}

/**
 * Adds a product to a cart.
 * Callback : callbackAjaxCart(json)
 * @param productSkuCode, code of the productSku to add.
 * @param quantity the quantity to add.
 */
function callAjaxAddToCart(productSkuCode, quantity){
	He.Application.User.Cart = null;
	extShoppingCartAjaxController.addProductSkuQuantity(productSkuCode, quantity, callbackAjaxCart);
}

/**
 * Update the quantity of items in a cart
 * Callback : callbackAjaxCart(json)
 * @param productSku, code of the productSku to add.
 * @param quantity the quantity to update.
 */
function callAjaxChangeQuantityInCart(cartItemId, productSkuCode, quantity){
	He.Application.User.Cart = null;
	extShoppingCartAjaxController.updateQuantity(cartItemId, productSkuCode, quantity, callbackAjaxCart);
}

/**
 * Delete a cart line.
 * Callback : callbackAjaxCart(json)
 * @param productSkuCode, code of the productSku to add.
 */
function callAjaxDeleteFromCart(deleteShoppingCartItemGuid){
	He.Application.User.Cart = null;
	extShoppingCartAjaxController.deleteShoppingCartItem(deleteShoppingCartItemGuid, callbackAjaxCart);
}

/**
 * Adds samples to the cart.
 * Callback : callbackAjaxCart(json)
 */
function callAjaxAddSampleToCart(){
	He.Application.User.Cart = null;
	var bundleCode = $('#bunbleCode').val();
	var lskuCode = new Array();
	$('input.sample_item').each(function()
	{
		if( this.checked ){
			var vskucode = this.id;
			lskuCode.push(vskucode);
		}
	});
	extShoppingCartAjaxController.addSamples(bundleCode, lskuCode, callbackAjaxCart);
}

/**
 * Adds a promotion code to the cart.
 * Callback : callbackAjaxCart(json)
 * @param code Promotion code as typed by the webuser.
 */
function callAjaxCheckPromotionCode(code){
	He.Application.User.Cart = null;
	extShoppingCartAjaxController.checkPromotionCode(code, callbackAjaxCart);
}

/**
 * Set the shipping type for the cart.
 * Callback : callbackAjaxCart(json)
 * @param code the shipping service level code.
 */
function callAjaxSetShippingCode(code){
	He.Application.User.Cart = null;
    extShoppingCartAjaxController.selectShippingServiceLevel(code, callbackAjaxCart);
}

function callbackAjaxCart(shoppingCart){
	He.Application.User.Cart = shoppingCart;
}

/* --------------------------
 *       Ajax Selection
 * -------------------------- */
/**
 * Adds a product to the users selection.
 * Callback : callbackAjaxSelection(json)
 * @param product SKU of the product to add.
 */
function callAjaxAddToSelection(product){
	He.Components.Selection.Json = null;
	extShoppingCartAjaxController.addWishListItem(product, callbackAjaxSelection);
}

/**
 * Remove a product to the wish list of a user.
 * Callback : callbackAjaxSelection(json)
 * @param selectionUIDPK The UIDPK of the selection.
 */
function callAjaxRemoveFromSelection(selectionUIDPK){ 
	He.Components.Selection.Json = null;
	extShoppingCartAjaxController.deleteWishListItem(selectionUIDPK, callbackAjaxSelection);
}

function callAjaxMoveFromSelectionToCart(){
	He.Components.Selection.Json = null;
	var lskuCode = new Array();
	$("input[name='sku']").each(function()
	{
		if( this.checked ){
			lskuCode.push( this.id );
		}
	});
	
	if( lskuCode.length <= 0 ){
		var jsonFailNosku = ({
			status	: 'nosku'
		});
		callbackAjaxSelection(jsonFailNosku);
		return;
	}
	
	
	extShoppingCartAjaxController.moveWishListItemToCart(lskuCode, callbackAjaxSelection);
}
function callbackAjaxSelection(json){
	He.Components.Selection.Json = json;
}

/* --------------------------
 *       Ajax Advice
 * -------------------------- */
/**
 * Adds +1 to the advices on a product page.
 * Callback : callbackAjaxAdvice(json)
 * @param product  SKU of the product to add.
 */
function callAjaxAdvice(productCode){ 
	He.Application.User.ProductAdvice = null;
	extShoppingCartAjaxController.addProductRecommendation(productCode, callbackAjaxAdvice);
}
 
function callbackAjaxAdvice(json){
	He.Application.User.ProductAdvice = json;
}

/* --------------------------
 *       Ajax Newsletter
 * -------------------------- */
/**
 * Test the email, if it's exist
 * Callback : callbackAjaxNewsletter(json)
 * @param email to check.
 */
function callAjaxNewsletterCheckEmail(email){ 
	He.Application.User.Newsletter = null;
	emailAjaxController.isAlreadyRegister(email, callbackAjaxNewsletter);
}
 
function callbackAjaxNewsletter(json){
	He.Application.User.Newsletter = json;
}

/* --------------------------
 *       Ajax USER
 * -------------------------- */
 /**
 * Get an address to a user.
 * Callback : callbackAjaxAddress(json)
 * @param addressUid the id address.
 */
function callAjaxGetAdress(addressUid){
	He.Application.User.Address = null;
	addressAjaxController.getAddress(addressUid, callbackAjaxAddress);
}

/**
 * Add an address to a user.
 * Callback : callbackAjaxAddress(json)
 * @param addressSerialized the serialized address form.
 * @param type the address type ('S' for shipping, 'B' for Billing).
 */
function callAjaxAddAdress(addressSerialized, type){ 
	He.Application.User.Address = null;
	addressAjaxController.addAddress(getAddressJSonByAddressSerialized(addressSerialized), type, callbackAjaxAddress);
}

/**
 * update an user's address.
 * Callback : callbackAjaxAddress(json)
 * @param addressSerialized the serialized address form.
 */
function callAjaxUpdateAdress(addressSerialized){
	He.Application.User.Address = null;
	addressAjaxController.updateAddress(getAddressJSonByAddressSerialized(addressSerialized), callbackAjaxAddress);
}

function getAddressJSonByAddressSerialized(addressSerialized){
	var addressUnSerialized = addressSerialized.split("&");
	var addressName = '';
	var defaultAddress = false;
	var addressCivility = '';
	var addressLastName = '';
	var addressFirstName = '';
	var addressStreet1 = '';
	var addressStreet2 = '';
	var addressZip = '';
	var addressCity = '';
	var addressCountry = '';
	var addressState = '';
	var addressPhone = '';
	var addressMobilePhone = '';

	var addressItemLength = addressUnSerialized.length;
	for(i = 0; i < addressItemLength; i++) {
		var addressItemTemp = addressUnSerialized[i];
		var addressItem = addressItemTemp.split("=");
		if(addressItem[0] == 'address_name'){
			addressName = addressItem[1];		
		} else if(addressItem[0] == 'default'){
			/* defaultAddress = addressItem[1];  */
		} else if(addressItem[0] == 'billing_civility' || addressItem[0] == 'civility'){
			addressCivility = addressItem[1];
		} else if(addressItem[0] == 'lastname'){
			addressLastName = addressItem[1];
		} else if(addressItem[0] == 'firstname'){
			addressFirstName = addressItem[1];
		} else if(addressItem[0] == 'address'){
			addressStreet1 = addressItem[1];
		} else if(addressItem[0] == 'address2'){
			addressStreet2 = addressItem[1];
		} else if(addressItem[0] == 'zip_code'){
			addressZip = addressItem[1];
		} else if(addressItem[0] == 'city'){
			addressCity = addressItem[1];
		} else if(addressItem[0] == 'country'){
			addressCountry = addressItem[1];
		} else if(addressItem[0] == 'state'){
			addressState = addressItem[1];
		} else if(addressItem[0] == 'phone'){
			addressPhone = addressItem[1];
		} else if(addressItem[0] == 'mobilephone'){
			addressMobilePhone = addressItem[1];
		}
	}

	var jsonToEp = ({
			uidpk			: '',
			addressname		: addressName,
			firstname		: addressFirstName,
			lastname		: addressLastName,
			civility		: addressCivility,
			street1			: addressStreet1,
			street2			: addressStreet2,
			zipcode			: addressZip,
			country			: addressCountry,
			city			: addressCity,
			state			: addressState,
			phone			: addressPhone,
			mobilephone		: addressMobilePhone,
			isdefault		: defaultAddress
	});
	
	return jsonToEp;
}

/**
 * Removes an user's address.
 * Callback : callbackAjaxAddress(json)
 * @param addressUid the Uid of the address in the user.
 */
function callAjaxRemoveAdress(addressUid){
	He.Application.User.Address = null;
	addressAjaxController.removeAddress(addressUid, callbackAjaxAddress);
}
 
function callbackAjaxAddress(json){
	He.Application.User.Address = json;
}
 
/* --------------------------
 *       Ajax CAPTCHA
 * -------------------------- */
/**
 * Select a random captcha.
 * Callback : callbackAjaxGetCaptcha(json)
 */
function callAjaxGetCaptcha(){ 
	captchaAjaxController.getCaptcha(callbackAjaxGetCaptcha);
}

function callAjaxGetCaptchaBlack(){ 
	captchaAjaxController.getCaptchaBlack(callbackAjaxGetCaptcha);
}
 
function callbackAjaxGetCaptcha(json){
	He.Components.SendByEmail.DisplayCaptcha(json);
}

/* --------------------------
 *       Ajax Email
 * -------------------------- */
/**
 * Select a random captcha.
 * Callback : callbackAjaxGetCaptcha(json)
 */
function callAjaxSendToFriend(mailSERIAL){
	
	var mailUnSerialized = mailSERIAL.split("&");
	
	var vlastname = '';
	var vfirstname = '';
	var vemail = '';
	var vmessage = '';
	var vcaptcha = '';
	var vtype = '';

	for(i = 0; i < mailUnSerialized.length; i++) {
		var mailItemTemp = mailUnSerialized[i];
		var mailItem = mailItemTemp.split("=");

		if(mailItem[0] == 'lastname'){
			vlastname = mailItem[1];		
		} else if(mailItem[0] == 'firstname'){
			vfirstname = mailItem[1];
		} else if(mailItem[0] == 'email'){
			vemail = mailItem[1];
		} else if(mailItem[0] == 'message'){
			vmessage = mailItem[1];
		} else if(mailItem[0] == 'captcha'){
			vcaptcha = mailItem[1];
		} else if( mailItem[0] == 'type'){
			vtype = mailItem[1];
		}
	}

	var lskuCode = new Array();
	if( vtype == 'wishlist'){
		$("input[name='sku']").each(function()
		{
			if( this.checked ){
				lskuCode.push(this.id);
			}
		});
		
		if( lskuCode.length <= 0 ){

			var jsonFailNosku = ({
				status	: 'nosku'
			});
			callbackAjaxSendToFriend(jsonFailNosku);
			return;
		}
	}else if( vtype == 'product'){
		lskuCode.push(He.Components.AddToCart.UnitPriceObj.skuKey);
	}
	
	var jsonToEp = ({
			lastname	: vlastname,
			firstname	: vfirstname,
			email		: vemail,
			message		: vmessage,
			captcha		: vcaptcha,
			type 		: vtype,
			skus		: lskuCode
	});
	
	emailAjaxController.sendByEmail(jsonToEp, callbackAjaxSendToFriend);
}
 
function callbackAjaxSendToFriend(json){
	He.Components.SendByEmail.Reponse(json);
}

/* --------------------------
 *       Ajax Store
 * -------------------------- */
 
function callAjaxStore(city, all, type) {
	if(all == true){
		storeLocatorAjaxController.getRetailOutlet(city, callbackAjaxStore);
	}else{
		storeLocatorAjaxController.getRetailOutletType(city, type, callbackAjaxStore);
	}
}
 
function callbackAjaxStore(json) {
	He.Components.StoreLocator.DisplayData(json);
}
