jQuery(document).ready(function ($) {

	var forms = {
		'contact': {
			'name': {
				'rule': 'non-empty',
				'message': 'This field is required.'
			},
			'email': {
				'rule': 'email',
				'message': 'Please enter a valid email address.'
			},
			'comment': {
				'rule': 'non-empty',
				'message': 'Your comment cannot be empty.'
			}
		}
	};

    (function handleForms(forms) {
        var that = this;
        
        var rules = {
            'non-empty': function (fieldValue) { 
                if(fieldValue.length > 0) {
                    return true;
                }
                return false;   
            },
            'num': function (fieldValue) {
                var re = /^\d+$/;
                if (re.test(fieldValue)) {
                    return true;
                }
                return false;
            },
			'email': function (v) {
				var re = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
				return ((v.length > 0 && re.test(v)) ? true : false); 
			}
        };
        
        function clearError(fieldObj) {
        	fieldObj.removeClass('err');
        	$('label[for="'+fieldObj.attr('name')+'"] span.msg').empty();
        }
        
        function clearErrors(formObj) {
        	formObj.find(':input').each(function (i, input) {
        		clearError($(input));
        	});	
        }
        
        function putError(fieldObj, msg) {
        	if (!(fieldObj.hasClass('err'))) {
	            fieldObj.addClass('err');
	            if (typeof msg !== 'undefined') {
					$('label[for="'+fieldObj.attr('name')+'"]').append('<span class="msg">'+msg+"</span>");            
	            }        	
        	}
        }
                
        function validateField(field, rule) {
            return rules[rule](field.value);
        }
        
      	function validateForm(formObj) {
            var fields, errors;
            fields = formObj.serializeArray();
            errors = {};
            if (forms[formObj.attr('name')] !== undefined) {
                $.each(fields, function (i, field) {
                    if (forms[formObj.attr('name')][field.name] !== undefined) {
                        if (!validateField(field, forms[formObj.attr('name')][field.name]['rule'])) {
                            errors[i] = {
                                'field': field.name,
                                'message': (typeof forms[formObj.attr('name')][field.name]['message'] !== undefined)
                                	? forms[formObj.attr('name')][field.name]['message']
                                	: null
                            }
                        }
                    }
                });
            }
            return errors;
        }
        
        function submitForm(formObj) {
        	var errors, i, fieldObj;
        	clearErrors(formObj);
        	errors = validateForm(formObj);
        	if (!$.isEmptyObject(errors)) {
        		for (i in errors) {
        			fieldObj = formObj.find(':input[name="' + errors[i].field + '"]');
					putError(fieldObj, errors[i].message);
        		}
        		return false;
        	}
        	return true;
        }

		function clearForm(formObj) {
			fields = formObj.find(':input:not(input[type=hidden], input[type=submit], input[type=button])');
			fields.each(function (i, f) {
				$(f).attr('value', '');
			});
		}
        
        for (var f in forms) {
            $('form[name="' + f + '"]').submit(function (e) {
                e.preventDefault();
				$that = $(this);
                var action = $(this).attr('action');
                $('#message').empty();
                if (submitForm($(this))) {
                	$.post(action, $(this).serialize(), function (data) {
                		var data = $.parseJSON(data);
						$('#message').html(data.message);
						clearForm($that);
                	});
                };
            });
        }
        
        $('.err').live('click', function () {
            clearError($(this));
        });

    }(forms));

	var productImages = (function () {
		var imgRoot = '/img/items/';
		return {
			getFromIconPath: function (iconPath) {
				var imgName = iconPath.match(/([^\/\.]+)\..*$/)[1];
				return {
					color: imgName.match(/\-([^\-]+)$/)[1],
					display: [
						imgRoot + imgName + '-front.jpg', 
						imgRoot + imgName + '-back.jpg'
					],
					large: [
						imgRoot + 'large/' + imgName + '-front.jpg',
						imgRoot + 'large/' + imgName + '-back.jpg'
					]
				};
			},
			putWithInfo: function (imgInfo) {
				$('#product-images a').each(function (i, anchor) {
					$(anchor).attr('href', imgInfo.large[i]);
					$(anchor).find('img').hide().attr('src', imgInfo.display[i]).fadeIn(500);
				});
			}
		};
	}());
		
	$('area').click(function (e) {
		var href;
		e.preventDefault();
		href = $(this).attr('href');
		$('#storefinder-data').fadeOut('slow', function () {
			$(this).load(href, function () {
				$(this).fadeIn('fast');
			});
		});
	});
	
	$('#product-icons a').click(function (e) {
		var iconPath, imgInfo;
		e.preventDefault();
		iconPath = $(this).attr('href');
		imgInfo = productImages.getFromIconPath(iconPath);
		productImages.putWithInfo(imgInfo);
		$('select[name="Product_Attributes\[1\]:value"] option').each(function (i, option) {
			var v, colorRe;
			v = $(option).attr('value');
			colorRe = new RegExp('^' + imgInfo.color);
			if (v.toLowerCase().match(colorRe)) {
				$(option).attr('selected', 'selected');
			}
		});
	});
	
	$('select[name="Product_Attributes\[1\]:value"]').change(function (e) {
		var color, iconRe, imgInfo;
		e.preventDefault();
		color = $(this).val().match(/^([A-Z][a-z]+)/)[1].toLowerCase();
		iconRe = new RegExp(color + '\..*$');
		$('#product-icons a').each(function (i, anchor) {
			var href = $(anchor).attr('href');
			if (href.match(iconRe)) {
				imgInfo = productImages.getFromIconPath(href);
				productImages.putWithInfo(imgInfo);
			}
		});
	});
	
	$('#product-images a.image').colorbox();
	
	$('a[rel="details"]').colorbox();
	
	$('#sizing-chart').colorbox({
		href: '/includes/templates/ajax/sizing.html',
		width: "907px"
	});
	
	$('#product-youtube').click(function (e) {
		e.preventDefault();
		var url = $(this).attr('href');
		$.colorbox({
			height: 385,
			width: 640,
			html: "<iframe type=\"text/html\" width=\"640\" height=\"385\" frameborder=\"0\" src=\"" + url + "\"></iframe>",
			scrolling: false
		});
	});
});

