// trader.js
//
// requires :
//   sarissa.js
//

var ajaxXmlUrl = "./";
var ajaxXmlGet = "";
var ajaxXmlPost = "";
var ajaxCB = undefined;

var debuging = false;

function FixTargetUrl(loc) {
    addLog("checking '"+loc+"' for invalid target");
    var q = new PageQuery(loc);
    var t = q.getValue("target");
    if(document.getElementById(t) == null ||
       document.getElementById(t) == "undefined") {
        if(document.getElementById("block") != "undefined") {
            addLog("target '"+t+"' does not exist, redirected target to block");
            q.setValue("target", "block");
            loc = q.getQueryString();
        }
    }
    return loc;
}

function initialize() {

    dhtmlHistory.initialize();
    
    dhtmlHistory.addListener(historyChange);

    if(dhtmlHistory.isFirstLoad()) {
        data = new Object();
        data.getParams = "m=index";
        data.url = "";
        currentLocation = dhtmlHistory.getCurrentLocation();
        if(currentLocation) {
            fetchXmlData(ajaxXmlUrl, FixTargetUrl(currentLocation), "");
        } else {
            dhtmlHistory.add("m=index", data);
        }
    }
}

function historyChange(newLocation, historyData) {
    if(historyData) {
        var xmlGet = historyData.getParams;
        var url = historyData.url;
        fetchXmlData(url, FixTargetUrl(xmlGet), "");
    }
}

function addEvent(obj, evType, fn) {
    
    if (obj.addEventListener) {

        obj.addEventListener(evType, fn, false);
        return true;
    } else if (obj.attachEvent) {

        var r = obj.attachEvent("on"+evType, fn);
        return r;
    } else {

        return false;
    }
}
addEvent(window, 'load', initialize);

function fetchXmlData (xmlUrl, xmlGet, xmlPost, cb) {
    ajaxXmlUrl = xmlUrl;
    ajaxXmlGet = xmlGet;
    ajaxXmlPost = xmlPost;
    ajaxCB = cb;
    window.setTimeout("fetchXmlData2()",50);
}

function fetchXmlData2 () {
    updateDataContent(ajaxXmlUrl, ajaxXmlGet, ajaxXmlPost, ajaxCB);
}

function runScripts(source){
    var nextLoc = 0;
    var loaded = true;
    var scriptString = "";
    var scriptTagStartLoc = 0;

    var scripts = source.split("<script");
    for(var i=0; i<scripts.length; i++) {
        try {
            var str = scripts[i];
            str = str.substring(str.indexOf(">")+1, str.length);
            str = str.substring(0, str.indexOf("</script>"));
            
            if(str) {
                addLog("script found : \r\n"+str);
                try {
                    eval(str);
                    addLog("script ran successfully");
                } catch(err) {
                    addLog("Exception caught executing a script : "+err+"\n"+str);
                }
            }
        } catch(err) {
            addLog("Exception caught parsing for script."+err);
        }
    }
}

function addLog(text) {
    if(debuging)
        if(document.getElementById("internalTest"))
            document.getElementById("internalTest").value = text + "\r\n" + document.getElementById("internalTest").value
}

function clearLog() {
    if(debuging)
        if(document.getElementById("internalTest"))
            document.getElementById("internalTest").value = ""
}

function loading(a) {
    if(a) {
        document.body.style.cursor = "wait";
        document.getElementById('loading').style.display='block'
        addLog("Start loading");
        //loading
    } else {
        document.body.style.cursor = "auto";
        document.getElementById('loading').style.display='none'
        addLog("Stop loading");
        //stop loading
    }
}

function cleanUrl(url) {

}

function updateDataContent (sFromUrl, xmlGet, xmlPost, cb) {
    try 
    {
        //clearLog();
        loading(true);
        
        url = sFromUrl;
        if(xmlGet != "") {
            url = url + "?" + xmlGet;
        }

        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("POST", url, true);
        addLog("posting data to : "+url);
        addLog("params : "+xmlPost);
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4) {
                try {
                    if (xmlhttp.responseXML != null) {
                        addLog("Data received : "+xmlhttp.responseText);

                        doc = xmlhttp.responseXML.documentElement;
                        if(doc) {
                            try{
                                targetNode = doc.getElementsByTagName("target").item(0);
                                targetValue = targetNode.childNodes.item(0).nodeValue;
                            }catch(err){addLog("failed to get targetValue : "+err);}
                            try{
                                contentNode = doc.getElementsByTagName("content").item(0);
                                contentValue = contentNode.childNodes.item(0).nodeValue;
                            }catch(err){addLog("failed to get contentValue : "+err);}

                            try {
                                addLog("Sending content to section : "+targetValue);
                                UpdateContent(targetValue, contentValue);
                            }catch(err){addLog("Exception updating content : "+err);}

                            addLog("updating history");
                            historyObj = new Object();
                            historyObj.getParams = xmlGet;
                            historyObj.url = sFromUrl;
                            dhtmlHistory.add(xmlGet, historyObj);
                            
                            //google ajax tracking
                            pageTracker._trackPageview(xmlGet);
                            
                            if(cb) {
                                cb();
                            }
                        } else {
                            addLog("XML is invalid.");
                        }
                    } else {
                        addLog("Response is null. "+xmlhttp.responseText);
                    }
                } catch(err) {
                    addLog("Exception caught : "+err);
                    //throw err;
                }
                loading(false);
            } else {
                addLog("Connection state : "+xmlhttp.readyState);
            }
        };
        xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xmlhttp.send(xmlPost);
    } 
    catch(e) {
        addLog('exception catched : '+e);
        //throw e;
        loading(false)
    }
}

function UpdateContent(target, content) {
    oTargetElement = document.getElementById(target);
    oTargetElement.innerHTML="";
    oTargetElement.innerHTML = content;

    runScripts(content);
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function switch_blocks(oldbox, newbox){
    document.getElementById(oldbox).style.display = 'none';
    document.getElementById(newbox).style.display = 'block';
}

function appendUrlParam(source, paramName, paramValue) {
    var result = "";
    if (source != "")
        result = source + '&';
    result = result + paramName + "=" + encodeURIComponent(paramValue);
    return result;
}

function goToPage(module, page, target, extra) {
    var params = "";
    if(!target) {
        target = 'block';
    }
    params = appendUrlParam(params, "m", module);
    params = appendUrlParam(params, "p", page);
    params = appendUrlParam(params, "method", "ajax");
    params = appendUrlParam(params, "target", target);
    params = params + '&' + extra;
    
    fetchXmlData(ajaxXmlUrl, params, "");
}

function open_thumb(w, h, s, i) {
    params = '?s=1';
    if(!w)
        w = 100;
    params = appendUrlParam(params, 'fw', w);
    if(!h)
        h = 100;
    params = appendUrlParam(params, 'fh', h);
    if(!s)
        s = "thumb_filename";
    params = appendUrlParam(params, 'inputobj', s);
    if(!i)
        i = "thumb_preview";
    params = appendUrlParam(params, 'imgobj', i);
    params = appendUrlParam(params, 'noclean', '');
    url = 'imanager/cropper.php'+params;
    childWindow = open(url, 'cropper', 'resizable=yes,scrollbars=yes,status=no,width=320,height=500');
    if(childWindow.opener == null) childWindow.opener = self;
}

function PageQuery(q) {
    // we want to store everything to the right of the ? in a key value pair array
    var qSplit = q.split("?");

    this.q = qSplit[qSplit.length - 1];    // use the right-most element since there may be ? chars in a hash

    this.keyValuePairs = new Array();

    if(this.q) {
        for(var i=0; i < this.q.split("&").length; i++) {
            this.keyValuePairs[i] = this.q.split("&")[i];
        }
    }

    this.getKeyValuePairs = function() { 
        return this.keyValuePairs;
    }

    this.getValue = function(s) {
        for(var j=0; j < this.keyValuePairs.length; j++) {
            if(this.keyValuePairs[j].split("=")[0] == s)
                return this.keyValuePairs[j].split("=")[1];
        }
        return false;
    }
    
    this.setValue = function(s, v) {
        for(var j=0; j < this.keyValuePairs.length; j++) {
            if(this.keyValuePairs[j].split("=")[0] == s) {
                this.keyValuePairs[j] = s+"="+v;
                return;
            }
        }
        this.keyValuePairs[this.getLength] = s+"="+v;
    }

    this.getParameters = function() {
        var a = new Array(this.getLength());
        for(var j=0; j < this.keyValuePairs.length; j++) {
            a[j] = this.keyValuePairs[j].split("=")[0];
        }
        return a;
    }
    
    this.getQueryString = function() {
        return this.keyValuePairs.join("&");
    }
    
    this.getLength = function() { 
        return this.keyValuePairs.length;
    }
}

var Dom = {
    get: function(el) {
        if (typeof el === 'string') {
            return document.getElementById(el);
        } else {
            return el;
        }
    },
    add: function(el, dest) {
        var el = this.get(el);
        var dest = this.get(dest);
        dest.appendChild(el);
    },
    remove: function(el) {
        var el = this.get(el);
        el.parentNode.removeChild(el);
    }
};

var Event = {
    add: function() {
        if(window.addEventListener) {
            return function(el, type, fn) {
                Dom.get(el).addEventListener(type,fn,false);
            };
        } else if (window.attachEvent) {
            return function(el, type, fn) {
                var f = function() {
                    fn.call(Dom.get(el), window.event);
                };
                Dom.get(el).attachEvent('on' + type, f);
            };
        }
    }()
};