var DEBUG_ENABLED = true;
var PROFILE_ENABLED = true;

function debugOut(str){
	if (!DEBUG_ENABLED) return false;
	
    var elem = getElement(window, "jsdebug");
    if (elem){
        elem.innerHTML += str + "<br>";
    }else{
        alert("Couldn't get console");
    }
}

function profile(str){ 
    if (PROFILE_ENABLED) debugOut(getMS()+" "+str);
}

function getMS(){
	var date = new Date();
	//return date.getMilliseconds();
	return date.getTime();
}

function getElement(win, elname){
	if (!win) return null;
	if (win.document.getElementById) return win.document.getElementById(elname);
	else if (win.document.all) return win.document.all[elname];
	else if (win.document.layers) return win.document.layers[0].elname;
	else return null;
}

function isInArray(str, a){
	if (!a||!a.length) return false;
	for(var i in a) if (a[i]==str) return true;
	return false;
}

function addToArray(elem, a){
	if (!a) a = new Array();
	if (isInArray(elem, a)) return a;
	a.push(elem);
	return a;
}

function removeFromArray(elem, a){
	if (!isInArray(elem, a)) return a;
	var newa = new Array();
	
	for(var i in a){
		if (a[i]!=elem) newa.push(a[i]);
	}
	return newa;
}

function removeKeyFromArray(key,a){
	var newa = new Array();
	if (!a) return a;
	for(var i in a){
		if (i!=key) newa[i]=a[i];
		else debugOut("removing "+key);
	}
	return newa;
}

function countAssocArray(a){
	if (!a) return 0;
	var c=0;
	for(var i in a) c++;
	return c;
}

function removeWord(str,word){
    var words;
    var out="";
    
    if (str.indexOf(word)<0) return str;
    
    words = str.split(" ");
    for(var i=0;i<words.length;i++){
        if (words[i]!=word) out+=(i?" ":"")+words[i];
    }
    return out;
}


function addWord(str, word){
    if (str.indexOf(word)<0) return str+(str?" ":"")+word;
    else return str;
}

function removeClass(element, cname){
	if (!cname) return false;
    try{
        var oldval=element.className;
        var newval=removeWord(oldval,cname);
        element.className=newval;
    }catch(e){
        echo(e);
    }
}

function removeClassFromID(win, id, cname){
	var elem = getElement(win, id);
	if (elem) removeClass(elem, cname);
}

function addClass(element, cname){
	if (!cname) return false;
    try{
        var oldval=element.className;
        var newval = addWord(oldval, cname);
        element.className=newval;
    }catch(e){
        echo(e);
    }
}

function setElementIDClass(eid, classname){
	var elem = getElement(window, eid);
	if (!elem) return false;
	
	elem.className = classname;
}

function setElementDisplay(eid, disp){
	var elem = getElement(window, eid);
	if (elem) elem.style.display=disp;
}

function toggleElementDisplay(eid){
	var elem = getElement(window, eid);
	if (elem) elem.style.display = (elem.style.display==""?"none":"");
}

function showElementID(eid){
	setElementDisplay(eid, "");
}

function hideElementID(eid){
	setElementDisplay(eid, "none");
}

function addClassToID(win, id, cname){
	var elem = getElement(win, id);
	if (elem) addClass(elem, cname);
}

function setInnerHTML(id,html){
	var elem = getElement(window, id);
	if (elem) elem.innerHTML=html;
}

function setElementValue(id, val){
	var elem = getElement(window, id);
	if (elem) elem.value=val;
}

function getElementValue(eid){
	var elem = getElement(window, eid);
	if (elem) return elem.value;
}

function URLencode(sStr) {
	return escape(sStr).replace(/\+/g, '%2C').replace(/\"/g,'%22').replace(/\'/g, '%27');
}

function disableHTML(str){
	return str.replace(/\>/g, '&gt;').replace(/\</g, '&lt;');
}

function appendOption(select, value, label, selected){
	var opt = document.createElement("option");
	opt.value = value;
	opt.appendChild(document.createTextNode(label));
	opt.selected = selected;
	select.appendChild(opt);
}

function delSpaces(str){
    var tokens = str.split(' ');
    return tokens.join('');
}

function getCookie(cname){
    var raw = document.cookie;
    if (!raw) return false;
    var pairs = raw.split(';');
    for(i=0;i<pairs.length;i++){
        var pair = delSpaces(pairs[i]);
        var parts = pair.split('=');
        if (parts[0]==cname) return parts[1];
    }
    return false;
}

///////////////////////////////////////////////////////////////
//		XMLHttpRequest and XML Utils
///////////////////////////////////////////////////////////////

var req;

function getNodeText(node){
    try{
        var data = '';
        for(var i=0;i<node.childNodes.length;i++)
        	data += node.childNodes[i].nodeValue;
        return data;
    }catch(e){
	    return "";
    }
}

function getNodeChildByTag(node, tag){
    var i;

    try{
        for (i=0;i<node.childNodes.length;i++){
            if (node.childNodes[i].nodeName==tag) return node.childNodes[i];
        }
    }catch(e){}
    return false;
}

function getSingleNodeText(xmlobj,name){
    var elem = xmlobj.getElementsByTagName(name);
    try{
        return getNodeText(elem[0]);
    }catch(e){
        return "";
    }
}

function getChildNodeText(node, tag){
	var cnode = getNodeChildByTag(node, tag);
	var data = '';
	try{
		return getNodeText(cnode);
	}catch(e){}
	return "";
}

function updateStatus(win, message, handlerFun){
	var elem = getElement(win, "reportbox");
	if (elem) elem.innerHTML = message;
}

function getXMLDoc(win, url, handlerFunc) {
	profile("getXMLDoc called: "+url);
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
		req.onreadystatechange = handlerFunc;
		req.open("GET", url, true);
		req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
		isIE = true;
		req = new ActiveXObject("Microsoft.XMLHTTP");
        if (!req) return false;
		req.onreadystatechange = handlerFunc;
		req.open("GET", url, true);
		req.send();
    }
}


function postXMLDoc(win, url, contents, handlerFunc) {
	profile("postXMLDoc called: "+contents);
	updateStatus(win, "Connecting to server...");
	// branch for native XMLHttpRequest object
	if (window.XMLHttpRequest) {
		req = new XMLHttpRequest();
    // branch for IE/Windows ActiveX version
	} else if (window.ActiveXObject) {
		isIE = true;
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (!req) return false;
	req.onreadystatechange = handlerFunc;
	req.open("POST", url, true);
	req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	req.setRequestHeader('Content-Length', contents.length);
	req.send(contents);
}


// handle onreadystatechange event of req object
function processReqChange() {
    // only if req shows "loaded"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            //var datatype=getSingleNodeText(req.responseXML,"type");
            //profile("Got response: "+datatype);
			//if (datatype=="m") updateMessageList(req.responseXML);
         } else {
            //alert("There was a problem retrieving the XML data:\n" + req.statusText);
         }
    }
}

