
var formChecker = new function(){
	// THESE ARE THE FUNCTIONS THAT WILL VALIDATE THE INPUTS
	var checks = this.checks = {
		'password' : 
			function(){
				var form = parentForm(this);
				if(this.value.length > 5){
					var same_el = this.getAttribute('sameas');
					if(same_el && form[same_el] ){
						if(this.value == form[same_el].value)
							this.mark('success');
						else
							this.mark('error', 'Does not match!');
					} else{
						this.mark('success');
					}
				} else{
					this.mark('error', 'Password too short');
				}
			},
		'name' : 
			function(){
				if(/^([A-Za-z-' ]+)$/.test(this.value))
					this.mark('success');
				else
					this.mark('error', 'Invalid name');
			},
		'company_name' : 
			function(){
				if(/^[a-z_A-Z 0-9\.\-\+\*\#\@\!\(\)]+$/.test(this.value))
					this.mark('success');
				else
					this.mark('error', 'Invalid company name');
			},
		'email' : 
			function(){
				if(/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/.test(this.value))
					this.mark('success');
				else
					this.mark('error', 'Invalid Email');
			},
		'phone' : 
			function(){
				var phone = this.value.replace(/\D/g,"");
				if(phone.length < 10){
					this.mark('error', 'Too few digits');
				} else if(phone.length > 10){
					this.mark('error', 'Too many digits');
				} else{
					this.value = "("+phone.substr(0,3)+") "+phone.substr(3,3)+"-"+phone.substr(6,4);
					this.mark('success');
				}
			},
		'username' :
			function(){
				if(this.check_timeout){
					window.clearTimeout(this.check_timeout);
					this.check_timeout = false;
				}
				this.value = this.value.toLowerCase();
				if(/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z]{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/.test(this.value)){
					var el = this;
					this.check_timeout = window.setTimeout(function(){
						el.mark('loading');
						ajax.get('/inc/php/requests.php?check_username='+el.value,function(response){
							if(response == "true"){
								el.mark('success');
							} else{
								el.mark('error', 'Username Taken!');
							}
						});
					}, 500);
				} else{
					this.mark('error', 'Invalid Username');	
				}
			}
	}
	
	// INITIALIZE THE FORM ELEMENTS
	var init = this.init = function(form,el){
		var form = typeof(form) == "string" ? document.getElementById(form) : form;
		var forms = form ? [form] : document.forms;
		
		for(var h=0; form = forms[h]; h++){
			new function(form){
				var format,limit;
				var elements = [];
				var submit_buttons = [];
				var errors = [];
				
				// LOOP THROUGH EVERY INPUT ELEMENT IN THE FORM..
				els = el ? [el] : form.getElementsByTagName('INPUT');
				for(var i=0,el;el=els[i];i++){
					new function(el){
						if(el.type == "submit"){
							submit_buttons.push(el);
						} else if(el.type != "submit" && el.type != "button"){			
							// ONLY ALLOW CERTAIN INPUTS
							if(allow = el.getAttribute('allow')){
								if(allow == "letters"){
									el.onkeypress =  function(event){
										if(!event) event = window.event;
										var charCode = (event.which) ? event.which : event.keyCode;
										if(charCode == 86 && event.ctrlKey){ 
											var value = this.value;
											// LET THE PASTE GO THORUGH THEN CHECK IF THE NEW
											// VALUE IS NUMERIC. IF NOT GO BACK TO OLD VALUE
											var upevent = addEvent(this, 'keyup', function(){
												if(!isNumeric(this.value)) this.value = value;
												removeEvent(upevent);
											});
											return true;
										} else
											return isLetter(String.fromCharCode(charCode));
									};
								} else if(allow == "int"){
									el.onkeypress =  function(event){
										if(!event) event = window.event;
										var charCode = (event.which) ? event.which : event.keyCode;
										if(charCode == 86 && event.ctrlKey){
											var value = this.value;
											// LET THE PASTE GO THORUGH THEN CHECK IF THE NEW
											// VALUE IS NUMERIC. IF NOT GO BACK TO OLD VALUE
											var upevent = addEvent(this, 'keyup', function(){
												if(!isInt(this.value)) this.value = value;
												removeEvent(upevent);
											});
											return true;
										} else{
											return isInt(event);
										}
									};
								} else if(allow == "number"){
									el.onkeydown = function(event){
										if(!event) event = window.event;
										var charCode = (event.which) ? event.which : event.keyCode;
										// THEY ARE TRYING TO PASTE SOMETHING 
										if(charCode == 86 && event.ctrlKey){ 
											var value = this.value;
											// LET THE PASTE GO THORUGH THEN CHECK IF THE NEW
											// VALUE IS NUMERIC. IF NOT GO BACK TO OLD VALUE
											var upevent = addEvent(this, 'keyup', function(){
												if(!isNumeric(this.value)) this.value = value;
												removeEvent(upevent);
											});
											return true;
										}  else{
											return isNumeric(event);
										}
									}
									
								}
							}
							// SET MAXIMUM VALUE
							if(el.getAttribute('max') != undefined){
								var maximum = el.getAttribute('max');
								if(maximum = parseFloat(maximum)){
									addEvent(el, 'change', function(event){
										if(this.value > maximum){
											flash(this);
											this.value = maximum;
										}
									});
								}
							}
							// SET MINIMUM VALUE
							if(el.getAttribute('min') != undefined){
								var minimum = el.getAttribute('min');
								if(minimum = parseFloat(minimum)){
									addEvent(el, 'change', function(event){
										if(this.value < minimum){
											flash(this);
											this.value = minimum;
										}
									});
								}
							}
							
							// INPUT MUST FOLLOW FORMAT
							if(el.getAttribute('format')){
								elements.push(el);
								// PUT A BUTTON NEXT TO IT AND SET THE EVENTS TO AUTO-CHECK ON BLUR (OR ON KEYUP IF IT'S ALREADY BEEN CHECKED!)
								if(!el.nextSibling || el.nextSibling.nodeName != "BUTTON") insertAfter(newEl('SPAN',{'class':'hidden'}),el);
								addEvent(el, 'keyup', function(event){
									if(el.nextSibling.className == 'success' || el.nextSibling.className == 'error'){
										el.setAttribute('formCheckerStatus', false);
										checkErrors(el);
									}
									el.onchange = function(){
										el.setAttribute('formCheckerStatus', false);
										checkErrors(el);
									}
								});
							} else if(el.getAttribute('required') != undefined){
								elements.push(el);
							}
						}
						// MARK THE ELEMENT AS 'SUCESS', 'ERROR', OR 'LOADING'
						el.mark = function(status, message){
							if(el && el.nextSibling && el.nextSibling.nodeName == 'SPAN'){
								el.setAttribute('formCheckerStatus', status);
								el.nextSibling.className = status;
								el.nextSibling.innerHTML = message ? message : '&nbsp;';
								errors.remove(el);
								if(status == 'error' && el.getAttribute('required') != undefined) errors.push(el);
							}
						}
						
					}(el);
				} // DONE LOOPING THROUGH ELEMENTS
			
				// SET THE FORM ONSUBMIT EVENT TO CHECK ALL ELEMENTS BEFORE SUBMITTING
				var old_onsubmit = form.onsubmit;
				//if(form.id) alert('CHECKED - CHANGING FORM '+form.id+' onsubmit FROM '+form.onsubmit);
				form.onsubmit = function(event){
					checkErrors();
					if(errors.length){
						// IF THE ERROR IS OUT OF SIGHT THEN SCROLL TO IT..
						var pos = absPos(errors[0]);
						if(pos && (pos.y < document.body.parentNode.scrollTop || pos.y > (document.body.parentNode.scrollTop+document.body.parentNode.clientHeight))){
							document.body.parentNode.scrollTop = pos.y-40;
						}
						alert('Please correct the problems on this page..');
						return false;
					} else if(old_onsubmit){
						form.onsubmit = old_onsubmit;
						return form.onsubmit();
						return false;
					}
				}

				// CHECK EITHER ONE ELEMENT OR ALL ELEMENTS
				var checkErrors = function(input){
					var els = input ? [input] : elements;
					for(var i=0, format, required, el; el=els[i]; i++){
						
						if(el.getAttribute('formCheckerStatus') != 'success'){
							if((format = el.getAttribute('format')) && checks[format]){	
								if(input || el.getAttribute('required') != undefined) {
									checks[format].call(el);
								}
							} else if(el.getAttribute('required') != undefined){
								if(!getFormValue(el)) el.mark('error');
							}
						}
					}
				}
				
			}(form); // DONE NEW FUNCTION()
		} // DONE LOOPING THROUGH FORMS
	} // DONE WITH INIT..
	
	var flash = function(el){
		el.style.color = 'white';
		el.style.backgroundColor = '#FFAAAA';
		el.style.border = '1px solid #DD0000';
		window.setTimeout(function(){
			el.style.backgroundColor = '';
			el.style.border = '';
			el.style.color = '';
		}, 200);		
	}
	
	addEvent(window,'load', function(){init()});
}
