/* ##########################################################################
    Copyright 2005 BBB Systems, LLC, All rights reserved

    Wrapper class for XMLHttpRequest

    In the event that you see this script and you find it useful,
    you may use it for what ever purpose you want for the sake
    of progress.  Keep in mind, we built it for our needs, and
    you may need to implement server side scripts for this class
    to function correctly.

    xml format:
    <xmldata>
     <element_id_0>
      <xhtml>
       ...
      </xhtml>
      <data>
       <key1>value1</key1>
      </data>
     </element_id_0>
     <element_id_1>
      ...
     </element_id_1>
     ...
     <element_id_n-1>
      ...
     </element_id_n-1>
     <title>

     </title>
    </xml>
    the algorithm parses the xhtml nodes before the data nodes, but either
    or both of them could be empty, in which case nothing will  happen.

########################################################################## */

var ajaxEnabled = true;
var b_xml = '';

ajxmlObject = function( ){
    //May add functionality later where the following variables are set
    //as of right now, it's just not necessary.
    this.responseText = '';
    this.responseXML = '';

    this.status = '';
    this.statusText = '';

    //If this is set, the title of the document will dynamicly change
    this.title = '';

    this.isCurrentRequest = false;

    this.xml_http = null;
    this.isSupported = false;

    //If you don't want the workNode to be a part of the actual document,
    //you can change this to be a document.createElement instead.
    this.workNodeID = 'workNode';
    this.workNode = null;

    if(window.XMLHttpRequest || window.ActiveXObject){
        this.isSupported = true;
        this.initialize( );
    }

}

ajxmlObject.prototype = {
/* ---------------------------------------------- */

request: function(url, rMethod){

    if(!this.supported( ) || this.isCurrentRequest){
        return;
    }

    if(!this.workNode){
        this.workNode = document.getElementById(this.workNodeID);
    }

    this.isCurrentRequest = true;

    var oMethod = "GET";
    if(rMethod == "POST"){
        oMethod = "POST";
    }

    this.xml_http.open(oMethod, url, true);



    if(this.xml_http.overrideMimeType){
        this.xml_http.overrideMimeType("text/xml");
    }
    else{
        this.xml_http.setRequestHeader("Content-Type", "text/xml");
    }

    this.xml_http.send(null);
},

initialize: function( ){
    if(this.xml_http){
        this.xml_http = null;
    }

    if(window.XMLHttpRequest){
        this.xml_http = new XMLHttpRequest( );
    }
    else if(window.ActiveXObject){
        this.xml_http = new ActiveXObject("Microsoft.XMLHTTP");
        if(!this.xml_http){
            this.isSupported = false;
        }
    }

    this.xml_http.onreadystatechange = ajxmlObjectProcess;
},

supported: function( ){
    return this.isSupported;
},

setAttribute: function(name, value){
	this.attributes[name] = value;
},
getAttribute: function(name){
	return this.attributes[name];
}

/* ---------------------------------------------- */
}//end ajxmlObject.prototype

b_xml = new ajxmlObject( );

function ajxmlObjectProcess( ){
    if(b_xml){
        if(b_xml.xml_http.readyState != 4){
            return;
        }

        if(b_xml.xml_http.status == 200){
            b_xml.workNode.innerHTML = b_xml.xml_http.responseText;
            if(b_xml.workNode.getElementsByTagName("div")[0].className != 'xmldata'){
                return;
            }

            customPreloader( );
            //defaultComplete called from customPreloader
            //defaultComplete( );
        }
        else{
            //alert(b_xml.xml_http.status + ' - ' + b_xml.xml_http.statusText);
        }
    }
}

//This is the default most basic completion of ajax requests
function defaultComplete( ){
    var i;
    var xChildren = b_xml.workNode.getElementsByTagName("div")[0].childNodes;

    for(i = 0; i < xChildren.length; i++){
        var node = xChildren[i];

        if(node.nodeType != 1){ continue; }


        if(node.className == "title"){
            for(j = 0; j < node.childNodes.length; j++){
                if(node.childNodes[j].nodeValue){
                    document.title = node.childNodes[j].nodeValue;
                    break;
                }
            }
            continue;
        }
        //else it's an inner document node.

        var docNode = document.getElementById(node.className);

        if(!docNode){
            continue;
        }

        node.normalize( );
        var nodeCopy = node.cloneNode(true);

        docNode.innerHTML = "";
        if(document.insertAdjacentElement){
            docNode.insertAdjacentElement("beforeEnd", nodeCopy);
        }
        else{
            docNode.appendChild(nodeCopy);
        }
    }

    b_xml.isCurrentRequest = false;
    b_xml.initialize( );

    //must be defined in pscript.js on a per site basis
    if(xmlInit){
        xmlInit( );
    }
}

//Preloading image functions should be replaced by
//The reason these are in the ajax file is so images load up gracefully
//to give the end user a better experience between page loads.
function customPreloader( ){
    //var docImages = this.workNode.getElementsByTagName("img");
    var imgs = document.getElementsByTagName('img');
    var len = imgs.length;

    if(len == 0){
        defaultComplete( );
        return;
    }

    var preloadContainer = document.getElementById('preloadContainer');
    var preloadBarInner = document.getElementById('preloadBarInner');

    if(preloadContainer.style.display != 'block'){
        preloadBarInner.style.width = '0%';
        preloadContainer.style.display = 'block';
    }

    var numComplete = 0;
    for(var i = 0; i < len; i++){
        if(imgs[i].complete){
            numComplete++;
        }
    }
    if(numComplete == len){
        preloadContainer.style.display = 'none';
        preloadBarInner.style.width = '0%';
        defaultComplete( );
    }
    else{
        var percent = parseInt( (numComplete/len) * 100);
        var nextStep = parseInt( ((numComplete + 1)/len) * 100 );
        var curPercent = parseInt(preloadBarInner.style.width);
        var nextLoad = 50;

        //stuck on a big image, slow it down a bit
        if(percent <= curPercent && curPercent + 1 < nextStep){
            percent = curPercent + 1;//add a little to make it look cooler.
            nextLoad = 200;

        }
        else if(percent <= curPercent){
            percent = curPercent;
        }

        var percentStr = percent + "%";

        preloadBarInner.style.width = percentStr;

        setTimeout('customPreloader( );', nextLoad);
    }
}
