var test = true;

var servicePath = "/service/";

var SERVICES = {};

SERVICES['productDetails'] = "productDetails.do";

SERVICES['productOfDay'] = "productOfDay.do";
SERVICES['productsTop10'] = "top10.do";

SERVICES['cartTotAmount'] = "cartTotAmountController.do";
SERVICES['cartTotQuantity'] = "cartTotQt.do";
SERVICES['cartAdd'] = "addCart.do";
SERVICES['cartChangeQuantity'] = "cartQt.do";
SERVICES['cartRemove'] = "cartRemoveItem.do";
SERVICES['cartList'] = "cart.do";
SERVICES['cartRule'] = "cartRuleController.do";
SERVICES['cartPinkDiscount'] = "pinkCardDiscountController.do";
SERVICES['cartShipCost'] = "shippingCharges.do";
SERVICES['cartFinalPrice'] = "cartFinalAmountController.do";
SERVICES['cartRule'] = "cartRuleController.do";
SERVICES['cartAddPaymentMode'] = "eCommercePayType.do";
SERVICES['cartOrderCA'] = "eCommerceOrderCa.do";
SERVICES['cartOrderCC'] = "eCommerceOrderCc.do";
SERVICES['cartResult'] = "eCommerceResult.do";
SERVICES['cartSetPromoCode'] = "promoDiscountController.do";
SERVICES['cartViewPromoDiscount'] = "promoDiscountValueController.do";

SERVICES['search'] = "search.do";
SERVICES['searchBrandList'] = "brandList.do"; 
SERVICES['searchCategoryList'] = "categoryList.do"; 
SERVICES['searchColourList'] = "colourList.do"; 
SERVICES['searchMoodList'] = "moodList.do"; 

SERVICES['userLogged'] = "userController.do";
SERVICES['userFillProfile'] = "/it/consumer/vanity-room/common/il-mio-profilo.page?targetURI=/it/consumer/index.page&lang=it";
SERVICES['userLogin'] = "login.do";
SERVICES['userLogout'] = "logout.do";

SERVICES['userOrders'] = "userOrders.do";


var overlayActive = false;

function _invokeService(serviceId, parameters, callback) {
	
	displayOverlay();
	ajaxCall(servicePath + SERVICES[serviceId], parameters, callback, "json");
}

function _invokeServiceList(serviceList, callback, data) {
	
//	var sl = [{"id":"kora", "parameters":{"p1":"v1"}},
//				{"id":"timeo", "parameters":{"p2":"v2"}}];
	
	displayOverlay();
	if (serviceList.length>0) {
		ajaxCall(servicePath + SERVICES[serviceList[0].id], 
				serviceList[0].parameters, 
				function(data) {
					var sl = serviceList.slice(1,serviceList.length);
					_invokeServiceList(sl, callback, data)
				},
				"json");
	} else {
		callback(data);				
	}
}


function ajaxCall ( url, parameters, callback, type ) {

	return jQuery.ajax({
		type: "POST",
		async: true,
		url: url,
		data: parameters,
		success: function(data) { if (type == "json") { formatNumbersInData(data) }; callback(data) },
		complete:hideOverlay,
		dataType: type
	});
}

function formatNumbersInData(data)
{
	if (typeof(data)=="object")
	{
		for (var p in data)
			data[p] = formatNumbersInData(data[p]);
	}
	else if ($.isArray(data))
	{
		for (var i=0;i<data.length;i++)
		{
			obj[i] = formatNumbersInData(obj[i]);
		}
	}
	else if ( (typeof data) == "number" ) 
	{
		var sn = data + "";
		if (sn.indexOf(".")!=-1)
			return data.toFixed(2);
	}
	return data;
}

function checkObject(obj)
{
	var cnt = 0;
	for (var p in obj)
		cnt++;
	return cnt>0;
}

function ShopProxy() {
	
	var m_cart = new Cart();
	var m_showcase = new ShowCase();
	var m_searchEngine = new SearchEngine();
	var m_user = new User();
	var m_shopTracker = new ShopTracker();
	var m_tracking = new Tracking();
	
	this.getCart = function() {
		return m_cart;
	}
	
	this.getShowCase = function() {
		return m_showcase;
	}

	this.getSearchEngine = function() {
		return m_searchEngine;
	}

	this.getUser = function() {
		return m_user;
	}
	
	this.getShopTracker = function() {
		return m_shopTracker;
	}
	
	this.getTracking = function() {
		return m_tracking;
	}
	
}

function Cart() {
	
	this.totAmount = function(callback) {
		_invokeService('cartTotAmount', 
					{},
					callback);
	}
	
	this.totQuantity = function(callback) {
		_invokeService('cartTotQuantity', 
					{},
					callback);
	}
	
	this.add = function(idProduct, quantity, callback) {
		_invokeService('cartAdd', 
					{"quantity" : quantity, "idProduct": idProduct}, 
					callback);
	}
	
	this.changeQuantity = function(idProduct, quantity, callback) {
		_invokeService('cartChangeQuantity', 
					{"quantity" : quantity, "idProduct": idProduct}, 
					callback);
	}
	
	this.remove = function(idProduct, callback) {
		_invokeService('cartRemove', 
					{"idProduct": idProduct},
					callback);
	}
	
	this.removeAll = function(callback) {
		_invokeService('cartRemove', 
					{},
					callback);
	}
	
	this.list = function(callback) {
		_invokeService('cartList', 
					{},
					callback);
	}

	this.rules = function(callback) {
		_invokeService('cartRule', 
					{},
					callback);
	}
	
	this.pinkDiscount = function(callback) {
		_invokeService('cartPinkDiscount', 
					{},
					callback);
	}
	
	this.shipCost = function(callback) {
		_invokeService('cartShipCost', 
					{},
					callback);
	}
	
	this.finalPrice = function(callback) {
		_invokeService('cartFinalPrice', 
					{},
					callback);
	}
	
	this.addPaymentMode = function(paymentMode, callback) {
		_invokeService('cartAddPaymentMode', 
				{ 'paymentType' : paymentMode },
				callback);
	}

	this.orderByCash = function(callback) {
		_invokeService('cartOrderCA', 
				{},
				callback);
	}
	
	this.orderByCard = function() {

		window.location=SERVICES['cartOrderCC'] + "?targetURI=/service/eCommerceAcquirerController.do&url_back=/service/eCommerceAcquirerController.do";
	}
	
	this.showResult = function(codTrans, callback) {
		_invokeService('cartResult', 
				{ 'codTrans' : codTrans },
				callback);
	}
	
	this.promoCode = function(promoCode, callback) {
		_invokeService('cartSetPromoCode', 
				{ 'promoCode' : promoCode },
				callback);
	}
	
	this.promoDiscount = function(callback) {
		_invokeService('cartViewPromoDiscount', 
				{},
				callback);
	}

}

function ShowCase() {

	this.top10 = function(callback) {
		_invokeService('productsTop10', 
				{},
				callback);
	}
	
	this.dayProduct = function(callback) {
		_invokeService('productOfDay', 
				{},
				callback);
	}
	
	this.product = function(idProduct, callback) {
		_invokeService('productDetails', 
				{ 'id' : idProduct },
				callback);
	}
	
}

function SearchEngine() {

	this.search = function(parameters, callback) {
		_invokeService('search', 
					parameters,
					callback);
	}
	
	this.brandList = function(callback) {
		_invokeService('searchBrandList', 
					{},
					callback);
	}

	this.categoryList = function(idBrand, callback) {
		_invokeService('searchCategoryList', 
					{ 'idBrand' : idBrand },
					callback);
	}

	this.colourList = function(idBrand, callback) {
		_invokeService('searchColourList', 
					{ 'idBrand' : idBrand },
					callback);
	}

	this.moodList = function(callback) {
		_invokeService('searchMoodList', 
					{},
					callback);
	}

}

function User() {
	
	this.userLogged = function(callback) {
		_invokeService('userLogged', 
					{},
					callback);
	}
	
	this.fillProfile = function() {
		window.location=SERVICES['userFillProfile'];
	}
	
	this.login = function(nickname, password, callback) {
		_invokeService('userLogin', 
				{ 'nickname' : nickname, 'password' : password},
				callback);
	}
	
	this.logout = function(callback) {
		_invokeService('userLogout', 
				{},
				callback);
	}
	
}

function Tracking() {
	
	this.list = function(callback) {
  		_invokeService('userOrders', 
				{},
				callback);
	}
	
	
	
}

//---------------------------------------------------------------------------------------

var ajaxQueueCount = 0;

function displayOverlay()
{
	ajaxQueueCount++;
	if (ajaxQueueCount>1)
		return;
	if ($("#shopWait").length==0)
	{
		$(document.body).append('<div id="shopModalCover">&nbsp;</div>' +
						'<span id="shopWait">' +
						'<img src="/consumer/res/img/loader_white.gif"/>' +
						'Attendere..' +
						'</span>');
	}
	$("#shopModalCover").width($(window).width());
	$("#shopModalCover").height($(window).height());
	$("#shopModalCover").show();
	$("#shopWait").show();
		
}

function hideOverlay()
{
	ajaxQueueCount--;
	if (ajaxQueueCount>0)
		return;
	$("#shopModalCover").hide();
	$("#shopWait").hide();

}


function isEmptyOrNull(obj) {

	try {
		if (typeof obj != 'undefined') {
			if (obj.constructor.toString().indexOf("Array") == -1) {
				if (obj == "") {
					return true;
				} else if (obj == null) {
					return true;
				} else {
						return false;
				}
			} else {
				if (obj.length > 0) {
					return false;
				} else {
					return true;
				}
			}
		} else {
			return true;
		}
		
	} catch(err) {
		
		return true;
		if (err.description == "undefined") {
			return true;
		} else {
			alert (err.description);
		} 
	
	}
}

function isArray(obj) {

	try {
		if (obj.constructor.toString().indexOf("Array") == -1) {
			return false;
		} else {
			return true;
		}
		
	} catch(err) {
		if (err.description == "undefined") {
			return false;
		} else {
			alert (err.description);
		} 
	
	}
	
}

function isObjectEmpty(obj) {
	
	var count = 0;
  for(var p in obj) {
    if (obj[p] != obj.constructor.prototype[p])
      count++;
  }
	
	if (count == 0) {
		return true;
	} else {
		return false;
	}
}

function hash2JSON(hashStr) {
	var resObj = null;
	if (!isEmptyOrNull(hashStr)) {
		if (hashStr == "#") {
			hashStr = hashStr.substr(1);
		}
		
		hashStr = hashStr.split("&amp;").join("&");
		
		var aryHash = hashStr.split("&");
		
		var objHash = {};
		for (i=0; i < aryHash.length; i ++) {
			if (aryHash[i].charAt(0) == "/") {
				objHash['qualifier'] = aryHash[i];
			} else if (aryHash[i].indexOf("=") != -1) {
				var aryTemp = aryHash[i].split("=");
				objHash[aryTemp[0]] = aryTemp[1];
			}
		}
		
		resObj = objHash;
	
	}
	
	return resObj;
}

function hash2JSON_old(hashStr) {
	var resObj = null;
	
	if (!isEmptyOrNull(hashStr)) {
		var qualifier = null;
		var result = "({ '";
		if (hashStr.substr(hashStr.indexOf("#") + 1, hashStr.indexOf("#") + 2) == "/") {
			qualifier = hashStr.substr(hashStr.indexOf("#") + 1, hashStr.indexOf("&") - 1);
			qualifier = qualifier.trim();
			qualifier = qualifier.toLowerCase();
			qualifier = qualifier.replace(" ", "-");
			result = result + hashStr.substr(hashStr.indexOf("&") + 1);
		} else {
			result = result + hashStr.substr(hashStr.indexOf("#") + 1);
		}
		result = result.replace(/\&/g,"', '");
		result = result.replace(/\=/g,"' : '");
		result = result + "' })";

		resObj = eval (result);
		if (qualifier != null) {
			resObj.qualifier = qualifier;
		}
	}

	return resObj;
};

String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

function qualifier2Hash(qualifierObj) {
	
	var qualifier = "";
	if (!isEmptyOrNull(qualifierObj.brand)) {
		qualifier = qualifier + "/";
		qualifier = qualifier + qualifierObj.brand.trim().toLowerCase().split(" ").join("-").split("/").join("-");
		if (!isEmptyOrNull(qualifierObj.category)) {
			qualifier = qualifier + "/";
			qualifier = qualifier + qualifierObj.category.trim().toLowerCase().split(" ").join("-").split("/").join("-");
			if (!isEmptyOrNull(qualifierObj.product)) {
				qualifier = qualifier + "/";
				qualifier = qualifier + qualifierObj.product.trim().toLowerCase().split(" ").join("-").split("/").join("-");
			}
		}
		qualifier = qualifier + "&";
	}

	return qualifier;
}

function hideErrorBox() {
	//$("#overlaylogin").hide();
 	$("#errorpopup").hide();
	return false;
};

function errorpopup(err) {
 	$("#overlaylogin").css("height", $(window).height());
	var m_top = ($(window).height()/2)-(200)+$(document).scrollTop();
	var m_left = ($(window).width()/2)-(230);
	$("#errorpopup").css("top", m_top+"px").css("left", m_left+"px");
	$("#errorpopup").show();
	$("#errorpopup p").html(err);
	$("#closeerror").click(function() {
		hideErrorBox();
		return false;
	});
	$("#closebtn").click(function() {
		hideErrorBox();
		return false;
	});
}