/*

Kinetics form ajax framework funcitons
Copyright® Kinetics Multimedia (www.kinetics.com.br)

*/


//iframe count for upload
var uploadct = 0;

function fieldvalue( fld )
{
	if( isdefined( fld ) ) return fld.value;
	return '';
}

// insert hidden field to create upload file iframe


	//div.innerHTML = '<img id="uploadimage'+ ident + '" src="' + src + '" onload="imgmaxdim(this,' + maxdisplay + ');uploadimgloaded(this);"><br><div id="btn_up"><form><input type="button" value="'+bottitle+'" onmouseover="position();"/></form></div><br><iframe src="' + url + '" scrolling="No" frameborder="No" id="fileiframe' + ident + '" class="uploadiframe"></iframe>';
function ie8error()
{
	if( $('ie8') == null )
	{
		log = ce( 'div' );
		log.id = 'ie8';
		document.body.appendChild( log );
	}
}

function uploadfile( field, bottitle, maxsize, maxdisplay, obj )
{
	if( field.processed ) return;

	var oldname = field.name;
	var ident = field.name + uploadct++;

	var bgcolor = field.getAttribute( 'bgcolor' ); if( bgcolor == null ) bgcolor = ''; bgcolor = escape( bgcolor );
	var link = field.getAttribute( 'link' ); if( link == null ) link = ''; link = escape( link );
	var div, src;
	field.id = 'hiddenupload' + ident;
	field.ident = ident;
	src = field.value;
	field.basevalue = src;
	if( src == '' ) src = 'kintool/' + csspath + '/noimage.gif';
	div = ce( 'div' );
	div.className = 'uploaddiv';

	uploaddiv = ce( 'div' );
	uploaddiv.id = objid(uploaddiv);
	uploaddiv.style.overflow='hidden';
	uploaddiv.style.position='relative';
	field.parentNode.insertBefore( uploaddiv, field );

	uploaddiv.appendChild( div );
	url = 'uploader.php?ident='+ ident + '&max=' + maxsize + '&maxdisplay=' + maxdisplay + '&bot=' + bottitle + '&bgcolor=' + bgcolor;

	var newdiv = ce('DIV');
	newdiv.innerHTML='<div id="btn_file'+ident+'" name="btn_file"><form id="frm'+ident+'" enctype="multipart/form-data" action="uploader.php" method="POST" target="fileiframe' + ident + '"><input type="hidden" name="ident" value="'+ident+'"><input type="hidden" id="'+ident+'_inpt" value="'+oldname+'"><input type="hidden" name="'+oldname+'" id="'+oldname+'"><input type="hidden" name="max" value="'+maxsize+'"><input type="hidden" name="maxdisplay" value="'+maxdisplay+'"><input type="hidden" name="bot" value="'+bottitle+'"><input type="hidden" name="bgcolor" value="'+bgcolor+'"><input type="hidden" name="setClass" value="'+field.getAttribute( 'setClass' )+'"><input type="File" id="fileup'+ident+'" name="file" size="1" accept="image/gif" iid="file" oonchange="change(\''+ident+'\');" class="fileinpt" oonmouseout="restore(\''+ident+'\');"style="font-size: 80px;" /></form></div>';
	//document.body.appendChild(newdiv);
	uploaddiv.insertBefore( newdiv, div );
	
	if(link==1)
		var txt= '<input type="button" value="'+bottitle+'" id="imgbutton' + ident + '" style="margin-top: 4px;"/>';
	else if(link==2)
		var txt= '<a id="imgbutton' + ident + '">'+bottitle+'</a>';
	else
		var txt= '<span id="imgbutton' + ident + '" class="'+field.getAttribute( 'setClass' )+'">'+bottitle+'</span>';

	div.innerHTML = '<img id="uploadimage'+ ident + '" src="' + src + '" onload="imgmaxdim(this,'+maxdisplay+'); uploadimgloaded(this); "><br><div id="btn_up'+ident+'">'+txt+'</div><iframe scrolling="No" frameborder="No" id="fileiframe' + ident + '" class="uploadiframe" name="fileiframe' + ident + '" src="" width="0" height="0"></iframe>';
	$('uploadimage'+ident).canvas = obj;

	if(link==1)
		formatbutton( $('imgbutton' + ident ) );	
	
	$('imgbutton' + ident ).ident = ident;
	$('imgbutton' + ident ).onmouseover= function(){ position( this ); }
	$('fileup'+ident).ident=ident;
	$('fileup'+ident).onmouseout= function(){ restore(this.ident); }
	$('fileup'+ident).onchange= function(){ change(this.ident); }
	$('btn_file'+ident).style.overflow='hidden';
	$('btn_file'+ident).style.width = 0;
	$('btn_file'+ident).style.height = 0;

	imgmaxdim($('uploadimage'+ ident ), maxdisplay);
	//getmouseover($('imgbutton' + ident ));
	field.processed = true;
}

function formatbutton( obj )
{
	 if(obj==null)
		return;	 
	 obj.className = 'button';
	 inputbackground( obj );
}
function getmouseover( obj )
{
	while(obj!=null)
	{
		debug(obj.id, obj.onmouseover);
		obj=obj.parentNode;
	}
}
var top=0;
var left=0;
function position( obj )
{
	ident=obj.ident;

	$('btn_file'+ident).style.position='absolute';
	$('btn_file'+ident).style.width=$('imgbutton' + ident ).offsetWidth+200;
	$('btn_file'+ident).style.height=$('imgbutton' + ident ).offsetHeight;
	$('btn_file'+ident).style.overflow='hidden';

	if(navigator.appName=='Microsoft Internet Explorer') 
	{
		$('fileup'+ident).style.position='absolute';
		$('fileup'+ident).style.top=0;
		$('fileup'+ident).style.left= -($('fileup'+ident).clientWidth + 40);	
	}

	$('fileup'+ident).style.fontSize = 80+'px';
	
	/*
	left=getLeft($('btn_file'+ident));
	top=getTop($('btn_file'+ident));
	
	var x = getLeft($('btn_up'+ident));
	var y = getTop($('btn_up'+ident));

	fieldid= $('btn_file'+ident).getAttribute("uploaddiv");
	*/

	obj=$('imgbutton'+ident);
	var y = obj.offsetTop;
	var x = obj.offsetLeft;
	x -=200;

	$('btn_file'+ident).style.left= x;
	$('btn_file'+ident).style.top= y;
}
function restore(ident)
{
	$('btn_file'+ident).style.left=0;
	$('btn_file'+ident).style.top=0;
	$('btn_file'+ident).style.width=0;
}
function change( ident )
{
	if($('fileup'+ident).value!='')
	{
		var frm = document.getElementById( 'frm'+ident );
		frm.submit();
	}
	//document.body.innerHTML = '<div class=loading>Uploading</div>';
}

//function called then some image file upload is completed
function uploadimgloaded( img )
{
	//$('img').value=img.src;
	var obj = img.canvas;
	if( isfunction( obj.onchange ) ) obj.onchange();
}

//function called then some file upload is completed
function uploadcomplete( ident, src, maxdisplay, w, h, item )
{
	var img = $('uploadimage'+ident);
	var hidden = $('hiddenupload'+ident);
	hidden.value = item;
	//CHANGES
	if (img!= null) img.value=src;

	if( isfunction( hidden.onchange ) ) hidden.onchange();
	if ( src == '' ) src = 'kintool/' + csspath + '/noimage.gif';
	var max = Math.max( w, h );
	if( max == 0 ) max = 10000;
	var rate = max > maxdisplay ? maxdisplay/max : 1;
	w = Math.floor(w*rate);
	h = Math.floor(h*rate);
	img.src = src;
	img.style.width = w;
	img.style.height = h;
	img.onload = function() { uploadimgloaded( this );};

	if($(ident+'_inpt')!=null)
		if($($(ident+'_inpt').value)!=null && $('uploadimage'+ident)!=null)
			$($(ident+'_inpt').value).value = $('uploadimage'+ident).src;
}

var errorlist = [];

function errorclear()
{
	for( var i = 0 ; i < errorlist.length ; i++ )
	{
		e = errorlist[i];
		if( e.parentNode != null )
			e.parentNode.removeChild( e );
	}
	errorlist = [];
}

//make a AJAX POST call w = obj, f = form, nojson means dont reat result as a json response
function formsub( w, f, nojson )
{
	errorclear();
	if( f.submiting ) return false;
	f.submiting = true;
	var json = isdefined( nojson ) ? nojson : 1;
	var fscript = json ? 'formresult' : 'resultform';
//	debug( formcontent(f) ); return false;
	ajaxrequest( nocache(f.action), fscript, w, json, 'POST', formcontent(f));
	if( isdefined( f.submitobj ) ) loading_button( f.submitobj );
	return false;
}

function objid(obj)
{
	var tmp;
	if( obj.id > '' ) return obj.id;
	while($(tmp='tmp'+Math.random()) != null);
	return tmp;
}
fglobal = 0;
function formformat( obj, setAjaxAction )
{
	var tim = 10;
	if(obj==null) 
		return;
	if( isdefined( obj.formformat_tid ) ) clearTimeout( obj.formformat_tid );
	if( ie && obj.offsetHeight == 0 ) 
	{
		if( !isdefined( obj.retry ) ) obj.retry = 1;
		obj.retry *= 2;
		if( obj.retry > 10000 ) return;
		function f() { formformat( obj, setAjaxAction ); };
		obj.formformat_tid = setTimeout( f, obj.retry );
		return;
	}
	var tmpnew = [];
	var tmpdata = [];
	var f;
	function elementvisible( el )
	{
		if(el.getAttribute("noformat")==1) return 0;
		if( el.skip ) return 0;
		return el.clientHeight > 0;
	}
	if( obj.tagName == 'FORM' ) 
		f = obj;
	else
	{
		obj.formdiv = 1;
		o = obj.getElementsByTagName("FORM");
		if( o.length ) f = o[0];
	}
	
	var el = [];
	var elist = obj.getElementsByTagName("INPUT");
	for( var i = 0 ; i < elist.length ; i++ )
			el.push( elist[i] );

	var elist = obj.getElementsByTagName("SELECT");
	for( var i = 0 ; i < elist.length ; i++ )
			el.push( elist[i] );

	var elist = obj.getElementsByTagName("TEXTAREA");
	for( var i = 0 ; i < elist.length ; i++ )
			el.push( elist[i] );

	var tabindex = 100;
	if( !isdefined( f ) )
	{
		f = new Object;
	}
	else
	{
		var elist = f.elements;
		if( isdefined( elist ) )
		for( var i = 0 ; i < elist.length ; i++ )
		{
			if(!elist[i].tabIndex)
				elist[i].tabIndex= tabindex++;
			else
				tabindex = elist[i].tabIndex; 
		}
	}
	
	//first fix classes in the form before drawing
	if( isdefined( f ) )
	{
		if( isdefined( setAjaxAction ) && setAjaxAction )
		{
			if( f.id == '' ) f.id = 'form' + Math.random();
			if( f.className == '' ) f.className = 'forminput';
			if(! isfunction(f.onsubmit)) f.onsubmit = function() { return formsub(mywin(this),this); }
		}

		//el = f.elements;

		//reset uploaded file
		f.onreset = function()
		{
			for( i = 0 ; i < el.length ; i++ )
			{
				if( !elementvisible( el[i] ) ) continue;
				var name = el[i].name;
				formremoveerrmsg( name );
				if( el[i].type == 'hidden' && el[i].getAttribute( 'upload') == 1 )
				{
					uploadcomplete( el[i].ident, el[i].basevalue );
				}
			}
		}
		
		var focusme = null;
		for( i = 0 ; i < el.length ; i++ )
		{
			if( !elementvisible( el[i] ) ) continue;

			if(!tabindex) tabindex=0;
			if(el[i].style.display!='none')
			{
				if(!el[i].tabIndex)
					el[i].tabIndex= tabindex++;
				else
					tabindex = el[i].tabIndex; 
			}

			//CHANGES
			//el[i].setAttribute('helper', '');

			var label = el[i].getAttribute( 'label' );
			el[i].label = label;
			if( el[i].id == '' )
				el[i].id = el[i].label > '' ? el[i].label : el[i].name;
			el[i].helpervalue = el[i].getAttribute( 'helper' );
			if( el[i].getAttribute( 'focus' ) == 1 ) focusme = el[i];

			if(!ie && el[i].type == 'password' && el[i].value=='' && el[i].getAttribute('helper')!='' && el[i].getAttribute('helper')!=null)
			{
				el[i].setAttribute('pass', 1);
				el[i].type='text';
			}

			if( el[i].type == 'text' || el[i].type == 'password')
			{
				if( el[i].className == '' )	el[i].className = 'inputtext';

				if(chrome)
					el[i].setAttribute('autocomplete', 'off');

				el[i].old_onfocus= el[i].onfocus; 
				el[i].old_onblur= el[i].onblur; 

				el[i].onfocus = function() { inputselect( this ); if(isfunction(this.old_onfocus)) this.old_onfocus(); };
				el[i].onblur = function() { inputfocus( this, 0 ); if(isfunction(this.old_onblur)) this.old_onblur(); };
				el[i].onkeydown = function( ev ) { return inputkeytrap( this, ev ); }
				if( el[i].getAttribute('date') == 1 )
				{			
					//if(el[i].value == el[i].getAttribute('helper'))
						
					el[i].onfocus = function()
					{
						if(this.value == this.getAttribute('helper'))
							this.value = ''; 
						
						//inputfocus( this, 1 );
						var format = 'mm/dd/yyyy';
						
						if(this.getAttribute('format')!=null)
							format= this.getAttribute('format');
							
						inputselect( this );
						if( calendarDiv == false || calendarDiv.style.display=='none' )
							displayCalendar(this, format ,this); 
					};
					el[i].onblur = function()
					{ 
						restoreDate(this);
					//	setTimeout( function() { closeCalendar(); }, 200 );

						if(this.getAttribute('format')=='mm/dd/yyyy' || this.getAttribute('format')==null)
							if(!IsMMDDYYYY(this.value))
								this.value = '';

						if(this.getAttribute('format')=='dd/mm/yyyy')
							if(!IsDDMMYYYY(this.value))
								this.value = '';

						inputfocus( this, 0 );
					};
				}
			}
			if( el[i].type == 'password' )
			{
				if( el[i].className == '' )	el[i].className = 'inputtext';
			}
			if( 1 &&  el[i].type == 'checkbox' )
			{
				if(el[i].id=='' || !isdefined(el[i].id) || el[i].id==null || el[i]!=$(el[i].id))
					el[i].id='random'+i;


				span = document.createElement("span");
				span.id='span_'+el[i].id;
				span.auxid = el[i].id;
				span.style.outline = '0px';
				span.setAttribute('tabindex', el[i].getAttribute('tabindex'));

				var appendId = el[i].name + 'append_div';
				el[i].oonclick=el[i].onclick;
				el[i].onclick=function()
				{
					$('span_'+this.id).onclick();
				}	

				span.className = 'checkboxImg';
				span.onmouseover= function()
				{
					if(this.className=='checkboxImg')
						this.className='checkboxImgFocus'; 
					if(this.className=='checkboxImgChecked')
						this.className='checkboxImgCheckedFocus'; 
				
				}
				span.onmouseout= function()
				{ 
					if(this.className=='checkboxImgFocus')
						this.className='checkboxImg';
					if(this.className=='checkboxImgCheckedFocus')
						this.className='checkboxImgChecked';

				}
				span.onclick= function()
				{
					if( this.className=='checkboxImg' || this.className=='checkboxImgFocus' )
					{
						this.className='checkboxImgCheckedFocus';
						$('i_'+this.auxid).checked=true;
						$(this.auxid).checked=true;
					}
					else
					{
						this.className='checkboxImgFocus';
						$('i_'+this.auxid).checked=false;
						$(this.auxid).checked=false;
					}	
					//debug($(this.auxid).oonclick);
					if($(this.auxid).oonclick)
					{
						$(this.auxid).oonclick();
					}
				//	$('i_'+this.auxid).focus();

				}
				span.check = function()
				{
					if( this.className=='checkboxImg' || this.className=='checkboxImgFocus' )
					{
						this.className='checkboxImgChecked';
						$('i_'+this.auxid).checked=true;
						$(this.auxid).checked=true;
					}
					else
					{
						this.className='checkboxImg';
						$('i_'+this.auxid).checked=false;
						$(this.auxid).checked=false;
					}
				}

				a=el[i].parentNode;
				a.insertBefore(span, el[i]);
				el[i].style.display='none';

				input = document.createElement("input");
				input.type="checkbox";
				input.id='i_'+span.auxid;
				input.auxid=span.auxid;
				input.spanid= span.id;

				input.style.position='absolute';
				input.style.left=-1000;

				span.tabIndex = el[i].tabIndex;
				el[i].tabIndex = null;
				input.tabIndex = null;
				var spanfocus = null;
				span.onfocus = function()
				{
					this.onmouseover();

					spanfocus = this;
					document.body.onkeydown = key;
				}	
				span.onblur = function()
				{
					this.onmouseout();

					spanfocus = null;
					document.body.onkeydown = null;
				}
				function key(ev)
				{
					if(ie)
						ev = event;

					if(ev.keyCode==32)
					{
						spanfocus.onclick();
						return false;
					} 
				}

				input.onfocus=function() {$(this.spanid).onfocus();}
				input.onblur=function()	{ $(this.spanid).onblur();}
				input.onchange=function() {	$(this.spanid).onclick();}
			
				if($(appendId)==null)
				{
					div = document.createElement("DIV");
					div.id=appendId;
					div.style.position='relative';
					document.body.appendChild(div);
				}
				$(appendId).appendChild(input);

				/*if(el[i].checked==true)
				{
					//span.onclick();
					if( span.className=='checkboxImg' || span.className=='checkboxImgFocus' )
					{
						span.className='checkboxImgCheckedFocus';
						$('i_'+span.auxid).checked=true;
						$(span.auxid).checked=true;
					}
					else
					{
						span.className='checkboxImgFocus';
						$('i_'+span.auxid).checked=false;
						$(span.auxid).checked=false;
					}	
				}*/
				if(el[i].checked==true)
				{
					span.check();
				}
			}
			if( 1 &&  el[i].type == 'radio')
			{
				span = document.createElement("span");

				el[i].spanid = 'span_'+el[i].name+'_'+i;
				span.id= 'span_'+el[i].name+'_'+i;
				span.objvalue= el[i].name+'_value';
				span.objref= 'span_'+el[i].name+'_';

				span.value= el[i].value;
				span.oonclick= el[i].onclick;
				var checked = el[i].checked;
				el[i].oonclick=el[i].onclick;
				el[i].onclick=function()
				{
					$('span_'+this.id+'_'+this.value).onclick();
				}
				var appendId = el[i].name + 'append_div';
				el[i].name = 'nothing' + Math.floor(Math.random()*100000);
				//el[i].skip = true;		
				span.className = 'radioImg';
				span.onmouseover= function()
				{ 
					if(this.className=='radioImg')
						this.className='radioImgFocus'; 
					if(this.className=='radioImgChecked')
						this.className='radioImgCheckedFocus'; 
				
				}
				span.onmouseout= function()
				{ 
					if(this.className=='radioImgFocus')
						this.className='radioImg';
					if(this.className=='radioImgCheckedFocus')
						this.className='radioImgChecked';
				}
				span.onclick= function()
				{
					if( this.className=='radioImg' || this.className=='radioImgFocus' )
					{
						this.className='radioImgCheckedFocus';
						$(this.objvalue).value=this.value;
					}
					else
					{
						this.className='radioImgFocus';
						$(this.objvalue).value='';
					}	
					for(var j=0; j<el.length; j++)
					{
						if(this.objref+j!=this.id)
							if($(this.objref+j)!=null)
								$(this.objref+j).className='radioImg';
					}
					if(this.oonclick!=null)
						this.oonclick();
//					debug( this.object, $(this.object).value );

				}

				a=el[i].parentNode;
				a.insertBefore(span, el[i]);
				el[i].style.display='none';

				span.tabIndex = el[i].tabIndex;
				el[i].tabIndex = null;
				var spanfocus = null; 
				span.onfocus = function()
				{
					this.onmouseover();

					spanfocus = this;
					document.body.onkeydown = key;
				}	
				span.onblur = function()
				{
					this.onmouseout();

					spanfocus = null;
					document.body.onkeydown = null;
				}
				function key(ev)
				{
					if(ie)
						ev = event;

					if(ev.keyCode==32)
					{
						spanfocus.onclick();
						return false;
					} 
				}

				el[i].onfocus=function() {$(this.spanid).onfocus();}
				el[i].onblur=function()	{ $(this.spanid).onblur();}

				if($(appendId)==null)
				{	
					div = document.createElement("SPAN");
					div.id=appendId;
					div.style.position='relative';
					a=el[i].parentNode;
					a.insertBefore(div, el[i]);
					div.innerHTML='<input type="text" id="'+span.objvalue+'" name="'+span.objvalue+'" value="" style="width: 1px; height: 0px; border: 0px; margin: 0px;">';
				}
				if(checked)
				{
					if($(span.objvalue)!=null)
					{
						$(span.objvalue).aux=span.value;
						$(span.objvalue).value=span.value;
					}
					span.className='radioImgCheckedFocus';
				}		
				if($(appendId)!=null)
				{
					if(isdefined($(appendId).aux))
						if($(span.object)!=null)
							$(span.object).value=$(appendId).aux;
				}
				
			}
			if( el[i].type == 'textarea' )
			{
				if( el[i].className == '' )	el[i].className = 'inputtextarea';
				el[i].onfocus = function() { inputselect( this ); };
				el[i].onblur = function() { inputfocus( this, 0 ); }
				el[i].onkeydown = function( ev ) { return inputkeytrap( this, ev ); }
			}
			if( el[i].type == 'button' || el[i].type == 'submit' || el[i].type == 'reset' )
			{
				if( el[i].className == '' ) el[i].className = 'button';
				if( el[i].type == 'submit' )
				{
					el[i].frm = f;
					if( isfunction( el[i].onclick ) )
					{
						el[i].onclickold = el[i].onclick;
						el[i].onclick = function() { this.frm.submitobj = this; this.onclickold(); }

					}
					else
						el[i].onclick = function() { this.frm.submitobj = this; }
				}
				inputbackground( el[i] );
			}
			if( 1 && el[i].type == 'select-one' )
			{
				var data = new Object;
				data.records = [];
				el[i].style.display = 'none';
				for( var kk = 0 ; kk < el[i].options.length ; kk++ )
				{
					var opt = el[i].options[kk];
					data.records.push( [ el[i].options[kk].value, el[i].options[kk].text ] );
				}
				var tmpid = 'select' + Math.random();


				var tabindex = el[i].getAttribute( 'tabindex' );
				if( tabindex == null ) tabindex = '';
				var helper = el[i].getAttribute( 'helper' );
				if( helper == null ) helper = '';
				var sort = el[i].getAttribute( 'sort' );
				if( sort == null ) sort = '';
				var val = el[i].getAttribute( 'defaultvalue' );
				var usevalue = el[i].getAttribute( 'usevalue' );
				var decoration = el[i].getAttribute( 'decoration' );
				if( usevalue == null ) usevalue = '1';
				var style =  el[i].getAttribute( 'setstyle' );
				if( style == null ) style = '';
				var obj_class =  el[i].getAttribute( 'setclass' );
				if( obj_class == null ) obj_class = '';
				if( val == null ) val = '';
				var name = el[i].name;
				var onchange = el[i].onchange;
				var id = objid(el[i]);

				var parent = el[i].parentNode;
				var span = ce('SPAN');
				parent.insertBefore( span, el[i] );
//				parent.removeChild( el[i] );
				el[i].name = 'nothing' + Math.floor(Math.random()*100000);
				el[i].style.display = 'none';
				el[i].skip = true;
				var pagesize = el[i].getAttribute( 'pagesize' ) > 0 ? el[i].getAttribute( 'pagesize' ) : 10;
				span.innerHTML = '<input id="' + tmpid + '" name="' + name + '" class="inputtext '+ obj_class +'" type="text" predictive="1" allownew="0" helper="' + helper + '" value="' + val + '" style="' + style + '" sort="' + sort + '" tabindex="' + tabindex + '" usevalue="' + usevalue + '" pagesize="' + pagesize + '">';
				$(tmpid).initdata = data;
				$(tmpid).helpervalue = helper;
				$(tmpid).onchange = onchange;
				if( decoration != null ) $(tmpid).setAttribute('decoration', decoration );
				$(tmpid).id = id;
				el.push( $(id) );
			}
		}

		for( var i = 0 ; i < el.length ; i++ )
		{
			if( !elementvisible( el[i] ) ) continue;
			if( el[i].type == 'text' || el[i].type == 'textarea' || el[i].type == 'password' )
			{
				inputfocus( el[i], 0 );
				if( el[i].getAttribute( 'predictive') > '')
				{
					predictive( el[i] );
				}
				inputbackground( el[i] );
			}
		}

		setTimeout( function() { formprocessuploads( el ) }, tim ); tim += 100;
		setTimeout( function() { formprocessselects() }, 1000 );
	}
	if( focusme != null ) { inputselect( focusme ); focusme.focus(); }

	function formprocessselects()
	{
//		alert( obj.innerHTML );
//		for( i = 0 ; i < tmpnew.length ; i++ )
//			alert( $(tmpnew[i]) );
	}

	function formprocessuploads( el )
	{
		for( i = 0 ; i < el.length ; i++ )
		{
			//if( !elementvisible( el[i].parentNode ) ) continue;
			if( el[i].type == 'hidden' && el[i].getAttribute( 'upload') == 1 )
			{
				uploadfile( el[i], el[i].getAttribute( 'button'), el[i].getAttribute( 'maxsize'), el[i].getAttribute( 'displaysize'), obj );
			}
			if( ( el[i].type == 'hidden' || el[i].type == 'text' ) && el[i].getAttribute( 'upload') == 2 )
			{
				if(el[i].id==null || el[i].id=='')
					el[i].id = objid(el[i]);
				getMultiUploader(el[i].id);	
			}
		}
	}
}


// set the obj HTML content to txt and prepare the form tags to be used with AJAX
// if txt == null then use the current obj content

function resultform( txt, obj , format)
{
	var f, el, i, o;


	if( txt == null ) txt = obj.innerHTML;

	//using a tmpdiv to fix the form bc sometimes FF draws the form before changing the classes
	var tmpdiv = ce( 'DIV' );
	if( txt == null ) txt = obj.innerHTML;
	tmpdiv.innerHTML = txt;
	o = tmpdiv.getElementsByTagName("FORM");

	//first fix classes in the form before drawing
	if( o.length )
	{
		f = o[0];
		if( f.className == '' ) f.className = 'forminput';
		el = f.elements;
		for( i = 0 ; i < el.length ; i++ )
		{
			if( el[i].type == 'text' )
			{
				if( el[i].className == '' )	el[i].className = 'inputtext';
			}
			if( el[i].type == 'textarea' )
			{
				if( el[i].className == '' )	el[i].className = 'inputtextarea';
			}
			if( el[i].type == 'button' || el[i].type == 'submit' || el[i].type == 'reset' )
			{
				if( el[i].className == '' ) el[i].className = 'button';
			}
		}
	}

	//now process it inside the obj to add the event triggers
	obj.innerHTML = tmpdiv.innerHTML;
	o = obj.getElementsByTagName("FORM");
	obj.form = o;
	obj.formdiv = 1;

	if(!format)
		formformat( obj, true ); 

	var s = obj.getElementsByTagName("SCRIPT");
	for( i = 0 ; i < s.length ; i++ )
	{
		//alert( s[i].text )
		var ns = ce('SCRIPT');
		ns.type = 'text/javascript';
		ns.text = s[i].text;
		document.body.appendChild( ns );
	}
	for( i = 0 ; i < s.length ; i++ )
		s[i].parentNode.removeChild( s[i] );

	if( isfunction( obj.onchange ) ) obj.onchange();
}

// retira as mensagens de erro de umformulario
function formremoveerrmsg( name )
{
		var err = $(name+'_err')
		if( err != null )
		{
			err.parentNode.removeChild( err );
			err.innerHTML = '';
			err.style.display = 'none';
		}
}

function setinput( inpt, val, idx )
{
	//debug( inpt, val, idx );
	if( inpt == null ) return;

	//debug( , val, idx );


	if(inpt.tagName=='DIV' || inpt.tagName=='SPAN')
	{
		inpt.innerHTML=val;
		return;
	}
	if( inpt.type == 'checkbox')
	{
		//inpt.checked = val == 'true' || val == 1;
		if(val==1&&inpt.checked==false)
		{
			inpt.onclick();
		}
	}
	else if( inpt.type == 'select-one' ) selectset( inpt, val );
	else if( inpt.getAttribute( 'predictive' ) > '' )
	{
		if( inpt.usevalue )
		{
			inpt.valueid = val;
			inpt.value = '';
		}
		else inpt.value = val;

		if( isfunction( inpt.onchange ) ) 
		{
			inpt.onchange();
		}
//	debug( 'pred', inpt.name, inpt.getAttribute( 'predictive' ), inpt.value );
	}
	else
	{
		inpt.value = val;
	}
	inpt.valueinit = val;

	inputfocus( inpt, 0 );
}


// retorna o conteudo post de um formulario
function formcontent( f )
{
	var obj, el, i, vals, name, val, args, err;

	obj = f;
	el = obj.elements;
	vals = new Array();
	for( i = 0 ; i < el.length ; i++ )
	{
		var name = el[i].name;
		if( name == '' ) continue;
		formremoveerrmsg( name );
		if( el[i].type == 'select-one' ) { val = el[i].options[el[i].selectedIndex].value }
		else if( el[i].type == 'radio' ) val = el[i].value;
		else if( el[i].type == 'checkbox' ) val = el[i].checked ? 1 : 0;
		else
		{
			val = el[i].value;
			val = val.replace(/\+/g, '%2B');
			var def = el[i].getAttribute( 'helper' );
			if( val == def ) val = el[i].valueid = '';
			if( el[i].getAttribute( 'usevalue' ) == 1 )	val = el[i].valueid;
		}
		if( el[i].type != 'radio' || el[i].checked )
		{
			val += '';
			sval = val.replace( /\&/g, '%26' );
			vals.push( name + '=' + sval );
			if( name.match( /_value$/ ) )
			{
				name = name.replace( /_value$/, '' );
				vals.push( name + '=' + sval );
			}
		}
	}
	vals[vals.length] = 'formid=' + f.id;
//	debug( vals.join('&') );
	return vals.join('&');
}


// processa o retorno XML de um form ajax. Coloca as mensagens de erro ou 
// executa as intrucoes de sucesso
function formresult( txt, obj )
{
// debug( txt , obj);
//	if( $('submit') != null ) $('submit').innerHTML = '';

	var form=0;
	if(obj!=null)
	{
		o = obj.getElementsByTagName("FORM");
		var obj1=o[0];
		if(obj1!=null) 
		{
			form=1;
			obj1.jsonreturn=json(txt);
		}
	}
	loading_button_out();

	var data = json( txt );
	
	var status = data.status + '';
	if( status == '' )
	{
//		globalerror( 'bad content on ajax form: objid = ' + obj.id + '\nreturned value=' + txt );
		debug( 'error', '<textarea rows=10 cols=40>' + txt + '</textarea>' );
	}
	status *= 1;

	if( status )
	{
		var okmess, okscript, okurl, oktitle, okparams;

		if(form==1 && (!isdefined(data.okmess) || data.okmess=='') && obj1.getAttribute('okmess')!=null){ data.okmess =obj1.getAttribute('okmess'); }
		if(form==1 && (!isdefined(data.okscript) || data.okscript=='') && obj1.getAttribute('okscript')!=null){ data.okscript =obj1.getAttribute('okscript'); }
		if(form==1 && (!isdefined(data.okurl) || data.okurl=='') && obj1.getAttribute('okurl')!=null){ data.okurl =obj1.getAttribute('okurl');}
		if(form==1 && (!isdefined(data.okajax) || data.okajax=='') && obj1.getAttribute('okajax')!=null){ data.okajax =obj1.getAttribute('okajax');}
		if(form==1 && (!isdefined(data.okparams) || data.okparams=='') && obj1.getAttribute('okparams')!=null){ data.okparams =obj1.getAttribute('okparams');}

		if(form==1 && isdefined(data.okparams) && obj1.getAttribute('okparams')!=null)
		{
			var func = eval( obj1.getAttribute('okparams') );
			data=func( data );
//			eval(obj1.getAttribute('okparams')+'('+data.okparams+');');
		}
		okmess = data.okmess;
		if( okmess != '' ) obj.innerHTML = '';
		if( isfunction(obj.onchange) && obj.onchange != null ) obj.onchange();
		if( okmess != '' ) obj.innerHTML += okmess;
		okscript = data.okscript+"; goTop();";	
		if( isdefined(okscript) && okscript != '' )
		{
			okscriptform = obj1;
			var ns = ce('SCRIPT');
			ns.type = 'text/javascript';
			ns.text = okscript;
			document.body.appendChild( ns );
		}

		okurl = data.okurl;

		if( isdefined(okurl) && okurl != '' ) document.location = okurl;
			okajax = data.okajax;
	
		if( isdefined(okajax) && okajax > '' )
		{
			obj.innerHTML = '<div class="loading"></div>';
			watch_animate( obj );
			ajaxrequest( nocache(okajax), 'resultform', obj, 0 );
		}

		if( isfunction( obj.onsuccess ) ) obj.onsuccess();
		
	}
	else
	{
		var i;
		var errlist = data.errors;
		var formid = data.formid;
		var field, form, parent;
		var form = null;

//		if( 1|| formid == '' || formid == null )
			form = obj.getElementsByTagName("FORM")[0];
//		else
//			form = $(formid);
		if( form == null )
			debug( 'no valid form in div object' );

		form.submiting = false;

		var errfloat = form.getAttribute('errfloat') != null ? form.getAttribute('errfloat') : '';

		form.errscript = isdefined( data.errscript ) ? data.errscript : '';
		
		formerror( errlist, form, errfloat );
	}
	if( isfunction( obj.onchange ) ) obj.onchange();
}
function formerror(errlist, form, errfloat)
{
	//debug(print_r(errlist));
	//formid, field, form, parent, errfloat);
	var formid, field, parent;

	for( i = 0 ; i < errlist.length ; i++ )
		{
			var errid = errlist[i].errid + '_err';
			errobj = $(errid);
			if( errobj ) errobj.parentNode.removeChild( errobj );
			errobj = ce( 'div' );
			errobj.id = errlist[i].errid + '_err';
			errobj.className = 'error';
			errobj.style.display = 'block';
			errobj.innerHTML = errlist[i].errmess;
			if( form != null )
			{
				field = form[errlist[i].errid];

				if( field != null && isdefined( field.length ) ) field = field[0];
				if( field != null )
				{
					tfield = field;
					parent = field.parentNode;
					if( isdefined( field.span ) ) // if input encapsulated in a SPAN the error must go outside it
					{
						tfield = parent;
						parent = parent.parentNode;
					}

					for( j = 0 ; j < parent.childNodes.length; j++ )
					{
						if( parent.childNodes[j] == tfield ) break;
					}

				
					if( errfloat != '' )
					{
						var etarget = field;
						if( etarget.type == 'hidden' )
							etarget = etarget.parentNode;
						document.body.appendChild( errobj );
						errobj.className = 'errbox';
						
						try
						{
							var ewid = error_width;
						}
						catch(e)
						{
							var ewid = 200;
						}
						if( errobj.clientWidth > ewid ) errobj.style.width = ewid;  

						

						if(etarget.type=='textarea')
							etarget = etarget.parentNode;						
						if( errfloat == 'left' )
						{
							errobj.style.background = 'transparent';
							errobj.style.backgroundImage = 'url( kintool/css/errleft.png)';
							errobj.style.backgroundPosition = 'center right';
							errobj.style.paddingRight = 10;
							errobj.style.top = getTop( etarget ) + Math.floor(( etarget.clientHeight - errobj.clientHeight )/2);
							errobj.style.left = getLeft( etarget ) - errobj.clientWidth - 2;
						}
						else if( errfloat == 'right' )
						{
							errobj.style.background = 'transparent';
							errobj.style.backgroundImage = 'url( kintool/css/errright.png)';
							errobj.style.backgroundPosition = 'center left';
							errobj.style.paddingLeft = 10;
							errobj.style.top = getTop( etarget ) + Math.floor(( etarget.clientHeight - errobj.clientHeight )/2);
							errobj.style.left = getLeft( etarget ) + etarget.clientWidth + 2;
						}
						else if( errfloat == 'top' )
						{
							errobj.style.background = 'transparent';
							errobj.style.backgroundImage = 'url( kintool/css/errtop.png)';
							errobj.style.backgroundPosition = 'bottom left';
							errobj.style.paddingBottom = 10;
							errobj.style.top = getTop( etarget ) - errobj.clientHeight;
							errobj.style.left = getLeft( etarget );
						}
						else if( errfloat == 'bottom' )
						{
							errobj.style.background = 'transparent';
							errobj.style.backgroundImage = 'url( kintool/css/errbottom.png)';
							errobj.style.backgroundPosition = 'top left';
							errobj.style.paddingTop = 10;
							errobj.style.top = getTop( etarget ) + etarget.clientHeight;
							errobj.style.left = getLeft( etarget );
						}
					}
					else
					{
						if( j == parent.childNodes.length-1 )
							parent.appendChild( errobj );
						else
							parent.insertBefore( errobj, parent.childNodes[j+1] );
					}
					if( i == 0 )
					{
						if(field.type == 'text' )
						{
							field.focus();
							inputselect( field );
						}
					}
					errorlist.push(errobj);
				}
				else debug( 'invalid errid', errlist[i].errid, errlist[i].errmess );
			}
		}
		var errscript = form.errscript;
		if( errscript != '' )
		{
			var ns = ce('SCRIPT');
			ns.type = 'text/javascript';
			ns.text = errscript;
			document.body.appendChild( ns );
		}

}
// find the div containing the current form
function mywin( node )
{
	var savenode = node;
	while( (node.tagName != 'DIV' && !isdefined( node.formdiv )) && node != document.body && node != null )
	{
		node = node.parentNode;
	}
	if( node.tagName != 'DIV' )
	{
		node = savenode;
		while(  node != null && node.tagName != 'DIV' )
		{
			node = node.parentNode;
		}
	}
	if( node == null ) node = document.body;
	return node;
}

function nohelper( o )
{
	removeclass( o, 'inputhelper' );
	return;
	cn = o.className + '';
	cn = cn.replace( / inputhelper/, '' );
	o.className = cn;
}

function focusclass( o, st )
{
	if( st )
	{
		removeclass( o, 'inputfocused' );
		addclass( o, 'inputfocused' );
	}
	else
	{
		removeclass( o, 'inputfocused' );
	}

	inputbackground( o );
}

function loading_button_out()
{
	var lb = $( 'loading_button_div' );
	if( lb != null )
		lb.parentNode.removeChild( lb );
}

function loading_button( o )
{
	loading_button_out();
	var lb = ce( 'DIV' );
	lb.className = 'loading_button';
	lb.id = 'loading_button_div';
	document.body.appendChild( lb );
	var w = lb.clientWidth;
	var h = lb.clientHeight;
	var ow = o.clientWidth;
	var oh = o.clientHeight;
	if( ow/2 < w+10 ) 
	{
		loading_button_out();
		return;
	}
	lb.style.top = getTop(o) + Math.floor((oh-h)/2);
	lb.style.left = getLeft(o) + 2;
	watch_animate( lb, 1 );
}

var inputbackgroundstack = [];
function inputbackgroundpush( o )
{
	inputbackgroundstack.push( o );
	setTimeout( inputbackgroundpop, 1 );
}

function inputbackgroundpop()
{
	var o = inputbackgroundstack.shift();
	inputbackground( o );
}

if( window.formUseDecoration != true ) formUseDecoration = false;

function inputbackground( o )
{
	if( !formDecorate ) return;
	if( formUseDecoration ) return inputdecorate( o );
	if( o.type != 'text' && o.type != 'textarea' && o.type != 'submit' && o.type != 'button' && o.type != 'reset' && o.type != 'password' ) return;
	o.style.border = 0;
	var w = o.clientWidth;
	var h = o.clientHeight;
	if( h > 0 && h < 20 )
	{
		inputbackgroundpush( o );
		return;
	}
	o.style.background = 'transparent';
	var burl = '';
	var furl = '';
	if( !o.className.match( /button/ ) && !isdefined( o.span ) )
	{
		//encapsula o input num span para poder usar o background;
		var parent = o.parentNode;
		var span;
//		alert( o.name + ', ' + o.type + ', ' +  w + ', ' +  h );
		if( o.type != 'textarea' )
		{
			span = ce( 'SPAN' );
			span.style.fontSize = chrome || safari ? h : '100px';
			span.style.lineHeight = 'normal';
			span.style.margin = 0;
			span.style.padding = 0;
			span.style.border = 0;
			span.style.width = w;
			span.style.height = h;
			span.style.overflow = 'hidden';
		}
		else
		{
			var wmargin = 15;
			var hmargin = 20;

			wmargin = 15;
			hmarmgin = 15;
			if( !ie )
			{
				o.style.width = w - wmargin;
				o.style.height = h - hmargin;
				w -= hmargin;
				h -= hmargin;
			}
			else
			{
				o.style.width = w-wmargin;
				o.style.height = h-hmargin;
			}
			span = ce( 'DIV' );
			span.style.fontSize = '100px';
			span.style.lineHeight = 'normal';
			span.style.margin = 0;
			span.style.padding = 0;
			span.style.border = 0;
			span.style.width = w;
			span.style.height = h;
			span.style.padding = 10;
			span.style.overflow = 'hidden';
		}
		if(parent!=null)
		{
			parent.insertBefore( span, o );
			parent.removeChild( o );
		}
		span.appendChild( o );
		o.span = span;
	}
	if( !isdefined( o.span ) ) o.span = o;
	var span = o.span;
	if( o.type == 'textarea')
	{
		w = span.clientWidth;
		h = span.clientHeight;
	}
	if( o.className.match( /button/ ) )
	{
		w= (ie && w%2) ? w-1 : w-2;

		burl = 'kintool/img.php?i=' + csspath + '/' + formButtonImg + '&t=' + formButtonImgType + '&w=' + w + '&h=' + h  + '&mh=' + formButtonMh + '&mw=' + formButtonMw;
	}
	else
	{
		if(!isdefined(window.formFieldIrm))
			window.formFieldIrm = 8;

		w= (ie && w%2) ? w-1 : w-2;

		if(chrome || safari)
			h--;
		var img = o.className.match( /inputfocused/ ) ? formFieldFocusedImg : formFieldImg;
		img = csspath + '/' + img;
		var iconright = '';
		if( o.className.match( /inputsel/ ) ) iconright = '&ir=' + csspath + '/predictive&irm='+formFieldIrm;
		if( o.className.match( /inputlocksel/ ) ) iconright = '&ir=' + csspath + '/pulldown&irm='+formFieldIrm;
		var iconleft = '';
		burl = 'kintool/img.php?i=' + img + '&t=' + formFieldImgType + '&w=' + w + '&h=' + h  + '&mh=' + formFieldMh + '&mw=' + formFieldMw + iconleft + iconright;
		furl = 'kintool/img.php?i=' + csspath + '/' + formFieldFocusedImg + '&t=' + formFieldImgType + '&w=' + w + '&h=' + h  + '&mh=' + formFieldMh + '&mw=' + formFieldMw + iconleft + iconright;
// 		debug( burl );
		preloadimg( furl );
	}
	o.style.background = 'transparent';
	span.style.backgroundImage = 'url(' + burl + ')';
	span.style.backgroundRepeat = 'no-repeat';
	if( chrome || safari ) span.style.backgroundPosition = 'left bottom';
}



function inputdecorate( o )
{
	if( !formDecorate ) return;
	if( o.type != 'text' && o.type != 'textarea' && o.type != 'submit' && o.type != 'button' && o.type != 'reset' && o.type != 'password' ) return;
	o.style.border = 0;

	var isbutton = o.type == 'button' || o.type == 'submit' || o.type == 'reset';
	var isfocused = o.className.match( /inputfocused/ );
	var ispulldown = o.className.match( /inputlocksel/ );

	var decoration;

	if( isbutton ) decoration = 'decButton';
	else if( o.className.match( /inputsel/ ) )
		decoration = 'decPredictive';
	else if( ispulldown )
		decoration = 'decPulldown';
	else if( o.type == 'textarea' )
		decoration = 'decTextarea';
	else
		decoration = 'decField';
	if( o.getAttribute( 'decoration' ) != null ) decoration = o.getAttribute( 'decoration' );

	if( isfocused ) decoration += 'Focused';
	decoration = window[decoration];
	var w = decorate( decoration, o, true );
	if( ispulldown ) w.style.cursor = 'pointer';
}



//puts the helper msg inside the text box if the 'helper' attribute is set and value is empty
function inputfocus( inpt, focused )
{
	if(navigator.appName != "Microsoft Internet Explorer" && inpt.type == 'password' && inpt.value=='' && inpt.getAttribute('pass')==1)
	{
		inpt.type='text';
		inpt.value= inpt.getAttribute('helper');
	}
	var def = inpt.getAttribute( 'helper');
	//if( def == null || def == '' ) return;
	if( focused )
	{
		if( inpt.value == def )
		{
			nohelper( inpt );
			inpt.value = '';
		}
		focusclass( inpt, 1 );
	}
	else
	{
		nohelper( inpt );
		if( inpt.type != 'password' && def != null && inpt.value == '' || inpt.value == def )
		{

			addclass( inpt, 'inputhelper' );
//			inpt.className = inpt.className + ' inputhelper';
			inpt.value = def;
		}
		else
			removeclass( inpt, 'inputhelper' );
		focusclass( inpt, 0 );
	}

}

var inptseltim = null;
function inputselect( inpt )
{
//	debug('inputselect');
	if(navigator.appName != "Microsoft Internet Explorer" && inpt.type == 'text' && inpt.value==inpt.getAttribute('helper') && inpt.getAttribute('pass')==1)
	{
		inpt.value='';
		inpt.type='password';
	}

	clearTimeout( inptseltim );
	closeCalendar();
	if(inpt.type != 'textarea' ) 
		inptseltim = setTimeout( function() { inpt.select(); }, 100 );
	inpt.select();
	focusclass( inpt, 1 );
	inpt.onmouseup = function() { this.onmouseup = null; return false; };
}


function getsel()
{
	if (window.getSelection)
		return window.getSelection();
	else if (document.getSelection)
		return document.getSelection();
	else if (document.selection)
		return document.selection.createRange().text;
}

// no matter what key has been stroke, if value == helper then clean the value
function inputkeytrap( inpt, ev )
{
	if($(inpt.name+'_err')!=null)
		$(inpt.name+'_err').style.display='none';

	if( inpt.value == inpt.helpervalue ) inpt.value = '';
	nohelper( inpt );
	return true;
}

function setpredictive( inpt, script, data )
{
	inpt.setAttribute( 'predictive', script );
	if( inpt.value != inpt.valueinit )
	{
		inpt.value = '';
	}
	inputfocus( inpt, 0 );
	if( isdefined( data ) ) inpt.initdata = data;
	predictive( inpt );
}


function predictive( inpt )
{
	var url = inpt.getAttribute('predictive');
	inpt.allownew = inpt.getAttribute('allownew') == 1;
	inpt.useid = inpt.getAttribute('useid') == 1;
	inpt.setAttribute("autocomplete","off");
	inpt.oldval = -1;
	inpt.usevalue = inpt.getAttribute('usevalue') == 1;
	inpt.pagesize = inpt.getAttribute('pagesize') > 0 ? inpt.getAttribute('pagesize')*1 : 10;
	inpt.ignoreblur = false;
	var time = null;
	
	if( inpt.usevalue )
	{
		inpt.valueid = inpt.value;
		inpt.value = '';
	}

	inpt.predict_div = null;

	function predictselect( o, idx )
	{
		o.savepredict = false;
		o.value = o.found[idx][1];
		o.valueid = o.found[idx][0];
		o.optselected = true;
		nohelper( o );
		if( inpt.predict_div != null )
			document.body.removeChild( inpt.predict_div );
		inpt.predict_div = null;
		o.blur();
		if( isfunction( o.onchange ) ) o.onchange();
	}

	function key( o, ev )
	{
		if($(inpt.name+'_err')!=null)
			$(inpt.name+'_err').style.display='none';

		var keycode;
		if( ie ) ev = event;
		if( ev != null ) 
			keycode = ev.keyCode;

		// clears value if == helpervalue
		if( o.value == o.helpervalue )
		{
			o.oldval = o.value = '';
			nohelper( o );
		}
		// arrow down
		if( keycode == 40 )
		{
			if( o.selidx < o.found.length-1 )
			{
				o.selidx++;
				if( o.selidx >= o.idx + o.pagesize ) o.idx += o.pagesize;
				showresults( o, o.idx );
			}
			return false;
		}

		// arrow up
		if( keycode == 38 )
		{
			if( o.selidx > 0 )
			{
				o.selidx--;
				if( o.selidx < o.idx ) o.idx -= o.pagesize;
				showresults( o, o.idx );
			}
			return false;
		}

		// enter
		if( keycode == 13 )
		{
			if( o.found.length )
			{
				predictselect( o, o.selidx )
			}
			o.onblur();
			return false;
		}
		if( keycode != 9 ) o.savepredict = false;

		focusclass( o, 1 );
		return true;
	}

	function predover( div, idx )
	{
		var o = getme( div );
		if( o.lastover == idx ) return;
		// cleans all ip_item_sel
		var divs = div.parentNode.getElementsByTagName( 'DIV' );
		for( var i = 0 ; i < divs.length ; i++ )
			if( divs[i].className == 'ip_item_sel' ) divs[i].className = 'ip_item';
		o.selidx = o.lastover = idx;
		div.className = 'ip_item_sel';
	}

	function predout( div, idx )
	{
	}

	function predclick( div, idx )
	{
		predictselect( getme( div ), idx );
	}

	function predgo( div, idx )
	{
		var o = getme( div );
		o.showresults( o, idx );

		return false;
	}

	inpt.predover = predover;
	inpt.predout = predout;
	inpt.predclick = predclick;
	inpt.predgo = predgo;
	inpt.showresults = showresults;
	function rePosition( inpt, o )
	{
		//debug(o.offsetParent);
		if( o==null || inpt.predict_div==null) { return; }
		
		try
		{
			x=o.offsetParent;
		}
		catch(e)
		{
			if(o!=null)
			{
				stoppredict(o, 0);
				return;
			}
		}

		if(o!= null && getTop(o)+ o.clientHeight ==0 && getLeft( o )==0 )
		{
			stoppredict(o, 0);
			return;
		}
		
//		var top=getTop( o )+o.clientHeight+'px';
//		var left=getLeft( o )+'px';
//		if(top!=inpt.predict_div.style.top ||  left!=inpt.predict_div.style.left)
		var top=getTop( inpt );
		var left=getLeft( inpt );
		if(top!=inpt.top ||  left!=inpt.left)
		{
			//stoppredict(o, 0);
			inpt.blur();
			return;
		}

//		inpt.predict_div.style.top = getTop( o ) + o.clientHeight;
//		inpt.predict_div.style.left = getLeft( o );

		clearTimeout( time );
		time = setTimeout( function() { rePosition( inpt , o ); }, 300 );
	}

	function showresults( o, idx )
	{		
		o.idx = idx;

		if( o.selidx < idx ) o.selidx = idx;
		if( o.selidx >= idx + o.pagesize ) o.selidx = idx + o.pagesize -1;
		if( o.found.length == 0 )
		{
			if( inpt.predict_div != null )
			{
				document.body.removeChild( inpt.predict_div );
				inpt.predict_div = null;
			}
			return;
		}
		if( o.found.length == 1 && o.value == o.found[0][1] && inpt.predict_div == null) return;
		if( inpt.predict_div == null )
		{
			inpt.predict_div = ce( 'DIV' );
			inpt.predict_div.className = 'inputpredict';
			document.body.appendChild( inpt.predict_div );
			inpt.predict_div.component = o;
			inpt.predict_div.style.zIndex = 100000;
		}
		inpt.predict_div.style.width = o.clientWidth;
		inpt.predict_div.style.position = 'absolute';
		var offsetbot = formUseDecoration ? o.sh.container.bottom : 0;
		o.top = getTop( o );
		o.left = getLeft( o )
		inpt.predict_div.style.top = o.top + o.clientHeight + offsetbot;
		inpt.predict_div.style.left = o.left;
		clearTimeout( time );
		time = setTimeout( function() { rePosition( inpt , o ); }, 300 );

		var lim = idx + o.pagesize;
		if( lim > o.found.length ) lim = o.found.length;
		var opts = '';
		for( var i = idx ; i < lim ; i++ )
		{
			var cn = i == o.selidx ? 'ip_item_sel' : 'ip_item';
			opts += '<div class="' + cn + '" onmouseover="getme(this).predover(this, ' + i + ')" onmouseout="getme(this).predout(this, ' + i + ')" onmousedown="getme(this).predclick(this, ' + i + ');">&nbsp;' + o.found[i][2] + '</div>';
		}
		var nav = '';

		var txtprev = 'prev';
		var txtnext = 'next';
		try	{ txtprev = predictive_prev; } catch(e) {}
		try	{ txtnext = predictive_next; } catch(e) {}

		if( idx > 0 )
			nav += '<div class="ip_prev"><a id="predict_more" href="javascript:void(null);" onmousedown="return getme(this).predgo(this, ' + (idx-o.pagesize) + ')">' + txtprev + '</a></div>';

		if( lim < o.found.length )
			nav += '<div class="ip_next"><a id="predict_more" href="javascript:void(null);" onmousedown="return getme(this).predgo(this, ' + (idx+o.pagesize) + ')">' + txtnext + '</a></div>';

		if(o.getAttribute('navigate') == 1)
			nav='';

		if( nav > '' ) opts += '<div class="ip_nav" onmousedown="getme(this).ignoreblur = true; return false;" onmouseup="getme(this).focus(); getme(this).ignoreblur = false; return false;"></div>' + nav;
//		else opts += '<div class="ip_bottom"></div>';
		inpt.predict_div.innerHTML = opts;
	}


	function predict( o, ev )
	{
		if(o.getAttribute('navigate') == 1 && o.value=='' )
		{
			stoppredict(o, 1);
			return;
		}
		
		var val = o.value + '';
		var sval = val;
		if( val == o.oldval) return;
		var def = o.helpervalue + '';
		if( val == def ) val = '';
		val = val.replace( /[\)\(\^\$]/g, '' );
		val = val.replace( /\//g, '\\/' );
		var found = [];
		var pattern = '/(^|[^a-z])(' + val  + ')/i';
		var match = val > '' ? 'str.match( ' + pattern + ')' : '1';
		o.selidx = 0;	
		for( var i = 0 ; i < o.records.length ; i++ )
		{
			var id = o.records[i][0];
			var str = o.records[i][1];
			if( str == '' ) continue;
			if( eval( match ) )
			{
				var strorig = str;
				if( val > '' )
				{
					eval( 'str = str.replace( /^(' + val + ')/i, "<b>$1</b>" )' );
					eval( 'str = str.replace( /([^a-z<])(' + val + ')/i, "$1<b>$2</b>" )' );
				}
				found.push( [ id, strorig, str ] );
			}
		}
		if( !o.allownew &&  found.length == 0 )
		{
			o.value = o.oldval;
			return;
		}
		o.found = found;
		o.oldval = sval;
		showresults( o, 0 );
	}

	function startpredict( o )
	{
		removeclass( o, 'inputhelper' );
		o.savevalue = o.value;
		o.savevalueid = o.valueid;
		o.savepredict = true;
		o.optselected = false;
		if(!o.getAttribute('restore')==1)
			o.value = '';
	}

	function stoppredict( o , focus)
	{
		if( inpt.predict_div != null )
		{
			document.body.removeChild( inpt.predict_div );
		}
		inpt.predict_div = null;
		if( !o.optselected && o.allownew == false )
			o.value = '';
		if( focus!=1)
		if( o.savepredict && o.found.length > 0 )
		{
			o.value = o.savevalue;
			o.valueid = o.savevalueid;
		}
		o.savepredict = false;
		o.found = [];
		o.selidx = 0;
		o.oldval = -1;
		if(focus!=1) inputfocus( o, 0 );
	}

	function sortlabel( a, b )
	{
		var aa = a[1].toUpperCase();
		var bb = b[1].toUpperCase();
		if( aa == bb ) return 0;
		return aa > bb ? 1 : -1;
	}

	function sortvalue( a, b )
	{
		var aa = a[0];
		var bb = b[0];
		if( aa == bb ) return 0;
		return aa > bb ? 1 : -1;
	}

	function result( txt )
	{
		data = json( txt );

		// override allownew if defined
		if( isdefined( data.allownew ) )
		{
			inpt.setAttribute( 'allownew', data.allownew );
			inpt.allownew = data.allownew == 1;
		}

		// override usevalue if defined
		if( isdefined( data.usevalue ) )
		{
			inpt.setAttribute( 'usevalue', data.usevalue );
			inpt.usevalue = data.usevalue == 1;
			if( inpt.usevalue )
			{
				inpt.valueid = inpt.value;
				inpt.value = '';
			}
		}

		// override pagesize if defined
		if( isdefined( data.pagesize ) )
		{
			inpt.setAttribute( 'pagesize', data.pagesize );
			inpt.pagesize = data.pagesize * 1;
		}

		if( data.records == null ) return;

		removeclass( inpt, 'inputsel' );
		removeclass( inpt, 'inputlocksel' );
		if( data.records.length > 0 ) addclass( inpt, inpt.allownew ? 'inputsel' : 'inputlocksel' );
		inputbackground( inpt );

		var sort = inpt.getAttribute('sort');
		if(sort!="2")
		{
			var sortfunc = sortlabel;
			if( sort > '' )
			{
				if( sort == '0' || sort.toUpperCase() == 'OFF')
					sortfunc = null;
				else if( sort.toUpperCase() == 'VALUE' )
					sortfunc = sortvalue;
			}
			if( sortfunc != null  ) data.records.sort( sortfunc );
		}
		inpt.records = data.records;
		if( inpt.usevalue && inpt.valueid != '' )
		{
			inpt.value = inpt.helpervalue;
			for( var i = 0 ; i < data.records.length ; i++ )
			{
				if( data.records[i][0] == inpt.valueid )
				{
					inpt.value = data.records[i][1];
					nohelper( inpt );
					break;
				}
			}
		}
		inpt.onfocus = function() { inputselect( inpt ); startpredict( inpt ); predict( inpt ); }
		inpt.onkeyup = function( ev ) { predict( inpt, ev ); }
		inpt.onkeydown = function( ev ) { return key( inpt, ev ); }
		inpt.onblur = function() { if( !inpt.ignoreblur ) stoppredict( inpt ); }
	}

	if( isdefined( inpt.initdata ) )
		result( jsonout( inpt.initdata ) );
	else if( url == 1  )// nesse caso o parametro jį é o json de retorno
		result( base64.decode(inpt.getAttribute('data')) );
	else ajaxrequest( nocache(url), result, null, 1);
}

function upDom( obj, ident )
{
	while( isdefined( obj ) && obj != null )
	{
		try
		{
			var v = eval( 'obj.' + ident );
			if( isdefined( v ) )
			{
				return v;
			}
		}
		catch( err ) {}
		obj = obj.parentNode;
	}
	return null;
}