//
// $Id: xmlhttp.js,v 1.2 2008/05/16 05:48:06 frank Exp $
//
// Copyright 2006-2007 Tribue (Frank M. Kromann)
// Use of this file is only permitted with the authors consent.

// TODO: Make assync and implement global

function XMLHttp() {
	this.status = false;
	this.xmlhttp = false;
	this.URL = null;
	
	if (window.XMLHttpRequest) {		// code for Mozilla, etc.
		this.xmlhttp = new XMLHttpRequest()
	}
	else if (window.ActiveXObject) {	// code for IE
		this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP")
	}

	this.Response = function() {
		var xmldoc = this.xmlhttp.responseXML;
		if (xmldoc) {
			var scr = xmldoc.getElementsByTagName('script');
			for (var i = 0; i < scr.length; i++) {
				if (scr[i].firstChild) {
					eval(scr[i].firstChild.data);
				}
			}
		}
		var tmp = this.xmlhttp.responseText.replace(/<\?xml.*?\/?>/gim, "");
		tmp = tmp.replace(/<body>(.*)<\/body>/gim, "\1");
		return tmp.replace(/<script.*?\/script>/gim, "");
	}

	this.ProcessStatus = function() {
		switch (this.xmlhttp.status) {
			case 200 :			// if "OK"
				return this.Response();
				break;
			case 404 :
				return "<div class=\"Error\">HTTP: 404 File not found</div><div>" + this.URL + "</div>";
				break;
			default :
				alert('GetContent Status: ' + this.xmlhttp.status + ' is not supported at this time.');
				break;
		}
	}
	
	this.GetContent = function(URL) {
		this.URL = URL;
		if (this.xmlhttp) {
			this.xmlhttp.open("GET", URL, false);
			this.xmlhttp.send("");
		}
		if (this.xmlhttp.readyState == 4) {
			return this.ProcessStatus();
		}
		return this.status;
	}
	
	this.PostContent = function(URL, form_id) {
		this.URL = URL;
		if (this.xmlhttp) {
			var form_obj = document.getElementById(form_id + "_form");
			if (form_obj){
				var content = '', r = [];
				for(var i = 0; i < form_obj.length; i++) {
					switch (form_obj.elements[i].type) {
						case 'undefined' :
							break;
						case 'radio' :
							if (form_obj.elements[i].checked) {
								r[r.length] = encodeURIComponent(form_obj.elements[i].name) + "=" + encodeURIComponent(form_obj.elements[i].value);
							}
							break;
						case 'select-one' :
							var index = form_obj.elements[i].selectedIndex;
							r[r.length] = encodeURIComponent(form_obj.elements[i].name) + "=" + encodeURIComponent(form_obj.elements[i].options[index].value);
							break;
						case 'select-multiple' :
							var val = 0;
							for (var o = 0; o < form_obj.elements[i].length; o++) {
								if (form_obj.elements[i].options[o].selected) {
									val += form_obj.elements[i].options[o].value;
								}
							}
							r[r.length] = encodeURIComponent(form_obj.elements[i].name) + "=" + encodeURIComponent(val);
							break;
						case 'checkbox' :
							if (form_obj.elements[i].checked) {
								r[r.length] = encodeURIComponent(form_obj.elements[i].name) + "=" + encodeURIComponent(form_obj.elements[i].value);
							}
							else {
								r[r.length] = encodeURIComponent(form_obj.elements[i].name) + "=" + encodeURIComponent(0);
							}
							break;
						default :
							r[r.length] = encodeURIComponent(form_obj.elements[i].name) + "=" + encodeURIComponent(form_obj.elements[i].value);
							break;
					}
				}
				content = r.join('&');
				this.xmlhttp.open("POST", URL, false);
				this.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
				this.xmlhttp.setRequestHeader('encoding', 'UTF8');
				this.xmlhttp.send(content);
			}
			else {
				alert('Object: ' + form_id + ' not found!');
			}
		}
		if (this.xmlhttp.readyState == 4) {
			return this.ProcessStatus();
		}
		return this.status;
	}

	this.GetJSON = function(URL) {
		this.URL = URL;
		if (this.xmlhttp) {
			this.xmlhttp.open("GET", URL, false);
			this.xmlhttp.send("");
		}
		if (this.xmlhttp.readyState == 4) {
			return this.xmlhttp.responseText;
		}
		return this.status;
	}
}

function SetFocus(form, field) {
	var form_obj = document.getElementById(form);
	if (form_obj && form_obj.length) {
		for (var i = 0; i < form_obj.length; i++) {
			if (form_obj.elements[i].name == field) {
				var field_obj = form_obj.elements[i];
				if (field_obj.select) {
					// IE 7 requires his call twice to work !!!
					field_obj.select();
					field_obj.select();
				}
				if (field_obj.focus) {
					field_obj.focus();
				}
				return;
			}
		}
	}
}

var focus_form = null;
var focus_field = null;

function UpdateContent(id, URL) {
	focus_form = null;
	focus_field = null;
	if (URL && URL.length > 0) {
		var obj = document.getElementById(id);
		if (obj){
			var HTTPobj = new XMLHttp();
			var tmp = HTTPobj.GetContent(URL);
			if (tmp != '') {
				obj.innerHTML = tmp;
			}
			if (focus_form && focus_field) {
				SetFocus(focus_form, focus_field);
			}
		}
		else {
			alert('Object: ' + id + ' not found!');
		}
	}
}

function UpdateContentOnLoad(iframe, id, URL) {
	var obj = document.getElementById(iframe);
	if (obj) {
        if (obj.contentDocument) {   
            var d = obj.contentDocument;   
        }
        else if (obj.contentWindow) {   
            var d = obj.contentWindow.document;   
        }
        else {   
            var d = window.frames[iframe].document;   
        }   
        if (d.location.href == "about:blank") {   
            return;   
        }
        if (d.body.innerHTML == "DONE") {
			UpdateContent(id, URL);
		}
	}
}

function ResetForm(form_id) {
	var form_obj = document.getElementById(form_id + "_form");
	if (form_obj) {
		form_obj.reset();
	}
}

function PostContent(id, URL, form_id) {
	focus_form = null;
	focus_field = null;
	var obj = document.getElementById(id);
	if (obj){
		var HTTPobj = new XMLHttp();
		obj.innerHTML = HTTPobj.PostContent(URL, form_id);
		if (focus_form && focus_field) {
			SetFocus(focus_form, focus_field);
		}
	}
	else {
		alert('Object: ' + id + ' not found!');
	}
}

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

function getScroll() {
	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 ];
}