// XML DOM parsing and data exchange
// (c) Copyright SimX Corporation 2009

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;

function DynamicUpdate( 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 == '' ) {
            window.status = "Producing a data request to the server. please wait...";
            document.body.style.cursor='wait';
            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 );
            }
            if( Connect( PrepareData( custom_params ) ) ) 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_popup = null;

function WaitMessage(msg)
{
    var mhtml = "<DIV class='progressbar'>"
              + (msg?msg:"Processing...") + "<br><img alt='...in progress' src='/Target/WebResources/progress.gif'><A href='javascript:hidePB();' class='closeX'>[x]</A></DIV>"
/*
    if( window.createPopup ) {
        progress_popup = window.createPopup();
        if( progress_popup && typeof progress_popup.document != "unknown" ) {
            progress_popup.document.body.innerHTML = mhtml;
            progress_popup.show(GetWidth(document.body)/2-180,GetHeight(document.body)/2-60,360,120,document.body);
            return;
        }
        else progress_popup = null;
    }
*/
    showPB(mhtml);
}

function CloseWaitMessage()
{
    if( wait_timer ) clearTimeout(wait_timer);
    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();
    placePB.onresize=window.onresize;
    placePB.onscroll=window.onscroll;
    window.onresize=placePB;
    window.onscroll=placePB;
}
function hidePB() {
    var pbar = document.getElementById( "progressbar" );
    if( pbar ) pbar.style.display="none";
    window.onresize=placePB.onresize;
    window.onscroll=placePB.onscroll;
    placePB.onresize=null;
    placePB.onscroll=null;
}

function placePB(e) {
    var pbar = document.getElementById( "progressbar" );
    if( pbar && pbar.style.display!="none" ) {
        SetYPos( pbar, GetPageHeight()/2-60+GetYScroll() );
        SetXPos( pbar, GetPageWidth()/2-180+GetXScroll() );
    }
    if( placePB.onresize ) placePB.onresize(e);
    if( placePB.onscroll ) placePB.onscroll(e);
}

placePB.onresize=null;
placePB.onscroll=null;

var t, m, c;

function AskUser( t_, s, m_, c_ )
{
    var res = DoAskUser(s)
    t = t_;
    m = m_;
    c = c_;
}

function UserAnswered(res)
{
    hideAU();
    t += "&UCModel=" + m + "&UCResult=" + res + "&UCCookie=" + c;
    Connect( t );
    return;
}

function DoAskUser(msg)
{
    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'>"
        + "<P class='confirm'>" + prompt.replace(/[\n\r]/g,"<BR>") + "</P>";
    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>";
    showAU(mhtml);
}

var old_onresize = null;

function showAU(mhtml)
{
    var au = document.createElement('DIV');
    au.id="askuser";
    au.style.position="absolute";
    var au_old = document.getElementById( "askuser" );
    if( au_old )
        document.body.replaceChild(au,au_old);
    else
        document.body.appendChild(au);
    au.innerHTML = mhtml;
    placeAU();
    var fst_btn = document.getElementById( "au_1st_btn" );
    if( fst_btn ) fst_btn.focus();
    old_onresize=window.onresize;
    window.onresize=placeAU;
    window.onscroll=placeAU;
}

function hideAU()
{
    var au = document.getElementById( "askuser" );
    if( au ) au.style.display="none";
    window.onresize=old_onresize;
    window.onscroll=null;
}

function placeAU()
{
    var au = document.getElementById( "askuser" );
    if( au ) {
        SetYPos( au, GetPageHeight()/2-50+GetYScroll() );
        SetXPos( au, GetPageWidth()/2-GetWidth(au)/2+GetXScroll() );
    }
}

function PrepareData( custom_params )
{
    if( window.console && console.time ) console.time("Prepare data");
    pgform.cmode.value = "2";
    var ct = new Date();
    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 + ( pgform.tagcnt ? "&tagcnt=" + pgform.tagcnt.value : "" ) +
                    "&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 + "_" + 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;
}

function Connect( URL_encoded_data )
{
    var xmlhttp = null;
    var xmlDoc  = null;
  try {
  if( window.console && console.time ) console.time("request XML");
    xmlhttp = createXMLHTTP();
    if( xmlhttp ) {
        xmlhttp.open("POST", pgform.action, true);
        xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xmlhttp.onreadystatechange = function() { HttpReqCallback( xmlhttp ); };
        xmlhttp.send( URL_encoded_data );
        return true;
    }
    else
    if( URL_encoded_data.length < 1000 ) {  // GET limit
        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 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 ) {
            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();
            }
            else
                window.status = "No valid data returned.";
        }
        else
            window.status = "Problem with request. Status=" + xmlhttp.status;
    }
}

function Profiler( header_str )
{
    this.enable = true;
    var cur_time = new Date();
    this.time_start = cur_time.getTime();
    this.list = "<h2>" + header_str  + "</h2>";

    this.out = function( str )
    {
        var cur_time = new Date();
        var time = new Date( cur_time.getTime() - this.time_start );
        this.list += "<br>" + str.replace("<","&lt;").replace(">","&gt;") + " <b>(" + time.getSeconds() + "s " + time.getMilliseconds() + "ms)</b>";
    }
    this.show = function()
    {
        var wnd = window.open( "", "Profiler", "width=350,height=640,scrollbars=yes,resizable=yes" );
        if( wnd ) wnd.document.writeln( this.list );
    }
}

var p = null;

function AcceptData( xmlDoc )
{
    p = location.search.indexOf("$profile$") > 0 ? new Profiler( "Profiling" ) : null;
    if(p) p.out('AcceptData()');
    if( !pgform ) pgform = document.forms[0];
    if( !xmlDoc || !xmlDoc.documentElement ) {
        window.status = "Dynamic data update failed. Trying full page refresh.";
        if( PrepareToRefresh() )
        	RealSubmit("_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;
            return;
        }

        var mvars_nodes = xmlDoc.getElementsByTagName('mvars');
        if( mvars_nodes.length ) {
            var mvars = mvars_nodes.item(0).firstChild.nodeValue;
            for( var i = 0; i < document.forms.length; i++ ) {
                document.forms[i].mvars.value=mvars;
            }
        }
        var srv_tag_count  = xmlDoc.documentElement.getAttribute('tagcnt');
        if( srv_tag_count ) {
//            alert("Tag="+srv_tag_count);
            for( var i = 0; i < document.forms.length; i++ ) {
                document.forms[i].tagcnt.value=srv_tag_count;
            }
        }
        if(p) p.out('Search for errors');
        try {
            procErrs( xmlDoc );
            if(p) p.out('Begin items processing');

            if( !ProcContainer( xmlDoc.documentElement, document ) ) {
                if( PrepareToRefresh() )
                	RealSubmit("_self");
                return;
            }
            if(p) p.out('XML processing done');
            RefreshControls();
            if(p) p.out('RefreshControls done');

            var js_nodes = xmlDoc.getElementsByTagName('javascript');
            for( var i = 0; i < js_nodes.length; i++ )
               eval(js_nodes.item(i).firstChild.nodeValue);
        }
        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("_self");
        }
        try {
            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) p.out('XML:'+XML2str( xmlDoc ) );
            if(p) p.show();
        }
        catch( e ) {
        }
        CloseWaitMessage();
    }
    else
    if( xmlDoc.documentElement.nodeName == 'Confirm' ) {
        CloseWaitMessage();
        var s = "", c = "", m = "";
        var items = xmlDoc.documentElement.childNodes;     // hierarhy
        for( var i = 0; i < items.length; i++ ) {
            var nn = items.item(i).nodeName;
            if( nn == "Model" )  m = items.item(i).firstChild.nodeValue; else
            if( nn == "Prompt" ) s = items.item(i).firstChild.nodeValue; else
            if( nn == "Cookie" ) c = items.item(i).firstChild.nodeValue; else
            if( nn == "Params" ) t = items.item(i).firstChild.nodeValue;
        }
        AskUser( t, s, m, c );
    }
    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( document.all ) return from.all.item( id );
    return document.getElementById( id );
}

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) p.out('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 );
            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 + 'inc_' + ste + '_' + item.getAttribute('include')  + ".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 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) p.out('ProcIterator()');
    var i = 0;
    var pref = iter ? iter + ':' : '';
    var xslt_processor;
    var new_content = new Array;
    for( ; i < item.childNodes.length; i++ ) {
        if(p) p.out('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 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" ) {
            ComboEditScr.UpdateAComboEdit( elem, item );
        }
    }
    catch( e ) {}
    return true;
}

function ProcBlockCache( item, str_arr, url, xsl_processor )
{
    if(p) p.out('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) p.out('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) p.out('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) p.out('transformation begin');
            xsl_processor.input = item;
            xsl_processor.transform();
            elem.innerHTML = xsl_processor.output;
            xsl_processor.reset();
            if(p) p.out('transformation end');
            succeeded = true;
        }
        catch( e ) {
            alert( e + "\nProbably you need to instal the newest MSXML version (latest is 6.0)" );
            return false;
        }
    } else
    if( GK_DOM ) {
        try {
            var  xsl_processor = xsl_processors[url];
            if( !xsl_processor ) {
                var xsl_processor = new XSLTProcessor();
                var rep_xsl = new XMLHttpRequest();
                rep_xsl.open("GET", url, false);
                rep_xsl.send(null);
                if( !rep_xsl.responseXML ) return false;
                xsl_processor.importStylesheet(rep_xsl.responseXML);
                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) p.out('EvalScripts begin');
        EvalScripts( elem );
        if(p) p.out('EvalScripts end');
    }
    return true;
}

function dumb( h )
{
}

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 )
{
	var form = document.forms[0];
    if( !form ) return;
	xmlDoc = null;
	var to_send_xml;
	if( GK_DOM ) {
	 xmlhttp = new XMLHttpRequest();
	 xmlhttp.onreadystatechange = function() { HttpReqCallback( xmlhttp ); };
	 to_send_xml = document.implementation.createDocument("", "", null);
	}
	else if( MS_DOM ) {
	 xmlhttp = createXMLHTTP();
	 xmlhttp.onreadystatechange = function() { HttpReqCallback( xmlhttp ); };
	 to_send_xml = createDOMDocument();
	}
	if( xmlhttp ) {
     var url = form.action;
	 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;
	}
}

function updateSession()
{
    var to_send = '<?xml version="1.0"?>\n<page xmlns="http://www.simx.com/PageLoaded">';  
    to_send += '<window';
    if( !top.name || !top.name.length ) {
         top.name = "w" + Math.random();
         to_send += 'new="yes"';
    }
    to_send += 'name="'+ top.name +'"/>';
    to_send += '<sinfo state="inuse" value="'+ GetElem('sinfo').value +'"/>';
    to_send += '<sinfo state="old" value="'+ window.old_sinfo +'"/>';
    to_send += '</page>';
    sendXml( to_send, 7 );
}

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 )
