var efShopcartGlobals = {
	action				: '/uscr/forms2.asp?formID=1223',
	paramDelimiter		: '__,__',
	productWrapperClass	: 'efShopcartItemBlock',
	equalityFields		: ['name','article']
}

var efShopcartTools = {
	itemsArr: [],
	
	items: function(pItems) {
		itemsArr = pItems;
		return this;
	},
	
	each: function(fnc) {
		var len = itemsArr.length;
		for(var i = 0; i < len; i++) {
			fnc(itemsArr[i]);
		}
		itemsArr.length = 0;
	},
	
	stringToObject: function(pParamsStr, pDelimiter, paramCallback) {
		var obj = [];
		var parametersArr = pParamsStr.split(pDelimiter);
		var len = parametersArr.length;		
		var parameter;
		
		if(typeof paramCallback != 'function') {
			paramCallback = function(keyAndValue){ return keyAndValue; };
		}
		
		for (var i=0; i < len - 1; i++) {
			parameter = parametersArr[i].split('=');
			parameter = paramCallback(parameter);
			
			obj[parameter[0]] = parameter[1];
		}
		return obj;
	},
	
	$: function(id) {
		return document.getElementById(id) || null;
	},
	
	isCookieEnabled: function() {
		var cookieEnabled = false;
		if (typeof document.cookie == 'string') {
			if (document.cookie.length == 0) {
				document.cookie = 'test';
				cookieEnabled = (document.cookie = 'test');
				document.cookie = '';
			} else {
				cookieEnabled = true;
			}
		}
		return cookieEnabled;
	},
	
	setCookie: function(name, value, expires, path, domain, secure) {
		document.cookie = name +"=" + value +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "")
	},
	
	getCookie: function(key) {
		var start = document.cookie.indexOf(key);
		if(start == -1) {
			return '';
		}
		
		// In IE6 cookie has no '=' sign after name in case when its value is empty;
		start = start + key.length
		if(document.cookie.charAt(start) == '=') {
			start += 1;
		}		
		
		var end = document.cookie.indexOf(';', start);		
		if(end == -1) {
			end = document.cookie.length;
		}
		
		return unescape( document.cookie.substring( start, end ) );
	},
	
	toggleClass: function(id, newClass) {
		var el = this.$(id);
		
		try {
			if( el.className.indexOf(newClass) != -1 ) {
				el.className = el.className.replace(newClass, '');
			} else {
				el.className += ' '+newClass;
			}
		} catch(e){
			return false;
		}
		return true;
	},
	
	round: function(number, precision) {
		var mult;
		
		precision = parseInt(precision) || 0;
	
		mult = Math.pow(10, precision);
		
		number *= mult;
		number = Math.round(number);
		number /= mult;
		
		return number;
	}
}

function efShopcartClick(pObj) {
	if( efShopcartTools.isCookieEnabled() ) {
		efShopcartAdd(pObj);
	}
	else {
		alert("К сожалению, Ваш браузер настроен так, чтобы блокировать работу корзины.\n\nСвяжитесь с нами для заказа товара.");
	}
}

function efShopcartStoreProduct(pProduct) {
	var toCookie = efShopcartProductToCookieString(pProduct);
	toCookie = efShopcart_Url.encode(toCookie);
	
	if( efShopcartTools.isCookieEnabled() ) {
		efShopcartSetCookie(pProduct.id, toCookie);
	}
	else {
		var newWindow = window.open("/_efshopcart.html?" + toCookie,"cartWindow","height=570,width=640,status=no,resizable=yes,scrollbars=yes,toolbar=no,menubar=no,location=no,directories=no,left=" + (screen.availWidth-640)/2 + ",top=" + (screen.availHeight-570)/2);
		newWindow.focus();
	}
}

function efShopcartAdd(pObj, pIsSetCookie) {
	var parentObj = pObj.parentNode;
	while( !(parentObj.className && parentObj.className.indexOf(efShopcartGlobals.productWrapperClass) != -1)) {
		parentObj = parentObj.parentNode;
	}
	
	var items = parentObj.getElementsByTagName("span");	
	var index = Math.floor(Math.random() * 100000);
	var item, len, iName, iValue;
	var product = {};
	
	product.id = index;
	len = items.length;
	for (var i = 0; i < len; i++) {
		item = items[i];
		iName = item.getAttribute("iteminfo");
		iValue = item.innerHTML;
		
		if(iName == 'price') {
			iValue = parseFloat(iValue.replace(',', '.'));
			
			if(isNaN(iValue)) {
				iValue = 0;
			}
		}
		
		product[iName] = iValue;	
	}	
		
	
	// Check if product is in cart. If it is, then instead of adding new product, update existing.
	var productInCart = efShopcartGetProductFromCookieBy(product, efShopcartGlobals.equalityFields);
	if(productInCart) {
		product.count = parseInt(product.count) + parseInt(productInCart.count);
		index = productInCart.id;
		product.id = productInCart.id;
	}
	
	efShopcartStoreProduct(product);
}

function efShopcartProductToCookieString(pProduct) {
	var str = [];
	
	for(var prop in pProduct) {
		str.push(prop + '=' + pProduct[prop]);
	}
	str.push('');
	return str.join(efShopcartGlobals.paramDelimiter);
}

function efShopcartGetProductFromCookieBy(pProduct, pFieldSet) {
	var products = efShopcartGetProductsFromCookie();
	var productsCnt = products.length;
	
	for(var i = 0; i < productsCnt; i++) {
		if( efShopcartCompareProducts(products[i], pProduct, pFieldSet) ) {
			return products[i];
		}		
	}
	return null;
}

function efShopcartCompareProducts(pProduct1, pProduct2, pFieldSet) {
	var len = pFieldSet.length;
	for(var i = 0; i < len; i++) {
		if(pProduct1[pFieldSet[i]] != pProduct2[pFieldSet[i]]) {
			return false;
		}
	}
	return true;
}

function efShopcartGetProductsFromCookie() {

	var returnArr = new Array();
	
	var getValidPrice = function(keyVal) {
		var tmpPrice = 0;
		
		if(keyVal[0] == 'price') {
			tmpPrice = parseFloat(keyVal[1]);
			
			if(isNaN(tmpPrice)) {
				keyVal[1] = 0;
			}
		}
		
		return keyVal;
	}
	
	if ( !efShopcartIsSet() ) {
		paramsStr = efShopcart_Url.decode(window.location.search.substring(1));
		if(paramsStr.length) {
			returnArr[0] = efShopcartTools.stringToObject(paramsStr, efShopcartGlobals.paramDelimiter, getValidPrice);
		}
	}
	else {
		shopCartStr = efShopcart_Url.decode(document.cookie);
		shopCartStr = shopCartStr.split("efShopcart");
		for (var i=j=0; i < shopCartStr.length ;i++) {
			var end = 0;
			var start = 0;
			end = shopCartStr[i].indexOf(">>>");
			if (end != -1) {
				start = shopCartStr[i].indexOf("=");

				var paramsStr = unescape(shopCartStr[i].substring(start+1, end));
				returnArr[j] = new Object(efShopcartTools.stringToObject(paramsStr, efShopcartGlobals.paramDelimiter, getValidPrice));
				j++;
			}
		}
	}

	return returnArr;
}

function efShopcartIsSet() {
	var c = document.cookie.indexOf("efShopcart[");
	if (c == -1) {
		return false;
	}
	else {
		return true;
	}
}


function efShopcartSetCookie(pIndex, pValue) {
	var exdate = new Date();
	exdate.setDate(exdate.getDate()+1000);
	efShopcartTools.setCookie("efShopcart[" + pIndex + "]", pValue+">>>", exdate, "\/");
}


function efShopcartDeleteCookie(pCookieName) {
	var cookieDate = new Date();
	cookieDate.setTime(cookieDate.getTime() - 100);
	document.cookie = pCookieName += "=; expires=" + cookieDate.toGMTString();
}

function efShopcartDeleteAllFromCookie() {
	var cookies = document.cookie.split("efShopcart");

	if (cookies.length > 0) {
		for (var i=0; i < cookies.length; i++) {
			var start = cookies[i].indexOf("[");
			if ( start != -1) {
				var end =  cookies[i].indexOf("]");
				var id = cookies[i].substring(start+1, end);
				efShopcartDeleteCookie("efShopcart[" + id + "]");
			}
		}
	}
}

function efShopcart_fillBmBlock() {
	var products = efShopcartGetProductsFromCookie();
	var len = products.length;
	var productsNumber = 0;
	var totalSum = 0;
	
	for(var i = 0; i < len; i++) {
		productsNumber += parseInt(products[i].count);
		totalSum += parseFloat(products[i].price) * parseInt(products[i].count);
	}
	
	efShopcartTools.$("efShopcartTotalProduts").innerHTML = productsNumber;	
	efShopcartTools.$("efShopcartTotalSum").innerHTML = efShopcartTools.round(totalSum, 2);
}

function efShopcart_getTotalSum() {
	var products = efShopcartGetProductsFromCookie();

	var returnSum = 0;
	for (var i = 0; i < products.length; i++) {
		returnSum = parseFloat(products[i].price) * products[i].count + returnSum;
	}

	return returnSum;
}


function efShopcart_ViewCart() {
	var efShopcart_cartwindow = window.open("/_efshopcart.html","cartWindow","height=570,width=640,status=no,resizable=yes,scrollbars=yes,toolbar=no,menubar=no,location=no,directories=no,left=" + (screen.availWidth-640)/2 + ",top=" + (screen.availHeight-570)/2);
	efShopcart_cartwindow.focus();
}

function efShopcart_getOrderPageContent() {
	var products = efShopcartGetProductsFromCookie();
	var output = '';
	
	var cartContent = efShopcart_getCartContent(products);
	var formContent = efShopcart_getOrderFormContent(products);
	var hiddenFields = efShopcart_getCartHiddenFields(products);
	
	output = '<form action="" method="post" id="efShopcart_cartForm">';
	output += cartContent;
	output += hiddenFields;
	
	output += '<table border="0" cellpadding="5" cellspacing="0" class="noBorder" align="right"><tr>';
	output += '<td><input type="button" class="button" onclick="efShopcartDeleteAllFromCookie();window.close();" value="Очистить корзину"></td>';
	output += '<td><input type="button" class="button" onclick="efShopcart_refreshOrderPage()" value="Обновить стоимость"></td>';
	output += '<td><input type="button" class="button" onclick="window.close();" value="Продолжить покупки"></td>';
	output += '</tr></table><br clear="all"><p>&nbsp;</p>';
	
	output += formContent;
	output += '</form>';
	
	return output;
}


function efShopcart_getCartContent() {
	var products = efShopcartGetProductsFromCookie();
	var returnContent = '';

	if( !efShopcartTools.isCookieEnabled() ) {
		returnContent += '<div align="center"><b>К сожалению, Ваш браузер настроен так, чтобы блокировать работу корзины.</b></div><h4 align="center">Поэтому, если Вы хотите заказть несколько товаров, оформляйте заказ отдельно для каждого товара.</h4><br>';
		return returnContent;
	}

	returnContent += '<table cellspacing="0" cellpadding="3" border="0" class="w100 htable">';
	returnContent += '<tr><th width="75">Артикул</th><th>Название</th><th width="20">Количество</th><th width="85">Цена</th><th width="85">Стоимость</th><th width="20">&nbsp;</th></tr>';

	var totalSum = 0;
	for (var i = 0; i < products.length; i++) {
		returnContent += '<tr><td align="center">' + products[i].article + '</td><td>' + products[i].name + '</td><td><input type="text" name="order[' + products[i].id + '][count]" value="' + products[i].count + '" size="3"></td><td>' + products[i].price + ' грн.</td><td>' + efShopcartTools.round(products[i].price*products[i].count, 2) + ' грн.</td>' +'<td><img src="/img_0/shopcart/rm.gif" onclick="efShopcart_rmProductFromCart(' + products[i].id + ')" width="16" height="16" titile="Удалить из корзины" hspace="0" vspace="0" style="cursor: pointer"></td></tr>';
		totalSum = parseFloat(products[i].price) * products[i].count + totalSum;
	}

	returnContent += '<tr><td colspan="6" align="right">Всего на сумму: <b>' + efShopcartTools.round(totalSum, 2) + ' грн.</b></td></tr>';
	returnContent += "</table>";	

	return returnContent;
}

function efShopcart_rmProductFromCart(pId) {
	efShopcartDeleteCookie("efShopcart[" + pId + "]");
	
	var products = efShopcartGetProductsFromCookie();	
	if(products.length) {
		window.location.reload();
	}
	else {
		window.close();
	}
}

function efShopcart_refreshOrderPage() {
	var products = efShopcartGetProductsFromCookie();
	
	efShopcartTools.items(products).each(
		function(pProduct) {
			var form = efShopcartTools.$('efShopcart_cartForm');
			var newCount = parseInt(form.elements['order[' + pProduct.id + '][count]'].value) || 0;
			
			if(newCount == 0) {
				efShopcartDeleteCookie("efShopcart[" + pProduct.id + "]");
			} else {
				pProduct.count = Math.abs(newCount);
				efShopcartStoreProduct(pProduct);
			}
		}
	);
	
	window.location.reload();
}

function efShopcart_getOrderFormContent(pProducts) {	
	var efShopcart_formOutput = '<TABLE class=form_t cellSpacing=1 cellPadding=0 width=540 align=center border=0>';
	efShopcart_formOutput += '<TBODY>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TH colSpan=2>Оформить заказ</TH></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD width="300">Имя<FONT class=redStar>*</FONT>:</TD>';
	efShopcart_formOutput += '<TD class=aR><INPUT name="formRequired[PERSON_Имя]" id="efShopcart_name"></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD>Контактный телефон<FONT class=redStar>*</FONT>:</TD>';
	efShopcart_formOutput += '<TD class=aR><INPUT name="formRequired[Контактный телефон]" id="efShopcart_phone"></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD>Адрес доставки<FONT class=redStar>*</FONT>:</TD>';
	efShopcart_formOutput += '<TD class=aR><INPUT name="formRequired[Адрес доставки]" id="efShopcart_addr"></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD>e-mail:</TD>';
	efShopcart_formOutput += '<TD class=aR><INPUT name=formdata[EMAIL_e-mail]></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD>Желаемая дата доставки<FONT class=redStar>*</FONT>:</TD>';
	efShopcart_formOutput += '<TD class=aR><INPUT name="formRequired[Желаемая дата доставки]" id="efShopcart_date"></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD>Желаемое время доставки:</TD>';
	efShopcart_formOutput += '<TD class=aR><INPUT name="formdata[Желаемое время доставки]"></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD>Комментарии:</TD>';
	efShopcart_formOutput += '<TD class=aR><TEXTAREA name=formdata[Комментарии] rows=5 cols=27></TEXTAREA></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD class=aR colSpan=2>';	
	efShopcart_formOutput += '<input type="button" class="button" onclick="efShopcart_validateForm();return;" value="Оформить заказ"></TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD colSpan=2>&nbsp;</TD></TR>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD class=form_tNoticetd colSpan=2><FONT class=redStar>*</FONT> отмечены обязательные поля</td></tr>';
	efShopcart_formOutput += '<TR>';
	efShopcart_formOutput += '<TD class=form_tNoticetd colSpan=2>&nbsp;</td></tr>';	
	efShopcart_formOutput += '</TBODY></TABLE>';
	
	return efShopcart_formOutput;
}

function efShopcart_getCartHiddenFields(pProducts) {
	var efShopcart_formOutput = '';
	var totalSum = 0;
	for (var i = 0; i < pProducts.length; i++) {
		efShopcart_formOutput += '<input type="hidden" name="order['+ pProducts[i].id +'][article]" value="' + pProducts[i].article.replace(/"/g, '&quot;') + '">';
		efShopcart_formOutput += '<input type="hidden" name="order['+ pProducts[i].id +'][name]" value="' + pProducts[i].name.replace(/"/g, '&quot;') + '">';		
		efShopcart_formOutput += '<input type="hidden" name="order['+ pProducts[i].id +'][price]" value="' + pProducts[i].price + '">';
		efShopcart_formOutput += '<input type="hidden" name="order['+ pProducts[i].id +'][value]" value="' + efShopcartTools.round(pProducts[i].price*pProducts[i].count, 2) + '">';		

		totalSum = parseFloat(pProducts[i].price) * pProducts[i].count + totalSum;
	}
	efShopcart_formOutput += '<input type="hidden" name="totalSum" value="' + efShopcartTools.round(totalSum, 2) + '">';
	
	return efShopcart_formOutput;
}

function efShopcart_validateForm() {

	var form = efShopcartTools.$('efShopcart_cartForm');

	//This function was moved to the server-side.
	//efShopcartDeleteAllFromCookie();
	form.action = efShopcartGlobals['action'];
	form.submit();
}





var efShopcart_Url = {

	// public method for url encoding
	encode : function (string) {
		return escape(this._utf8_encode(string));
	},

	// public method for url decoding
	decode : function (string) {
		return this._utf8_decode(unescape(string));
	},

	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";

		for (var n = 0; n < string.length; n++) {

			var c = string.charCodeAt(n);

			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}

		}

		return utftext;
	},

	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;

		while ( i < utftext.length ) {

			c = utftext.charCodeAt(i);

			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}

		}

		return string;
	}
}
