// XML DOM parsing and data exchange
// (c) Copyright SimX Corporation 2010

if( typeof exchng_loaded == "undefined" || !exchng_loaded ) {

var GK_DOM = document.implementation  && document.implementation.createDocument;
var MS_DOM = document.documentElement && document.documentElement.applyElement;
var disable_dynamic = !( ( GK_DOM ) || ( MS_DOM ) );
var old_parser = false;
var wait_timer = 0;
var pgform = null;

function DynamicUpdate( pgform_, trg_name, ssl, flags, cnf, pb_delay, custom_params )
{
    // attention: trg_name==_self means switch to another component, but empty trg_name does not
    if( !disable_dynamic ) {
        if( !trg_name || trg_name == page_name || trg_name == '' ) {
            if( wait_timer ) clearTimeout(wait_timer);
            if( pb_delay ) {
                if( pb_delay < 100 ) WaitMessage(cnf); else
                    wait_timer = setTimeout( function() { wait_timer=0; WaitMessage("Please, wait..."); }, pb_delay );
            }
            pgform = pgform_;
            if( Connect( PrepareData( pgform, custom_params ), pgform.action ) ) return true;  // See AcceptData()
        }
    }
    if( (pb_delay && pb_delay < 100) && ( !trg_name.length || trg_name == '_self') ) WaitMessage(cnf);
    return false;
}


var progress_image = null;
var progress_bar_handler = null;

function WaitMessage( msg )
{
    var mhtml = "<DIV class='progressbar'>"
              + "<IMG align=absMiddle src='/Target/WebResources/rot.gif' ><SPAN>&nbsp;&nbsp;" + (msg?msg:"Processing...") + "</SPAN></DIV>"

    showPB( mhtml );
}

function CloseWaitMessage()
{
    if( wait_timer ) clearTimeout(wait_timer);
    wait_timer = null;
    hidePB();
}

function showPB(mhtml) {
    var pbar = document.getElementById("progressbar");
    if(pbar) pbar.style.display = "block";
    else {
        pbar = document.body.appendChild(document.createElement('DIV'));
        pbar.style.position = "absolute";
        pbar.id = "progressbar";
        pbar.innerHTML = mhtml;
    }
    placePB();
    window.onresize = placePB;
    window.onscroll = placePB;
}
function hidePB() {
    var pbar = document.getElementById("progressbar");
    if(pbar) pbar.style.display = "none";
    window.onresize = null;
    window.onscroll = null;
}

function placePB() {
    var pbar = document.getElementById("progressbar");
    if(pbar) {
        SetYPos(pbar, GetPageHeight(document.body) / 2 - 60 + GetYScroll());
        SetXPos(pbar, GetPageWidth(document.body) / 2 - 180 + GetXScroll());
    }
}



var user_ask_handler = null;

function AskUser( params, msg, model, cookie )
{
    var confirm_div = GetElem("confirm");
    if( !confirm_div ) {
        confirm_div = document.createElement('DIV');
        confirm_div.id = "confirm";
        document.body.appendChild( confirm_div );
    }
    user_ask_handler = $(confirm_div);
    user_ask_handler.params = params;
    user_ask_handler.cookie = cookie;
    user_ask_handler.model = model;

    var bpos = msg.indexOf( "Buttons=" );
    var prompt = bpos < 0 ? msg : msg.substring( 0, bpos );
    var mhtml = "<IMG src='/Target/Webresources/qm.png' class='confirm' style='float:left;'>"
              + "<P class='confirm'>" + prompt.replace(/[\n\r]/g,"<BR>") + "</P><BR style='clear: left;'>";

    var buttons_obj = {};
    if( bpos < 0 ) {
        buttons_obj['Ok'] = function() { UserAnswered(1) };
        buttons_obj['Cancel'] = function() { UserAnswered(0) };
    }
    else {
        var buttons = msg.substr( bpos + 8 ).split( "," );
        for( var i = 0; i < buttons.length; i++ ) {
            var b_val = buttons[i].replace("'", "&apos;");
            b_text = b_val.charAt( 0 ) == '_' ? b_val.substr( 1 ) : b_val;
            buttons_obj[b_text] = new Function( "UserAnswered('" + b_val + "');" );
        }
    }
    confirm_div.innerHTML = mhtml;
    user_ask_handler.dialog({ autoOpen: true, resizable: false, minWidth: 380, minHeight: 160, 
        buttons: buttons_obj, title: "Question" });
}

function UserAnswered(res)
{
    if( user_ask_handler ) {
        var to_send = user_ask_handler.params + "&UCModel=" + user_ask_handler.model + "&UCCookie=" + user_ask_handler.cookie + "&UCResult=" + res;
        Connect( to_send );
        user_ask_handler.dialog('close');
        user_ask_handler.dialog('destroy');
        user_ask_handler = null;
    }
}

function CheckAddSep( params )
{
    if( params.length!=0 && params.charAt(params.length-1)!='&' )
        params += "&";
    return params;
}

function AddOrReplace( url, param, value )
{
    var re = new RegExp( "(^|[?&])" + param + "=([^&]*|$)");
    if( re.test( url ) )
        url.replace( re, "$1" + param + "=" + value );
    else
        url = CheckAddSep( url ) + param + "=" + value;
    return url;
}

function NestedFormsAlert() {
    alert("Error in the page layout.\nProbably forms are nested.\nPlease contact the site administrator.");
}

function PrepareData( pgform, custom_params )
{
    if( console.time ) console.time("Prepare data");
    if( !pgform ) pgform = document.forms[0];
    if( pgform.cmode.length || typeof pgform.cmode.value == "undefined" ) {
        NestedFormsAlert();
        return null;
    }
    pgform.cmode.value = "2";
    var ct = new Date();
    var keys = "";
    if( window.event ) {
        if( window.event.altKey   ) keys += "Alt.";
        if( window.event.ctrlKey  ) keys += "Ctrl.";
        if( window.event.shiftKey ) keys += "Shift.";
    }
    URL_string = 'ts=' + ct.getMinutes()+ct.getSeconds() + "&cmode=2&comp=" + pgform.comp.value +
                "&sbmctr=" + pgform.sbmctr.value + "&recid=" + pgform.recid.value +
                "&uiinfo=" + pgform.uiinfo.value + "&keys=" + keys +
                "&sinfo="  + pgform.sinfo.value  + "&mvars=" + pgform.mvars.value  + "&extra=" + escape(pgform.extra.value) + "&";
    if( custom_params && custom_params.length ) URL_string += custom_params + "&";
    var inputs = pgform.getElementsByTagName("INPUT");
    for( var i = 0; i < inputs.length; i++ ) {
        var elem = inputs.item(i);
        if( elem && elem.form == pgform ) {
            if( elem.id.charAt(0) == 'C' ) {
                for( var r in recids ) {
                    if( elem.name.indexOf(r) >= 0 )
                        dirty_too[elem.name] = true;
                }
            }
            else
            if( elem.id.charAt(0) == 's' ) {
                if( typeof ctrl_drty[elem.id] != "undefined" ) {
                    if( ctrl_drty[elem.id] ) dirty_too[elem.id] = true;
                }
                else
                    for( var name in ctrl_drty ) {  // set by server-side
                        if( ctrl_drty[name] == true && elem.id.indexOf(name) >= 0 )
                            dirty_too[elem.id] = true;
                    }
            }
        }
    }
    var selects = pgform.getElementsByTagName("SELECT");
    for( var i = 0; i < selects.length; i++ ) {
        var elem = selects.item(i);
        if( elem && elem.form == pgform ) {
            for( var name in ctrl_drty ) {  // set by server-side
                if( ctrl_drty[name] == true && elem.name.indexOf(name) >= 0 )
                    dirty_too[elem.name] = true;
            }
        }
    }
    var textareas = pgform.getElementsByTagName("TEXTAREA");
    for( var i = 0; i < textareas.length; i++ ) {
        var elem = textareas.item(i);
        if( elem && elem.form == pgform ) {
            for( var name in ctrl_drty ) {  // set by server-side
                if( ctrl_drty[name] == true && elem.name.indexOf(name) >= 0 )
                    dirty_too[elem.name] = true;
            }
        }
    }
    for( var dirty in dirty_too ) {
        var elem = GetElem( dirty );
        if( elem && elem.form == pgform )
            URL_string = addData( URL_string, elem );
    }
    dirty_too = new Array;
    if( console.timeEnd ) console.timeEnd("Prepare data");
    return URL_string;
}

function addData( URL_string, elem )
{
    if( elem.tagName == "SELECT" ) {
        var c = 0;
        for( var o = 0; o < elem.options.length; o++ ) {
            if( elem.options[o].selected )
                URL_string += elem.id + "=" + escape( elem.options[o].value ) + "&";
        }
    }
    else
    if( elem.tagName == "TEXTAREA" && elem.className.indexOf( "richedit" ) >= 0 ) {
        if( tinyMCE ) {
            var rich_ed = tinyMCE.getInstanceById( elem.id );
            if( rich_ed && rich_ed.getContent )
                URL_string += elem.name + "=" + escape( rich_ed.getContent() ) + "&";
            else
            if( tinyMCE.getContent )
                URL_string += elem.name + "=" + escape( tinyMCE.getContent() ) + "&";
        }
    }
    else {
        var elem_type = elem.type ? elem.type.toLowerCase() : null;
        if( elem_type && elem_type == 'checkbox' ) {
            if( elem.value == "1" )
                URL_string += elem.name + "=" + ( elem.checked ? "1" : "0" ) + "&";
            else if( elem.checked )
                URL_string += elem.name + "=" + elem.value + "&";
        }
        else
        if( elem_type && elem_type == 'radio' )
            URL_string += elem.id + "=" + ( elem.checked ? "1" : "0" ) + "&";
        else
        if( elem.name )
            URL_string += elem.name + "=" + escape( elem.value ) + "&";
    }
    return URL_string.replace( /\+/g, "%2B" );
}

function createDOMDocument()
{
    if( GK_DOM )
        return document.implementation.createDocument("", "", null);
    if( window.ActiveXObject ) {
        try { return new ActiveXObject("Msxml2.DOMDocument.4.0"); } catch(e) { }
        try { var x = new ActiveXObject("Msxml2.DOMDocument.6.0");
              x.resolveExternals = true; return x;                } catch(e) { }
        try { return new ActiveXObject("Msxml2.DOMDocument.3.0"); } catch(e) { }
        old_parser = true;  // old parser does not support the new xslt namespace for transformation
        try { return new ActiveXObject("Msxml2.DOMDocument.2.6"); } catch(e) { }
        try { return new ActiveXObject("Msxml2.DOMDocument");     } catch(e) { }
        try { return new ActiveXObject("Microsoft.XMLDOM");       } catch(e) { }
    }
    alert("Unable to create a DOM Document object;");
    return null;
}
function createFreeThreadedDOMDocument()
{
    try { return new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0"); } catch(e) { }
    try { var x = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
          x.resolveExternals = true; return x;                            } catch(e) { }
    try { return new ActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0"); } catch(e) { }
    old_parser = true;  // old parser does not support the new xslt namespace for transformation
    try { return new ActiveXObject("Msxml2.FreeThreadedDOMDocument.2.6"); } catch(e) { }
    try { return new ActiveXObject("Msxml2.FreeThreadedDOMDocument");     } catch(e) { }
    try { return new ActiveXObject("Microsoft.FreeThreadedXMLDOM");       } catch(e) { }
    alert("Unable to create a DOM Document object;");
    return null;
}
function createXSLTemplate()
{
    try { return new ActiveXObject("Msxml2.XSLTemplate.4.0"); } catch(e) { }
    try { return new ActiveXObject("Msxml2.XSLTemplate.6.0"); } catch(e) { }
    try { return new ActiveXObject("Msxml2.XSLTemplate.3.0"); } catch(e) { }
    old_parser = true;
    try { return new ActiveXObject("Msxml2.XSLTemplate.2.6"); } catch(e) { }
    try { return new ActiveXObject("Msxml2.XSLTemplate");     } catch(e) { }
    try { return new ActiveXObject("Microsoft.XSLTemplate");  } catch(e) { }
    alert("Unable to create an XML HTTP object;");
    return null;
}

function Connect( URL_encoded_data, url_to_connect )
{
    if( !URL_encoded_data ) return null;
  try {
  if( console.time ) console.time("request XML");
    var xmlhttp = createXMLHTTP();
    if( xmlhttp ) {
        xmlhttp.open("POST", url_to_connect ? url_to_connect : pgform.action, true);
        xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xmlhttp.onreadystatechange = function() { if( HttpReqCallback( xmlhttp ) ) xmlhttp=null; };
        xmlhttp.send( URL_encoded_data );
        return true;
    }
    else
    if( URL_encoded_data.length < 1000 ) {  // GET limit
        var xmlDoc = createDOMDocument();
        if( xmlDoc ) {
            xmlDoc.onreadystatechange = function() { XMLLoadCallback( xmlDoc ); };
            xmlDoc.load( pgform.action + '?' + URL_encoded_data );
            return true;
        }
    }
    return false;
  }
  catch( e ) {
    CloseWaitMessage();
    console.error( "Connect() exception: " + e.message );
  }
  return false;
}



function XMLLoadCallback( xmlDoc )
{
    if( typeof xmlDoc == "object" && xmlDoc.readyState == 4 ) AcceptData( xmlDoc );
    return false;
}

function HttpReqCallback( xmlhttp )
{
    if( typeof xmlhttp == "object" && xmlhttp.readyState == 4 ) {
        if( xmlhttp.status == 200 ) {
            xmlhttp.onreadystatechange = function() {};
            var xmlDoc = xmlhttp.responseXML;
            if( xmlDoc ) {
                if( console.timeEnd ) console.timeEnd("request XML");
                if( console.profile ) console.profile();
                AcceptData( xmlDoc );
                if( console.profile ) console.profileEnd();
                return true;
            }
            else
                window.status = "No valid data returned.";
        }
        else
            window.status = "Problem with request. Status=" + xmlhttp.status;
        CloseWaitMessage();
    }
    return false;
}

var p = false;

function AcceptData( xmlDoc )
{
    p = window.console && location.search.indexOf("$profile$") > 0;
    if(p) console.info('AcceptData()');
    if( !pgform ) pgform = document.forms[0];
    if( !xmlDoc || !xmlDoc.documentElement ) {
        window.status = "Dynamic data update failed. Trying full page refresh.";
        if( PrepareToRefresh() )
        	RealSubmit(pgform, "_self");
        return;
    }
    window.status = "Data received. Processing...";
    var top_elem = xmlDoc.documentElement;
    if( top_elem.nodeName == 'refreshdata' ) {
        var cookie_nodes = xmlDoc.getElementsByTagName('cookie');
        for( var i = 0; i < cookie_nodes.length; i++ )
            document.cookie=cookie_nodes.item(i).firstChild.nodeValue;
        var url = top_elem.getAttribute('redirect');
        if( url ) {
            procErrs( xmlDoc );

            var target = top_elem.getAttribute('target');
            if( target )
                top.frames[target] = url;
            else
                window.location = url;
            window.status = "";
            document.body.style.cursor='auto';
            return;
        }
        var uiinfo_nodes = xmlDoc.getElementsByTagName('uiinfo');
        var mvars_nodes = xmlDoc.getElementsByTagName('mvars');

        var sinfo_nodes = xmlDoc.getElementsByTagName('sinfo');
        if( sinfo_nodes.length )
            var force_sinfo = sinfo_nodes.item(0).getAttribute('force_sinfo') == "true";
        if( mvars_nodes.length || uiinfo_nodes.length || force_sinfo ) {
            if(  mvars_nodes.length ) var mvars  =  mvars_nodes.item(0).firstChild.nodeValue;
            if( uiinfo_nodes.length ) var uiinfo = uiinfo_nodes.item(0).firstChild.nodeValue;
            if( force_sinfo && sinfo_nodes.length ) {
                var sinfo = sinfo_nodes.item(0).firstChild.nodeValue;
                storeSinfo( sinfo );
            }
            for( var i = 0; i < document.forms.length; i++ ) {
                if( sinfo )  document.forms[i].sinfo.value=sinfo;
                if( uiinfo ) document.forms[i].uiinfo.value=uiinfo;
                if( mvars )  document.forms[i].mvars.value=mvars;
            }
        }
        if(p) console.info('Search for errors');
        try {
            procErrs( xmlDoc );
            if(p) console.info('Begin items processing');

            var for_flowover = top_elem.getAttribute('for_flowover');
            if( for_flowover ) {
                var elem = $('#'+for_flowover)[0];
                if( !elem ) {
                    alert("Unable to find the flowover container element! Please report to the devlopers.");
                    return;
                }
                var comp_name = top_elem.getAttribute('include');
                var lsp = pgform.action.lastIndexOf('/');
                var ldp = pgform.action.lastIndexOf('.');
                var url = pgform.action.substring( 0, lsp );
                var ste = pgform.action.substring( lsp+1, ldp );
                url += "/" + res_dir + ste + '_' + comp_name + "_inc.xsl";
                ProcBlock( top_elem, elem, url );
                var fo_forms = elem.getElementsByTagName( "FORM" );
                var fo_uiinfo = null;
                for( var i = 0; i < fo_forms.length; i++ ) {
                    fo_forms[i]["comp"].value = window.page_name;
                    if( !fo_uiinfo ) fo_uiinfo = fo_forms[i]["uiinfo"].value;
                }
                var page_uiinfo = document.forms[0].uiinfo.value;
                var fo_hn = top_elem.getAttribute('flowover_hn');
                var new_uiinfo = page_uiinfo.replace( new RegExp( fo_hn + ":.+," ), "" ) +
                    fo_hn + ":" + comp_name + "," + fo_uiinfo;
                setUiInfo( new_uiinfo );
                return true;
            }
            else {
                if( !ProcContainer( top_elem, document ) ) {
                    if( PrepareToRefresh() )
                	    RealSubmit(pgform,"_self");
                    return;
                }
                if(p) console.info('XML processing done');
                RefreshControls();
                if(p) console.info('RefreshControls done');

                var js_nodes = xmlDoc.getElementsByTagName('javascript');
                for( var i = 0; i < js_nodes.length; i++ ) {
                    var str = js_nodes.item(i).firstChild.nodeValue.replace( /`/g, "'" );
                    eval( str );
                }
            }
        }
        catch( e ) {
            CloseWaitMessage();
            ShowException( e );
            if( PrepareToRefresh() )
            	RealSubmit(pgform,"_self");
        }
        try {
            if( top_elem.getAttribute('active') == "true" ) {
                var act_comp_id = top_elem.getAttribute('comp');
                if( act_comp_id != page_name ) {
                    Update( top_elem.getAttribute('models'), act_comp_id );
                }
                var top_target_frame = top;
                if( !top.Update ) {
                    for( var i=0; i< top.frames.length; i++ ) {
                        if( top.frames[i].Update && top_target_frame!=window ) {
                            top_target_frame = top.frames[i];
                            break;
                        }
                    }
                }
                try {
                    var models_attr = top_elem.getAttribute('models');
                    if( models_attr && models_attr.length ) {
                        var caller_id = document.forms[0].name;
                        if( top_target_frame.Update && top_target_frame!=window )
                            top_target_frame.Update( models_attr, caller_id );
                        if( window.opener && window.opener.Update )
                            window.opener.Update( models_attr, caller_id );
                        if( ow && ow.Update ) 
                            ow.Update( models_attr, caller_id );
                    }
                }
                catch(e) {}
            }
            if(p) console.info('XML:'+XML2str( xmlDoc ) );
        }
        catch( e ) {
            ShowException( e );
        }
        CloseWaitMessage();
    }
    else
    if( top_elem.nodeName == 'Confirm' ) {
        CloseWaitMessage();
        var prompt = "", cookie = "", model = "", params = "";
        var items = top_elem.childNodes;     // hierarhy
        for( var i = 0; i < items.length; i++ ) {
            var nn = items.item(i).nodeName;
            if( nn == "Model" )  model  = items.item(i).firstChild.nodeValue; else
            if( nn == "Prompt" ) prompt = items.item(i).firstChild.nodeValue; else
            if( nn == "Cookie" ) cookie = items.item(i).firstChild.nodeValue; else
            if( nn == "Params" ) params = items.item(i).firstChild.nodeValue;
        }
        AskUser( params, prompt, model, cookie );
    }
    if( top_elem.nodeName == 'session' ) {
        var sinfo = top_elem.getAttribute('active');
        console.info("Here is the session clone: " + sinfo + ", view name=" + top.name + 
            ", current session=" + document.forms[0].sinfo.value );
        top.name = sinfo.replace(/-/g, '_');
        if( document.forms[0].sinfo.value != sinfo )
            replaceSinfo( sinfo );
    }
    document.body.style.cursor='auto';
    window.status = "Done";
}

function ProcContainer( node, ctr_elem, iter )
{
    try {
        var items = node.childNodes;
        for( var i = 0; i < items.length; i++ ) {
            if( items.item(i).nodeName == "item" ) {
                if( !ProcNode( items.item(i), ctr_elem, iter ) ) 
                    return false;
            }
            else
            if( items.item(i).nodeName == "control" ) {
                if( !ProcControl( items.item(i), ctr_elem, iter ) ) 
                    return false;
            }
        }
        return true;
    }
    catch( e ) {
        ShowException( e );
    }
    return false;
}

function GetElemFrom( from, id )
{
    if( from.id == id ) return from;
    if( from.all ) return from.all.item( id );

    var  global_first = document.getElementById( id );
    if( !global_first ) return null;
    var same = from.getElementsByTagName( global_first.tagName );
    for( var i=0; i<same.length; i++ )
        if( same[i].id == id ) return same[i];
    return null;
}

function ProcControl( control_node, ctr_elem, iter )
{
    var control_type = control_node.getAttribute("type");
    if( control_type == "text_field" ) {
        ProcTextField( control_node, ctr_elem, iter  );
    }
    return true;
}

function ProcTextField( control_node, ctr_elem, iter  )
{
    var items = control_node.getElementsByTagName( "item" );
    for( var i = 0; i < items.length; i++ ) {
        if( items.item(i).nodeName == "item" ) {
            if( !ProcNode( items.item(i), ctr_elem, iter ) ) return false;
        }
    }
    return true;
}

function ProcNode( item, ctr_elem, iter )
{
    try {
        window.status += '.';
        var nochnge_attr = item.getAttribute("nochange");
        if( !nochnge_attr || nochnge_attr != 'true' ) {
            var pertains_to = item.getAttribute("pertains_to_same");
            var elem_id = pertains_to ? pertains_to : item.getAttribute("control_id");

            var iter_elem_id = elem_id + ( iter ? '_' + iter : '' );
            var elem = GetElemFrom( ctr_elem, iter_elem_id );
            if( !elem ) // heirarchy is gone?
                elem = $('#'+iter_elem_id)[0];

            if(p) console.info('Item ' + iter_elem_id );
            if( elem ) {
                if( item.getAttribute('iterator') ) {
                    return ProcIterator( elem_id, item, elem, iter );
                }
                var dirty_flag = item.getAttribute('dirty');
                if( dirty_flag && dirty_flag == 'true' )
                    ctrl_drty[elem_id] = true;
                var attr_name = item.getAttribute('attr');
                if( attr_name && attr_name.length )
                    return ProcAttr( attr_name, item, elem );
                if( item.getAttribute('panel') )
                    return ProcContainer( item, elem, iter );
                var item_type = item.getAttribute('type');
                if( item_type ) {
                    if( item_type == 'text/javascript' ) {
                        if( item.firstChild ) eval( item.firstChild.nodeValue );
                        return true;
                    }
                    if( item_type == 'text/html' ) {
                        if( item.firstChild ) {
                            if( elem.tagName == "TEXTAREA" && elem.className.indexOf( "richedit") >= 0 ) {
                                if( tinyMCE ) {
                                    var rich_ed = tinyMCE.getInstanceById( elem.id );
                                    if( rich_ed && rich_ed.setContent )
                                        rich_ed.setContent( item.firstChild.nodeValue );
                                    else
                                    if( tinyMCE.setContent )
                                        tinyMCE.setContent( item.firstChild.nodeValue );
                                }
                                return true;
                            }
                            elem.innerHTML = (ua.ie?'<i class="hidden">1</i>':'')+item.firstChild.nodeValue;
                            EvalScripts( elem, true );
                        }
                        else
                            elem.innerHTML = "";
                        return true;
                    }
                    if( item_type == 'text/plain' ) {
                        var data_str = item.firstChild ? item.firstChild.data : '';
                        if( elem.innerHTML != data_str ) {
                            Effect( elem );
                            elem.innerHTML = data_str;
                        }
                        return true;
                    }
                    if( item_type == 'table' ) {
                        var tbody_obj = GetElem( elem.id + "_tbody" );
                        if( tbody_obj && TableScr.IsNumRowsColumnsSame( item.childNodes, tbody_obj.rows ) )
                            return TableScr.UpdateTable( elem, item.childNodes, item.getAttribute('recid') );
                        else
                            item_type = 'block';
                    }
                    if( item_type == 'grid' )
                        return UpdateTableGrid( elem, item.childNodes );
                    if( item_type == 'options' )
                        return ProcOptions( item, elem );
                    if( item_type == 'bar' ) {
                        var size = item.getAttribute('value');
                        if( item.getAttribute('vertical') )
                            elem.style.height = size;
                        else
                            elem.style.width  = size;
                        return true;
                    }
                    if( item_type == 'style' ) {
                        var val = item.getAttribute('value');
                        if( val.length || item.getAttribute('override') )
                            elem.style[item.getAttribute('style')] = val;
                        return true;
                    }
                    if( item_type == 'container' ) {
                        if( item.getAttribute('new') == 'true' ) {
                            var lsp = pgform.action.lastIndexOf('/');
                            var ldp = pgform.action.lastIndexOf('.');
                            var url = pgform.action.substring( 0, lsp );
                            var ste = pgform.action.substring( lsp+1, ldp );
                            url += "/" + res_dir + ste + '_' + item.getAttribute('include')  + "_inc.xsl";
                            return ProcBlock( item, elem, url );
                        }
                        else
                            return ProcContainer( item, elem, iter );
                    }
                    if( item_type == 'conditional' ) {
                        var visible = item.getAttribute('visible');
                        if( !visible || visible == 'false' ) {
                            elem.style.display = 'none';
                            return true;
                        }
                        else {
                            elem.style.display = elem.tagName == 'SPAN' ? 'inline' : 'block';
                            if( elem.hasChildNodes() && (elem.childNodes.length != 1 || elem.firstChild.nodeType != 8 ) )
                                return ProcContainer( item, elem, iter );
                        }
                    }
                    if( item_type == 'report' || item_type == 'crosstab' || item_type == 'model_chunk'  ||
                        item_type == 'conditional' || item_type == 'container' ||
                        item_type == 'block' ) {
                        var url = pgform.action;
                        var lsp = url.lastIndexOf('/');
                        url = url.substring( 0, lsp );
                        url += "/" + res_dir + elem_id + ".xsl";
                        return ProcBlock( item, elem, url );
                    }
                }
            }
        }
        return true;
    }
    catch( e ) {
        ShowException( e );
    }
    return false;
}

function ProcAttr( attr_name, item, elem )
{
    try {
        var attr_value = item.getAttribute('value');
        if( elem.tagName == 'INPUT' && attr_name == 'value' ) {
            var inp_type = elem.type.toLowerCase();
            if( inp_type == 'checkbox' || inp_type == 'radio' ) {
                elem.checked = attr_value == "1" ? true : false;
                return true;
            }
        }
        if( attr_name == 'src' ) {
            Effect( elem );
            elem.src = attr_value;
            return true;
        }
        if(attr_name.toLowerCase() == 'value')
            elem.value=attr_value;
        else {
            if( attr_name == "className" )
                elem.className = attr_value;
            else
            if( item.getAttribute('type')=='boolean' )
                elem[attr_name]=IsTrue(attr_value);
            else
                elem[attr_name]=attr_value;
        }
        return true;
    }
    catch( e ) {
        ShowException( e );
    }
    return false;
}

function copyAttrs( from, to )
{
    for( var i = 0; i < from.attributes.length; i++ ) {
        to[from.attributes.item(i).nodeName] = from.attributes.item(i).nodeValue;
    }
}

function procErrs( xmlDoc )
{
    var error_nodes = xmlDoc.getElementsByTagName('ErrorMsg');
    if( error_nodes.length ) {
        CloseWaitMessage();
        var error_node  = error_nodes.item(0);
        alert( error_node.firstChild ? error_node.firstChild.nodeValue : '' );
    }
}

function ProcIterator( elem_id, item, ctr_elem, iter )
{
    try {
        if(p) console.info('ProcIterator()');

        window["iter_editable_" + elem_id] = item.getAttribute('editable') == "true";

        var i = 0;
        var pref = iter ? iter + ':' : '';
        var xslt_processor;
        var new_content = new Array;
        for( ; i < item.childNodes.length; i++ ) {
            if(p) console.info('iteration ' + i);
            if( item.childNodes[i].nodeType != 1 || item.childNodes[i].tagName != 'row' ) continue;
            var sfx = pref + (i+1);
            var iter_elem_id = elem_id + '_' + sfx;
            var row_elem = GetElemFrom( ctr_elem, iter_elem_id );
            if( row_elem ) {
                if( !ProcContainer( item.childNodes[i], row_elem, sfx ) ) 
                    return false;
            }
            else {
                var url = pgform.action;
                var lsp = url.lastIndexOf('/');
                url = url.substring( 0, lsp );
                url += "/" + res_dir + elem_id + ".xsl";
                if( MS_DOM ) {
                    xslt_processor = ProcBlockCache( item.childNodes[i], new_content, url, xslt_processor );
                    if( !xslt_processor ) 
                        return false;
                }
                else {
                    console.warn("Dynamic iterators not supported in this browser.");
                    return false;
                }
            }
        }
        if( new_content.length ) {
            ctr_elem.innerHTML += new_content.join("");
            EvalScripts( ctr_elem, true );
        }
        for( ; i < 99999; i++ ) {
            var sfx = pref + (i+1);
            var iter_elem_id = elem_id + '_' + sfx;
            var row_elem = GetElemFrom( ctr_elem, iter_elem_id );
            if( row_elem )
                ctr_elem.removeChild( row_elem );
            else
                break;
        }
        return true;
    }
    catch( e ) {
        ShowException( e );
    }
    return false;
}

function iterFormUpdate( recid_chnl_id, iterator_id, iter_form_id ) {
    var editable = window["iter_editable_" + iterator_id];
	var cur_rec_hndl_elem = GetElem( recid_chnl_id );
    if( !cur_rec_hndl_elem ) return;
    var cur_rec_hndl_value = cur_rec_hndl_elem.value;
    var iter_outer_obj = GetElem( iterator_id );
    if( !iter_outer_obj ) return;
    var cur_rec_id_k = null;
    var inputs = iter_outer_obj.getElementsByTagName( "INPUT" );
    for( var i = 0; i < inputs.length; i++ ) {
        var i_elem = inputs[i];
        if( i_elem.type == "hidden" && i_elem.value == cur_rec_hndl_value ) {
            cur_rec_id_k = i_elem;
            break;
        }
    }
    if( !cur_rec_id_k ) return;
    var current_row_obj = GetParent( cur_rec_id_k, "TABLE" );
    if( !current_row_obj ) return;
    var old_rec_k_id = "subst_" + iter_form_id;
    var old_rec_k = window[old_rec_k_id];
    //if( old_rec_k === current_row_obj ) return; // same row remains
    var iter_form_obj = GetElem( iter_form_id );
    if( !iter_form_obj ) return;
    if( old_rec_k ) old_rec_k.style.display = ""; // make visible
    if( editable ) {
        iter_form_obj.style.display = "";
        current_row_obj.style.display = "none";
        window[old_rec_k_id] = current_row_obj;
        iter_form_obj.parentNode.removeChild(iter_form_obj);
        current_row_obj.parentNode.insertBefore( iter_form_obj, current_row_obj );
    }
    else
        iter_form_obj.style.display = "none";
}

function ProcOptions( item, elem )
{
    try {
        if( elem.tagName == "SELECT" ) {
            elem.selectedIndex = 0;
            var select_obj = elem;
            if( item.getAttribute('no-refresh') ) {
                var nso = item.getElementsByTagName("selected");
                if( nso.length ) {
                    var i, j = 0;
                    for( j = 0; j < nso.length; j++ ) {
                        var sel_value_node = nso[j];
                        value = sel_value_node.getAttribute('value');
                        for( i = 0; i < select_obj.options.length; i++ )
                            if( select_obj.options[i].value == value.replace( /\ +$/, "" ) )
                                select_obj.options[i].selected = true;
                    }
                }
            }
            else {
                while( select_obj.options.length ) select_obj.remove(0);
                var new_options = item.getElementsByTagName("option");
                var i;
                for( i = 0; i < new_options.length; i++ ) {
                    var new_option = new_options[i];
                    var value_attr = new_option.getAttribute('value');
                    if( value_attr != null ) {
/* ??? "'Option' is undefined" in some cases
                        var option_obj = new Option( new_option.firstChild ? new_option.firstChild.nodeValue : '',
                                                        value_attr );
*/
// replace code
                        var option_obj = document.createElement('option');
                        option_obj.text = new_option.firstChild ? new_option.firstChild.nodeValue : '';
                        option_obj.value = value_attr;
// end of replace

                        var selected_attr = new_option.getAttribute( 'selected' );
                        if( selected_attr && selected_attr == 'true' )
                            option_obj.selected = true;
                        select_obj.options[select_obj.options.length] = option_obj;
                    }
                }
            }
        }
        else
            ComboEditScr.UpdateAComboEdit( elem, item );
        return true;
    }
    catch( e ) {
        ShowException( e );
    }
    return false;
}

function loadXML( url ) {
    try {
        var xhr = new XMLHttpRequest();
        xhr.open("GET", url, false);
        xhr.send(null);
        return xhr.responseXML;
    } catch( e ) {
        console.error( "xml load failed: " + e.message );
    }
    return null;
}

function ProcBlockCache( item, str_arr, url, xsl_processor )
{
    if(p) console.info('ProcBlockCache()');
    if( MS_DOM ) {
        try {
            if( old_parser ) return false;
            if( !xsl_processor ) {
                var xslDoc = createFreeThreadedDOMDocument();
                xslDoc.async = false;
	            xslDoc.load(url);
                var xsl_template = createXSLTemplate();
                xsl_template.stylesheet = xslDoc;
                xsl_processor = xsl_template.createProcessor();
                if( !xsl_processor ) return null;
            }

            xsl_processor.input = item;
            xsl_processor.transform();
            str_arr[str_arr.length] = xsl_processor.output;
            xsl_processor.reset();
	        if(p) console.info('transform completed');
            return xsl_processor;
        }
        catch( e ) {
            ShowException( e );
        }
    }
    return null;
}

var xsl_processors = new Array();

function ProcBlock( item, elem, url, append )
{
    if(p) console.info('ProcBlock('+elem.id+')');
    var succeeded = false;
    if( MS_DOM ) {
        try {
            if( old_parser ) return false;
            var  xsl_processor = xsl_processors[url];
            if( !xsl_processor ) {
                var xslDoc = createFreeThreadedDOMDocument();
                xslDoc.async = false;
                xslDoc.load(url);
                var xsl_template = createXSLTemplate();
                xsl_template.stylesheet = xslDoc;
                xsl_processor = xsl_template.createProcessor();
                if( !xsl_processor ) return false;
                xsl_processors[url] = xsl_processor;
            }
            if(p) console.info('transformation begin');
            xsl_processor.input = item;
            xsl_processor.transform();
            var out_text = xsl_processor.output;
            if (out_text.indexOf("<!DOCTYPE") == 0) {
                var decl_end = out_text.indexOf(">");
                elem.innerHTML = out_text.substr(decl_end + 1);
            }
            else
                elem.innerHTML = out_text;
            xsl_processor.reset();
            if(p) console.info('transformation end');
            succeeded = true;
        }
        catch( e ) {
            ShowException( e );
            return false;
        }
    } else
    if( GK_DOM ) {
        try {
            var root_node = item.ownerDocument.documentElement;
            var  xsl_processor = xsl_processors[url];
            if( !xsl_processor ) {
                var xsl_processor = new XSLTProcessor();
                var xsl = loadXML( url );
                if( !xsl ) return false;
                if( ua.wk ) {
                    injectImport( xsl );
                    xsl.createElement( "xsl:template" );
                    var sh = xsl.documentElement;
                    if( root_node != item ) { // it'll be equal on the flowover return
                        var nt = xsl.createElement( "xsl:template" );
                        nt.setAttribute( "match", "/refreshdata" );
                        sh.appendChild( nt );
                        var at = xsl.createElement( "xsl:apply-templates" );
                        at.setAttribute( "select", "item" );
                        nt.appendChild( at );
                    }
                }
                xsl_processor.importStylesheet( xsl );
                xsl_processors[url] = xsl_processor;
            }
            if( !append ) while( elem.firstChild ) elem.removeChild( elem.firstChild );
            if( ua.wk && root_node != item ) {  // webkit XPath does not go up to the root node while transform a subnode
                var root_clone = root_node.cloneNode();
                for( var i = 0; i < root_node.childNodes.length; i++ ) {
                    var nn = root_node.childNodes[i].nodeName;
                    if( nn == "sinfo" || nn == "uiinfo" || nn == "mvars" )
                        root_clone.appendChild( root_node.childNodes[i].cloneNode(true) );
                }
                root_clone.appendChild( item.cloneNode(true) );
                var result_doc = xsl_processor.transformToDocument(root_clone);
            }
            else
                var result_doc = xsl_processor.transformToDocument(item);
            if( !result_doc ) return false;
            var to_insert = result_doc.documentElement;
            if( !to_insert ) return false;
            var html_to_insert = "";
            if( result_doc.documentElement.tagName == "transformiix:result") {
                for( var i = 0; i < result_doc.documentElement.childNodes.length; i++ )
                    html_to_insert += XML2str(result_doc.documentElement.childNodes.item(i));
            }
            else
                html_to_insert = XML2str( result_doc.documentElement );
            elem.innerHTML = html_to_insert;
            //elem.appendChild(to_insert); // when some item contains an html inside it does not render!
            succeeded = true;
        }
        catch( e ) {
            ShowException( e );
            return false;
        }
    }
    if( succeeded ) {
        if(p) console.info('EvalScripts begin');
        EvalScripts( elem );
        if(p) console.info('EvalScripts end');
    }
    return true;
}

function log( s ) {
    debugger;
    if( window.console && console.log ) console.log( s );
}

function selectNodes( xml, query ){
    if( typeof xml.selectNodes != 'undefined' ){
        return xml.selectNodes(query);
    } else if( document.implementation.hasFeature('XPath', '3.0') ) {
        try {
            var nodes = [];
            var resolver = xml.createNSResolver( xml.documentElement );
            var items = xml.evaluate(query, xml, resolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
            for(var i=0; i < items.snapshotLength; i++){
                nodes[i] = items.snapshotItem(i);
            }
            return nodes;
        } catch( e ) {
            console.error( e.message );
        }
    } else
        return [];
}

function injectImport( xsl, templates ) {
    if( window.console && console.log ) console.log( "injectImport()" );
    if( xsl.documentElement.nodeName != "xsl:stylesheet" ) {
        console.error( "xsl:stylesheet not found in the provided xsl" );
        return;
    }
    var append = false;
    if( templates == null ) {
        templates = [];
        append = true;
    }
    var import_nodes = selectNodes( xsl, "/xsl:stylesheet/xsl:import" );
    if( import_nodes && import_nodes.length ) {
        console.log( import_nodes.length + " imports found" );
        for( var i = 0; i< import_nodes.length; i++ ) {
            var sub_xsl_url = import_nodes[i].getAttribute("href" );
            if( sub_xsl_url && sub_xsl_url.length ) {
                var sub_xsl = loadXML( res_dir + sub_xsl_url );
                if( sub_xsl )
                    injectImport( sub_xsl, templates );
                else
                    console.error( sub_xsl_url + " can't be loaded " );
                import_nodes[i].parentNode.removeChild( import_nodes[i] );
            }
        }
    }
    if( append ) {
        console.log( "" + templates.length + " templates accumulated" );
        for( var i = 0; i < templates.length; i++ ) {
            xsl.documentElement.appendChild( templates[i] );
        }
    }
    else {
        var template_nodes = selectNodes( xsl, "/xsl:stylesheet/xsl:template" );
        if( template_nodes && template_nodes.length ) {
            console.log( template_nodes.length + " templates found" );
            for( var j = 0; j < template_nodes.length; j++ ) {
                var tmpl_name = template_nodes[j].getAttribute( "name" );
                if( tmpl_name ) {
                    var skip = false;
                    for( var i = 0; i < templates.length; i++ )
                        if( templates[i].getAttribute( "name" ) == tmpl_name ) {
                            skip = true;
                            break;
                        }
                    if( skip ) continue;
                }
                var clone = template_nodes[j].cloneNode( true );
                if( clone )
                    templates.push( clone );
            }
        }
    }
}

function EvalScripts( elem, no_ext )
{
    var scripts = elem.getElementsByTagName("SCRIPT");
    if( !no_ext ) {
        var scr_xmlhttp = null;
        for( var i = 0; i < scripts.length; i++) {
            if( scripts[i].src ) {
                try {
                    if( !scr_xmlhttp ) {
                            if( MS_DOM ) scr_xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); else
                            if( GK_DOM ) scr_xmlhttp = new XMLHttpRequest()
                    }
                    if( scr_xmlhttp ) {
                        scr_xmlhttp.open("GET", scripts[i].src, false );
                        scr_xmlhttp.send( null );
                        if( !scr_xmlhttp.responseText.length ) continue;
                        if( MS_DOM ) execScript( scr_xmlhttp.responseText ); else
                        if( GK_DOM ) eval.call( window, scr_xmlhttp.responseText );
                    }
                }
                catch( e ) {
                    console.error("Script processing exception: "+ e.message + ", in " + scripts[i].src );
                }
            }
        }
    }
    for( var i = 0; i < scripts.length; i++) {
        var scr_obj = scripts[i];
        if( !scr_obj.src ) {
            if( MS_DOM && scr_obj.text )
                execScript( scr_obj.text.replace( "<!--", "" ).replace( "-->", "" ) );
            else
            if( GK_DOM ) {
                if( (!scr_obj.text || !scr_obj.text.length ) && scr_obj.firstChild && scr_obj.firstChild.nodeType == scr_obj.COMMENT_NODE )
                    scr_obj.text = scr_obj.firstChild.data;
                eval.call( window, scr_obj.text );  // execute in the window context
            }
        }
    }
}

function Update( model_ids, caller_id )
{
    //alert('Update of '+ document.forms[0].name +' called from ' + caller_id + ' with models ' + model_ids);
    if( !document.forms.length || caller_id == document.forms[0].name || !model_ids.length ) return;
    if( models ) {
        for( var i=0; i < models.length; i++) {
            if( model_ids.indexOf( '('+models[i]+')' ) != -1 ) {
                //alert('Update of '+ document.forms[0].name +' called from ' + caller_id + ' with models ' + model_ids);
                 enable_prc_msg = false;
                 Sbm( document.forms[0].name, '', caller_id == null ? '_self' : '', '', model_ids );
                 return;
            }
        }
    }
}

function PrepareToRefresh()
{
	if( typeof pgform == "undefined" || !pgform ) return false;
    pgform.sbmctr.value = '';
    pgform.cmode.value = "0";
    return true;
}

var isFilters = navigator.userAgent.indexOf("NT")!=-1 && document.documentElement && typeof document.documentElement.filters != 'undefined' ? true : false;

function Effect( obj )
{
   try {
       if( isFilters && obj && obj.filters && obj.filters.length ) {
          obj.filters[0].Apply();
          obj.filters[0].Play();
       }
   } catch(e) {}
}

function updateReq( to_send, no_ss_update )
{
     sendXml( to_send, no_ss_update ? 6 : 5 );
}

function sendXml( to_send, cmode )
{
    try {
	    var form = document.forms[0];
        if( !form ) return;
	    xmlDoc = null;
        var xmlhttp = createXMLHTTP();
        xmlhttp.onreadystatechange = function () { if( HttpReqCallback( xmlhttp ) ) xmlhttp=null; };
        var url = location.pathname;
	    if( url.indexOf(".stp") < 0 )
		url += "?comp="+form.comp.value + "&";
 		    else
		url += "?";
	    url += "cmode="+cmode+"&uiinfo="+form.uiinfo.value + "&sinfo="+form.sinfo.value + "&mvars="+form.mvars.value + "&extra=allmodels";
	    xmlhttp.open("POST", url, true);
	    xmlhttp.setRequestHeader("Content-Type","application/xml");
	    xmlhttp.send( to_send );
	    return;
    }
    catch( e ) {
        ShowException( e );
    }
}

function confirmSessionClone()
{
    var to_send = '<?xml version="1.0"?>\n<newView xmlns="http://www.simx.com/SessionManagement">';
    to_send += '<sinfo value="'+ GetElem('sinfo').value +'"/>';
    to_send += '</newView>';
    sendXml( to_send, 7 );
}

function askForCloneSession()
{
    var to_send = '<?xml version="1.0"?>\n<badView xmlns="http://www.simx.com/SessionManagement">';
    to_send += '<sinfo value="'+ GetElem('sinfo').value +'"/>';
    to_send += '</newView>';
    sendXml( to_send, 7 );
}

function replaceSinfo( sinfo )
{
//alert("new sinfo=" + sinfo);
    var par_name = "sinfo=";
    var url = window.location.href;
    var sinfo_pos = url.indexOf( par_name );
    if( sinfo_pos < 0 ) {
        if( url.indexOf( "?" ) < 0 )
            url += "?";
        else {
            var last_c = url.charAt( url.length-1 );
            if( last_c != "&" && last_c != "?" ) url += "&";
        }
        url += par_name + sinfo;
    }
    else
        url = url.replace( /sinfo=([^&]+)/, par_name + sinfo );

    var cur_date = new Date();
    cur_date.setSeconds( cur_date.getSeconds() + 10 );
    document.cookie = "noproxy=1; expires=" + cur_date.toGMTString();
    window.location.replace( url );
    return;

    var home_url = (new RegExp( "https?://(.+)/" )).exec(location)[1];
    if( home_url.length == 0 ) return;
    home_url = home_url.toLowerCase()
    for( var f = 0; f < document.forms.length; f++ ) {
        if( document.forms[f].action.toLowerCase().indexOf( home_url ) >= 0 )
            document.forms[f].sinfo.value = sinfo;
    }
    var anchors = document.getElementsByTagName( "A" );
    for( var a in anchors ) {
        var a_elem = anchors[a];
        if( a_elem && a_elem.href && a_elem.href.length && a_elem.href.toLowerCase().indexOf( home_url ) >= 0 ) {
            var par_name = "sinfo=";
            var sinfo_pos = a_elem.href.indexOf( par_name );
            if( sinfo_pos < 0 ) {
                if( a_elem.href.indexOf( "?" ) < 0 )
                    a_elem.href += "?";
                else
                    if( a_elem.href.charAt(a_elem.href.length-1) != "&" ) a_elem.href += "&";
                a_elem.href += par_name + sinfo;
            }
            else {
                a_elem.href = a_elem.href.replace( /sinfo=([^&]+)/, par_name + sinfo );
            }
        }
    }
}

function posSubmit( obj, e, submit_str )
{
    if( !e ) return;
    if( e.offsetX ) {
        var x = e.offsetX;
        var y = e.offsetY;
    }
    else {
        var obj_x = GetPageXPos( obj );
        var obj_y = GetPageYPos( obj );
        var x = e.pageX - obj_x;
        var y = e.pageY - obj_y;
    }
    window.location = submit_str + "&posx=" + x + "&posy=" + y  + "&szx=" + GetWidth(obj) + "&szy=" + GetHeight(obj);
}

var flowover_handler = null;

function activateFlowOver( control_id, caption, comp_id, w, h, hn, modal )
{
    var flo_div = GetElem(control_id);
    if( !flo_div ) {
        flo_div = document.createElement('DIV');
        flo_div.id = control_id;
        flo_div.className = "flowover";
        document.body.appendChild( flo_div );
    }
    if( modal ) {
        var blocker;
        var blocker_id = control_id + "_blocker";
        blocker = GetElem( blocker_id );
        if( !blocker ) {
            blocker = document.body.appendChild(document.createElement('div'));
            blocker.className = "blocker";
            blocker.id = blocker_id;
        }
    }
    $(flo_div).dialog( { resizable: false, width: w, height: h,
        beforeClose: function() { 
            removeFromUiInfo( hn ); 
            flo_div.innerHTML = "";
            if( modal && blocker )
                document.body.removeChild( blocker );
          } } );

    //if( modal ) d$.dialog("option", "modal", true); // file upload control does not work on a modal dialog!

    var form = document.forms[0];
    if( form ) {
        Connect( "cmode=2&comp=" + window.page_name + "&extra=bind@" + control_id + ":" + comp_id + "&uiinfo="+ form.uiinfo.value +
            "&sinfo="+form.sinfo.value, form.action );
    }
}

function setUiInfo( uiinfo ) {
    if( !uiinfo || !uiinfo.length ) return;
    for( var i = 0; i < document.forms.length; i++ ) {
        var uiinfo_input = document.forms[i].uiinfo;
        if( uiinfo_input.length )
            NestedFormsAlert();
        else
            uiinfo_input.value = uiinfo;
    }
}

function removeFromUiInfo( key ) {
    if( !key || !key.length ) return;
    var re = new RegExp( key + ":.+," );
    for( var i = 0; i < document.forms.length; i++ ) {
        var uiinfo = document.forms[i].uiinfo;
        if( uiinfo.length )
            NestedFormsAlert();
        else
            uiinfo.value = document.forms[i].uiinfo.value.replace( re, "" );
    }
}

function closeParent( from )
{
    var dialog$ = $( from ).closest(".flowover");
    if( dialog$.length ) {
        dialog$.dialog('close');
        return;
    }
/*
    for( var elem = from; elem; elem = elem.parentNode ) {
        if( elem.className == "flowover" ) {
            if( elem.obj && elem.obj.close )
                elem.obj.close();
            return;
        }
    }
*/
    window.close();
}

function XML2str( node ) {
    if( node.xml ) return node.xml;
//    return (new XMLSerializer()).serializeToString( node );   // it collapses empty nodes!
    switch( node.nodeType ) {
    case node.ELEMENT_NODE: {
        var nodeName=node.nodeName;
        var s='\n<'+nodeName;
        var numAttr=node.attributes.length;
        for( var i=0; i<numAttr; i++ ) {
            var attr=node.attributes.item(i);
            s+=' '+attr.nodeName+'="'+attr.nodeValue+'"';
        }
        s += '>';
        for( var i = 0; i < node.childNodes.length; i++ )
            s+=XML2str( node.childNodes[i] );
        return s+'</'+nodeName+'>';
       }
    case node.COMMENT_NODE: return "<!--"+node.nodeValue+"-->";
    case node.TEXT_NODE:    return node.nodeValue.replace( /&lt;|&gt;|&amp;/g,function(e){return e=="&lt;"?"<":e=="&gt;"?">":e=="&amp;"?"&":"";});
    default:                return node.nodeValue;
    }
}

function Error( text ) {}

var exchng_loaded = true;

} // end of if( !exchng_loaded )

