/**
 *	XMLhttp (send and) load
 *	-----------------------------------
 */

var XMLHttp = {
	debug:false,

	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);
					ClassName.remove(document.body, 'loading');
					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');
		}
		
		ClassName.add(document.body, 'loading');
		
		xmlhttp.send(doc);
		return async? xmlhttp : xmlhttp.responseXML;
	},
	
	abort:function(xmlhttp) {
		try {
			xmlhttp.onreadystatechange = null;
			xmlhttp.abort();
		} catch (e) {}
	},

	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, select = /select/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) {
				if(select.test(element.nodeName)) {
					var opt = element[element.selectedIndex];
					post += element.name + '=' + escape(opt.value || opt.text) + '&';
				} else {
					post += element.name + '=' + escape(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.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 form = document.createElement('form');
			form.action = url; form.method = method; form.target = '_blank';
			var input = '', param, params = (post || '').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();
		}
	}
}