// u: url
// p: parameters = 'var1=content1&var2=content2'
// m: method = (0 = POST, 1 = GET)
// r: return type = (0 = Text, 1 = Object (XML))
// f: function name
function makeRequest(u, p, m, r, f) {
	var http_request = false;
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
			http_request.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // IE
		try {
			http_request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request) {
		alert('Err: #01');
		return false;
	}
	http_request.onreadystatechange = function(){
		if (http_request.readyState == 4) {
			if (http_request.status == 200) {
				/*
				if ((!r) && http_request.responseText.substr(0,4) == 'Err:') return alert(http_request.responseText);
				else f((r) ? http_request.responseXML : http_request.responseText);
				*/
				if (http_request.responseText.substr(0,4) == 'Err:') return alert(http_request.responseText);
				else f((r) ? http_request.responseXML : http_request.responseText);
			} else {
				alert('Err: #02');
			}
		}
	}
	http_request.open(((m) ? 'GET' : 'POST'), u + ((m) ? '?' + p : ''), true);
	http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http_request.send((!m) ? p : '');
}

// a: array
function createParam(a) {
	var i, s='';
	for (i in a) if (typeof a[i]=='string'||typeof a[i]=='number') s += ((s!='') ? '&' : '')+i+'='+URLEncode(a[i]);
	return s;
}

function sendHttpRequestText(p, f) {
	p = createParam(p);
	makeRequest(URL_HTTPREQUEST, 'nA='+ARRPAR[0]+((p!='') ? '&'+p : ''), 0, 0, f);
}

function sendHttpRequestXml(p, f) {
	p = createParam(p);
	makeRequest(URL_HTTPREQUEST, 'nA='+ARRPAR[0]+((p!='') ? '&'+p : ''), 0, 1, f);
}

function URLEncode(plaintext){
	var SAFECHARS = "0123456789" +
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'()";
	var HEX = "0123456789ABCDEF";
	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
			    alert( "Unicode Character '"
                        + ch
                        + "' cannot be encoded using standard URL encoding.\n" +
				          "(URL encoding only supports 8-bit characters.)\n" +
						  "A space (+) will be substituted." );
				encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	}

	return encoded;
};

function URLDecode(encoded){
   var HEXCHARS = "0123456789ABCDEFabcdef";
   var plaintext = "";
   var i = 0;
   while (i < encoded.length) {
       var ch = encoded.charAt(i);
	   if (ch == "+") {
	       plaintext += " ";
		   i++;
	   } else if (ch == "%") {
			if (i < (encoded.length-2)
					&& HEXCHARS.indexOf(encoded.charAt(i+1)) != -1 
					&& HEXCHARS.indexOf(encoded.charAt(i+2)) != -1 ) {
				plaintext += unescape( encoded.substr(i,3) );
				i += 3;
			} else {
				alert( 'Bad escape combination near ...' + encoded.substr(i) );
				plaintext += "%[ERROR]";
				i++;
			}
		} else {
		   plaintext += ch;
		   i++;
		}
	}
   return plaintext;
}

