var smartform = {

	form		: null,
	url			: "",
	request		: null,
	page		: -1,
	event		: "",
	
	/*
		Considerations:
		?consider creating a bind method to allow for AJAX updates?
		?consider raising validation event errors on client?
	*/
	init : function()
	{
		var oForm = support.getElementsByClassName(document,"smartform")[0];
			oForm = support.getReal(oForm,"tagName","FORM");
			
		var oPage = support.$("smartforms_page");

		smartform.request = smartform._getxmlhttp();
		
		if (smartform.request.overrideMimeType) smartform.request.overrideMimeType('text/html');

		// only bind if request object created
		if (oForm && smartform.request)
		{
			events.add(oForm, "submit", smartform.ajaxsubmit, false);
			smartform.form	= oForm;
			smartform.url	= oForm.action;
			smartform.page	= oPage.value;
			
			var els = oForm.getElementsByTagName("input");
			
			for (var i=0; i<els.length; i++)
			{
				var el = els[i];
				
				if ((el.name.substring(0,10)=="smartforms") && (el.type.toLowerCase()=="submit"))
				{
					events.add(el, "click", smartform.recordevent, false);
				}
			};
		}
	},
	
	recordevent	: function(e)
	{
		var e	= (e) ? e:event;
		var el	= (e.target) ? e.target : e.srcElement;

		smartform.event = el.name;
	},
	
	ajaxsubmit : function(e)
	{
		events.cancel(e || event);
		
		var data = serializeform.parse(smartform.form);

		smartform.form.disabled=true;	// diable form and show loader
		smartform.post(data);			// post data
	},
	
	post : function(params)
	{
		smartform.request.onreadystatechange = smartform.response;
		smartform.request.open("POST", smartform.url, true);
		smartform.request.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		smartform.request.setRequestHeader("content-length", params.length);
		smartform.request.setRequestHeader("connection", "close");
		smartform.request.setRequestHeader("smartforms_callback", "true");
		smartform.request.setRequestHeader(smartform.event, "true");
		smartform.request.send(params);
	},
	
	_getxmlhttp : function()
	{
		/*@cc_on @*//*@if (@_jscript_version >= 5) try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {} try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} @end @*/
		try { return new XMLHttpRequest();} catch (e) {}
		return null;
	},
	
	response : function()
	{
		if (smartform.request.readyState == 4)
		{
           switch (smartform.request.status)
           {
				case 200:
				{
					var sResult = smartform.request.responseText;
					//var oResult = smartform.request.responseXML;

					// need to find a more elegant way of inserting the content innerHTML is not very reliable.
					//smartform.form.parentElement.innerHTML = sResult;
					//smartform.form.innerHTML = sResult;
					smartform.init();
					
				}break;
				
				default:
				{
					alert("ERROR: " + smartform.request.status);
					document.body.innerHTML=smartform.request.responseText;
				}
           }
		}
	}
	
}

// bind object init to onload event
//events.add(window, "load", smartform.init, false);

//
// Serialize a form
//
serializeform = {

	parse	: function(form)
	{
		var aParams	= [];
	
		for (tag in this)
		{
			var els = form.getElementsByTagName(tag);
			for (var i=0; i<els.length; i++)
			{
				var method = els[i].tagName.toLowerCase();
				var snode = this[method](els[i]);
				if (snode) aParams.push(snode);
			}
		}

		return aParams.join("&");
	},

	input: function(element)
	{
		switch (element.type.toLowerCase())
		{
			case 'submit':break;
			case 'hidden':
			case 'password':
			case 'text': return this.textarea(element);
			case 'checkbox': 
			case 'radio': return this.inputSelector(element);
		}
		return false;
	},

	inputSelector: function(element) {
		if (element.checked) return [element.name + "=" + encodeURI(element.value)];
	},

	textarea: function(element) {
		return [element.name + "=" + encodeURI(element.value)];
	},

	select: function(element)
	{
		var value = '';
		if (element.type == 'select-one')
		{
			var index = element.selectedIndex;
			if (index >= 0) value = element.options[index].value || element.options[index].text;
		}
		else
		{
			value = new Array();
			for (var i = 0; i < element.length; i++)
			{
			var opt = element.options[i];
			if (opt.selected) value.push(opt.value || opt.text);
			}
		}
		return [element.name + "=" + encodeURI(value)];
	}
}