var TDiving = TDiving || {};

TDiving.validate = function(form) {
	var formName = (form.name) ? form.name : 'form';
	var rules = Forms[formName];
	var formValidates = true;
	TDiving.Errors.clearErrors(); // clear errors
	for (var key in rules) {
		var element = $('#' + key);
		var ruleset = rules[key];
		var value = element.val();
		for (var i in ruleset) {
			var validatorName = ruleset[i].name;
			var keyValidates = TDiving.Validator[validatorName](value, ruleset[i].parameters);
			if( keyValidates.length > 0 ) {
				TDiving.Errors.generateError(element, keyValidates);
				formValidates = false;
			}
		}
	}
	if(!formValidates) {
		if(!$('#submit').parent().find('.all-errors').size()) {
			$('#submit').before('<div class="all-errors"><span class="ui-icon" /> Check invalid fields!</div>');
		}
	} else {
		$('#submit').after('<input type="hidden" name="send" value="submit" />');
	}
	return formValidates;
};

TDiving.Validator = {
	Zend_Validate_NotEmpty: function(value, parameters) {
		if($.trim(value).length < 1) {
			return 'required';
		}
		return '';
	},
	Zend_Validate_EmailAddress: function(value, parameters) {
		if($.trim(value).length > 0) {
			var reg = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			var result = reg.test(value);
			if(!result) {
				return 'email';
			}
		}
		return '';
	},
	Zend_Validate_StringLength: function(value, parameters) {
		return '';
	},
	Zend_Validate_Alpha: function(value, parameters) {
		if($.trim(value).length > 0) {
			var reg = /^([a-zA-Z\ \-])+$/;
			var result = reg.test(value);
			if(!result) { return 'alpha'; }
		}
		return '';
	},
	Zend_Validate_Alnum: function(value, parameters) {
		if($.trim(value).length > 0) {
			var reg = /^([a-zA-Z0-9\ \-\#])+$/;
			var result = reg.test(value);
			if(!result) { return 'alnum'; }
		}
		return '';
	},
	Zend_Validate_AmericaStateProvince: function (value, parameters) { // for US and Canada only
		var country = $('#' + parameters.country);
		if($.trim(value).length > 0) {
			if(country.val() == 'CA') {
				var Pr = ['ON', 'QC', 'NS', 'NB', 'MB', 'BC', 'PE', 'SK', 'AB', 'NL'];
				for(var i = 0; i < Pr.length; i++) {
					if(value == Pr[i]) {
						return '';
					}
				}
				return 'province_ca';
			} else if(country.val() == 'US') {
				var Pr = ['AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'VI', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY'];
				for(var i = 0; i < Pr.length; i++) {
					if(value == Pr[i]) {
						return '';
					}
				}
				return 'province_us';
			}
		} else {
			if((country.val() == 'CA') || (country.val() == 'US')) {
				return 'required';
			} else {
				return '';
			}
		}
	},
	Zend_Validate_AmericaZipPostalCode: function(value, parameters) {
		if($.trim(value).length > 0) {
			var val = $.trim(value);
			var country = $('#' + parameters.country);
			if(country.val() == 'CA') {
				if(val.length == 7) {
					var reg = /^[A-Z][0-9][A-Z].[0-9][A-Z][0-9]$/;
					var result = reg.test(val.toUpperCase());
					if(!result) { 
						return 'postal_code'; 
					}
				} else if(val.length == 6) {
					var reg = /^[A-Z][0-9][A-Z][0-9][A-Z][0-9]$/;
					var result = reg.test(val.toUpperCase());
					if(!result) { 
						return 'postal_code'; 
					}
				} else {
					return 'postal_code';
				}
			} else if(country.val() == 'US') {
				if(val.length < 5 && val.length > 10) {
					return 'zip_code';
				}
				var reg = /^([0-9])+$/;
				var result = reg.test(val);
				if(!result) {
					return 'zip_code';
				}
			}
		}
		return '';
	},
	Zend_Validate_Phone: function(value, parameters) {
		if($.trim(value).length > 0) {
			var reg = /^([0-9\ \+\(\-\)])+$/;
			var result = reg.test(value);
			//if(!result) { return parameters.value; }
		}
		return '';
	},
	Zend_Validate_Interests: function(value, parameters) {
		var checked = $('#' + parameters.interests + ' :checked').size();
		if(checked < 1) {
			return 'interests';
		}
		return '';
	},
	Zend_Validate_DoveInBermuda: function(value, parameters) {
		var element = $('#' + parameters.doveinbermuda);
		if(element.val() == 'Yes') {
			if($.trim(value).length < 1) {
				return 'required';
			}
		}
		return '';
	},
	Zend_Validate_InArray: function(value, parameters) {
		return '';
	}
};

TDiving.Errors = {
	helper: { },
	messages: {
		required: 'Value is required and can\'t be empty',
		email: 'Value is not a valid email address in the basic format local-part@hostname',
		alpha: 'Value has not only alphabetic characters',
		alnum: 'Value has not only alphabetic and digit characters',
		province_ca: 'Value must be a valid Canadian Province',
		province_us: 'Value must be a valid US State',
		phone: 'Value must be a valid Telephone Number',
		fax: 'Value must be a valid Fax Number',
		interests: 'Indicate at least 1 (one) option from Area of Interests!',
		zip_code: 'Value must be a valid US ZIP code',
		postal_code: 'Value must be a valid Canadian Postal code'
	},
	generateError: function(element, key) {
		this.createHelper();
		var tr = $('#' + element.attr('id') + '-label');
		var label = tr.find('label');
		if(tr.hasClass('otherrow')) {
			label.css({float: 'left'});
		}
		if( !label.hasClass('error') ) {
			label.addClass('error');
			label.prepend('<span class="ui-icon" rel="' + this.messages[key] + '" />');
		}
		element.change(function(){
			label.find('span').remove();
			label.removeClass('error');
		});
		label.mouseover(function(e){
			var title = label.find('span').attr('rel');
			$('#tooltip').text(title)
				.css({top: e.pageY + 10 + 'px', left: e.pageX + 10 + 'px'})
				.show();
		});
		label.mouseout(function(){
			$('#tooltip').text('')
				.hide();
		});
		
	},
	createHelper: function() {
		if(this.helper.parent) {
			return;
		}
		this.helper.parent = $('<div id="tooltip"></div>')
			.appendTo(document.body)
			.hide();
	},
	clearErrors: function () {
		$(document).find('label').each(function(){
			$(this).find('span').remove();
			$(this).removeClass('error');
		});
	},
	twotankdiveCheckboxes: function() {
		var el = $('#twotankdive-label');
		var label = el.find('label');
		if(label.hasClass('error')) {
			label.find('span').remove();
			label.removeClass('error');
		}
	}
};

TDiving.maxCount = 1500;
TDiving.CharCount = function(elementname) {
	var element = $('#' + elementname);
	element.parent().append('<div style="clear: left; color: #FFFF00; font-size: 11px;">Characters left: <span id="count">' + TDiving.maxCount + '</span></div>');
	element.keypress(function(e){
		var len = element.val().length;
		if (len > TDiving.maxCount) {
			var text = element.val();
			element.val(text.substring(0, TDiving.maxCount));
			$('#count').css({ 'color': '#FF0000'});
		} else {
			$('#count').html(TDiving.maxCount - len);
			if($('#count').css('color') == '#FF0000' || $('#count').css('color') == 'rgb(255, 0, 0)') {
				$('#count').css({'color':'#444444'});
			} 
		}

	});
};

TDiving.Country = function(value, name) {
	var element = $('#' + name);
	switch(value) {
		case 'CA':
		case 'US':
			element.attr('disabled', '');
			break;
		default:
			element.find('option:first').attr('selected', 'selected');
			element.attr('disabled', 'disabled');
	}
};

TDiving.DoveInBermuda = function(value, name) {
	var element = $('#' + name);
	if(value == 'Yes') {
		element.attr('disabled', '');
	} else {
		element.find('option:first').attr('selected', 'selected');
		element.attr('disabled', 'disabled');
	}
};



$(document).ready(function(){
	TDiving.CharCount('comments');
});