/* **********************************************/
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/*                                              */
/************************************************/

//ajax tracker  async, sync

//to change showItems function Default Values change values below
var SHOWITEMS_DEFAULT_TIMEOUT=1;
var SHOWITEMS_DEFAULT_ASYNC=true;

//global variables used by pageActionTracer(), SleepWithAsyncReset()
var last_action=0; 
var reset=false;


// backward-compatibility function to add custom action

// indexs for parameters array elements
var PARAM_PAGE_ID_INDEX=0;
var PARAM_ACTION_INDEX=1;
var PARAM_ASYNC_INDEX=2;
var PARAM_TIMEOUT_INDEX=3;

// multi-dim array column index
var PARAM_NAME_INDEX=0;
var PARAM_VALUE_INDEX=1;

// Params holds records for all parameters allowed in queryString Variable
// this allow parameters validation and add new parameters without update the exists code
function setParametersDefault(){
    var Params=new Array();
    Params[PARAM_PAGE_ID_INDEX]=new Array('pageId','$mandatory$'); //mandatory parameters
    Params[PARAM_ACTION_INDEX]=new Array('action','$mandatory$');   //mandatory parameters
    Params[PARAM_ASYNC_INDEX]=new Array('async',SHOWITEMS_DEFAULT_ASYNC); //optional with default value=SHOWITEMS_DEFAULT_ASYNC
    Params[PARAM_TIMEOUT_INDEX]=new Array('timeout',SHOWITEMS_DEFAULT_TIMEOUT); //optional with default value=SHOWITEMS_DEFAULT_TIMEOUT
    return Params;
}

// showItems function for bakcward combitability
// this function can parse the specified parameters even with those are unordered
function showItems(queryString){
    var GoodParam;
    var UserParams;
    var Params=setParametersDefault();
    if(queryString.indexOf("?")==0)
        queryString=queryString.substr(1);   // remove queryString question mark if specified
    UserParams=queryString.split("&");      //retrieve string parameters
    for(var CurrentParam=0;CurrentParam<Params.length;CurrentParam++){  //go through all specified Params[] parameters
        GoodParam=false; // by default parameter is not specified
        for(var CurrentUserParam=0;CurrentUserParam<UserParams.length;CurrentUserParam++){  //find the current Params[] paramater in the user specified paramaters
            var NameValue=UserParams[CurrentUserParam].split("="); //get name value pairs
            if(Params[CurrentParam][PARAM_NAME_INDEX]==NameValue[0]){ // if the user paramater = the current Params[] Parameter
                Params[CurrentParam][PARAM_VALUE_INDEX]=NameValue[1]; // retrieve the value
                GoodParam=true; //parameter is specified
                break;          // no more loop, parameter found
            }
        }
        // if the paramater is not specified and the default value for current Params[] = mandatory, raise error
        if ((GoodParam==false) && (Params[CurrentParam][PARAM_VALUE_INDEX]=='$mandatory$')){
            alert('showItems() Parameter Not specified :' + Params[CurrentParam][PARAM_NAME_INDEX]);
            return;
        }
    }    
    if((Params[PARAM_ACTION_INDEX][PARAM_VALUE_INDEX]==2) && (navigator.userAgent.toLowerCase().indexOf('safari') > -1) && (navigator.userAgent.toLowerCase().indexOf('chrome')==-1))
        Params[PARAM_ASYNC_INDEX][PARAM_VALUE_INDEX]=false;
    // if the action specified by the user not equal 1 or load, send the request, backward combitabilities
    if(Params[PARAM_ACTION_INDEX][PARAM_VALUE_INDEX]!=1)
        return pageActionTracer(Params[PARAM_PAGE_ID_INDEX][PARAM_VALUE_INDEX],
                Params[PARAM_ACTION_INDEX][PARAM_VALUE_INDEX],Params[PARAM_ASYNC_INDEX][PARAM_VALUE_INDEX],
                Params[PARAM_TIMEOUT_INDEX][PARAM_VALUE_INDEX]);
}

// add load action
function trace_load(pageid,async,timeout){
    return pageActionTracer(pageid,1,async,timeout);
}
// add unload action
function trace_unload(pageid,async,timeout){
    if ((navigator.userAgent.toLowerCase().indexOf('safari') > -1) && (navigator.userAgent.toLowerCase().indexOf('chrome')==-1))
            async=false;
    return pageActionTracer(pageid,2,async,timeout);
}
// add use click action
function trace_click(pageid,async,timeout){
    return pageActionTracer(pageid,3,async,timeout);
}
            
// add custom action            
function pageActionTracer(pageId,action,async,timeout){ 
    var url="http://www.construction-estimating.com/ajax-tracker.php";
    var str="pageId=" + pageId + "&action=" + action + "&PageName=" + escape(document.location.pathname);
    var xmlHttp=GetXmlHttpObject();
    if (xmlHttp==null)
        alert("Browser does not support HTTP Request");
    else{   
            if(last_action==0){                         
                    reset=!(async);
                    xmlHttp.onreadystatechange=function(){
                                                            if(xmlHttp.readyState==4){
                                                                reset=true;
                                                            }
                                                         }
                    last_action=action;
                    xmlHttp.open("GET",url + "?" + str,async);
                    xmlHttp.send(null);
                    SleepWithAsyncReset(timeout);
                    last_action=0;
            }
    }
    return true;
}

// sleep we async reset singal
function SleepWithAsyncReset(time){
    var now=Date.parse(new Date());
    do{
        var current=Date.parse(new Date());
        if (reset)
            break;
    }while (((current - now)/1000) < time);
}

// get XMLHttp object
function GetXmlHttpObject(){ 
    var objXMLHttp=null;
    if (window.XMLHttpRequest)
        objXMLHttp=new XMLHttpRequest();
    else if (window.ActiveXObject)
        objXMLHttp=new ActiveXObject("Microsoft.XMLHTTP");
    return objXMLHttp;
}