var Valid = new Object;
Valid.Billing = [];
Valid.Shipping = [];
Valid.Payment = [];
Valid.MsgShow = function(name,show) {
	if(show) {
		if($(".st_"+name).hasClass("i"))
			$(".st_"+name).removeClass("i");
	} else {
		if( ! $(".st_"+name).hasClass("i") )
			$(".st_"+name).addClass("i");
	}
}
Valid.Validation = function(sender,form,valid) {
	var value = $(sender).val();
	if(value.length==0 && (form.options["default"]!==undefined)) {
		$(sender).val(form.options["default"]);
	} else {
		if(valid && ((value.length>0 && form.options.required) || (!form.options.required))) {
			this.MsgShow(form.name,0);
			form.value = value;
			form.valid = (true);
		} else {
			this.MsgShow(form.name,1);
			form.value = "";
			form.valid = (false);
		}
	}
}
Valid.Select = function(sender,form) {
	var name = $(sender).attr( "name" );
	var val = $(sender).attr( "value" );
	if(name===form.name) {
		if(form.options.values[val]!==undefined) {
			this.MsgShow(form.name,0);
			form.value = val;
			form.valid = (true);
		} else {
			this.MsgShow(form.name,1);
			form.value = "";
			form.valid = (false);
		}
	}
}
Valid.Int = function( sender, form ) {
	var name = $(sender).attr("name");
	var val = $(sender).val();
	if(name===form.name) {
		var re = /^[0-9]*$/;
		var valid = re.test( val );
		this.Validation(sender,form,valid);
	}
}
Valid.Text = function(sender,form) {
	var name = $(sender).attr("name");
	var value = $(sender).val();
	if(name===form.name) {
		var valid = (typeof(value)==="string");
		this.Validation(sender,form,valid);
	}
}
Valid.Check = function(sender,form) {
	var name = $(sender).attr("name");
	if(name===form.name) {
		if($(sender).attr("checked")===(true)) {
			this.MsgShow(form.name,0);
			form.value = (true);
			form.valid = (true);
		} else {
			this.MsgShow(form.name,1);
			form.value = "";
			form.valid = (false);
		}
	}
}
Valid.isLeapYear = function(year) {
	if(year=== 0) 
		return (false);
	if (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0))
		return (true);
	else
		return (false);
}
Valid.getDaysOfMonth = function(month, year) {
	var days;
	var year_val = 0;
	if(month===undefined) 
		return 31;
	if(year!==undefined) 
		year_val = year;
	if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
		days=31;
	else if (month==4 || month==6 || month==9 || month==11) 
		days=30;
	else if (month==2) {
		if (isLeapYear(year_val)) days=29;
		else days=28;
	}
	return (days);
}
Valid.SetDays = function(month,day,year,dummy) {
	var days = this.getDaysOfMonth(month.value,year.value);
	if((day.value!==undefined) && (day.value>days)) {
		if(dummy.valid===(true)) {
			this.MsgShow(dummy.name,1);
		}
		dummy.valid = (false);
		day.value = "";
		day.valid = (false);
	}
	if(days!==undefined) {
		if((day.options.days===undefined) || days!==day.options.days) {
			$("[name='"+day.name+"']").empty();
			var opt_str = [];
			opt_str[0] = '<option value="">&nbsp;Day</option>';
			for(var i=1; i<=days; i++) {
				var selected = "";
				if(i==day.value)
					selected = 'selected="selected"';
				opt_str[i] = '<option '+selected+' value="'+i+'">'+i+'</option>';
			}
			$( "[name='"+day.name+"']" ).append( opt_str.join( "" ) );
			day.options.days = days;
		}
	}
}
Valid.CheckDate = function(value,form,dummy,year,month,day) {
	if(form.options.values[value]!==undefined) {
		form.value = value;
		form.valid = (true);
		if(day!==undefined) {
			if(form.options.type==="date_month" || form.options.type==="date_year")
				set_days(month,day,year,dummy);
			if(month.valid && day.valid && year.valid) {
				var date = new Date();
				var year_18 = date.getFullYear() - 18;
				var month_this = date.getMonth();
				if(year_18>year.value) {
					dummy.valid = (true);
					this.MsgShow(dummy.name,0);
				} else if((year_18==year.value) && ((month.value-1)<month_this)) {
					dummy.valid = (true);
					this.MsgShow(dummy.name,0);
				} else if((year_18==year.value) && ((month.value-1)==month_this) && (date.getUTCDate()>day.value)) {
					dummy.valid = (true);
					this.MsgShow(dummy.name,0);
				} else {
					dummy.valid = (false);
					this.MsgShow(dummy.name,1);
				}
			}
		} else {
			if(month.valid && year.valid) {
				dummy.valid = (true);
				this.MsgShow(dummy.name,0);
			}
		}
	} else {
		form.value = "";
		form.valid = (false);
		if( dummy.valid===(true) ) {
			this.MsgShow(dummy.name,1);
		}
		dummy.valid = (false);
	}
}
Valid.Date = function(sender,date,form) {
	var month;var day;var year;var dummy;
	var value = $(sender).attr("value");
	var fields = form.fields;
	for( key in form.fields ) {
		if( fields[key]["options"]["type"]==="date_month" ) {
			month = fields[key];
		} else if( fields[key]["options"]["type"]==="date_day" ) {
			day = fields[key];
		} else if( fields[key]["options"]["type"]==="date_year" ) {
			year = fields[key];
		} else if( fields[key]["options"]["type"]==="date_dummy" ) {
			dummy = fields[key];
		}
	}
	var type = date.options.type;
	if(type=="date_day" || type=="date_month" || type=="date_year")
		this.CheckDate( value, date, dummy, year, month, day );
}
Valid.AjaxRegion = function(country) {
	Act.Ajax(
		Act.CartPath,
		"country_set="+country,
		function(data){
			var reg_arr = [];
			var code_arr = [];
			$( "[name='"+region.name+"']" ).empty();
			if( data.regions != null ) {
				reg_arr.push('<option value="">&nbsp;Region</option>');
				for( var index in data.regions ) {
					$.each( data.regions[index], function( type, regions ) {
						reg_arr.push( '<optgroup label="'+type+'">' );
						$.each(
							regions, function( ind, reg_val ) {
								var code = reg_val["code"];
								var name = reg_val["name"];
								code_arr[code] = name;
								if( code == region.value ) {
									reg_arr.push( '<option selected="selected" value="'+code+'">'+name+'</option>' );
								} else {
									reg_arr.push( '<option value="'+code+'">'+name+'</option>' );
								}
							}
						);
						reg_arr.push( '</optgroup>' );
					} );
				}
				$("[name='"+region.name+"']").append( reg_arr.join("") );
				region.value = "";
				region.valid = (false);
				$("[name='"+region.name+"']").val('');
			} else {
				$("[name='"+region.name+"']").addClass( "hidden" );
				code_arr["none"] = "none";
				$("[name='"+region.name+"']").append('<option value="none" selected="selected">none</option>');
				region.value = "none";
				region.valid = (true);
				st_valid( region.name );
			}
			region.options.values = code_arr;
		},
		function(data) {
			$( "[name='"+region.name+"']" ).removeClass( "hidden" );
		}
	);
}
Valid.Country = function(country,form) {
	for( var key in form.fields ) {
		if( form.fields[key].options.type==="region" ) {
			region = form.fields[key];
		}
	}
	value = $("[name='"+country.name+"']").attr( "value" );
	if(value=="") {
		$( "[name='"+region.name+"']" ).empty();
		$( "[name='"+region.name+"']" ).append( '<option value="">&nbsp;Choose country</option>' );
	}
	if(country.options.values[value]!==undefined) {
		country.value = value;
		if( country.valid !== (true) ) {
			country.valid = (true);
			this.MsgShow(country.name,0);
		}
		if( ! $( "[name='"+region.name+"']" ).hasClass( "hidden" ) )
			$( "[name='"+region.name+"']" ).addClass( "hidden" );
		this.AjaxRegion(value);
	} else {
		if(country.valid==(true)) {
			country.valid = (false);
			country.value = "";
			this.MsgShow(region.name,1);
		}
	}
}
Valid.SetRegion = function(country,form) {
	for( var key in form.fields ) {
		if(form.fields[key].options.type==="region") {
			var region = form.fields[key];
		}
	}
	var value = country.value;
	if( value == "" ) {
		$( "[name='"+region.name+"']" ).empty();
		$( "[name='"+region.name+"']" ).append( '<option value="">&nbsp;Choose country</option>' );
		region.valid = (false);
		region.value = '';
	}
	if(value.length>0) {
		this.AjaxRegion(value);
	}
}
Valid.Region = function(sender,form) {
	var region = $(sender).attr("value");
	if(form.options.values[region]!==undefined) {
		form.value = region;
		if( form.valid !== (true) ) {
			form.valid = (true);
			this.MsgShow(form.name,0);
		}
	} else {
		form.value = "";
		if( form.valid == (true) ) {
			form.valid = (false);
			this.MsgShow(form.name,1);
		}
	}
}
Valid.Email = function(sender,form) {
	var value = $( sender ).val();
	var template = /^.{2,}@.{2,}\..{2,6}$/;
	var valid = (template.test(value) && value.length>7);
	this.Validation(sender,form,valid);
}
Valid.Phone = function(sender,form) {
	var value = $(sender).val();
	var temp = /[^0-9]/g;
	value = value.replace(temp,"");
	var valid = (value.length>5);
	this.Validation(sender,form,valid);
}
Valid.CardNumber = function(sender,cardnumber,form) {
	var value = $(sender).val();
	var valid = 0;
	temp = /[^0-9]/g;
	value = value.replace(temp,"");
	for(var reg in reg_exp) {
		r = new RegExp(reg_exp[reg],'g');
		if(r.test(value) && form.fields.paytype.options.values[reg]!=undefined) {
			valid = 1;
			cardnumber.valid = (true);
			cardnumber.value = value;
			this.MsgShow(cardnumber.name,0);
			break;
		}
	}
	if(!valid) {
		cardnumber.valid = (false);
		cardnumber.value = "";
		this.MsgShow(cardnumber.name,1);
	}
}
Valid.CVV = function(sender,form) {
	var value = $( sender ).val();
	temp = /[^0-9]/g;
	value = value.replace(temp,"");
	var valid = (value.length==3 || value.length==4);
	this.Validation(sender,form,valid);
}
Valid.Pass = function(sender,Pass,form) {
	var value = $(sender).val();
	var valid = (value.length>5);
	if(value.length>5) {
		this.MsgShow(Pass.name,0);
		Pass.value = value;
		Pass.valid = (true);
	} else {
		this.MsgShow(Pass.name,1);
		Pass.value = value;
		Pass.valid = (false);
	}
	var rePass;
	for(var key in form.fields) {
		if( form.fields[key].options.type=="pass_re" && form.fields[key].options.group==Pass.options.group) {
			rePass = form.fields[key];
		}
	}
	this.rePass($('[name='+rePass.name+']'),rePass,form);
}
Valid.rePass = function(sender,rePass,form) {
	var value = $(sender).val();
	var Pass;
	for(var key in form.fields) {
		if( form.fields[key].options.type==="pass" && form.fields[key].options.group==rePass.options.group) {
			Pass = form.fields[key];
		}
	}
	if(value==Pass.value || !Pass.valid) {
		this.MsgShow(rePass.name,0);
		rePass.value = value;
		rePass.valid = (true);
	} else {
		this.MsgShow(rePass.name,1);
		rePass.value = value;
		rePass.valid = (false);
	}
}
Valid.Shipping = function(sender) {
	var Type = $(sender).attr('value');
	if(Type=="specify") {
		if( $( ".shipping_info" ).hasClass( "i" ) )
			$( ".shipping_info" ).removeClass( "i" );
	} else if(Type=='billing') {
		if( !$( ".shipping_info" ).hasClass( "i" ) )
			$( ".shipping_info" ).addClass( "i" );
	}
}

$(function() {
	var FormArray = []
	if(PageForms!==undefined)
		FormArray = PageForms;
	$.each(FormArray, function(index,SelectForm) {
		for( var key in SelectForm.fields ) {
			var val = SelectForm.fields[key];
			var elem= $("[name='"+SelectForm.fields[key].name+"']");
			if(elem!==undefined) {
				if(val.options.type==="select") {
					$("[name='"+SelectForm.fields[key].name+"']").bind(
						"click", function(num) {
							return function() {
								Valid.Select($(this),SelectForm.fields[num]);
							};
						} (key)
					);
				} else if(val.options.type==="date_month" || val.options.type==="date_day" || val.options.type==="date_year") {
					$(elem).bind(
						"change", function(num) {
							return function() {
								Valid.Date($(this),SelectForm.fields[num],SelectForm);
							};
						} (key)
					);
				} else if(val.options.type==="int") {
					$(elem).bind(
						"blur", function(num) {
							return function() {
								Valid.Int($(this),SelectForm.fields[num]);
							};
						} (key)
					);
				} else if(val.options.type==="text") {
					$(elem).bind(
						"blur", function(num) {
							return function() {
								Valid.Text($(this),SelectForm.fields[num]);
							}
						} (key)
					);
				} else if(val.options.type==="check") {
					$(elem).bind( 
						"click", function(num) {
							return function() {
								Valid.Check($(this),SelectForm.fields[num]);
							}
						} (key)
					);
				} else if(val.options.type==="country") {
					Valid.SetRegion(SelectForm.fields[key],SelectForm);
					$(elem).bind( 
						"change", function(num) {
							return function() {
								Valid.Country(SelectForm.fields[num], SelectForm);
							}
						} (key)
					);
				} else if(val.options.type==="region") {
					$(elem).bind( 
						"change", function(num) {
							return function() {
								Valid.Region($(this),SelectForm.fields[num]);
							}
						} (key)
					);
				} else if(val.options.type==="email") {
					$(elem).bind( 
						"blur", function(num) {
							return function() {
								Valid.Email($(this),SelectForm.fields[num]);
							}
						} (key)
					);
				} else if(val.options.type==="card") {
					$(elem).bind( 
						"blur", function(num) {
							return function() {
								Valid.CardNumber($(this),SelectForm.fields[num],SelectForm);
							}
						} (key)
					);
				} else if(val.options.type==="cvv") {
					$(elem).bind( 
						"blur", function(num) {
							return function() {
								Valid.CVV($(this),SelectForm.fields[num]);
							}
						} (key)
					);
				} else if(val.options.type==="phone") {
					$(elem).bind( 
						"blur", function(num) {
							return function() {
								Valid.Phone($(this),SelectForm.fields[num]);
							}
						} (key)
					);
				} else if(val.options.type==="pass") {
					$(elem).bind( 
						"blur", function(num) {
							return function() {
								Valid.Pass($(this),SelectForm.fields[num],SelectForm);
							}
						} (key)
					);
				} else if( val.options.type==="pass_re" ) {
					$(elem).bind( 
						"blur", function(num) {
							return function() {
								Valid.rePass($(this),SelectForm.fields[num],SelectForm);
							}
						} (key)
					);
				}
			}
		}
	});
} );
