/**
 * this is NEW script used instead of jslib.js in new parts
 */
var maindoc = null;
var u = ""+document.location;
if (window['dojo'] && u.indexOf("http") != -1) {
    dojo.require("dojo.event.topic");
}
document._ajax_req = new Object();
document._ajaxRequestInProgress = false;
document._ajaxRequestMap = new Object();

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

if (panraven.isIE) {
    if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}
}

Array.prototype.inArray = function (value) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === value) {
            return true;
        }
    }
    return false;
};

function show_inline(elementId) {
    var element = document.getElementById(elementId);
    if (element != null) {
        element.style.display = 'inline';
    }
}

function toggle_div_display(elementId) {
    var element = document.getElementById(elementId);
    if (element.style.display == "none") {
        element.style.display = "block";
    } else {
        element.style.display = "none";
    }
}

function get_class_name(obj) {
    if (typeof obj != "object" || obj === null) return false;
    return /(\w+)\(/.exec(obj.constructor.toString())[1];
}

function set_size(object, width, height) {
    object.style.width = "" + width + "px";
    object.style.height = "" + height + "px";
}

function set_location(objectId, x, y) {
    var object = document.getElementById(objectId);
    object.style.left = x + "px";
    object.style.top = y + "px";
}

function get_client_size() {
    var myWidth = 0, myHeight = 0;
    if (typeof(window.innerWidth) == 'number') {
        //Non-IE
        myWidth = window.innerWidth;
        myHeight = window.innerHeight;
    } else if (document.documentElement &&
               (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
        //IE 6+ in 'standards compliant mode'
        myWidth = document.documentElement.clientWidth;
        myHeight = document.documentElement.clientHeight;
    } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
        //IE 4 compatible
        myWidth = document.body.clientWidth;
        myHeight = document.body.clientHeight;
    }
    return {width: myWidth, height: myHeight};
}


function get_rect(object, considerAbsoluteParent, parent) {
    if (object == null)
        alert("object is null in get_rect()");
    var x = 0;
    var y = 0;
    var retval = new Object();
    retval.width = object.offsetWidth;
    retval.height = object.offsetHeight;
    while (object != null || object != parent) { // how could I?
        if (considerAbsoluteParent) {
            if (object == null || object.style && object.style.position == "absolute") {
                retval.parent = object;
                break;
            }
        }
        x = x + object.offsetLeft;
        y = y + object.offsetTop;
        object = object.offsetParent;
    }
    retval.x = x;
    retval.y = y;
    object = null;
    return retval;
}

function find_form(name) {
    for (var i = 0; i < document.forms.length; i++) {
        if (document.forms[i].name == name) {
            return document.forms[i];
        }
    }
    return find_control(name);
}

function find_control2(form, name) {
    for (var j = 0; j < form.elements.length; j++) {
        var elem = form.elements[j];
        if (elem == undefined) continue;
        if (name == "autoSendUpdate") {
            //alert("fc2: name="+elem.name+" id="+elem.id);
        }
        if (elem.name == name || elem.id == name) {
            return elem;
        }
    }
    return null;
}

function find_control(name) {
    /*
    if (name.indexOf("_region_2_a") != -1) {
        debugger;
    }
    */
    for (var i = 0; i < document.forms.length; i++) {
        var found = find_control2(document.forms[i], name);
        if (found != null)
            return found;
    }
    var elems = document.getElementsByName(name);
    if (elems.length > 0) {
        return elems.item(0);
    }
    var elem = document.getElementById(name);
    return elem;
}

/**
 * formName - used in dialogs framework [tyr]
 **/
function find_controls(names, formName) {
    var arr = new Array();
    for (var i = 0; i < document.forms.length; i++) {
        var form = document.forms[i];
        if (formName && form.name != formName) continue;

        for (var j = 0; j < names.length; j++) {
            var name = names[j];
            if (name != undefined && name != null) {
                var elem = form[name];
                if (elem != null) {
                    if(elem.type == undefined) {
                        for(var k=0; k<form.length; k++) {
                            if(form[k].name == name && form[k].type == "radio" && form[k].checked) {
                                arr.push(form[k]);
                            }
                        }
                    } else {
                        arr.push(elem);
                    }
                }
            }
        }
    }
    return arr;
}

function get_element_by_tag_name(node, childName) {
    try {
        var nodes = node.getElementsByTagName(childName);
        for (var i = 0; i < nodes.length; i++) {
            return nodes[i];
        }
    } catch (e) {
        //alert("1:"+e.message);
    }
    try {
        //alert("node.nodeName="+node.documentElement);
        //alert("node.childNodes="+node.childNodes.length);
        for (var x = 0; x < node.childNodes.length; x++) {
            if (node.childNodes[x].nodeName == childName) {
                return node;
            }
        }
    } catch (e) {
//        alert("2:" + e.message);
    }
    //alert("get_element_by_tag_name("+childName+") returns null, node="+node);
    return null;
}

/* ***************************
** Andrew Clover (and at doxdesk dot com)
** http://and.doxdesk.com/
*/
function utf8(wide) {
    var c, s;
    var enc = "";
    var i = 0;
    while (i < wide.length) {
        c = wide.charCodeAt(i++);
        // handle UTF-16 surrogates
        if (c >= 0xDC00 && c < 0xE000) continue;
        if (c >= 0xD800 && c < 0xDC00) {
            if (i >= wide.length) continue;
            s = wide.charCodeAt(i++);
            if (s < 0xDC00 || c >= 0xDE00) continue;
            c = ((c - 0xD800) << 10) + (s - 0xDC00) + 0x10000;
        }
        // output value
        if (c < 0x80) enc += String.fromCharCode(c);
        else if (c < 0x800) enc += String.fromCharCode(0xC0 + (c >> 6), 0x80 + (c & 0x3F));
        else if (c < 0x10000) enc += String.fromCharCode(0xE0 + (c >> 12), 0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
        else enc += String.fromCharCode(0xF0 + (c >> 18), 0x80 + (c >> 12 & 0x3F), 0x80 + (c >> 6 & 0x3F), 0x80 + (c & 0x3F));
    }
    return enc;
}

function removeNortonsAds(responseText) {
    var start = responseText.indexOf("<script language=\"JavaScript\">");
    if(start != -1) {
        var end = responseText.indexOf("</script>", start) + "</script>".length;
        var firstPart = responseText.substr(0, start - 1);
        var lastPart = responseText.substr(end, responseText.length - 1);
        responseText = firstPart + lastPart;
    }
    return responseText;
}

function light_ajax_call_iframe(url, functionName, params) {
    document.light_ajax_call_cleanup = light_ajax_call_cleanup;
    if (typeof params != "object") {
        params = [params];
    }

    var divv = document.createElement('DIV');
    var iframeId = "laj_"+functionName+(new Date().getTime());
    var ifraStr = "<IFRAME id="+iframeId+" name="+iframeId+" style='display: none;'/>";
    divv.innerHTML = ifraStr;
    document.body.appendChild(divv);
    var form = document.createElement('FORM');
    document.body.appendChild(form);
    form.action = url;
    form.method = "POST";
    form.setAttribute("target", iframeId)
    form.setAttribute("id", iframeId+"_form");
    form.style.display = "none";
    form.caller_window = window;
    form.appendChild(__create_hidden_field("name", functionName));
    for (var i=0; i < params.length; i++) {
        form.appendChild(__create_hidden_field("sp", params[i]));
    }
    form.appendChild(__create_hidden_field("_wrap_method", "iframe_call"));
    form.appendChild(__create_hidden_field("_iframe_id", iframeId));
    //alert(form.outerHTML+ " ifra="+divv.outerHTML);
    form.submit();
}

function light_ajax_call_cleanup(iframe_id, resultActions) {
    var ifra = document.getElementById(iframe_id);
    ifra.parentNode.removeChild(ifra);
    var form = document.getElementById(iframe_id+"_form");
    form.parentNode.removeChild(form);
    var thatWindow = form.caller_window;
    //alert("calling eval:"+resultActions);
    try {
        thatWindow.eval(resultActions);
    } catch (exc) {
        alert("eval exc:"+exc);
    }
}

function light_ajax_call(url, functionName, params) {
        if (typeof params != "object") {
            params = [params];
        }
        var req = construct_request();
        req.open("POST", url, true);
        req.onreadystatechange =  function() {
        if (req.readyState == 4 && req.status == 200) {
            var responseText = req.responseText;

            responseText = removeNortonsAds(responseText);
            responseText = removeNortonsAds(responseText);

            var dom;
            if (responseText.indexOf("<response>") < 0) {
                alertW(responseText);
                return;
            } else if (responseText.indexOf("<exception>") != -1) {
                var b = responseText.indexOf("<exception>");
                var e = responseText.indexOf("</exception>");
                var exceptionStack = req.substr(b+11,e);
                alertW(exceptionStack);
            } else {
                dom = lib_parse_request_xml(req, responseText);
            }
            var responseElem = get_element_by_tag_name(dom, 'response');
            var children = responseElem.getElementsByTagName('script');
            for (var i = 0; i < children.length; i++) {
                var tag = children.item(i);
                handle_script(tag);
            }
        }
     }
     req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
     var sreq = "name=" + functionName;
     for (var i=0; i < params.length; i++) {
         var param = params[i];
         sreq = sreq + "&sp=" + encodeURIComponent(param);
     }
     req.send(sreq);
}

//Ajax
function send_ajax_request (id, nvpairs, action, async) {
        if(!async)
        {
            async = false;
            if(document._ajaxRequestInProgress)
            {
                return false;
            }
            document._ajaxRequestInProgress = true;
        }
        try {
            var req = construct_request();
            if(async)
            {
                document._ajaxRequestMap[id] = req;
            }
            var reqArgs = {id : id, async : async};
            panraven.event.publish("/ajaxCallStarted", {request: req, regionId: reqArgs.id, reqArgs: reqArgs});

            req.open("POST", action, true);
            req.onreadystatechange =  function() {
            if(reqArgs.async && document._ajaxRequestMap[reqArgs.id] != req)
            {
                return;
            }
            if (req.readyState == 4 && req.status == 200) {
                //alert("receive="+req.id);
                var responseText = req.responseText;

                responseText = removeNortonsAds(responseText);
                responseText = removeNortonsAds(responseText);

                if (responseText.indexOf("</response>") < 0) {
                    //alertW(req.responseText);
                    document.documentElement.innerHTML = find_error_text(responseText);
                } else if (responseText.indexOf("<exception>") != -1) {
                    var b = responseText.indexOf("<exception>");
                    var e = responseText.indexOf("</exception>");
                    var exceptionStack = responseText.substr(b+11,e);
                    alertW(exceptionStack);
                } else {
                    dom = lib_parse_request_xml(req, responseText);
                    document.ajaxLog += "\nAJAX RESPONSE:\n---------------\n"+responseText+"\n";
                    var processResponse = true;
                    if (reqArgs.responseHandler) {
                        processResponse = eval(reqArgs.responseHandler).apply(this, [{request: req, regionId: reqArgs.id, reqArgs: reqArgs}]);
                    }
                    if (processResponse && !copy_from_ajax_response(dom)) {
                        alertW(responseText);
                        //document.documentElement.innerHTML = req.responseText;
                    }
                }
                panraven.event.publish("/ajaxCallProcessed", {request: req, regionId: reqArgs.id, reqArgs: reqArgs});
            } else {
                //alert("ajax_call_onchange_state: "+req.readyState+" status="+req.status);
            }
            }
        } finally {
            if(!reqArgs.async) document._ajaxRequestInProgress = false;
        }
    req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    var sreq = "";
    for(var i=0; i < nvpairs.length; i+=2) {
        if (sreq.length > 0) {
            sreq = sreq + "&";
        }
        var n = nvpairs[i];
        var v = encodeURIComponent(nvpairs[i+1]);
        sreq = sreq + n + "=" + v;
//        prdebug("ajax_call: n="+n+" v="+v);
    }
    req.send(sreq);

    return true;
    //alert("send="+req.id)
}

function lib_parse_request_xml(req, escapedResponseText) {
    var dom = req.responseXML;

    if (window.ActiveXObject) {
        var xmlDoc = panraven.isIE7 ? document.createElement("xml") : new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async="false";
        xmlDoc.loadXML(escapedResponseText);
        dom = xmlDoc;
    }

    if (dom == null) {
        try {
            var parser = new DOMParser();
            dom = parser.parseFromString(escapedResponseText,"text/xml");
        } catch (e) {
           alertW(e);
        }
    }

    return dom;
}
//End of Ajax

//Ajax Call
function ajax_call(regionId, regionIdPath, frmName, outerFrmName, arg1, arg2, namesArray, async, nvs_init)
{
    if (namesArray.length == 0) {
        namesArray = collect_all_form_visible_field_names(outerFrmName);
    }
    var names = namesArray.split(',');
    refresh_region(regionId, regionIdPath, frmName, arg1, arg2, names, async, nvs_init)
}
//End of Ajax Call

//Region refresh
function addFormComponentsFromNode(list, node) {
    var inputs = node.getElementsByTagName("input");
    if (!inputs) inputs = new Array();
    for (var i in inputs) {
        addFormComponents(list, inputs[i]);
    }

    var selects = node.getElementsByTagName("select");
    if (!selects) selects = new Array();
    for (var i in selects) {
        addFormComponents(list, selects[i]);
    }

    var textareas = node.getElementsByTagName("textarea");
    if (!textareas) textareas = new Array();
    for (var i in textareas) {
        addFormComponents(list, textareas[i]);
    }
}

function addFormComponents(list, component) {
    var checkable = component.type == 'checkbox' || component.type == 'radio';
    if (component.value != undefined && (checkable && component.checked || !checkable)) {
        list.push(component.name);
        list.push(component.value);
    }
}

function refresh_region(regionId, regionIdPath, frmName, arg1, arg2, names, async, nvs_init)
{
    var frm = find_form(frmName);
    var nvs = dojo.lang.isArray(nvs_init) ? nvs_init : new Array();
    add_all_form_hiddens(frm, nvs);
    nvs.push('show_dialog');
    nvs.push('true');
    nvs.push('region_refresh_id');
    nvs.push(regionId);
    if (arg1 && arg1.length > 0) {
        nvs.push('region_refresh_arg1');
        nvs.push("" + arg1);
    }
    if (arg2 && arg2.length > 0) {
        nvs.push('region_refresh_arg2');
        nvs.push("" + arg2);
    }
    nvs.push('region_refresh_callId');
    nvs.push("" + regionIdPath);
    if(names)
    {
        try {
            var controls = find_controls(names, frmName);
            for (var i = 0; i < controls.length; i++) {
                var com = controls[i];
                if(com.tagName == undefined) {
                    continue;
                }
                var tagName = com.tagName.toLowerCase();
                if (tagName == 'input' || tagName == 'select' || tagName == 'textarea') {
                    addFormComponents(nvs, com);
                } else {
                    addFormComponentsFromNode(nvs, com);
                }
            }
        } catch (e) {

        }
    }
    send_ajax_request(regionId, nvs, frm.action, async);
}
//End of Region refresh

function exec_tapestry_scripts(response) {
    var children = response.childNodes;
    for (var i = 0; i < children.length; i++) {
        var elem = children[i];
        if (elem.tagName == "script") {
            handle_script(elem);
        }
    }
}

function copy_from_ajax_response(doc) {
    var response = get_element_by_tag_name(doc, "response");
    if (response == null) {
        alert("no <response> in AJAX response: " + doc);
        return false;
    }
    var error = get_element_by_tag_name(response, "error");
    if (error != null) {
        alert("<error> in AJAX response");
        return false;
    }
    var result = get_element_by_tag_name(response, "result");
    if (result == null) {
        alert("no <result> in AJAX response");
        return false;
    }
    exec_from_ajax_response(result.childNodes);
    return true;
}

function prprofile(msg) { //return;
    if (!document.globalTime || !msg) {
        document.globalTime = new Date().getTime();
    } else {
        var oldTime = document.globalTime;
        document.globalTime = new Date().getTime();
        try {
            if (console) {
                console.log(msg + " EXECUTED IN " + (document.globalTime - oldTime) + " MS");
            }
        } catch(e) {}
    }
}

function prdebug(msg) { //return;
    try {
        if (window['console']) {
            console.log(msg);
        }
        var tm = new Date().getTime();
        if (!document.prdebugtxt) {
            document.prdebugtxt = "";
            window.consoleTimeOriginX = tm;
            window.consoleCntX = 0;
        }
        msg = ""+(window.consoleCntX++)+": +"+(tm - window.consoleTimeOriginX)+"msec: "+ msg;
        window.consoleTimeOriginX = tm;
        document.prdebugtxt += msg + "\n";
        if (document.doprdebug) {
            if (!window.top.debugWindow) {
                window.top.debugWindow =
                    window.open("",
                                "Debug",
                                "left=0,top=0,width=300,height=700,scrollbars=yes,"
                                +"status=yes,resizable=yes");
                //window.top.debugWindow.opener = self;
            }
            dt = new Date().getTime();
            var doc = window.top.debugWindow.document;
            if (!doc) {
                window.top.debugWindow =
                    window.open("",
                                "Debug",
                                "left=0,top=0,width=300,height=700,scrollbars=yes,"
                                +"status=yes,resizable=yes");
            }
            doc.write(""+dt+": "+msg+"<BR/>");
        } else {
        }
    } catch (e) {

    }
}

function _dump_object(obj) {
    z = "[";
    for (x in obj) {
        z = z + " " + x + "=" + obj[x];
    }
    return z+"]";
}

function dump_object(label, obj) {
//    alert(label + "="+_dump_object(obj));
}

function get_string_value(tag) {
    var result = "";
    for (var i = 0; i < tag.childNodes.length; i++) {
        result = result + tag.childNodes[i].nodeValue;
    }
    return result;
}

function get_script_text(scri) {
    if (scri.firstChild) {
        return get_string_value(scri);
    }
    if (scri.text)
        return scri.text;
    return "" + scri.innerHTML;
}

function exec_script(t) {
    if (window.execScript) {
        return window.execScript(t);
    } else {
        return window.eval(t);
    }
}

function handle_script(tag) {
    var ih = get_script_text(tag);
    exec_script(ih);
}

function cleanup_div(target) {
    if (target.nodeName == 'IMG' || target.nodeName == 'img') {
        target.style.filter = "";
        target.src = panraven.isIE ? "/gwtresources/images/spacer.gif" : "javascript:void(0);";
    }
    for (var i = 0; i < target.childNodes.length; i++) {
        cleanup_div(target.childNodes[i]);
    }
}

function handle_div(tag) {
    var divid = tag.getAttribute("id");
    if (divid == null) return;
    var target_div = find_control(divid);
    if (target_div != null) {
        var str = get_string_value(tag);
        try {
            cleanup_div(target_div);
            target_div.innerHTML = str;
            if (tag.getAttribute("update_style") == "true") {
                target_div.style = tag.getAttribute("style");
            }
            target_div.className = tag.getAttribute("class");
        } catch (er) {
        }
    } else {
        //todo: ask San about this strange alert...
        //san: to catch programming bugs (=to avoid hiding bugs)
        alert("AJAX: target <div> not found: " + divid);
    }
}

function exec_from_ajax_response(children) {
    var dt = new Date().getTime();
    if (children != null) {
        var ids = new Array();
        for (var q = 0; q < children.length; q++) {
            var tag = children.item(q);
            if (tag.tagName == "div") {
                handle_div(tag);
                ids[ids.length] = tag.getAttribute("id");
            }
            if (tag.tagName == "script" && tag.getAttribute("skip_copy") == null) {
                handle_script(tag);
            }
        }
        panraven.event.publish("/regionsRefreshed", ids);
    }
    dt = new Date().getTime() - dt;
    //prdebug("++ exec_from_ajax_response: "+dt+" ms");
}

function construct_request() {
    try {
        req = new XMLHttpRequest;
    } catch(e) {
        req = false;
    }
    if (!req) {
        try {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                try {
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {
                    req = false;
                }
            }
        } catch(e) {
            req = false;
        }
    }
    return req;
}

function escape_nl(str) {
    //str = utf8(str);
    if (str == null)
        return "";
    var nstr = "";
    for (var i = 0; i < str.length; i++) {
        var c = str.charAt(i);
        if (c == '\n') {
            nstr = nstr + "\\n";
        } else
            if (c == '\r') {
                nstr = nstr + "\\r";
            } else
                if (c == '\\') {
                    nstr = nstr + "\\\\";
                } else {
                    nstr = nstr + c;
                }
    }
    return nstr;
}

function parsepx(pxsize) {
    var pxs = "" + pxsize;
    if (pxs.indexOf("px") == pxs.length - 2) {
        pxs = pxs.substring(0, pxs.length - 2);
    }
    if (pxs.length == 0)
        return 0;
    return Math.ceil(pxs);
}

function dialog_shown(dlgname) {
    var dialog_box = find_control("dialog_box");
    return dialog_box.style.visibility == "visible";
}

function dialog_show(dlgname) {
    var contents = find_control(dlgname);
    var dialog_box = find_control("dialog_box");
    var contents_rect = get_rect(contents);
    dialog_box.innerHTML = get_string_value(contents);
    var dlgx = (document.je_width - parsepx(contents.style.width)) / 2;
    var dlgy = (document.je_height - parsepx(contents.style.height)) / 2;
    set_location(dialog_box.id, dlgx, dlgy);
    set_size(dialog_box, parsepx(contents.style.width), parsepx(contents.style.height));
    dialog_box.style.visibility = "visible";
}

function dialog_waiting() {

}

function dialog_hide() {
    var dialog_box = find_control("dialog_box");
    if (dialog_box)
        dialog_box.style.visibility = "hidden";
}

function center_block_visible(dlg, isModal) {
    dlg.style.visibility = "hidden";
    dlg.style.display = "block";
    if (isModal) {
        var cs = get_client_size();
        var dlgs = get_rect(dlg);
        var nx = (cs.width - dlgs.width) / 2;
        var ny = (cs.height - dlgs.height) / 2;
        set_location(dlg.id, nx, ny);
    }
    dlg.style.visibility = "visible";
}

function pad(i) {
    var si = ""+i;
    while(si.length < 3) {
        si = "0"+si;
    }
    return si;
}

function pr_compare(a, b) {
    var av = a.compareValue;
    var bv = b.compareValue;
    if (av < bv) {
        return -1;
    }
    if (av > bv)
        return 1;
    return 0;
}

function pr_quicksort(a, lo, hi) {
    if (hi > lo) {
        var left = lo, right = hi, median = a.el(lo);
        while (right >= left) {
            while (pr_compare(a.el(left), median) < 0) left++;
            while (pr_compare(a.el(right), median) > 0) right--;
            if (left > right) break;
            var temp = a[left];
            a[left] = a[right];
            a[right] = temp;
            left++;
            right--
        }
        pr_quicksort(a, lo, right);
        // sort the small elements divide and conquer
        pr_quicksort(a, left, hi);
    }
}


/**
* this function MUST rewrite all form's hiddens with new values.
* PROBLEM NO 1: existing form hiddens which are not in newHiddens must be removed from form
* PROBLEM NO 2: newHiddens contain repeating hiddens (same name), this case must be handled properly.
*/
function rewrite_hiddens_with_new_values(frm, newHiddens) {
    var toRemove = new Array();
    var existingHiddens = new Array();
    //prdebug(">> enter rewrite_hiddens_with_new_values: "+newHiddens.length);


    var deletedNodes = 0, updatedNodes = 0;
    // collect form hiddens
    for (var i = 0; i < frm.elements.length; i++) {
        var el = frm.elements[i];
        if (el.getAttribute("type") != "hidden") continue;
        if (el.name == "formids" || el.name == "submitname") continue;
        var virtu = {
            name: ""+el.name,
            value: ""+el.value,
            dom: el,
            compareValue: el.name+"|"+pad(i)
        };
        existingHiddens.push(virtu);
    }

    var sortTime = new Date().getTime();

    existingHiddens.el = function(a) {
        return existingHiddens[a];
    }
    pr_quicksort(existingHiddens, 0, existingHiddens.length - 1);

    var sortTime = new Date().getTime() - sortTime;

    var sortTime1 = new Date().getTime();

    for(var i=0; i<newHiddens.length; i++) {
        newHiddens[i].compareValue = newHiddens[i][0]+"|"+pad(i);
    }
    newHiddens.el = function(a) {
        return newHiddens[a];
    }

    pr_quicksort(newHiddens, 0, newHiddens.length - 1);

    //prdebug("New hiddens (sorted):")
    for(var q=0; q<newHiddens.length; q++) {
        //prdebug("q="+q+" n="+newHiddens[q][0]+" v="+newHiddens[q][1]+" seq="+newHiddens[q].compareValue)
    }

    sortTime1 = new Date().getTime() - sortTime1;

    // single-pass
    var toAdd = new Array();
    var nhi = 0;
    var ehi = 0;
    while(ehi < existingHiddens.length || nhi < newHiddens.length) {
        if (ehi < existingHiddens.length && nhi < newHiddens.length) {
            // we are in the process
            if (existingHiddens[ehi].name == newHiddens[nhi][0]) {
                existingHiddens[ehi].dom.value = newHiddens[nhi][1];
                updatedNodes++;
                ehi++;
                nhi++;
            } else if (existingHiddens[ehi].name > newHiddens[nhi][0]) {
                toAdd.push(newHiddens[nhi]);
                nhi++;
            } else {
                if (existingHiddens[ehi].dom.parentNode) {
                    existingHiddens[ehi].dom.parentNode.removeChild(existingHiddens[ehi].dom);
                    deletedNodes++;
                }
                ehi++;
            }
            continue;
        }
        if (ehi < existingHiddens.length) {
            // remaining existing -> remove them
            if (existingHiddens[ehi].dom.parentNode) {
                existingHiddens[ehi].dom.parentNode.removeChild(existingHiddens[ehi].dom);
                deletedNodes++;
            }
            ehi++;
        }
        if (nhi < newHiddens.length) {
            toAdd.push(newHiddens[nhi]);
            nhi++;
        }
    }

    for(var i=0; i<toAdd.length; i++) {
        var nm = toAdd[i][0];
        if (nm != "submitname") {
            var hid = document.createElement("INPUT");
            hid.setAttribute("type", "hidden");
            hid.setAttribute("inhere", "yes");
            hid.setAttribute("name", nm);
            hid.setAttribute("value", toAdd[i][1]);
            frm.appendChild(hid);
        }
    }
    //prdebug("<< exit rewrite_hiddens_with_new_values: deleted: "+deletedNodes+" updated: "+updatedNodes+" added: "+toAdd.length+" sortTime: "+(sortTime+sortTime1));

}


function __create_hidden_field(name, value) {
    var hid = document.createElement("INPUT");
    hid.setAttribute("type", "hidden");
    hid.setAttribute("name", name);
    hid.setAttribute("value", value);
    return hid;
}

function old_rewrite_hiddens_with_new_values(frm, newHiddens) {
    var toRemove = new Array();
    for (var i = 0; i < frm.elements.length; i++) {
        for (var j = 0; j < newHiddens.length; j++) {
            var nm = newHiddens[j][0];
            if (frm.elements[i].name == newHiddens[j][0]) {
                toRemove.push(frm.elements[i]);
            }
        }
    }
    for (var i = 0; i < toRemove.length; i++) {
        if (toRemove[i].parentNode) {
            toRemove[i].parentNode.removeChild(toRemove[i]);
        }
    }
    for (var j = 0; j < newHiddens.length; j++) {
        frm.appendChild(__create_hidden_field(newHiddens[j][0], newHiddens[j][1]));
    }
}
/* formState, stateName, */
function old_update_all_form_state(formName, usedIds, newHiddens) {
    var frm = document.forms[formName];
    if (frm != undefined) {
        if (frm['formids'] != undefined) {
            if (frm['formids'].value != usedIds) {
                frm['formids'].value = usedIds;
            }
        }
        var submitname_hidden = find_control2(frm, "submitname");
        if (submitname_hidden == null) {
            var hid = document.createElement("INPUT");
            hid.setAttribute("type", "hidden");
            hid.setAttribute("mine", "zlo");
            hid.setAttribute("name", "submitname");
            frm.appendChild(hid);
        } else {
            submitname_hidden.value = "";
        }
        rewrite_hiddens_with_new_values(frm, newHiddens);
    } else {
        alert("Unable to update form: " + formName);
    }
}


function update_all_form_state(formName, usedIds, /* formState, stateName, */ newHiddens) {
    var frm = document.forms[formName];
    if (frm != undefined) {
        if (frm['formids'] != undefined) {
            if (frm['formids'].value != usedIds) {
                //prdebug("+++ new formids: "+usedIds);
                frm['formids'].value = usedIds;
            }
        }
        if (frm['submitname'] != undefined) {
            frm['submitname'].value = '';
        }
        rewrite_hiddens_with_new_values(frm, newHiddens);
    } else {
        //prdebug("Unable to update form: " + formName);
    }
}

/*
    adds single value. If multiple fields with this name exist,
    will do nothing. Hiddens excluded.
*/
function add_values_from_form_to_list(frm, item, nvs) {
    if (item == "") return;
    var elem = frm.elements[item];
    if (elem == undefined) {
        elem = find_control2(frm, item);
    }
    if (elem != undefined && elem != null) {
        if (elem.value && elem.name) {
            var found = false;
            for (var q = 0; q < nvs.length; q += 2) {
                if (nvs[q] == elem.name)
                    found = true;
            }
            if (!found) {
                if (elem.tagName == "SELECT") {
                    var options = elem.options;
                    for (var i = 0; i < options.length; i++) {
                        var option = options[i];
                        if (option.selected) {
                            nvs.push(elem.name);
                            nvs.push(option.value);
                        }
                    }
                } else if (elem.type == "hidden") {
                    // don't include
                } else if (elem.type == "checkbox" && elem.checked || elem.type != "checkbox") {
                    nvs.push(elem.name);
                    nvs.push(elem.value);
                }
            }
        }
    } else {
        // alert('unable to find element in form: '+item);
    }
}

function add_all_form_hiddens(form, q) {
    var items = form.elements;
    for (var x = 0; x < items.length; x++) {
        var item = items[x];
        if (item.nodeName == 'INPUT') {
            if (item.type == 'hidden' && item.name && item.value) {
                q.push(item.name);
                q.push(item.value);
            }
        }
    }
}

function collect_all_form_visible_field_names(formName) {
    var form = find_form(formName);
    var els = form.elements;
    var retval = "";
    for (var i = 0; i < els.length; i++) {
        var el = els[i];
        if (el.nodeName == 'SELECT') {
//            alert(el.nodeName);
            retval += el.name + ",";
            continue;
        }
        if (el.nodeName == 'TEXTAREA') {
            retval += el.name + ",";
            continue;
        }
        if (el.nodeName == 'INPUT') {
            if (el.type == 'hidden') {
                // they will added as all hiddens, anyway
                continue;
            }
            if (el.type == 'radio' && el.checked) {
                retval += el.name + ",";
                continue;
            }
            if (el.name) {
                retval += el.name + ",";
            }
        }
    }
    return retval;
}

function pause(numberMillis) {
    var now = new Date();
    var exitTime = now.getTime() + numberMillis;
    while (true) {
        now = new Date();
        if (now.getTime() > exitTime)
            return;
    }
}

function showDocumentContent(showAjaxResponse) {
    var contentViewer = document.createElement("div");
    contentViewer.id = "contentViewer";
    contentViewer.style.border = "1px solid black";
    contentViewer.style.backgroundColor = "white";
    contentViewer.style.position = "absolute";
    contentViewer.style.left = 0;
    contentViewer.style.top = 0;
    contentViewer.style.zIndex = 100;
    contentViewer.style.width = "100%";
    contentViewer.style.height = "300px"

    var content = document.createElement("textarea");
    content.style.border = "1px solid red";
    content.style.width = "100%";
    content.style.height = "100%";
    content.style.overflow = "auto";
    if (showAjaxResponse) {
        content.value = window.lastAjaxResponse;
    } else {
        content.value = document.body.innerHTML;
    }

    var closeButton = document.createElement("input");
    closeButton.type = "button";
    closeButton.value = "Close";
    closeButton.onclick = function() {
        var cv = document.getElementById('contentViewer');
        document.body.removeChild(cv);
    };

    contentViewer.appendChild(closeButton);
    contentViewer.appendChild(document.createElement("br"));
    contentViewer.appendChild(content);
    document.body.appendChild(contentViewer);
}

function arrayToString(array) {
    if (array) {
        var res = "";
        for (var i = 0; i < array.length; i ++) {
            res += array[i] + ",";
        }
        res = res.substring(0, res.length - 1);
        return res;
    }
    return "";
}


function alertW(text)
{
    var indexOfExcept = text.indexOf('<table class="exception-display">');
    if (indexOfExcept >= 0) {
        text = text.substring(indexOfExcept, text.indexOf('</table>', indexOfExcept)+8);
    }
    var dlg = window.open("", "dump", "height=400,width=600,status=no,toolbar=no,menubar=no,location=no,resizable=yes,scrollbars=yes");
    if (dlg) {
        if (indexOfExcept) {
            dlg.document.write(text);
            return;
        }
        dlg.document.write("");
        pre = document.createElement("pre");
        textNode = document.createTextNode(text.escape());
        pre.appendChild(textNode);
        dlg.document.body.innerHTML = "<pre>" + pre.innerHTML + "</pre>";
    } else {
        alert("\nALERTW failed, showing plain one (press F12 to see details or turn off popup blocker):\n"+text);
        console.log(text);
    }
}

function pngfix() {
    var arVersion = navigator.appVersion.split("MSIE")
    var version = parseFloat(arVersion[1])

    if ((version >= 5.5) && (document.body.filters))
    {
        for (var i = 0; i < document.images.length; i++)
        {
            var img = document.images[i]
            var imgName = img.src;
            var doit = false;
            doit = doit || (imgName.toUpperCase().substring(imgName.length - 4, imgName.length) == ".PNG");
            doit = doit || (imgName.indexOf("/img/regionPicture") != -1);
            doit = doit || (imgName.indexOf("/img/fix") != -1);
            if (doit)
            {
                var onclickHandler = img.onclick;
                var id = img.id;

                var imgID = (img.id) ? "id='" + img.id + "' " : ""
                var imgClass = (img.className) ? "class='" + img.className + "' " : ""
                var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
                var imgStyle = "display:inline-block;" + img.style.cssText
                if (img.align == "left") imgStyle = "float:left;" + imgStyle
                if (img.align == "right") imgStyle = "float:right;" + imgStyle
                if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle
                var strNewHTML = "<span " + imgID + imgClass + imgTitle
                        + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
                        + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
                        + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>"
                img.outerHTML = strNewHTML;
                if (onclickHandler && id) {
                    dojo.byId(id).onclick = onclickHandler;
                }
                i = i - 1;
            }
        }
    }
}

function checkBrowser(name) {
    return navigator.userAgent.toLowerCase().indexOf(name.toLowerCase()) > -1;
}

function isMSIE() {
    return panraven.isIE;
}

function isOpera() {
    return checkBrowser("opera");
}

function isMozilla() {
    return checkBrowser("mozilla") && !isMSIE();
}

function cancelBubble(evt) {
    if (isMozilla()) {
        if (evt == null) return;
        evt.preventDefault();
    }
    if (isMSIE()) {
        if (!evt) evt = window.event;
        if (evt == null) return;
        evt.cancelBubble = true;
        evt.returnValue = false;
    }
}

/**
   fills the event.cx (client x), event.cy (client y) and event.origin={x, y, width, height}.
   Client positions are relative to parameter 'div'
*/
function translateEvent(event, div) {
    var ex = event.clientX;
    var ey = event.clientY;
    var origin = get_rect(div);
    var cx = ex - origin.x;
    var cy = ey - origin.y;
    event.cx = cx;
    event.cy = cy;
    event.origin = origin;
}

function nvl(obj, def) {
    if (!obj) {
        return def;
    }
    return obj;
}

function getPathElement(node) {
    var str = node.nodeName;
    if (node["attributes"]) {
        str += "(";
        if (node.attributes["id"]) {
            str += " id="+node.attributes["id"].nodeValue;
        }
        if (node.attributes["class"]) {
            str += " class="+node.attributes["class"].nodeValue;
        }
        str += ")";
        str = str.replace("()","");
    }
    return str;
}

function getMyPath(node) {
    var me = getPathElement(node);
    while(node.parentNode != null && node.parentNode != undefined) {
        me = getPathElement(node.parentNode)+"/"+me;
        node = node.parentNode;
    }
    return me;
}

function px2number(maybepx) {
    if (maybepx.indexOf("px") == maybepx.length-2) {
        return maybepx.substring(0, maybepx.length-2);
    }
    return maybepx;
}

var JAVASCRIPT_PREFIX = "javascript:";

function clickLink(id) {
    var btn = dojo.byId(id);
    if (btn == null) {
        return;
    }

    if (btn.href.indexOf(JAVASCRIPT_PREFIX) == 0) {
        var methodName = btn.href.substring(JAVASCRIPT_PREFIX.length);
        methodName = decodeURIComponent(methodName);
        eval(methodName);
    }
}

/**
    id - border's id
    url - url of image for border
    x - x coordinate for border
    y - y coordinate for border
    w - width for border
    h - height for border
    type - type of border:
        0 - corner;
        1 - horizontal border;
        2 - vertical border
**/
function __createBorder(id, url, x, y, w, h, type, appender) {
    var brd = document.getElementById(id);
    var brdNotFound = false;
    if (!brd) {
        brdNotFound = true;
        brd = document.createElement("div");
        brd.id = id;
        brd.style.backgroundImage = "url(" + url + ")";
        brd.style.zIndex = 300;
        switch (type) {
            case 0: //corner
                brd.style.backgroundRepeat = "no-repeat";
                break;
            case 1: // horiz border
                brd.style.backgroundRepeat = "repeat-x";
                break;
            case 2: // vert border
                brd.style.backgroundRepeat = "repeat-y";
                break;
        }
        brd.style.position = "absolute";
        brd.style.display = "none";
    }
    brd.style.width = w + "px";
    brd.style.height = h + "px";
    brd.style.left = x + "px";
    brd.style.top = y + "px";
    if (brdNotFound) {
        if (!appender) {
            document.getElementsByTagName("body")[0].appendChild(brd);
        } else {
            appender.appendChild(brd);
        }
    }
    return brd;
}

function isTextControl(elem) {
	if (elem == undefined) {
		return false;
	}
	var tagName = elem.tagName.toLowerCase();
	return (tagName == "textarea") || (tagName == "input" && elem.type == "text");
}

function cancelBackspace(e) {
	return (e.keyCode != 8) || isTextControl(e.target);
}

function find_error_text(html) {
    var ix = html.indexOf("<table class=\"exception-display\">");
    if (ix == -1)
        return html;
    return html.substring(ix);
}

function pngFixForIE() {
    var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
    var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5 && Number(rslt[1]) < 7.0);
    if (itsAllGood) {
        for (var i=0; i<document.all.length; i++){
            var obj = document.all[i];
            var bg = obj.currentStyle.backgroundImage;
            var img = document.images[i];
            if (bg && bg.match(/\.png/i) != null) {
                img = bg.substring(5,bg.length-2);
                var offset = obj.style["background-position"];
                var repeat = obj.style["background-repeat"];
                obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + img +
                                   "', sizingMethod='scale')";
                obj.style.backgroundImage = "url('/images/spacer.gif')";
                obj.style["background-position"] = offset; // reapply
                obj.style["background-repeat"] = repeat; // reapply
            } else if (img && (img.src.match(/\.png$/i) != null || (img.src.indexOf("/img/regionPicture") != -1) || (img.src.indexOf("/img/fix") != -1))) {
                var src = img.src;
                img.style.width = img.width + "px";
                img.style.height = img.height + "px";
                img.style.filter =
                "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', sizingMethod='image')"
                img.src = "/images/spacer.gif";
            }
        }
    }
}

function pngFixObjWithChildrenForIE(node) {
    var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
    var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5 && Number(rslt[1]) < 7.0);
    if (itsAllGood) {
        pngFixObjForIE(node);
        for (var i = 0; i < node.childNodes.length; i++) {
            var child = node.childNodes[i];
            if (child.nodeType == 1) {
                pngFixObjWithChildrenForIE(child);
            }
        }
    }
}

function hasPngInIE(str) {
    var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
    var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5 && Number(rslt[1]) < 7.0);
    if (itsAllGood) {
        return str.indexOf(".png") != -1 || str.indexOf("/img/regionPicture") != -1 || str.indexOf("/img/fix") != -1;
    } else {
        return false;
    }
}

function pngFixObjForIE(obj, sizingMethod) {
    var rslt = navigator.appVersion.match(/MSIE (\d+\.\d+)/, '');
    var itsAllGood = (rslt != null && Number(rslt[1]) >= 5.5 && Number(rslt[1]) < 7.0);
    if (itsAllGood) {
        var bg = obj.currentStyle.backgroundImage;
        if (bg && bg.match(/\.png/i) != null) {
            var img = bg.substring(5,bg.length-2);
            var offset = obj.style["background-position"];
            var repeat = obj.style["background-repeat"];
            obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + img + "', sizingMethod='crop')";
            obj.style.backgroundImage = "url('/images/spacer.gif')";
            obj.style["background-position"] = offset; // reapply
            obj.style["background-repeat"] = repeat; // reapply
        } else if (obj.tagName && obj.tagName.toLowerCase() == "img" && (obj.src.match(/\.png$/i) != null || obj.src.match(/staticLowres/i))) {
            var src = obj.src;
            if (obj.width && !obj.style.width) {
                obj.style.width = obj.width + "px";
            }
            if (obj.height && !obj.style.height) {
                obj.style.height = obj.height + "px";
            }
            var sm = "sizingMethod='";
            sm += sizingMethod ? sizingMethod : "image";
            sm += "'";
            obj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"', " + sm + ")"
            obj.src = "/images/spacer.gif";
        }
    }
}

function _fireEvent (node, event) {
    if(typeof node[event] == "function") {
        var args = [node];
        for(var i = 2; i < arguments.length; i++) {
            args.push(arguments[i]);
        }
        node[event].apply(node, args);
    }
}

function reapplyCssClass(node, cssClass) {
    if (panraven.isIE6minus) {
        node.style.backgroundImage = "";
    }
    node.className = cssClass;
//    pngFixObjForIE(node);
}

function IEDomResizeAnalysis() {
    try {
        var logString="";
        for (var i=0; i<document.all.length; i++) {
            var node = document.all[i];
            if (node.currentStyle) {
                if (((node.currentStyle.width && parseInt(node.currentStyle.width) != dojo.style.getContentBoxWidth(node)
                        && node.currentStyle.width.indexOf('%') == -1 && node.currentStyle.width != "auto")
                    ||(node.currentStyle.height && parseInt(node.currentStyle.height) != dojo.style.getContentBoxHeight(node)
                        && node.currentStyle.height.indexOf('%') == -1 && node.currentStyle.height != "auto"))
                    && (!dojo.style.isPositionAbsolute(node) && HtmlUtils.isShowing(node)))
                {
                    logString+=node.tagName + ": " + node.id+", width: " + node.currentStyle.width + ", offsetWidth: " + dojo.style.getContentBoxWidth(node) +", height: " + node.currentStyle.height + ", offsetHeight: " + dojo.style.getContentBoxHeight(node) + '\n';
                }
            }
        }
        alertW(logString);
    }
    catch(e) {
        alertW(dojo.errorToString(e))
    }
}

function isImageLoaded(image) {
    if (panraven.isIE) {
        return image.readyState == "complete";
    } else {
        return image.complete;
    }
}

function isJpegSelected(elemId) {
    var elem = dojo.byId(elemId);
    var value = elem.value;
    if (value == '') {
        return true;
    }
    var extensions = [ 'jpg', 'jpeg' ];
    for (var i = 0; i < extensions.length; i++) {
        var ext = extensions[i];
        if (dojo.string.endsWith(value, ext, true)) {
            return true;
        }
    }
    elem.focus();
    alert('You can upload JPEG images only');
    return false;
}

function breakHere() {
    var x = 0;
}

function resetIt() {
    var str = ""+document.location;
    if (str.indexOf("?") != -1) {
        str += "&reset=true";
    } else {
        str += "?reset=true";
    }
    document.location = str;
}


function initTrimLabel(labelNode, requiredWidth, text) {
    if (isMSIE()) return;
    HtmlUtils.inscribeText(labelNode, "{text}", text, requiredWidth, -1);
    return;

    var labelClone = labelNode.cloneNode(true);
    labelClone.style.overflow = "visible";
    labelClone.style.width = "";

    var body = document.getElementsByTagName("body")[0];
    labelClone.style.position="absolute";
    labelClone.style.left="-1000px";
    labelClone.style.top = "-10000px";
    labelClone.id += "_clone";
    labelClone.innerHTML = text;
    body.appendChild(labelClone);
    var cloneWidth = labelClone.offsetWidth;

    if (dojo.style.getMarginBoxWidth(labelClone) > requiredWidth) {
        var textLength = text.length;
        var length = Math.floor(textLength/2);
        var interval = textLength/2;
        while (interval >= 0.5) {
            var subText = text.substring(0, length) + "...";
            labelClone.innerHTML = subText;
            interval = interval/2;
            if (dojo.style.getMarginBoxWidth(labelClone) > requiredWidth) {
                length = Math.floor(length - interval);
            } else {
                length = Math.floor(length + interval);
            }
        }
        labelNode.innerHTML = labelClone.innerHTML;
    }
    body.removeChild(labelClone);
    labelNode.title = text;
}

/*
function testCookie() {
    var testCookieName = "panraven.test.cookie";
    var testCookieValue = "yeah";
    try {
        document.cookie = testCookieName + "=" + testCookieValue;

        if (!getCookie(testCookieName)) {
            document.location='/messagepage/MessagePage.html?reason=COOKIES_REQUIRED';
            return false;
        }
//        dojo.io.cookie.setCookie(testCookieName, testCookieValue);
//        var realValue = dojo.io.cookie.getCookie(testCookieName);
//        if(!(testCookieValue == realValue)) {
//            document.location='/messagepage/MessagePage.html?reason=COOKIES_REQUIRED';
//        }
    } finally {
//        dojo.io.cookie.deleteCookie(testCookieName);
        document.cookie = testCookieName + "=" + testCookieName + ";expires=Thu, 01-Jan-1970 00:00:01 GMT";
    }
    return true;
}

function getCookie(name) {
    var allCookies = document.cookie.split(';');
    for (var i = 0; i < allCookies.length; i ++) {
        var tempCookie = allCookies[i].split('=');
        var cookieName = tempCookie[0].replace(/^\s+|\s+$/g, '');
        if (cookieName == name) {
            return tempCookie[1];
        }
    }
    return null;
}
*/

function applyPngBackground(node, src, sizingMethod) {
    if (panraven.isIE6minus) {
        node.style.backgroundImage = 'url(/images/spacer.gif)';
        var filterName = "DXImageTransform.Microsoft.AlphaImageLoader";
        if (!sizingMethod) {
            sizingMethod = "scale";
        }
        if (typeof node.filters == 'undefined' || typeof node.filters == 'unknown' || node.filters.length == 0) {
            node.style.filter = "progid:" + filterName + "(src='" + src + "', sizingMethod='" + sizingMethod + "')";
        }
        else {
            var filt = node.filters.item(filterName);
            filt.src = src;
            filt.sizingMethod = sizingMethod;
        }
    } else {
        node.style.backgroundImage = "url(" + src + ")";
    }
}

function applyPngImage(node, src, sizingMethod) {
    if (panraven.isIE6minus) {
        node.src = '/images/spacer.gif';
        var filterName = "DXImageTransform.Microsoft.AlphaImageLoader";
        if (!sizingMethod) {
            sizingMethod = "image";
        }
        if (typeof node.filters == 'undefined' || typeof node.filters == 'unknown' || node.filters.length == 0) {
            node.style.filter += "progid:" + filterName + "(src='" + src + "', sizingMethod='" + sizingMethod + "')";
        }
        else {
            var filt = node.filters.item(filterName);
            filt.src = src;
            filt.sizingMethod = sizingMethod;
        }
    } else {
        node.src = src;
    }
}

function getBrowserLeftScrollPosition() {
    return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
}

function getBrowserTopScrollPosition() {
    return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
}

function cancelKey(evt) {
    if (evt.preventDefault) {
        evt.preventDefault();
        return false;
    } else {
        evt.keyCode = 0;
        evt.returnValue = false;
        return false;
    }
}

function isNodeNotDisplayed(node, recursive) {
    if (!recursive) return !dojo.style.isDisplayed(node);
    if (!dojo.style.isDisplayed(node)) return true;
    else {
        var parent = node.parentNode;
        if (parent) {
            return isNodeNotDisplayed(parent, recursive);
        } else {
            return false;
        }
    }
}

function isParentAbsolute(node) {
    var parentNode = node.parentNode;
    if (parentNode) {
        if (parentNode.tagName && parentNode.tagName.toLowerCase() == "body") return false;
        if (dojo.style.isPositionAbsolute(parentNode)) {
            return true;
        } else {
            return isParentAbsolute(parentNode);
        }
    } else {
        return false;
    }
}

function getUrlForFlv(videoId, params) {
/*
    if( params.location && params.location == 1)
    {
        return "http://s3.amazonaws.com/panraven/" + videoId + "/" + videoId + "_" + (params.quality ? params.quality : "1") + ".flv";
    }
*/
    //todo: need to be disscussed on monday 25.02.08 (URGENT!!!!!!!!!!!!!!!!!)
    return (params.streaming ? "/flv/" : "/flv/") + videoId + "_" + (params.quality ? params.quality : "1") + ".flv";
}


function global_stopVideoPlaying() {
    if (window.storyViewerGWT) {
         window.storyViewerGWT.terminateVideo();
    }
    VideoPanel.removeExistingVideoPlayers();
}

function advancedLog() {
    try {
        // latest changes done to prevent bugs in FF2+Firebug 1.2
        if (typeof(console) == "undefined" || typeof(console.log) == "undefined") {
            if (typeof(console) == "undefined") {
                console = {}
            }
            console.log = function() {};
            console.error = function() {};
            console.warn = function() {};
        } else {
            window.oldclog = console.log;
            var consoleCnt = 0;
            window.consoleTimeOrigin = new Date().getTime();
            console.log = function(arg) {
                var tm = new Date().getTime();
                window.oldclog(""+(consoleCnt++)+": +"+(tm - window.consoleTimeOrigin)+"msec: "+ arg);
                window.consoleTimeOrigin = tm;
            }
        }
    } catch(ex) {}
}

function isFlashPlayerInstalled() {
    var flashInstalled = false;
    var flashVersion = 0;
    if (navigator.plugins && navigator.plugins.length) {
        var x = navigator.plugins["Shockwave Flash"];
        if (x) {
            flashInstalled = true;
            if (x.description) {
                flashVersion = x.description.charAt(x.description.indexOf('.') - 1);
            }
        }
        if (navigator.plugins["Shockwave Flash 2.0"]) {
            flashInstalled = true;
            flashVersion = 2;
        }

    } else if (navigator.mimeTypes && navigator.mimeTypes.length) {
        var x = navigator.mimeTypes["application/x-shockwave-flash"];
        if (x && x.enabledPlugin) {
            flashInstalled = true;
        }
    } else {
        //detect flash in IE
            try {
                var x = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
                flashInstalled = true;
                var version = x.GetVariable("$version");
                version = version.substring(version.indexOf("WIN ") + 4); //todo: do not forget to add checking for MAC

                version = version.substring(0, version.indexOf(','));
                flashVersion = parseInt(version);
            } catch (e) {}
    }
    return {flashInstalled : flashInstalled, flashVersion : flashVersion};
}

window.flashPlayerInstalled = isFlashPlayerInstalled();
window.isFlashInstalled = flashPlayerInstalled.flashInstalled && parseInt(flashPlayerInstalled.flashVersion) >= 9;

function logStartTime() {
    document.startTime = new Date().getTime();
}

function logEndTime() {
    document.endTime = new Date().getTime();
}

function logDuration() {
    logEndTime();
    return document.endTime - document.startTime;
}

function pressLink(link) {
    link = dojo.byId(link);
    if (!link.onclick || link.onclick() != false) {
        window.location=link.href;
    }
}

function showBlackBackgroundDiv() {
    var blackDiv = dojo.byId("blackBackgroundDiv");
    var height = Math.max(document.body.scrollHeight, dojo.html.getViewportHeight());
    dojo.style.setMarginBoxHeight(blackDiv, height);
    dojo.style.setMarginBoxWidth(blackDiv, dojo.html.getViewportWidth());
    dojo.style.setOpacity(blackDiv, 0.15);
    blackDiv.style.display = "block";
}

function preloadImages(urls) {
    var result = new Array();
    for (var i = 0; i < urls.length; i++) {
        var img = new Image();
        img.src = urls[i];
        result.push(img);
    }
    return result;
}

// detect whether to do inlineImageEditor (inline means we don't use iframe)
function inlineImageEditor() {
    // switch is located in JEB.html
    var metaList = document.getElementsByTagName("meta");
    for (var i = 0; i < metaList.length; i++) {
        var meta = metaList[i];
        if (meta.name == 'ImageEditorStandalone') {
            return meta.content == 'false';
        }
    }
    return false;
}

function checkAjaxAvailable() {
    var xmlHttp;
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        // Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("Probably your Internet Explorer is set to \"High\" level security.\n " +
                      "Our site works with a security level \"Medium-high\" or lower.\n " +
                      "Could you please go to Internet Option and set the security level to \"Medium-high\"?");
                return false;
            }
        }
    }
}
