/**********************************************************************
*
*   Sajax wrapper
*
**********************************************************************/

function CallPhpFunction()
{
	if (typeof(CallPhpFunction.arguments) == 'undefined' || !CallPhpFunction.arguments || CallPhpFunction.arguments.length == 0)
		return false;
	
	// *** Php function name
	var FunctionName = CallPhpFunction.arguments[0];
	// Parameters for function
	var Parameters = new Array();
	
	var arguments = CallPhpFunction.arguments;

	// Get Parametes from CallPhpFunction
	for (i = 1; i < arguments.length; i++)
	{
		/**
		* Submit all parameters as base64 encoded strings, so nothing will
		* get tangled in post.
		*/
		if (i < arguments.length - 1)
		{
			/**
			* Encode parameters
			*/
			Parameters[i - 1] = encodeURIComponent(Base64.encode(arguments[i]));
		}
		else
		{
			/**
			* Last argument is the javascript function to be called
			* after successfull sajax call, so let's not encode that.
			*/
			Parameters[i - 1] = arguments[i];
		}
	}

	// *** Call php function
	sajax_do_call(encodeURIComponent(Base64.encode(FunctionName)), Parameters);
}

// remote scripting library
// (c) copyright 2005 modernmethod, inc
var sajax_request_type = "POST";
var sajax_target_id = "";
var sajax_failure_redirect = "";

function sajax_init_object()
{
	var A;

	var msxmlhttp =
		new Array('Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP');

	for (var i = 0; i < msxmlhttp.length; i++)
	{
		try
		{
			A = new ActiveXObject(msxmlhttp[i]);
		}
		catch (e)
		{
			A = null;
		}
	}

	if (!A && typeof XMLHttpRequest != "undefined")
		A = new XMLHttpRequest();

	return A;
}

var sajax_requests = new Array();

function sajax_cancel()
{
	for (var i = 0; i < sajax_requests.length; i++)
		sajax_requests[i].abort();
}

function sajax_do_call(func_name, args)
{
	var i, x, n;
	var uri;
	var post_data;
	var target_id;

	target_id = sajax_target_id;

	if (typeof (sajax_request_type) == "undefined" || sajax_request_type == "")
		sajax_request_type = "GET";

	/*
	*   Check if custom uri has been set
	*/
	if (typeof window.sajax_remote_uri == 'undefined')
	{
		uri = document.URL;
	}
	else
	{
		uri = sajax_remote_uri;
	}

	if (sajax_request_type == "GET")
	{
		if (uri.indexOf("?") == -1)
			uri += "?rs=" + func_name;
		else
			uri += "&rs=" + func_name;
			
		uri += "&rst=" + escape(sajax_target_id);
		uri += "&rsrnd=" + new Date().getTime();

		for (i = 0; i < args.length - 1; i++)
			uri += "&rsargs[]=" + args[i];

		post_data = null;
	}
	else if (sajax_request_type == "POST")
	{
		post_data = "rs=" + func_name;
		post_data += "&rst=" + escape(sajax_target_id);
		post_data += "&rsrnd=" + new Date().getTime();

		for (i = 0; i < args.length - 1; i++)
			post_data = post_data + "&rsargs[]=" + args[i];
	}
	else
	{
		alert("Illegal request type: " + sajax_request_type);
	}

	x = sajax_init_object();

	if (x == null)
	{
		if (sajax_failure_redirect != "")
		{
			location.href = sajax_failure_redirect;
			return false;
		}
		else
		{
			return false;
		}
	}
	else
	{
		x.open(sajax_request_type, uri, true);

		sajax_requests[sajax_requests.length] = x;

		if (sajax_request_type == "POST")
		{
			x.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
			x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		}

		x.onreadystatechange = function()
		{
			if (x.readyState != 4)
				return;

			var status;
			var data;
			var txt = x.responseText.replace(/^\s*|\s*$/g, "");
			status = txt.charAt(0);
			data = txt.substring(2);

			if (status == "")
			{
			// let's just assume this is a pre-response bailout and let it slide for now
			}
			else if (status == "-")
				alert("Error: " + data);
			else
			{
				if (target_id != "")
					document.getElementById(target_id).innerHTML = eval(data);
				else
				{
					try
					{
						var callback;
						var extra_data = false;

						if (typeof args[args.length - 1] == "object")
						{
							callback = args[args.length - 1].callback;
							extra_data = args[args.length - 1].extra_data;
						}
						else
						{
							callback = args[args.length - 1];
						}
						callback(eval(data), extra_data);
					}
					catch (e)
					{
						alert('Error in request: ' + e);
					}
				}
			}
		}
	}

	x.send(post_data);
	delete x;
	return true;
}

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/
 
var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = Base64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = Base64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = new String(string);
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}
