/**
 *	XMLhttp (send and) load
 *	-----------------------------------
 */

var XMLHttp = {
	debug:true,

	load:function(url, func, scope){ 
		return this.sendAndLoad(null, url, func, scope, 'get'); 
	},

	sendAndLoad:function(doc, url, func, scope, type){
		var xmlhttp = this.getXMLHttp();
		var async = func? true:false; 
		var method = type || 'post';

		xmlhttp.open(method, url, async);
		if(async) {
			xmlhttp.onreadystatechange = function() {
				if(xmlhttp.readyState == 4)	{
					if(XMLHttp.debug) XMLHttp.checkParseError(xmlhttp, url, doc, method);
					func.call(scope || window, xmlhttp.responseXML, xmlhttp.status);
				}
			}
		}
		
		xmlhttp.setRequestHeader('Accept', 'text/xml,application/xml');
		xmlhttp.setRequestHeader('Referer', document.location.href);
		xmlhttp.setRequestHeader('User-Agent', navigator.userAgent);
		
		if(/post/i.test(method) && /string/i.test(typeof doc)) {
			xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			xmlhttp.setRequestHeader('Content-length', doc.length );
			xmlhttp.setRequestHeader('Connection', 'close');
		}
		
		xmlhttp.send(doc);
		if(!async) return xmlhttp.responseXML;
	},

	sendForm:function(form, url, func, scope) {
		var post = this.getFormValues(form);
		return this.sendAndLoad(post, url || form.getAttribute('action'), func, scope);
	},

	getFormValues:function(form) {
		var element, type, post = '', input = /(text|select)/i, hidden = /hidden/i;
		for (var i=0; i<form.elements.length; i++) {
			element = form.elements[i], type = element.type;
			if((input.test(type) && element.offsetHeight) || hidden.test(type) || element.checked) {
				post += element.name + '=' + element.value + '&';
			}
		}	return post;
	},

	getXMLHttp:function() {
		if(window.XMLHttpRequest) {
			return new XMLHttpRequest();
		} else if(window.ActiveXObject) {
			var xmlhttp, http = ['Microsoft.XMLHTTP', 'Msxml2.XMLHTTP'], l = http.length;
			while(l--) {
				try {
					xmlhttp = new ActiveXObject(http[l]);
					return xmlhttp;
				} catch (e) {}
			}
		} else return false;
	},

	checkParseError:function(xmlhttp, url, post, method) {
		var debug, xml = xmlhttp.responseXML, first = xml? xml.firstChild : null;
		if(!xml || xml.parseError || xml.childNodes.length == 0 || (first && /parser?error/i.test(first.nodeName))) {
			debug = confirm('XML parsing error in: ' + url + ' ('+xmlhttp.status+')' + 
				((xml && xml.characterSet)? '\nCharacter encoding: ' + xml.characterSet : '') + 
				((first && first.firstChild)? '\n\nDetails: ' + first.firstChild.nodeValue : '') +
				'\n\nView XML response in a new window?'
			);
		}

		if(debug) {
			var query = post || '';
			switch (method) {
				case 'get':
					window.open(url +'?' + query);
				break;
				default:
					var form = document.createElement('form');
					form.action = url; form.method = 'post'; form.target = '_blank';
					var input = '', param, params = query.split('&');
					for (var i=0; i<params.length; i++) {
						param = params[i].split('='); if(!param[0]) continue;
						input += '<input name="'+param[0]+'" value="'+param[1]+'" type="hidden" />';
					}

					form.style.display = 'none';
					form.innerHTML = input;
					document.body.appendChild(form);
					form.submit();
                    return false;
			}
		}
	}
}