
var dynamic_form=
{
	submit: function(form_name,container,url,append,run_command)
	{
		if(form_name==undefined)
			form_name=document.forms[0].name;
		
		if(container==undefined)
			container=php.preg_replace("^[0-9]",'',php.preg_replace("[^0-9a-zA-Z]",'',form_name));
		
		if(this.check(form_name))
			ajax.submit(form_name,container,url,append,run_command);
	},
	
	
	populate: function(form_name,data)
	{
		var f=form.getFormByName(form_name);
		var f= f ? f.getElementsByTagName('li'): document.forms[0].getElementsByTagName('li');
		
		var el=f.elements;
		for(x in el)
		{
			if(data[el[x].name]!='')
				form.setValue(el[x], data[el[x].name]);
		}
	},
	
	check: function(form_name,e)
	{
		var f=form.getFormByName(form_name);
		var f= f ? f.getElementsByTagName('li'): document.forms[0].getElementsByTagName('li');
		
		var missing=new Array();
		for(x=0;x<f.length;x++)
		{
			if(f[x].attributes.getNamedItem('required')==undefined || f[x].attributes.getNamedItem('required')==null)
				continue;
				
			if(f[x].attributes.getNamedItem('required').value=='required')
			{
				var format=f[x].childNodes[1].attributes.getNamedItem('format');
				
				if((format!=undefined &&  format!=null && this.format(form.getValue(f[x].childNodes[1]),format.value)!=false))
					form.setValue(f[x].childNodes[1],this.format(form.getValue(f[x].childNodes[1]),format.value));
					
				if((format!=undefined &&  format!=null && this.format(form.getValue(f[x].childNodes[1]),format.value)===false) || form.getValue(f[x].childNodes[1])=='')
				{
					missing[missing.length]	=php.str_replace(':','',f[x].childNodes[0].innerHTML);
					f[x].className		+=' missing_required';
				}
			}
			
		}
		
		if(missing.length > 0)
			return false;
		return true;	
	},
	
	format: function(val,criteria)
	{
		if(criteria==undefined)
			return false;
		criteria=criteria.split(',');
		for(var x in criteria)
		{
			switch(criteria[x])
			{
				case 'Lowercase':
					val=val.toLowerCase();
				break;
				
				case 'Capitalize':
					val=php.ucwords(val);
				break;
				
				case 'Phone Number':
					if(val!=utils.phoneFormat(val))
					{
						alert('Please enter a valid phone number.');
						return false;
					}
				break;
				
				case 'Email':
					val=php.preg_replace("[^a-zA-Z0-9_\.\-\@]",'',val);
					if(!php.preg_match("^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$",val))
					{
						alert('Please enter a valid email address.');
						return false;
					}
					
				break;
				
				case 'Decimal':
					val=php.preg_replace("[^0-9.]",'',val);
				break;
				case 'Money':
					val=php.preg_replace("[^0-9.]",'',val);
				break;
				case 'Integer':
				{
					
					val=php.preg_replace("[^0-9.]",'',val);
					var tmp=php.explode('.',val,2);
					val=tmp[0];					
				}
				break;
				
				case 'Simple Text':
					val=php.preg_replace("<[^>]*>[^<]*<[^>]*>",'',val); //strip tags
					val=php.preg_replace("<[^>]*>",'',val); //strip tags
					val=php.preg_replace('[^0-9a-zA-Z\\. ,_\\-\\?]','',val);
				break;
				case 'Text':
					val=php.preg_replace("<[^>]*>[^<]*<[^>]*>",'',val); //strip tags
					val=php.preg_replace("<[^>]*>",'',val); //strip tags
					val=php.preg_replace('[^0-9a-zA-Z\\. ,_\\-\\?#@!%&*\\(\\)\\\'":]','',val);
				break;
				case 'Simple HTML':
					
				break;
				case 'Jpeg':
					if(!val.toLowerCase().indexOf('.jpg') || !val.toLowerCase().indexOf('.jpeg') || !val.toLowerCase().indexOf('.pjpg'))
					{
						alert('You must select a jpg image.');
						return false;
					}
				break;
				case 'Gif':
					if(!val.toLowerCase().indexOf('.gif'))
					{
						alert('You must select a gif image.');
						return false;
					}
				break;
				case 'Zip':
					if(!val.toLowerCase().indexOf('.zip'))
					{
						alert('You must select a zip file.');
						return false;
					}
				break;
				case 'CSV':
					if(!val.toLowerCase().indexOf('.cvs'))
					{
						alert('You must select a zip file.');
						return false;
					}
				break;
				default : 
				break;
			}
		}
		return val;
	},
	
	generate: function(formObject,target)
	{
		var target		=(target==undefined || !document.getElementById(target)) ? document.getElementsByTagName('Body')[0] : document.getElementById(target);
		var form		=this.Form(formObject);
		
		//set optional events
		if(formObject.events!=undefined)
		{
			for(var ev in formObject.events)
				utils.addEvent(form,ev,formObject.events[ev]);
		}
		
		
		for(group in formObject.groups)
		{
			var category		=formObject.groups[group];
			var fieldset		=document.createElement('fieldset');
			var label			=document.createElement('a');
			var ol				=document.createElement('ol');
			
			label.style.display	='block';
			label.innerHTML		=category.label;
			
			//set optional events
			if(category.events!=undefined)
			{
				for(var ev in category.events)
					utils.addEvent(label,ev,category.events[ev]);
			}
			
			
			for(x in category.addit_attributes)
				label.setAttribute(x,category.addit_attributes[x]);
			
			//give fieldset an id
			fieldset.setAttribute('id',php.preg_replace("^[0-9]",'',php.preg_replace("[^0-9a-zA-Z]",'',category.label.toLowerCase())));
			
			//hide fieldset
			if(category.collapsed)
			{
				category.collapsible=true;
				ol.style.display	='none';
			}
			//toggle group visiblility
			if(category.collapsible)
			{
				label.setAttribute('href',"Javascript:void(0);");
			//	eval("label.onclick=function(){var vis=this.nextSibling; if(vis.style.display=='none'){vis.style.display='block'} else {vis.style.display='none'}}");
				utils.addEvent(label,'click',"var vis=this.nextSibling; if(vis.style.display=='none'){vis.style.display='block'} else {vis.style.display='none'}");
			}
			
			
			for(field in category.fields)
			{
				//create li
				var f	=category.fields[field];
				var li	=document.createElement('li');
				var l	=document.createElement('label');
				
				li.setAttribute('id',php.preg_replace("^[0-9]",'',php.preg_replace("[^0-9a-zA-Z]",'',f.name)));
				l.innerHTML=f.label;
				li.appendChild(l);
				
				
				if(f.default_value==undefined || f.default_value==NaN)
					f.default_value='';
				
				//insert field
				eval('var el=this.'+f.type+'(f,formObject.name);');
				
				//set optional events
				if(f.events!=undefined)
				{
					for(var ev in f.events)
						utils.addEvent(el,ev,f.events[ev]);
				}
				
				if(f.disabled)
					el.setAttribute('disabled','disabled');
		
				if(f.format!=undefined)
				{
					el.setAttribute('format',f.format);
					utils.addEvent(el,'onchange',"var emt=document.getElementById('"+php.preg_replace("^[0-9]",'',php.preg_replace("[^0-9a-zA-Z]",'',formObject.name))+"').elements['"+f.name+"'];form.setValue(emt,dynamic_form.format(form.getValue(emt),'"+f.format+"'));");
				
				}
				
				li.appendChild(el);
				
				//insert required *
				if(f.required)
				{
					li.setAttribute('required','required');
					var span	=document.createElement('span');
					span.innerHTML='*';
					li.appendChild(span);
				}
				
				ol.appendChild(li);
			}
			
			//add clear div for floats
			var div				=document.createElement('div');
			div.style.clear		='both';
			ol.appendChild(div);
			
			fieldset.appendChild(label);
			fieldset.appendChild(ol);
			form.appendChild(fieldset);
		}
		target.appendChild(form);
	},
	
	//elements
	
	Form: function(obj)
	{
		var el=document.createElement('form');
		el.setAttribute('name',obj.name);	
		el.setAttribute('id',php.preg_replace("^[0-9]",'',php.preg_replace("[^0-9a-zA-Z]",'',obj.name)));	
		el.setAttribute('action',obj.action);	
		el.setAttribute('method',obj.method);	
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
		
		eval("el.onsubmit=function(){void(0);return false;}");
		//utils.addEvent(el,'submit',"void(0);return false;");
			
		return el;	
	},
	
	Text: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('type','text');	
		el.setAttribute('name',obj.name);	
		el.setAttribute('value',obj.default_value);
		el.setAttribute('class','textfield');
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},

	Hidden: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('type','hidden');	
		el.setAttribute('name',obj.name);	
		el.setAttribute('value',obj.default_value);
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	Textarea: function(obj)
	{
		var el=document.createElement('textarea');
		el.setAttribute('class','textarea');
		el.setAttribute('name',obj.name);	
		el.innerHTML=obj.default_value;
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	Select: function(obj)
	{
		var el=document.createElement('select');
		el.setAttribute('name',obj.name);
		el.setAttribute('class','select');	
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		for(x in obj.default_value)
		{
			var o=document.createElement('option');
			o.setAttribute('value',x);
			o.innerHTML=obj.default_value[x];	
			el.appendChild(o);
		}
		return el;	
	},
	
	Checkbox: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('name',obj.name);
		el.setAttribute('type','checkbox');
		el.setAttribute('class','checkbox');	
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);

		el.setAttribute('value',obj.default_value);	
		return el;	
	},

	Button: function(obj,form_name)
	{
		var el=document.createElement('button');
		el.setAttribute('name',obj.name);
		el.innerHTML=obj.default_value;	
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
		
		//eval("el.onclick=function(){dynamic_form.submit('"+form_name+"');}");
		utils.addEvent(el,'onclick',"dynamic_form.submit('"+form_name+"');");	
		return el;	
	},

	Submit: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('name',obj.name);
		el.setAttribute('type','submit');
		el.setAttribute('value',obj.default_value);
		el.setAttribute('class','submit');
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
		eval("el.onclick=function(){dynamic_form.submit('"+form_name+"');}");
		utils.addEvent(el,'click',"dynamic_form.submit('"+form_name+"');");
		
		return el;	
	},
	
	Reset: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('name',obj.name);
		el.setAttribute('type','reset');
		el.setAttribute('value',obj.default_value);
		el.setAttribute('class','reset');
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	
	Upload: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('name',obj.name);
		el.setAttribute('type','file');
		el.setAttribute('class','upload');
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	Password: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('name',obj.name);
		el.setAttribute('type','password');
		el.setAttribute('class','textfield password');
		
		return el;	
	},
	
	Image: function(obj)
	{
		var el=document.createElement('img');
		el.setAttribute('src',obj.default_value);
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	Submit_Image: function(obj)
	{
		var el=document.createElement('input');
		el.setAttribute('name',obj.name);
		el.setAttribute('type','image');
		el.setAttribute('src',obj.default_value);
		el.setAttribute('class','submit_image');
		
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	Plain_Text: function(obj)
	{
		var el=document.createElement('p');
		el.innerHTML=obj.default_value;
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
		return el;	
	},
	Link: function(obj)
	{
		var el=document.createElement('a');
		el.innerHTML=obj.default_value;
		for(x in obj.addit_attributes)
			el.setAttribute(x,obj.addit_attributes[x]);
			
		return el;	
	},
	
	Phone_Number: function(obj,form_name)
	{
		var s=document.createElement('span');
		s.innerHTML='(';
		for(x in obj.addit_attributes)
			s.setAttribute(x,obj.addit_attributes[x]);
			
		obj.default_value=php.preg_replace("^[0-9]",'',php.preg_replace("[^0-9a-zA-Z]",'',obj.default_value));
		var el=document.createElement('input');
		el.setAttribute('name',obj.name+'[0]');
		el.setAttribute('type','text');
		el.setAttribute('maxlength','3');
		el.setAttribute('size','4');
		el.setAttribute('class','textfield phone_number1');
		el.setAttribute('value',obj.default_value.substring(0,3));
		if(obj.disabled)
			el.setAttribute('disabled','disabled');
		
		s.appendChild(el);
		s.innerHTML=s.innerHTML+')&nbsp;';
		var el=document.createElement('input');
		el.setAttribute('name',obj.name+'[1]');
		el.setAttribute('type','text');
		el.setAttribute('maxlength','3');
		el.setAttribute('class','textfield phone_number2');
		el.setAttribute('size','4');
		el.setAttribute('value',obj.default_value.substring(3,6));
		if(obj.disabled)
			el.setAttribute('disabled','disabled');
		s.appendChild(el);
		s.innerHTML=s.innerHTML+'&nbsp;-&nbsp;';
		var el=document.createElement('input');
		el.setAttribute('name',obj.name+'[2]');
		el.setAttribute('type','text');
		el.setAttribute('maxlength','4');
		el.setAttribute('class','textfield phone_number3');
		el.setAttribute('size','5');
		el.setAttribute('value',obj.default_value.substring(6,10));
		if(obj.disabled)
			el.setAttribute('disabled','disabled');
		s.appendChild(el);
		return s;		
	}
};






		