/* ==========================================================
     Design for Mambo javascript common ajax engine v1.0

     Author  : Nguyen Manh Cuong
     Email   : cuongnm@designformambo.com
     Homepage: http://designformambo.com
========================================================== */

if (typeof d4m_ajax_engine_included == 'undefined') {
	function d4m_ajax_engine() { // Define d4m_ajax_engine class
		// Define Settings
		var settings = new Array();
		settings['menthod'] = 'GET';
		settings['response_type'] = 'XML';
		settings['response_node'] = 'ajaxResponse';
		settings['response_update'] = 'innerHTML';
		settings['loading_status'] = false;
		settings['loading_text'] = 'Loading...';
		settings['async'] = true;
		settings['debug'] = false;
	
		this.setMenthod = function(menthod) { // Set menthod to send variables to server-side script
			if (menthod.toUpperCase() == 'GET' || menthod.toUpperCase() == 'POST')
				settings['menthod'] = menthod.toUpperCase();
		}
	
		this.setResponseType = function(responseType) { // Set response type for server-side script to return data
			if (responseType.toUpperCase() == 'XML' || responseType.toUpperCase() == 'TEXT')
				settings['response_type'] = responseType.toUpperCase();
		}
	
		this.setResponseNode = function(responseNode) { // Set the response root node for XML data
			settings['response_node'] = responseNode;
		}
	
		this.setResponseUpdate = function(responseUpdate) { // Update using innerHTML or by calling a function
			if (responseUpdate == 'innerHTML' || responseUpdate == 'function')
				settings['response_update'] = responseUpdate;
		}
	
		this.setLoadingStatus = function(show) { // Show or hide the loading text
			if (show == true || show == false)
				settings['loading_status'] = show;
		}
	
		this.setLoadingText = function(txt) { // Set the loading text
			settings['loading_text'] = txt;
		}
	
		this.setAsync = function(async) { // Set acsynchronous or synchronous request
			if (async == true || async == false)
				settings['async'] = async;
		}
	
		this.setDebug = function(set) { // Enable debug or not?
			if (set == true || set == false)
				settings['debug'] = set;
		}
	
		// Function to create request object
		function createRequestObject() {
			var ro;
			try {
				ro = new ActiveXObject('Msxml2.XMLHTTP');
			} catch (e) {
				try {  
					ro = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (oc) {
					ro = null;
				}
			}
			if (!ro && typeof XMLHttpRequest != 'undefined') {
				ro = new XMLHttpRequest();
			}
			if (!ro) {
				alert('Could not create XML HTTP request object.');
				return false;
			} else
				return ro;
		}
	
		// Define a common request object
		var http = createRequestObject();
		
		// Define a variable to store the response handler
		var responseHandler = '';
	
		// Function to send request
		this.sendRequest = function(backendURL, responseHandle) {
			if (settings['debug']) alert('Preparing to send request...');
			if (settings['loading_status'] && typeof swapLoading == 'function') swapLoading(settings['loading_text']);
			
			// Build query string
			var query_string = '';
			if (arguments.length > 2) {
				for (var i = 2; i < arguments.length; i++) {
					query_string += arguments[i]+'&';
				}
			}
			query_string += 'response_type='+settings['response_type'];
			query_string += settings['response_type'] == 'XML' ? '&response_node='+settings['response_node'] : '';
			if (settings['debug']) alert('Query string created: '+query_string);
			if (settings['menthod'] == 'GET') { // Send query string using GET menthod
				if (backendURL.indexOf('?') > -1)
					backendURL += '&' + query_string;
				else
					backendURL += '?' + query_string;
				if (settings['debug']) alert('Updated URL: '+backendURL);
			}
			
			// Open connection
			http.open(settings['menthod'], backendURL, settings['async']);
			
			if (settings['menthod'] == 'POST') { // Send query string using POST menthod
				try {
					http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				} catch (cp_err) {
					if (settings['debug']) alert('POST cannot be completed due to incompatible browser. Use GET as your request method.');
				}
			}
			
			if (settings['debug']) alert('Update response handler to: '+responseHandle);
			responseHandler = responseHandle; // Store the response handler
		    http.onreadystatechange = handleResponse;
		    
			if (settings['menthod'] == 'GET') { // GET menthod in use: send nothing
			    http.send(null);
			} else { // POST menthod in use: send query string to server
				http.send(query_string);
			}
			
			if (settings['async'] == false)
				handleResponse(); // Synchronous connection in use, call the response handle function manually
			
			if (settings['debug']) alert('Request has been sent.');
		}
	
		// Function to handle response
		function handleResponse() {
			if (http.readyState == 4) { // if response available, continue
				if (settings['debug']) alert('Processing response...');
				
				// response as XML or TEXT?
				var response = (settings['response_type'] == 'XML') ? http.responseXML : http.responseText;
				if (settings['debug']) alert('Response data: '+response);
				if (settings['loading_status'] && typeof swapLoading == 'function') swapLoading(settings['loading_text']);
				
				if (settings['response_update'] == 'innerHTML') { // Update directly using innerHTML
					if (settings['debug']) alert('Update type is: innerHTML.');
					if (typeof responseHandler != 'object' && !document.getElementById(responseHandler)) {
						// Passed element not defined
						if (settings['debug']) alert('Cannot update innerHTML for "'+responseHandler+'".');
					} else { // it`s time to update now
						responseHandler = typeof responseHandler == 'object' ? responseHandler : document.getElementById(responseHandler);
						if (settings['response_type'] == 'XML')
							responseHandler.innerHTML = response.getElementsByTagName(settings['response_node']).item(0).firstChild.data;
						else
							responseHandler.innerHTML = response;
						if (settings['debug']) alert('Updated innerHTML of handle element to: '+responseHandler.innerHTML);
					}
				} else { // call the passed function to handle response
					if (settings['debug']) alert('Update type is: function.');
					if (typeof responseHandler != 'function') {
						// Passed function not defined
						if (settings['debug']) alert('Cannot call "'+responseHandler+'" to update HTML document cause it is not a function.');
					} else { // call the passed function to update
						responseHandler(response);
						if (settings['debug']) alert('Called registered function to handle response.');
					}
				}
			}
		}
	}
	var d4m_ajax_engine_included = 1; // Has been loaded
}
