﻿/// <reference path="zw_Runtime.js" />
/// <reference path="jquery.js" />
/// <reference path="UC/zw_CatalogTree.js" />
/// <reference path="UC/zw_CatalogFilter.js" />
/// <reference path="UC/zw_OrdersBase.js" />
/// <reference path="UC/zw_Menu.js" />
/// <reference path="UC/zw_ViewSearchHistory.js" />
/// <reference path="UC/zw_AjaxHelpers.js" />
/// <reference path="UC/zw_Paging.js" />
/// <reference path="UC/zw_History.js" />
/// <reference path="UC/zw_Tabs.js" />
/// <reference path="UC/zw_CurrencySelect.js" />
/// <reference path="UC/zw_ExternalCatalog.js" />


var controls =
{
	/* get attribute value from specified control by key */
	get_settings: function (key, control) {
		return control.attr(key);
	},
	uniqueKeyAttribute: function () {
		return Constants.AjaxController.ControlPropertiesPrefix + Constants.AjaxController.ControlUniqueKeyField;
	},
	findByUniqueKey: function (key) {
		return $("[" + controls.uniqueKeyAttribute() + "='" + key + "']");
	},
	uniqueKey: function (control) {
		return $(control).attr(controls.uniqueKeyAttribute());
	},
	isExpanded: function (element) {
		var state = element.attr("state");
		if (state) {
			return state == "expanded";
		} else {
			return false;
		}
	},
	/* insert | show | hide content after specified comment */
	get_expandcollapse: function (element, contentContainer, mvcUrl) {
		var state = element.attr("state");
		var hide = false;
		/* if second load */
		if (state) {
			hide = (state == "expanded");
			var sibling = contentContainer[0].nextSibling;
			while (sibling) {
				if (sibling.nodeType === 8 && sibling.nodeValue === "END")
					break;
				if (hide)
					$(sibling).hide();
				else
					$(sibling).show();
				sibling = sibling.nextSibling;
			}
		}
		/* if first load */
		else {
			contentContainer.load(mvcUrl, function (responseText) {
				contentContainer.after(responseText);
			});
		}
		element.attr("state", hide ? "collapsed" : "expanded");
	},

	get_filter: function (control) {
		var filter = {};

		control.find("[filter='filter']").each(function () {
			var filterElement = $(this);
			var val;
			if (filterElement.is(":checkbox"))
				val = filterElement.is(":checked");
			else
				val = filterElement.val();
			if (val)
				filter[filterElement.attr("field")] = val;
		});

		return filter;
	},

	set_clearFilter: function (control) {
		control.find("[filter='filter']").each(function () {
			$(this).val("");
		});
	}
};

var webUrl = {

	//конвертирует js-объект в URL ( { name: "zxc", value: "qwe" } -> "name=zxc&value=qwe")
	param: function (obj) {
		var query = $.param(obj);
		query = query.replace("+", "%20");

		return query;
	}
};

/* общие функции */
var webSettings =
{
	currentClientHeight: 0,
	loadingTimeout: 0,
	inputClass: '',
	inputClassFocus: '',
	inputLeftClass: '',
	inputLeftClassFocus: '',
	inputErrorClass: '',
	inputErrorLeftClass: '',

	buttonClass: '',
	buttonClassHover: '',
	buttonLeftClass: '',
	buttonLeftClassHover: '',

	checkedBoxClass: '',
	checkedBoxClassHover: '',
	uncheckedBoxClass: '',
	uncheckedBoxClassHover: '',

	checkedRadioClass: '',
	checkedRadioClassHover: '',
	uncheckedRadioClass: '',
	uncheckedRadioClassHover: '',

	comboboxClass: '',
	comboboxClassFocus: '',
	comboboxLeftClass: '',
	comboboxLeftClassFocus: '',

	liveInitialized: false,

	attributesNames: { threeStateButtonCollapseID: "tsb_cid", threeStateButtonExpandeID: "tsb_eid", threeStateButtonUnexpandedID: "tsb_uid" },

	get_filterUrl: function (control, firstSymbol) {
		var url = "";
		if (!firstSymbol)
			firstSymbol = "&";
		var filterElement;
		control.find("[filter='filter']").each(function () {
			filterElement = $(this);
			var val;
			if (filterElement.is(":checkbox"))
				val = filterElement.is(":checked");
			else
				val = filterElement.val();
			if (val)
				url += (url ? "&" : "") + filterElement.attr("field") + "=" + val;
		});
		if (url)
			url = firstSymbol + url;
		return url;
	},

	get_isGuid: function (value) {
		if (value)
			return new RegExp("^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$").test(value);
		else
			return false;
	},

	set_threeStateButtonState: function (element) {

		element = $(element);
		var image;
		if (element.is("a"))
			image = element.children();
		else
			image = element;

		var state = image.attr("state");
		if (state == "unexpandable")
			return;
		if (!state) {
			state = "collapsed";
		}

		var newid = (state == "collapsed" ? image.attr(webSettings.attributesNames.threeStateButtonExpandeID) : image.attr(webSettings.attributesNames.threeStateButtonCollapseID));
		var src = image.attr("src");
		var oldid = src.split("?").pop().split("&").shift().split("=").pop();
		image.attr("src", src.replace(oldid, newid));
		image.attr("state", (state == "collapsed" ? "expanded" : "collapsed"));
	},

	log: function (text) {
		$("#logc").css({ 'display': '' });
		$("#log").append("<li>" + text + "</li>");
	},

	/* запомнить положение курсора */
	set_mousePoint: function () {
		$(document).mousemove(function (e) {
			$.coorX = e.pageX;
			$.coorY = e.pageY;
		});
	},

	/* показать крутилочку */
	set_showLoadScreen: function () {
		$("#waitImg").center().css({ visibility: 'visible' });
		$('#waitDiv').height(document.body.clientHeight).center().css({ visibility: 'visible' });
	},

	/* скрыть крутилочку */
	set_hideLoadScreen: function () {
		$('#waitDiv').center().css({ visibility: 'hidden' });
		$("#waitImg").center().css({ visibility: 'hidden' });
	},

	/* прижатие футера к низу страницы*/
	set_controlsPositions: function () {


		var work = $("#cCPHWorkArea");

		if (work.length) {

			var reposition = true;
			if ($.browser.msie) {
				var clientHeight = document.documentElement.clientHeight;
				if (clientHeight == webSettings.currentClientHeight) {
					//webSettings.currentClientHeight = 0;
					reposition = false;
				}
			}

			if (reposition) {

				work.height('');

				var docY = document.documentElement.clientHeight;
				var bodyY = document.body.clientHeight;

				var footerY = 0;
				if ($("#cCPHBottom").length)
					footerY = $("#cCPHBottom").outerHeight(true);

				var headerY = work.position().top;
				var workOuterY = work.outerHeight(true);
				var workY = work.height();

				var Y = Math.max(bodyY, docY);

				if ($.browser.mozilla || $.browser.opera) {
					work.height(Y - headerY - footerY);
				}
				else {
					work.height(Y - headerY - footerY - (workOuterY - workY));
				}
				if ($.browser.msie) {
					webSettings.currentClientHeight = document.documentElement.clientHeight;
				}
			}
		}

		window.clearTimeout(webSettings.loadingTimeout);
		webSettings.set_hideLoadScreen();
		$(document.body).css('visibility', 'visible');

	},

	/* вызов вебметода */
	get_webMethod: function (settings) {

		if (settings.async == undefined)
			settings.async = false;
		if (settings.cache == undefined)
			settings.cache = false;

		var o = $(this);
		var returnValue = null;
		$.ajax(
            {
            	type: "POST",
            	url: "/WebMethods.aspx/" + settings.method,
            	data: settings.parameters,
            	contentType: "application/json; charset=utf-8",
            	dataType: "json",
            	async: settings.async,
            	cache: settings.cache,
            	success: function (msg) {
            		if (settings.onsucces && settings.target)
            			settings.onsucces.call(settings.target, msg);
            		returnValue = msg;
            	},
            	error: function (XMLHttpRequest, textStatus, errorThrown) {
            		if (settings.onerror && settings.target)
            			settings.onerror.call(settings.target, XMLHttpRequest, textStatus, errorThrown);
            	}
            });
		return returnValue;
	},
	_handlers: [],
	runHandlers: function () {
		for (var i = 0; i < webSettings._handlers.length; i++) {
			var handler = webSettings._handlers[i];
			handler();
		}
	},

	/* подписка на события "документ готов" и "окончание постбека" */
	/** @suppress {checkVars} */
	set_handler: function (handler) {
		webSettings._handlers.push(handler);
		$(document).ready(handler);
		if (Sys) {
			Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handler);
		}
	},

	/* инициализация приложения */
	init: function () {

		$.ajaxSetup({
			cache: false
		});

		//$(document).ready(webSettings.set_mousePoint);

		$(window).bind("resize", webSettings.set_controlsPositions);
		$(window).bind("load", webSettings.set_controlsPositions);

		webSettings.set_handler(webSettings.set_calendars);
		webSettings.set_handler(banners.init);
		webSettings.set_handler(imageGallery.init);
		webSettings.set_handler(popup.init);
		webSettings.set_handler(zw_ordersbase.initExpandedDocs);
		webSettings.set_handler(function () { $('input[placeholder], textarea[placeholder]').placeholder(); });


		webSettings.loadingTimeout = window.setTimeout(webSettings.set_showLoadScreen, 600);

		if (!webSettings.liveInitialized) {

			$("select:has(option[href])").live("change", function () {
				window.location = $(this).val();
			});
			$('#zw_tabcontainer').zwTabs();

			webSettings.set_defaultButtons();
			zw_catalogtree.init();
			zw_ordersbase.init();
			zw_menu.init();
			zw_catalogfilter.init();
			zw_viewSearchHistory.init();
			zw_currencyselect.init();
			zw_externalcatalog.init();
			ZetaControlRefresher.Init();
			ZetaPaging.init();

			//this one should be the last
			HistoryBase.Init();

			//		$('a[' + orders.attributesNames.selectedDocument + '*=""]').live('click', function (event) { orders.get_toggle(this); return false; });
			//		$('a[' + orders.attributesNames.selectedDocument + ']').live('click', function (event) { orders.get_toggle(this); return false; });

			//		$('img[' + rating.attributesNames.r_star + '*=""]').live('hover', function (event) { rating.starHover(this); return false; });
			$('img[' + rating.attributesNames.r_star + ']').live('hover', function (event) { rating.starHover(this); return false; });
			//		$('img[' + rating.attributesNames.r_star + '*=""]').live('mouseout', function (event) { rating.starMouseOut(this); return false; });
			$('img[' + rating.attributesNames.r_star + ']').live('mouseout', function (event) { rating.starMouseOut(this); return false; });
			//		$('img[' + rating.attributesNames.r_star + '*=""]').live('click', function (event) { rating.set_rating(this); return false; });
			$('img[' + rating.attributesNames.r_star + ']').live('click', function (event) { rating.set_rating(this); return false; });


			// leave this settings in end of function
			//		$('a:has(img[' + webSettings.attributesNames.threeStateButtonExpandeID + '*=""])').live('click', function (event) { webSettings.set_threeStateButtonState(this); });
			$('a:has(img[' + webSettings.attributesNames.threeStateButtonExpandeID + '])').live('click', function (event) { webSettings.set_threeStateButtonState(this); });
			webSettings.liveInitialized = true;
		}
	},

	get_ASHXUrl: function (ashxUrl) {
		return window.location.protocol + "//" + window.location.host + "/ASHX/" + ashxUrl;
	},

	set_location: function (url, query) {
		if (query)
			query = "?" + query;
		else
			query = "";
		window.location = window.location.protocol + "//" + window.location.host + "/" + url + query;
	},

	set_defaultButtons: function () {
		$("[defaultButton]").live("keypress", webSettings.set_raise_default_click);
	},

	set_raise_default_click: function (e) {
		if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
			var el = $(this);
			var button = el.find("#" + el.attr("defaultButton"));
			button.click();
			return false;
		}
		else {
			return true;
		}
	},

	set_calendars: function () {
		$("input[cltype='datepicker']").tDatePicker({ format: 'dd.MM.yyyy', minValue: new Date(2000, 1, 1), maxValue: new Date(2100, 0, 1) });
	}

};

/*									<Cart>								*/
var cart_v2 =
{
	ids: {
		cartMini: "#zw_cartmini",
		cart: ""
	},

	url: {
		copyUrl: "/mvcget/Cart/AjaxCopy?cart_documentid=(0)&cart_addwithemptystore=(1)",
		cartUrl: "/mvcget/Cart/AjaxCart"
	},

	attributesNames: {
		template: "cart_templateid"
	},

	routes: { copyToCart: "cart_copy" },

	set_copy: function (element) {
		element = $(element);
		var documentid = element[0].href.split("/").pop();
		var res = confirm("Скопировать заказ в корзину?");
		if (res) {
			res = confirm("Добавлять позиции отсутствующие на складе?");
			var url = cart_v2.url.copyUrl.replace("(0)", documentid).replace("(1)", res);
			$.post(url, null, function (responseText) {
				$.fn.messageBox("Журнал заказов", responseText, {});
			});
		}
	},

	set_cartmini: function () {
		var control;
		$(cart_v2.ids.cartMini).each(function () {
			control = $(this);
			var templateid = control.attr(cart_v2.attributesNames.template);
			if (templateid)
				var url = cart_v2.url.cartUrl + "?" + cart_v2.attributesNames.template + "=" + templateid;
			control.load(url);
		});
	}
}
/*									</Cart>								*/

var tabs =
{
	change: function (element) {
		var current = $(element);
		var tabs = current.parents("#tabs:first");
		var currentActive = current.parents("ul:first").find(".zwc_tabs_item_active").removeClass("zwc_tabs_item_active").removeClass(tabs.attr("activetab")).addClass(tabs.attr("inactivetab"));
		current.addClass("zwc_tabs_item_active").addClass(tabs.attr("activetab")).removeClass(tabs.attr("inactivetab"));
		$("[for='" + currentActive.attr("id") + "']").addClass("zwc_tabs_unactive_content");
		$("[for='" + current.attr("id") + "']").removeClass("zwc_tabs_unactive_content");
	}
}

var support =
{
	textboxID: ("tb" + (new Date()).getTime()),

	spanID: ("sp" + (new Date()).getTime()),

	selectorID: ("cb" + (new Date()).getTime()),

	show: function () {
		var supportDIV =
			"<div style='width: 400px;'>" +
    			"<p>" +
        			"Если в процессе работы с сайтом у вас возникли какие-либо сложности или вы " +
            			"заметили ошибку – напишите об этом в службу технической поддержки. Мы благодарны " +
                			"ваc за внимание к сайту и готовы оперативно помочь." +
                    			"</p>" +
                        			"<table width='100%'>" +
                            			"<tbody>" +
                                			"<tr>" +
                                    			"<td>" +
                                        			"<span style='white-space: nowrap;'>Тема сообщения:</span>" +
                                            			"</td>" +
                                                			"<td style='text-align: right'>" +
                                                    			"<select id='" + support.selectorID + "'>" +
                                                        			"<option selected='selected' value=''>-- выберите тему --</option>" +
                                                            			"<option value='1'>Ошибка при отображении страницы</option>" +
                                                                			"<option value='2'>Ошибка в работе элементов управления</option>" +
                                                                    			"<option value='3'>Орфографическая ошибка</option>" +
                                                                        			"<option value='4'>Предложение по улучшению</option>" +
                                                                            			"</select>" +
                                                                                			"</td>" +
                                                                                    			"</tr>" +
                                                                                        			"<tr>" +
                                                                                            			"<td colspan='2'>" +
                                                                                                			"<textarea id='" + support.textboxID + "' cols='1' rows='7' style='width: 400px;'></textarea>" +
                                                                                                    			"</td>" +
                                                                                                        			"</tr>" +
                                                                                                            			"</tbody>" +
                                                                                                                			"</table>" +
                                                                                                                    			"<span id='" + support.spanID + "' style='color: Red; display: none;'></span>" +
                                                                                                                        			"</div>";

		$.fn.messageBox("Обращение в службу технической поддержки", supportDIV, { width: 'auto', okButtonText: 'Отправить', cancelButtonText: 'Отмена', okButton: true, cancelButton: true, okButtonEventHandler: support.send, contentAlignment: 'left' });
	},

	send: function () {
		var tb = $("#" + support.textboxID);
		var sp = $("#" + support.spanID);
		var cb = $("#" + support.selectorID);

		if (!cb.val()) {
			sp.text('Пожалуйста, укажите тему сообщения');
			sp.css({ display: '' });
			return false;
		}
		if (!tb.val()) {
			sp.text('Пожалуйста, укажите текст сообщения');
			sp.css({ display: '' });
			return false;
		}

		webSettings.get_webMethod(
            {
            	method: 'SET_SupportMessage',
            	parameters: '{ msgSubject: "' + cb.find("option:selected").text() + '", msgMessage: "' + tb.val() + '" }',
            	async: false
            });
	}
};

/* работа с пользовательскими данными */
var webUser =
{
	/* сохранить пользовательскую переменную */
	/** @suppress {checkVars} */
	set_UserValue: function (valueName, object, value, isSave, isPostBack) {

		if (isSave == undefined)
			isSave = true;
		if (isPostBack == undefined)
			isPostBack = true;

		if (!value) {
			object = $(object);
			if (object.is(":checkbox"))
				value = object.is(":checked");
			else if (object.is("select"))
				value = object.val();
			else if (object.is("input"))
				value = object.val();
		}

		webSettings.get_webMethod(
			{
				method: 'SET_UserValue',
				parameters: '{name: "' + valueName + '", value: "' + value + '", isSave: ' + isSave + '}',
				async: false
			});

		if (object && isPostBack) {
			var name = $(object).attr("id");
			__doPostBack(name, name);
		}
	},

	/*	

	получить пользовательскую переменную

	name - имя пользовательской переменной

	returnType - тип переменной (string, int)

	*/
	get_UserValue: function (valueName, valueType) {
		var value = webSettings.get_webMethod(
		{ method: 'GET_UserValue',
			parameters: '{valueName: "' + valueName + '", valueType: "' + valueType + '"}',
			async: false
		});
		return value.d;
	}
}

/* поиск товара, каталог товаров, корзина */

var catalog =
{
	/* установка title элементам */
	/* установка title для ссылок на детальный просмотр */
	set_t: function (target, message) {
		$(target).removeAttr("onmouseover").attr("title", message);
	},

	/* ссылка, большая картинка */
	set_td: function (target) {
		catalog.set_t(target, "Перейти к просмотру детальной информации.");
	},

	/* значок "есть фото" */
	set_ti: function (target) {
		catalog.set_t(target, "Для данного товара есть изображение.");
	},

	/* значок "есть свойства" */
	set_tpr: function (target) {
		catalog.set_t(target, "Для данного товара есть дополнительная информация.");
	},

	/* кнопка корзины */
	set_tc: function (target) {
		catalog.set_t(target, "Положить в корзину.");
	},

	/* цена может измениться, иконка */
	set_tp: function (target) {
		catalog.set_t(target, "Внимение! В данный момент товар отсутствует на складе. Цена может измениться.");
	},

	/*  цена может измениться, сообщение */
	set_tpm: function (target) {
		catalog.set_t(target, "Внимение! В данный момент товар отсутствует на складе. Нажмите для отправки заявки на уточнение цены.");
	},

	/* спеццена */
	set_ts: function (target) {
		catalog.set_t(target, "Внимание! Данная цена является специальной.");
	},

	/* спеццена */
	set_tsd: function (target) {
		catalog.set_t(target, "Просмотреть информацию по скидкам / наценкам поставщика.");
	},

	set_rating: function (ratingID, ObjectID, RatingValue) {
		$.ajax(
            {
            	type: "POST",
            	url: "/WebMethods.aspx/SetRatingValue",
            	data: "{ObjectID:'" + ObjectID + "',RatingValue:" + RatingValue + "}",
            	contentType: "application/json; charset=utf-8",
            	dataType: "json",
            	async: true,
            	cache: false,
            	success: function (msg) {
            		$(ratingID).rating(ObjectID, { maxvalue: 5, curvalue: msg.d[0], voicescount: msg.d[1], userrating: msg.d[2] });
            	},
            	error: function (XMLHttpRequest, textStatus, errorThrown) {
            		$.fn.checkInternetConnection(XMLHttpRequest);
            	}
            }
				);
		return false;
	}
};

var themedControl =
{
	init: function (options) {

		if (!options)
			return;

		if (options.buttonClass) {
			webSettings.buttonClass = options.buttonClass;
			webSettings.buttonClassHover = options.buttonClassHover;
			webSettings.buttonLeftClass = options.buttonLeftClass;
			webSettings.buttonLeftClassHover = options.buttonLeftClassHover;
			themedButton.apply($(document));
		};
		if (options.checkedBoxClass) {
			webSettings.checkedBoxClass = options.checkedBoxClass;
			webSettings.checkedBoxClassHover = options.checkedBoxClassHover;
			webSettings.uncheckedBoxClass = options.uncheckedBoxClass;
			webSettings.uncheckedBoxClassHover = options.uncheckedBoxClassHover;
			themedCheckbox.apply($(document));
		};
		if (options.checkedRadioClass) {
			webSettings.checkedRadioClass = options.checkedRadioClass;
			webSettings.checkedRadioClassHover = options.checkedRadioClassHover;
			webSettings.uncheckedRadioClass = options.uncheckedRadioClass;
			webSettings.uncheckedRadioClassHover = options.uncheckedRadioClassHover;
			themedRadio.apply($(document));
		};
		if (options.inputClass) {
			webSettings.inputClass = options.inputClass;
			webSettings.inputClassFocus = options.inputClassFocus;
			webSettings.inputErrorClass = options.inputErrorClass;
			webSettings.inputErrorLeftClass = options.inputErrorLeftClass;
			webSettings.inputLeftClass = options.inputLeftClass;
			webSettings.inputLeftClassFocus = options.inputLeftClassFocus;
			themedInput.apply($(document));
		}
		if (options.comboboxClass) {
			webSettings.comboboxClass = options.comboboxClass;
			webSettings.comboboxClassFocus = options.comboboxClassFocus;
			webSettings.comboboxLeftClass = options.comboboxLeftClass;
			webSettings.comboboxLeftClassFocus = options.comboboxLeftClassFocus;
			themedCombobox.apply($(document));
		};
	},

	setParams: function (control, leftClass, centerClass, params) {
		if (!control.is(":visible"))
			return;
		if (control.parent().is("span"))
			if (control.is("input[type='checkbox']") || control.is("input[type='radio']"))
				control.parent().addClass(centerClass).attr(params);
			else return;
		else {
			var useLeftSpan = params.useLeftSpan;
			control.after(
                "<span class='zwc_input" + (useLeftSpan ? (leftClass ? " " + leftClass + "'" : "'") : (centerClass ? " " + centerClass + "'" : "'")) + ">" +
                    (useLeftSpan ? "<span class='" + centerClass + "'>" + (control.is("select") ? "<span></span>" : "") + "</span>" : "") + "</span>");
			var span = control.next(".zwc_input");
			span.attr(params);
			useLeftSpan ? span.children().append(control) : span.append(control);
			control.attr("themed", true);
		}
	}

};

var themedInput =
{
	fin: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var inputLeftClass = source.attr("classLeft");
		var inputClass = source.attr("classCenter");
		var inputLeftClassFocus = source.attr("classLeftFocus");
		var inputClassFocus = source.attr("classCenterFocus");
		var inputClassError = source.attr("classCenterError");
		var inputLeftClassError = source.attr("classLeftError");

		var errorMode = source.attr("errorMode");
		if (inputLeftClassError && inputLeftClassFocus && inputLeftClass)
			source.removeClass(errorMode ? inputLeftClassError : inputLeftClass).addClass(inputLeftClassFocus);
		if (inputClassError && inputClassFocus && inputClass)
			source.children("span:first").removeClass(errorMode ? inputClassError : inputClass).addClass(inputClassFocus);
	},
	fout: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var inputLeftClass = source.attr("classLeft");
		var inputClass = source.attr("classCenter");
		var inputLeftClassFocus = source.attr("classLeftFocus");
		var inputClassFocus = source.attr("classCenterFocus");
		var inputClassError = source.attr("classCenterError");
		var inputLeftClassError = source.attr("classLeftError");

		var errorMode = source.attr("errorMode");
		errorMode = false;
		if (inputLeftClassError && inputLeftClassFocus && inputLeftClass)
			source.removeClass(inputLeftClassFocus).addClass(errorMode ? inputLeftClassError : inputLeftClass);
		if (inputClassError && inputClassFocus && inputClass)
			source.children("span:first").removeClass(inputClassFocus).addClass(errorMode ? inputClassError : inputClass);
	},
	apply: function (element) {
		if (webSettings.inputClass || webSettings.inputLeftClass || webSettings.inputClassFocus || webSettings.inputLeftClassFocus || webSettings.inputErrorClass || webSettings.inputErrorLeftClass) {
			var inputs = element.find("input[type='text']").each(function () {
				var currentInput = $(this);
				var fromControl = false;
				if (currentInput.attr("classCenter") || currentInput.attr("classCenterFocus") || currentInput.attr("classCenterError") || currentInput.attr("classLeftError") || currentInput.attr("classLeft") || currentInput.attr("classLeftFocus"))
					fromControl = true;
				var classCenter = (fromControl ? currentInput.attr("classCenter") : webSettings.inputClass);
				var classCenterFocus = (fromControl ? currentInput.attr("classCenterFocus") : webSettings.inputClassFocus);
				var classCenterError = (fromControl ? currentInput.attr("classCenterError") : webSettings.inputErrorClass);
				var classLeftError = (fromControl ? currentInput.attr("classLeftError") : webSettings.inputErrorLeftClass);
				var classLeft = (fromControl ? currentInput.attr("classLeft") : webSettings.inputLeftClass);
				var classLeftFocus = (fromControl ? currentInput.attr("classLeftFocus") : webSettings.inputLeftClassFocus);
				themedControl.setParams(currentInput, classLeft, classCenter,
                                        { "classCenter": classCenter,
                                        	"classCenterFocus": classCenterFocus,
                                        	"classCenterError": classCenterError,
                                        	"classLeftError": classLeftError,
                                        	"classLeft": classLeft,
                                        	"classLeftFocus": classLeftFocus,
                                        	"useLeftSpan": true,
                                        	"errorMode": false
                                        });
				currentInput.removeAttr("classCenter").removeAttr("classCenterFocus").removeAttr("classCenterError").removeAttr("classLeftError").removeAttr("classLeft").removeAttr("classLeftFocus");
				currentInput.addClass("zwc_hand").css("height", currentInput.parent().height()).css("line-height", currentInput.parent().css("line-height")).parents("span.zwc_input").addClass("zwc_hand").focusin(themedInput.fin).focusout(themedInput.fout);
			});
		}
	},
	hide: function (element) {
		$(element).parents(".zwc_input").replaceWith(element);
		$(element).css("display", "none");
	}
}

var themedCombobox =
{
	fin: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var comboboxLeftClass = source.attr("classLeft");
		var comboboxClass = source.attr("classCenter");
		var comboboxLeftClassFocus = source.attr("classLeftFocus");
		var comboboxClassFocus = source.attr("classCenterFocus");

		if (comboboxLeftClass && comboboxLeftClassFocus)
			source.removeClass(comboboxLeftClass).addClass(comboboxLeftClassFocus);

		if (comboboxClass && comboboxClassFocus)
			source.children("span:first").removeClass(comboboxClass).addClass(comboboxClassFocus);
	},
	fout: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var comboboxLeftClass = source.attr("classLeft");
		var comboboxClass = source.attr("classCenter");
		var comboboxLeftClassFocus = source.attr("classLeftFocus");
		var comboboxClassFocus = source.attr("classCenterFocus");

		if (comboboxLeftClass && comboboxLeftClassFocus)
			source.removeClass(comboboxLeftClassFocus).addClass(comboboxLeftClass);

		if (comboboxClass && comboboxClassFocus)
			source.children("span:first").removeClass(comboboxClassFocus).addClass(comboboxClass);
	},
	change: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var comboboxLeftClass = source.attr("classLeft");
		var comboboxClass = source.attr("classCenter");
		var comboboxLeftClassFocus = source.attr("classLeftFocus");
		var comboboxClassFocus = source.attr("classCenterFocus");

		var span = source.children("span:first").children("span:first");
		var combobox = source.children("span:first").children("select:first");
		span.text(combobox.children("option:selected").text());
	},
	apply: function (element) {
		if (webSettings.comboboxClass || webSettings.comboboxLeftClass || webSettings.comboboxClassFocus || webSettings.comboboxLeftClassFocus) {
			var comboboxs = element.find("select").each(function () {
				var combobox = $(this);
				var fromControl = false;
				if (combobox.attr("classCenter") || combobox.attr("classCenterFocus") || combobox.attr("classLeft") || combobox.attr("classLeftFocus"))
					fromControl = true;
				var classCenter = (fromControl ? combobox.attr("classCenter") : webSettings.comboboxClass);
				var classCenterFocus = (fromControl ? combobox.attr("classCenterFocus") : webSettings.comboboxClassFocus);
				var classLeft = (fromControl ? combobox.attr("classLeft") : webSettings.comboboxLeftClass);
				var classLeftFocus = (fromControl ? combobox.attr("classLeftFocus") : webSettings.comboboxLeftClassFocus);
				themedControl.setParams(combobox, classLeft, classCenter,
                    { "classCenter": classCenter,
                    	"classCenterFocus": classCenterFocus,
                    	"classLeft": classLeft,
                    	"classLeftFocus": classLeftFocus,
                    	"useLeftSpan": true
                    });
				combobox.removeAttr("classCenter").removeAttr("classCenterFocus").removeAttr("classLeft").removeAttr("classLeftFocus"); //               
				combobox.addClass("zwc_hand").css("height", combobox.parent().css("height", combobox.parent().height()).css("line-height")).parents("span.zwc_input").addClass("zwc_hand").focusin(themedCombobox.fin).focusout(themedCombobox.fout).change(themedCombobox.change);
				combobox.parent().children("span:first").css("height", combobox.parent().height()).width(combobox.width()).text(combobox.children("option:selected").text());
			});
		}
	},
	hide: function (element) {
		$(element).parents(".zwc_input").replaceWith(element);
		$(element).css("display", "none");
	}
};

var themedButton =
{
	over: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var buttonLeftClass = source.attr("classLeft");
		var buttonClass = source.attr("classCenter");
		var buttonLeftClassHover = source.attr("classLeftHover");
		var buttonClassHover = source.attr("classCenterHover");

		if (buttonLeftClass && buttonLeftClassHover)
			source.removeClass(buttonLeftClass).addClass(buttonLeftClassHover);

		if (buttonClass && buttonClassHover)
			source.children("span:first").removeClass(buttonClass).addClass(buttonClassHover);
	},
	out: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var buttonLeftClass = source.attr("classLeft");
		var buttonClass = source.attr("classCenter");
		var buttonLeftClassHover = source.attr("classLeftHover");
		var buttonClassHover = source.attr("classCenterHover");

		if (buttonLeftClass && buttonLeftClassHover)
			source.removeClass(buttonLeftClassHover).addClass(buttonLeftClass);

		if (buttonClass && buttonClassHover)
			source.children("span:first").removeClass(buttonClassHover).addClass(buttonClass);
	},
	apply: function (element) {
		if (webSettings.buttonClass || webSettings.buttonLeftClass || webSettings.buttonClassHover || webSettings.buttonLeftClassHover) {
			var buttons = element.find("input[type='button'], input[type='submit']").each(function () {
				var button = $(this);
				var fromControl = false;
				if (button.attr("classCenter") || button.attr("classCenterHover") || button.attr("classLeft") || button.attr("classLeftHover"))
					fromControl = true;
				var classCenter = (fromControl ? button.attr("classCenter") : webSettings.buttonClass);
				var classCenterHover = (fromControl ? button.attr("classCenterHover") : webSettings.buttonClassHover);
				var classLeft = (fromControl ? button.attr("classLeft") : webSettings.buttonLeftClass);
				var classLeftHover = (fromControl ? button.attr("classLeftHover") : webSettings.buttonLeftClassHover);
				themedControl.setParams(button, classLeft, classCenter,
                                            { "classCenter": classCenter,
                                            	"classCenterHover": classCenterHover,
                                            	"classLeft": classLeft,
                                            	"classLeftHover": classLeftHover,
                                            	"useLeftSpan": true
                                            });
				button.removeAttr("classCenter").removeAttr("classCenterHover").removeAttr("classLeft").removeAttr("classLeftHover");
				button.addClass("zwc_hand").height(button.parent().height()).parents("span.zwc_input").addClass("zwc_hand").hover(themedButton.over, themedButton.out);
			});
		}
	},
	hide: function (element) {
		$(element).parents(".zwc_input").replaceWith(element);
		$(element).css("display", "none");
	}
}

var themedCheckbox =
{
	over: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var checkedClass = source.attr("classCenterChecked");
		var checkedClassHover = source.attr("classCenterCheckedHover");
		var uncheckedClass = source.attr("classCenterUnchecked");
		var uncheckedClassHover = source.attr("classCenterUncheckedHover");

		var checked = source.children().attr("checked");
		if (checked) {
			if (checkedClass && checkedClassHover)
				source.removeClass(checkedClass).addClass(checkedClassHover);
		}
		else {
			if (uncheckedClass && uncheckedClassHover)
				source.removeClass(uncheckedClass).addClass(uncheckedClassHover);
		}
	},
	out: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var checkedClass = source.attr("classCenterChecked");
		var checkedClassHover = source.attr("classCenterCheckedHover");
		var uncheckedClass = source.attr("classCenterUnchecked");
		var uncheckedClassHover = source.attr("classCenterUncheckedHover");

		var checked = source.children().attr("checked");
		if (checked) {
			if (checkedClass && checkedClassHover)
				source.removeClass(checkedClassHover).addClass(checkedClass);
		}
		else {
			if (uncheckedClass && uncheckedClassHover)
				source.removeClass(uncheckedClassHover).addClass(uncheckedClass);
		}
	},
	check: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);

		var checkedClass = source.attr("classCenterChecked");
		var checkedClassHover = source.attr("classCenterCheckedHover");
		var uncheckedClass = source.attr("classCenterUnchecked");
		var uncheckedClassHover = source.attr("classCenterUncheckedHover");

		var checked = source.children().attr("checked");
		if (checkedClassHover && uncheckedClassHover)
			if (checked) {
				source.removeClass(checkedClassHover).addClass(uncheckedClassHover);
				source.children().attr("checked", false);
			}
			else {
				source.removeClass(uncheckedClass).removeClass(uncheckedClassHover).addClass(checkedClassHover);
				source.children().attr("checked", true);
			}
	},
	apply: function (element) {
		if (webSettings.checkedBoxClass || webSettings.checkedBoxClassHover || webSettings.uncheckedBoxClass || webSettings.uncheckedBoxClassHover) {
			var checkboxs = element.find("input[type='checkbox']").each(function () {
				var checkbox = $(this);
				var fromControl = false;
				var span = checkbox.parent();
				if (span.attr("classCenterChecked") || span.attr("classCenterCheckedHover") || span.attr("classCenterUnchecked") || span.attr("classCenterUncheckedHover"))
					fromControl = true;
				var classCenterChecked = (fromControl ? span.attr("classCenterChecked") : webSettings.checkedBoxClass);
				var classCenterCheckedHover = (fromControl ? span.attr("classCenterCheckedHover") : webSettings.checkedBoxClassHover);
				var classCenterUnchecked = (fromControl ? span.attr("classCenterUnchecked") : webSettings.uncheckedBoxClass);
				var classCenterUncheckedHover = (fromControl ? span.attr("classCenterUncheckedHover") : webSettings.uncheckedBoxClassHover);
				themedControl.setParams(checkbox, null, (checkbox.attr("checked") ? classCenterChecked : classCenterUnchecked),
                    { "classCenterChecked": classCenterChecked,
                    	"classCenterCheckedHover": classCenterCheckedHover,
                    	"classCenterUnchecked": classCenterUnchecked,
                    	"classCenterUncheckedHover": classCenterUncheckedHover,
                    	"useLeftSpan": false
                    });
				checkbox.addClass("zwc_hand").parent().addClass("zwc_input").addClass("zwc_hand").hover(themedCheckbox.over, themedCheckbox.out).click(themedCheckbox.check);
			});
		}
	},

	hide: function (element) {
		$(element).parents(".zwc_input").replaceWith(element);
		$(element).css("display", "none");
	}
};

var themedRadio =
{
	over: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var checkedClass = source.attr("classCenterChecked");
		var checkedClassHover = source.attr("classCenterCheckedHover");
		var uncheckedClass = source.attr("classCenterUnchecked");
		var uncheckedClassHover = source.attr("classCenterUncheckedHover");

		var checked = source.children().attr("checked");
		if (checked) {
			if (checkedClass && checkedClassHover)
				source.removeClass(checkedClass).addClass(checkedClassHover);
		}
		else {
			if (uncheckedClass && uncheckedClassHover)
				source.removeClass(uncheckedClass).addClass(uncheckedClassHover);
		}
	},
	out: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);
		var checkedClass = source.attr("classCenterChecked");
		var checkedClassHover = source.attr("classCenterCheckedHover");
		var uncheckedClass = source.attr("classCenterUnchecked");
		var uncheckedClassHover = source.attr("classCenterUncheckedHover");

		var checked = source.children().attr("checked");
		if (checked) {
			if (checkedClass && checkedClassHover)
				source.removeClass(checkedClassHover).addClass(checkedClass);
		}
		else {
			if (uncheckedClass && uncheckedClassHover)
				source.removeClass(uncheckedClassHover).addClass(uncheckedClass);
		}
	},
	check: function (source) {
		if (this && $(this).is("span"))
			source = $(this);
		else
			source = $(source);

		var checkedClass = source.attr("classCenterChecked");
		var checkedClassHover = source.attr("classCenterCheckedHover");
		var uncheckedClass = source.attr("classCenterUnchecked");
		var uncheckedClassHover = source.attr("classCenterUncheckedHover");

		var radio = source.children();
		var checked = radio.attr("checked");
		if (checkedClassHover && uncheckedClassHover && checkedClass && uncheckedClass)
			if (checked) {
				if (radio.is(":checkbox")) {
					source.removeClass(checkedClassHover).addClass(uncheckedClassHover);
					radio.attr("checked", false);
				}
			}
			else {
				if (radio.is(":radio")) {
					$("input[type='radio'][name='" + radio.attr("name") + "']").parent().removeClass(checkedClass).removeClass(checkedClassHover).addClass(uncheckedClass);
					radio.attr("checked", true);
				}
				source.removeClass(uncheckedClass).removeClass(uncheckedClassHover).addClass(checkedClassHover);
			}
	},
	apply: function (element) {
		if (webSettings.checkedRadioClass || webSettings.checkedRadioClassHover || webSettings.uncheckedRadioClass || webSettings.uncheckedRadioClassHover) {
			var radios = element.find("input[type='radio']").each(function () {
				var radio = $(this);
				var fromControl = false;
				if (radio.attr("classCenterChecked") || radio.attr("classCenterCheckedHover") || radio.attr("classCenterUnchecked") || radio.attr("classCenterUncheckedHover"))
					fromControl = true;
				var classCenterChecked = (fromControl ? radio.attr("classCenterChecked") : webSettings.checkedRadioClass);
				var classCenterCheckedHover = (fromControl ? radio.attr("classCenterCheckedHover") : webSettings.checkedRadioClassHover);
				var classCenterUnchecked = (fromControl ? radio.attr("classCenterUnchecked") : webSettings.uncheckedRadioClass);
				var classCenterUncheckedHover = (fromControl ? radio.attr("classCenterUncheckedHover") : webSettings.uncheckedRadioClassHover);
				themedControl.setParams(radio, null, (radio.attr("checked") ? classCenterChecked : classCenterUnchecked),
                                        { "classCenterChecked": classCenterChecked,
                                        	"classCenterCheckedHover": classCenterCheckedHover,
                                        	"classCenterUnchecked": classCenterUnchecked,
                                        	"classCenterUncheckedHover": classCenterUncheckedHover,
                                        	"useLeftSpan": false
                                        });
				radio.addClass("zwc_hand").parent().addClass("zwc_input").addClass("zwc_hand").hover(themedRadio.over, themedRadio.out).click(themedRadio.check);
			});
		}
	},
	hide: function (element) {
		$(element).parents(".zwc_input").replaceWith(element);
		$(element).css("display", "none");
	}
}

/* сворачиваемая панель */
var collapsablePanel =
{
	toggle: function (header) {

		var control = $(header).parents("#zw_collapsable:first");
		var content = control.find("#zw_collapsable_content");
		var buttonExpandClass = control.attr("zw_cec");
		var buttonCollapseClass = control.attr("zw_ccc");
		if (buttonExpandClass || buttonCollapseClass) {

			var button = control.find("#zw_collapsable_button");
			if (content.is(":visible"))
				button.removeClass(buttonCollapseClass).addClass(buttonExpandClass);
			else
				button.removeClass(buttonExpandClass).addClass(buttonCollapseClass);

		}

		content.slideToggle();
	}
};
/* */

/* валидация введенных пользователем данных */
var validators =
{
	/* валидация */
	validate: function (source, args) {
		var validator = $(source);
		var validateField = $("#" + source.controltovalidate);
		var settings = validator.attr("settings").split(' ');
		var messages = validator.attr("errormessage");
		var options = validator.attr("options");

		if (!messages)
			messages = {};
		else
			eval("messages = " + messages + ";");

		if (!options)
			options = {};
		else
			eval("options = " + options + ";");

		messages = $.extend(true, validators.messages, messages);
		options = $.extend(true, validators.options, options);

		var valid = true;

		$.each(settings, function () {

			if (!valid)
				return;

			eval("valid &= validators." + this + "(source, args, options[this]);");
			if (valid) {
				validateField.removeClass("error");
				validateField.attr("title", "");
			}
			else {

				validateField.addClass("error");
				validateField.attr("title", messages[this]);
				return;
			}
		});

		args.IsValid = valid;
	},

	/* проверка на обязательное поле */
	required: function required(source, args, options) {
		if (args.Value.trim())
			return true;
		else
			return false;
	},

	/* проверка на email */
	email: function validate_email(source, args, options) {
		return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(args.Value);
	},

	/* проверка на значение "в границах" */
	range: function (source, args, options) {
		return (args.Value >= options.min && args.Value <= options.max);
	},

	/* проверка на длину значение "в границах" */
	rangelength: function (source, args, options) {
		var length = $.trim(args.Value).length;
		return (length >= options.min && length <= options.max);
	},

	/* проверка на занятость логина */
	login: function (source, args, options) {

		if ($("#" + $(source).attr("controltovalidate")).attr("readonly"))
			return true;
		var exist = webSettings.get_webMethod({ method: 'GET_UserLogin', parameters: '{login: "' + args.Value + '"}', async: false });
		if (exist) {
			return exist.d;
		}
		return true;
	},

	/* проверка на совпадение пароля */
	password: function (source, args, options) {

		var validateField = $("#" + $(source).attr("controltovalidate"));
		var id = validateField.attr("id").split('_');
		id[id.length - 1] = options;
		var confirmid = "";
		$.each(id, function () {
			confirmid += confirmid ? "_" + this : this;
		});

		return args.Value == $("#" + confirmid).val();
	},

	/* проверка на минимальную длину поля */
	minlength: function (source, args, options) {
		return $.trim(args.Value).length >= options;
	},

	/* */
	nobots: function (source, args, options) {

		if (args.Value == options)
			return true;

		noBots.init($(source).parents("div:first"));

		return false;
	},

	/* значения сообщений по-умолчанию */
	messages: {
		required: 'Поле обязателько к заполнению',
		email: 'Неверный формат почтового адреса',
		range: '',
		rangelength: '',
		login: 'Логин занят',
		minlength: '',
		password: 'Пароли не совпадают'

	},

	/* значения проверк по-умолчанию */
	options: {
		range: { min: 2, max: 10000000 },
		rangelength: { min: 2, max: 10000000 },
		minlength: 2
	}
};

var noBots = {

	first: 0,

	second: 0,

	operations: ["+", "*", "-", "/"],

	opertaion: 0,


	/**
	* @suppress {checkVars}
	*/
	check: function (captcha, userAnswer) {
		
		if (userAnswer == result)
			return true;

		noBots.init(captcha);

		return false;
	},

	init: function (captcha) {

		noBots.first = Math.abs(Math.ceil(Math.random() * 10));
		noBots.second = Math.abs(Math.ceil(Math.random() * 10));

		if (noBots.first < noBots.second) {
			var tmp = noBots.second;
			noBots.second = noBots.first;
			noBots.first = tmp;
		}
		var isAllowDivide = (noBots.first % noBots.second == 0);
		var operationsCount = (noBots.first % noBots.second == 0) ? 3 : 2;
		noBots.opertaion = Math.ceil(Math.random() * 10) % operationsCount;
		var result;
		eval("result = " + noBots.first.toString() + " " + noBots.operations[noBots.opertaion] + " " + noBots.second.toString());

		captcha.find("#sNoBots").html("Проверка вопроса системой &quot;Антиспам&quot;.<br/>Пожалуйста, введите результат следующей операции: <b>" + noBots.first.toString() + " " + noBots.operations[noBots.opertaion] + " " + noBots.second.toString() + " = ?</b> (число).");
		captcha.find("[settings]").attr("options", "{nobots: " + result.toString() + "}");
	},

	initSmall: function (captchaSpan, captchaValidator) {

		noBots.first = Math.abs(Math.ceil(Math.random() * 10))
		noBots.second = Math.abs(Math.ceil(Math.random() * 10))

		if (noBots.first < noBots.second) {
			var tmp = noBots.second;
			noBots.second = noBots.first;
			noBots.first = tmp;
		}
		var isAllowDivide = (noBots.first % noBots.second == 0);
		var operationsCount = (noBots.first % noBots.second == 0) ? 3 : 2;
		noBots.opertaion = Math.ceil(Math.random() * 10) % operationsCount;
		var result;
		eval("result = " + noBots.first.toString() + " " + noBots.operations[noBots.opertaion] + " " + noBots.second.toString());

		captchaSpan.html('Проверка вопроса системой &quot;Антиспам&quot;.<br/>Пожалуйста, введите результат следующей операции: <b>' + noBots.first.toString() + " " + noBots.operations[noBots.opertaion] + " " + noBots.second.toString() + " = ?</b> (число).");
		captchaValidator.attr("options", "{nobots: " + result.toString() + "}");
	}

};
/*
@howto:
jQuery('#my-element').center(true); would center the element with ID 'my-element' using absolute position (leave empty for fixed).

*/
/**
* @suppress {globalThis}
*/
jQuery.fn.center = function (absolute) {
	return this.each(function () {
		var t = jQuery(this);

		t.css({
			position: absolute ? 'absolute' : 'fixed',
			left: '50%',
			top: '50%'
		}).css({
			marginLeft: '-' + (t.width() / 2) + 'px',
			marginTop: '-' + (t.height() / 2) + 'px'
		});

		if (absolute) {
			t.css({
				marginTop: parseInt(t.css('marginTop'), 10) + jQuery(window).scrollTop(),
				marginLeft: parseInt(t.css('marginLeft'), 10) + jQuery(window).scrollLeft()
			});
		}
	});
};

$.fn.showImage = function () {
	var img = this;
	var src = img.attr("src");
	var indID = src.indexOf("img");
	var indAmp = src.indexOf("&", indID);
	var id = null;
	if (indAmp != -1)
		id = src.substring(indID, indAmp);
	else
		id = src.substring(indID);
	var url = "/showimage.ashx?" + id;

	window.open(url, 'img', 'toolbar=0, location=0, directories=0, menubar=0, status=0');
	return this;
};

$.fn.messageBox = function (title, message, settings) {

	title = title || "";
	message = message || "";

	var defaultSettings = {
		color: '#666666',
		width: 250,
		okButton: true,
		cancelButton: false,
		okButtonText: 'Закрыть',
		cancelButtonText: 'Отмена',
		okButtonEventHandler: null,
		cancelButtonEventHandler: null,
		closeButtonEventHandler: null,
		contentAlignment: 'center'
	};

	var mbOkButtonClick = function (event) {
		if (event.data.okButtonEventHandler)
			var a = event.data.okButtonEventHandler();
		if (a == false)
			return;
		$("#" + event.data.dialogID).remove();
	}

	var mbCancelButtonClick = function (event) {
		$("#" + event.data.dialogID).remove();
		if (event.data.cancelButtonEventHandler)
			event.data.cancelButtonEventHandler();
	}

	var mbCloseButtonClick = function (event) {
		$("#" + event.data.dialogID).remove();
		if (event.data.closeButtonEventHandler)
			event.data.closeButtonEventHandler();
	}

	$.extend(defaultSettings, settings);

	var x;
	$(document).ready(function () {
		var dialogID = ("mpa-" + (new Date()).getTime());
		var dialog = $("<div id=\"" + dialogID + "\" style=\"min-width: 200px; position: fixed; z-index: 10000;\" ctrltype=\"popup\"></div>").appendTo(document.body);

		var childDivs = "<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
		childDivs += "<tbody>";
		childDivs += "<tr class=\"pop_header\">";
		childDivs += "<td class=\"pop_top_l\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_top_c\">";
		childDivs += "<div>";
		childDivs += "<span id=\"lblHeader\">Header</span></div>";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_top_r\">";
		childDivs += "<a href=\"javascript:void(0);\" class=\"close\" onclick=\"$(this).closepopup();\">Закрыть</a>";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "</tbody>";
		childDivs += "</table>";
		childDivs += "<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
		childDivs += "<tbody>";
		childDivs += "<tr>";
		childDivs += "<td class=\"pop_l\">";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_content\">";
		childDivs += "<div class=\"scroller\">";
		childDivs += "<table style=\"width: 100%\" class=\"tbl_form\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
		childDivs += "<tbody>";
		childDivs += "<tr>";
		childDivs += "<td class=\"pop_footer\">";
		childDivs += "<input type=\"button\" id=\"btnOk\" value=\"Ok\" style=\"margin-left: 2px; margin-right: 2px;\"/>";
		childDivs += "<input type=\"button\" id=\"btnCancel\" value=\"Отмена\" onclick=\"$(this).closepopup(); return false;\" style=\"margin-left: 2px; margin-right: 2px;\"/>";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "</tbody>";
		childDivs += "</table>";
		childDivs += "</div>";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_r\">";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "<tr>";
		childDivs += "<td class=\"pop_bot_l\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_bot_c\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_bot_r\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "</tbody>";
		childDivs += "</table>";

		dialog.append(childDivs);

		// Устанавливаем заголовок
		dialog.find("#lblHeader").text(title);
		// Устанавливаем содержимое, цвет текста и выравнивание содержимого
		dialog.find(".pop_content").prepend(message).css({ 'color': defaultSettings.color, 'text-align': defaultSettings.contentAlignment });
		// Устанавливаем видимость кнопки ОК и ее текст
		dialog.find("#btnOk").css('display', (defaultSettings.okButton == true) ? '' : 'none').val(defaultSettings.okButtonText);
		// Устанавливаем видимость кнопки Cancel и ее текст
		dialog.find("#btnCancel").css('display', (defaultSettings.cancelButton == true) ? '' : 'none').val(defaultSettings.cancelButtonText);
		// Устанавливаем ширину диалога
		dialog.css('width', defaultSettings.width);
		// Устанавливаем обработчик нажатия для кнопки Ok
		dialog.find("#btnOk").bind("click", { dialogID: dialogID, okButtonEventHandler: defaultSettings.okButtonEventHandler }, mbOkButtonClick);
		// Устанавливаем обработчик нажатия для кнопки Cancel
		dialog.find("#btnCancel").bind("click", { dialogID: dialogID, cancelButtonEventHandler: defaultSettings.cancelButtonEventHandler }, mbCancelButtonClick);
		// Устанавливаем обработчик нажатия для кнопки Close
		dialog.find("a.close").bind("click", { dialogID: dialogID, closeButtonEventHandler: defaultSettings.closeButtonEventHandler }, mbCloseButtonClick);
		themedButton.apply(dialog);
		// Центруем диалог
		dialog.center();
		x = dialog;
	});
	return x;
};

/**
* REMOVE THIS! when templatedMessageBox will be done
* @suppress {checkVars}
*/
$.fn.templatedMessageBox = function (title, template) {

	title = title || "";
	message = message || "";

	var defaultSettings = {
		color: '#666666',
		width: 250,
		okButton: true,
		cancelButton: false,
		okButtonText: 'Закрыть',
		cancelButtonText: 'Отмена',
		okButtonEventHandler: null,
		cancelButtonEventHandler: null,
		closeButtonEventHandler: null,
		contentAlignment: 'center'
	};

	var mbOkButtonClick = function (event) {
		if (event.data.okButtonEventHandler)
			var a = event.data.okButtonEventHandler();
		if (a == false)
			return;
		$("#" + event.data.dialogID).remove();
	};

	var mbCancelButtonClick = function (event) {
		$("#" + event.data.dialogID).remove();
		if (event.data.cancelButtonEventHandler)
			event.data.cancelButtonEventHandler();
	};

	var mbCloseButtonClick = function (event) {
		$("#" + event.data.dialogID).remove();
		if (event.data.closeButtonEventHandler)
			event.data.closeButtonEventHandler();
	};

	$.extend(defaultSettings, settings);

	var x;
	$(document).ready(function () {
		var dialogID = ("mpa-" + (new Date()).getTime());
		var dialog = $("<div id=\"" + dialogID + "\" style=\"min-width: 200px; position: fixed; z-index: 10000;\" ctrltype=\"popup\"></div>").appendTo(document.body);

		var childDivs = "<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
		childDivs += "<tbody>";
		childDivs += "<tr class=\"pop_header\">";
		childDivs += "<td class=\"pop_top_l\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_top_c\">";
		childDivs += "<div>";
		childDivs += "<span id=\"lblHeader\">Header</span></div>";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_top_r\">";
		childDivs += "<a href=\"javascript:void(0);\" class=\"close\" onclick=\"$(this).closepopup();\">Закрыть</a>";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "</tbody>";
		childDivs += "</table>";
		childDivs += "<table cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
		childDivs += "<tbody>";
		childDivs += "<tr>";
		childDivs += "<td class=\"pop_l\">";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_content\">";
		childDivs += "<div class=\"scroller\">";
		childDivs += "<table style=\"width: 100%\" class=\"tbl_form\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">";
		childDivs += "<tbody>";
		childDivs += "<tr>";
		childDivs += "<td class=\"pop_footer\">";
		childDivs += "<input type=\"button\" id=\"btnOk\" value=\"Ok\" style=\"margin-left: 2px; margin-right: 2px;\"/>";
		childDivs += "<input type=\"button\" id=\"btnCancel\" value=\"Отмена\" onclick=\"$(this).closepopup(); return false;\" style=\"margin-left: 2px; margin-right: 2px;\"/>";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "</tbody>";
		childDivs += "</table>";
		childDivs += "</div>";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_r\">";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "<tr>";
		childDivs += "<td class=\"pop_bot_l\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_bot_c\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "<td class=\"pop_bot_r\">";
		childDivs += "&nbsp;";
		childDivs += "</td>";
		childDivs += "</tr>";
		childDivs += "</tbody>";
		childDivs += "</table>";

		dialog.append(childDivs);

		// Устанавливаем заголовок
		dialog.find("#lblHeader").text(title);
		// Устанавливаем содержимое, цвет текста и выравнивание содержимого
		dialog.find(".pop_content").prepend(message).css({ 'color': defaultSettings.color, 'text-align': defaultSettings.contentAlignment });
		// Устанавливаем видимость кнопки ОК и ее текст
		dialog.find("#btnOk").css('display', (defaultSettings.okButton == true) ? '' : 'none').val(defaultSettings.okButtonText);
		// Устанавливаем видимость кнопки Cancel и ее текст
		dialog.find("#btnCancel").css('display', (defaultSettings.cancelButton == true) ? '' : 'none').val(defaultSettings.cancelButtonText);
		// Устанавливаем ширину диалога
		dialog.css('width', defaultSettings.width);
		// Устанавливаем обработчик нажатия для кнопки Ok
		dialog.find("#btnOk").bind("click", { dialogID: dialogID, okButtonEventHandler: defaultSettings.okButtonEventHandler }, mbOkButtonClick);
		// Устанавливаем обработчик нажатия для кнопки Cancel
		dialog.find("#btnCancel").bind("click", { dialogID: dialogID, cancelButtonEventHandler: defaultSettings.cancelButtonEventHandler }, mbCancelButtonClick);
		// Устанавливаем обработчик нажатия для кнопки Close
		dialog.find("a.close").bind("click", { dialogID: dialogID, closeButtonEventHandler: defaultSettings.closeButtonEventHandler }, mbCloseButtonClick);
		themedButton.apply(dialog);
		// Центруем диалог
		dialog.center();
		x = dialog;
	});
	return x;
};

$.fn.changecontractor = function (ddl) {
	var contractorid = $(ddl).find('option[selected]').val();
	$.ajax(
        {
        	type: "POST",
        	url: "/WebMethods.aspx/ChangeContractor",
        	data: "{sContractorID:'" + contractorid + "'}",
        	contentType: "application/json; charset=utf-8",
        	dataType: "json",
        	async: false,
        	cache: false,
        	success: function (msg) {
        		__doPostBack(ddl.id, contractorid);
        	},
        	error: function (XMLHttpRequest, textStatus, errorThrown) {
        		$.fn.checkInternetConnection(XMLHttpRequest);
        	}
        });
};

/**
* methodName: public webmethod name
parameterList:  like "{'propertyKey': 'propertyValue'}"
onsucces: function delegate
onerror: function delegate
* @param {*} methodName
* @param {*} parameterList
* @param {*=} onsucces
* @param {*=} onerror
* @param {*=} args
* @param {*=} async
*/
$.fn.callwebmethod = function (methodName, parameterList, onsucces, onerror, args, async) {

	if (async == undefined)
		async = false;
	var o = $(this);
	var returnValue = null;
	$.ajax(
        {
        	type: "POST",
        	url: "/WebMethods.aspx/" + methodName,
        	data: parameterList,
        	contentType: "application/json; charset=utf-8",
        	dataType: "json",
        	async: async,
        	cache: false,
        	success: function (msg) {
        		if (onsucces)
        			onsucces.call(o, msg);
        		returnValue = msg;
        	},
        	error: function (XMLHttpRequest, textStatus, errorThrown) {
        		if (onerror)
        			onerror.call(o, XMLHttpRequest, textStatus, errorThrown);
        	}
        });
	return returnValue;
};

/**
* @suppress {globalThis}
*/
$.fn.setClass = function (className) {
	return this.removeClass().addClass(className);
};

$.fn.checkInternetConnection = function (XMLHttpRequest) {
	if (XMLHttpRequest.status == 500 || XMLHttpRequest.status == 12029)
		$.fn.messageBox('Ошибка', 'Ошибка соединения с базой данных.<br />Проверьте ваше подключение к сети Интернет.', { color: 'red' });
};

$.fn.formatMoney = function (n, c, d, t) {
	n = n.toString().replace(/[^0-9,\.-]/g, "").replace(/[,\.]/, ".");
	c = isNaN(c = Math.abs(c)) ? 2 : c;
	d = d == undefined ? "," : d;
	t = t == undefined ? " " : t;
	var s = n < 0 ? "-" : "";
	var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "";
    var j = i.length;
	j = j > 3 ? j % 3 : 0;
	return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
};

$.fn.encodeXML = function(xml) {
    return $('<div/>').text(xml).html();
};

$.fn.decodeXML = function(text) {
    return $('<div/>').html(text).text();
};
$.fn.eventTarget = function (e) {
	var targ;
	if (!e)
		e = window.event;
	if (e.target)
		targ = e.target;
	else if (e.srcElement)
		targ = e.srcElement;
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return $(targ);
};

/* rating stars */
/** @suppress {checkVars} */
$.fn.rating = function (objectID, options) {
	var settings = {
		objectID: objectID,
		maxvalue: 5,
		curvalue: 0,
		voicescount: 0,
		userrating: 0
	};
	if (options)
		$.extend(settings, options);
	var container = $(this);
	$.extend(container, {
		averageRating: settings.curvalue,
		objectID: settings.objectID
	});
	container.empty();
	for (var i = 1; i <= settings.maxvalue; i++) {
		var div = '<div class="star"><a href="javascript:void(0);">' + i + '</a></div>';
		container.append(div);
	}
	var ch = parseInt(settings.voicescount.toString().charAt(settings.voicescount.toString().length - 1));
	var gol;
	if (ch == 1)
		gol = "голос";
	else if (ch > 1 && ch < 5)
		gol = "голоса";
	else
		gol = "голосов";
	var ratingText = "(" + settings.voicescount + " " + gol + ")";
	container.append('<br/>' + ratingText);
	var stars = $(container).children('.star');
	stars.mouseover(function () {
		event.drain();
		event.fill(this);
	})
        .mouseout(function () {
        	event.drain();
        	event.reset();
        })
        .focus(function () {
        	event.drain();
        	event.fill(this);
        })
        .blur(function () {
        	event.drain();
        	event.reset();
        });
	stars.click(function () {
		settings.curvalue = stars.index(this) + 1;
		//webSettings.set_rating(container, settings.objectID, settings.curvalue);
		return false;
	});
	var event = {
		fill: function (el) {
			var index = stars.index(el) + 1;
			stars.children('a').css('width', '100%').end();
			$(container).children('.star:lt(' + index + ')').addClass('hover').end();
		},
		drain: function () {
			stars
                .filter('.on').removeClass('on').end()
                .filter('.hover').removeClass('hover').end()
                .filter('.onusr').removeClass('onusr').end()
                .filter('.onusr2').removeClass('onusr2').end();
		},
		reset: function () {
			$(container).children('.star:lt(' + settings.curvalue + ')').addClass('on').end();
			if (settings.userrating > 0) {
				if (settings.userrating <= settings.curvalue)
					$(container).children('.star:eq(' + (settings.userrating - 1).toString() + ')').addClass('onusr').end();
				else
					$(container).children('.star:eq(' + (settings.userrating - 1).toString() + ')').addClass('onusr2').end();
			}
		}
	};
	event.reset();
	return (this);
};

/* меню */
$.fn.menu = function (op) {
	var menutimeout;
	var currentli;
	var isHorizontal = $(this).attr('horizontal') == 'true';
	var menu = $(this);
	var liOver = function () {
		clearTimeout(menutimeout);
		if (currentli)
			liOut(currentli);
		var li = $(this);
		var isDynamic = li.attr("dynamic");
		if (isDynamic) {
			if (op.horizontalDynamicArrowHoverClass)
				li.find(">#menu-a").removeClass(op.horizontalDynamicArrowClass).addClass(op.horizontalDynamicArrowHoverClass);
		}
		else {
			if (op.horizontalArrowHoverClass)
				li.find(">#menu-a").removeClass(op.horizontalArrowClass).addClass(op.horizontalArrowHoverClass);
		}
		li.find(">ul").css({ visibility: 'visible', display: '' });
	}

	var liOutTimeout = function () {
		currentli = $(this);
		menutimeout = setTimeout(function () {
			if (currentli)
				liOut(currentli);
		}, 500);
	}

	var liOut = function (li) {
		clearTimeout(menutimeout);
		var isDynamic = li.attr("dynamic");
		if (isDynamic) {
			if (op.horizontalDynamicArrowHoverClass)
				li.find(">#menu-a").removeClass(op.horizontalDynamicArrowHoverClass).addClass(op.horizontalDynamicArrowClass);
		}
		else {
			if (op.horizontalArrowHoverClass)
				li.find(">#menu-a").removeClass(op.horizontalArrowHoverClass).addClass(op.horizontalArrowClass);
		}
		li.find("ul").css({ visibility: 'hidden', display: 'block' });
		currentli = null;
	}

	var aOver = function () {
		var a = $(this);
		var li = a.parent();
		var isDynamic = li.attr("dynamic");
		if (isDynamic) {
			li.removeClass(op.horizontalDynamicHrefClass).addClass(op.horizontalDynamicHrefHoverClass);
			if (op.horizontalDynamicHrefLeftHoverClass)
				a.siblings("#menu-l").removeClass(op.horizontalDynamicHrefLeftClass).addClass(op.horizontalDynamicHrefLeftHoverClass);
		}
		else {
			li.removeClass(op.horizontalHrefClass).addClass(op.horizontalHrefHoverClass);
			if (op.horizontalHrefLeftHoverClass)
				a.siblings("#menu-l").removeClass(op.horizontalHrefLeftClass).addClass(op.horizontalHrefLeftHoverClass);
		}
	}

	var aOut = function () {
		var a = $(this);
		var li = a.parent();
		var isDynamic = li.attr("dynamic");
		if (isDynamic) {
			li.removeClass(op.horizontalDynamicHrefHoverClass).addClass(op.horizontalDynamicHrefClass);
			if (op.horizontalDynamicHrefLeftHoverClass)
				a.siblings("#menu-l").removeClass(op.horizontalDynamicHrefLeftHoverClass).addClass(op.horizontalDynamicHrefLeftClass);
		}
		else {
			li.removeClass(op.horizontalHrefHoverClass).addClass(op.horizontalHrefClass);
			if (op.horizontalHrefLeftHoverClass)
				a.siblings("#menu-l").removeClass(op.horizontalHrefLeftHoverClass).addClass(op.horizontalHrefLeftClass);
		}
	}

	var staticli = menu.find("li[static]");
	var dynamicli = menu.find("li[dinamic]");

	var _maxwidth;
	var _width;
	var ul;
	var ulli;
	var li;
	var a;

	staticli.find(">ul").each(function () {
		_width = $(this).siblings("#menu-s").outerWidth();
		$(this).css({ left: _width });
	});

	menu.find("li").each(function () {

		li = $(this);
		_width = 0;
		_maxwidth = 0;
		if (isHorizontal && li.attr("static"))
			_maxwidth = li.outerWidth();
		else {
			if (li.parent().parent().attr("static") && isHorizontal)
				_maxwidth = li.parent().parent().outerWidth();
			li.parent().find(">li").each(function () {
				_width = $(this).outerWidth(true);
				if (_width > _maxwidth)
					_maxwidth = _width;
			});
		}

		li.css({ width: _maxwidth - (li.outerWidth() - li.width()) });

		_width = 0;
		li.children(":not(ul, a)").each(function () {
			_width += $(this).outerWidth(true);
		});
		a = li.find(">a");
		a.css({ width: _maxwidth - _width - (a.outerWidth(true) - a.width()) });
	});

	menu.find('a:has(br)').each(function () {
		a = $(this);
		var h = a.css('line-height', '').css('line-height');
		var fh = parseFloat(h) / (a.has('br').length + 1);
		$(this).css('line-height', fh + h.replace(/[^a-zA-Z]/g, ''));
	});

	staticli.find(">ul").addClass(isHorizontal ? "zwc_menu-ul2" : "zwc_menu-uln").find("ul").addClass("zwc_menu-uln");

	menu.find("li:has(ul)").hover(liOver, liOutTimeout);

	if (op.horizontalHrefHoverClass)
		$(this).find("a").hover(aOver, aOut);
	//		if(!isHorizontal){
	//			$(this).find('li').css({ 'display': 'list-item' });
	//		}
};

$.fn.search = function (options) {
	var source = $(this);
	source = $(source);
	var table = source.parents("table:first");
	var select = table.find("select");
	table.css({ width: options.width });
	var onblur = function () {
		//select.css({ width: '' });
		//source.css({ width: source.parent('td').width() });
	}

	var onfocus = function () {
		//select.css({ width: '20px' });
		//source.css({ width: source.parent('td').width() });
	}
	source.bind("focus", onfocus).bind("blur", onblur);
}

var searchmini = {
	// +
	startHide: function (event) {
		//	var searchControl = event.data.susanna;
		//	var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		//	if (qcontainer.attr('isVisible'))
		//		setTimeout(function () { endHide(event); }, 1200);
	},

	// +
	endHide: function (event) {
		var searchControl = event.data.susanna;

		var qdropdown = searchControl.find('#qdropdown');

		var elem = $(document.elementFromPoint($.coorX, $.coorY));

		if (elem.attr('id') != 'qdropdown')
			elem = elem.parents('#qdropdown');
		if (elem[0] == qdropdown[0])
			return;
		//	onqinputBlur(searchControl);
	},

	// +
	onqinputFocus: function (event) {
		var searchControl = event.data.susanna;

		var qinput = searchControl.find('#qinput');
		qinput.attr("focused", "focused");
		var qcontainer = searchControl.find("[ctrltype='searchsmall']");

		if (qcontainer.attr('selectedValue') == '')
			searchmini.showQDrop(searchControl);

		if (qcontainer.attr('userText') == '')
			qinput.val('');
	},

	// +
	onqinputBlurHandler: function (event) {
		searchmini.onqinputBlur(event.data.susanna);
	},

	onqinputKeyDownHandler: function (event) {
		var searchControl = event.data.susanna;
		var qinput = searchControl.find('#qinput');
		var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		qcontainer.attr('userText', qinput.val());
	},

	// +
	onqinputBlur: function (searchControl) {

		var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		var qdrop = searchControl.find('#qdrop');
		var qdropdown = searchControl.find('#qdropdown');
		var qinput = searchControl.find('#qinput');

		qinput.removeAttr("focused");

		var elem = $(document.elementFromPoint($.coorX, $.coorY));

		if (elem.attr('id') != 'qdropdown')
			elem = elem.parents('#qdropdown');

		if (elem[0] == qdropdown[0])
			return;

		searchmini.hideQDrop(searchControl);

		if (qcontainer.attr('userText') != '') {
			qinput.val(qcontainer.attr('userText'));
			return;
		}

		if (qcontainer.attr('watermarkText') != '') {
			qinput.val(qcontainer.attr('watermarkText'));
			return;
		}

		qinput.val('поиск');
	},

	/**
	* @suppress {globalThis}
	*/
	// +
	init: function (searchControl, widthControl) {

		var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		var qdrop = searchControl.find('#qdrop');
		var qdropdown = searchControl.find('#qdropdown');
		var qinput = searchControl.find('#qinput');
		var qquery = searchControl.find('#qquery');

		var qinputwidth = widthControl - 24;

		qquery.css({ 'width': widthControl + 'px' });
		qinput.css({ 'width': qinputwidth + 'px' });

		qcontainer.attr('selectedValue', '');
		qcontainer.attr('watermarkText', 'поиск');
		qcontainer.attr('userText', '');
		qcontainer.attr('isVisible', false);




		var onqdropmousemove = function () {
			this.className = 'qdrop_over';
		};
		var onqdropmouseout = function () {
			this.className = 'qdrop_off';
		};
		var onqdropclick = function () {
			searchmini.showQDrop(searchControl);
		};

		var onqdropblur = function () {
			searchmini.onqinputBlur(searchControl);
		};

		qdropdown.bind('mouseleave', { susanna: searchControl }, searchmini.startHide);
		qdrop.bind('mousemove', onqdropmousemove).bind('mouseout', onqdropmouseout).bind('click', onqdropclick).bind('blur', onqdropblur);
		qinput.bind('blur', { susanna: searchControl }, searchmini.onqinputBlurHandler).bind('focus', { susanna: searchControl }, searchmini.onqinputFocus).bind('keyup', { susanna: searchControl }, searchmini.onqinputKeyDownHandler);

		searchmini.genQDrop(searchControl);

		var uservariable = webUser.get_UserValue('SearchTypeOfSearch', 'string');
		if (uservariable) {

			var searchType = qdropdown.children("[typeid='" + uservariable + "']");
			searchType.setClass('qdiv_on');
			qcontainer.attr('selectedValue', uservariable);
			qcontainer.attr('watermarkText', 'по ' + searchType.text())
		}

		qinput.val(qcontainer.attr('watermarkText'));
	},

	// +
	showQDrop: function (searchControl) {

		var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		var qdrop = searchControl.find('#qdrop');
		var qdropdown = searchControl.find('#qdropdown');
		var qinput = searchControl.find('#qinput');

		qcontainer.attr('isVisible', true);

		qdrop.setClass('qdrop_on');
		qdropdown.show();

		var index = qcontainer.attr('selectedValue');

		qdropdown.children().setClass('qdiv_off').filter("[typeid='" + index + "']").addClass('qdiv_on');

		var pos = qdrop.offset();
		var height = qdrop.innerHeight();
		var w1 = qdropdown.innerWidth();
		var w2 = qdrop.innerWidth();
		qdropdown.css({ "left": (pos.left - (w1 - w2) - 1) + "px", "top": (pos.top + height) + 1 + "px" });
	},

	// +
	hideQDrop: function (searchControl) {
		var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		var qdropdown = searchControl.find('#qdropdown');

		qcontainer.attr('isVisible', false);
		qdropdown.hide();
	},

	// +
	genQDrop: function (searchControl) {

		var qcontainer = searchControl.find("[ctrltype='searchsmall']");
		var qdrop = searchControl.find('#qdrop');
		var qdropdown = searchControl.find('#qdropdown');
		var qinput = searchControl.find('#qinput');

		var str = '<div>Произошла ошибка</div>';
		var msg = $.fn.callwebmethod('GetSearchTypes', '{}');

		str = (msg.d != '') ? msg.d : '<div>Типы поиска отсутствуют</div>';

		qdropdown.empty().append(str);

		var onmousemove = function () {
			if (!$(this).hasClass('qdiv_on')) {
				$(this).setClass('qdiv_over');
			}
		};

		var onmouseout = function () {
			if (!$(this).hasClass('qdiv_on'))
				$(this).setClass('qdiv_off');
		};

		var onclick = function () {

			if (qinput.val() == qcontainer.attr('watermarkText') || qinput.val() == '') {
				qinput.val('');
				qcontainer.attr('userText', '');
				qinput.focus();
			}

			qcontainer.attr('selectedValue', $(this).attr('typeid'));
			qcontainer.attr('watermarkText', 'по ' + $(this).text());
			qdrop.setClass('qdrop_off');
			searchmini.hideQDrop(searchControl);
		}

		$('#qdropdown').children().addClass('qdiv_off').bind('mouseover', onmousemove).bind('mouseout', onmouseout).bind('click', onclick);
	}
}

/* ============================= SEARCH ============================= */
var search =
{
	init: function (searchPanel) {
		searchPanel.attr("focused", false);

		var tb = searchPanel.find("input:text");
		var ddl = searchPanel.find("select");

		ddl.bind('change', function (event) {
			tb.focus();
		}).bind('dblclick mousedown blur', function (event) {
			search.onevent(searchPanel, event.type, 'ddl');
		}).find("option").bind("click", function (event) {
			tb.focus();
		});

		tb.bind('focus blur', function (event) {
			search.onevent(searchPanel, event.type, 'tb');
		});

		search.set_watermark('blur', 'tb', tb, ddl);
	},

	onevent: function (searchPanel, eventType, source) {

		var tb = searchPanel.find("input:text");
		var ddl = searchPanel.find("select");
		var isFocused = searchPanel.attr("focused");

		// если меняем тип поиска и был установлен фокус в поле ввода - отменяем событие blur для текстбокса
		if (source == 'tb' && eventType == 'blur' && (isFocused == "false" || isFocused == false))
			return;

		// установка width=auto если: 			
		var w = '18px';
		if ((eventType == 'mousedown' || eventType == 'dblclick') && source == 'ddl') {
			w = 'auto';
		}

		ddl.css({ 'width': w });

		// установка флага
		searchPanel.attr("focused", (source == 'tb' && (eventType == 'focus' || eventType == 'change')));

		search.set_watermark(eventType, source, tb, ddl);

		var tbw = searchPanel.attr("sWidth") - searchPanel.find("#cellB").outerWidth() - searchPanel.find("#cellS").outerWidth();
		tb.css({ "width": tbw });

	},

	set_watermark: function (eventType, source, tb, ddl) {
		if
            (
            ((eventType == "focus" || eventType == 'change') && source == "tb")
                ||
                ((eventType == "mousedown" || eventType == 'dblclick') && source == "ddl")
            ) {
			if (ddl.find("option[search='" + tb.val().trim() + "']").length) {
				tb.val("");
				tb.removeClass("zwc_search_watermark");
			}
		}
		if
            (
            eventType == "blur" && source == "tb"
                ||
                eventType == "blur" && source == "ddl"
            ) {
			if (!tb.val()) {
				tb.val(ddl.find("option:selected").text().trim());
				tb.addClass("zwc_search_watermark");
			}
		}
	}
};
/* ============================= //SEARCH ============================= */

/* ============================= WATERMARK ============================= */
/**
* @suppress {globalThis}
*/
$.fn.Watermark = function (text, color) {
	if (!color)
		color = "#aaa";
	return this.each(
			function () {
				var input = $(this);
				var defaultColor = input.css("color");

				function clearMessage() {
					if (input.val() == text)
						input.val(" ");
					input.css("color", defaultColor);
				}

				function insertMessage() {
					if (input.val().length == 0 || input.val() == text) {
						input.val(text);
						input.css("color", color);
					} else
						input.css("color", defaultColor);
				}

				//input.focus(function () { alert("focus"); });
				//input.blur(function () { alert("blur"); });
				//input.blur(function () { alert("change"); });
				input.focus(clearMessage);
				input.blur(insertMessage);
				//input.change(insertMessage);

				insertMessage();
			}
		);
};

/* ============================= //WATERMARK ============================= */

/* ================================= COMMENTS =================================== */
/**
* @suppress {globalThis}
*/
jQuery.fn.comments = function (blnDeep, searchCondition) {
	blnDeep = (blnDeep || false);
	var jComments = $([]);
	var found = false;
	this.each(
		function (intI, objNode) {
			var objChildNode = objNode.firstChild;

			while (objChildNode) {
				if (objChildNode.nodeType === 8) {
					if (searchCondition) {
						if (objChildNode.nodeValue == searchCondition) {
							jComments = jComments.add($(objChildNode));
							found = true;
						}
					}
					else {
						jComments = jComments.add($(objChildNode));
					}
				}
				else if (blnDeep && (objChildNode.nodeType === 1)) {
					jComments = jComments.add($(objChildNode).comments(true, searchCondition));
				}
				if (found)
					return jComments;
				objChildNode = objChildNode.nextSibling;
			}
		});
	return (jComments);
};
/* ===================================== // COMMENTS =============================== */

/* =====================================    ASSIST   =============================== */

var assist =
{
	set_webFormAction: function () {
		$('form').attr("action", "https://payments.paysecure.ru/pay/order.cfm");
	}
};

/* ===================================== // ASSIST   =============================== */

/* =====================================   Currency  =============================== */

var currency =
{
	controlsIDs: { currencySelect: "#zw_currencySelect" },

	attributesNames: {
		templateid: "cs_templateid",
		cs_currencyid: "cs_currencyid"
	},

	selectedValues: {
		cs_currencyid: "",
		cs_currencyname: ""
	},

	settings: {
		templateid: ""
	},

	set_currencySelect: function (element) {
		element = $(element);

		var container = currency.get_container(element);
		var newcontainer = currency.get_newcontainer(currency.controlsIDs.currencySelect, container);

		currency.settings.templateid = container.attr(currency.attributesNames.templateid);
		currency.selectedValues.cs_currencyid = element.attr(currency.attributesNames.cs_currencyid);
		currency.selectedValues.cs_currencyname = element.html();

		currency.set_result(newcontainer, "SET_CurrencySelect");

		window.location = window.location;
	},

	get_container: function (element) {
		var control = element.parents(currency.controlsIDs.currencySelect);
		return control;
	},

	get_newcontainer: function (controlID, container) {
		var newcontainer = $(controlID);
		if (newcontainer.length)
			return newcontainer;
		return container;
	},

	set_result: function (newcontainer, functionName) {
		var settings = { "func": functionName };
		$.extend(settings, currency.selectedValues);
		$.extend(settings, currency.settings);
		$.post(webSettings.get_ASHXUrl("Catalog.ashx"), settings, function (data, textStatus, XMLHttpRequest) {
			newcontainer.attr(currency.selectedValues).html(data);
		}, "html");
	}
};


/* =====================================   Currency  =============================== */


/* =====================================   <Banners> =============================== */

var banners = {

	init: function () {

		$('#zw_banners').each(function () {
			banners.scheduleBannerRefreshing($(this).attr("b_banneruniqueid"), $(this).attr("b_sitebannerformatid"), $(this).attr("b_time") * 1000);
		});
		$('#zw_banners a[b_bannerguid]').live('click', banners.logClick);

	},

	//bannerFormat - Guid формата баннера
	//interval - интервал обновления баннера
	scheduleBannerRefreshing: function (regionGuid, bannerFormat, interval) {
		setTimeout(function () { banners.refreshBanner(regionGuid, bannerFormat, interval); }, interval);
	},

	logClick: function () {
		var bannerGuid = $(this).attr('b_bannerguid');
		$.ajax({ url: MvcActions.BannerController.ReportClick(bannerGuid), async: false });
	},
	safeLoad: function (control, url) {
		var buffer = "";
		var d = document;
		var saved = { write: d.write, open: d.open, close: d.close };
		d.write = function (s) { buffer += s; };
		d.open = d.close = function () { };


		control.load(url, function (html) {
			if (buffer != "") {
				html = html.replace(/<script.*?\/script>/, buffer);
				$(this).html(html);
			}

			d.write = saved.write;
			d.close = saved.close;
			d.open = saved.open;
		});
	},
	refreshBanner: function (regionGuid, bannerFormat, interval) {
		var banner = $("#zw_banners[b_banneruniqueid='" + regionGuid + "']");
		var previousBannerGuid = banner.find('#preloadedBanner a[b_bannerguid]').attr("b_bannerguid");
		var bannerTemplate = banner.attr("b_template");
		var openInNewWindow = banner.attr(Constants.zw_Banners.OpenInNewWindowAttribute);

		var url = MvcActions.BannerController.AjaxBanner(bannerFormat, bannerTemplate, previousBannerGuid, openInNewWindow);
		banners.safeLoad(banner, url);

		//        var mainBanner = "banner-" + regionGuid;
		//        var preloadedBanner = "preloadedBanner-" + regionGuid;
		//        $('#' + mainBanner).html($('#' + preloadedBanner).html());

		//        var previousBannerGuid = $('#' + preloadedBanner + '>#preloadedBannerGuid').html();
		//        $('#' + preloadedBanner).load(banners.settings.bannerUrl.replace("{0}", bannerFormat).replace("{1}", previousBannerGuid));

		banners.scheduleBannerRefreshing(regionGuid, bannerFormat, interval);
	}
};

/* =====================================   </Banners>   =============================== */


/* =====================================   <ThreeStateButton>   =============================== */

/**
* @param {(jQuery|null|string)} id
* @param {number=} width
* @param {number=} height
*/
function GetImageUrl(id, width, height) {
	var widthString, heightString;
	if (width != undefined) {
		widthString = "&imgw=" + width;
	} else {
		widthString = "";
	}
	if (height != undefined) {
		heightString = "&imgh=" + height;
	} else {
		heightString = "";
	}
	var imgvw = "";
	if ((width != "") && (height != "")) {
		imgvw = "&imgvw=1";
	}
	return "/showimage.ashx?img=" + id + widthString + heightString + imgvw;
}


jQuery.fn.extend({
	/**
	* @suppress {globalThis}
	*/
	makeCollapsed: function () {
		var collapsed = this.attr(webSettings.attributesNames["threeStateButtonCollapseID"]);
		return this.attr("src", GetImageUrl(collapsed));
	},
	/**
	* @suppress {globalThis}
	*/
	makeExpanded: function () {
		var expanded = this.attr(webSettings.attributesNames["threeStateButtonExpandeID"]);
		return this.attr("src", GetImageUrl(expanded));
	},

	/**
	* @suppress {globalThis}
	*/
	makeUnexpanded: function () {
		var unexpanded = this.attr(webSettings.attributesNames["threeStateButtonUnexpandedID"]);
		return this.attr("src", GetImageUrl(unexpanded));
	}
});
/* =====================================   </ThreeStateButton>   =============================== */


/* =====================================   <Popup>   =============================== */

var popup = {
	handlers: [],
	popupWrapperClass: ".popup-overlay",
	popupContentsClass: ".popup-to-center",
	init: function () {
		//close popup when clicked on close button
		$("[" + Constants.zw_Popup.PopupCloseRegionAttribute + "]").live("click", function () {
			popup.close($(this).closest(popup.popupWrapperClass));
		});
		$("[" + Constants.zw_Popup.PopupCloseRegionAttribute + "*='']").live("click", function () {
			popup.close($(this).closest(popup.popupWrapperClass));
		});

		//close popups on escape
		$(document).keypress(function (e) {
			if (e.keyCode == 27) { //escape
				$(popup.popupWrapperClass).hide();
			}
		});
	},

	show: function (elem) {
		var jElem = $(elem);
		jElem.show();

		var handler = function () { popup.resize(jElem); };
		$(window).bind('resize', handler);
		popup.handlers.push(handler);

		handler();
	},

	resize: function (jElem) {
		jElem.find(popup.popupContentsClass).center();
		/*var content = jElem.find(popup.popupContentsClass).center();
		content.css("position", "absolute");
		content.css("top", (($(window).height() - content.outerHeight()) / 2) + "px");
		content.css("left", (($(window).width() - content.outerWidth()) / 2) + "px");*/
	},

	close: function (jElem) {
		jElem.hide();
		for (var i = 0; i < popup.handlers.length; i++) {
			var handler = popup.handlers[i];
			$(window).unbind('resize', handler);
		}
		popup.handlers = [];
	}
};

/* =====================================   </Popup>   =============================== */



/* =====================================   <Gallery> =============================== */


/* =====================================   <GalleryPopup> =============================== */
/**
* @constructor
* @param {Object} dom
* @param {number} imagesCount
*/
var ZetaGalleryPopup = function (dom, imagesCount) {
	this._dom = dom;
	this._popuptemplate = this._dom.find("." + Constants.zw_ImageGalleryPopup.PopupTemplateClass).html();
	this._popup = this._dom.find("." + Constants.zw_ImageGalleryPopup.PopupRegionClass);
	this._imagesCount = imagesCount;

	this._popupHandlers = [];

	this._currentOriginalWidth = 0;
	this._currentOriginalHeight = 0;
	this._popupWidth = 100;
	this._popupHeight = 100;
	this._currentPopupImage = null;

	this._options = {
	};
};

ZetaGalleryPopup.prototype = {

	popup: function (element) {
		element = $(element);
		var self = this;
		var html = this._popuptemplate;
		var image = element.attr(Constants.zw_ImageGalleryThumbnails.ImageIdAttribute);
		var index = element.attr(Constants.zw_ImageGalleryThumbnails.ImageIndexAttribute);
		this._popupWidth = this._dom.attr(Constants.zw_ImageGalleryThumbnails.PopupWidthAttribute);
		this._popupHeight = this._dom.attr(Constants.zw_ImageGalleryThumbnails.PopupHeightAttribute);
		html = html.replace("%" + Constants.zw_ImageGalleryPreviewBase.ImagesCountPlaceholderAttribute + "%", this._imagesCount)
                   .replace("%" + Constants.zw_ImageGalleryPreviewBase.ImageNumberPlaceholderAttribute + "%", index)
                   .replace("%" + Constants.zw_ImageGalleryPreviewBase.ImagePlaceholderAttribute + "%", image);

		this._popup.html(html);


		var next = element.next("[" + Constants.zw_ImageGalleryThumbnails.ImageIdAttribute + "]");
		var prev = element.prev("[" + Constants.zw_ImageGalleryThumbnails.ImageIdAttribute + "]");

		this._popup.find("[" + Constants.zw_Popup.PopupCloseRegionAttribute + "]").bind("click", function () { self.closePopup(); });

		if (next.length > 0)
			this._popup.find("[" + Constants.zw_ImageGalleryPreviewBase.NextButtonAttribute + "]").bind("click", function () { self.popup(next); });

		if (prev.length > 0)
			this._popup.find("[" + Constants.zw_ImageGalleryPreviewBase.PrevButtonAttribute + "]").bind("click", function () { self.popup(prev); });

		var jImage = this._popup.find("[" + Constants.zw_ImageGalleryPreviewBase.ImagePlaceholderAttribute + "]");

		this._currentPopupImage = jImage;
		var sourceImage = new Image();
		sourceImage.onload = function () {
			self._currentOriginalHeight = this.height;
			self._currentOriginalWidth = this.width;
			self.rescale();
		};
		sourceImage.src = jImage.attr('src');
		var handler = function () { self.rescale(jImage); };
		$(window).bind('resize', handler);
		self._popupHandlers.push(handler);

		this._popup.show();
		popup.show(this._popup.children());
	},

	closePopup: function () {
		this._popup.hide();
		for (var i = 0; i < this._popupHandlers.length; i++) {
			var handler = this._popupHandlers[i];
			$(window).unbind('resize', handler);
		}
		popup.handlers = [];
	},

	rescale: function () {
		var jImage = this._currentPopupImage;
		var realWidth = this._currentOriginalWidth;
		var realHeight = this._currentOriginalHeight;

		var $win = $(window);
		var width = Math.min(($win.width() * this._popupWidth / 100) - 80, realWidth),
        height = Math.min(($win.height() * this._popupHeight / 100) - 80, realHeight),
        ratio = Math.min(width / realWidth, height / realHeight),
        destWidth = Math.round(realWidth * ratio),
        destHeight = Math.round(realHeight * ratio),

        to = {
        	width: destWidth,
        	height: destHeight
        };
		jImage.css(to);
		popup.resize(this._popup);
	}
};

/* =====================================   </GalleryPopup> =============================== */


/* =====================================   <GalleryPreview> =============================== */
/**
* @constructor
*/
var ZetaGalleryPreview = function (dom) {
	this._dom = dom;
	this._spanImageInfo = this._dom.find('[' + Constants.zw_ImageGalleryPreviewBase.ImageInfoPlaceholderAttribute + ']');
	this._spanImageIndex = this._dom.find('[' + Constants.zw_ImageGalleryPreviewBase.ImageNumberPlaceholderAttribute + ']');
	this._spanImagesCount = this._dom.find('[' + Constants.zw_ImageGalleryPreviewBase.ImagesCountPlaceholderAttribute + ']');
	this._image = this._dom.find('[' + Constants.zw_ImageGalleryPreview.PreviewImageAttribute + ']');
	this._images = this._dom.find('[' + Constants.zw_ImageGalleryThumbnails.ImageIdAttribute + ']');
	this._imagesCount = this._images.length;
	this._currentImageIndex = 1;
	this._width = this._dom.attr(Constants.zw_ImageGalleryPreview.PreviewWidthAttribute);
	this._height = this._dom.attr(Constants.zw_ImageGalleryPreview.PreviewHeightAttribute);
	this._groupId = this._dom.attr(Constants.zw_ImageGalleryThumbnails.ImageGroupIdAttribute);
};
ZetaGalleryPreview.prototype = {
	//функция вызывается, когда меняется картинка в ассоциированном GalleryThumbnails
	scrollTo: function (index) {
		this._currentImageIndex = index;
		this.repaint();
	},

	init: function () {
		var self = this;
		var leftArrow = this._dom.find("[" + Constants.zw_ImageGalleryPreviewBase.PrevButtonAttribute + "]");
		var rightArrow = this._dom.find("[" + Constants.zw_ImageGalleryPreviewBase.NextButtonAttribute + "]");
		var popupButton = this._dom.find("[" + Constants.zw_ImageGalleryPreview.PopupButtonAttribute + "]");
		var playButton = this._dom.find("[" + Constants.zw_ImageGalleryPreview.PlayButtonAttribute + "]");
		var fullscreenButton = this._dom.find("[" + Constants.zw_ImageGalleryPreview.FullScreenButtonAttribute + "]");

		leftArrow.bind("click", function () { self.prev(); });
		rightArrow.bind("click", function () { self.next(); });
		popupButton.bind("click", function () { self.popup(); });
		fullscreenButton.bind("click", function () { self.fullscreen(); });
		playButton.bind("click", function () { self.play(); });

		this._image.bind("click", function () { self.popup(); });
	},

	prev: function () {
		this.move(-1);
	},
	next: function () {
		this.move(1);
	},

	move: function (dir) {
		var index = this._currentImageIndex + dir;
		if (index > this._imagesCount)
			index = 1;
		if (index <= 0)
			index = this._imagesCount;

		this.moveTo(index);
	},
	moveTo: function (index) {
		this._currentImageIndex = index;
		var thumbnails = imageGallery.thumbnails[this._groupId];
		if (thumbnails != undefined) {
			jQuery.each(thumbnails, function (thumbnail) {
				thumbnails[thumbnail].scrollTo(index);
			});
		}

		this.repaint();
	},

	repaint: function () {
		var currentImage = this._images[this._currentImageIndex - 1];
		currentImage = $(currentImage);
		this._image.attr("src", GetImageUrl(currentImage.attr(Constants.zw_ImageGalleryThumbnails.ImageIdAttribute), this._width, this._height));
		this._spanImageInfo.html(currentImage.attr(Constants.zw_ImageGalleryThumbnails.ImageInfoAttribute));
		this._spanImageIndex.html(this._currentImageIndex);
	},

	popup: function () {
		var galleryPopup = new ZetaGalleryPopup(this._dom, this._imagesCount);
		galleryPopup.popup(this._images[this._currentImageIndex - 1]);
	},
	fullscreen: function () {
		alert('Fullscreen doesnt work yet');
	},
	play: function () {
		alert('play doesnt work yet');
	}

};
/* =====================================   </GalleryPreview> =============================== */


/* =====================================   <GalleryThumbnails> =============================== */
/**
* @constructor
*/
var ZetaGalleryThumb = function (dom) {
	this._dom = dom;
	this._container = this._dom.find("." + Constants.zw_ImageGalleryThumbnails.ThumbnailsContainerClass);
	this._carousel = (this._dom.attr(Constants.zw_ImageGalleryThumbnails.OneLineAttribute) == "1");
	this._horizontalLine = (this._dom.attr(Constants.zw_ImageGalleryThumbnails.HorizontaLineAttribute) == "1");
	this._groupId = this._dom.attr(Constants.zw_ImageGalleryThumbnails.ImageGroupIdAttribute);
	this._images = this._dom.find("[" + Constants.zw_ImageGalleryThumbnails.ImageIdAttribute + "]");
	this._imagesCount = this._images.length;
	this._currentImageIndex = 1;
};

ZetaGalleryThumb.prototype = {
	//функция вызывается, когда меняется картинка в ассоциированном GalleryPopup
	scrollTo: function (index) {
		this._currentImageIndex = index;
		var image = this._images[index - 1];
		var imagePosition = $(image).position();

		this._container.css("top", -imagePosition.top + "px");
		this._container.css("left", -imagePosition.left + "px");
	},

	init: function () {
		var self = this;
		this._dom.find("[" + Constants.zw_ImageGalleryThumbnails.ImageIdAttribute + "]").bind("click", function () { self.popup($(this)); });

		if (!this._carousel)
			return;

		var leftArrow = this._dom.find("[" + Constants.zw_ImageGalleryPreviewBase.PrevButtonAttribute + "]");
		var rightArrow = this._dom.find("[" + Constants.zw_ImageGalleryPreviewBase.NextButtonAttribute + "]");
		leftArrow.bind("click", function () { self.moveLeft(); });
		rightArrow.bind("click", function () { self.moveRight(); });

	},

	moveLeft: function () {
		this.move(-1);
	},

	moveRight: function () {
		this.move(+1);
	},

	move: function (dir) {
		var index = this._currentImageIndex + dir;
		if (index > this._imagesCount)
			index = this._imagesCount;
		if (index <= 0)
			index = 1;


		this.scrollTo(index);
		//this.raiseScroll(index);
	},

	popup: function (element) {
		var index = parseInt(element.attr(Constants.zw_ImageGalleryThumbnails.ImageIndexAttribute), 10);
		if (this.raiseScroll(index))
		//если сработал скролл - попап не показываем
			return;

		var galleryPopup = new ZetaGalleryPopup(this._dom, this._imagesCount);
		galleryPopup.popup(element);
	},

	raiseScroll: function (index) {
		var previews = imageGallery.previews[this._groupId];
		if (previews != undefined) {
			jQuery.each(previews, function (preview) { previews[preview].scrollTo(index); });
			return true;
		}
		return false;
	}

};
/* =====================================   </GalleryThumbnails> =============================== */

var imageGallery = {

	previews: [],
	thumbnails: [],

	init: function () {
		$('[id="zw_imagegallerythumbnails"]').each(function () {
			imageGallery.initializeThumbnailsElement(this);
		});
		$('[id="zw_imagegallerypreview"]').each(function () {
			imageGallery.initializePreviewElement(this);
		});

	},

	initializeThumbnailsElement: function (element) {
		element = $(element);
		var gallery = new ZetaGalleryThumb(element);
		gallery.init();

		this.addElement(this.thumbnails, gallery);

	},

	initializePreviewElement: function (element) {
		element = $(element);
		var gallery = new ZetaGalleryPreview(element);
		gallery.init();

		imageGallery.addElement(imageGallery.previews, gallery);
	},

	addElement: function (array, element) {
		var group = element._groupId;
		var list = array[group];
		if (list == undefined) {
			list = [];
			array[group] = list;
		}
		list.push(element);
	}

};



/* =====================================   </Gallery> =============================== */

/* =====================================   <Rating>   =============================== */

var rating =
{
	url: { copyUrl: "/mvcget/Rating/AjaxRating?r_templateid=(0)&r_objectid=(1)&r_emptystartemplate=(2)&r_filledstartemplate=(3)&r_emptymystartemplate=(4)&r_filledmystartemplate=(5)&r_hoverstartemplate=(6)&ratingvalue=(7)" },

	controlsIDs: { productRating: "#zw_productRating" },

	attributesNames: {
		templateid: "r_templateid",
		objectid: "r_objectid",
		r_star: "r_star",
		r_state: "r_state",
		r_emptystartemplate: "r_emptystartemplate",
		r_filledstartemplate: "r_filledstartemplate",
		r_emptymystartemplate: "r_emptymystartemplate",
		r_filledmystartemplate: "r_filledmystartemplate",
		r_hoverstartemplate: "r_hoverstartemplate"
	},

	starHover: function (element) {
		element = $(element);

		var container = rating.get_container(element);

		$('img[' + rating.attributesNames.r_star + ']').each(function () {
			var image = $("#" + this.id);

			if (image.attr(rating.attributesNames.r_star) <= element.attr(rating.attributesNames.r_star)) {
				var newid = rating.get_idByState(container, "hover");
				var src = image.attr("src");
				var oldid = src.split("?").pop().split("&").shift().split("=").pop();
				image.attr("src", src.replace(oldid, newid));
			}
		});
	},

	starMouseOut: function (element) {
		element = $(element);

		var container = rating.get_container(element);

		$('img[' + rating.attributesNames.r_star + ']').each(function () {
			var image = $("#" + this.id);

			var newid = rating.get_idByState(container, image.attr(rating.attributesNames.r_state));
			var src = image.attr("src");
			var oldid = src.split("?").pop().split("&").shift().split("=").pop();
			image.attr("src", src.replace(oldid, newid));
		});
	},

	set_rating: function (element) {
		element = $(element);

		var container = rating.get_container(element);
		var objectID = container.attr(rating.attributesNames.objectid);
		var templateID = container.attr(rating.attributesNames.templateid);
		var emptystartemplate = container.attr(rating.attributesNames.r_emptystartemplate);
		var filledstartemplate = container.attr(rating.attributesNames.r_filledstartemplate);
		var emptymystartemplate = container.attr(rating.attributesNames.r_emptymystartemplate);
		var filledmystartemplate = container.attr(rating.attributesNames.r_filledmystartemplate);
		var hoverstartemplate = container.attr(rating.attributesNames.r_hoverstartemplate);
		var ratingValue = element.attr(rating.attributesNames.r_star);

		var url = rating.url.copyUrl.replace("(0)", templateID).replace("(1)", objectID).replace("(2)", emptystartemplate).replace("(3)", filledstartemplate).replace("(4)", emptymystartemplate).replace("(5)", filledmystartemplate).replace("(6)", hoverstartemplate).replace("(7)", ratingValue);
		container.load(url);
	},

	get_idByState: function (container, state) {
		container = $(container);

		switch (state) {
			case "empty":
				return container.attr(rating.attributesNames.r_emptystartemplate);
			case "filled":
				return container.attr(rating.attributesNames.r_filledstartemplate);
			case "emptymy":
				return container.attr(rating.attributesNames.r_emptymystartemplate);
			case "filledmy":
				return container.attr(rating.attributesNames.r_filledmystartemplate);
			case "hover":
				return container.attr(rating.attributesNames.r_hoverstartemplate);
		}
		return null;
	},

	get_container: function (element) {
		var control = element.parents(rating.controlsIDs.productRating);
		return control;
	}

};

/* =====================================   </Rating>  =============================== */
$.coorX = 0;

$.coorY = 0;

(function ($) {
	$.fn.goTo = function () {
		$('html, body').animate({
			scrollTop: $(this).offset().top + 'px'
		}, 'fast');
		return this;
	}
})(jQuery); 

