function form_element_class(par_node,par_type,par_parent_ob,par_listpos){
	
	var _me=this
	this.node=par_node
	this.parent=par_parent_ob
	this.form_name=_me.node.parentNode.getAttribute("name")
	this.element_name=_me.node.getAttribute("name")
	this.element_type=par_type
	this.pos=par_listpos
	
	//CHECK IF IT'S A REQUIRED FIELD
	if(typeof _me.node.getAttribute("is_required")!="undefined" && !!_me.node.getAttribute("is_required")){
		this.is_required=_me.node.getAttribute("is_required")
	}else{
		this.is_required="0"
	}
	if(typeof _me.node.getAttribute("must_not_match_string")!="undefined" && !! _me.node.getAttribute("must_not_match_string")){
		this.default_value=_me.node.getAttribute("must_not_match_string")					
	}else{
		this.default_value=""	
	}
	this.float_object=0
	this.is_activated=1
	
	this.has_max_value=0
	this.has_min_value=0
	this.has_decimals=0
	this.pre_keyup_value=""
	this.key_is_pressed=0
	this.key_has_been_pressed=0
	
	this.title=""
	
	this.may_have_changed=0
	_me.node.setAttribute("may_have_changed",0)
	
	this.start_value=""
	

	
	//FIND ELEMENT
	var element_ob=document.forms[_me.form_name].elements[_me.element_name]
		
	if(typeof _me.node.getAttribute("display")!="undefined" && !!_me.node.getAttribute("display")){
		_me.title=_me.node.getAttribute("display")	
	}else{
		
		switch(_me.element_type){
			case "radio":
			
				if(element_ob[0].parentNode.nodeName.toLowerCase()=="label"){
				
					var title_ob=element_ob[0].parentNode.parentNode.firstChild
				}else{
					var title_ob=element_ob[0].parentNode.firstChild
				}
				
		
				if(typeof title_ob.className!="undefined" && !!title_ob.className){
					if(title_ob.className=="title"){
						_me.title=title_ob.innerHTML
					}
				}
			break;
			default:
				//LOOK FOR THE DIV CONTAINING THE TITLE
				var title_ob=element_ob.parentNode.firstChild
				if(typeof title_ob.className!="undefined" && !!title_ob.className){
					if(title_ob.className=="title"){
						_me.title=title_ob.innerHTML
					}
				}
			break;
		}
	}
	
	//CHECK TO SEE IF IT IS CURRENTLY ACTIVATED
	switch(_me.element_type){
		case "radio":
		break;
		default:
			//CHECK TO SEE IF IT IS CURRENTLY ACTIVATED
			if(element_ob.parentNode.className.indexOf("disabled")!=-1){
	
				_me.is_activated=0
			}
		break;
	}
		
	if(_me.title==""){
		_me.title=_me.element_name	
	}
	
	this.setup_interface=function(){
	
		switch(_me.element_type){
			case "radio":
					//THERE MAY BE MORE THAN ONE RADIO ELEMENT WITH THIS NAME
					var obs=document.forms[_me.form_name].elements[_me.element_name]
					for(var i=0;i<obs.length;i++){
						document.getElementById(obs[i].id).onclick=function(){_me.form_element_change()}
						if(document.getElementById(obs[i].id).checked==1){
							_me.start_value=obs[i].id
						}
					}
				break;
			case "checkbox":
					document.forms[_me.form_name].elements[_me.element_name].onclick=function(){_me.form_element_change()}
					if(document.forms[_me.form_name].elements[_me.element_name].checked==1){
						_me.start_value="1"
					}
				
				break;
			case "select-one":
			
					document.forms[_me.form_name].elements[_me.element_name].onchange=function(){_me.form_element_change()}
					_me.start_value=document.forms[_me.form_name].elements[_me.element_name].selectedIndex
				
				break;
			case "text":
			case "textarea":	
			case "password":
					
					//document.forms[_me.form_name].elements[_me.element_name].onkeypress=_me.check_keypress
					document.forms[_me.form_name].elements[_me.element_name].onkeydown=_me.check_keypress
		
					document.forms[_me.form_name].elements[_me.element_name].onkeyup=_me.check_keyup
					
					document.forms[_me.form_name].elements[_me.element_name].onblur=_me.check_blur
					
					if(typeof _me.node.getAttribute("max_value")!="undefined" && !! _me.node.getAttribute("max_value")){
						_me.has_max_value=1	
					
						var newdiv=document.createElement("span")
						newdiv.id=_me.element_name+"_charcount"
						newdiv.className="criteria_units"
						
						newdiv.innerHTML=_me.node.getAttribute("max_value")
						document.forms[_me.form_name].elements[_me.element_name].parentNode.appendChild(newdiv)
						
						_me.check_keyup()
					}
					
					if(_me.default_value!=""){
						document.forms[_me.form_name].elements[_me.element_name].onfocus=_me.clear_box
					}
					_me.start_value=document.forms[_me.form_name].elements[_me.element_name].value
				
				break;
		}
	}
	
	this.reset_to_start=function(){
		_me.may_have_changed=0
		_me.node.setAttribute("may_have_changed",0)
		switch(_me.element_type){
			case "radio":
					//THERE MAY BE MORE THAN ONE RADIO ELEMENT WITH THIS NAME
					var obs=document.forms[_me.form_name].elements[_me.element_name]
					for(var i=0;i<obs.length;i++){
						if(obs[i].id==_me.start_value){
							document.getElementById(obs[i].id).checked=1
						}else{
							document.getElementById(obs[i].id).checked=0
						}
					}
				break;
			case "checkbox":
					if(_me.start_value=="1"){
						document.forms[_me.form_name].elements[_me.element_name].checked=1
					}else{
						document.forms[_me.form_name].elements[_me.element_name].checked=0
					}	
				
				break;
			case "select-one":
			
					
					if(_me.start_value!=""){
						document.forms[_me.form_name].elements[_me.element_name].optionns[_me.start_value].selected=1
					}
				
				break;
			case "text":
			case "textarea":	
			case "password":
					
					
					document.forms[_me.form_name].elements[_me.element_name].value=_me.start_value
				
				break;
		}
	}
	
	//CLEARS THE DEFAULT CONTENTS OF A TEXT FIELD
	this.clear_box=function(){
		var ob=document.forms[_me.form_name].elements[_me.element_name]
		if(ob.value==_me.default_value){
			ob.value=""
		}
	}
	
	//FILLS AN EMPTY TEXT FIELD WITH ITS DEFAULT CONTENT
	this.fill_box=function(){
		var ob=document.forms[_me.form_name].elements[_me.element_name]
		if(ob.value==""){
			ob.value=_me.default_value
		}
	}

	this.validate=function(){
	
		var errstr=""
		if(_me.is_activated==1){
			switch(_me.element_type){
				case "textarea":
			
					if(_me.key_has_been_pressed==1){
						var ob=document.forms[_me.form_name].elements["is_"+_me.element_name+"_changed"]
						if(typeof ob!="undefined" && !!ob){
							ob.value=1	
						}
					}
					
				break;
			}
						
			if(_me.is_required=="1"){
				switch(_me.element_type){
					case "text":
					case "textarea":
					case "password":
						if(document.forms[_me.form_name].elements[_me.element_name].value==""){
							errstr+=_me.title+" is required\n"
						}else{
							
							if(typeof _me.node.getAttribute("must_match")!="undefined" && !!_me.node.getAttribute("must_match")){
								if(document.forms[_me.form_name].elements[_me.element_name].value!=document.forms[_me.form_name].elements[_me.node.getAttribute("must_match")].value){
									var match_ob=_me.parent.form_element_node_arr[_me.node.getAttribute("must_match")]
									errstr+=_me.title+" and "+match_ob.title+" must match\n"
									
								}
							}
							if(typeof _me.node.getAttribute("must_not_match")!="undefined" && !!_me.node.getAttribute("must_not_match")){
								if(document.forms[_me.form_name].elements[_me.element_name].value==document.forms[_me.form_name].elements[_me.node.getAttribute("must_not_match")].value){
									var match_ob=_me.parent.form_element_node_arr[_me.node.getAttribute("must_not_match")]
									errstr+=_me.title+" must be different to "+match_ob.title+" must match\n"
									
								}
							}
							
							if(typeof _me.node.getAttribute("must_not_match_string")!="undefined" && !!_me.node.getAttribute("must_not_match_string")){
								if(document.forms[_me.form_name].elements[_me.element_name].value==_me.node.getAttribute("must_not_match_string")){
							
									errstr+=_me.title+" is required\n"
									
								}
							}
						}
						break;
					case "select-one":
							if(document.forms[_me.form_name].elements[_me.element_name].options[document.forms[_me.form_name].elements[_me.element_name].selectedIndex].value==""){
								errstr+=_me.title+" is required\n"
							}
						break;
					case "radio":
							var rad_checked=0
							for(var r=0;r<document.forms[_me.form_name].elements[_me.element_name].length;r++){
								if(document.forms[_me.form_name].elements[_me.element_name][r].checked==1){
									rad_checked=1
								}
							}
							if(rad_checked==0){
								errstr+=_me.title+" is required\n"
							}
						break;
					case "checkbox":
			
							if(document.forms[_me.form_name].elements[_me.element_name].checked==0){
								errstr+=_me.title+" is required\n"
							}
						break;
				}
			}
		}
		return errstr;
	}
	
	
	this.form_element_change=function(){
		
	
		//CHECK IF IT ACTIVATES ANOTHER FIELD
		var activate_nodes=_me.parent.node.selectNodes("//field[./activated[@by_field='"+_me.element_name+"']]")
		
		if(activate_nodes.length>0){
			for(var i=0;i<activate_nodes.length;i++){
				//GET THE NODE THAT IS ACTIVATED BY THIS NODE, TO CHECK TO SEE IF IT SHOULD BE ACTIVATED
				
				_me.parent.form_element_node_arr[activate_nodes[i].getAttribute("name")].check_if_activated()
			}
		}
		
		if(typeof _me.node.getAttribute("float_type")!="undefined" && !!_me.node.getAttribute("float_type")){
			
			_me.float_object=new float_class(_me.node.getAttribute("float_type"),document.forms[_me.form_name].elements[_me.element_name].options[document.forms[_me.form_name].elements[_me.element_name].selectedIndex].value,document.forms[_me.form_name].elements[_me.element_name],item_ID,_me)
			document.forms[_me.form_name].elements[_me.element_name].options[0].selected=1
			_me.float_object.get_float_xml()
			
		}
		
		_me.may_have_changed=1
		_me.node.setAttribute("may_have_changed",1)
		
		
		
	}
	
	this.validate_text_field_value=function(val){
	
		var valid_value=1
		
		if(_me.has_max_value==1){
			if(val.length>parseInt(_me.node.getAttribute("max_value"))){
			
				val=val.substr(0,parseInt(_me.node.getAttribute("max_value")))
			}
		}		


		if(valid_value==1){
			return val
		}else{
			return ""	
		}
	}
	
	this.check_keypress=function(evt){
		
		//CHECKS TO SEE IF THE CHARACTER ABOUT TO BE ENTERED IS VALID AND IF NOT PREVENTS THE CHARACTER FROM BEING ENTERED
		if(typeof evt=="undefined" || !evt){
			evt=window.event
		}
		if(evt.keyCode){
			//IE
			var cd=evt.keyCode
		}else{
			//MOZ
			var cd=evt.charCode
		}
		
		var form_element=document.forms[_me.form_name].elements[_me.element_name]
		var valid_key=1
		
		if(_me.key_is_pressed==0){
			_me.pre_keyup_value=_me.validate_text_field_value(form_element.value)
			_me.key_is_pressed=1
			if(cd==9 || cd==13 || cd==9 || cd==37 || cd==39){
				//TAB OR RETURN OR LEFT OR RIGHT
			}else{
				
				
				if(_me.has_max_value==1){
			
					if(form_element.value.length>=parseInt(_me.node.getAttribute("max_value"))){
						valid_key=0
					}
				}
					
			}
		}else{
			valid_key=0
		}
		//return valid_key==1
		_me.key_has_been_pressed=1
		
	}
	
	this.check_keyup=function(){
		//CHECKS TO SEE IF THE CURRENT VALUE OF THE TEXT FIELD IF VALID, AND IF NOT SETS THE VALUE OF THE TEXT FIELD BACK TO THE LAST VALID VALUE
		var form_element=document.forms[_me.form_name].elements[_me.element_name]
		var valid_value=1
		_me.key_is_pressed=0
		
		if(_me.has_max_value){
			if(form_element.value.length>parseInt(_me.node.getAttribute("max_value"))){
				form_element.value=form_element.value.substr(0,parseInt(_me.node.getAttribute("max_value")))
			}
		}		
					
		if(valid_value==0){
			
			form_element.value=_me.validate_text_field_value(_me.pre_keyup_value)
		}
		
		if(_me.has_max_value){
			document.getElementById(_me.element_name+"_charcount").innerHTML=parseInt(_me.node.getAttribute("max_value"))-form_element.value.length
		}
		
		if(_me.key_has_been_pressed==1){
			_me.may_have_changed=1
			_me.node.setAttribute("may_have_changed",1)
		}
	
		
	}
	
	this.check_blur=function(){
		_me.check_keyup()
		if(_me.default_value!=""){
			_me.fill_box()	
		}
	}
	this.check_if_activated=function(){
		
		var activated_nodes=_me.node.selectNodes("./activated")
		if(activated_nodes.length>0){
			//IF THIS NODE IS ACTIVATED BY OTHER NODES
			
			var match_count=0
			for(var i=0;i<activated_nodes.length;i++){
				//GET THE CONTROL OBJECT, AN DTHE FORM ELEMENT FOR THE ACTIVATING NODE
				var by_node_ob=_me.parent.form_element_node_arr[activated_nodes[i].getAttribute("by_field")]

				//GET THE ELEMENT FOR THIS NODE
				var result_ob=document.forms[_me.form_name].elements[_me.element_name]
				
				if(typeof by_node_ob!="undefined" && !!by_node_ob){
					
					var by_el_ob=document.forms[_me.form_name].elements[by_node_ob.element_name]
					
					var holder_ob=result_ob.parentNode
					
					switch(by_node_ob.element_type){
						case "radio":
								
							if(by_el_ob.length>0){
								
								for(var r=0;r<by_el_ob.length;r++){
									if(by_el_ob[r].checked==1){
										by_val=by_el_ob[r].value
									}
								}
							}
								
								
							break;
						case "checkbox":
						
							if(by_el_ob.checked==1){
								by_val=by_el_ob.value
							}
							
							break;
						case "select-one":
							by_val=by_el_ob.options[by_el_ob.selectedIndex].value
							
							
							break;
					}
					switch(activated_nodes[i].getAttribute("by_comparator")){
						case "=":
								if(by_val==activated_nodes[i].getAttribute("by_value")){
									match_count++
								}
							break
						case "!=":
								if(by_val!=activated_nodes[i].getAttribute("by_value")){
									match_count++
								}
							break
					}
				}
			}
			if(match_count==activated_nodes.length){
				_me.activate()
			}else{
				_me.deactivate()
			}
		}
	}
	
	this.activate=function(){
		//GET THE ELEMENT FOR THIS NODE
		var result_ob=document.forms[_me.form_name].elements[_me.element_name]
		var holder_ob=result_ob.parentNode
		result_ob.disabled=0
								
		if(holder_ob.className.indexOf(" disabled")!=-1){
			
			holder_ob.className=holder_ob.className.substr(0,holder_ob.className=holder_ob.className.indexOf(" disabled"))
			
		}
		_me.is_activated=1
	}
	
	this.deactivate=function(){
		//GET THE ELEMENT FOR THIS NODE
		var result_ob=document.forms[_me.form_name].elements[_me.element_name]
		var holder_ob=result_ob.parentNode
		result_ob.disabled=1
		if(holder_ob.className.indexOf(" disabled")==-1){
			
			holder_ob.className=holder_ob.className+" disabled"
			
		}
		_me.is_activated=0
	}
	
	

}
	
