/***************************************************************************
 *   Copyright (C) 2007 by Denis Gabaidulin, Nickolay Korolyov             *
 *   sherman@oemdesign.ru, nk@oemdesign.ru                                 *
 ***************************************************************************/
/* $Id: simpleAjax.js 12353 2007-03-14 12:42:01Z sherman $ */

	// TODO:
	// 1. refactor.
	// 2. make server handle objects behavior ?
	
	// request ==========================
	
	// constructor
	function ajaxRequestObject(method)
	{
		if (!method)
			method = 'GET';
		
		if (
			window.XMLHttpRequest
			&& (
				navigator.appName
				!= 'Microsoft Internet Explorer'
			)
		) {
			this.responseObject =
				new ajaxResponseObject(
					new XMLHttpRequest()
				);
		} else if (window.ActiveXObject) {
			this.responseObject =
				new ajaxResponseObject(
					new ActiveXObject("Microsoft.XMLHTTP")
				);
		} else {
			alert('Your browser does not support Ajax');
			return;
		}
		
		this.url 	= null;
		this.method	= method;
	}
	
	function makeRequest(url, responseType, params)
	{
		if (!url)
			return false;
		
		this.url = url;
		
		if (!this.responseObject)
			return false;
		
		if (!responseType)
			responseType = 'boolean';
		
		this.responseObject
			.responseType =
				responseType.toString().toLowerCase();
		
		this.responseObject
			.xmlHttpObject
			.onreadystatechange =
				handleStateChanges;
		
		this.responseObject
			.xmlHttpObject
			.open(
				this.method,
				this.url,
				false
			);
	
		if (this.method == 'POST') {
			data = 	params;
			
			this.responseObject
				.xmlHttpObject
				.setRequestHeader(
					"Content-type",
					"application/x-www-form-urlencoded"
				);
			
      		this.responseObject
      			.xmlHttpObject
      			.setRequestHeader("Content-length", data.length);
      		
     	    this.responseObject
     	    	.xmlHttpObject
     	    	.setRequestHeader("Connection", "close");
		} else
			data = null;
	
		this.responseObject.xmlHttpObject.send(data);
		
		return this.responseObject.doResponse();
	}
	
	ajaxRequestObject.prototype.doRequest = makeRequest;

	// helpers
	
	function preparePostData(form)
	{
		var formElements = form.elements;
	
		var postData = '';
	
		for (var i = 0; i < formElements.length; i++) {
			if (formElements[i].name) {
				if (formElements[i].tagName.toLowerCase() == 'input')
					if (formElements[i].type.toLowerCase() == 'checkbox')
						value = handleCheckbox(formElements[i]);
					else
						value = formElements[i].value;
				else
					value = formElements[i].value;
				
				if (value) {
					postData += 
						escape(formElements[i].name)
						+ '=' 
						+ value
						+ '&';
				}
			}
		}
		
		return postData;
	}
	
	function handleCheckbox(element)
	{
		if (element.checked)
			return element.value;
		else
			return '';
	}
	
	// response ==========================
	
	function ajaxResponseObject(xmlHttpObject)
	{
		this.xmlHttpObject = xmlHttpObject;
		
		this.responseType	= null;
	}
	
	ajaxResponseObject.prototype.doResponse = makeResponse;
	
	function makeResponse()
	{
		var response = null;
		
		switch (this.responseType) {
			case 'boolean' :
				response =
					(parseInt(this.xmlHttpObject.responseText) == 1)
						? true
						: false;
				break;
			
			case 'xml' :
				response =
					(this.xmlHttpObject.responseXML)
						? this.xmlHttpObject.responseXML
						: 'No xml document found';
			break;
			
			case 'plain' :
				response =
					this.xmlHttpObject.responseText;
			break;
		}
		
		return response;
	}
	
	function handleStateChanges()
	{
		if (this.readyState == 4) {
	        if (this.status == 200) {
	        	/* ok */
	        } else
				alert('Request failed');
			}
	}
	
	// usage examples ===============================
	
	/*
	// GET Example:
		var request = new ajaxRequestObject();
		
		alert(request.doRequest('http://url/', 'plain'));
		
	// POST example:
		postData = preparePostData(document.forms['form_name']);
		
		var request = new ajaxRequestObject('POST');
		
		alert(
			request.doRequest(
				document.forms['form_name'].action,
				'plain',
				postData
			)
		);
	
	// Custom POST data prepare example:
		postData += 
			escape(name)
			+ '=' 
			+ value
			+ '&';
	*/
