// 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 FlowOver = function( id )
{
    this.id = id;
    this.flow_over = null;
    this.preclose = [];

    var $this = this; // closure
    this.center = function(e) {
        if( !$this ) return;
        if( $this.flow_over && $this.flow_over.style.display!="none" ) {
            var foH = GetHeight($this.flow_over);
            var foW = GetWidth( $this.flow_over);
            var pH = GetPageHeight();
            var pW = GetPageWidth();
            if( !$this.oPH || !$this.oPW ) {
                var foYpos = pH/2-foH/2+GetYScroll();
                var foXpos = pW/2-foW/2+GetXScroll();
            } else {
                var foYpos = GetYPos( $this.flow_over ) * pH / $this.oPH;
                var foXpos = GetXPos( $this.flow_over ) * pW / $this.oPW;
            }
            SetYPos( $this.flow_over, foYpos );
            SetXPos( $this.flow_over, foXpos );
            $this.oPH = pH;
            $this.oPW = pW;
        }
        if( $this.onresize ) $this.onresize(e);
        if( $this.onscroll ) $this.onscroll(e);
    }
    this.beginDrag = function(e) {
        if( !$this ) return;
        if( typeof e == "undefined" ) e = window.event;
        $this.mYpos = e.pageY ? e.pageY : e.clientY + GetYScroll();
        $this.mXpos = e.pageX ? e.pageX : e.clientX + GetXScroll();
        document.onmousemove = function(e) {
            if( typeof e == "undefined" ) e = window.event;
            var mouseY = e.pageY ? e.pageY : e.clientY + GetYScroll();
            var mouseX = e.pageX ? e.pageX : e.clientX + GetXScroll();
            var dY = mouseY - $this.mYpos;
            var dX = mouseX - $this.mXpos;
            var frame = $this.flow_over;
            SetYPos( frame, GetYPos( frame ) + dY );
            SetXPos( frame, GetXPos( frame ) + dX );
            $this.mYpos = mouseY;
            $this.mXpos = mouseX;
        }
        document.onmouseup = $this.mouseupHandler;
    }
    this.beginResize = function(e) {
        if( !$this ) return;
        if( typeof e == "undefined" ) e = window.event;
        var frame = $this.flow_over;
        $this.mYpos = e.pageY ? e.pageY : e.clientY + GetYScroll();
        $this.mXpos = e.pageX ? e.pageX : e.clientX + GetXScroll();
        document.onmousemove = function(e) {
            if( typeof e == "undefined" ) e = window.event;
            var mouseY = e.pageY ? e.pageY : e.clientY + GetYScroll();
            var mouseX = e.pageX ? e.pageX : e.clientX + GetXScroll();
            var dY = mouseY - $this.mYpos;
            var dX = mouseX - $this.mXpos;
            var nH = GetHeight( frame ) + dY;
            var nW = GetWidth( frame ) + dX;
            SetHeight( frame, Math.max( nH, 100 ) );
            SetWidth( frame,  Math.max( nW, 100 ) );
            $this.mYpos = mouseY;
            $this.mXpos = mouseX;
        }
        document.onmouseup = $this.mouseupHandler;
    }
    this.mouseupHandler = function() {
        if( !$this ) return;
        $this.mYpos = null;
        $this.mXpos = null;
        document.body.style.cursor='auto';
        document.onmousemove = null;
        document.onmouseup = null;
    }
    this.keydownHandler = function( e ) {
        if( !e ) e = window.event;
        if( e.keyCode == 27)
            $this.close();
    }
    this.close = function() {
        if( !$this ) return;
        for( var pc = 0; pc < $this.preclose.length; pc++ )
            $this.preclose[pc]();
        $this.flow_over.style.display="none";
        document.onkeydown = $this.old_onkeydown;
        $this.old_onkeydown = null;
    }
    this.destroy = function() { // subject to remove
        if( !$this ) return;
        window.onresize=$this.onresize;
        window.onscroll=$this.onscroll;
        $this.onresize=null;
        $this.onscroll=null;

        document.body.removeChild($this.flow_over);
        $this.flow_over = null;
        $this = null;
    }
    this.onresize=window.onresize;
    this.onscroll=window.onscroll;
    window.onresize=this.center;
    window.onscroll=this.center;
}
FlowOver.prototype = {
    construct : function( mhtml, caption ) {
        if( !(this.constructor===FlowOver.prototype.constructor) ) {
            console.error("FlowOver.construct().this!=FlowOver");
            return;
        }
        var body_id = this.id + '_body';
        var body;
        if( this.ref )
            body = GetElemFrom( this.ref, body_id );
        else {
            if( !caption ) {
                this.flow_over = document.body.appendChild(document.createElement('div'));
                this.flow_over.style.position="absolute";
                if( mhtml ) this.flow_over.innerHTML = mhtml;
                var body = this.flow_over;
            } else {
                this.flow_over = document.body.appendChild(document.createElement('table'));
                this.flow_over.id = this.id;
                this.flow_over.className='flowover';
                this.flow_over.cellSpacing = 1;
                this.flow_over.cellPadding = 0;
                var head = this.flow_over.insertRow(0).insertCell(0);
                head.className='flowover-caption';
                head.innerHTML = "<img class='closex' src='/Target/Webresources/RedCloseButton.gif'>" + caption;
                head.onmousedown=this.beginDrag;
                var close = head.getElementsByTagName("img")[0];
                close.onclick = this.close;
                body = this.flow_over.insertRow(1).insertCell(0);
                body.className='flowover-body';
                body.id=body_id;
                if( mhtml ) body.innerHTML = mhtml;
            }
        }
        this.display();
        return body;
    },
    display : function() {
        if( !(this.constructor===FlowOver.prototype.constructor) || !this.flow_over ) {
            console.error("FlowOver.display().this!=FlowOver");
            return;
        }
        this.flow_over.style.display="";
        this.center();
        this.old_onkeydown = document.onkeydown;
        document.onkeydown = this.keydownHandler;
    }
}

FlowOver.isExist = function( id ) {
    return !!document.getElementById( this.id );
}

var progress_image = null;
var progress_popup = null;

var progress_bar_handler = null;

function WaitMessage(msg)
{
    var pbar_id = "pbar";
    if( !progress_bar_handler && !FlowOver.isExist( pbar_id ) ) {

        var mhtml = "<DIV class='progressbar'>"
                  + (msg?msg:"Processing...") + "<br><img alt='...in progress' src='/Target/WebResources/progress.gif'></DIV>"
        progress_bar_handler = new FlowOver( pbar_id );
        progress_bar_handler.construct( mhtml, "wait..." );
    }
    else
        progress_bar_handler.display();
}

function CloseWaitMessage()
{
    if( wait_timer ) clearTimeout(wait_timer);
    if( progress_bar_handler ) progress_bar_handler.close();
    wait_timer = null;
}

var user_ask_handler = null;

function AskUser( params, msg, model, cookie )
{
    user_ask_handler = new FlowOver( cookie );
    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 = "<DIV class='confirm'>"
        + "<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;'>";
    if( bpos < 0 ) {
        mhtml += "<INPUT type='button' class='confirm' onclick='UserAnswered(1)' tabindex='100' value='Ok' id='au_1st_btn'>"
              +  "<INPUT type='button' class='confirm' onclick='UserAnswered(0)' tabindex='101' value='Cancel'>";
    }
    else {
        var buttons = msg.substr( bpos + 8 ).split( "," );
        for( var i = 0; i < buttons.length; i++ ) {
            var b_text = buttons[i].replace("'", "&apos;");
            mhtml += "<INPUT type='button' class='confirm' onclick='UserAnswered(\"" + b_text + "\")' tabindex='" + (100+i) + "'";
            if( b_text.charAt( 0 ) == '_' ) {
                b_text = b_text.substr( 1 );
                mhtml += " id='au_1st_btn'";
            }
            mhtml += " value='" + b_text + "'>";
        }
    }
    mhtml += "</DIV>";
    user_ask_handler.construct( mhtml, "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.close();
        user_ask_handler.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 PrepareData( pgform, custom_params )
{
    if( window.console && console.time ) console.time("Prepare data");
    if( !pgform ) pgform = document.forms[0];
    if( typeof pgform.cmode.value == "undefined" ) {
        alert("Error in the page layout.\nProbably forms are nested.\nPlease contact the site administrator.");
        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' ) {
                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( window.console && 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 + ( elem.multiple? "-" + c++ : "" ) + "=" + 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 createXMLHTTP()
{
    if( GK_DOM ) {
        var req = new XMLHttpRequest();
        if( req.overrideMimeType )
            req.overrideMimeType('text/xml');
        return req;
    }
    if( MS_DOM && window.ActiveXObject && document.implementation ) {
        try { return new ActiveXObject("Msxml2.XMLHTTP.4.0"); } catch(e) { }
        try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch(e) { }
        try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch(e) { }
        old_parser = true;
        try { return new ActiveXObject("Msxml2.XMLHTTP.2.6"); } catch(e) { }
        try { return new ActiveXObject("Msxml2.XMLHTTP");     } catch(e) { }
        try { return new ActiveXObject("Microsoft.XMLHTTP");  } catch(e) { }
    }
    alert("Unable to create an XML HTTP object;");
    return null;
}

//var xmlhttp = null;

function Connect( URL_encoded_data, url_to_connect )
{
    if( !URL_encoded_data ) return null;
  try {
  if( window.console && 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.onreadystatechange = HttpReqCallback;
        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();
    window.status = "An exception on data loading: " + e.description + " \n( " + e.code + ')';
  }
  return false;
}

function dumb() {}

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 = dumb; // trying to prevent refloops
            var xmlDoc = xmlhttp.responseXML;
            if( xmlDoc ) {
                if( window.console && console.timeEnd ) console.timeEnd("request XML");
                if( window.console && console.profile ) console.profile();
                AcceptData( xmlDoc );
                if( window.console && 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...";
    if( xmlDoc.documentElement.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 = xmlDoc.documentElement.getAttribute('redirect');
        if( url ) {
            procErrs( xmlDoc );

            var target = xmlDoc.documentElement.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');
        if( mvars_nodes.length || uiinfo_nodes.length ) {
            if(  mvars_nodes.length ) var mvars  =  mvars_nodes.item(0).firstChild.nodeValue;
            if( uiinfo_nodes.length ) var uiinfo = uiinfo_nodes.item(0).firstChild.nodeValue;
            for( var i = 0; i < document.forms.length; i++ ) {
                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');

            if( !ProcContainer( xmlDoc.documentElement, 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();
            if( e.description ) alert( 'XML data processing caused an exception: ' + e.description ); else
            if( e.code ) alert( 'XML DOM caused an exception: ' + e.code ); else
            if( e.message ) alert( 'XML DOM caused an exception: ' + e.message +
                (e.lineNumber ? " Line number: " + e.lineNumber:"") +
                (e.fileName ? ", at file: " + e.fileName:"") );
            else
                alert( 'XML DOM caused an exception...' + e );
            if( PrepareToRefresh() )
            	RealSubmit(pgform,"_self");
        }
        try {
            var was_active_submit = xmlDoc.documentElement.getAttribute('active') == "true";
            var act_comp_id = xmlDoc.documentElement.getAttribute('comp');
            if( act_comp_id != page_name && was_active_submit ) {
                Update( xmlDoc.documentElement.getAttribute('models'), act_comp_id );
            }

            if( was_active_submit && popup_handler && popup_handler.url &&
                popup_handler.comp != xmlDoc.documentElement.getAttribute('comp') ) {
                Connect( "cmode=2&extra=" + xmlDoc.documentElement.getAttribute('models') +
                    "&uiinfo="+document.forms[0].uiinfo.value +
                    "&sinfo="+document.forms[0].sinfo.value, popup_handler.url );
            }

            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 = top.frames[i];
                        break;
                    }
                }
            }
            var models_attr = xmlDoc.documentElement.getAttribute('models');
            if( models_attr && models_attr.length ) {
                var caller_id = document.forms[0].name;
                if( top_target_frame.Update )
                    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 );
            }
            //alert('dispath done');
            if(p) console.info('XML:'+XML2str( xmlDoc ) );
        }
        catch( e ) {
        }
        CloseWaitMessage();
    }
    else
    if( xmlDoc.documentElement.nodeName == 'Confirm' ) {
        CloseWaitMessage();
        var prompt = "", cookie = "", model = "", params = "";
        var items = xmlDoc.documentElement.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( xmlDoc.documentElement.nodeName == 'session' ) {
        var sinfo = xmlDoc.documentElement.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 )
{
    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;
}

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 )
{
    window.status += '.'; // debug
    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(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;
            else
                ctrl_drty[elem_id] = false;
            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;
}

function ProcAttr( attr_name, item, elem )
{
    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;
}

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 )
{
    if(p) console.info('ProcIterator()');
    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;
}

function ProcOptions( item, elem )
{
    try {
        if( elem.tagName == "SELECT" ) {
            elem.selectedIndex = 0;
            var select_obj = elem;
            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.options[0] = null;
                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 ) {
                        var option_obj = new Option( new_option.firstChild ? new_option.firstChild.nodeValue : '',
                                                        value_attr );
                        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 if( elem.tagName == "DIV" || elem.tagName == "SPAN" ) {
            ComboEditScr.UpdateAComboEdit( elem, item );
        }
    }
    catch( e ) {}
    return true;
}

function loadXML( url ) {
    try {
        var xhr = new XMLHttpRequest();
        log( "Loading " + url );
        xhr.open("GET", url, false);
        xhr.send(null);
        return xhr.responseXML;
    } catch( e ) {
        log( "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 ) {
            alert( e + "\nXML processing error" );
        }
    }
    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();
            elem.innerHTML = xsl_processor.output;
            xsl_processor.reset();
            if(p) console.info('transformation end');
            succeeded = true;
        }
        catch( e ) {
            alert( e.name + "\n\n" + e.message );
            return false;
        }
    } else
    if( GK_DOM ) {
        try {
            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_processor.importStylesheet( xsl );
                xsl_processors[url] = xsl_processor;
            }
            if( !append ) while( elem.firstChild ) elem.removeChild( elem.firstChild );
            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 ) {
            alert("XSLT error: "+e.message + "(" + e + ")");
            return false;
        }
    }
    if( succeeded ) {
        if(p) console.info('EvalScripts begin');
        EvalScripts( elem );
        if(p) console.info('EvalScripts end');
    }
    return true;
}

function log( s ) {
    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 ) {
            log( e.message );
        }
    } else
        return [];
}

function injectImport( xsl, templates ) {
    log( "injectImport()" );
    if( xsl.documentElement.nodeName != "xsl:stylesheet" ) {
        log( "xsl:stylesheet not found" );
        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 ) {
        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
                    log( sub_xsl_url + " can't be loaded " );
                import_nodes[i].parentNode.removeChild( import_nodes[i] );
            }
        }
    }
    if( append ) {
        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 ) {
            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 ) {
                    if( window.console ) window.console.error("Script processing exception: "+e.description + ", 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 to_send_xml;
        var xmlhttp = createXMLHTTP();
        xmlhttp.onreadystatechange = function() { HttpReqCallback( xmlhttp ); };
        to_send_xml = createDOMDocument();
	    if( xmlhttp ) {
         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 ) {
        window.status = "An exception on data sending: " + 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);
}


function activateFlowOverSubPage( control_id, popup_id, comp_id, modal )
{
    var  popup_elem = GetElem( popup_id );
    if( !popup_elem ) {
        console.error( "can't find popup window, id=" + popup_id );
        return;
    }
    var  fo_obj = popup_elem.obj;
    if( !fo_obj ){
        console.error( "can't get flowover object, id=" + popup_id );
        return;
    }
    var form = document.forms[0];
    if( form ) {
        // TODO: find out how to update only the flowover component only
        Connect( "cmode=2&extra=show@" + control_id + ":" + comp_id + "&uiinfo="+ form.uiinfo.value +
            "&sinfo="+form.sinfo.value, location.href );
    }
    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;
        }
        fo_obj.preclose.push( function() {
                var blocker = GetElem( blocker_id );
                if( blocker ) document.body.removeChild( blocker );
            }
        );
    }

    fo_obj.display();
}

function removeFromUiInfo( key ) {
    var re = new RegExp( key + ":.+," );
    for( var i = 0; i < document.forms.length; i++ )
        document.forms[i].uiinfo.value = document.forms[i].uiinfo.value.replace( re, "" );
}

var popup_handler = null;
//var popup_handlers = new Array(); // to do

// shows the specified component in a floated over div
function showPopup( url, name, id, xsl_url, modal )
{
    try {
        if( !url || !url.length ) return;
        if( popup_handler ) {
            popup_handler.destroy();
            popup_handler = null;
        }
        popup_handler = new FlowOver( name, id );
        popup_handler.url = url;
        if( ua.wk ) {
            var xmlhttp = createXMLHTTP();
            xmlhttp.open("POST", PrepareForParams( url ), false );
            xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xmlhttp.overrideMimeType( "text/html" );
            xmlhttp.send( "" );

            var ctr = popup_handler.show();
            if( ctr ) {
                ctr.innerHTML = xmlhttp.responseText.replace( /\<head\>.+\<\/head\>/i, "" );
                EvalScripts( ctr, true );
                popup_handler.center();
            }
        } else {
            var xmlhttp = createXMLHTTP();
            xmlhttp.open("POST", PrepareForParams( url ) + "cmode=2&extra=allmodels", false );  // to do: make it async
            xmlhttp.send( "" );
            var ctr = popup_handler.show();
            if( ctr ) {
                var fileref=document.createElement("link");
                fileref.setAttribute("rel", "stylesheet");
                fileref.setAttribute("type", "text/css");
                fileref.setAttribute("href", xsl_url.replace( /inc_/, "" ).replace( /\.xsl/, ".css" ));
                document.getElementsByTagName("head")[0].appendChild(fileref);
                ProcBlock( xmlhttp.responseXML, ctr, xsl_url, false );

                popup_handler.comp = xmlhttp.responseXML.documentElement.getAttribute('comp');

                RefreshControls();
                popup_handler.center();
            }
        }
        if( modal ) {
            var blocker = document.body.appendChild(document.createElement('div'));
            blocker.className = "blocker";
            blocker.id = id + "_blocker";
        }
        popup_handler.preclose = function() {
            var blocker = GetElem( popup_handler.id + "_blocker" );
            if( blocker ) document.body.removeChild( blocker );
            popup_handler = null;
        }
    }
    catch( e ) {
        alert( "Exception on showing a popup window: "+(e.description ? e.description : e ) );
    }
}

function closeParent( from )
{
    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 )
