﻿/* AJAX helper utilities */

//	jQuery AJAX error handler
function onAjaxError(XMLHttpRequest, textStatus, errorThrown) {
	if (XMLHttpRequest != undefined) {
		var errorMessage;
		if (XMLHttpRequest.responseText.indexOf("<html>") != -1) {
			//	responseText is html
			var posStart = XMLHttpRequest.responseText.indexOf("<title>");
			var posEnd = XMLHttpRequest.responseText.indexOf("</title>");
			if (posStart != -1 && posEnd != -1)
				errorMessage = XMLHttpRequest.responseText.slice(posStart + 7, posEnd - 1);
			else
				errorMessage = "Unknown AJAX error";
		}
		else {
			//	responseText is JSON object
			var error = eval("(" + XMLHttpRequest.responseText + ")");
			errorMessage = error.Message;
		}
		alert(errorMessage);
	}
}

//	Sync call web service with jQuery library
function CallWebService(serviceUrl, serviceData, successMethod, isAsync, completeMethod) {
	$.ajax({
		type: "POST",
		url: serviceUrl,
		contentType: "application/json; charset=utf-8",
		data: (serviceData),
		dataType: "json",
		success: successMethod,
		error: onAjaxError,
		async: isAsync,
		complete: completeMethod
	});
}

function ExecAction(o, mess) {
    sendAjaxPost(o.getAttribute("action"), null, function(ok) { if (ok) { alert(mess) } });
}

function sendAjaxPost(_url, _data, _exec, _err) {
    $.ajax({
        url: _url,
        type: 'post',
        dataType: 'json',
        data: (_data),
        success: _exec,
        /*        complete: pleaseWait.Hide,
        beforeSend: pleaseWait.Show,*/
        error: (_err ? _err : function(XMLHttpRequest, textStatus, errorThrown) {
            alert(textStatus);
        })
    });
}

function insertSource(urlForHtml, insertHolderTagId) {
	$.ajax({
		type: 'GET',
		url: urlForHtml,
		//data: { 'listingId': listingId },
		dataType: 'html',
		success: function(data, textStatus) {
			$('#' + insertHolderTagId).html(data);
		}
	});
}

if(jQuery.validator){
    jQuery.validator.addMethod("notequaltoproperty", function(value, element, params) {
	    if (this.optional(element)) {
		    return true;
	    }

	    var otherPropertyControl = $("#" + params.otherProperty);
	    if (otherPropertyControl == null) {
		    return false;
	    }

	    var otherPropertyValue = otherPropertyControl[0].value;
	    return otherPropertyValue != value;
    });
}


function SetFilterType(hiddenId, value, isExtender) {

	$.cookie(value, isExtender, { expires: 365 });
	DefineCookie();
	SubmitForm(document.getElementById(hiddenId).form);
}

function DefineCookie() {
	$.cookie("defcook", 1);
	if ($.cookie("defcook") == null) {
		alert("Для корректной работы расширенного поиска, включите, пожалуйста, поддержку cookies в браузере");
		return false;
	}
	$.cookie("defcook",null );
	return true;
		
}
function SubmitForm(form) {
	form.submit();
}

function GetQueryParam(key, url) 
{
	if (!url)
		url = window.location.search;
	var re = new RegExp("[?|&]" + key + "=(.*?)&","i");
	var matches = re.exec(url + "&");
	if (!matches || matches.length < 2)
		return "";
	return decodeURIComponent(matches[1].replace("+", " "));
}

function SetQueryParam(key, value, url, def) 
{
    url = url == null ? window.location.search : url;
    var ind = url.indexOf("?");
    var q="";
    if (ind > -1) {
        q = "&" + url.substr(ind + 1) + "&";
        url = url.substr(0, ind);
    }
    var isSet = typeof (value) != "undefined" && value != null && value != def;
    var re = new RegExp("&" + key + "=.*?&","i");
	if (re.test(q))
	    q = q.replace(re, isSet ? ("&" + key + "=" + encodeURIComponent(value) + "&") : "&");
	else
	    if (isSet)
	        q += key + "=" + encodeURI(value);
	q = q.replace(/&*$/, "").replace(/^&*/, "");
	return q.length > 0 ? (url + "?" + q) : url;
}

String.prototype.trimEnd = function(c) {
	if (c)
		return this.replace(new RegExp(c.escapeRegExp() + "*$"), '');
	return this.replace(/\s+$/, '');
}
String.prototype.trimStart = function(c) {
	if (c)
		return this.replace(new RegExp("^" + c.escapeRegExp() + "*"), '');
	return this.replace(/^\s+/, '');
}
String.prototype.escapeRegExp = function() {
	return this.replace(/[.*+?^${}()|[\]\/\\]/g, "\\$0");
};

String.prototype.trim = function() {
return this.replace(/(^\s+)|(\s+$)/g, "");
};


String.prototype.startsWith = function(str) {
    if (str == '+')
        return false;
    return (this.match("^" + str) == str)
};

String.prototype.toInt = function() {
    return parseInt(this, 10);
};

String.prototype.toDecimal = function() {
    return parseFloat(this.replace(",","."));
};

String.prototype.endsWith = function(str)
{ return (this.match(str + "$") == str) }

function parseBool(value) {
    if (typeof value == "boolean") {
        return value;
    }
    if (typeof value === "string") {
        value = value.replace(/^\s+|\s+$/g, "").toLowerCase();
        if (value === "true" || value === "false")
            return value === "true";
    }
}


function ShowToolTipForImage(control, image, text) {
	var obj = "<img src='"+ image + "' />" + text;
	ShowToolTip(control, obj, 'tooltip');
}

function ShowToolTipForList(control, text) 
{
	$(control).simpletip
	$(control).simpletip({
		content: text,
		baseClass: 'addressTooltipForList'
	}).show();
	
}

function ShowToolTip(control, text, cssName) {
	ShowToolTip(control, text, cssName, 'right');
}

function ShowToolTip(control, text, cssName, positionVal) {
	$(control).simpletip({
		position: positionVal,
		content: text,
		baseClass: cssName
	}).show();
}



function PreloadImage(control,id, url) {
	var i = new Image();
	i.src = url;
	i.id = id;
	i.style.display = "none";
	control.appendChild(i);
}
function Redirect(url, event) {

    event = event || window.event
    if (!event)
        window.location.href = url;
    var button;
    if (event.which == null)
        button = (event.button < 2) ? 1 : ((event.button == 4) ? 2 : 3);
    else
        button = (event.which < 2) ? 1 : ((event.which == 2) ? 2 : 3);

    if (button == 2)
        window.open(url, 'name');
    else if (button == 1)
        window.location.href = url;
}

function RedirectGeki(url, control) {
	if (control.value != "")
		url = url + "/" + control.value;
	window.location.href = url;
}

//(следущая функция не работает без query-параметра Id в url)
function RedirectWithParamReplacement(old, val, def) {
    var url = window.location.href; //копирует ли содержимое - или тупо берет ссылку?
    if (def && def == val)
        val = "";
	if (url.indexOf('#') > -1)	//чистим якоря
		url = url.substring(0, url.indexOf('#'));
	if (url.indexOf(old) > -1)
		val = url.replace(old, val)
	else
	    val = url + (window.location.href.search(/\/$/) > -1 ? '' : '/') + val;
	window.location.href = val.replace(/\/\/$/, '/');
}


/*FROM ADDRES.COM.UA*/
function setNotPressedSrc(img) {
	img.src = img.src.replace("Pressed.gif", ".gif").replace("Pressed.png", ".png");
	if (img.oSrc) {
		img.oSrc.src = img.oSrc.replace("Over.gif", "Pressed.gif").replace("Over.png", "Pressed.png");
	}
}
function setPressedSrc(img) {
	img.src = img.src.replace(".gif", "Pressed.gif").replace(".png", "Pressed.png");
	if (img.oSrc) {
		img.oSrc = img.oSrc.replace(".gif", "Pressed.gif").replace(".png", "Pressed.png");
	}
}

/* Realty filter */
function getFilterPriceHint(realtyType, transaction) {
    result = "Цена за день или месяц";
	if (transaction == "prodajut" || transaction == "pokupajut") {
		if (realtyType == "zemla")
			result = "Цена за сотку";
		else if (realtyType == "ofis")
			result = "Цена за м<sup>2</sup>";
		else
			result = "Цена";
	}
	return result;
}

//_______________________________________[Hide on DDL changed]________________________________________

//Функции для прятанья элементов в зависимости от значений
//tooggles - элементы скрываются для указанных значений (и наоборот отображаются, если visible=true), А для других значений - скрываются (и наоборот отображаются, если установлено visible=true)
function HandleDdlSelIndxChanged(ddl, toggles,callback,callback_args) {
	Hide(ddl.val(), toggles);  //first time to check (maby QeruyParams have LocationTypeId parameter)
	if (typeof(callback)!="undefined")
		callback(callback_args);
	ddl.bind('change', { tags: toggles, object: ddl }, function(e) {
		Hide(e.data.object.val(), e.data.tags);
		if (typeof (callback)!="undefined")
			callback(callback_args);
	});
}
function Hide(currVal, toggles) {
	var i = 0;
	//востанавливаем изначальное отображение (попрячем все, что не должно высовываться)
	for (; i < toggles.length; i++) {
		if (currVal != toggles[i].val) {
			if (toggles[i].visible == true)
				$('#' + toggles[i].tagId).hide();
			else $('#' + toggles[i].tagId).show();
		}
	}

	//последнее слово за совпавшими
	for (i = 0; i < toggles.length; i++) {
		if (currVal == toggles[i].val) {
			if (toggles[i].visible == true)
				$('#' + toggles[i].tagId).show();
			else $('#' + toggles[i].tagId).hide();
		}
	}
}

/*  Hidding element on select index chenged for DropDownList   */
function Toggle(val, tagId, visible) {
	this.val = val;
	this.tagId = tagId;
	this.visible = visible;
}

function SetNewBuilding(o) {
    var elm = $("#IsNewBuilding");
    if (o.checked) {
        var what = o.id == "newBuilding";
        $(what ? "#nNewBuilding" : "#newBuilding")[0].checked = false; ;
        elm.val(what?"true":"false");
    }else
        elm.val("");
}
//_______________________________________[Hide on DDL changed](END)________________________________________

function fancybox(galleryAnchorsSelector) {
	$(galleryAnchorsSelector).fancybox({
		'callbackOnStart': function() {
			//корректируем перекрытия z-index
		var startZIndex = 6010; //привышает наибольший z-index на сайте
			//DIV#fancy_overlay содержит z-index=5000
			var fancyElementsToModify = [
					'div#fancy_content',
					'div#fancy_loading_overlay', 'div#fancy_loading_icon',
					'div#fancy_bg', 'div.fancy_bg',
					'div#fancy_outer',
					'div#fancy_loadingdiv#fancy_div',
					'img#fancy_img', 'div#fancy_title',
					'a#fancy_left', 'a#fancy_right',
					'span.fancy_ico', 'div#fancy_close'
				];
			var i;
			for (i = 0; i < fancyElementsToModify.length; i++)
				$(fancyElementsToModify[i]).css('z-index', startZIndex++);
		}
	});
}
// ===================================================[ Listing Common ]===================================================

function SubmitForm()
{
    $("input[type='submit']").click();
}

function SetRStateAndSubmit(state)
{
    $("#PublicateState").val(state);
    SubmitForm();
}

function ChangeHomeInputType(spnListId, spnFieldId, IsHomeNum, hiddenId) {

	// true -- показать список
	if (!IsHomeNum) {
		$("#" + spnListId).show();
		$("#" + spnFieldId).hide();
		var input = $("#" + spnFieldId + "> input");
		input[0].value = "";
		
	}
	else {
		$("#" + spnListId).hide();
		$("#" + spnFieldId).show();
		var list = $("#" + spnListId + "> select");
		list[0].selectedIndex = 0;
	}
	$("#" + hiddenId).attr("value", IsHomeNum);
}

function chk_u_bkl(requestUrl, state)
{
    var requestStr = requestUrl + '?email=' + $("#Listing_Email").val() + '&phone=' + $("#Listing_Phone").val();

    $.getJSON(requestStr,
                                    function(result)
                                    {
                                        if (result.IsInBlackList)
                                        {
                                            $('#error_messages').html('<h3>За нарушение условий пользования сайтом ваши данные были помещены в черный список. Для выяснения обстоятельств, свяжитесь с администрацией сайта.</h3>')
                                        }
                                        else
                                        {
                                            SetRStateAndSubmit(state);
                                        }
                                    }
                                )

}

function setSrc(img,imgSource) {
	$(img).attr('src', imgSource);
}

// ===================================================[ Listing Common ](END)===================================================

//=========================тест ввода=========================
protCheckKeys = function(Enter) {
    this.isShift = false;
    this.isNumeric = function(e, myfield, isDecimal, maxsize, nextfield, dec) {
        var key;
        var keychar;
        var ret = false;
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;

        if (key) {
            keychar = String.fromCharCode(key);
            // control keys
            if ((key == null) || (key == 0) || (key == 8) || (key == 9) || (key == 13) || (key == 27)) {
                if ((key == 13) && nextfield && maxsize && myfield.value.length == maxsize)
                    myfield.form.elements[nextfield].focus();
                else
                    ret = true;
            }
            // numbers
            else if ((("0123456789").indexOf(keychar) > -1)) {
                if (nextfield && maxsize && myfield.value.length == maxsize)
                    myfield.form.elements[nextfield].focus();
                else
                    ret = !maxsize || myfield.value.length < maxsize;
            }
            // decimal point / jump
            else if (keychar == ",")
                if (dec)
                    myfield.form.elements[dec].focus();
                else
                    ret = isDecimal && myfield.value.indexOf(keychar) < 0;
        }
        else
            ret = true;

        if (window.event)
            window.event.returnValue = ret;
        return ret;
    };
    this.isAlpha = function(e) {
        var key;
        var ret = false;
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;

        ret = key && ((key >= 35 && key <= 46) || ((key >= 65 && key <= 90) || key == 8 || key == 9));

        if (window.event)
            window.event.returnValue = ret;
        return ret;
    };
    this.isAlphaNumeric = function(e) {
        var key;
        var ret = false;
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;

        ret = key && ((key >= 35 && key <= 46) || (((key >= 48 && key <= 57) && isShift == false) ||
               (key >= 65 && key <= 90) || key == 8 || key == 9 ||
               (key >= 96 && key <= 105)))
        if (window.event)
            window.event.returnValue = ret;
        return ret;
    };
    this.keyUP = function(e) {
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;
        if (key && key == 16)
            isShift = false;
    };
    this.onEnterClickElm = function(e, elm) {
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;
        if (key && key == 13)
            $(elm).click();
    };
    this.onEnterFn = function(e, fn,elm) {
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;
        if (key && key == 13)
            fn(elm);
    };
    this.keyDOWN = function(e) {
        if (window.event)
            key = window.event.keyCode;
        else if (e)
            key = e.which;
        if (key && key == 16)
            isShift = true;
    };
    this.IsNumericT = function(sText) {
        var ValidChars = "0123456789.";
        var IsNumber = true;
        var Char;
        for (i = 0; i < sText.length && IsNumber == true; i++) {
            Char = sText.charAt(i);
            if (ValidChars.indexOf(Char) == -1) {
                IsNumber = false;
                break;
            }
        }
        return IsNumber;
    }
    this.IsIntT = function(sText) {
        var ValidChars = "0123456789";
        var IsNumber = true;
        var Char;
        for (i = 0; i < sText.length && IsNumber == true; i++) {
            Char = sText.charAt(i);
            if (ValidChars.indexOf(Char) == -1) {
                IsNumber = false;
                break;
            }
        }
        return IsNumber;
    }
}
var keyCheck = new protCheckKeys(); 
//=========================End тест ввода=========================

//=========================Begin validator текста=========================
var validationRules = new (function() {
    var strRegMail = "^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"/*'<%= Address.Common.RegExps.Mail.Replace("\\","\\\\")%>'*/;
    var strRegUrl = "^((http\\:\\/\\/)?[a-zA-Z0-9_\\-]+(?:\\.[a-zA-Z0-9_\\-]+)*\\.[a-zA-Z]{2,4}(?:\\/[a-zA-Z0-9_]+)*(?:\\/[a-zA-Z0-9_]+\\.[a-zA-Z]{2,4}(?:\\?[a-zA-Z0-9_]+\\=[a-zA-Z0-9_]+)?)?(?:\\&[a-zA-Z0-9_]+\\=[a-zA-Z0-9_]+)*)/?$" /*'<%= Address.Common.RegExps.Mail.Replace("\\","\\\\")%>'*/;
    var Err = false;
    var IsGroup = false;
    this.beginErrGroup = function() { IsGroup = true; Err = false; };
    this.endErrGroup = function() { IsGroup = false; return Err; };
    this.OnChangeNotEmpty = function() {
        if (IsGroup && Err)
            return false;
        else
            Err = false;
        var o = $(this);
        fieldname = o.attr("fieldname");
        var v = o.val().trim();
        if (!(v && v > '')) {
            alert("Поле " + (fieldname ? fieldname : "") + " не должно быть пустым!");
            if (this.old) this.value = this.old;
            setTimeout(function() { o.focus(); }, 1);
            Err = true;
        }
        return !Err;
    };

    this.OnChangeExpr = function() {
        if (IsGroup && Err)
            return false;
        else
            Err = false;
        var o = $(this);
        fieldname = o.attr("fieldname");
        var v = o.val();
        var reg = new RegExp(o.attr("expr"), "ig");
        if (v.search(reg) == -1) {
            alert("Некорректно введено значение поля " + (fieldname ? fieldname : "") + " !");
            if (this.last || this.old)
                this.value = this.last ? this.last : this.old;
            setTimeout(function() { o.focus(); }, 1);
            Err = true;
        } else this.last = this.value;
        return !Err;
    };

    this.OnChangeEmail = function() {
        if (IsGroup && Err)
            return false;
        else
            Err = false;
        var o = $(this);
        fieldname = o.attr("fieldname");
        var v = o.val();
        if (v > " ") {
            var reg = new RegExp(strRegMail, "ig");
            if (v.search(reg) == -1) {
                alert("Некорректно введено значение поля " + (fieldname ? fieldname : "") + " !");
                if (this.last || this.old)
                    this.value = this.last ? this.last : this.old;
                setTimeout(function() { o.focus(); }, 1);
                Err = true;
            } else this.last = this.value;
        }
        return !Err;
    };

    this.OnChangeUrl = function() {
        if (IsGroup && Err)
            return false;
        else
            Err = false;
        var o = $(this);
        fieldname = o.attr("fieldname");
        var v = o.val();
        if (v && v > "") {
            var reg = new RegExp(strRegUrl, "ig");
            if (v.search(reg) == -1) {
                alert("Некорректно введено значение поля " + (fieldname ? fieldname : "") + " !");
                if (this.last || this.old)
                    this.value = this.last ? this.last : this.old;
                setTimeout(function() { o.focus(); }, 1);
                Err = true;
            } else this.last = this.value;
        }
        return !Err;
    };

    this.OnChangeLength = function() {
        if (IsGroup && Err)
            return false;
        else
            Err = false;
        var o = $(this);
        fieldname = o.attr("fieldname");
        var v = o.val().trim();
        var len = parseInt(o.attr("length"));
        if (len && len > 0 && v.length > len) {
            alert("Значение поля " + (fieldname ? fieldname : "") + " не должно быть больше " + len + " символов !");
            if (this.last || this.old)
                this.value = this.last ? this.last : this.old;
            setTimeout(function() { o.focus(); }, 1);
            Err = true;
        } else this.last = this.value;
        return !Err;
    };

    this.Prepare = function() {
        $("[validation=regexp]").bind("change", validationRules.OnChangeExpr);
        $("[validation=email]").bind("change", validationRules.OnChangeEmail);
        $("[validation=url]").bind("change", validationRules.OnChangeUrl);
        $("[validation=notempty]").bind("change", validationRules.OnChangeNotEmpty);
        $("[validation1=notempty]").bind("change", validationRules.OnChangeNotEmpty);
        $("[validation=Length]").bind("change", validationRules.OnChangeLength);
        $("[validation=onlynumeric]").keypress(function(event) { return keyCheck.isNumeric(event, this); });
        $("[validation=onlydecimal]").keypress(function(event) { return keyCheck.isNumeric(event, this, true); });
    };

    $(document).ready(this.Prepare);
})
//=========================End validator текста=========================

//=========================наследование=========================
function extend(Child, Parent) {
    var F = function() { };
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.superclass = Parent.prototype;
}
//=========================End наследования=========================

/*function SetParentHeightAfterLoad(elem2FixSelector) {
	$(elem2FixSelector).ready(function() {
		var elem2Fix = $(elem2FixSelector);
		var parent = elem2Fix.parent();
		$(parent).ready(function() {
			elem2Fix.css("height", $(parent).css("height"));
		});
	});
}*/

/*
	добавляет в урл параметр
*/
function doPost(pressedElem, getExtened, isExtParamName) {
	//do submit with parameter
	var theForm = $(pressedElem).closest('form');
	var url = $(theForm).attr('action');
	url = SetQueryParam(isExtParamName, getExtened.toString(), url);
	$(theForm).attr('action', url);
	theForm.submit();
}

/* удаляет все "IsEclusive=true" в url-ах, checkbox как параметр ~ onclick = "removeExclusive(this);" */
function removeExclusive(o) {
    if (!o.checked) {
        $("a[href$='?IsExclusive=true']").each(
            function(i, e) {
                e.href = e.href.replace('?IsExclusive=true', '');
            })
        $("a[href*='IsExclusive=true']").each(
            function(i, e) {
                e.href = e.href.replace('&IsExclusive=true', '').replace('IsExclusive=true', '');
            })
        }
       }

 /*открывает новое окно, помещает его посредине экрана, делает его активным
	width и height задано в пикселях (типа int)*/
  function openModalWindow(url, windowId, width, height) {
 	var windowFeatures = "location=0,toolbar=0,scrollbars=0,status=0,resizable=0";
	//габариты и позиция
	windowFeatures+=",width="+width+",height=" + height;
	var left = (screen.width - width) / 2;
	var top = (screen.height - height) / 2;
	windowFeatures += ', top=' + top + ', left=' + left;

	window.open(url, windowId, windowFeatures).focus();
}


function PremiumPopupOver(control) {
	/*$(control).removeAttr("style");
	$(control).addClass("premiumPopup");
	control.style.overflow = "visible";
	control.style.heigth = "300";*/
}

function PremiumPopupOut(control) {
	/*//$(control).removeAttr("style");
	//$(control).removeClass("premiumPopup");
	//control.style.overflow = control.style.position = "";*/
	 
}

function AddMapiaCount(mapiaCountUrl) {
    $.ajax({
        type: "post",
        url: mapiaCountUrl,
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    })
}

function clearValues(Ids){
	for(var i=0;i<Ids.length;i++)
		$('#'+Ids[i]).val('');
}

function SetValueToQueryAndRedirect(textFieldId,defaultText,queryParamName) {
	var ctrl = $('#' + textFieldId)[0];
	if (ctrl.value == defaultText)
		ctrl.value = '';
	SetParamsAndRedirect(ctrl, queryParamName);
}

function SetPremiumToolTip(img,o)  {
    $("#divToolTip").remove();
    var pos = $(img).offset();
    var str = "<div id='divToolTip' class='mainMenuOtherDrop tooltip' style='width:150px;display:none;left:" + (pos.left - 12) + "px; top:" + (pos.top - 8) + "px; width:174' >" +
    "<center>" + o.tooltipDiv +
    "<a href=\"" + o.url + "\" ><img width=\"150\" style=\"border:none;\" src=\"" + img.src + "\" /></a></center><a href=\"" + o.url + "\" >";
    str += o.Address + "</a><br />" + (o.RoomCount == "" ? "" : ("<span>Количество комнат:  " + o.RoomCount + "</span><br />")) + (o.AreaGeneral == "" ? "" : ("<span>Площадь: " + o.AreaGeneral + " кв.м.</span><br />")) + 
    "<strong>" + o.Price_ + " $</strong><div class=\"tooltip_additional\"><span>Обновлено: " + o.Date + "</span><div><a href=\"" + o.UserUrl + "\" >";
    str += o.UserName + "</a></div><small>Просм.: " + o.ViewCount + " коммент.: " + o.CommentQty + "</small></div>" + "</div>";
    $("body").append(str);
    $("#divToolTip").show().mouseleave(function() { $("#divToolTip").remove(); });
}


// BEGIN class to be used on Sorting
// list of desc fields, default sort field,
oSorting = function(arrayDesc, defField, mark, sortField, directionField, data, updateUrl, controlId) {
    if (arrayDesc)
        this.ArrayDesc = arrayDesc;
    this.Mark = mark;
    this.Data = data;
    this.UpdateUrl = updateUrl;
    this.ControlId = controlId;
    this.SortField = sortField ? sortField : "sortfield";
    this.DefField = defField;
    this.DirectionField = directionField ? directionField : "sortdirection"; // like stattics/constants
    var locDirs = { asc: "asc", desc: "desc" };
    var rege = new RegExp("#(.)*?$");
    var locSetSorting = function(field, direction) {
        var currDirection = GetQueryParam(this.DirectionField, null);
        var currSortField = GetQueryParam(this.SortField, null);
        if (currSortField == "" && this.DefField)
            currSortField = this.DefField;
        var defDirection = locDirs.asc;
        if (this.ArrayDesc)
            $(this.ArrayDesc).each(function(i, e) { if (e == currSortField) defDirection = locDirs.desc; return defDirection == locDirs.asc; });

        if (currDirection == "" && defDirection)
            currDirection = defDirection;

        if (field == currSortField)
            if (direction)
            currDirection = direction;
        else
            currDirection = currDirection == locDirs.desc ? locDirs.asc : locDirs.desc;
        else
            currDirection = defDirection;

        var url = SetQueryParam(this.SortField, field, null, this.DefField);
        url = SetQueryParam(this.DirectionField, currDirection, url, defDirection);
        url = SetQueryParam("pg", null, url);
        url = url.replace(rege, "");
        if (this.Mark)
            url = url + "#" + this.Mark;
        location.href = window.location.pathname + url;
    };
    this.SetSorting = locSetSorting;

    this.ShowPage = function(pg) {
        if (GetQueryParam("pg", null) == "") {
            var id = this.ControlId;
            var obj = this.ListObj;
            this.Data.Pg = pg;
            $.ajax({
                type: 'POST',
                url: this.UpdateUrl,
                data: this.Data,
                dataType: 'html',
                success: function(data) {
                    $("#" + id).html(data);
                }
            });
            return false;
        }
        return true;
    }
}
// END class to be used ion Sorting

//function fireEvent(ctrlId, eventName) {
//	//For firing the click event.  
//	if (document.createEventObject) {
//		// dispatch for IE  
//		var evt = document.createEventObject();
//		return $('#' + ctrlId)[0].fireEvent('on' + eventName, evt);
//	}
//	else {
//		// dispatch for firefox + others  
//		var evt = document.createEvent("HTMLEvents");
//		evt.initEvent(eventName, true, true); // event type,bubbling,cancelable
//		return !$('#' + ctrlId)[0].dispatchEvent(evt);
//	}
//}

function CleanValues(ctrlIds) {
	for(var i=0;i<ctrlIds.length;i++)
		$('#'+ctrlIds[i]).val('');
}

//использовать в onclick-событии
var stopBubbling = function(e) {
    // stop bubbling (disable <TR> onclick)
    if (!e) var e = window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
};

function CancelBubble(elem) {
    $(elem.parentNode).click(stopBubbling);
}
function CancelBubbles(elems) {
    elems.click(stopBubbling).bind('mousedown', stopBubbling); ;
}
$(document).ready(function() {
    CancelBubbles($(".stopBubling"));
})

//для контакной информации
function ListingAddContacts(id,url) {
    $.ajax({
        type: 'GET',
        url: url,
        dataType: 'html',
        success: function(data, textStatus) {
            $('#idContactsPopUp').remove();
            $("body").append(data);
        }
    });
}

function PaymentRedirect() {
    var url = SetQueryParam("ishist", $("#isHist")[0].checked?'1':'', document.location.href, '');
    url = SetQueryParam("isactive", $("#isActive").val(), url, '');
    url = SetQueryParam("searchsrting", $("#SearchSrting").val(), url, '');
    document.location.href = url;
}

function SindicationRedirect() {
    var lId = isNaN($("#ListingId").val()) ? "" : $("#ListingId").val();
    var url = SetQueryParam("ishist", $("#isHist")[0].checked ? '1' : '', document.location.href, '');
    url = SetQueryParam("listingid", lId, url, '');
    if (!$("#isHist")[0].checked) {
        url = SetQueryParam("listingstate", "", url, '');
    }
    document.location.href = url;
}


function hideInterval(elm, t) {
    if (typeof (elm) == 'string')
        elm = $("#" + elm)[0];
    if (!t)
        t = 100;
    clearHideInterval(elm);
    elm.hideId = setTimeout(function() { $("#" + elm.id).hide(); }, t)
}
function clearHideInterval(elm) {
    if (typeof (elm) == 'string')
        elm = $("#" + elm)[0];
    if (elm.hideId)
        clearTimeout(elm.hideId)
}

var otherMenuTimer;
function ShowOtherMenu(id) {
    $("#" + id).show();
}

function LoadOtherMenu(menuId, itemsId) {
    $(document).ready(function() {
        $('#' + itemsId).hover(
        function() { if (otherMenuTimer != null) { clearTimeout(otherMenuTimer); } },
        function() { $('#' + itemsId).hide(); });
        $('#' + menuId).hover(
                        function() { if (otherMenuTimer != null) { clearTimeout(otherMenuTimer); } },
                        function() { otherMenuTimer = setTimeout(function() { $("#" + itemsId).hide(); }, 1000); });
    });
}

// only for ConstructionComplex - now not only
function triger(e, id) {
    var t = e.innerHTML;
    var elm = $("#" + id);
    if (t.indexOf("+") > -1) {
        e.innerHTML = t.replace("+", "-");
        $(e.parentNode).addClass("CollapsiblePanelOpen");
        $(e.parentNode).removeClass("CollapsiblePanelClosed");
        elm.animate({ height: elm.children().height() + "px" }, "slow")
    } else {
        e.innerHTML = t.replace("-", "+");
        $(e.parentNode).addClass("CollapsiblePanelClosed");
        $(e.parentNode).removeClass("CollapsiblePanelOpen");
        elm.animate({ height: "0px" }, "slow")
    }
}

// set press to be sent
function SetPressTobeSent(url, pressId, urlUpdate) {
    sendAjaxPost(url, { id: pressId }, 
        function(data) {
            if (data)
                insertSource(urlUpdate, "PressTable" + pressId);
            alert("Пресс-релиз " + (data ? "поставлен в очередь на рассылку" : "не может быть разослан") + " !");
        });
}

// test a press sent spam
function TestPressSend(url, pressId, urlUpdate) {
    sendAjaxPost(url, { id: pressId },
        function(data) {
        if (data)
            insertSource(urlUpdate, "PressTable" + pressId);
        alert("Тестовая рассылка пресс-релиза " + (data ? "выполнена" : "не выполнена - произошел сбой") + " !");
});
}
var intervalText= new Object();
function SetTextToControl(id, text) {
    intervalText[id] = setInterval(
        function() {
            if ($("#" + id).length > 0) {
                clearInterval(intervalText[id]);
                $("#" + id).html(text);
            }
        },100);
}

//	Begin "Import dialog" -----------------------------------------------------

var ERROR_MESSAGE = "К сожалению, на сервере произошел сбой.  Отчет уже отправлен в службу поддержки. Пожалуйста, попробуйте повторить ваши действия позже, чтобы у нас было время решить возникшую проблему.";
var ImportUploadResult = { Ok: 0, Error: 1, AlreadyUploaded: 2 };

//	Initialize FileImport dialog
function importDlg_Init(key, auth) {
	$('#inpArea').show();
	$('#msgArea').hide();
	$("#loadData").uploadify({
	buttonImg: "http://img.address.ua/img/select.png",
	cancelImg: "http://img.address.ua/img/1x1.gif",
		fileDesc: "Файлы Excel или Xml (*.xlsx, *.xml)",
		fileExt: "*.xlsx;*.xml",
		queueID: "dataQueue",
		scriptData: { authToken: auth },
		sizeLimit: 50000000,
		script: "/import/UploadImportData/" + key,
		uploader: "/img/uploadify.swf",
		height: 28,
		width: 118,
		onError: importDlg_OnError,
		onComplete: function(event, ID, fileObj, response, data) { importDlg_OnDataUploadComplete(response); }
	});
	$("#loadImgs").uploadify({
	buttonImg: "http://img.address.ua/img/load.png",
	cancelImg: "http://img.address.ua/img/1x1.gif",
		fileDesc: "Файлы изображений (*.gif, *.jpg, *.jpeg, *.png)",
		fileExt: "*.gif;*.jpg;*.jpeg;*.png",
		multi: true,
		queueID: "imgQueue",
		scriptData: { authToken: auth },
		sizeLimit: 5242880,
		script: "/import/UploadImportImage/" + key,
		uploader: "/img/uploadify.swf",
		height: 28,
		width: 118,
		onError: importDlg_OnError,
		onAllComplete: importDlg_UploadDataFile
	});
	$('#hlClose').click(function() { $('#ImportBlock').hide(); }).attr("href", "javascript://void(0);");							//	setup "Close" link;
	$('#hlDelImg').click(function() { $('#loadImgs').uploadifyClearQueue(); }).attr("href", "javascript://void(0);"); //	setup "Remove images" link;
	$('#hlImport').click(importDlg_Import).attr("href", "javascript://void(0);"); 																		//	setup "Import" link;
}

function importFileDlg_Show() {
	if ($("#AutoImportBlock").is(":visible"))
		$("#AutoImportBlock").hide();
	$('#inpArea').show();
	$('#msgArea').text("").hide();
	$('#ImportBlock').show();
}

function importDlg_Import() {
	if ($("#dataQueue div").length == 0) {
		alert("Пожалуйста, выберите данные для импорта.");
		return false;
	}
	$('#wait').show();
	if ($("#imgQueue div").length > 0)
		$('#loadImgs').uploadifyUpload();
	else
		importDlg_UploadDataFile();
}

function importDlg_UploadDataFile() {
	$("#loadData").uploadifySettings("scriptData", { isPublicate: $("#chPub").get(0).checked });
	$('#loadData').uploadifyUpload();
}

function importDlg_OnDataUploadComplete(response) {
	$('#wait').hide();
	var result = parseInt(response);
	if (result == ImportUploadResult.AlreadyUploaded) {
		alert("Этот файл уже загружен для импорта и сейчас все еще обрабатывается.");
	}
	else {
		var message;
		if (result == ImportUploadResult.Ok) {
			message = "Ваши данные были загружены для обработки. Детали загрузки будут присланы вам на e-mail."
		}
		else {
			message = ERROR_MESSAGE;
		}
		$('#inpArea').hide();
		$('#msgArea').show().text(message);
	}
}

function importDlg_OnError(event, ID, fileObj, errorObj) {
	$('#wait').hide();
	alert("К сожалению, во время выполнения запроса произошел сбой.");
}

//	End "Import dialog"

//	Begin "Auto Import dialog" ------------------------------------------------

//	Initialize "Auto import settings" dialog
function importAutoDlg_Init() {
	$('#hlAutoClose').click(function() { $('#AutoImportBlock').hide(); }).attr("href", "javascript://void(0);");	//	setup "Close" icon
	$('#btSave').click(importAutoDlg_Save);			  																																//	setup "Save" button
	$('#btClose').click(function() { $('#AutoImportBlock').hide(); }); 																						//	setup "Close" button
	$('#hlAutoHelp').click(function() { $('#autoHelpHolder').toggle(); }).attr("href", "javascript://void(0);");  //	setup "Info" link
}

//	Open "Auto import settings" dialog
function importAutoDlg_Show() {
	if ($("#ImportBlock").is(":visible"))
		$("#ImportBlock").hide();
	$.ajax({
	url: "/Import/GetSettings",
		dataType: "json",
		async: false,
		cache: false,
		success: function(data, textStatus) {
			$("#chbEnabled").attr("checked", data.IsEnabled);
			$("#inpUrl").val(data.DataSourceUrl);
			$("#chbUpdOnly").attr("checked", data.IsUpdateOnly);
			$("#chbPub").attr("checked", data.IsPublicateToAddress);
		},
		error: function(jqXHR, textStatus, errorThrown) {
			alert(ERROR_MESSAGE);
		}
	}); 
	$('#AutoImportBlock').show();
}

//	Save "Auto import" settings
function importAutoDlg_Save() {
	if ($("#inpArea").is(":visible"))
		$("#inpArea").hide();
	var isEnabled = $("#chbEnabled").get(0).checked;
	var dataSourceUrl = $("#inpUrl").val();
	var updateOnly = $("#chbUpdOnly").get(0).checked;
	var isPublicateToAddress = $("#chbPub").get(0).checked;
	if (isEnabled && (dataSourceUrl == null || dataSourceUrl == "")) {
		alert("Пожалуйста, укажите url файла с данными.");
		return;
	}
	$.ajax({
		url: "/Import/SetSettings",
		dataType: "json",
		type: "POST",
		data: {
			"IsEnabled": isEnabled,
			"DataSourceUrl": dataSourceUrl,
			"IsUpdateOnly": updateOnly,
			"IsPublicateToAddress": isPublicateToAddress
		},
		async: false,
		success: function(data, textStatus) {
			$('#AutoImportBlock').hide();
		},
		error: function(jqXHR, textStatus, errorThrown) {
			alert(ERROR_MESSAGE);
		}
	}); 
}

function DToSend(d) {
    if (typeof (d) == "number")
        return d.toString().replace(".", ",");
    else return d;
}

//	End "Auto Import dialog"

//	Begin "Import limit" dialog ------------------------------------------------

//	Initialize "Import limit" dialog
function importLimitDlg_Init() {
	$('#hlAutoClose').click(function() { $('#ImportLimitBlock').hide(); }).attr("href", "javascript://void(0);"); //	setup "Close" icon
	$('#btSave').click(importLimitDlg_Save); 		  																																//	setup "Save" button
	$('#btClose').click(function() { $('#ImportLimitBlock').hide(); });																						//	setup "Close" button
}

//	Open "Import limit" dialog
function importLimitDlg_Show(userId) {
	$("#hdUserId").val(userId);
	$.ajax({
		url: "/Import/GetImportLimit",
		cache: false,
		dataType: "json",
		data: {
			"userId": userId
		},
		async: false,
		success: function(data, textStatus) {
			if (data.IsOk) {
				$("#tbLimit").val(data.ImportLimit);
				$('#ImportLimitBlock').show();
			}
			else
				alert(ERROR_MESSAGE);
		},
		error: function(jqXHR, textStatus, errorThrown) {
			alert(ERROR_MESSAGE);
		}
	});
}

//	Save "Import limit" settings
function importLimitDlg_Save() {
	var userId = $("#hdUserId").val();
	var importLimit = $("#tbLimit").val();
	var isResetPeriod = $("#chbReset").get(0).checked;
	if (importLimit == null || importLimit == "") {
		alert("Пожалуйста, укажите лимит для импортируемых объявлений.");
		$("#tbLimit").focus();
		return;
	}
	var importLimitInt = parseInt(importLimit);
	if (isNaN(importLimitInt) || importLimitInt < 0) {
		alert("Пожалуйста, укажите целое положительное число.");
		$("#tbLimit").focus();
		return;
	}
	$.ajax({
		url: "/Import/SetImportLimit",
		dataType: "json",
		type: "POST",
		data: {
			"userId": userId,
			"importLimit": importLimitInt,
			"resetPeriod": isResetPeriod
		},
		async: false,
		success: function(data, textStatus) {
			if (data.IsOk)
				$('#ImportLimitBlock').hide();
			else
				alert(ERROR_MESSAGE);	
		},
		error: function(jqXHR, textStatus, errorThrown) {
			alert(ERROR_MESSAGE);
		}
	});
}
//	End "Import limit" dialog

function loadJSFile(filename, o) {
    if (!o) {
        var fileref = document.createElement('script')
        fileref.setAttribute("type", "text/javascript")
        fileref.setAttribute("src", filename)
        document.getElementsByTagName("head")[0].appendChild(fileref)
    }
}

function loadCssFile(filename) {
        var fileref = document.createElement('link')
        fileref.setAttribute("type", "text/css")
        fileref.setAttribute("rel", "stylesheet")
        fileref.setAttribute("href", filename)
        document.getElementsByTagName("head")[0].appendChild(fileref)
}

function ExecFuncByCond(fCond, f) {
    var t = setInterval(function() {
        if (fCond()) {
            clearInterval(t);
            f();
        }
    }, 100);
}
var e = new Object();
$(document).ready(function() { if (Calendar && typeof Calendar._TT["ABOUT"] != 'undefined') delete Calendar._TT["ABOUT"]; });

oMainPageTrends = function() {
    instMainPageTrends = this;
    this.Show = function() {
        var o = this;
        $.ajax({
            type: 'POST',
            url: "/home/graph4home/",
            dataType: 'json',
            success: function(data) {
                var str = "Медианная цена $" + data.AvgSqM + " за м<sup>2</sup>";
                if (data.Dynamic && data.Dynamic != 0)
                    str += " (<span class ='" + (data.Dynamic > 0 ? "green" : "red") + "'>" + data.Dynamic + "%" + (data.Dynamic > 0 ? "&uarr;" : "&darr;") + "</span>)";
                o.Plot("trends", str, o.DataPrepear(data.StatisticsMain));
            }
        });
    }
    this.DataPrepear = function(data) {
        var result = [];
        var series = [];
        var index = {};
        var sers = ",";
        for (var i = data.length - 1; i > -1; i--) {
            if (sers.indexOf(data[i].PriceType) == -1) {
                series.push({ label: data[i].PriceType });
                sers += data[i].PriceType + ",";
                result.push([]);
                index[data[i].PriceType] = series.length - 1;
            }
            result[index[data[i].PriceType]].push([eval("new " + data[i].Date.substr(1, data[i].Date.length - 2)).toDateString(), data[i].AvgSqM])
        }
        return { data: result, series: series };
    }

    this.Plot = function(cntr, title, result) {
        $("#" + cntr).show();
        $.jqplot(cntr, result.data, {
            title: title,
            series: result.series,
            legend: {
                show: true,
                location: 'ne',
                xoffset: 12,
                yoffset: 12
            },
            axes: {

                xaxis: {
                    renderer: $.jqplot.DateAxisRenderer,
                    borderWidth: "0",
                    background: "#ffffff",
                    color: "#ffffff",
                    drawBorder: false,
                    tickOptions: {
                        formatString: '%d.%m'
                    }
                },
                x2axis: { borderWidth: "0", background: "#ffffff", color: "#ffffff", drawBorder: false },
                y2axis: { borderWidth: "0", background: "#ffffff", color: "#ffffff", drawBorder: false },
                yaxis: {
                    tickOptions: {
                        formatString: '$%.0f'
                    },
                    borderWidth: "0",
                    background: "#ffffff",
                    color: "#ffffff",
                    drawBorder: false,
                    pad: 9
                },
                borderWidth: "0",
                background: "#ffffff",
                color: "#ffffff"
            },
            grid: {
        drawGridLines: false,
        background: "rgba(255,255,255,0)",
        shadow: false
    },
            seriesDefaults: {
                markerOptions: {
                    show: false

                },
                background: "#ffffff"
            }
            

            //            ,
            //            highlighter: {
            //                show: true,
            //                sizeAdjust: 7.5
            //            },
            //            cursor: {
            //                show: false
            //            }
        });
    }
    this.Show();
}


