// Вывод информационного окна с кнопкой Ok
// Может быть одного из трех типов: информирующее, сообщающее об успешном завершении, сообщающее об ошибке
function SladeAjaxInform(parameters) {
    var PageSize = SladeGetPageSize();
    var WindowWidth = PageSize[2];
    var WindowHeight = PageSize[3];
    var ConfirmWindow = document.createElement('div');
    ConfirmWindow.className = 'SladeInform ' + parameters.InfoType;
    ConfirmWindow.style.cssText = 'top: ' + ((WindowHeight - 150) / 2) + 'px; left: ' + ((WindowWidth - 200) / 2) + 'px';
    document.body.appendChild(ConfirmWindow);
    InnerWindow = document.createElement('div');
    InnerWindow.className = 'SladeInformInner';
    ConfirmWindow.appendChild(InnerWindow);
    Confirmation = document.createElement('div');
    Confirmation.className = 'confirmation';
    SladeSetInnerHTML(Confirmation, parameters.InfoText);
    ButtonOk = document.createElement('div');
    ButtonOk.className = 'buttonok';
    SladeSetInnerHTML(ButtonOk, 'Ок');
    InnerWindow.appendChild(Confirmation);
    InnerWindow.appendChild(ButtonOk);

    function ButtonOkHandler(event) {
        document.body.removeChild(ConfirmWindow);
    }

    Event.add(ButtonOk, 'click', ButtonOkHandler);
}

// Открытие формы подтверждения выполнения действия
// Выводит окно с кнопками "Да" и "Нет"
// При нажатии "Да" выполняет Ajax-запрос
// При нажатии "Нет" закрывает окно
function SladeAjaxRequestConfirm(parameters) {
    var PageSize = SladeGetPageSize();
    var WindowWidth = PageSize[2];
    var WindowHeight = PageSize[3];
    var ConfirmWindow = document.createElement('div');
    ConfirmWindow.className = 'SladeConfirm';
    ConfirmWindow.style.cssText = 'top: ' + ((WindowHeight - 150) / 2) + 'px; left: ' + ((WindowWidth - 200) / 2) + 'px';
    document.body.appendChild(ConfirmWindow);
    InnerWindow = document.createElement('div');
    InnerWindow.className = 'SladeConfirmInner';
    ConfirmWindow.appendChild(InnerWindow);
    Confirmation = document.createElement('div');
    Confirmation.className = 'confirmation';
    SladeSetInnerHTML(Confirmation, parameters.ConfirmationText);
    ButtonYes = document.createElement('div');
    ButtonYes.className = 'buttonyes';
    SladeSetInnerHTML(ButtonYes, 'Да');
    ButtonNo = document.createElement('div');
    ButtonNo.className = 'buttonno';
    SladeSetInnerHTML(ButtonNo, 'Нет');
    InnerWindow.appendChild(Confirmation);
    InnerWindow.appendChild(ButtonYes);
    InnerWindow.appendChild(ButtonNo);
    //alert("trying to add events");

    function ButtonYesHandler(event) {
        document.body.removeChild(ConfirmWindow);
        //alert("Далее - отправка запроса серверу");
        SladeAjaxRequest(parameters);
    }

    function ButtonNoHandler(event) {
        document.body.removeChild(ConfirmWindow);
    }

    Event.add(ButtonYes, 'click', ButtonYesHandler);
    Event.add(ButtonNo, 'click', ButtonNoHandler);
    //SladeAddEvent(ButtonYes,"click",'window.alert("Yes clicked")');
    //SladeAddEvent(ButtonNo,"click",'window.alert("No clicked")');
    //Information = document.createElement('div');
    //SladeSetInnerHTML(Information,SladeListNodes(ButtonYes));
    //InnerWindow.appendChild(Information);
}


// Выполняет Ajax-запрос к ScriptURL и возвращает результат в элемент с id=ResponseContainerId
// Если type=link, то ScriptURL содержит адрес серверного скрипта со строкой запроса
// Если type=forma, то ScriptURL содержит адрес серверного скрипта, а строка запроса составляется по данным из формы с id=FormId
function SladeAjaxRequest(parameters) {
    var url;
    var d = new Date();
    var request = 'RQ' + d.getTime();
    var code_str = request + "=SladeCreateRequest();";
    eval(code_str);
    //alert(request);
    //alert("type="+type+", ScriptURL="+ScriptURL+", ResponseContainerId="+ResponseContainerId+", FormId="+FormId);
    if (parameters.type == 'forma') {
        Forma = document.getElementById(parameters.FormId);
        url = SladeBuildQueryStringfromForm(parameters.ScriptURL, Forma);
    }
    if (parameters.type == 'link')
        url = parameters.ScriptURL;
    //alert(url);
    var params = url.split('?')[1];
    eval(request).open("POST", parameters.ScriptURL, true);
    eval(request).onreadystatechange = SladeReturnResponse;
    eval(request).setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    eval(request).send(params);

    function SladeReturnResponse() {
        if (eval(request).readyState == 4) {
            ResponseContainer = document.getElementById(parameters.ResponseContainerId);
            if (eval(request).status == 200) {
                Response = eval(request).responseText;
                SladeSetInnerHTML(ResponseContainer, Response);
                if (parameters.onSuccess)
                    eval(parameters.onSuccess);
            }
            else {
                var errormessage = eval(request).getResponseHeader("Status");
                if (parameters.onError)
                    eval(parameters.onError);
            }
        }
    }
}

// Создает и возвращает объект запроса
function SladeCreateRequest() {
    try {
        request = new XMLHttpRequest();
    }
    catch (trymicrosoft) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch (othermicrosoft) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (failed) {
                request = null;
            }
        }
    }

    if (request == null)
        alert("Error creating request object!");
    else return request;
}

// Выполняет построение url запроса из url скрипта script и данных формы forma
function SladeBuildQueryStringfromForm(script, forma) {
    var url = "";
    if (forma != null)
        if (forma.childNodes) {
            url = SladeGetFormValues(forma);
            if (script.indexOf('?') >= 0)
                url = script + "&" + url.substr(1);
            else
                url = script + "?" + url.substr(1);
        }
    return url;
}

// Рекурсивно обходит дерево Dom начиная от корневого узла формы refNode
function SladeGetFormValues(refNode) {
    var strResult = "";
    var i = 0;
    if (refNode.nodeType == '1') {
        if (refNode.nodeName.toLowerCase() == 'input' && refNode.getAttribute('name') && (refNode.getAttribute('type') == 'text' || refNode.getAttribute('type') == 'password' || refNode.getAttribute('type') == 'hidden')) {
            strResult += "&" + refNode.getAttribute('name') + "=" + encodeURIComponent(refNode.value);
        }
        if (refNode.nodeName.toLowerCase() == 'input' && refNode.getAttribute('name') && refNode.getAttribute('type') == 'radio')
            if (refNode.checked) {
                strResult += "&" + refNode.getAttribute('name') + "=" + encodeURIComponent(refNode.getAttribute('value'));
            }
        if (refNode.nodeName.toLowerCase() == 'input' && refNode.getAttribute('name') && refNode.getAttribute('type') == 'checkbox')
            if (refNode.checked) {
                strResult += "&" + refNode.getAttribute('name') + "=" + encodeURIComponent(refNode.getAttribute('value'));
            }
        if (refNode.nodeName.toLowerCase() == 'option' && refNode.parentNode.nodeName.toLowerCase() == 'select' && refNode.parentNode.getAttribute('name') && refNode.getAttribute('value'))
            if (refNode.selected) {
                strResult += "&" + refNode.parentNode.getAttribute('name') + "=" + encodeURIComponent(refNode.getAttribute('value'));
            }
        if (refNode.nodeName.toLowerCase() == 'textarea' && refNode.getAttribute('name')) {
            strResult += "&" + refNode.getAttribute('name') + "=" + encodeURIComponent(refNode.value);
        }
    }
    if (refNode.hasChildNodes()) {
        for (var i = 0; i < refNode.childNodes.length; i++)
            strResult += SladeGetFormValues(refNode.childNodes[i]);
    }

    return strResult;
}

// Получает внутренний код html, обходя узлы и достраивая парные тэги для всех элементов, кроме элементов, включенных в массив ignore_tags
function SladeGetInnerHTML(refNode, parentNode) {
    var strResult = "";
    var ignore_tags = new Array('p', 'br', 'hr', 'img');
    if (refNode != parentNode) {
        if (refNode.nodeType == 1) {
            strResult += "<" + refNode.nodeName.toLowerCase();
            if (refNode.attributes)
                for (var i = 0; i < refNode.attributes.length; i++)
                    strResult += " " + refNode.attributes[i].nodeName + "=\"" + refNode.attributes[i].nodeValue + "\"";
            strResult += ">";
        }
        if (refNode.nodeType == 3)
            strResult += refNode.nodeValue;
    }
    if (refNode.hasChildNodes()) {
        for (i = 0; i < refNode.childNodes.length; i++)
            strResult += SladeGetInnerHTML(refNode.childNodes[i], parentNode);
    }
    if (refNode != parentNode && refNode.nodeType == 1) {
        var close_tag = true;
        for (i = 0; i < ignore_tags.length; i++)
            if (ignore_tags[i] == refNode.nodeName.toLowerCase())
                close_tag = false;
        if (close_tag) strResult += "<\\" + refNode.nodeName.toLowerCase() + ">";
    }
    return strResult;
}

// Для узла refNode устанавливает HTMLtext в качестве innerHTML
function SladeSetInnerHTML(refNode, HTMLtext) {
    if (refNode != null)
        if (refNode.childNodes) {
            for (var i = 0; i < refNode.childNodes.length; i++) {
                var childNode = refNode.childNodes[i];
                refNode.removeChild(childNode);
            }
        }
    refNode.innerHTML = HTMLtext;
}

// Для узла refNode выводит список всех узлов-потомков с именем Tag
function SladeListTagNodes(refNode, Tag) {
    var strResult = "";
    var nodeTypes = new Array();
    nodeTypes[1] = 'Element';
    nodeTypes[2] = 'Атрибут';
    nodeTypes[3] = 'Текст';
    nodeTypes[4] = '4 - Неизвестен';
    nodeTypes[5] = '5 - Неизвестен';
    nodeTypes[6] = '6 - Неизвестен';
    nodeTypes[7] = '7 - Неизвестен';
    nodeTypes[8] = 'Комментарий';
    nodeTypes[9] = 'Документ';
    nodeTypes[10] = '10 - Неизвестен';
    nodeTypes[11] = '11 - Неизвестен';
    nodeTypes[12] = '12 - Неизвестен';
    if (Tag != '') {
        if (refNode.nodeName == Tag)
            strResult += " Имя: " + refNode.nodeName + " Тип: " + nodeTypes[refNode.nodeType] + " Значение: " + refNode.nodeValue + "<br>";
    }
    else
        strResult += " Имя: " + refNode.nodeName + " Тип: " + nodeTypes[refNode.nodeType] + " Значение: " + refNode.nodeValue + "<br>";
    if (refNode.hasChildNodes()) {
        for (var i = 0; i < refNode.childNodes.length; i++)
            strResult += SladeListTagNodes(refNode.childNodes[i], Tag);
    }

    return strResult;
}

// Для узла refNode выводит список всех узлов-потомков с атрибутами
function SladeListNodes(refNode) {
    var strResult = "";
    strResult += "<b>" + refNode.nodeName + "</b>=<i>" + refNode.nodeValue + "</i><br>";
    if (refNode.attributes) {
        for (i = 0; i < refNode.attributes.length; i++)
            strResult += refNode.attributes[i].nodeName + "=" + refNode.attributes[i].nodeValue + "<br>";
    }
    if (refNode.hasChildNodes()) {
        for (var i = 0; i < refNode.childNodes.length; i++)
            strResult += SladeListNodes(refNode.childNodes[i]);
    }
    return strResult;
}

// Возвращает массив, содержащий параметры страницы и окна (ширину страницы, высоту страницы, ширину окна, высоту окна, прокрутку по x, прокрутку по y)
function SladeGetPageSize() {
    var xScroll, yScroll;
    if (window.innerHeight && window.scrollMaxY) {
        xScroll = document.body.scrollWidth;
        yScroll = window.innerHeight + window.scrollMaxY;
    }
    else if (document.body.scrollHeight > document.body.offsetHeight) // all but Explorer Mac
    {
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    }
    else // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
    {
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }
    var windowWidth, windowHeight;
    if (self.innerHeight)  // all except Explorer
    {
        windowWidth = self.innerWidth;
        windowHeight = self.innerHeight;
    }
    else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode
    {
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) // other Explorers
    {
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }
    // for small pages with total height less then height of the viewport
    if (yScroll < windowHeight) {
        pageHeight = windowHeight;
    }
    else {
        pageHeight = yScroll;
    }
    // for small pages with total width less then width of the viewport
    if (xScroll < windowWidth) {
        pageWidth = windowWidth;
    }
    else {
        pageWidth = xScroll;
    }
    arrayPageSize = new Array(pageWidth, pageHeight, windowWidth, windowHeight, xScroll, yScroll);
    return arrayPageSize;
}

function SladeShowSubmenu(submenuid) {
    if (document.getElementById(submenuid))
        document.getElementById(submenuid).className = "visiblesubmenu";
}

function SladeHideSubmenu(submenuid) {
    if (document.getElementById(submenuid))
        document.getElementById(submenuid).className = "hiddensubmenu";
}

function SladeAddEvent(elem, type, handler) {
    if (elem.setAttribute) {
        elem.setAttribute("on" + type, handler);
        alert("setAttribute on" + type);
    }
    else if (elem.addEventListener) {
        elem.addEventListener(type, handler, false);
        alert("addEventListener " + type);
    }
    else if (elem.attachEvent) {
        elem.attachEvent("on" + type, handler);
        alert("attachEvent on" + type);
    }
}

function SladeRemoveEvent(elem, type, handler) {
    if (elem.removeAttribute) {
        elem.removeAttribute("on" + type);
        //alert("removeAttribute on" + type + "; handler=" + handler);
    }
    else if (elem.removeEventListener) {
        elem.removeEventListener(type, handler, false);
        //alert("removeEventListener " + type + "; handler=" + handler);
    }
    else if (elem.detachEvent) {
        elem.detachEvent("on" + type, handler);
        //alert("detachEvent on" + type + "; handler=" + handler);
    }
}
