function ajaxRequestCreate( )
{
    xmlHttp = false;
    
    if ( window.ActiveXObject )
    {	
        // IE, so check Library versions
        var versions = [ "MSXML2.XMLHttp.5.0" ,
                        "MSXML2.XMLHttp.4.0" ,
                        "MSXML2.XMLHttp.3.0" ,
                        "MSXML2.XMLHttp" ,
                        "Microsoft.XMLHttp" ];
                                         
        for ( var i = 0 ; i < versions.length ; i++ )
        {
            try {
                xmlHttp = new ActiveXObject( versions[ i ] );
                break;
            } catch( e ) { }
        }
    }
    else if ( typeof XMLHttpRequest != 'undefind' )
    {
        // Non IE browser
        try {
            xmlHttp = new XMLHttpRequest( );
        } catch( e ) { }
    }
    
    if ( !xmlHttp ) throw new Error( 'Unable to create request object' );
    return xmlHttp;
}

function pageOverlay( flag )
{
    var overlayDiv = document.getElementById( 'pageOverlay' );
    if ( !overlayDiv ) {return;}

    if ( flag )
    {
        document.body.style.cursor = "wait";
        overlayDiv.style.display = "block";
    }
    else
    {
        document.body.style.cursor = "default";
        overlayDiv.style.display = "none";
    }
}


function packFormData( formObject )
{
    var qstr = "";

    function GetElemValue( name, value )
    {
        qstr += (qstr.length > 0 ? "&" : "")
            + escape(name).replace(/\+/g, "%2B") + "="
            + escape(value ? value : "").replace(/\+/g, "%2B");
			//+ escape(value ? value : "").replace(/\n/g, "%0D");
    }

    var elemArray = formObject.elements;
    for (var i = 0; i < elemArray.length; i++)
    {
        var element = elemArray[ i ];
        var elemType = element.type.toUpperCase( );
        var elemName = element.name;
        if ( elemName )
        {
            if (   elemType == "TEXT"
                || elemType == "TEXTAREA"
                || elemType == "PASSWORD"
                || elemType == "BUTTON"
                || elemType == "RESET"
                || elemType == "SUBMIT"
                || elemType == "FILE"
                || elemType == "IMAGE"
                || elemType == "HIDDEN" )
                GetElemValue(elemName, element.value);
            else if ( elemType == "CHECKBOX" && element.checked )
                GetElemValue( elemName,
                    element.value ? element.value : "On" );
            else if ( elemType == "RADIO" && element.checked )
                GetElemValue( elemName, element.value );
            else if ( elemType.indexOf( "SELECT" ) != -1 )
                for ( var j = 0; j < element.options.length; j++ )
                {
                    var option = element.options[ j ];
                    if ( option.selected )
                        GetElemValue( elemName,
                            option.value ? option.value : option.text );
                }
        }
    }
    return qstr;
}

function CXmlHttpMessage( xmlHttp )
{
    this.xmlHttpRequest = xmlHttp;
    this.code = '-1';
    this.title = '';
    this.draft = '';
    this.details = '';
    this.html = '';
    this.javascript = '';
    
    this.parse = parse;
}

function parse( )
{
    this.code = '-1';
    this.title = 'XML Parser';
    this.draft = '';
    this.details = '';
    this.html = '';
    this.javascript = '';
    
    try {
        var xmldata = this.xmlHttpRequest.responseXML;
        if ( !xmldata )
        {
            this.draft = 'Null XML response received';
        }
        else
        {
            var oCode = xmldata.getElementsByTagName("code");
            if ( oCode )
                this.code = oCode[0].firstChild.nodeValue;
            else
            {
                this.draft ='Unable to fetch XML code';
                return;
            }
            
            var oDraft = xmldata.getElementsByTagName("draft");
            if ( oDraft )
            {
                if ( oDraft[0].firstChild )
                    this.draft = oDraft[0].firstChild.nodeValue;
            }
            else
            {
                this.code = '-1';
                this.draft ='Unable to fetch XML draft';
                return;
            }
            
            var oDetails = xmldata.getElementsByTagName("details");
            if ( oDetails )
            {
                if ( oDetails[0].firstChild )
                    this.details = oDetails[0].firstChild.nodeValue;
            }
            else
            {
                this.code = '-1';
                this.draft ='Unable to fetch XML details';
                return;
            }
            
            // Fetch html code
            var oHtml = xmldata.getElementsByTagName("html");
            if ( oHtml )
            {
                if ( oHtml[0].firstChild )
                    this.html = oHtml[0].firstChild.nodeValue;
            }
            else
            {
                this.code = '-1';
                this.draft ='Unable to fetch HTML code';
                return;
            }
            
            // Fetch javascript code
            var oJavascript = xmldata.getElementsByTagName("javascript");
            if ( oJavascript )
            {
                if ( oJavascript[0].firstChild )
                    this.javascript = oJavascript[0].firstChild.nodeValue;
            }
            else
            {
                this.code = '-1';
                this.draft ='Unable to fetch Javascript code';
                return;
            } 
        }
        
    } catch ( e ) {
        this.code = '-1';
        this.draft = 'CXmlHttpMessage exception: ' + e.name;
        this.details = e.message;   
    }
}

function parseScript(_source)
{
    var source = _source;
    var scripts = new Array();

    // Strip out tags
    while(source.indexOf("<script") > -1 || source.indexOf("</script") > -1) {
            var s = source.indexOf("<script");
            var s_e = source.indexOf(">", s);
            var e = source.indexOf("</script", s);
            var e_e = source.indexOf(">", e);

            // Add to scripts array
            scripts.push(source.substring(s_e+1, e));
            // Strip from source
            source = source.substring(0, s) + source.substring(e_e+1);
    }

    // Loop through every script collected and eval it
    // REMEMBER to use try/catch in the external function
    // for the eval'd code
    for(var i=0; i<scripts.length; i++) {
        /*try {
            eval(scripts[i]);
        } catch ( e ) {
            alert( getStackTrace( e ) );
        }*/
        eval(scripts[i]);
        
    }
    // Return the cleaned source
    return source;
}


