
    function formTemplatePostData( formName ){

        registerEvent( "onunload", "unload", refreshParentWindow );

		if( validateFormTemplate( document.forms[ formName ], formName+"_div" ) == false ) return;

		document.getElementById(formName+"_div").innerHTML = 'loading...';

        var numKeyFields = 0, numFormFields = 0;

        var formValues = new Array();
		formValues[0]  = new Array();
		formValues[1]  = new Array();

		for( var i=0; i< document.forms[formName].length; ++i ){

			if( i == 0 ){
                formValues[0][i] = document.forms[ formName ].elements[i].value;
            }
            if( i == 1 ){
                numKeyFields = document.forms[ formName ].elements[i++].value * 2;

                var arrKeys = Array();
                var arrKeyValues = Array();

                for( var j=0; j<numKeyFields/2; ++j, ++i )
                      arrKeys[j] = document.forms[ formName ].elements[i].value;

                for( var j=0; j<numKeyFields/2; ++j, ++i )
                      arrKeyValues[j] = document.forms[ formName ].elements[i].value;

                formValues[0][1] = arrKeys;
                formValues[0][2] = arrKeyValues;
            }

			if( i > numKeyFields ){
				formValues[1][numFormFields] = new Array();
				formValues[1][numFormFields][0] = document.forms[ formName ].elements[i].id;

                if( document.forms[ formName ].elements[i].type == 'checkbox' ){
                    if( document.forms[ formName ].elements[i].checked ) formValues[1][numFormFields][1] = "1";
                    else formValues[1][numFormFields][1] = "0";
                }
                else{
                     // spaw editor case: get content from spaw internal iframe
                     if( document.forms[ formName ].elements[i].type == 'textarea' && document.getElementById( document.forms[ formName ].elements[i].id + "_rEdit") ){
                         var spaw_iframe = document.getElementById( document.forms[ formName ].elements[i].id + "_rEdit");
                         formValues[1][numFormFields][1] = spaw_iframe.contentWindow.document.body.innerHTML;
                     }
                     else formValues[1][numFormFields][1] = document.forms[ formName ].elements[i].value;
                }
                formValues[1][numFormFields][2] = document.forms[ formName ].elements[i].getAttribute("writedb");
				formValues[1][numFormFields][3] = document.forms[ formName ].elements[i].getAttribute("validate");
				formValues[1][numFormFields][4] = document.forms[ formName ].elements[i].getAttribute("msg");
				formValues[1][numFormFields][5] = document.forms[ formName ].elements[i].type;

                numFormFields++;
            }
		}
		x_formTemplatePostData( formName, JSON.stringify( formValues ) , formTemplatePostData_cb );
	}


    // recives and array with form instance name, submit result,
    // new id in insert form case and post result string
	function formTemplatePostData_cb( ret ){

        if( ret[1] && ret[2] > 0 ){
            // updates keyvalue after insert new record in db
            document.forms[ ret[0] ].keyValue0.value = ret[2];
        }
        var resume = document.getElementById( ret[0]+"_div" );
    	resume.innerHTML = ret[3];
    	resume.style.display = "block";

        // verifies if listener is defined and calls it.
        var isDefined = eval('(typeof ' + formTemplate_callResult + '==\'function\');');

        if( isDefined ) formTemplate_callResult( ret[0], ret[1], ret[2] );
	}


	/* Autocomplete form plugin */

	function showAutocomplete( db_TableName, db_idField, db_nameField, otherSql, htmlField ){
		var divObj = document.getElementById( htmlField + "_autocompleteDiv" );

		var html = '<div style="position: absolute; background-color:#f9f9f9; border: 1px solid #787878;">';
		html += '<table cellpadding="0" cellspacing="0"> <tr bgcolor="#e8e8e8"> <td height="22px"> <span class="text"> &nbsp;Insira o texto a procurar: </span> </td>';
		html += '<td align="right"> <a href="javascript:clearAucompleteResults(\''+ htmlField +'\')">[X] &nbsp;</a> </span> </td> </tr>';
		html += '<tr> <td colspan="2"> <input type="text" class="inputField" id="'+htmlField+'_autocompleteSearch" size="40" onKeyUp="ajax_autocomplete( \''+db_TableName+'\', \''+db_idField+'\', \''+db_nameField+'\', \''+otherSql+'\', \''+htmlField+'\' );"> <br>';
		html += '<div id="'+htmlField+'_autocompleteResults" class="text"> Digite o texto a pesquisar...<br></div> <br>';
		html += '</td> </tr> </table> </div>';

		divObj.innerHTML = html;
		document.getElementById(htmlField+'_autocompleteSearch').focus();
	}


	function ajax_autocomplete( db_TableName, db_idField, db_nameField, otherSql, htmlField ){

		var searchElem = document.getElementById( htmlField + "_autocompleteSearch" );

		if( searchElem.value.length >= 2 )
			x_ajax_autocomplete( db_TableName, db_idField, db_nameField, otherSql, searchElem.value, htmlField, ajax_autocomplete_cb );
	}


	function ajax_autocomplete_cb( arr_values ){
		var htmlField, htmlContent = '<table width="100%">';

		var j=0;
		for( i in arr_values ){

			if( j==0 ) htmlField = arr_values[i];

			if( j>0 ){
				if( i%2 ) htmlContent += '<tr> <td width="100%" colspan="2" onMouseOver=this.style.backgroundColor="#e0e0e0" onMouseOut=this.style.backgroundColor="#f2f2f2" onClick="setAucompleteResult( \''+ htmlField +'\', \''+ arr_values[i] ;
				else htmlContent += '\',\''+ arr_values[i] +'\' )"> &nbsp;<a href="#">'+ arr_values[i] +'</a> </td> </tr> ';
			}
			++j;
		}
		document.getElementById( htmlField + "_autocompleteResults" ).innerHTML = htmlContent + '</table>';
	}


	function setAucompleteResult( htmlField, db_id, db_value ){
		document.getElementById( htmlField ).value = db_id;
		document.getElementById( htmlField + "_autocomplete" ).value = db_value;
		document.getElementById( htmlField + "_autocompleteDiv" ).innerHTML = "";
		document.getElementById( htmlField + "_autocomplete" ).focus();
	}


	function clearAucompleteResults( htmlField ){
		document.getElementById( htmlField + "_autocompleteDiv" ).innerHTML = "";
	}
	
	
	// Multi-select widget
	// return array with selectedValues
	function formTemplate_getMultiSelectValues( obj_id ){
		var contcatsArray = $('input:checkbox[name='+obj_id+']:checked').serializeArray();
		var arrSmsContacts = new Array();
		var j=0;
		for( var i in contcatsArray )
			arrSmsContacts[j++] = contcatsArray[i].value;
    	
    	return arrSmsContacts;
	}
	
	
	function formTemplate_setMultiSelectValues( multiSelect, arr_selectedValues ){
		if( arr_selectedValues.length == 0 ) return;
		$('input:checkbox[name="'+ multiSelect +'"]').each(function() {
  			for( var i=0; i < arr_selectedValues.length; ++i )
  				if( $(this).val() == arr_selectedValues[i] ){ $(this).attr("checked","true"); break; }
		});	
	}
	


	function refreshParentWindow(evt){
		window.opener.focus();
		window.opener.document.getElementById("gridTable_page").focus();
    	window.opener.document.getElementById("gridTable_page").blur();
	}


	function registerEvent( event_ie, event_firefox, function_ptr ){
        if(window.attachEvent) {
		    window.attachEvent(event_ie, refreshParentWindow);
	    } else {
		    if(window.addEventListener) {
			    window.addEventListener( event_firefox, refreshParentWindow, false);
		    } else {
		    	window.onunload = refreshParentWindow;
		    }
	    }
    }

