function EstateWeb_Objects_HTTPManager(){
	this.Request = new EstateWeb_Objects_HTTPManager_Request();
	this.Browser = new EstateWeb_Objects_HTTPManager_Browser();
	this.Document = new EstateWeb_Objects_HTTPManager_Document();
}



//####################################################################
//####################################################################
// Request Object and supporting functions
//####################################################################
//####################################################################

function EstateWeb_Objects_HTTPManager_Request(){
	this.QueryString = EstateWeb_Objects_HTTPManager_Request_QueryString;
	this.AddToQueryString = EstateWeb_Objects_HTTPManager_Request_QueryString_Add;
}
//####################################################################
// -> Functions  follow
//####################################################################

function EstateWeb_Objects_HTTPManager_Request_QueryString_Add(key,value){
	//adds or replaces the value within the querystring with the key pair provided
	if ( this.QueryString().length > 0 ){
		var keys = this.QueryString().split("&");
		var matched = false;
		for ( var i = 0; i < keys.length; i ++ ){
			var item = keys[i].split("=");
			//alert(item[0] + '//'+key);
			if ( item[0].toLowerCase() == key.toLowerCase() ){
				//alert("matched");
				item[1] = value;
				keys[i] = item.join("=");
				matched = true;
				break;
			}
		}
		if (!matched){
			keys[keys.length] = key +"="+escape(value);
		}
		//reconstruct querystring
		return keys.join("&");
	}else{
		return key+"="+escape(value);
	}
}

function EstateWeb_Objects_HTTPManager_Request_QueryString(){
	//returns the querystring value of the key provided
	var queryString;
	queryString = document.location.href;
	if ( arguments.length > 0 ){
		if (queryString.toUpperCase().indexOf(arguments[0].toUpperCase()) >= 0 && queryString.indexOf("?") >= 0 ){
			var queryParams = queryString.split("?");
			var queryStringParams = queryParams[1].split("&");
			for (i=0;i<queryStringParams.length;i++){
				var queryParam = queryStringParams[i].split("=");
				if (queryParam[0].toUpperCase() == arguments[0].toUpperCase()){
					var oStringManager = new EstateWeb_Objects_HTTPManager_Strings();
					return oStringManager.Unescape(queryParam[1]);
				}
			}
		}
	}else{
		if ( queryString.indexOf("?") > 0 ){ return queryString.split("?")[1]; }
	}
	return "";
}

//####################################################################
//####################################################################
// BrowserObject and supporting functions
//####################################################################
//####################################################################

function EstateWeb_Objects_HTTPManager_Browser(){
	this.Type = EstateWeb_Objects_HTTPManager_Browser_Type;
	this.Types = new EstateWeb_Objects_HTTPManager_Browser_Types();
	this.HighCompatability = EstateWeb_Objects_HTTPManager_Browser_HighCompatability;
	this.Window = new EstateWeb_Objects_HTTPManager_Browser_Window();
	this.ViewableDimensions = EstateWeb_Obejcts_HTTPManager_Browser_ViewableDimensions;
	this.ScrollOffset = EstateWeb_Obejcts_HTTPManager_Browser_ScrollOffset;
	this.eventManager = EstateWeb_Objects_HTTPManager_Browser_EventManager;
	this.events = new this.eventManager();
}

function EstateWeb_Objects_HTTPManager_Browser_EventManager(){
	this.registrations = new Array();
	this.addHandler = EstateWeb_Objects_HTTPManager_Browser_EventManager_AddHandler;
	this.raiseEvent = EstateWeb_Objects_HTTPManager_Browser_EventManager_RaiseEvent;
}

function EstateWeb_Objects_HTTPManager_Browser_EventManager_RaiseEvent(eventname,sender,eventargs){
	//loop through the event registrations executing any that match the event name
	for ( var i = 0; i < this.registrations.length; i ++ ){
		if ( this.registrations[i].eventname == eventname ){
			eval( this.registrations[i].fnc( this.registrations[i].creator, sender, eventargs ) );
		}
	}
}

function EstateWeb_Objects_HTTPManager_Browser_EventManager_AddHandler(eventname, creator, fnc){
	this.registrations.push( 
											{
												"eventname" : eventname,
												"fnc" : fnc,
												"creator" : creator
											}
										)
}

function EstateWeb_Obejcts_HTTPManager_Browser_ScrollOffset(){
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function EstateWeb_Obejcts_HTTPManager_Browser_ViewableDimensions(){
  var browserwidth = 0, browserheight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    browserwidth = window.innerWidth;
    browserheight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    browserwidth = document.documentElement.clientWidth;
    browserheight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    browserwidth = document.body.clientWidth;
    browserheight = document.body.clientHeight;
  }
  return [ browserwidth, browserheight ];
}

function EstateWeb_Objects_HTTPManager_Browser_HighCompatability(){
	if ( this.Type() > 2 ){ return true }else{ return false}
}

function EstateWeb_Objects_HTTPManager_Browser_Type(){
	var oTypes = new EstateWeb_Objects_HTTPManager_Browser_Types();
	if ( window.opera ) { return oTypes.Opera }
	if ( document.layers ){ return oTypes.Netscape4 }
	if ( document.getElementById && !document.all ) { return oTypes.Mozilla }
	if ( document.getElementById && document.all ) { return oTypes.InternetExplorer5Plus }
	if ( document.all & !document.getElementById ) { return oTypes.InternetExplorer4Plus }
	
}

function EstateWeb_Objects_HTTPManager_Browser_Window(){
	this.Open = EstateWeb_Objects_HTTPManager_Browser_Window_Open;
}

function EstateWeb_Objects_HTTPManager_Browser_Window_Open(){
	window.open(arguments[0], arguments[1], arguments[2]);
}

function EstateWeb_Objects_HTTPManager_Browser_Types(){
	this.Netscape4 = 0;
	this.InternetExplorer4Plus = 1;
	this.Opera = 2;
	this.InternetExplorer5Plus = 3;
	this.Mozilla = 4;
}

//####################################################################
//####################################################################
// StringObject and supporting functions
//####################################################################
//####################################################################

function EstateWeb_Objects_HTTPManager_Strings(){
	this.Unescape = EstateWeb_Objects_HTTPManager_Strings_Unescape;
	this.isNumeric = EstateWeb_Objects_HTTPManager_Strings_IsNumeric;
}

function EstateWeb_Objects_HTTPManager_Strings_IsNumeric(s){
	if (isNaN(s)){
		return false;
	}else{
		return true;
	}
}

function EstateWeb_Objects_HTTPManager_Strings_Unescape(){
	if ( arguments.length > 0 ){
		// unescapes a string
		var val = arguments[0];
		val = val.replace("+", " ");
		return val;
	}
	return "";
}

//####################################################################
//####################################################################
// DocumentObject and supporting functions
//####################################################################
//####################################################################

function EstateWeb_Objects_HTTPManager_Document(){
	this.GetObject = EstateWeb_Objects_HTTPManager_Document_GetObject;
	this.SwapImageObject = EstateWeb_Objects_HTTPManager_Document_SwapImageObject;
	this.SwapImage = EstateWeb_Objects_HTTPManager_Document_SwapImage;
	this.Scripts = new EstateWeb_Objects_HTTPManager_Document_Scripts();
	this.WaitForObject = EstateWeb_Objects_HTTPManager_Document_WaitForObject;
	this.InnerWidth = EstateWeb_Objects_HTTPManager_Document_InnerWidth;
	this.GetObjectPosition = EstateWeb_Objects_HTTPManager_Document_GetObjectPosition;
	this.Forms = new EstateWeb_Objects_HTTPManager_Document_Forms();
	this.Errors = new EstateWeb_Objects_HTTPManager_Document_Errors();
}

function EstateWeb_Objects_HTTPManager_Document_Errors(){
	this.errors = new Array();
	this.add = EstateWeb_Objects_HTTPManager_Document_Errors_Add;
	this.show = EstateWeb_Objects_HTTPManager_Document_Errors_Show;
}

function EstateWeb_Objects_HTTPManager_Document_Errors_Add(application,msg){
	this.errors.push(
		{
			"application" : application,
			"message" : msg
		}
	);
}

function EstateWeb_Objects_HTTPManager_Document_Errors_Show(){
	for ( var i = 0; i < this.errors.length; i ++  ){
		alert(this.errors[i].application + "\n\n" + this.errors[i].message);
	}
}

function EstateWeb_Objects_HTTPManager_Document_Forms(){
	this.HtmlSelect = new EstateWeb_Objects_HTTPManager_Document_Forms_HtmlSelect();
	this.HtmlInputText = new EstateWeb_Objects_HTTPManager_Document_Forms_HtmlInputText();
}

function EstateWeb_Objects_HTTPManager_Document_Forms_HtmlSelect(){
	this.SelectedValue = EstateWeb_Objects_HTTPManager_Document_Forms_HtmlSelect_SelectedValue;
}

function EstateWeb_Objects_HTTPManager_Document_Forms_HtmlInputText(){
	this.Value = EstateWeb_Objects_HTTPManager_Document_Forms_HtmlInputText_Value;
}

function EstateWeb_Objects_HTTPManager_Document_Forms_HtmlInputText_Value(formname,elementname,value){
	if ( document[formname] ){
		//element exists?
		if ( document[formname][elementname] ){
			var oelem = document[formname][elementname];
			if ( oelem.tagName.toLowerCase() == "input" && oelem.type.toLowerCase() == "text" ){
				oelem.value = value;
			}else{
				alert("The element " + elementname + " is not of type HtmlInputText");
			}
		}
	}
}

function EstateWeb_Objects_HTTPManager_Document_Forms_HtmlSelect_SelectedValue(formname,elementname,value){
	//ensure that the form exists, the element exists and the value is one of the valid options
	if ( document[formname] ){
		//element exists?
		if ( document[formname][elementname] ){
			if ( document[formname][elementname].tagName.toLowerCase() == "select" ){
				//ensure that the value matches at least one of the items
				for (var i = 0; i < document[formname][elementname].options.length; i ++ ){
					var ooption = document[formname][elementname].options[i];
					if ( ooption.value == value.toString() ){
						ooption.selected = true;
						break;
					}
				}
			}else{
				alert("The element " + elementname + " is not of type HtmlSelect");
			}
		}
	}
}

function EstateWeb_Objects_HTTPManager_Document_SwapImage(o, src, op){
	var element;
	var oparent;
	if ( typeof o != "object" ){
		element = HttpManager.Document.GetObject(o);
	}else{ element = o }

	if ( op ){
		if ( typeof op != "object" ){
			oparent = HttpManager.Document.GetObject(op);
		}else{
			oparent = op;
		}
	}

	if (typeof document.aswapImage == "undefined" ){
		document.aswapImage = new Array();
	}
	for ( var i = 0; i < document.aswapImage.length; i ++ ){
		if ( document.aswapImage[i][0].id == element.id ){
			document.aswapImage.splice(i,1);
			break;
		}
	}
	var otarget = ( oparent ? oparent : element );
	document.aswapImage[document.aswapImage.length] = new Array(otarget, element, element.src);
	element.src = src;
	//if a parent is defined then attach the mouse out to that object, otherwise use the element itself
	otarget.onmouseout = function(){
		for ( var i = 0; i < document.aswapImage.length; i ++ ){
			if ( document.aswapImage[i][0] == this ){
				document.aswapImage[i][1].src = document.aswapImage[i][2];
				break;
			}
		}
	}
}

function EstateWeb_Objects_HTTPManager_Document_GetObjectPosition(ID){
	var oCoords = new Object();
	oCoords.x = 0;
	oCoords.y = 0;
	//set x and y coordinates 
	if ( this.GetObject(ID) ){
		var obj = this.GetObject(ID);
		if ( obj.offsetParent ){
			while ( obj.offsetParent ){
				oCoords.x += obj.offsetLeft;
				obj = obj.offsetParent;
			}
		}else if ( obj.x ) { oCoords.x += obj.x; }
		var obj = this.GetObject(ID);
		if ( obj.offsetParent ){
			while ( obj.offsetParent ){
				oCoords.y += obj.offsetTop;
				obj = obj.offsetParent;
			}
		}else if ( obj.y ) { oCoords.y += obj.y; }
	}
	return oCoords;
}

function EstateWeb_Objects_HTTPManager_Document_InnerWidth(){
	var oBrowser = new EstateWeb_Objects_HTTPManager_Browser();
	switch ( EstateWeb_Objects_HTTPManager_Browser_Type() ){
		case oBrowser.Types.InternetExplorer5Plus:oBrowser.Types.InternetExplorer4Plus
			return document.body.clientWidth;
			break;
		default:
			return window.innerWidth;
			break;
	}
}

function EstateWeb_Objects_HTTPManager_Document_WaitForObject(o){
	//waits for an object to become available then exists
	var isavailable = false;
	while (!isavailable){
		try{
			eval(o);
			isavailable = true;
		}catch (e){ }
	}
}

function EstateWeb_Objects_HTTPManager_Document_Scripts(){
    this.RegisterScriptLibrary = EstateWeb_Objects_HTTPManager_Document_Scripts_RegisterScriptLibrary;
}

function EstateWeb_Objects_HTTPManager_Document_Scripts_RegisterScriptLibrary(path){
    //registers a script library dynamically
   if ( document.getElementsByTagName ){
    if ( document.getElementsByTagName("head") ){
        var oScripts = document.getElementsByTagName("head")[0].childNodes;
        var bnewscript = true;
        if ( oScripts.length > 0 ){
            for(var i = 0; i < oScripts.length; i ++ ){
               if ( oScripts[i].attributes ){
                   for(var ii =0; ii< oScripts[i].attributes.length; ii++){
                        if ( oScripts[i].attributes[ii].nodeName.toLowerCase() == "src" ){
                            if ( oScripts[i].attributes[ii].nodeValue.toLowerCase() == path.toLowerCase() ){ bnewscript = false}
                            break; 
                        } 
                   } 
               }
            } 
        }  
         
        if (bnewscript){
            var oscript = document.createElement("script");
            oscript.setAttribute("type", "text/javascript");
            oscript.setAttribute("src", path);
            document.getElementsByTagName("head")[0].appendChild( oscript );
            //alert(document.getElementsByTagName("head")[0].innerHTML);
        }else{
           // alert("not new script");
       }  
    }  
  }  
}

function EstateWeb_Objects_HTTPManager_Document_SwapImageObject(){
	this.DestinationImageOriginalSRC;
	this.SourceImageFilename;
	this.DestinationImageID;
	this.Swap = EstateWeb_Objects_HTTPManager_Document_SwapImageObject_Swap;
	this.Restore = EstateWeb_Objects_HTTPManager_Document_SwapImageObject_Restore;
	this.GetDestinationImageOriginalSRC = EstateWeb_Objects_HTTPManager_Document_SwapImageObject_GetDestinationImageOriginalSRC;
}

function EstateWeb_Objects_HTTPManager_Document_SwapImageObject_Restore(){
	if ( HttpManager.Document.GetObject(this.DestinationImageID) ) {
		HttpManager.Document.GetObject(this.DestinationImageID).src = this.DestinationImageOriginalSRC;
	}
}

function EstateWeb_Objects_HTTPManager_Document_SwapImageObject_Swap(newImage,width,height){
	var newSRC = this.DestinationImageOriginalSRC;
	var lastPart = newSRC.substring(newSRC.indexOf("w=")+3);
	lastPart = lastPart.substring(lastPart.indexOf("&"));
	newSRC = newSRC.substring(0,newSRC.indexOf("&i=")+3) + newImage + newSRC.substring(newSRC.indexOf("&r="));
	newSRC = newSRC.substring(0,newSRC.indexOf("&h=")+3) + height + newSRC.substring(newSRC.indexOf("&w="));
	newSRC = newSRC.substring(0,newSRC.indexOf("&w=")+3) + width + lastPart;
	if ( HttpManager.Document.GetObject(this.DestinationImageID) ) {
		HttpManager.Document.GetObject(this.DestinationImageID).src = newSRC;
	}
}

function EstateWeb_Objects_HTTPManager_Document_SwapImageObject_GetDestinationImageOriginalSRC(){
	if ( HttpManager.Document.GetObject(this.DestinationImageID) ){
		this.DestinationImageOriginalSRC = HttpManager.Document.GetObject(this.DestinationImageID).src;
	}
}

function EstateWeb_Objects_HTTPManager_Document_GetObject(){
	var oBrowser = EstateWeb_Objects_HTTPManager_Browser_Type();
	var oBrowserTypes = new EstateWeb_Objects_HTTPManager_Browser_Types();
	var o;
	switch ( oBrowser ){
		case oBrowserTypes.Netscape4:
			o = document.all[arguments[0]];
			break;
		case oBrowserTypes.InternetExplorer4Plus:
			o = document.all[arguments[0]];
			break;
		case oBrowserTypes.Opera:
			o = document.getElementById(arguments[0]);
			break;
		case oBrowserTypes.InternetExplorer5Plus:
			o = document.getElementById(arguments[0]);
			break;
		case oBrowserTypes.Mozilla:
			o = document.getElementById(arguments[0]);
			break;
		default:
			o = document.getElementById(arguments[0]);
			break;
	}
	if ( o ){
		//if its an iframe then get a different reference method
		if ( o.tagName.toLowerCase() == "iframe" ){
			o = frames[arguments[0]];
		}
	}
	return o;
	
}


//self initialise
var HttpManager = new EstateWeb_Objects_HTTPManager();
//attach events
window.onload = function(){ HttpManager.Browser.events.raiseEvent("onload", this, null); }
window.onunload = function(){ HttpManager.Browser.events.raiseEvent("onunload", this, null); }