
if(!cart) {
var cart = {

	pageSpecificParams: { },

	currentUser: null,

	listeners: {
		actionChangeUser: [ ]
	},


	prepareOrder: function() {
		return cart.vkOrder;
	},

	vkOrder: null,

	loginBar: {
		initialized: false,

		isLoginMode: false,
		isRegistrationMode: false,

		toggleRegisterMode: function() {
			if(cart.loginBar.isRegistrationMode) {
				cart.loginBar.hide();
			} else {
				cart.loginBar.showRegister();
			}
		},

		toggleLoginMode: function() {
			if(cart.loginBar.isLoginMode) {
				cart.loginBar.hide();
			} else {
				cart.loginBar.showLogin();
			}
		},

		visible: function() {
			var loginBar = $('loginBar');
			return loginBar ? loginBar.visible() : false;
		},

		showLogin: function() {
//			console.log('showLogin');
			var loginBar = $('loginBar');
			if(loginBar) {
				$('loginBarTitleAuth').show();
				$('loginBarTitleRegister').hide();
				$('loginBarConfirmRow').hide();
				$('loginBarLoginRow').show();
				$('loginBarRegisterRow').hide();
				cart.loginBar.isLoginMode = true;
				cart.loginBar.isRegistrationMode = false;
				loginBar.show();
				cart.loginBar.updateButtons();
				cart.loginBar.initVk();
			}
		},

		showRegister: function() {
//			console.log('showRegister');
			var loginBar = $('loginBar');
			if(loginBar) {
				$('loginBarTitleAuth').hide();
				$('loginBarTitleRegister').show();
				$('loginBarConfirmRow').show();
				$('loginBarLoginRow').hide();
				$('loginBarRegisterRow').show();
				cart.loginBar.isLoginMode = false;
				cart.loginBar.isRegistrationMode = true;
				loginBar.show();
				cart.loginBar.updateButtons();
				cart.loginBar.initVk();
			}
		},

		scrollTo: function() {
			var loginBar = $('loginBar');
			if(loginBar) loginBar.scrollTo();
		},

		hide: function() {
			cart.loginBar.isLoginMode = false;
			cart.loginBar.isRegistrationMode = false;
			var loginBar = $('loginBar');
			if(loginBar) loginBar.hide();
			cart.loginBar.updateButtons();
		},

		initVk: function() {
			if(!cart.loginBar.initialized) {
				cart.loginBar.initialized = true;
				cart.vkInit(function() {
					VK.Widgets.Auth('loginBar_vkAuth', {
						onAuth: function(vkAuthData) {
							cart.remoteCall({ act: 'vkAuth', json: Object.toJSON(vkAuthData) })
						}
					});
				});
			}
		},

		submit: function(prefix) {
			if(cart.loginBar.isRegistrationMode) {
				cart.remoteCall({
					act: 'stdReg',
					login: $F(prefix+'_login'),
					password: $F(prefix+'_password'),
					passwordConfirm: $F(prefix+'_password_confirm'),
					prefix: prefix
				});
			} else if(cart.loginBar.isLoginMode) {
				cart.remoteCall({
					act: 'stdAuth',
					login: $F(prefix+'_login'),
					password: $F(prefix+'_password'),
					prefix: prefix
				});
			}
		},

		updateButtons: function() {

			$("loginBarButtons").update("");

			if(cart.currentUser) {
				$("loginBarButtons").insert('<a href="#" onclick="cart.remoteCall({ act: \'logout\' }); return false;" style="margin-right: 24px;">Выход</a>');
				$("loginBarButtons").insert(
					cart.pageSpecificParams.isPersonalCabinet ?
					'<span style="color: #808080; margin-right: 24px;">Личный кабинет</span>' :
					'<a href="/store/personal/" style="margin-right: 24px;">Личный кабинет</a>');
				$("loginBarButtons").insert(
					cart.pageSpecificParams.isMyOrders ?
					'<span style="color: #808080; margin-right: 24px;">Мои заказы</span>' :
					'<a href="/store/personal/orders.php" style="margin-right: 24px;">Мои заказы</a>');
			} else {
				var loginBarVisible = cart.loginBar.visible();

				if(cart.loginBar.isLoginMode) {
					$("loginBarButtons").insert('<a href="#" onclick="cart.loginBar.toggleLoginMode(); return false;" style="margin-right: 24px; text-decoration: none; color: #808080; border-bottom: 1px dashed #808080;">Вход</a>');
				} else {
					$("loginBarButtons").insert('<a href="#" onclick="cart.loginBar.toggleLoginMode(); return false;" style="margin-right: 24px; text-decoration: none; border-bottom: 1px dashed #2A87AD;">Вход</a>');
				}

				if(cart.loginBar.isRegistrationMode) {
					$("loginBarButtons").insert('<a href="#" onclick="cart.loginBar.toggleRegisterMode(); return false;" style="margin-right: 24px; text-decoration: none; color: #808080; border-bottom: 1px dashed #808080;">Простая регистрация</a>');
				} else {
					$("loginBarButtons").insert('<a href="#" onclick="cart.loginBar.toggleRegisterMode(); return false;" style="margin-right: 24px; text-decoration: none; border-bottom: 1px dashed #2A87AD;">Простая регистрация</a>');
				}

//				console.log($("loginBarButtons").getLastChild());
			}

			$("loginBarButtons").insert(
				cart.pageSpecificParams.isRules ?
				'<span style="color: #808080; margin-right: 24px;">Правила</span>' :
				'<a href="/store/rules.php" style="margin-right: 24px;">Правила</a>');

		}

	},


	remoteCall: function (params, hideElement) {
		if(hideElement) {
			hideElement = $(hideElement);
			prevVisibility = hideElement.getStyle("visibility");
			hideElement.setStyle({ visibility: "hidden"});
		}

		var allParams = { };
		Object.extend(allParams, cart.pageSpecificParams);
		Object.extend(allParams, params);

		var request = new Ajax.Request('/store/ajax.php', { parameters: allParams,
			onComplete: function(transport) {
				if(request.success()) {
					if(transport.responseJSON) {
						for(var i = 0; i < transport.responseJSON.actions.length; i++) {
							var action = transport.responseJSON.actions[i];
							switch(action.name) {
							case "pageReload":
								document.location.reload();
								break;
							case "updateBar":
								// TODO: сделать код плашки полностью статичным и избавиться от этого метода
								$("cart").update(action.content);
								cart.loginBar.initialized = false;
								cart.loginBar.updateButtons();
								$("cartLink").insert(
									cart.pageSpecificParams.isCart ?
									'<span style="color: #808080;"><nobr><span id="itemCount"></span></nobr> <nobr>в корзине</nobr></span>' :
									'<a href="/store/cart_view.php"><nobr><span id="itemCount"></span></nobr> <nobr>в корзине</nobr></a>');
								break;
							case "updateItemCount":
								cart.updateItemCount(action.itemCount);
								break;
							case "updateCart":
								var cartTable = $('cartTable');
								var yandexMoneyButton = $('yandexMoneyButton');
								//cart.vkOrder = action.vkOrder;
								var packedItems = $('packedItems');
								if(packedItems) {
									packedItems.value = action.packedItems;
								}
								if(cartTable) {
									cartTable.update(action.html);
									if(action.isFull) {
										$('cartMainFull').show();
										$('cartMainEmpty').hide();
									} else {
										$('cartMainFull').hide();
										$('cartMainEmpty').show();
									}
								}
								/*if(yandexMoneyButton) {
									yandexMoneyButton.update(action.yandexMoneyButton);
								}*/
								break;
							case "runJS":
								eval(action.code);
								break;
							case "changeUser":
								if(action.id) {
									cart.currentUser = action.id;
									$('loginBar').hide();
									cart.loginBar.updateButtons();
									$('loggedInBar').show();
									if(!action.firstName || !action.lastName) {
										$('loggedInBarUsr').update('Вы вошли как пользователь №'+action.id);
									} else {
										$('loggedInBarUsr').update('Вы вошли как '+action.firstName+' '+action.lastName);
									}
									cart.loginBar.updateButtons();
									//$('buttonsForLoggedInUsers').show();
									//$('buttonsForNotLoggedInUsers').hide();
								} else {
									cart.currentUser = 0;
									cart.loginBar.isLoginMode = false;
									cart.loginBar.isRegistrationMode = false;
									$('loggedInBar').hide();
									cart.loginBar.updateButtons();
									//$('buttonsForLoggedInUsers').hide();
									//$('buttonsForNotLoggedInUsers').show();
								}
								//console.log(cart.listeners.actionChangeUser.length);
								for(var j = 0; j < cart.listeners.actionChangeUser.length; j++) {
									cart.listeners.actionChangeUser[j](action);
								}
								break;
							}
						}
					}
				} else {
					// TODO: выводить нормальное сообщение об ошибке, в том числе при отсутствии бара
					alert('Сервер не отвечает. Попробуйте обновить страницу.');
					// <div style="background-color: #FFC0C0; color: white; display: none;" id="ajaxError">Не удалось получить данные. <a href="javascript:cart.remoteCall({ act: 'updateBar' });">Обновить</a></div>

				}
				if(hideElement) hideElement.setStyle({ visibility: prevVisibility });
			}
		});

	},



	add: function (button, id) {
		alert("Ошибка: метод устарел");
	},
	
	
	vkInit: function(callback) {
		//obsolete
		cart.vk.openapi.init(callback);
	},
	
	/*vkShare: { init: function(callback) {
		//obsolete
		cart.vk.share.init(callback);
	} },*/
	
	vk: {
	
		openapi: {
			appId: 2166057,
			initState: 0, // 0: неинициализирован, 1: ожидание, 2: готов
			callbackQueue: [ ],

			init: function(callback) {
				if(cart.vk.openapi.initState == 2) {
					callback();
					return;
				}
				cart.vk.openapi.callbackQueue.push(callback);
				if(cart.vk.openapi.initState == 0) {
					cart.vk.openapi.initState = 1;
					window.vkAsyncInit = function() {
						VK.init({ apiId: cart.vk.openapi.appId });
						cart.vk.openapi.initState = 2;
						for(var i = 0; i < cart.vk.openapi.callbackQueue.length; i++) {
							cart.vk.openapi.callbackQueue[i]();
						}
						cart.vk.openapi.callbackQueue = null;
					};
					setTimeout(function() {
						//alert("Запуск асинхронной инициализации openapi");
						var elTransport = document.createElement("span");
						elTransport.id = "vk_api_transport";
						document.body.appendChild(elTransport);
						var elScript = document.createElement("script");
						elScript.type = "text/javascript";
						elScript.src = "http://vkontakte.ru/js/api/openapi.js";
						elScript.async = true;
						elTransport.appendChild(elScript);
					}, 0);
				}
			}
		},
		
		share: {
			initState: 0, // 0: неинициализирован, 1: ожидание, 2: готов
			callbackQueue: [ ],

			init: function(callback) {
				if(cart.vk.share.initState == 2) {
					callback();
					return;
				}
				cart.vk.share.callbackQueue.push(callback);
				if(cart.vk.share.initState == 0) {
					cart.vk.share.initState = 1;
					setTimeout(function() {
						//alert("Запуск асинхронной инициализации share");
						var elScript = document.createElement("script");
						elScript.type = "text/javascript";
						elScript.src = "http://vkontakte.ru/js/api/share.js?10";
						elScript.charset = "utf-8";
						elScript.async = true;
						document.body.appendChild(elScript);
						// FIXME: http://javascript.ru/blog/Ilya-Kantor/Zagruzka-dannyh-cherez-SCRIPT-s-otlovom-oshibok
						function onLoad() {
							if(cart.vk.share.initState != 2) {
								cart.vk.share.initState = 2;
								for(var i = 0; i < cart.vk.share.callbackQueue.length; i++) {
									cart.vk.share.callbackQueue[i]();
								}
								cart.vk.share.callbackQueue = null;
							}
						}
						$(elScript).observe("load", onLoad);
						$(elScript).observe("readystatechange", function() {
							if(elScript.readyState == 'complete' || elScript.readyState == 'loaded') {     
								setTimeout(onLoad, 0);
							}
						});
						window.setTimeout(onLoad, 10000);
					}, 0);
				}
			}
		},

		merchant: {
			initState: 0, // 0: неинициализирован, 1: ожидание, 2: готов
			callbackQueue: [ ],

			init: function(callback) {
				if(cart.vk.merchant.initState == 2) {
					callback();
					return;
				}
				cart.vk.merchant.callbackQueue.push(callback);
				if(cart.vk.merchant.initState == 0) {
					cart.vk.merchant.initState = 1;
					setTimeout(function() {
						//alert("Запуск асинхронной инициализации merchant api");
						var elScript = document.createElement("script");
						elScript.type = "text/javascript";
						elScript.src = "http://vkontakte.ru/js/api/merchant.js?13";
						elScript.charset = "windows-1251";
						elScript.async = true;
						document.body.appendChild(elScript);
						function onLoad() {
							if(cart.vk.merchant.initState != 2) {
								cart.vk.merchant.initState = 2;
								for(var i = 0; i < cart.vk.merchant.callbackQueue.length; i++) {
									cart.vk.merchant.callbackQueue[i]();
								}
								cart.vk.merchant.callbackQueue = null;
							}
						}
						$(elScript).observe("load", onLoad);
						$(elScript).observe("readystatechange", function() {
							if(elScript.readyState == 'complete' || elScript.readyState == 'loaded') {     
								setTimeout(onLoad, 0);
							}
						});
						window.setTimeout(onLoad, 10000);
					}, 0);
				}
			}
		}
	},

	updateItemCount: function(count) {
		if(count == 0) {
			$('cartFull').hide();
			$('cartEmpty').show();
		} else {
			$('cartEmpty').hide();
			$('cartFull').show();
			$('itemCount').update(cart.advnumspell(count, 'f', 'вещ|ь|и|ей'));
		}
	},

	numspell: function(num, word) {
		num = parseInt(num);
		word = word.split('|');
		var ones = num % 10;
		var tens = Math.floor(num / 10) % 10;

		if(tens == 1) return word[0]+word[3];
		if(ones == 1) return word[0]+word[1];
		if(ones >= 2 && ones <= 4) return word[0]+word[2];
		return word[0]+word[3];
	},

	advnumspell_dic: {
		m: [ 'ноль', 'один', 'два', 'три', 'четыре', 'пять' ],
		f: [ 'ноль', 'одна', 'две', 'три', 'четыре', 'пять' ],
		n: [ 'ноль', 'одно', 'два', 'три', 'четыре', 'пять' ]
	},

	advnumspell: function(num, gender, word) {
		return (cart.advnumspell_dic[gender][num] ? cart.advnumspell_dic[gender][num] : num) + " " + cart.numspell(num, word);
	}

};

$(document).observe('dom:loaded', function() {
	// TODO
	// А что, б.. TODO? Будто помню))
	if($('cart')) {
		cart.remoteCall({ act: "updateBar" });
	}
});

}


