var wm_Http_nvc = {
	add : function(pName, pHttpRequest){
		this.remove(pName);
		var pair = new this.Pair(pName, pHttpRequest);
		this.pairs.push(pair);
	},
	
	remove : function(pName){
		for (var p = 0; p < this.pairs.length; p++){
			if (this.pairs[p].name == pName){
				this.pairs.splice(p, 1);
				break;
			}
		}
	},
	
	getHttp : function(pName){
		for (var p = 0; p < this.pairs.length; p++){
			if (this.pairs[p].name == pName){
				return this.pairs[p].httpRequest;
			}
		}
	},
	
	pairs : [],
	
	Pair : function(pName, pHttpRequest){
		this.name = pName;
		this.httpRequest = pHttpRequest;
	}
}

function wm_getHttp_new(){
    //this function is a close copy from jibbering: http://jibbering.com/2002/4/httprequest.html
    //(however with the advent of XMLHttpRequest in IE7, the test object order is not good, but I need to keep it until I find a way to test IE7 myself)
    try {
        return new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            return new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
//            return null;
        }
    }

    if (!wm_Http && typeof XMLHttpRequest!='undefined') {
	    try {
		    return new XMLHttpRequest(); //Mozilla & Safari
	    } catch (e) {
//		    return null;
	    }
    }

    if (!wm_Http && window.createRequest) {
	    try {
		    return window.createRequest(); //IceBrowser
	    } catch (e) {
//		    return null;
	    }
    }

    return null;
}


var wm_Http = false;
function wm_getHttp(){
    //this function is a close copy from jibbering: http://jibbering.com/2002/4/httprequest.html
    //(however with the advent of XMLHttpRequest in IE7, the test object order is not good, but I need to keep it until I find a way to test IE7 myself)
    if (wm_Http){return wm_Http;}
    
    try {
        wm_Http = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
        try {
            wm_Http = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            wm_Http = false;
        }
    }

    if (!wm_Http && typeof XMLHttpRequest!='undefined') {
	    try {
		    wm_Http = new XMLHttpRequest(); //Mozilla & Safari
	    } catch (e) {
		    wm_Http=false;
	    }
    }

    if (!wm_Http && window.createRequest) {
	    try {
		    wm_Http = window.createRequest(); //IceBrowser
	    } catch (e) {
		    wm_Http=false;
	    }
    }

    return wm_Http;
}//wm_getHttp()

var tm_observable = new tm_Observable();//in fact the observable should be a Singleton (at least in this case)
function tm_Observable(){
	//observer pattern - the observeable notifies the observers by invoking the observe function on each observer
	this.observers = [];
	this.register = register;
	this.unregister = unregister;
	this.notify = notify;

	function register(pObserver){
		this.observers.push(pObserver);
	}

	function unregister(pObserver){
		var newSubscribers = [];
		for (var s = 0; s < this.observers.length; s++){
			if (this.observers[s] != pObserver){
				newSubscribers.push(this.observers[s]);
			}
		}
		this.observers = newSubscribers;
	}

	function notify(pState){
		//invoke the observe function on each observer
		for (var o = 0; o < this.observers.length; o++){
			this.observers[o].observe(pState);
		}
	}
}

function mm_getRequestHandler(pUniqueNodeID){
    var http = wm_getHttp();
    if (http.readyState == 4){
        if (http.status == 200){
            var responseText = http.responseText;
            if (responseText.indexOf("ERROR") == 0){
				alert(responseText);
            }
            else if (responseText.indexOf("SessionTimeout:") == 0){
				timeoutUrl = responseText.substring("SessionTimeout:".length);
				document.location.href = timeoutUrl;
				 
            }
            else{
//				var childs = eval('(' + responseText + ')');
//				tm_setSortOrder(childs, false);//false goRecursive (since this request never recieves a recursive fragment)
//				mm_substitute(mm_TopNode, childs, pUniqueNodeID, false);
//	            
//				mm_BuildHierarchy();
//	            
//				tm_observable.notify();
            }
        }
        else{
            alert("Problem: status code: " + http.status + " " + http.statusText);
        }
    }
}

function mm_getRequest(pUniqueNodeID, pHandlerFunction){
	var url = tm_getRequestUrl(pUniqueNodeID);

    var http = wm_getHttp();
    http.open("GET", url, true);//this does not actually send the request
	if (pHandlerFunction == null){
		http.onreadystatechange = function(){mm_getRequestHandler(pUniqueNodeID);};
    }
    else{
		http.onreadystatechange = pHandlerFunction;
    }
    http.send(null);//this send the request
}

function mm_getPostCallback(){
    var http = wm_getHttp();
    if (http.readyState == 4){
        if (http.status == 200){
            var responseText = http.responseText;
            if (responseText.indexOf("ERROR") == 0){
				alert(responseText);
            }
            else if (responseText.indexOf("SessionTimeout:") == 0){
				timeoutUrl = responseText.substring("SessionTimeout:".length);
				document.location.href = timeoutUrl;
            }
			else{
				alert(responseText + " - SiteManager will reload");
//				tm_getTop();//reload the data
            }
        }
        else{
            alert("Problem: " + http.status + " " + http.statusText);
        }
    }
}

