﻿var _requestsCache = new Array();
var _requestIndex = 0;
var _subDocumentTypeIdExcepted = new Array();

function StringToDate(dateStr) {
    var matches = new String(dateStr).match(/\d+/gi);
    return new Date(matches[2], matches[1] - 1, matches[0], matches[3], matches[4], matches[5]);
}

function CreateXmlHttpRequest() {    
    var request;
    try {
        request = new XMLHttpRequest();
    } 
    catch (trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        } 
        catch (othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } 
            catch (failed) {
                request = false;
            }
        }
    }
    if (!request)
        alert("Ошибка создания объекта XMLHttpRequest!");
    else
        return request;
}

function SetSelectOption(select, text, disable) {
    if (IsNullOrEmpty(select))
        return;
    
    select = $(select)
    if (select.length > 0 
        && !IsNullOrEmpty(text)) {
        select.empty();
        var loadingElement = $(document.createElement("option"));
        loadingElement.attr("value", "");
        loadingElement.html(text);
        select.append(loadingElement);
        if (disable)
            select.attr("disabled", "disabled");
    }
}

function UpdateSelect(select,
                      loadingText,
                      url,
                      value,
                      timeOutError,
                      unknownError,
                      disableOnError, 
                      onComplete) {
    if (IsNullOrEmpty(select))
        return;
    select = $(select);
    if (select.length == 0)
        return;
    
    var disabled = select.attr("disabled");
    SetSelectOption(select, loadingText, true)

    $.ajax({
        type: value ? "POST" : "GET",
        url: url,
        data: value,
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            switch (textStatus) {
                case "timeout":
                    SetSelectOption(select, timeOutError, disableOnError)
                    break;
                case "error":
                    SetSelectOption(select, XMLHttpRequest.responseText, disableOnError)
                    break;
                default:
                    SetSelectOption(select, unknownError, disableOnError)
                    break;
            }
        },
        success: function(data, textStatus, XMLHttpRequest) {
            select.html(data);
            if (disableOnError == false)
                select.attr("disabled", disabled);
            else
                select.removeAttr("disabled");
        },
        complete: function(XMLHttpRequest, textStatus) {
            if (onComplete != null) {
                onComplete();
            }
        }
    });
}

function ShowHideChildDocuments(element, key, visibleClass, hiddenClass) {
    if (IsNullOrEmpty(element))
        return false;
    
    element = $(element);
    if (element.length > 0) {
        var elements = element.nextAll("tr[id$=" + key + "]").each(function(index, sibling) {
            ChangeClass(sibling, visibleClass, hiddenClass);
        });
    }
    return false;
}

function ShowHideDescendants(element, key, show) {
    if (IsNullOrEmpty(element))
        return;

    element = $(element);
    if (element.length > 0) {
        if (show) {
            var elements = element.data("hidden");
            if (elements)
                elements.show();
            else
                element.nextAll("tr[id$=" + key + "]").show();
        }
        else {
            var elements = null;
            //выбор элементов по видимости не работает в IE
            element.nextAll("tr[id*=" + key + "]").each(function(index, temp) {
                temp = $(temp);
                if (temp.css("display") != "none") {
                    if (elements)
                        elements = elements.add(temp);
                    else
                        elements = temp;
                }
                temp.hide()
            });
            
            element.data("hidden", elements);
        }
    }
}


var lastVisibilityElement;
function ChangeVisibility(element, undoLast, undoThis, speed, callback) {

    if (IsNullOrEmpty(element))
        return;

    element = $(element);

    if (element.length == 0)
        return;

    if (callback && !speed)
        speed = 0;
    
    if (undoLast != null) {
        if (undoLast) {

            var equal = lastVisibilityElement && lastVisibilityElement[0] == element[0];
            var flag = false;
            
            if (undoThis == false && equal)
                return;
            
            if (lastVisibilityElement && !equal) {
                if (speed) {
                    ChangeVisibility(lastVisibilityElement, false, true, speed, function() {
                        if (callback)
                            callback();

                        element.toggle(speed);
                    });

                    flag = true;
                }
                else
                    ChangeVisibility(lastVisibilityElement, false);
            }

            if (!equal) 
                lastVisibilityElement = element;
            else
                lastVisibilityElement = null;

            if (flag)
                return;
        }
        else
            lastVisibilityElement = null;
    }

    if (speed)
        element.toggle(speed, callback);
    else
        element.toggle();
}

var lastElement, lastClass1, lastClass2;

function ChangeClass(element, class1, class2, undoLast) {
    if (IsNullOrEmpty(element))
        return;
        
    element = $(element);
    
    if(element.length == 0)
        return;

    if (element.hasClass(class1)) {
        element.removeClass(class1);
        element.addClass(class2);
    }
    else if (IsNullOrEmpty(class1)) {
        element.addClass(class2);
    }
    else if (element.hasClass(class2)) {
        element.removeClass(class2);
        element.addClass(class1);
    }
    else if (IsNullOrEmpty(class2)) {
        element.addClass(class1);
    }
    
    if (undoLast != null) {
        if (undoLast) {
            if (lastElement
                && lastElement[0] != element[0]) {
                ChangeClass(lastElement, lastClass1, lastClass2, false);
            }

            if (!lastElement
                ||  lastElement[0] != element[0]) {
                lastElement = element;
                lastClass1 = class1;
                lastClass2 = class2;
            }
            else
                lastElement = null;
        }
        else
            lastElement = null;
    }
}

function ShowDialog(element, title, buttons, width, onClose, onOpen) { 
     $(element).dialog({
        title: title,
        minWidth: "5em;",
        width: width ? width : "30%",
        maxWidth: "60%",
        minHeight: 50,
        maxHeight: "20em",
        autoOpen: true,
        buttons: buttons,
        close: onClose,
        open: onOpen
    });
    
}
function DialogFromUrl(element,
                       title,
                       loadingText,
                       loadingClass,
                       url,
                       value,
                       alertOnError,
                       errorClass,
                       error,
                       timeOutError,
                       unknownError) {

    element = $(element);        
    if (element.length == 0)
        return;
        
    var isLoaded = element.data("isLoaded");
    if (isLoaded == true) {
        element.dialog("open");
        return;
    }
    else
        ShowDialog(element, title);

    if (loadingClass) {
        element.html(loadingText);
        element.addClass(loadingClass);
    }
    
    $.ajax({
        type: value ? "POST" : "GET",
        url: url,
        data: value,
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            if (loadingClass)
                element.removeClass(loadingClass);
            if (errorClass)
                element.addClass(errorClass);

            var text = null;
            switch (textStatus) {
                case "timeout":
                    if (timeOutError != null)
                        text = timeOutError;
                    else if (error != null)
                        text = error;
                    else
                        text = XMLHttpRequest.responseText;
                    break;
                case "error":
                    if (error != null)
                        text = error;
                    else
                        text = XMLHttpRequest.responseText;
                    break;
                default:
                    if (unknownError != null)
                        text = unknownError;
                    else if (error != null)
                        text = error;
                    else
                        text = XMLHttpRequest.responseText;
                    break;
            }
            if (text != null) {
                element.html(text);
            }
        },
        success: function(data, textStatus, XMLHttpRequest) {
            if (loadingClass)
                element.removeClass(loadingClass);
            element.html(data);
            element.data("isLoaded", true)
        }
    });
}

function UpdateElement(element,
                       url,
                       alertOnError,
                       errorClass,
                       error,
                       loadingClass,
                       loadedTitle,
                       value,
                       loadingTitle,
                       errorTitle,
                       timeOutError,
                       unknownError, 
                       onComplete,
                       loadingContent) {

    if (IsNullOrEmpty(element))
        return;

    element = $(element);

    if (element.length == 0)
        return;

    if (loadingClass)
        element.addClass(loadingClass);

    if (loadingTitle != null)
        element.attr("title", loadingTitle);

    if (loadingContent == true) {
        if (element.data("loadingContent") == null)
            element.data("loadingContent", element.html());
        else
            element.html(element.data("loadingContent"));
    }

    $.ajax({
        type: value ? "POST" : "GET",
        url: url,
        data: value,
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            if (loadingClass)
                element.removeClass(loadingClass);
            if (errorClass)
                element.addClass(errorClass);
            if (errorTitle != null)
                element.attr("title", errorTitle)
            var text = null;
            switch (textStatus) {
                case "timeout":
                    if (timeOutError != null)
                        text = timeOutError;
                    else if (error != null)
                        text = error;
                    else
                        text = XMLHttpRequest.responseText;
                    break;
                case "error":
                    if (error != null)
                        text = error;
                    else
                        text = XMLHttpRequest.responseText;
                    break;
                default:
                    if (unknownError != null)
                        text = unknownError;
                    else if (error != null)
                        text = error;
                    else
                        text = XMLHttpRequest.responseText;
                    break;
            }
            if (text != null) {
                element.html(text);
                if (alertOnError == true)
                    alert(text);
            }
        },
        success: function(data, textStatus, XMLHttpRequest) {
            if (loadedTitle != null)
                element.attr("title", loadedTitle)
            if (loadingClass)
                element.removeClass(loadingClass);
            element.empty();
            element.html(data);
        },
        complete: function(XMLHttpRequest, textStatus) {
        if (onComplete != null) {
                onComplete();
            }
        }        
    });
}

function UpdateInput(element, url, error) {
    UpdateInput(element, url, error, error, error, null);
}

function UpdateInput(element, url, error, timeOutError, unknownError, value) {
    if (IsNullOrEmpty(element))
        return;
    element = $(element);
    if (element.length == 0)
        return;

    $.ajax({
        type: value ? "POST" : "GET",
        url: url,
        data: value,
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            switch (textStatus) {
                case "timeout":
                    if (timeOutError != null)
                        element.val(timeOutError);
                    else
                        element.val(XMLHttpRequest.responseText);
                    break;
                case "error":
                    if (error != null)
                        element.val(error);
                    else
                        element.val(XMLHttpRequest.responseText);
                    break;
                default:
                    if (unknownError != null)
                        element.val(unknownError);
                    else
                        element.val(XMLHttpRequest.responseText);
                    break;
            }
        },
        success: function(data, textStatus, XMLHttpRequest) {
            element.val(data);
        }
    });
}

function ClearDocumentForm(form, loadingClass, title) {
    form = $(form);
    
    if (form) {
        form.empty();
        if (!form.hasClass(loadingClass))
            form.addClass(loadingClass);
        form.attr("title", title);        
    }
}

function SetDocumentFileStatus(element, title, onclick) {
    if (IsNullOrEmpty(element))
        return;
    element = $(element);

    if (title)
        element.attr("title", title);
    else
        element.removeAttr("title");

    element.removeAttr("onclick");
    element.unbind("click");
    if (onclick) {
        //fix IE bug with arise event immediately after bind
        var flag = !$.browser.msie;
        var time = null;
        if (!flag) {
            time = new Date();
            time = time.setSeconds(time.getSeconds() + 1);
        }
        var fn = function() {
            if (flag || time <= new Date())
                onclick();
            flag = true;
        };
        element.click(fn);
    } 
}
/*
if (onclick) {
    if ($.browser.msie) {
        if (element.length > 0) {
            element[0].setAttribute('onclick', onclick);
        }
    }
    else
        element.click(onclick);
}
*/
/*
if (onclick) {
    //fix IE bug with arise event immediately after bind
    var flag = !$.browser.msie;
    var fn = function() {
        if (flag)
            onclick();
        else
            flag = true;
    };
    element.click(fn);
}
*/

function CheckGroup(name, checked) {
    if (checked == true) {
        $("input:checkbox[name=\"" + name + "\"]:not([disabled])").attr("checked", "checked");
    } else {
        $("input:checkbox[name=\"" + name + "\"]:not([disabled])").removeAttr("checked");
    }
}

function AbortRequest(index, deleteHandler) {
    var request = _requestsCache[index];
    if (request) {
        if(deleteHandler != false)
            request.onreadystatechange = null;
        request.abort();
        try {
            _requestsCache[index] = null;
            delete request;
        }
        catch (e) {
        }
    }
}

function OpenNewPage(url, width, height, isscroll) {
    var win, x, y, optStr;
    if (screen) {
        x = Math.floor((screen.width - width) / 2);
        y = Math.floor((screen.height - height) / 2);
    }
    else {
        x = 10;
        y = 10;
    }
    optStr = "channelmode=no,directories=no,fullscreen=no,location=no,menubar=no,resizable=yes,"
    if (isscroll) optStr = optStr + "scrollbars=yes,"
    optStr = optStr + "status=no,titlebar=no,toolbar=yes,top=" + y + ",left=" + x + ",width=" + width + ",height=" + height + "";
    win = window.open(url, 'win', optStr, false);
    win.focus();
}

// generate login function
function GenerateLogin(size, isNum, isCap) {
    var smallBegin = 97, smallEnd = 122, capBegin = 65, capEnd = 90, numBegin = 48, numEnd = 57
    var i, prevGroup, login = new String();
    while (login.length < size) {
        i = numBegin + Math.round((smallEnd - numBegin) * Math.random());
        if (String.fromCharCode(i) == "i" || String.fromCharCode(i) == "I" ||
		String.fromCharCode(i) == "o" || String.fromCharCode(i) == "O" ||
		String.fromCharCode(i) == "l") continue;
        if (i > numBegin && i < numEnd && prevGroup != 0) {
            login = login + String.fromCharCode(i);
            prevGroup = 0;
        }
        else if (i > smallBegin && i < smallEnd && prevGroup != 1) {
            login = login + String.fromCharCode(i);
            prevGroup = 1;
        }
        else if (i > capBegin && i < capEnd && prevGroup != 2) {
            login = login + String.fromCharCode(i);
            prevGroup = 2;
        }
    }
    return login;
}

function ClearValues(elementIds) {
    var i;    
    for (i = 0; i < elementIds.length; i++) {
        var element = $(elementIds[i]);
        if (element) {
            element.val("");
        }
    }
}

function CopyValues(fromElementIds, toElementIds) { 
    var i;
    var length = Math.min(fromElementIds.length, toElementIds.length);
    for (i = 0; i < length; i++) {
        var fromElement = $(fromElementIds[i]);
        var toElement = $(toElementIds[i]);
        if (fromElement.length > 0
            && toElement.length > 0) {
            toElement.val(fromElement.val());
        }
    }
}

function CheckValues(baseElementIds, elementIds) {
    var i;
    var length = Math.min(baseElementIds.length, elementIds.length);
    for (i = 0; i < length; i++) {
        var baseElement = $(baseElementIds[i]);
        var element = $(elementIds[i]);
        if (!baseElement.length == 0
            || !element.length == 0 
            || baseElement.val() != element.val()) {
            return false;
        }
    }
    return true;
}


function GetFormatDate(format, now) {
    if (!now)
        now = new Date();
    format = GetDatePart((now.getMonth() + 1), format, "M");
    format = GetDatePart(now.getDate(), format, "d");
    format = GetDatePart(now.getHours(), format, "H");
    format = GetDatePart(now.getMinutes(), format, "m");
    format = GetDatePart(now.getSeconds(), format, "s");
    var yearStr = new String(now.getFullYear());
    var matchs = format.match(/y+/);
    if (matchs != null) {
        var yearFormat = matchs[0];
        if (yearFormat && yearFormat.length > 0)
            format = format.replace(yearFormat, yearStr.substring(yearStr.length - yearFormat.length, yearStr.length));
    }
    return format;
}

function GetDatePart(part, format, code) {
    var index = format.indexOf(code);
    if (index >= 0) {
        if (index != format.lastIndexOf(code)) {
            var str = new String('0' + part);
            str = str.substring(str.length - 2, str.length);
            format = format.replace(code+code, str)
        }
        else {
            var str = part.toString();
            format = format.replace(code, str)
        }
    }
    return format;
}

function EnableDisableElements(elementIds) {
    var i;
    for (i = 0; i < elementIds.length; i++) {
        var element = $(elementIds[i]);
        if (element.length > 0) {
            element.attr("disabled", !element.attr("disabled"));
        }   
    }
}

function SelectValidateInt(source, clientside_arguments) {
    if (!IsNullOrEmpty(clientside_arguments.Value)
        && parseInt(clientside_arguments.Value) >= 0) {
     clientside_arguments.IsValid=true;
  }
  else {
      clientside_arguments.IsValid = false;
  }
}

function SelectValidate(source, clientside_arguments) {
    if (!IsNullOrEmpty(clientside_arguments.Value)) {
        clientside_arguments.IsValid = true;
    }
    else {
        clientside_arguments.IsValid = false;
    }
}

function SmartSetClass(element, class1, class2, setFirst) {
    if (setFirst)
        SetClass(element, class1, class2);
    else
        SetClass(element, class2, class1);
}

function SetClass(element, addClass, removeClass) {
    if (IsNullOrEmpty(element))
        return;
    element = $(element);
    if (element.length == 0)
        return;
    
    if(element.hasClass(removeClass))
        element.removeClass(removeClass);
    element.addClass(addClass);
}

function UpdateSelectByParent(parentSelect, parentValueSeparator, parentValueIndex,
                              targetSelect, targetValueSeparator, targetValueIndex,
                              targetKeysElement, targetValuesElement, targetSeparator,
                              targetSelectedValue, needEquals, emptyText) {
    if (IsNullOrEmpty(parentSelect)
        || IsNullOrEmpty(targetSelect)
        || IsNullOrEmpty(targetKeysElement)
        || IsNullOrEmpty(targetValuesElement))
        return;

    parentSelect = $(parentSelect);
    targetSelect = $(targetSelect);
    targetKeysElement = $(targetKeysElement);
    targetValuesElement = $(targetValuesElement);
    if (parentSelect.length == 0
        || targetSelect.length == 0
        || targetKeysElement.length == 0
        || targetValuesElement.length == 0)
        return

    var parentSubValue = parentSelect.val();
    if (parentValueSeparator && parentValueSeparator != "") {
        var parentValue = parentSelect.val().split(parentValueSeparator);
        if (parentValue && parentValue.length >= parentValueIndex) {
            parentSubValue = parentValue[parentValueIndex];
        }
    }

    if (parentSubValue) {
        targetSelect.empty();
        var targetKeys = targetKeysElement.val().split(targetSeparator);
        var targetValues = targetValuesElement.val().split(targetSeparator);

        var counter = 0; 
        if (targetKeys.length == targetValues.length) {
            for (var i = 0; i < targetValues.length; i++) {
                var targetKey = targetKeys[i];
                var targetValue = targetValues[i];
                var targetSubValue = targetValue;
                if (!IsNullOrEmpty(targetValueSeparator)) {
                    var targetValueArray = targetValue.split(targetValueSeparator);
                    if (targetValueArray && targetValueArray.length >= targetValueIndex) {
                        targetSubValue = targetValueArray[targetValueIndex];
                    }
                }
                
                if (!IsNullOrEmpty(targetValue)
                        && !IsNullOrEmpty(targetKey)) {
                    if ((targetSubValue == parentSubValue && needEquals == true)
                            || targetSubValue != parentSubValue && needEquals == false) {
                        var targetOption = $(document.createElement("option"));
                        targetOption.val(targetValue);
                        if ((targetSelectedValue == targetValue)
                                || (!targetSelectedValue && counter == 0))
                            targetOption.attr("selected", true);
                        targetOption.html(targetKey);
                        targetSelect.append(targetOption);
                        counter++;
                    }
                }
            }
            if (counter == 0) {
                var targetOption = $(document.createElement("option"));
                targetOption.val("");
                targetOption.html(emptyText);
                targetSelect.append(targetOption);
            }
        }
    }
}

function BuildUrl(url, parameters) {
    if (parameters != null && parameters.length % 2 == 0) {
        var i;
        var str = '';
        for (i = 0; i < parameters.length; i += 2) {
            if (parameters[i + 1] != null) {
                var value = new String(parameters[i + 1]);
                if (value.length > 0) {
                    if (str.length > 0)
                        str += "&";
                    str += escape(parameters[i]) + "=" + escape(value);
                }
            }
        }
        if (url.indexOf("?", 0) > 0) {
            if (url.lastIndexOf("&", url.length) < url.length - 1
                && url.lastIndexOf("?", url.length) < url.length - 1)
                url += "&";
        }
        else
            url += "?";
        url += str;
    }

    return url;
}

function UpdatePostalIndex(country, countries, index, indexButton,
                               loadingClass, url, codeParameter, nameParameter,
                               elementIds, textIds, codeIds, articleIds, urls) {

    var code = null;
    var isLoading = false;
    if (IsNullOrEmpty(index))
        return;
    index = $(index);
    
    indexButton = $(indexButton)

    if (!IsNullOrEmpty(country)) {
        country = $(country);
        if (country.length > 0) {
            var flag = false;
            for (var i = 0; i < countries.length; i++) {
                if (country.val() == countries[i]) {
                    flag = true
                    break;
                }
            }
            if (!flag) {
                return;
            }

            //This placed here for one time execution.
            index.val("");
            indexButton.addClass(loadingClass);
        }
    }

    var onLoaded = function() {
        UpdatePostalIndex(null, null, index, indexButton,
                               loadingClass, url, codeParameter, nameParameter,
                               elementIds, textIds, codeIds, articleIds, urls);
    };

    var result = GetAddressCode(onLoaded, codeParameter, nameParameter,
                                elementIds, textIds, codeIds, articleIds, urls);

    if (!result.isLoading) {
        if (result.code != null)
            url = BuildUrl(url, [codeParameter, result.code]);

        UpdateInput(index, url, null);
        indexButton.removeClass(loadingClass);
    }

}

function UpdateAddressSelect(country, countries, countryError, select,
                                 loadingText, url, codeParameter, nameParameter,
                                 elementIds, textIds, codeIds, articleIds, urls) {

    var code = null;
    var isLoading = false;

    if (!IsNullOrEmpty(country)) {
        country = $(country);
        if (country.length > 0) {
            var flag = false;
            for (var i = 0; i < countries.length; i++) {
                if (country.val() == countries[i]) {
                    flag = true
                    break;
                }
            }
            if (!flag) {
                SetSelectOption(select, countryError, true);
                return;
            }
        }
    }

    SetSelectOption(select, loadingText, true);

    var onLoaded = function() {
        UpdateAddressSelect(null, null, null, select,
                                 null, url, codeParameter, nameParameter,
                                 elementIds, textIds, codeIds, articleIds, urls);
    };    

    var result = GetAddressCode(onLoaded, codeParameter, nameParameter,
                                elementIds, textIds, codeIds, articleIds, urls);

    if (!result.isLoading) {
        if (result.code != null)
            url = BuildUrl(url, [codeParameter, result.code]);

        UpdateSelect(select, loadingText, url, null, countryError, countryError, true);
    }    
}

function FillAddress(country, countries, codeParameter, nameParameter,
                     elementIds, textIds, codeIds, articleIds, urls) {

    var code = null;
    var isLoading = false;

    if (!IsNullOrEmpty(country)) {
        country = $(country);
        if (country.length > 0) {
            var flag = false;
            for (var i = 0; i < countries.length; i++) {
                if (country.val() == countries[i]) {
                    flag = true
                    break;
                }
            }
            if (!flag)
                return;
        }
    }

    var onLoaded = function() {
        FillAddress(null, null, codeParameter, nameParameter,
                    elementIds, textIds, codeIds, articleIds, urls);
    };

    var result = GetAddressCode(onLoaded, codeParameter, nameParameter,
                                    elementIds, textIds, codeIds, articleIds, urls);

    if (!result.isLoading && result.code != null) {
        for (var i = 0; i < elementIds.length-1; i++) {
            var url = BuildUrl(urls[i], [codeParameter, result.code]);
            GetAddressCodePart(elementIds[i], textIds[i], codeIds[i], articleIds[i], url, null, null, true);
        }        
    }
}

function GetAddressCode(onLoaded, codeParameter, nameParameter,
                        elementIds, textIds, codeIds, articleIds, urls) {

    var result = new Object();
    result.code = null;
    result.isLoading = false;

    if (elementIds == null || textIds == null || codeIds == null || articleIds == null || urls == null
        || elementIds.length != textIds.length || elementIds.length != codeIds.length
        || elementIds.length != articleIds.length || elementIds.length != urls.length)
        return result;

    for (var i = 0; i < elementIds.length; i++) {
        var url = BuildUrl(urls[i], [codeParameter, result.code]);
        var resultPart = GetAddressCodePart(elementIds[i], textIds[i], codeIds[i], articleIds[i], url, nameParameter, onLoaded, false);
        if (resultPart.code != null)
            result.code = resultPart.code;
        result.isLoading = resultPart.isLoading;
        if (result.isLoading)
            break;
    }
    
    return result;
}


function GetAddressCodePart(element, textElement, codeElement, articleElement, url, nameParameter, onLoaded, loadNecessary) {
    var result = new Object();
    result.isLoading = false;
    result.code = null;

    if (IsNullOrEmpty(element)
        || IsNullOrEmpty(textElement)
        || IsNullOrEmpty(codeElement))
        return result;

    element = $(element);
    codeElement = $(codeElement);
    textElement = $(textElement);
    if (element.length == 0
        || textElement.length == 0
        || codeElement.length == 0)
        return result;

    var codeVal = $.trim(codeElement.val());
    var textVal = $.trim(textElement.val()).toLowerCase();
    var value = $.trim(element.val()).toLowerCase();

    if (value.length > 0 || loadNecessary) {
        if (loadNecessary && codeVal.length != 0)
            result.code = codeVal;
        else if (!loadNecessary && value == textVal) {
            if (codeVal.length != 0)
                result.code = codeVal;
        }
        else {
            codeElement.val("");
            textElement.val(value);
            result.isLoading = true;

            if (nameParameter != null && nameParameter != "")
                url = BuildUrl(url, [nameParameter, value]);

            $.ajax({
                type: "GET",
                url: url,
                success: function(data, textStatus, XMLHttpRequest) {
                    var values = data.split(";");
                    if (values.length > 2) {
                        textElement.val(values[0]);
                        element.val(values[0]);
                        codeElement.val(values[1]);
                        SetSelectText(articleElement, values[2]);
                    }

                },
                complete: function(XMLHttpRequest, textStatus) {
                    if (onLoaded)
                        onLoaded();
                }
            });
        }
    }

    return result;
}

function SetAddressValue(select, element, elementText, elementCode, elementArticle) {

    if (IsNullOrEmpty(select))
        return;
    select = $(select);
    if (select.length == 0)
        return;        
    if (IsNullOrEmpty(select.val()))
        return;
        
    var elementCode = $(elementCode);
    if (elementCode.length > 0) {
        var values = select.val().split("$");
        if (values.length > 1) {
            elementCode.val(values[0]);
            SetSelectText(elementArticle, values[1])
            var selectText = values[2];
            var element = $(element);
            if (element.length > 0)
                element.val(selectText);
                
            var elementText = $(elementText);
            if (elementText.length > 0)
                elementText.val(selectText);
        }
    }
}

function SetSelectText(element, text) {
    if (IsNullOrEmpty(element))
        return;
    element = $(element);
    if (element.length == 0)
        return;
        
    if(text == null)
        text = "";
    else
        text = $.trim(text).toLowerCase();

    var options = element.children("option");
    for (var i = 0; i < options.length; i++) {
        var option = $(options[i]);
        if ($.trim(option.text()).toLowerCase() == text) {
            option.attr("selected", true);
            return;
        }
    }
}

function OnSubmit(btnId) {
    if (Page_IsValid) {
        if (!IsNullOrEmpty(btnId)) {
            var button = $(btnId);
            if (button.length > 0) {
                button.attr("disabled", true);
            }
        }
    }
}

function SetSubDocumentTypeExcepted(docId, ids, prefix, disable) {
    var doc = _subDocumentTypeIdExcepted[docId];
    if (doc == null) {    
        doc = new Array();
    }

    for (var i = 0; i < ids.length; i++) {
        var id = ids[i];
        if (id) {
            var blocks = doc[id];
            if (blocks == null) {
                blocks = 0;
            }

            if (disable)
                blocks++;
            else if (blocks > 0)
                blocks--;

            var element = $("#" + prefix + docId + "_" + id);
            if (element) {
                if (element.length > 0) {
                    if (blocks > 0) {
                        element.attr("checked") = false;
                        element.attr("disabled", "disabled");
                    }
                    else {
                        element.removeAttr("disabled");
                    }
                    doc[id] = blocks;
                }
            }
        }
    }
    _subDocumentTypeIdExcepted[docId] = doc;
}

var citySelected = null;
function InitCitySelect(select, name, phone, addr, url, urlText, selectedClass, selectedId) {
    if (typeof (cities) == 'undefined')
        return;
        
    select = $(select);
    name = $(name);
    phone = $(phone);
    addr = $(addr);
    url = $(url);

    var html = '';
    for (var i = 0; i < cities.length; i++) {
        var city = cities[i];
        html += '<div id="contact' + city.id + '" align="left" class="option"><div value="' + city.id + '">' + city.name + '</div></div>';
    }
    select.html(html);

    var onSelect = function() {
        for (var i = 0; i < cities.length; i++) {
            var city = cities[i];
            if (city.id == $(this).attr("value")) {
                name.text(city.name);
                phone.text(city.tel);
                addr.text(city.addr);
                if ($.trim(city.url) != '') {
                    url.attr("href", city.url);
                    url.html(urlText);
                    url.show();
                }
                else
                    url.hide();
            }
        }
        select.hide();
        citySelected = $(this);
    }

    $("div.option div", select).mouseover(function() {
        $(this).addClass(selectedClass);
        if (citySelected) {
            $(citySelected).removeClass(selectedClass);
        }
    }).mouseout(function() {
        $(this).removeClass(selectedClass);
    }).mousedown(onSelect);

    var selected = $("#contact" + selectedId + " div", select);
    if (selected) {
        citySelected = selected;
        selected.addClass(selectedClass);
    }

}

function ToggleCitySelect(select, selectedClass) {
    if (citySelected)
        citySelected.addClass(selectedClass);
    $(select).toggle();
}

function IsNullOrEmpty(str) {
    if (str == null
    || ((str instanceof String 
        || typeof str == "string")
        && $.trim(str) == ""))
        return true;
    return false;
}

function setCookie(name, value, expiredays, path, domain, secure) {
    if (expiredays) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + expiredays);
        var expires = exdate.toGMTString();
    }
    document.cookie = name + "=" + value +
   ((expiredays) ? "; expires=" + expires : "") +
   ((path) ? "; path=" + path : "") +
   ((domain) ? "; domain=" + domain : "") +
   ((secure) ? "; secure" : "");
}

function getCookie(name) {
    var cookie = " " + document.cookie;
    var search = " " + name + "=";
    var setStr = null;
    var offset = 0;
    var end = 0;
    if (cookie.length > 0) {
        offset = cookie.indexOf(search);
        if (offset != -1) {
            offset += search.length;
            end = cookie.indexOf(";", offset)
            if (end == -1) {
                end = cookie.length;
            }
            setStr = unescape(cookie.substring(offset, end));
        }
    }
    return setStr;
}

function PhoneValidate(source, clientside_arguments) {
    clientside_arguments.IsValid = true;
    if (!IsNullOrEmpty(clientside_arguments.Value)){
        var city = $(source.getAttribute("city"));
        var country = $(source.getAttribute("country"));
        if (city.length == 0
            || country.length == 0
            || IsNullOrEmpty(city.val())
            || IsNullOrEmpty(country.val()))
            clientside_arguments.IsValid = false;
    }
}

function GetRequestQueryArray(query) {
    if(query == null)
        query = location.search.substring(1);

    if (IsNullOrEmpty(query))
        return null;

    var array = new Array();
    var parameters = query.split("&");
    for (var i = 0; i < parameters.length; i++) {
        var parameter = parameters[i].split("=");
        if (parameter.length > 1)
            array[parameter[0]] = decodeURIComponent(parameter[1]).replace(/\+/gmi," ");
        else
            array[parameter[0]] = null;
    }
    return array;
}

function GetLoadingDialog(element) {

    var loading = element.dialog({
        width: 'auto',
        height: 'auto',
        minWidth: 1,
        minHeight: 1,
        maxWidth: 1,
        maxHeight: 1,
        closeOnEscape: false,
        bgiframe: true,
        disabled: true,
        modal: true,
        position: 'center',
        resizable: false,
        open: function() {
            $(this).parents(".ui-dialog:first").find(".ui-dialog-titlebar-close").remove();
        }
    });
    loading.parents(".ui-dialog").find(".ui-dialog-titlebar").remove();
    return loading;
}

function getCardDialog(element, w) {
    var width = $(window).width();
    var height = $(window).height();
    var x = Math.floor(Math.random() * width * 0.25);
    var y = Math.floor(Math.random() * height * 0.25);

    if (IsNullOrEmpty(w)) {
        w = 600;
    }
        
    var cardDialog = element.dialog({
        width: w,
        modal: false,
        position: [x, y],
        resizable: false,
        closeOnEscape: true,
        bgiframe: true
    });
    return cardDialog;
}

function getFilterDialog(element, x, y, width) {

    var filterDialog = element.dialog({
        width: width ? width : 200,
        height: 200,
        modal: false,
        position: [x, y],
        resizable: false,
        closeOnEscape: true,
        bgiframe: true
    });
    return filterDialog;
}

function getFixedCardDialog(element, w) {
    var width = $(window).width();
    var height = $(window).height();
    var x = Math.floor(Math.random() * width * 0.25);
    var y = Math.floor(Math.random() * height * 0.25);

    if (IsNullOrEmpty(w)) {
        w = 600;
    }

    var cardDialog = element.dialog({
        width: w,
        disabled: true,
        modal: true,
        position: [x, y],
        resizable: false,
        closeOnEscape: true,
        bgiframe: true
    });
    return cardDialog;
}

