/*********************************************
Fossil.com validation plugin.com
2010 ian brunner
*********************************************/

var isMSIE = /*@cc_on!@*/false;
var FormSubmitted = '';

/*********************************************
Add rules/validation based on css tags
*********************************************/
$(document).ready(function() {
	//create error tooltip
	$('body').prepend('<span id="errorMessage"><span id="errorLeft"><span id="errorRight"><span id="messageContentWrapper"><span id="messageContent"></span></span></span></span><!--[if lte IE 6.5]><iframe></iframe><![endif]--></span>');
});

/*********************************************
Rules object
required: object, message
optional: options object
*********************************************/
jQuery.rules = {

	'required' : function(obj, message) {
		if($(obj).val() == null || $(obj).val() == '') {
			$(obj).data('errorMessage', message);
			return false;
		}else{
			return true;	
		}
	},

	'minLength' : function(obj, message, options) {
		if($(obj).val().length < options.minLength) {
			$(obj).data('errorMessage', message);
			return false;
		} else {
			return true;
		}
	},
	
	'maxLength' : function(obj, message, options) {
		if($(obj).val().length > options.maxLength) {
			$(obj).data('errorMessage', message);
			return false;
		} else {
			return true;
		}
	},
	
	'number' : function(obj, message) {
		var valid = "0123456789";
		for (var i=0; i < $(obj).val().length; i++) {
			temp = "" + $(obj).val().substring(i, i+1);
			if (temp == "-") hyphencount++;
			if (valid.indexOf(temp) == "-1") {
				$(obj).data('errorMessage', message);	
				return false;
			}
		}
		return true;
	},

	'zipNumber' : function(obj, message) {
		var valid = "0123456789-";
		var hyphencount = 0;

		if ($(obj).val().length != 5 && $(obj).val().length != 10) {		
			$(obj).data('errorMessage', message);
			return false;
		}
		for (var i=0; i < $(obj).val().length; i++) {
			temp = "" + $(obj).val().substring(i, i+1);
			if (temp == "-") {
				hyphencount++; 
			}
			if (valid.indexOf(temp) == "-1") {
				$(obj).data('errorMessage', message);
				return false;
			}
			if ((hyphencount > 1) || (($(obj).val().length==10) && ""+$(obj).val().charAt(5)!="-")) {
				$(obj).data('errorMessage', message);
				return false;
			}
		}
		return true;
	},

	'email' : function(obj, message) {
		var email = $(obj);
		var filter =/^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/;
		if (!(filter.test(email.val()))) {
			$(obj).data('errorMessage', message);
			return false;
		}
		return true;
	},

	'phone' : function(obj, message) {
		phone = $(obj); 
		var filter = /^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/;  
		if (!(filter.test(phone.val()))) {
			$(obj).data('errorMessage', message);
			return false;
		}
		return true;
	},
	
	'password' : function(obj, message) {
		return true;
	},
	
	'passwordChars' : function(obj, message) {
		var regEx= /^(.)\1{3,}/;
		var test = !regEx.test($(obj).val());
		if (test) {
			return true;
		} else {
			$(obj).data('errorMessage', message);
			return false;
		}
	},
	
	'passwordFormat' : function(obj, message) {
		if ($(obj).val().length == 0) {
			return true;
		}		
		if ($(obj).val().length < 6) {
			$(obj).data('errorMessage', message);
			return false;
		}
		var regdigit=/[0-9]/;
		var test = regdigit.test($(obj).val());
		if (!test) {
			$(obj).data('errorMessage', message);
			return false;
		}
		var newString = $(obj).val().toUpperCase() 
		var regChar=/[A-Z]/;
		var test = regChar.test(newString);
		if (!test) {
			$(obj).data('errorMessage', message);
			return false;
		} else {
			return true;		
		}
	},
	
	'confirmation' : function(obj, message, options) {
		if($(obj).val() != $(options.selector).val()) {
			$(obj).data('errorMessage', message);
			return false;
		} else {
			return true;
		}
	},
	
	'giftCard' : function(obj, message) {
		var bGiftcardNumberError = false;
		var giftCardNumber = trim(obj.value);
		if (giftCardNumber.length != 19) {
			bGiftcardNumberError = true;
		}
		var prefix = giftCardNumber.substr(0, 6);
		if (prefix != "603571") {
			bGiftcardNumberError = true;
		}
		if (bGiftcardNumberError == false){
			return true;
		}else {
			$(obj).data('errorMessage', message);
			return false;
		}
	},
	
	'gcSecCode' : function(obj, message) {
		var gcSecCode = $.trim($(obj).val());
		if(checkCountDigits(gcSecCode, 3)==false && checkCountDigits(gcSecCode, 4)==false){
			$(obj).data('errorMessage', message);
			return false;
		}else{
			return true;
		}
	},

	'ccMonth' : function(obj, message) {
		var current_date = new Date();
		var current_year = current_date.getFullYear();
		var current_month = current_date.getMonth() + 1;
		if($(obj).val() >= parseInt(current_month)) {
			return true;	
		} else {
			$(obj).data('errorMessage', message);
			return false;
		}
	}
}


/*********************************************
Plugin Code
Settings:
errorStyle: css object
validStyle: css object
errorHandler: function
arguments: object, settings
*********************************************/
jQuery.fn.FSvalidate = function(options) {
	var defaults = {
		submit : true,
		validateOnBlur : true,
		validateOnChange : true,
		validateOnKeyup : true,
		trimText : true,
		errorColor : '#993300',
		validColor : '#999999',
		validLabelColor: '#666666',
		offsetLeft: 60,
		errorStyle : {backgroundColor: '#fff5dc'},
		validStyle : {backgroundColor: '#ffffff'},
		overrideClassName : 'none',
		fadeTime : 175,
		ajaxSubmit : false,
		ajaxMethod : 'post',
		ajaxSuccess : function(obj, settings) {
		},
		
		ajaxError: function(obj, settings) {
		},
		
		errorHandler : function(obj, settings) {
			//console.log('errorhandler');
			//set error message
			$('#errorMessage #messageContent').html($(obj).data('errorMessage'));
			//hide tooltip	
			$('#errorMessage').hide();
			$(window).unbind('resize');
		},
		
		showValidation : function(obj, settings) {
			//remove all classes then add class if settings has override
			$('#errorMessage').removeClass();
			if( settings.overrideClassName != 'none' ) {
				$('#errorMessage').addClass(settings.overrideClassName);
			}
			
			//update error message
			$('#errorMessage #messageContent').html($(obj).data('errorMessage'));

			if (isMSIE) {
				var toolTipWidth = $('#errorMessage').width() -6;
				$('#errorMessage iframe').css('width', toolTipWidth+'px');
			}

			//reset size
			$("#errorMessage #messageContent").removeAttr("style").css('zIndex', '-3');	
			$('#errorMessage').css({'left': '0px'}).css({'top': '0px'}).css({'display': 'block'});						
			$('#errorMessage #messageContent').css('white-space', 'nowrap').css('zIndex', '1000');
			$('#errorMessage').css({'display': 'none'});

			//position element
			var offset = $(obj).offset();
			if ($(obj).data('offsetLeft')) {
				offset.left+=$(obj).data('offsetLeft');
			} else {
				offset.left+=settings.offsetLeft;
			}

			offset.top-=26;
			windowResize(obj);
			$('#errorMessage').css({'left': offset.left+'px'});
			$('#errorMessage').css({'top': offset.top+'px'});
			//display element
			//console.log('fading in');
			$('#errorMessage').fadeIn(settings.fadeTime);
		},
		
		validHandler : function(obj, settings) {
			//hide tooltip						
			$('#errorMessage').fadeOut(settings.fadeTime);
			//remove error class
			$(obj).removeClass('error');
			$(window).unbind('resize');
		},
		
		updateErrorMessage : function(obj, settings) {
			$('#errorMessage #messageContent').fadeOut(settings.fadeTime, function(){
				$(this).html($(obj).data('errorMessage'));

				//reset size
				var offset = $('#errorMessage').offset();				
				$("#errorMessage #messageContent").removeAttr("style").css('zIndex', '-3');	
				$('#errorMessage').css({'left': '0px'}).css({'top': '0px'}).css({'display': 'block'});
				$('#errorMessage #messageContent').css('white-space', 'nowrap').css('zIndex', '1000');
				$('#errorMessage').css({'left': offset.left+'px'}).css({'top': offset.top+'px'});

				if (isMSIE) {
					var toolTipWidth = $('#errorMessage').width() -6;
					$('#errorMessage iframe').css('width', toolTipWidth+'px');
				}
				$(this).fadeIn(settings.fadeTime);
			});					
		}			
	};	

		var settings = $.extend( defaults, options);
		if (isMSIE) {
			settings.fadeTime = 0;
		}

		return this.each(function() {
			var obj = this;

			/* Functions */
			var tagValidation = function(element) {
				// PreventDefault Added to stop multiple submissions of Validated forms
				// If causing problems email jcota@fossil.com
					$(element).find(':button').click(function(e){
						e.preventDefault();
						if(FormSubmitted === "" || typeof FormSubmitted == "undefined" || FormSubmitted === null){
							FormSubmitted = true;

							$(element).submit();
						}
					});
				// PreventDefault Added to stop multiple submissions of Validated forms
				// If causing problems email jcota@fossil.com
				
				
				$(element).find('.required, .email, .zip, .phone, .password').FSvalidate(settings);

				//required
				$(element).find('.required').addRule({'name':'required', 'message': errMapMsg_0});

				//minlength
				$(element).find('input').each(function() {
					if ($(this).attr('minLength') > 0) {
						$(this).addRule({'name':'minLength', 'message': 'Minimum length: '+$(this).attr('minLength'), 'options' : {'minLength' : $(this).attr('minLength') }});
					}
				});

				//first name
				$(element).find('.firstName.required').addRule({'name':'required', 'message': errMapMsg_7});			
				//last name
				$(element).find('.lastName.required').addRule({'name':'required', 'message': errMapMsg_8});
				//address
				$(element).find('.address1.required').addRule({'name':'required', 'message': errMapMsg_6});	
				//city
				$(element).find('.city.required').addRule({'name':'required', 'message': errMapMsg_10});
				//state
				$(element).find('.state.required').addRule({'name':'required', 'message': errMapMsg_11});
				//zip code
				$(element).find('.zip.required').addRule({'name':'required', 'message': errMapMsg_12});
				$(element).find('.zip').addRule({'name':'minLength', 'message': errMapMsg_12, 'options' : {'minLength' : 5}});
				$(element).find('.zip').addRule({'name':'zipNumber', 'message': errMapMsg_12});
				//email
				$(element).find('.email.required').addRule({'name':'required', 'message': errMapMsg_1});
				$(element).find('.email').addRule({'name':'email', 'message': errMapMsg_1});
				//phone
				$(element).find('.phone').addRule({'name':'phone', 'message': errMapMsg_13});
				//password
				$(element).find('.password.required').addRule({'name':'required', 'message': errMapMsg_4});	
				//$(element).find('.password').addRule({'name':'password', 'message': errMapMsg_4});
				$(element).find('.password').addRule({'name':'passwordChars', 'message': errorPasswordChars});
				$(element).find('.password').addRule({'name':'passwordFormat', 'message': errorPasswordFormat});

				//password
				$(element).find('.passwordConfirmation.required').addRule({'name':'required', 'message': errMapMsg_34});	
				$(element).find('.passwordConfirmation').addRule({'name':'password', 'message': errMapMsg_5});

			}

			var valid = function(element) {
				//if validation is enabled
				if($(element).data('hasValidation') == 'true'){
					//if has validation
					if($(element).data('rules') != null){
						var dataRulesArray = $(element).data('rules');
						//for each function in object rules
						for(i in dataRulesArray){					
							//if false					
							if(!window['$']['rules'][$(element).data('rules')[i].name](element, $(element).data('rules')[i].message, $(element).data('rules')[i].options)) return false;
						}
						return true;
					}else{
						return true;	
					}
				}else{
					return true;	
				}

			}

			var formValid = function() {
				$(obj).find('.validate').trigger('findErrors');
				if($(obj).find('.error').length > 0){
					$(obj).find('.error').trigger('showError');
					
					// Reset Form Submission Flag because of error
					FormSubmitted = '';
					
					//$(obj).find('.error').css(settings.errorStyle);
					return false;	
				}else{
					return true;
				}
				return false;
			}

			var validateElement = function() {
				if(valid(obj)){	
					if($(obj).hasClass('error')){					
						settings.validHandler(obj, settings);
					}
				}else{	
					//add class
					$(obj).addClass('error');
					settings.errorHandler(obj, settings);
				}
			}

			var findErrors = function() {
				if(!valid(obj)) $(obj).addClass('error');
			}		

			/* Main Code */		
			var nodeName = $(obj)[0].nodeName;

			//if form field
			//validate input
			if (nodeName == 'FORM') {			
				tagValidation(obj);
				//bind validate form
				$(obj).bind('formValid', function(){formValid()});
				//bind submit handler
				$(obj).submit(function(){
					if(formValid()){
						if($(obj).data('prepareSubmit') != undefined){
							$(obj).data('prepareSubmit')();
						}
						if(settings.trimText){
							$(obj).find('input').val(function(index, value) {
								if($(this).attr('type') == 'password'){
									return value;
								}
								return value.trim();						
							});

						}
						//remove special return characters from text areas
						//$(obj).find('textarea').val(escapeVal($(this).val(),' '));
						if(settings.ajaxSubmit){
							$.ajax({
								url: $(obj).attr('action'),
								type: settings.ajaxMethod,
								data: $(form).serialize(),
								dataType: 'text',
								cache:false,
								success: function(html){
									settings.ajaxError(obj, settings, html);
								},
								error: settings.ajaxError(obj, settings)
							});	
						}else if(settings.submit){
							obj.submit();
						}
						return false;
					}else{
						//console.log('scrolltop: ' + );
						//console.log('offset: ' + $(obj).find('.error:eq(0)').offset().top);
						var errorOffset = $(obj).find('.error:eq(0)').offset().top - 50;
						if($('html, body').scrollTop() > errorOffset){
							$('html, body').animate({
								scrollTop:errorOffset
							}, {
								complete: function() {
									$(obj).find('.error:eq(0)').focus();
								},
								duration: "slow"
							});
						}
						else{
							$(obj).find('.error:eq(0)').focus();
						}
						return false;					
					}
				});
			}

			//if input field
			if (nodeName == 'INPUT' || nodeName == 'TEXTAREA' || nodeName == 'SELECT' ) {

				//bind find errors event
				$(obj).bind('findErrors', function(){findErrors()});

				//bind show validate event
				$(obj).bind('showError', function(){settings.errorHandler(obj, settings);});

				//bind show tooltip event
				$(obj).bind('showValidation', function(){settings.showValidation(obj, settings);});

				//bind validate event (finds errors, shows validation)
				$(obj).bind('validate', function(){
					validateElement();
				});

				//create data object
				$.data(this, 'hasValidation', 'true');

				//add validate class
				$(obj).addClass('validate');

				//add tooltip element
				//$(obj).parent().append('<div class="errorMessage"><span></span></div>');
				//$(obj).parent().find('#errorMessage').wrap('<div class="errorWrapper" style="position: relative;" />');			

				//attach blur listener
				if (settings.validateOnBlur) {
					$(obj).blur(function(){
						validateElement();
					});
				}	
				
				//add change listener
				if (settings.validateOnChange) {
					$(obj).change(function(){
						if($(obj).hasClass('error')){
							if(valid($(obj))){
								settings.validHandler(obj, settings);
							}
						}
					});
				}
				
				//add keyup listener
				if (settings.validateOnKeyup) {
					$(obj).keyup(function(){
						if ($(obj).hasClass('error')) {
							if (valid($(obj))) {
								settings.validHandler(obj, settings);
							} else if($(obj).data('errorMessage') != $('#messageContent').html()) {
								settings.updateErrorMessage(obj, settings);
							}
						}
					});	
				}
				
				//disable enter key submit
				$(obj).keypress(function(event) {
					if (event.keyCode == '13') {
						return false;
					} else {
						return true;	
					}
				});

				//add focus listener	
				$(obj).focus(function(){
					if($(obj).hasClass('error')){
						//show tooltip						
						//$(obj).parent().find('.errorWrapper').fadeIn(settings.fadeTime);
						//$('#errorMessage').fadeIn(settings.fadeTime);
						settings.showValidation(obj, settings);
					}
				});
			}
			
		});
	};

/*********************************************
'Add Rule' plugin adds a rule to an element.
Arguments (single object):
'rule' : name,
'message' : custom message,
'options' : rule-specific criteria(object)
*********************************************/
jQuery.fn.addRule = function(options) {
	var obj = this;
	var defaults = {};	
	var settings = $.extend({}, defaults, options);
	return this.each(function(){
		var dataRulesArray = [];
		//if has rules
		if($(this).data('rules')){
			//create rules object
			dataRulesArray = $(this).data('rules');		
		}
		var hasRule = false;
		var i = 0;
		while(!hasRule && i < dataRulesArray.length){
			if(dataRulesArray[i].name == settings.name) hasRule = true;	
			if(!hasRule) i++;
		}
		//if has same rule
		if(hasRule){
			//replace object
			dataRulesArray[i] = settings;
		}else{
			//add to data
			dataRulesArray.push(settings);	
		}
		//rewrite rules object
		$(this).data('rules', dataRulesArray);
	});
};

jQuery.fn.validate = function(options) {
	var obj = this;
	var defaults = {};	
	var settings = $.extend({}, defaults, options);
	$(obj).trigger('validate');
	if($(obj).find('.error').length == 0){
		return true;
	}else{
		return false;
	}
};

jQuery.fn.valid = function(options) {
	var obj = this;
	var defaults = {};	
	var settings = $.extend({}, defaults, options);
	$(obj).trigger('formValid');
	if($(obj).find('.error').length == 0){
		//console.log('valid');
		return true;
	}else{
		//console.log('not valid');
		return false;
	}
};

jQuery.fn.disableValidation = function(options) {
	var obj = this;
	var defaults = {};	
	var settings = $.extend({}, defaults, options);
	return this.each(function(){
		$.data(this, 'hasValidation', 'false');
		$(obj).trigger('validate');
	});
};

jQuery.fn.enableValidation = function(options) {
	var obj = this;
	var defaults = {};	
	var settings = $.extend({}, defaults, options);
	return this.each(function(){		
		$.data(this, 'hasValidation', 'true');
	});
};

jQuery.fn.validationOffsetLeft = function(offset) {
	var obj = this;
	var defaults = {};	
	var settings = $.extend({}, defaults, offset);
	return this.each(function(){		
		$.data(this, 'offsetLeft', offset);
	});
};

//window resize stuff
var windowResize = function(obj){			
	var newLeft = $(obj).offset().left;
	$(window).bind('resize', function() {
		if($(obj).data('offsetLeft')){
			newLeft+=$(obj).data('offsetLeft');
		}else{
			newLeft+=settings.offsetLeft;
		}
		$('#errorMessage').css('left', newLeft+'px');
	});
}

//trim function
String.prototype.trim = function () {
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

//encodes special return characters in text areas.
function escapeVal(text,replaceWith){ 

	text = escape(text) //encode textarea string's carriage returns

	for (i=0; i<text.length; i++) { 
		//loop through string, replacing carriage return encoding with HTML break tag
		if (text.indexOf("%0D%0A") > -1) { 
			//Windows encodes returns as \r\n hex
			text = text.replace("%0D%0A", replaceWith)
		} 
		else if (text.indexOf("%0A") > -1) { 
			//Unix encodes returns as \n hex
			text = text.replace("%0A", replaceWith)
		}
		else if (text.indexOf("%0D") > -1) { 
			//Macintosh encodes returns as \r hex
			text = text.replace("%0D", replaceWith)
		}
	}
	text=unescape(text); //unescape all other encoded characters
	return text;
}

var errorGiftCardValue = "Please select a gift card denomination";
var errorNewPassword = 'An error occurred because the new password and password confirmation does not match; please re-submit a matching password in both fields.';
var errorPasswordChars = 'A character in your password occurs more consecutively than the allowed limit of 3. Please re-enter your password.';
var errorPasswordFormat = 'Passwords need to be at least 6 characters long and include both a number and letter to be valid. Please try again.';
var errorMessageFormat = 'Please limit your message to 150 characters';
var errorGiftCardMessageFormat = 'Please limit your message to 500 characters';
var errMapMsg_0 = 'This field is required.';
var errMapMsg_1 = 'Please enter a valid email address';
var errMapMsg_2 = 'This field is required';
var errMapMsg_3 = 'Email Not Found';
var errMapMsg_4 = 'Please enter a valid password';
var errMapMsg_5 = 'Passwords entered do not match';
var errMapMsg_6 = 'Please enter valid address';
var errMapMsg_7 = 'Please enter your first name.';
var errMapMsg_8 = 'Please enter your last name.';
var errMapMsg_9 = 'Please enter your address.';
var errMapMsg_10 = 'Please enter your city.';
var errMapMsg_11 = 'Please choose a state.';
var errMapMsg_12 = 'Please enter a valid zip code.';
var errMapMsg_13 = 'Please enter a valid phone number.';
var errMapMsg_14 = 'Please enter a valid email address.';
var errMapMsg_15 = 'Please enter a valid phone number (xxx-xxx-xxxx).';
var errMapMsg_16 = 'Please choose a state.';
var errMapMsg_17 = 'The gift card number provided is not valid, please check the number and try again.';
var errMapMsg_18 = 'The security code provided is not valid, please check the number and try again.';
var errMapMsg_19 = 'Please enter a valid credit card number.';
var errMapMsg_20 = 'Please enter a credit card security code.';
var errMapMsg_21 = 'Please select a valid credit card expiration month.';
var errMapMsg_22 = 'Please select a valid credit card expiration year.';
var errMapMsg_23 = 'Please select a valid credit card expiration date.';
var errMapMsg_24 = 'Please select a credit card type.';
var errMapMsg_25 = 'Please select a valid credit card number.';
var errMapMsg_26 = 'Please enter a credit card security code.';
var errMapMsg_28 = 'Please enter a search term or item number.';
var errMapMsg_29 = 'Please enter at least three characters.';
var errMapMsg_30 = 'Please enter a valid email address.';
var errMapMsg_31 = 'Please enter your first name.';
var errMapMsg_32 = 'Please enter your last name.';
var errMapMsg_33 = 'Please enter a valid password.';
var errMapMsg_34 = 'Please enter a valid password confirmation.';
var errMapMsg_37 = 'Please enter an email address.';
var errMapMsg_38 = 'Please enter a valid password confirmation.';
var errMapMsg_39 = 'Please enter a valid city and state OR zip code.';
var errMapMsg_40 = 'Please enter an email address'; /* FSEmailAFriend empty email */
var errMapMsg_41 = 'Please enter a valid email address'; /* FSEmailAFriend valid email */
var errMapMsg_43 = 'Please enter a valid email';
var errMapMsg_47 = 'Please enter your month of birth';
var errMapMsg_48 = 'Please enter your date of birth';
var errMapMsg_49 = 'Please enter your year of birth';
var errMapMsg_50 = 'Please enter the last 4 digits of your Social Security Code';
var errMapMsg_51 = 'We cannot complete your transaction until you agree to the electronic presentation of the Bill Me Later Terms and Conditions';














