var sform = {

	form : null,
	body : null,
	request	: null,
	page : -1,
	btnSubmit : null,
	
	init : function()
	{
		sform.body = support.getElementsByClassName(document,"smartform")[0];
	    sform.form = support.getReal(sform.body,"tagName","FORM");

		var oPage = support.$("smartforms_page");
        sform.page = (oPage) ? oPage.value : -1;
        
        // if open in custom window, close window.
        if ((sform.page==-1) && (parent) && (parent.windows))
        {
            //parent.windows.hide();
            //if (parent.Refresh) parent.Refresh();
        }

        if (window.tooltip)
        {
            // hide all inline errors
	        support.addStyleRule("span.error", "display:none !important;");
        }

		// only bind if request object created
		if (sform.form && sform.body.innerHTML && window.Ajax && window.SerializeForm)
		{
            events.add(window, "unload", sform.dispose);
			
			// record current page number
			sform.page = oPage.value;
			
			// retrive all form elements
			var els = support.getElementsByType(sform.body, "input,select,textarea");
			
			for (var i=0; i<els.length; i++)
			{
				var el = els[i];
				
			    // bind properties
			    support.parsedata(el);
			    
			    // record submit event for ajax
			    if ((el.name.substring(0,10)=="smartforms") && (el.type.toLowerCase()=="submit"))
			    {
			        sform.btnSubmit = el;
				    events.add(el, "click", sform.controlclick);
			    }
			    else if (el.ajaxevent)
                {
                    // assign ajax events to dom
		            for (var x=0; x<el["ajaxevent"].length; x++)
		            {
		                events.add(el, el["ajaxevent"][x].replace("on",""), sform.ajaxevent);
		            }
		        }
			};
		}
	},
	
	controlclick : function(e)
	{
	    if (!Ajax.processing)
	    {
            var aHeaders = new Object()
                aHeaders['connection']='close';
                aHeaders['smartforms_page'] = sform.page;
                aHeaders[e.target.name] = 'true';
                
            sform.disabled(true);
                
            Ajax.run({headers:aHeaders, callback:sform.response, loading:true, send:SerializeForm.parse(sform.form)});
        }
        
        return false;
    },
	
	ajaxevent : function(e)
	{
	    if (!Ajax.processing)
	    {
            var aHeaders = new Object()
                aHeaders['connection']='close';
                aHeaders['smartforms_page'] = sform.page;
                aHeaders['smartforms_ajaxeventtype'] = e.type.replace('on','');
                aHeaders['smartforms_ajaxeventname'] = e.target.name;
                aHeaders['smartforms_ajaxeventvalue'] = e.target.value;

            sform.disabled(true);

            Ajax.run({headers:aHeaders, callback:sform.response, loading:true, send:SerializeForm.parse(sform.form)});
        }
        
		return false;
	},
	
	response : function(res,params)
	{
        if (sform.body!=null && res!="")
        {       
			events.remove(sform.form, "submit", sform.ajaxsubmit);
            sform.dispose();
            sform.body.innerHTML = res;
            sform.disabled(false);
	        sform.init();
	        if (window.tooltip) tooltip.init();
	        if (window.repeater) repeater.init();
	        if (window.selector) selector.init();
	        if (window.toggle) toggle.init();
	        if (window.upload) upload.init();
	        if (window.maxlen) maxlen.init();
	        if (window.highlight) highlight.init();
        }
	},

    /* turn class commands into key/value expando properties */
    bindproperties : function(el, prefix)
    {
	    if (el.parsed) return el;
    	
	    var aClass = new String(el.className).split(' ');
	    var oRegEx = new RegExp(/\b(smartforms)-([a-zA-Z0-9]*)-([a-zA-Z0-9]*)\b/);
    	
	    for (var i=0; i<aClass.length; i++)
	    {
		    var	aMatch = oRegEx.exec(aClass[i]);
    		
		    if (aMatch && aMatch.length>=2)
		    {
		       el[aMatch[2]] = (aMatch[3]!="") ? aMatch[3] : true;
		    }
	    }
    	
	    el.parsed = true;
	    return el;
    },
    
    disabled : function(status)
    {
		var els = support.getElementsByType(sform.body, "input,select,textarea");
		
		for (var i=0; i<els.length; i++)
		{
			els[i].disabled=status;
        }
    },
    
	dispose : function()
	{
	    sform.form      = null;
	    sform.container = null;
	    sform.url       = null;
	    sform.request   = null;
	    sform.btnSubmit = null;
	}
}

// bind object init to onload event
events.add(window, "load", sform.init);
