
function onXMLResult(response) {
        if(response == null) {
                alert("No response from server");
                return;
        }
        try {
                var root = response.getElementsByTagName('ROOT')[0];
                var result = isOK(root) ? "OK":"FAILED";
                if(result != "OK") {
                        showError(root);
                } else {
                        callback(root);
                }
        } catch (ex) {
                alert("Error occured " +  ex);

        }
}

function isOK(root) {
        if(!root) {
                return false;
        }
        for (var i = 0; i < root.childNodes.length; i++) {
                var node = root.childNodes[i];
                if(node.nodeName == "RESULT") {
                        if(node.firstChild.nodeValue == "OK") {
                                return true;
                        } else {
                                return false;
                        }
                        break;
                }
        }
        return false;
}


function showError(root) {
        var str = "При сохранении произошла ошибка.\n";
        if(root) {
                for (var i = 0; i < root.childNodes.length; i++) {
                        var node = root.childNodes[i];
                        if(node.nodeName == "DESC") {
                                str += node.firstChild.nodeValue + "\n";
                        }
                }
        }
        alert(str);
}

function getValue(root, tag) {
        for (var i = 0; i < root.childNodes.length; i++) {
                var node = root.childNodes[i];
                if(node.nodeName == tag) {
                        return node.firstChild.nodeValue;
                }
        }
        return "";
}



function loadXMLString(txt) 
{
        var xmlDoc = null;
        try {
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                xmlDoc.async = "false";
                xmlDoc.loadXML(txt);
        } catch(e) {
                try {
                        parser = new DOMParser();
                        xmlDoc = parser.parseFromString(txt,"text/xml");
                } catch(e) {
                        throw "Wrong XML: " + e;
                }
        }
        return xmlDoc;
}


/////////////////////////////////////// AJAX  /////////////////////////////////////

var request;
var callback;

function doRequest(url, args, callbackStr) {  
        if(request != null) {
                alert("Запрос уже выполняется");
        }
        if (window.XMLHttpRequest) {  
                request = new XMLHttpRequest();  
         } else if (window.ActiveXObject) {  
                request = new ActiveXObject("Microsoft.XMLHTTP");  
        }  

        if(request) {
                callback = callbackStr;
                request.onreadystatechange = processRequestChange;  
                request.open("POST", url, true);
                request.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
                request.send(args);
        } else {
                alert("Браузер не поддерживает AJAX");
        }
}  


/** 
* Get request state text function 
*/  
function getRequestStateText(code) {  
        switch (code) {  
        case 0: return "Не инициализирован"; break;  
        case 1: return "Загрузка..."; break;  
        case 2: return "Загружен."; break;  
        case 3: return "В процессе..."; break;  
        case 4: return "Готово."; break;  
        }  
}  


function getMessageBox() {
        var mb = document.getElementById("loading");
        if(!mb) {
                var el = document.createElement("DIV");
                el.id = "loading";
                el.className = "ajaxmb";
                var p = document.createElement("P");
                p.style.textAlign = 'center';
                p.appendChild(document.createTextNode("Выполняется запрос..."));
                p.appendChild(document.createElement("BR"));
                var input = document.createElement("INPUT");
                input.type = "button";
                input.value = "Отмена";
                input.id = "canselloading";
                input.onclick = "abortRequest();return false;";
                p.appendChild(input);
                el.appendChild(p);                
                document.body.appendChild(el);
                mb = el;
        }
        return mb;
}

function processRequestChange() {  
        abortReq = window.setTimeout("abortRequest();", 10000);

        // если выполнен  
        if (request.readyState == 4) {  
                clearTimeout(abortReq);  
                // если успешно  
                if (request.status == 200) {  
//                        alert("Answer: " + request.responseText);  
                        onXMLResult(request.responseXML);
//                        alert("Head: " + request.getAllResponseHeaders());  
                } else {  
                        try {
                                alert("Ошибка при обмене данных с сервером: " + request.statusText);  
                        } catch(ex) {
                                alert("Ошибка при обмене данных с сервером");  
                        }
                }  
                getMessageBox().style.display = 'none';  
                request = null;                
                
        }  else if (request.readyState == 3 || request.readyState == 1) {  
                // иначе, если идет загрузка или в процессе - показываем слой "Загружаются данные"  
                getMessageBox().style.display = 'block';  
        }  
}  


function abortRequest() {
        document.getElementById('loading').style.display = 'none';
        if(request) {
                request.abort();
                request = null;
        }
        clearTimeout(abortReq);  
}

/////////////////////////////////////////// IFRAME /////////////////////////////////

function sendForm(form, url, func, arg) {
        if (!document.createElement) {
                return; // not supported
        }
        if (typeof(form)=="string") {
                form = document.getElementById(form);
        }
        var frame=getIFrame();
        form.setAttribute('target', frame.id);
        form.setAttribute('action', url);
        form.submit();
}


function getIFrame() {
                var id = 'f' + Math.floor(Math.random() * 99999);
                var div = document.createElement('div');
                fr = document.createElement('iframe');
//                fr.style.display = "none";
                fr.style.backgroundColor = "red";
                fr.src = "about:blank";
                fr.id = id;
                fr.name = id;
                fr.onload = function() { onXMLFrame(getIFrameXML(id)); };
                div.appendChild(fr);
                document.body.appendChild(div);
        return fr;
}

function getIFrameXML(iframe) {
        iframe = document.getElementById(iframe);
        var doc = iframe.contentDocument;
        if (!doc && iframe.contentWindow) {
                doc = iframe.contentWindow.document;
        }
        if (!doc) {
                doc = window.frames[iframe.id].document;
        }
        if (!doc || doc.location=="about:blank") {
                return null;
        }
        if (doc.XMLDocument) {
                doc = doc.XMLDocument;
        }
        return doc;
}

function onXMLFrame(response) {
        if(response == null) {
                alert("No response from server");
                return;
        }
        try {
                var root = response.getElementsByTagName('ROOT')[0];
                var result = isOK(root) ? "OK":"FAILED";
                if(result != "OK") {
                        showError(root);
                } else {
                        onAppend(root);
                }
        } catch (ex) {
                alert("Error occured " +  ex);
        }
}

/////////////////////////////////////////// GUI /////////////////////////////////

function opacity(id, opacStart, opacEnd, millisec) {
    //speed for each frame
    var speed = Math.round(millisec / 100);
    var timer = 0;

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) {
        for(i = opacStart; i >= opacEnd; i--) {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    } else if(opacStart < opacEnd) {
        for(i = opacStart; i <= opacEnd; i++)
            {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    }
}

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var object = document.getElementById(id).style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
} 

