
//Function.createCallback=function(b,a)
//{   
//    return function()
//    {
//    var e=arguments.length;
//    if(e>0)
//        {
//            var d=[];
//            for(var c=0; c<e; c++)
//                d[c]=arguments[c];
//            d[e]=a;
//            return b.apply(this,d)
//        }
//    return b.call(this,a)
//    }
//};


Function.createDelegate = function(a,b)
{
    return function()
    {
        return b.apply(a,arguments)
    }
};

function addListener(element, type, expression, bubbling)
{
    bubbling = bubbling || false;
	
    if(window.addEventListener)	{ // Standard
	    element.addEventListener(type, expression, bubbling);
	    return true;
    } else if(window.attachEvent) { // IE
	    element.attachEvent('on' + type, expression);
	    return true;
    } else return false;
}


////////////////////////////////////////////////
////////// Ajax Helper Class ////////////
////////////////////////////////////////////////

function HttpService(serviceUrl, includeInHistory, preserveCurrentHistory, historyData, historyOnLoadHandler, onCompleteCallBack)
{
    this.serviceUrl = serviceUrl;
    this.httpRequest = getHttpRequestObject();
        
    this.includeInHistory = includeInHistory ;
        
    this.historyData = historyData;    
    this.preserveCurrentHistory = preserveCurrentHistory;
    this.historyOnLoadHandler = historyOnLoadHandler;

    if (onCompleteCallBack!=null)
    {
        strArgs = arrayToString(arguments, 6) ;      
        this.onComplete = onCompleteCallBack  + '(this.httpRequest' + strArgs + ');' ;
        
    }
}

function arrayToString(args, startIndex)
{
    strArgs = new String() ;
    strArgs = '' ;
    for(var i=startIndex; i < args.length; ++i)
    {        
        strArgs = strArgs + ',"' + args[i] + '"' ;
    }

    return strArgs;
}

HttpService.prototype.registerOnLoading = function(fName) {

    var strArgs = arrayToString(arguments, 1) ;
    this.onLoading =  fName  + '(this.httpRequest' + strArgs + ');' ;
}

HttpService.prototype.registerOnLoaded = function(fName) {
    var strArgs = arrayToString(arguments, 1) ;
    this.onLoaded =  fName  + '(this.httpRequest' + strArgs + ');' ;
    
}

HttpService.prototype.registerOnInteractive = function(fName) {

    var strArgs = arrayToString(arguments, 1) ;
    this.onInteractive =  fName  + '(this.httpRequest' + strArgs + ');' ;
    
}

HttpService.prototype.registerOnComplete = function(fName) {
    var strArgs = arrayToString(arguments, 1) ;
    this.onComplete=  fName  + '(this.httpRequest' + strArgs + ');' ;
}

HttpService.prototype.getUrl = function() {
    var callUrl = this.serviceUrl;
    for(i=0;i<arguments.length;i++)
    {
        callUrl = callUrl.replace("{" + i + "}",arguments[i]);
    }   
    return callUrl; 
}


HttpService.prototype.call = function(synch)
{
    var asynch = true ;
    if (synch) asynch = !synch ;
    
    var callUrl = this.getUrl() ;
    var addedToHistory  = false ;
    if (this.includeInHistory)
    {        
        try{
        
            addedToHistory = ajx_saveHistory(
                         this.preserveCurrentHistory,
                         callUrl,
                         this.historyData,
                         this.historyOnLoadHandler) ;
            if (this.preserveCurrentHistory)
                addedToHistory = false ;
        }
         catch(e)
        {
            //could not add to history
            //alert(e.message);
            return false;
        }
    }    
    
    if (addedToHistory) {
    
        var historyObj = ajx_getHistory() ;
        
        if (historyObj != null && historyObj.length > 0)
            return false;    
    }

    this.httpRequest.open("GET", callUrl, asynch) ;
    if (asynch)
    {
        this.httpRequest.onreadystatechange = Function.createDelegate(this, this.onReadyStateChange) ; 
        if (BrowserDetect.browser == "Explorer" && BrowserDetect.version != 6)
            this.httpRequest.onerror = Function.createDelegate(this, this.onError) ;
    }
    this.httpRequest.send(null) ;
    
    if (!asynch)
        this.onReadyStateChange(this.httpRequest) ;
    
} 
    
HttpService.prototype.abort = function()
{
    this.httpRequest.abort();
}

HttpService.prototype.onReadyStateChange = function()
{
    if(this.httpRequest.readyState == 1)
    {
        if (this.onLoading != null && this.onLoading != '')
            eval(this.onLoading) ;            
    }
    else if(this.httpRequest.readyState == 2)
    {
        if (this.onLoaded != null && this.onLoaded != '')
            eval(this.onLoaded) ;
    }
    else if(this.httpRequest.readyState == 3)
    {
        if (this.onInteractive != null && this.onInteractive != '') 
            eval(this.onInteractive) ;            
    }
    else if(this.httpRequest.readyState == 4)
    {
        if (this.onComplete != null && this.onComplete != '')
        {
            eval(this.onComplete) ;
        }
        this.httpRequest = null ;
    }
}

HttpService.prototype.onError = function()
{
}



////////////////////////////////////////////////
////////// HttpService Helper Class End ////////
////////////////////////////////////////////////
    


////////////////////////////////////////////////
////////// Ajax History Helper Class ////////
////////////////////////////////////////////////

var ajx_executeOnLoad = true;

function AjaxHistory(url, breadCrumbHTML, data, onLoadHandler)
{
    this.url = url;
    this.breadCrumbHTML = breadCrumbHTML;    
    this.data = data ;
    this.onLoadHandler = onLoadHandler ;    
}

function ajx_isHistoryEmpty()
{
    var hObject = ajx_getHistory();    
    if (hObject == null || hObject.length == 0)
        return true;
    else
    {
        return false ;
        
    }
}

function ajx_saveHistory(preserveCurrentHistory, url, data, historyOnLoadHandler)
{    
    var returnValue = false ;
    if (ajx_isInHistory(url))
        return false ;
    var doc = ajx_getHistoryDocument();
    if (doc == null ) return false;
     
    try{
        var dataToWrite;
        //ajx_executeOnLoad = !preserveCurrentHistory;
        if (preserveCurrentHistory && doc.firstChild)
        {            
            var strData = ajx_getHistoryData(doc.firstChild.innerHTML) ;
            strData = strData.replace('<historyList>', '') ;            
            strData = strData.replace('</historyList>', '') ;    
            if (strData != null && strData != 'undefined' && strData != '')
            {
                dataToWrite = strData  + _ajx_createDataString(url, data, historyOnLoadHandler) ;
            }
            else
                dataToWrite = _ajx_createDataString(url, data, historyOnLoadHandler) ;
        }
        else{
            dataToWrite = _ajx_createDataString(url, data, historyOnLoadHandler) ;        
        }
        doc.open();
        doc.write('<!--') ;
        doc.write('<historyList>') ;          
        doc.write(dataToWrite)    ;
        doc.write('</historyList>') ;                
        doc.write('-->');               
        doc.close();

        returnValue = true;        
    }
    catch(e)
    {
        returnValue = false
    }
    
    return returnValue;
}
    
function _ajx_createDataString(url, data, historyOnLoadHandler)
{
    var divCrumb = document.getElementById("crumb") ;
    var strHistoryData = '<history onLoadHandler="' + historyOnLoadHandler + '" >' ;
    strHistoryData = strHistoryData + '<url><![CDATA[' + url + ']]></url>' ;
    if (divCrumb != null && divCrumb.innerHTML != '')
    {
        strHistoryData = strHistoryData + '<breadCrumb><![CDATA[' + divCrumb.innerHTML + ']]></breadCrumb>' ;    
    }
    if (data != null && data.length > 0)
    {
        for(var i=0 ; i<data.length ; ++i)
        {
            strHistoryData = strHistoryData + '<data>';  
            strHistoryData = strHistoryData + '<![CDATA[' + data[i] + ']]>' ;
            strHistoryData = strHistoryData + '</data>' ;
        }
      
    }
    
    strHistoryData = strHistoryData + '</history>' ;
    return strHistoryData ;
}

function ajx_isInHistory(url)
{
    var isInHistory = false;

    try{
    
        var xNodes = ajx_getHistoryNodes('url');
        if (xNodes == null) return null;        
        
        if (xNodes != null && xNodes.length > 0 )
        {    
            for (var i=0 ; i<xNodes.length ; ++ i)
            {
                if(ajx_getHistoryNodeValue(xNodes[i]) == url)
                {
                    isInHistory = true;
                    break;
                }
            }
        }   
    }
    catch(e)
    {
        //alert(e.message) ;
    } 
    return isInHistory;
}


function ajx_getHistoryFrame()
{
    var ajxHistory = document.getElementById("ajxHistory");
    return ajxHistory ;        

}
function ajx_getHistoryDocument()
{
    var ajxHistory = ajx_getHistoryFrame() ;
    if (ajxHistory == null ) return ;        
    var doc = ajxHistory.contentDocument;
    if (doc == null || doc == undefined) { 
        // Internet Explorer
        doc = ajxHistory.contentWindow.document;
    }
    return doc;

}

function ajx_getHistoryData(htmlString)
{
    var str = new String() ;
    str = htmlString ;
    try{
        var startIndex = str.indexOf("<!--", 0) ;
        var endIndex = str.indexOf("-->", startIndex) ;    
        if (startIndex < 0 )
            return '';
        else
            return  str.substring(startIndex+4, endIndex);
    }
    catch(e)
    {
        return '' ;
    }
    
}

function ajx_getHistoryNodeValue(xNode)
{

    if (xNode.firstChild && xNode.firstChild.nodeType == 4)
    {
        return xNode.firstChild.data;    
    }
    if (xNode.text == 'undefined')
    {
            return xNode.nodeValue ;
    }
    else{
        return xNode.text ;    
    }
}


function __ajx_getXMLDoc()
{
    var doc = ajx_getHistoryDocument()
    if (doc == null || doc.firstChild == null )
        return null;
    var strData = ajx_getHistoryData(doc.firstChild.innerHTML) ;
    var xDoc = loadXML(strData) ;
    return xDoc;

}

function ajx_getHistoryNodes(nodeName)
{
    var xDoc = __ajx_getXMLDoc() ;
    if (xDoc == null) return null;
    var objs = xDoc.getElementsByTagName(nodeName) ;
    return objs;
}

function ajx_getHistory()
{       
    var xNodeHistoryList = ajx_getHistoryNodes('historyList');
    if (xNodeHistoryList == null) return null;
        
    var xNode = null ;
    var xChildNodes = null ;   
    var url; 
    var breadCrumb;
    var historyObj = new Array() ;
    var dataIndex = 0;
    var data = null ;       
    if (xNodeHistoryList != null && xNodeHistoryList.length > 0 )    
    {
        var xNodeHistoryNodes = xNodeHistoryList[0].childNodes;
        for (var i=0; i<xNodeHistoryNodes.length ; ++ i)
        {
            dataIndex = 0;
            xNode = xNodeHistoryNodes[i] ;            
            var atts = xNode.attributes;  
            var onLoadHandler = atts.getNamedItem("onLoadHandler").value; 

            xChildNodes = xNode.childNodes ;
            data = new Array();                
            for (var j=0; j<xChildNodes.length;++j)
            {
                switch(xChildNodes[j].nodeName)
                {
                    case 'url':
                        url = ajx_getHistoryNodeValue(xChildNodes[j]);                         
                        break;
                    case 'url':
                        url = ajx_getHistoryNodeValue(xChildNodes[j]);                         
                        break;  
                    case 'breadCrumb': 
                        breadCrumb = ajx_getHistoryNodeValue(xChildNodes[j]);                         
                        break;             
                    case 'data':
                        data[dataIndex] = ajx_getHistoryNodeValue(xChildNodes[j]); 
                        ++dataIndex;
                        break;
                    default:
                        break;
                }
            }
            
            historyObj[i] = new AjaxHistory(url, breadCrumb, data, onLoadHandler) ;
        }
    }
    return historyObj;       
}    



function ajx_onHistoryLoad()
{   
    if (!ajx_executeOnLoad) 
    {   
        ajx_executeOnLoad = true;
        return false;
    }
    
    var historyObj = ajx_getHistory() ;
    
    if (historyObj == null || historyObj.length == 0)
        return false;
    var retVal = false;
    var strLoadHistory = '' ;
    try{    
        for (var i=0 ; i < historyObj.length;++i)
        {
            strLoadHistory = historyObj[i].onLoadHandler + "('" + historyObj[i].url;
            
            if (historyObj[i].data != null && historyObj[i].data.length > 0 )
            {
                for(var j=0; j<historyObj[i].data.length; ++j)
                    strLoadHistory = strLoadHistory + "','" + historyObj[i].data[j];
            }
            strLoadHistory = strLoadHistory + "')" ;
            eval(strLoadHistory) ;
            retVal = true;
            if (historyObj[i].breadCrumbHTML != null && historyObj[i].breadCrumbHTML != '')
            {
                var divCrumb = document.getElementById("crumb") ;
                if (divCrumb != null)
                    divCrumb.innerHTML = historyObj[i].breadCrumbHTML; 
            }
        }
    }
    catch(e)
    {
        //alert (e.message) ;
        return false;
    }
        
    return retVal;
}

function initHistoryListener()
{    
    var ajxHistoryFrame = ajx_getHistoryFrame() 
    if (ajxHistoryFrame != null)
        addListener(ajxHistoryFrame, 'load', ajx_onHistoryLoad) ;
}

////////////////////////////////////////////////
////////// Ajax History Helper End ///////////
////////////////////////////////////////////////    
