var smartform = {

	form		: null,
	container   : null,
	url			: "",
	request		: null,
	page		: -1,
	event		: "",
	btnSubmit   : null,
	
	init : function()
	{
	    // hide all inline errors
		support.addStyleRule("span.error", "display:none !important");
	
		var oContainer = support.getElementsByClassName(document,"smartform")[0];
			oForm = support.getReal(oContainer,"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 && oContainer.innerHTML)
		{
			events.add(oForm, "submit", smartform.ajaxsubmit, false);
			smartform.form	= oForm;
			smartform.url	= oForm.action;
			smartform.page	= oPage.value;
			smartform.container = oContainer;
			
			var els = oForm.getElementsByTagName("*");
			
			for (var i=0; i<els.length; i++)
			{
				var el = els[i];
				
				if (el.tagName.toLowerCase()=="input" || el.tagName.toLowerCase()=="textarea" || el.tagName.toLowerCase()=="select")
				{
				    if (el.title!="") events.add(el, "mouseover", smartform.click, false);
				    
				    if ((el.name.substring(0,10)=="smartforms") && (el.type.toLowerCase()=="submit"))
				    {
				        smartform.btnSubmit = el;
					    events.add(el, "click", smartform.recordevent, false);
				    }
				}
			};
		}
	},

	click : function(e)
	{
		var e	= (e) ? e:event;
		var el	= (e.target) ? e.target : e.srcElement;
		
        if ((el.title!="") && (!el.error))
        {
	        var oError	= support.createElement((document.body || document.documentElement), "div", {"class": "tooltip"},"",el.title);
	        oError.style.top = support.getPos(el).y + support.getPos(el).h +  "px";
	        oError.style.left = support.getPos(el).x + "px";
	        el._title = el.title;
	        el.title = "";
	        el.error = oError;

	        events.add(el, "mouseout", smartform.hideerror, false);
        }
	},

	hideerror : function(e)
	{
		var e	= (e) ? e:event;
		var el	= (e.target) ? e.target : e.srcElement;

		if (el.error)
		{
            document.body.removeChild(el.error);
            el.title = el._title
            el.error = null;
		}
	},
	
	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);
		//smartform.form.disabled=true;
		//alert(serializeform.parse(smartform.form));
		smartform.post(serializeform.parse(smartform.form));
	},
	
	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("smartforms_page",smartform.page);
		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;

                    if (smartform.container!=null && sResult!="")
                    {
                        smartform.container.innerHTML = sResult;
                        smartform.dispose();
					    smartform.init();
                    }
				}break;
				
				default:
				{
                    alert("ERROR: " + smartform.request.status);
                    document.body.innerHTML=smartform.request.responseText;

        			//events.remove(smartform.form, "submit", smartform.ajaxsubmit, false);
                    //smartform.btnSubmit.click();
				}
           }
		}
	},
	
	dispose : function()
	{
	    smartform.form      = null;
	    smartform.container = null;
	    smartform.url       = null;
	    smartform.request   = null;
	    smartform.event     = null;
	    smartform.btnSubmit = null;
	}
}

// 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++)
			{
			    if ( els[i].name!="__VIEWSTATE")
			    {
				    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)];
	}
}