/*******************************************************************
    Company: WebNet Logics Inc.
    Contact: 4593 Queen St., Niagara Falls, Ontario, Canada, L2E2L7
    Phone  : 905-374-0199
    Fax    : 905-374-7862
    Author : Mal Formisano
    Version: 2.0.10
	Usage:
		<SCRIPT type="text/javascript" src="check_form.js"></SCRIPT> 
		<script type="text/javascript">
		//<!--
			var myForm = new Check_Form([form]);
				myForm.add_item(<tag>,<Error Message>'[,'[Re|Length|Email|CC|Link]','<EXP>']);
				myForm.item_set(<Active|Re|Length|Email|CC|Link|Ext>,<EXP>,[tag]){
					Active	- <EXP = (true|false) > Default 'true'
					Re 		- Regular Expression 	
					Length	- Length
					Email	- Valid Email Format
					CC		- Credit Card Mod10
					Ext		- External Function


				myForm.add_item('email','Email','Email');
				or 
				myForm.add_item('email','Email','Re','^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\\.[a-zA-Z0-9._%-]{2,4}$');
				myForm.add_item('Price','Price format','Re','^[0-9]+\\.[0-9]{2}$');
				myForm.add_item('Blank or Min 3 char','Blank or Min 3 charr','Re','^$|^.{3,}');
				myForm.add_item('user_name','First and Last Name','Re','[a-zA-Z]+ [a-zA-Z]+');
				myForm.add_item('user_phone','Phone (XXX-XXX-XXXX)','Re','^[0-9]{3}-[0-9]{3}-[0-9]{4}');
				myForm.add_item('from_list','Country','Re','^(?!Select).*');
				myForm.add_item('bzip','Zip or Postal Code','Re','^([a-zA-Z][0-9][a-zA-Z][ -]?[0-9][a-zA-Z][0-9]|[0-9]{5})$');
				or
				myForm.add_item('bzip','Zip Code','Zip Code');
				or
				myForm.add_item('bzip','Postal Code','Postal Code');
				or
				myForm.add_item('bzip','Zip or Postal Code','Zip Postal Code');

				// Force a 6 char Password and user_pass2 must match user_pass1
				myForm.add_item('user_pass1','Password must be aleast 6 characters','Re','^.{6,}');
				myForm.add_item('user_pass2','Password Mismatch','Link','user_pass1');

				// Optional 6 char Password user_pass2 must match user_pass1
				myForm.add_item('user_pass1','Password must be aleast 6 characters','^$|^.{6,}');
				myForm.add_item('user_pass2','Password Mismatch','Link','user_pass1');

				//Credit Card Mod10
				myForm.add_item('cc_num','Credit Card Number','CC');

				myForm.Check([form]);
					//Returns True if all valid checks pass. False if any valid check fail.

				myForm.Submit([form]) 
					// If all valid checks pass, the form is submitted.
					// form - set form object or use: myForm.setFormByName(<form name>[,num(default:0)]);
					
				myForm.item_set('Active',true,'email');
				myForm.item_set('Active',false,'email');
		//-->
		</SCRIPT> 
		<INPUT type="button" value=" Submit " onClick='return myForm.Submit(this.form)' >

*******************************************************************/

	function Check_Form(uForm){
		this.obj				= new Array();
		this.tag	 			= null;
		if (uForm)
			this.uForm 			= uForm;
		this.error_header		= "The form has the following Errors:\n\n";
		this.error_footer		= "\nPlease correct all errors and try again.";
		this.show_data 			= show_data;
		this.Check				= Check;
		this.Submit				= Submit;
		this.add_item			= add_item;
		this.del_item			= del_item;
		this.del_items			= del_items;
		this.set_item			= set_item;
		this.set_items			= set_items;
		this.item_set			= set_item;
		this.setFormByName		= setFormByName;
		this.setErrorHeader		= setErrorHeader;
		this.setErrorFooter		= setErrorFooter;
	}


		function setErrorHeader(msg){
			this.error_header = msg;
		}

		function setErrorFooter(msg){
			this.error_footer = msg;
		}

		function setFormByName(name,num){
			if (!num) num=0;
			this.uForm = document.getElementsByName(name)[num];
		}

		function set_item(key,val,tag){
			if (tag)
				this.obj[tag][key] = val;
			else
				this.obj[this.tag][key] = val;
		}

		function set_items(key,val,exp){
			var tmp = new Array();
			var myRE = new RegExp(exp);
			for( x in this.obj ){
				if (x.match(myRE)){
					this.set_item(key,val,x);
				}
			}
		}

		function add_item(tag,msg,type,exp){
			this.tag = tag;
			this.obj[tag] = new Array();
			this.obj[tag]['Active'] = true;
			if (msg)
				this.obj[tag]['msg'] = msg;
			if (type)
				this.obj[tag]['type'] = type;
			if (exp)
				this.obj[tag]['exp'] = exp;
		}


		function del_item(tag){
			var tmp = new Array();
			for( x in this.obj ){
				if (x == tag){
					continue;
				}
				tmp[x] = this.obj[x];
			}
			this.obj = tmp;
		}

		function del_items(exp){
			var tmp = new Array();
			myRE = new RegExp(exp);
			for( x in this.obj ){
				if (x.match(myRE)){
					continue;
				}
				tmp[x] = this.obj[x];
			}
			this.obj = tmp;
		}

		function show_data(){
			var x;
			var i;
			var output = "";
			for( x in this.obj ){
				output += "Item: "+x + " => \n";
				for( i in this.obj[x] ){
					output += "     " + i + " = " + this.obj[x][i] +"\n";
				}
			}
			alert(output);
			return false;
		}

		function validate(type,data,exp){
			err = 0;
				if (type == "Re"){
					err = data.match(exp)?0:1
				}else if(type == "CC"){
					err = cc_verify(data)?0:1;
				}else if(type == "Email"){
					err = data.match('^[a-zA-Z0-9._%-]+@[a-zA-Z0-9._%-]+\\.[a-zA-Z0-9._%-]{2,4}$')?0:1
				}else if(type == "Zip Code"){
					err = data.match('^[0-9]{5,}$')?0:1
				}else if(type == "Postal Code"){
					err = data.match('^[a-zA-Z]+[0-9]+[a-zA-Z]+([0-9]+[a-zA-Z]+[0-9]+| [0-9]+[a-zA-Z]+[0-9]+)$')?0:1
				}else if(type == "Zip Postal Code"){
					err = data.match('^([a-zA-Z]+[0-9]+[a-zA-Z]+([0-9]+[a-zA-Z]+[0-9]+| [0-9]+[a-zA-Z]+[0-9]+)|[0-9]{5,})$')?0:1
				}else if(type == "Link"){
					o = document.getElementsByName(exp)[0];
					if (o)
						err = o.value != data?1:0;
				}else if(type == "Length"){
					err = data.length<exp?1:0;
				}else if(type == "Ext"){
					err = eval(exp)?0:1;
				}
			return err;
		}
		function Check(uForm){
			if (uForm)
				this.uForm = uForm;
			var tag;
			var result = "";
			var element_focus = '';
				for( tag in this.obj ){
					if (this.obj[tag]['Active'] == false)
						continue;
					e = document.getElementsByName(tag)[0];
					if (e){
						err = 0;
						if (e.type == "text" || e.type == "hidden" || e.type == "password" || e.type == "file" || e.type == "textarea"){

							if (validate(this.obj[tag]['type'],e.value,this.obj[tag]['exp'])){
								result += "   " + this.obj[tag]['msg'] + "\n";
								if (!element_focus && e.type != "hidden") 
									element_focus = e;
							}
						}else if (e.type == "radio"){
							err = 1;
							for(i=0;i<e.form.elements.length && err;i++){
								if (e.form.elements[i].name == e.name){
									if (e.form.elements[i].checked){
										err = 0;
									}
								}
							}
							if (err){
								result += "   " + this.obj[tag]['msg'] + "\n";
								if (!element_focus) 
									element_focus = e;
							}
						}else if (e.type == "checkbox"){
							if (!e.checked){
								result += "   " + this.obj[tag]['msg'] + "\n";
								if (!element_focus) 
									element_focus = e;
							} 
						}else if (e.type == "select-one"){
							err = 1;
							for(i=0;i<e.options.length;i++){
								if (e.options[i].selected)
									break;
							}
							if (i != e.options.length)
								err = validate(this.obj[tag]['type'],e.options[i].value,this.obj[tag]['exp']);
							if ( err ){
								result += "   " + this.obj[tag]['msg'] + "\n";
								if (!element_focus) 
									element_focus = e;
							}
						}
					}
				}

				if (result.length > 0) {
					alert(this.error_header + result + this.error_footer);
					if (element_focus) {
						//element_focus.select();
						try { 
							element_focus.focus();
						}catch(err){
							return false;
						}
					}
					return false;
				}else{
					return true;
				}
			}

			function cc_verify(cc_num) {
				var n1 = cc_num.charAt(0)-0;
				var n2 = cc_num.charAt(1)-0;
				var min_len = 99;
				var max_len = 0;
				switch(n1){
					case 3:
						if (n2 == 4 || n2 == 7){
							// Amex
							min_len = 15;
							max_len = 15;
						}
						if (min_len == 99 && (n2 == 0 || n2 == 6 || n2 == 8)){
							// Diners Club / Card Blanche
							min_len = 14;
							max_len = 14;
						}
						break;
					case 4:
						// Visa
						min_len = 13;
						max_len = 16;
						break;
					case 5:
						if (n2 >= 1 && n2 <= 5){
							//MasterCard
							min_len = 16;
							max_len = 16;
						}
						break;
					case 6:
						min_len = 16;
						max_len = 16;
						break;
				}
				if (min_len == 99 )
					return (false);
 				var cc_num_length  = cc_num.length;
				//if (cc_num_length < 13 || cc_num_length > 19 )
				if (cc_num_length < min_len || cc_num_length > max_len )
					return (false);
				var sum = 0; 
				var mul = 1;
				for (i = cc_num_length; i > 0; i--) {
					val = parseInt( cc_num.substring(i-1,i) ,10)*((mul^=1)+1);
					if (val > 9)
						sum += (val % 10) + 1;
					else
						sum += val;
				}
				if ((sum % 10) == 0)
					return (true);
				else
					return (false);
			}

			function Submit(uForm,uElement,uValue){ 
				if (uForm)
					this.uForm = uForm;

				if (uElement && uValue){ 
					var o = document.getElementsByName(uElement);
					if (o && o.length >= 1){
						for(var i = 0;i<o.length;i++)
							o[i].value = uValue;
					}else{
						var newItem = document.createElement('<input type="hidden" name="'+uElement+'" value="'+uValue+'">');
						//newItem.name = uElement;
						//newItem.value = uValue;
						this.uForm.appendChild(newItem);
					}
				}

				if (!this.uForm)
					return false;

				if (!this.Check())
					return false; 
				if (this.uForm.Submit) {
					this.uForm.Submit();
				} else {
					this.uForm.submit();
				}
				return true;
			}

