/*
	Site:		Wonderbra
	File:		/assets/scripts/global.js
	Author:		Andrew Disley, Simplified http://simplified.co.uk/ & Nick Harris, Pixel Envy http://pixelenvy.co.uk/
	Version:	2010-06-27
----------------------------------------------- */

/*	Global Configuration
----------------------------------------------- */
// jQuery.noConflict();
var $j = jQuery;
var isIE = false;
var isIE6 = false;
var isSafari = false;

// Set up google ajax search
var localSearch = new GlocalSearch();

/*	Global Literal Object: Site-wide functions
----------------------------------------------- */
var Global = {

	/* Configuration, Flags and Messages */

	/* jQuery Object References  */
	jEOBody: null,
	jEOPrintPage: null,
	jEOPrintPageLoc: null,
	jEONavigationPrimary: null,
	jOEModalPreloader: null,

	/* Utility: Browser Tests / Specific Fixes/Hooks */
	utilBrowserTests : function() {

		if ($j.browser.msie) { isIE = true; }

		/* Detect if User Agent is IE6 using object detection, apply fix for background flicker bug */
		if (typeof document.body.style.maxHeight == 'undefined') { isIE6 = true; try { document.execCommand('BackgroundImageCache', false, true); } catch(e) { } }

		/* Detect if User Agent is Safari, add class '.safari' to div#Container */
		if ($j.browser.safari) { isSafari = true; $j('div#Container').addClass('safari'); }

	},

	/* Utility: Print Page */
	utilPrintPage : function() {

		var cc = this;

		cc.jEOPrintPage = $j('<li><a href="#PrintPage" title="Print this page">Print Page</a></li>');
/*		cc.jEOPrintPageLoc = $j('#Footer ul li.first');*/

		/* Insert cc.jEOPrintPage to cc.jEOPrintPageLoc */
		cc.jEOPrintPageLoc.before(cc.jEOPrintPage);
		$j('a', cc.jEOPrintPage).click(function() {
			window.print();
			return false;
		});

	},

	/* NavPrimary Events: Workaround for li:hover IE */
	eventsNavigationPrimary : function() {

		var cc = this;

		$j('li', cc.jEONavigationPrimary).hover(function() {
			$j(this).addClass('hover');
		}, function() {
			$j(this).removeClass('hover');
		});

	},

	tracking : function(){
		// Class Context
		var cc = this;

		$j('#Navigation li#N6 a').click(function(){
			_gaq.push(['_trackEvent', 'Buy Now','Click','Main Navigation']);
		});

		if (cc.jEOBody.hasClass('search-results')) {

			var eventLabel = $j('h1 strong').text();
			_gaq.push(['_trackEvent', 'Search','Results',eventLabel]);

		} else if (cc.jEOBody.hasClass('search-results')) {

			var eventLabel = $j('#Content p strong').text();
			_gaq.push(['_trackEvent', 'Search','No Results',eventLabel]);

		} else if (cc.jEOBody.hasClass('collections-product')) {

			$j('.c-product-details .action a').click(function(){
				var eventLabel = $j('h1').text();
				_gaq.push(['_trackEvent', 'Buy Now','Click',eventLabel]);
			});

		}
	},

	/* Initialise */ 
	init : function() {

		/* Class Context */
		var cc = this;

		/* ADD class to body so we can apply CSS only for when jQuery is available, different to hasJS */
		cc.jEOBody = $j('body');
		cc.jEOBody.addClass('hasJQ');

		cc.utilBrowserTests();

		cc.jEONavigationPrimary = $j('#Navigation');
		if (cc.jEONavigationPrimary.length) {
			cc.eventsNavigationPrimary();
		}

		// Track external links
		cc.tracking();

		/* If print support is available, initialise utilPrintPage */
		if (window.print && cc.jEOPrintPageLoc) { cc.utilPrintPage(); }

		if($j.browser.opera && $j.browser.version < 10){
			$j('html').css('overflow', 'hidden');
			$j('body').css('overflow', 'scroll');
		}
	}

};

/*	Blank Inputs (and refill on blur)
----------------------------------------------- */
var InputBlanking = {
	// jQuery Object References
	jOETextInputs: null,

	StoreDefaults : function(){
		// Class Context
		var cc = this;

		cc.jOETextInputs.each(function(){
			var jThis = $j(this);
			var DefaultString = jThis.val();

			// Check if input already has a stored value
			if(!jThis.data('DefaultString')){
				// Check if the value is empty
				if(!DefaultString){
					jThis.data('DefaultString', 'EmptyString');
				} else {
					jThis.data('DefaultString', DefaultString);
				}
			}
		});
	},

	PrepareClearing : function(){
		// Class Context
		var cc = this;

		cc.jOETextInputs.focus(function(){
			var jThis = $j(this);
			if (jThis.val() == jThis.data('DefaultString')){
				jThis.val('');
			}
		});
	},

	PrepareReFill : function(){
		// Class Context
		var cc = this;

		cc.jOETextInputs.blur(function(){
			var jThis = $j(this);
			if(!jThis.val() && jThis.data('DefaultString') != 'EmptyString'){
				jThis.val(jThis.data('DefaultString'));
			}
		});
	},

	init : function() {
		// Class Context
		var cc = this;

		// jQuery Object References
		cc.jOETextInputs = $j('input[type="text"]');

		// Functions to fire
		cc.StoreDefaults();
		cc.PrepareClearing();
		cc.PrepareReFill();
	}
};

/*	Make sign up form work via Ajax
----------------------------------------------- */
var AjaxSignUp = {

	init : function() {

		$j('#NewsletterModalForm #SignupSubmit').click(function(){

			var formAction = $j("#NewsletterModalForm").attr("action");
			var str = $j("#NewsletterModalForm").serialize();
			// CDATA is used to avoid validation errors
			// <![CDATA[
			var serialized = str + "&action=" + formAction;
			// ]]>

			if($j("#NewsletterModalForm").valid()){
				$j.ajax({
					url: "assets/scripts/proxy.php",
					type: "POST",
					data: serialized,
					success: function(data){
						// Server-side validation
						if (data.search(/invalid/i) != -1) {
							alert('The email address you supplied is invalid and needs to be fixed before you can subscribe to this list.');
						} else {
							var html = '<div id="SignUpAjaxConfirm"><h1>Thanks for signing up to our email newsletters! We’ll be in touch soon.<br /><br />Thanks <br /><br /> The girls at Wonderbra</h1></div>\n';
							$j("#NewsletterModalForm").hide().after(html);
							$j("#SignUpAjaxConfirm").focus(); // For screen reader accessibility
							// Fire off Google Analytics fake pageview
							//var pageTracker = _gat._getTracker("UA-XXXXX-X");
							//pageTracker._trackPageview("/newsletter_signup");
						}
					}
				});
				return false;
			}

		});
	}
};


/*	Store Locator Map
----------------------------------------------- */
var StoreLocator = {

	// Configuration
	gMap: null,
	cDefaultPoint: null,
	cDefaultLat: null,
	cDefaultLong: null,
	cPathToKML: null,
	cDefaultZoom: null,
	cZoomedIn: null,
	cDefaultPostcodeString: null,

	// jQuery Object References
	jOEMapContainer: null,
	jOEFooterPostcode: null,
	jOEHomeStoreLocatorForm: null,
	jOEModalStoreLocatorForm: null,
	jOEModalPostcode: null,

	buildMap : function(){

		var cc = this;

		// Create google map if browser can handle it
		if (GBrowserIsCompatible()) {
			// Configuration
			cc.gMap = new GMap2(document.getElementById('GoogleMap'));
			cc.cDefaultPoint = new GLatLng(cc.cDefaultLat,cc.cDefaultLong);

			// Get store positions from KML
			var kml = new GGeoXml(cc.cPathToKML);
			cc.gMap.addOverlay(kml);

			// Add Contols
			cc.gMap.addControl(new GLargeMapControl3D());
			// Center map to default point
			cc.gMap.setCenter(cc.cDefaultPoint, cc.cDefaultZoom);

			// Check for footer control
			if ($j('#StoreLocatorPostcode').length) {
				cc.jOEFooterPostcode = $j('#StoreLocatorPostcode');
				cc.cDefaultPostcodeString = cc.jOEFooterPostcode.data('DefaultString');
				// Check if user has entered postcode into footer
				if (cc.jOEFooterPostcode.val() != cc.cDefaultPostcodeString) {
					// Center map to user's position
					cc.PointFromPostcode(cc.jOEFooterPostcode.val());
				}
			}

		}
	},

	buildForm : function(){

		var cc = this;

		if (cc.jOEFooterPostcode){
			var postcode = cc.jOEFooterPostcode.val();
		} else {
			var postcode = 'Postcode';
		}

		var html = '<div id="ModalStoreLocatorForm">\n';
		html += '	<form action="#" method="post">\n';
		html += '		<div class="form-row form-row-text">\n';
		html += '			<label class="form-row-label s-h-o" for="ModalStoreLocatorPostcode">Enter your postcode here</label>\n';
		html += '			<span class="form-row-field"><input id="ModalStoreLocatorPostcode" name="StoreLocatorPostcode" type="text" value="' + postcode + '"></span>\n';
		html += '		</div>\n';
		html += '		<div class="form-row form-row-action">\n';
		html += '			<span class="form-row-action-forward"><input class="modal-storelocator" id="StoreLocatorSubmit" name="StoreLocatorSubmit" type="submit" value="Go"></span>\n';
		html += '		</div>\n';
		html += '	</form>\n';
		html += '</div>\n';

		cc.jOEMapContainer.before(html);
		cc.jOEModalStoreLocatorForm = $j('#ModalStoreLocatorForm form');
		cc.jOEModalPostcode = $j('#ModalStoreLocatorPostcode', cc.jOEModalStoreLocatorForm);

		/* Bind action to new form */
		cc.jOEModalStoreLocatorForm.submit(function(){
			cc.PointFromPostcode(cc.jOEModalPostcode.val());
			if(cc.jOEFooterPostcode){
				cc.jOEFooterPostcode.val(cc.jOEModalPostcode.val());
			}
			return false;
		});
	},

	PointFromPostcode : function(postcode){

		var cc = this;

		// Ajax call to Google local search
		localSearch.setSearchCompleteCallback(null, function() {
			if (localSearch.results[0]) {
				var resultLat = localSearch.results[0].lat;
				var resultLng = localSearch.results[0].lng;
				var point = new GLatLng(resultLat,resultLng);
				cc.gMap.setCenter(point, cc.cZoomedIn);
			} else {
				alert("Location not found!");
			}
		});
		localSearch.execute(postcode);
	},

	init : function() {

		var cc = this;

		// Configuration
		cc.cPathToKML = 'http://www.wonderbra.co.uk/stores.kml';

		cc.cDefaultLat = 54.0594;
		cc.cDefaultLong = -2.2852;
		cc.cDefaultZoom = 7;
		cc.cZoomedIn = 12;

		// jQuery Object References
		cc.jOEHomeStoreLocatorForm = $j('#HomeStoreLocatorForm');
		cc.jOEMapContainer = $j('#StoreLocator #GoogleMap');

		// Check if this is the first time the popup is opened (map hasn't been loaded)
		if (!cc.gMap){
			cc.buildMap();
			cc.buildForm();
			// Loop through inputs again, AFTER building the new form
			InputBlanking.init();
		} else {
			// Check for footer postcode field
			if (cc.jOEFooterPostcode){
				// Check if user has entered postcode into footer
				if (cc.jOEFooterPostcode.val() != cc.cDefaultPostcodeString) {
					var postcode = cc.jOEFooterPostcode.val();
					// Synchronise postcode inputs
					cc.jOEModalPostcode.val(postcode);
					// Zoom Map
					cc.PointFromPostcode(postcode);
				}
			}
		}
		
	}
};

/*	Modals (uses jquery.tools.overlay)
----------------------------------------------- */
var Modals = {

	/* Configuration */
	cModalExpose: null,

	/* jQuery Object References to the Elements this speeds up the DOM */
	jOEWindow: null,
	jOEModalTwitter: null,
	jOEModalTwitterCTA: null,
	jOEModalTwitterModal: null,
	jOEModalSignup: null,
	jOEModalSignupCTA: null,
	jOEModalSignupModal: null,
	jOEModalDiary: null,
	jOEModalDiaryCTA: null,
	jOEModalDiaryModal: null,
	jOEModalContactUs: null,
	jOEModalContactUsCTA: null,
	jOEModalContactUsModal: null,
	jOEModalStoreLocator: null,
	jOEModalStoreLocatorCTA: null,
	jOEModalStoreLocatorModal: null,

	smartScroll : function(target){
		// Class Context
		var cc = this;

		var startPosition = jOEWindow.scrollTop();
		jOEWindow.scroll(function(){
			if (jOEWindow.scrollTop() < startPosition){
				target.css('top', jOEWindow.scrollTop());
				startPosition = jOEWindow.scrollTop();
			}
		});
	},

	modalTwitter : function() {

		var cc = this;

		cc.jOEModalTwitterModal = cc.jOEModalTwitter.overlay({
			top: -600,
			effect: 'drop',
			mask: cc.cModalExpose,
			onLoad: function(){
				window.location.href = "#Twitter";
				cc.jOEModalTwitterCTA.addClass('active');
			},
			onClose: function() {
				cc.jOEModalTwitterCTA.removeClass('active');
			},
			api: true
		});

		cc.jOEModalTwitterCTA.click(function() {
			cc.jOEModalTwitterModal.load();
			return false;
		});

	},

	modalSignup : function() {

		var cc = this;

		cc.jOEModalSignupModal = cc.jOEModalSignup.overlay({
			top: -600,
			effect: 'drop',
			mask: cc.cModalExpose,
			onLoad: function(){
				cc.smartScroll(cc.jOEModalSignup);
				window.location.href = "#Signup";
				if($j('#NewsletterEmail').val() != $j('#NewsletterEmail').data('DefaultString')){
					$j('#cm-urjujt-urjujt').val($j('#NewsletterEmail').val());
				}
				$j('#name').focus();
				AjaxSignUp.init();
				cc.jOEModalSignupCTA.addClass('active');
			},
			onClose: function() {
				$j('label.error').hide();
				cc.jOEModalSignupCTA.removeClass('active');
				window.location.hash = 'nogo';
				jOEWindow.unbind('scroll');
			},
			api: true
		});

		cc.jOEModalSignupCTA.click(function() {
			cc.jOEModalSignupModal.load();
			return false;
		});

	},

	modalDiary : function() {

		var cc = this;

		cc.jOEModalDiaryModal = cc.jOEModalDiary.overlay({
			mask: cc.cModalExpose,
			onLoad: function() {
				overlay = this.getOverlay();
				var cssTop = $j(window).scrollTop() + 40;
				overlay.css({
					top: cssTop,
					position: 'absolute'
				});
				window.location.href = "#Diary";
				cc.jOEModalDiaryCTA.addClass('active');
			},
			onClose: function() {
				cc.jOEModalDiaryCTA.removeClass('active');
			},
			preload: false,
			api: true
		});

		cc.jOEModalDiaryCTA.click(function() {
			cc.jOEModalDiaryModal.load();
			return false;
		});

	},

	modalContactUs : function() {

		var cc = this;

		cc.jOEModalContactUsModal = cc.jOEModalContactUs.overlay({
			top: -600,
			effect: 'drop',
			mask: cc.cModalExpose,
			onLoad: function(){
				cc.smartScroll(cc.jOEModalContactUs);
				window.location.href = "#ContactUs";
				cc.jOEModalContactUsCTA.addClass('active');
			},
			onClose: function() {
				$j('label.error').hide();
				cc.jOEModalContactUsCTA.removeClass('active');
				window.location.hash = 'nogo';
				jOEWindow.unbind('scroll');
			},
			api: true
		});

		cc.jOEModalContactUsCTA.click(function() {
			cc.jOEModalContactUsModal.load();
			return false;
		});

	},

	modalStoreLocator : function() {

		var cc = this;

		cc.jOEModalStoreLocatorModal = cc.jOEModalStoreLocator.overlay({
			top: -600,
			effect: 'drop',
			mask: cc.cModalExpose,
			onLoad: function(){
				cc.smartScroll(cc.jOEModalStoreLocator);
				cc.jOEModalStoreLocatorCTA.addClass('active');
				// Activate Google Map
				StoreLocator.init();
			},
			onClose: function() {
				$j('label.error').hide();
				cc.jOEModalStoreLocatorCTA.removeClass('active');
				jOEWindow.unbind('scroll');
			},
			api: true
		});

		cc.jOEModalStoreLocatorCTA.click(function() {
			cc.jOEModalStoreLocatorModal.load();
			return false;
		});

	},

	/* Initialise */
	init : function() {

		var cc = this;

		/* Configuration */
		if (isIE6) {
			cc.cModalExpose = null;
		} else if ($j.browser.mozilla && (parseFloat($.browser.version) < 1.9)) {
			cc.cModalExpose = null;
		} else {
			cc.cModalExpose = '#504B46';
		}

		/* jQuery Object References to the Elements this speeds up the DOM */
		jOEWindow = $j(window);
		cc.jOEModalTwitter = $j('#Twitter');
		cc.jOEModalTwitterCTA = $j('.modal-twitter');
		cc.jOEModalSignup = $j('#Signup');
		cc.jOEModalSignupCTA = $j('.modal-signup');
		cc.jOEModalDiary = $j('#Diary');
		cc.jOEModalDiaryCTA = $j('.modal-diary');
		cc.jOEModalContactUs = $j('#ContactUs');
		cc.jOEModalContactUsCTA = $j('.modal-contactus');
		cc.jOEModalStoreLocator = $j('#StoreLocator');
		cc.jOEModalStoreLocatorCTA = $j('.modal-storelocator');

		$j.easing.drop = function (x, t, b, c, d) {
			return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
		};

		$j.tools.overlay.addEffect("drop", function(css, done) {

			// use Overlay API to gain access to crucial elements
			// var conf = this.getConf(),
			overlay = this.getOverlay();

			// determine initial position for the overlay
/*
			if (conf.fixed) {
				css.position = 'fixed';
			} else {
				css.top += $j(window).scrollTop();
				css.left += $j(window).scrollLeft();
				css.position = 'absolute';
			}
*/
			css.top += $j(window).scrollTop();
			css.left += $j(window).scrollLeft();
			css.position = 'absolute';

			// position the overlay and show it
			overlay.css(css).show();

			if (isIE6) {
				$j('.c-modals').css('opacity','.01');
			} else if ($j.browser.mozilla && (parseFloat($.browser.version) < 1.9)) {
				$j('.c-modals').css('opacity','.01');
			}

			// begin animating with our custom easing
			overlay.animate({ top: '+=600', width: '+=0'}, 400, 'drop', done);

			/* closing animation */
			}, function(done) {
				this.getOverlay().animate({top:'-=600', width:'-=0'}, 300, 'drop', function() {
					$j(this).hide();
					done.call();
				});

				if (isIE6) {
					$j('.c-modals').css('opacity','1');
				} else if ($j.browser.mozilla && (parseFloat($.browser.version) < 1.9)) {
					$j('.c-modals').css('opacity','1');
				}
			}
		);

		if (cc.jOEModalTwitter.length) {
			cc.modalTwitter();
		}

		if (cc.jOEModalSignup.length) {
			cc.modalSignup();
		}

		if (cc.jOEModalDiary.length) {
			cc.modalDiary();
		}

		if (cc.jOEModalContactUs.length) {
			cc.modalContactUs();
		}

		if (cc.jOEModalStoreLocator.length) {
			cc.modalStoreLocator();
		}

		if (location.href.indexOf('#Signup') != -1){
			cc.jOEModalSignupModal.load();
		}

		if (location.href.indexOf('#ContactUs') != -1){
			cc.jOEModalContactUsModal.load();
		}

	}

};

/*	Home Carousel
----------------------------------------------- */
var HomeCarousel = {

	/* Configuration, Flags and Messages */
	cHomeCarousel: null,

	/* jQuery Object References  */
	jEOHomeCarousel: null,
	jEOHomeCarouselNav: null,
	jEOHomeCarouselNext: null,
	jEOHomeCarouselPrev: null,

	buildCarousel : function() {

		var cc = this;

		cc.jEOHomeCarousel.cycle({
			fx: 'fade',
			timeout: 12000,
			pager: '#HomeCarouselNav'
		});

		cc.jEOHomeCarouselPrev.click(function() {
			cc.jEOHomeCarousel.cycle('prev');
		});

		cc.jEOHomeCarouselNext.click(function() {
			cc.jEOHomeCarousel.cycle('next');
		});

	},

	init : function() {

		var cc = this;

		cc.jEOHomeCarousel = $j("#HomeCarouselItems");

		if (cc.jEOHomeCarousel.length) {
			cc.jEOHomeCarouselNav = $j("#HomeCarouselNav");
			cc.jEOHomeCarouselNext = $j("#HomeCarouselNext");
			cc.jEOHomeCarouselPrev = $j("#HomeCarouselPrev");
			cc.buildCarousel();
		}

	}

};

/*	Products
----------------------------------------------- */
var Products = {

	/* Configuration, Flags and Messages */
	cHomeCarousel: null,

	/* jQuery Object References  */
	jEOProductsList: null,
	jEOProductsListItem: null,
	jEOProductsNextButton: null,
	jEOProductsPrevButton: null,
	jEOProducts: null,
	jEOProductImageLarge: null,
	jEOProductImageThumbs: null,
	jEOPreviousImageArrow: null,
	jEONextImageArrow: null,

	buildTooltips : function() {

		var cc = this;

		cc.jEOProducts.each(function(){
			var $self = $j(this);

			var targetClass = $self.attr('class').split(' ')[1];
			var target = $j('#jsProducts .c-f .' + targetClass);
			$self.tooltip({
				position: "top center",
				offset: [-30, 20],
				relative: true,
				tip: target
			});
		});

	},

	buildImages : function() {

		var cc = this;

		$j("a", cc.jEOProductImageThumbs).click(function() {
			var jThis = $j(this);
			$j("a.active", cc.jEOProductImageThumbs).removeClass('active');
			cc.jEOProductImageLarge.attr('src', jThis.attr('href'));
			jThis.addClass('active');
			return false;
		});

	},

	buildNextPrevious : function(){
		// Class Context
		var cc = this;

		var html = '<p class="c c-product-pagnination">\n';
		html += '	<a class="s-ir c-product-pagnination-prev" href="#" id="PreviousImage">Previous Image<span class="s-ir-i"></span><span class="tooltip"></span></a>\n';
		html += '	<span class="s-h-o"> | </span>\n';
		html += '	<a class="s-ir c-product-pagnination-next" href="#" id="NextImage">Next Image<span class="s-ir-i"></span><span class="tooltip"></span></a>\n';
		html += '</p>\n';

		$j('.col-1').append(html);
		cc.jEOPreviousImageArrow = $j('#PreviousImage');
		cc.jEONextImageArrow = $j('#NextImage');

		cc.jEOPreviousImageArrow.click(function(){
			var activeLI = $j("a.active", cc.jEOProductImageThumbs).parent('li');
			var newImageAnchor;
			if (activeLI.prev('li').length){
				newImageAnchor = activeLI.prev('li').find('a');
			} else {
				newImageAnchor = cc.jEOProductImageThumbs.find('li').last().find('a');
			}
			$j("a.active", cc.jEOProductImageThumbs).removeClass('active');
			newImageAnchor.addClass('active');
			cc.jEOProductImageLarge.attr('src', newImageAnchor.attr('href'));
			return false;
		});
		cc.jEONextImageArrow.click(function(){
			var activeLI = $j("a.active", cc.jEOProductImageThumbs).parent('li');
			var newImageAnchor;
			if (activeLI.next('li').length){
				newImageAnchor = activeLI.next('li').find('a');
			} else {
				newImageAnchor = cc.jEOProductImageThumbs.find('li').first().find('a');
			}
			$j("a.active", cc.jEOProductImageThumbs).removeClass('active');
			newImageAnchor.addClass('active');
			cc.jEOProductImageLarge.attr('src', newImageAnchor.attr('href'));
			return false;
		});
	},

	buildProductScroll : function(){
		// Class Context
		var cc = this;

		cc.jEOProductsList.scrollable({
			items: 'ul#scroller',
			next: '#CollectionsCarouselNext',
			prev: '#CollectionsCarouselPrev',
			onSeek: function(){
				var api = $(cc.jEOProductsList).data('scrollable');
				var lastItem = api.getSize();
				var position = api.getIndex() + 4;
				if (position == lastItem){
					cc.jEOProductsNextButton.addClass('disabled');
				} else {
					if (cc.jEOProductsNextButton.hasClass('disabled')){
						cc.jEOProductsNextButton.removeClass('disabled');
					}
				}

				var left = $j('ul#scroller').css('left');
				$j('#jsProducts .c-f ul').css('left',left);
			}
		});
		cc.jEOProductsPrevButton.addClass('disabled');
	},

	init : function() {

		var cc = this;

		cc.jEOProductsList = $j('#jsProducts .c-b');
		cc.jEOProductsListItem = $j('ul li', cc.jEOProductsList);
		cc.jEOProductsNextButton = $j('#CollectionsCarouselNext');
		cc.jEOProductsPrevButton = $j('#CollectionsCarouselPrev');
		cc.jEOProducts = $j("#jsProducts img.product-thumb");
		cc.jEOProductImageLarge = $j("#jsProductImageLarge");
		cc.jEOProductImageThumbs = $j("#jsProductImageThumbs");

		if (cc.jEOProducts.length) {
			cc.buildTooltips();
		}

		if (cc.jEOProducts.length > 4) {
			cc.buildProductScroll();
		}

		if (cc.jEOProductImageLarge.length && cc.jEOProductImageThumbs.length) {
			cc.buildImages();
			if($j('li', cc.jEOProductImageThumbs).length >= 1){
				cc.buildNextPrevious();
			}
			if(!$j("a.active", cc.jEOProductImageThumbs).length){
				cc.jEOProductImageThumbs.find('li').first().find('a').addClass('active');
			}
		}

	}

};

/*	FormValidation
----------------------------------------------- */
var FormValidation = {

	/* Configuration, Flags and Messages */

	/* jQuery Object References  */
	jEOFormNewsletterModalForm: null,
	jEOFormNewsletterForm: null,
	jEOFormContactUsModalForm: null,
	jEOFormCommentsForm: null,

	validationNewsletterForm : function() {
	
		var cc = this;
	
		cc.jEOFormNewsletterForm.validate({
			rules: {
				email: {
					required: true,
					email: true
				}
			},
			messages: {
				email: "Please enter a valid email address"
			}
		});
	
	},

	validationNewsletterModalForm : function() {

		var cc = this;

		cc.jEOFormNewsletterModalForm.validate({
			rules: {
				name: "required",
				email: {
					required: true,
					email: true
				},
				agreeterms: "required"
			},
			messages: {
				name: "Please enter your name",
				email: "Please enter a valid email address",
				agreeterms: "Please accept our terms"
			}
		});

	},

	validationContactUsModalForm : function() {

		var cc = this;

		cc.jEOFormContactUsModalForm.validate({
			rules: {
				name: "required",
				email: {
					required: true,
					email: true
				},
				message: "required",
				agreeterms: "required"
			},
			messages: {
				name: "Please enter your name",
				email: "Please enter a valid email address",
				message: "Please enter a message",
				agreeterms: "Please accept our terms"
			}
		});


	},

	validationCommentsForm : function() {

		var cc = this;

		cc.jEOFormCommentsForm.validate({
			rules: {
				name: "required",
				email: {
					required: true,
					email: true
				},
				comment: "required",
				captcha: "required"
			},
			messages: {
				name: "Please enter your name",
				email: "Please enter a valid email address",
				comment: "Please enter a message",
				captcha: "Please enter the word in the image"
			}
		});

	},

	init : function() {

		var cc = this;

		cc.jEOFormNewsletterModalForm = $j("#NewsletterModalForm");
		cc.jEOFormNewsletterForm = $j("#NewsletterForm");
		cc.jEOFormContactUsModalForm = $j("#ContactUsModalForm");
		cc.jEOFormCommentsForm = $j("#comment_form");

		if (cc.jEOFormNewsletterModalForm.length) {
			cc.validationNewsletterModalForm();
		}
		
		if (cc.jEOFormNewsletterForm.length) {
			cc.validationNewsletterForm();
		}

		if (cc.jEOFormContactUsModalForm.length) {
			cc.validationContactUsModalForm();
		}

		if (cc.jEOFormCommentsForm.length) {
			cc.validationCommentsForm();
		}

	}

};

/*	Preload
----------------------------------------------- */
var Preloader = {

	/* jQuery Object References to the Elements this speeds up the DOM */
	jEOContainer:null,
	jEOLoader:null,

	Prepare : function() {
		var cc = this;
		$j('#Throbber', cc.jEOLoader).remove();
		cc.jEOLoader.append('<div id="LoadBar"><div id="LoadBarProgress"></div></div>');
		cc.jEOContainer.removeClass('NotLoaded').addClass('Preloading');
		$j.preloadCssImages({statusBarEl: '#LoadBarProgress'});
	},

	/* modified preload plugin in plugins.js - onImgComplete
	if (loaded == imgUrls.length) { Preloader.removeOverlay(); return; } */
	Loaded : function() {
		var cc = this;
		cc.jEOLoader.remove();
		cc.jEOContainer.removeClass('Preloading').addClass('Loaded');
	},

	/* Initialise */ 
	init : function() {
		var cc = this;
		cc.jEOContainer = $j('#Container');
		cc.jEOLoader = $j('#Loader');

		cc.Prepare();
	}

};

/*	Collections
----------------------------------------------- */

/*	DOM Ready events
----------------------------------------------- */
$j(function() {

	/* Initialise Global */
	Global.init();

	/* Initialise Preload */
	Preloader.init();

	/* Initialise Modals */
	Modals.init();

	/* Initialise HomeCarousel */
	HomeCarousel.init();

	/* Initialise Products */
	Products.init();

	/* Initialise FormValidation */
	FormValidation.init();

	/* Initialise InputBlanking */
	InputBlanking.init();
});

/*	Window Unload
----------------------------------------------- */
$j(window).unload(function() {

	if (StoreLocator.gMap) {
		StoreLocator.gMap.clearOverlays();
		GEvent.clearInstanceListeners(StoreLocator.gMap);
		GUnload();
	}

});

