/***************************************************************************
         jesus/modules/ajax.js  -  AJAX functions for JesuS library
                             -------------------
    begin                : Wed Dec 19 2007
    copyright            : (C) 2007 by Filios Konstantinos
    licence              : GNU GPL 2 (or later)
    email                : drcypher@mail.ntua.gr
    last modified        : Wed Dec 19 2007
    module version       : 1.0
 ***************************************************************************/

var JESUS_AJAX_STATE_UNSET = 0;
var JESUS_AJAX_STATE_OPENED = 1;
var JESUS_AJAX_STATE_HEADERS_RECEIVED = 2;
var JESUS_AJAX_STATE_LOADING = 3;
var JESUS_AJAX_STATE_DONE = 4;

function dom_from_xml(str)
{
	var doc;

	// Internet Explorer
	if (window.ActiveXObject) {
	  doc = new ActiveXObject("Microsoft.XMLDOM");
	  doc.async = "false";
	  doc.loadXML(str);

	// Mozilla, Firefox, Opera, etc.
	} else {
	  var parser = new DOMParser();
	  doc = parser.parseFromString(str,"text/xml");
	}

	return doc;
}

// TODO: if you do not update the div that you make the request loading message does not dissappear! FIx it!
var fn_ajax_recv_xml = function (xml, str_target)
{
	var str_xml, dom, d, arr_nodes;
//	log.debug("->FUNCTION ElementDowloaded called with parameters: " + xml + "," + elementtarget + "," + elementid + "," + str_type);

	if( (str_xml = xml.responseText) == '') {
		//log.error("->FUNCTION ElementDowloaded recieved 0 bytes data");
		return;
	}/* else {
		//log.debug("->FUNCTION ElementDowloaded recieved XML: OK");	}*/
				
	if ( (dom = dom_from_xml(str_xml)) == null) {
		//log.error("->FUNCTION dom_from_xml cannot create DOM from xml data");
		return;
	}/* else {
		//log.debug("->FUNCTION dom_from_xml created a fresh DOM from xml data");	}*/
				
	if ( !(d = doc(dom))) {
		return;
	}
	//log.debug("->var x=DOM.documentElement : " + x);
	var arr_nodes = d.childNodes;

	if (arr_nodes.length == 0) {
		//log.error("->FUNCTION fn_ajax_recv says that your xml data has no child nodes");
		return;
	}/* else {
		//log.debug("->FUNCTION fn_ajax_recv says that your xml data has " + childNodes.length + " nodes");	}*/
	//log.debug("->FUNCTION ElementDowloaded parses the DOM object!");
	// Loop through first-level (depth 1) nodes
	for (var i = 0; i < arr_nodes.length; i++) {
		var str_node_id = arr_nodes[i].getAttribute('elementid');
		var str_node_tag = arr_nodes[i].tagName;

		switch (str_node_tag) {
		// Execute javascript
		case 'executejs':
			//log.debug("->FUNCTION ElementDowloaded says that will execute your javascript code");			eval(arr_nodes[i].childNodes[0].nodeValue);
			break;

		// Set window title
		case 'settitle':
			document.title = arr_nodes[i].childNodes[0].nodeValue;
			break;

		// Just an HTML DOM element with content to be assigned
		default:
			// Fetch or create node
			if ( !(lmnt = $(str_node_id))) {
				//log.debug("->FUNCTION ElementDowloaded says cannot find element " + str_node_id + " in your HTML and will create this to parent");
				lmnt = new$(str_node_id, str_target);
				//log.debug("->FUNCTION ElementDownloaed create element " + str_node_id + " to parent " + elementid);
			}
			// Assign content
			if (lmnt) {
				lmnt.innerHTML = arr_nodes[i].childNodes[0].nodeValue;
			}
		}
	}
}

var fn_ajax_recv_html = function (xml, str_target)
{
	// Assign HTML to 'str_target'
	if ( (lmnt = $(str_target))) {
		lmnt.innerHTML = xml.responseText;
	}
	// Dynamic javascript execute if js contained into element!!!
	if ( (lmnt = $('js_' + str_target))) {
		eval(lmnt.innerHTML);
	}
}

var fn_ajax_recv_js = function (xml, str_target)
{
	if ( (lmnt = $(str_target))) {
		eval(xml.responseText);
		str_target.innerHTML = ''; // Disapear the loading message
	}
}

var fn_ajax_recv_unknown = function (xml, str_target)
{
	//log.error("FUNCTION fn_ajax_recv unknown type " + str_type);
	return;
};

function XHConnection()
{
	//
	// Class members
	//
	var _xmlhttp = null;
	var _bln_complete = false;
	var _str_target = '';
	var _str_type = '';
	var _fn_done = fn_ajax_recv_unknown;
	var _str_method = 'POST';

	//
	// Class methods
	//  
	this.strTarget = function() {return _str_target;};
	this.setTarget = function(str_target) {_str_target = str_target;};
	this.strType = function() {return _str_type;};
	this.setType = function(str_type) {
		_str_type = str_type;
		switch (str_type) {
		case 'text/xml':
			_fn_done = fn_ajax_recv_xml;
			break;
		case 'text/html':
			_fn_done = fn_ajax_recv_html;
			break;
		case 'text/javascript':
			_fn_done = fn_ajax_recv_js;
			break;
		default:
			_fn_done = fn_ajax_recv_unknown;
		}
	};

	//
	// Connect method
	//
	this.connect = function(str_script, str_args)
	{
		_bln_complete = false;

		try {
			if (_str_method.toUpperCase() == 'GET') {
				_xmlhttp.open(_str_method, str_script + '?' + str_args, true);
				str_args = '';
			} else {
				_xmlhttp.open(_str_method, str_script, true);
				_xmlhttp.setRequestHeader("Method", 'POST ' + str_script + ' HTTP/1.1');
				_xmlhttp.setRequestHeader("Content-Type",
					"application/x-www-form-urlencoded");
				_xmlhttp.setRequestHeader("charset", "windows-1253");
			}

			//
			// OnReadyStateChange method
			//
			_xmlhttp.onreadystatechange = function()
			{
				if (_xmlhttp.readyState == JESUS_AJAX_STATE_DONE && !_bln_complete) {
					_bln_complete = true;
					_fn_done(_xmlhttp, _str_target);
				} else if (_xmlhttp.readyState == JESUS_AJAX_STATE_LOADING) {
					$(_str_target).innerHTML = str_bytesize(_xmlhttp.responseText.length);
//				alert(_xmlhttp.readyState + '  ' + _xmlhttp.responseText.length);
				}
			};
			_xmlhttp.send(str_args);
		}
		catch (z) {
			return false;
		}

		return true;
	};

	//
	// Class constructor
	//
	try {
		_xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e) {
		try {
			_xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e) {
			try {
				_xmlhttp = new XMLHttpRequest();
			}
			catch (e) {
				_xmlhttp = null;
			}
		}
	}

	// If no XMLHttpRequest was created, bail out
	if (!_xmlhttp) {
		return null;
	}

	// Class constructor succedded;
	return this;
}

/*TODO: Look the for loop...problem with shit logs!*/
/*
* Function name: DowloadElement
* Parameters: (str_uri->The server file to call..we can pass parameters HERE) , (elementtarget->The html element for update) , ( inserttarget->Static html element to update) , (msg->Loading message for this reauest)
* Action: Main ajax http request function. Responsible for all the current request
*/
function ajax_request(str_uri, str_target, str_type, str_form)
{
	var str_args = '';

	// Check parameter sanity
	if (str_uri == '') {
		return false;
	}
	str_args = str_uri;
	
	// Get the target html element
	if (str_target == '' || !(dom_target = $(str_target))) {
		alert('Element "' + str_target + '" does not exist');
		return false;
	}

	// Let the script we call know which DOM element it will fill
	str_args += "&dom=" + str_target;

	//We have a form to submit
	if (str_form && (dom_form = $(str_form))) {
		/*What the fuck?
		If the document.getElementById is in FormToString() form not recognized!
		That means that FormToString take an HTML form parameter now...
		*/
		str_args += str_form_vars(dom_form, true);
	}

	// If child element is tr put message inside td! :p
	if (dom_target.nodeName == 'TR') {
		dom_target.innerHTML = '<td>' + JESUS_AJAX_LOADING + '</td>';
	}

	// Create the XMLHttpRequest connection
	var conx = new XHConnection();

	conx.setTarget(str_target);
	conx.setType('text/' + str_type);
//	conx.setMethod(JESUS_AJAX_METHOD);
	conx.connect(JESUS_AJAX_SCRIPT, str_args);

	return false;
}

function req_xml(str_uri, str_target, str_form)
{
	return ajax_request(str_uri, str_target, 'xml', str_form);
}

function req_html(str_uri, str_target, str_form)
{
	return ajax_request(str_uri, str_target, 'html', str_form);
}

function req_js(str_uri, str_target, str_form)
{
	return ajax_request(str_uri, str_target, 'javascript', str_form);
}

