jQuery.noConflict();

var plauditAnalytics = (function($) {
	
	var isPageTrackerLoaded = function() {
		return typeof(_gaq) != "undefined" && _gaq != null;
	};
	
	return {
		init: function() {
			$("a").filter("[href^='http://'], [href^='https://']").filter(":not([href*='://"+location.hostname+"'])").click(function(){
				plauditAnalytics.trackEvent("Outbound Link", "Click", $(this).attr("href"));
			});
			$("a").filter("[href^='mailto:']").click(function(){
				plauditAnalytics.trackEvent("Email Link", "Click", $(this).attr("href"));
			});
			$("form").filter("[action^='http://'], [action^='https://']").filter(":not([action*='://"+location.hostname+"'])").submit(function(){
				plauditAnalytics.trackEvent("Outbound Form Submissions", "Submit", $(this).attr("action"));
			});
		},
		trackPage: function(url) {
			if ( url.substring(0,1) != '/' )
				url = '/' + url;
			if ( isPageTrackerLoaded() ) {
				_gaq.push(['_trackPageview', url]);
			} else if ( typeof(console) != "undefined" ) {
				console.log("Google Analytics not loaded. Trying to track page: " + url);
			}
		},
		trackEvent: function(category, action, opt_label, opt_value) {
			if ( isPageTrackerLoaded() ) {
				_gaq.push(['_trackEvent', category, action, opt_label, opt_value]);
			} else if ( typeof(console) != "undefined" ) {
				console.log("Google Analytics not loaded. Trying to track event with category '" + category +"', action '" + action +"', opt_label '" + opt_label +"', and opt_value '" + opt_value +"'.");
			}
		}
	};
})(jQuery);


var plauditUI = (function($){
	
	return {
		init: function(){
			// Functions to run by default
			this.common();
			this.lightbox();
			this.videoPlayer();
			this.homepageImageGallery();
			this.newsTicker();
			this.productImageGallery();
			this.homeCategorySlider();
		},
		common: function(){
			$("tr:odd").addClass("odd");
		
			$(".search-form input.query").placeHolder("Find something fun...");
			function ajaxAffectedSetup() {
				$("#request-for-quote .quantity").placeHolder("Quantity");
			}
			ajaxAffectedSetup();
			$(document).ajaxComplete(ajaxAffectedSetup);
			
			$(document).ajaxSend(function(event){
				if (event != null && event.target != null && event.target != document
						&& (event.target.localName == 'input' || event.target.localName == 'select')
					) {
					var $target = $(event.target);
					if ($target.data("_ajaxLoader") == null) {
						var offset = $target.offset();
						var left = offset.left + $target.outerWidth() + 5;
						var top = offset.top + 5;
						
						var $label = $target.closest("label");
						if ($label.length > 0) {
							// Look for surrounding label
							left = $label.offset().left + $label.outerWidth() + 5;
						} else {
							//looks for a label to the right
							var id = $target.attr("id");
							if (id != null) {
								$label = $("label[for='" + id + "']");
								if ($label.length > 0) {
									var labelOffset = $label.offset();
									if (labelOffset.left > offset.left) {
										// label to the right of the field
										left = offset.left - 5;
									}
								}
							}
						}
						var $loader = $(document.createElement('img'))
							.attr({
								id: "ajax-loader",
								src: "assets/images/design/ajax-loader.gif",
							})
							.css({
								position: "absolute",
								left: left,
								top: top,
								zIndex: 999999
							})
						;
						$("body").append($loader);
						$target.data("_ajaxLoader", $loader);
					}
				}
			});
			$(document).ajaxComplete(function(event){
				if ( event != null && event.target != null && event.target != document ) {
					var $target = $(event.target);
					var $loader = $target.data("_ajaxLoader");
					$target.data("_ajaxLoader", null);
					$loader.remove();
				}
			});
			if ( $.browser.msie	&& parseInt($.browser.version) < 9 ) {
				// Some versions of ie do not submit the form using the first submit if the field only contains
				// one input field. We must have it use the first button so the correct JSF action runs.
				$('input').keypress(function(event){
					var input = $(this);
				    if (event.keyCode == 13) {
				    	var submitButtons = input.closest("form").find(":submit:first, input.submit:first, input[type='image']:first");
				    	if ( submitButtons.length > 0 ) {
				    		// handle the submit
				    		submitButtons.first().click();
				        	return false;
				    	}
				    	return true;
				    }
				});
			}
		}, // Common
		lightbox: function(){
			$("#main").find(".lightbox").colorbox({
				title: function(){
					var title = $(this).find("img").attr("title");
					return title !== undefined ? '<p>' + title + '</p>' : '';
				},
				transition: 'none',
				onOpen: function(){
					$("#close-video").click();
				},
				top: "100px"
			});
		}, // lightbox
		videoPlayer: function(){
			var videoFrame = $("#video-container");
			if (videoFrame.length != 0) {
				var closeButton = $("#close-video");
				var videoFramePos = Math.ceil(videoFrame.offset().top);
				var iframe = videoFrame.children("iframe");
				var iframeHeight = iframe.attr("height");
				
				$("#image-link").click(function(e){
					e.preventDefault();
					if(!$(this).hasClass("disabled")){
						$(this).addClass("disabled");
						
						videoFrame.css({opacity: 0});
						videoFrame.animate({height: iframeHeight}, 750, function(){
							$("html,body").animate({scrollTop: videoFramePos - 20}, 750);
							$(this).addClass("video-frame-visible");
							$(this).fadeTo(500,1, function(){
								iframe.show();
								closeButton.show();
							});
						});
					}
				});
				
				$(closeButton).click(function(){
					$("#image-link").removeClass("disabled");
					iframe.hide();
					closeButton.show();
					videoFrame.fadeTo(500,0, function(){
						$(this).removeClass("video-frame-visible");
						$(this).animate({height: 0},600);
						$(this).hide();
						$(this).removeAttr("style");
					});
				});
			}
		}, // Video Player
		editAccountGeoLocation: function(area, country, throughfare, postalCode){
			area = $(area);
			if (area.length > 0) {
				var mapCenter = new google.maps.LatLng(39.023168,-98.261719);
				var mapOptions = {
						zoom: 3,
						center: mapCenter,
						navigationControl: true,
						navigationControlOptions: {
							style: google.maps.NavigationControlStyle.ZOOM_PAN
				    	},
				    	mapTypeId: google.maps.MapTypeId.ROADMAP
					};
				area.each(function() {
					var $this = $(this);
					var geocoder = new google.maps.Geocoder();
					var googleMap = $this.children(".googleMap");
					var googleMapMessage = $this.children(".googleMapMessage");
					var map = new google.maps.Map(googleMap.get(0), mapOptions);
					var latField = $(".latitude");
					var lngField = $(".longitude");
					var marker = new google.maps.Marker({draggable: true});
					google.maps.event.addListener(marker, 'drag', function () {
						updateLatLngFields(marker.getPosition());
					});

					function updateLatLngFields(coord) {
						latField.val(coord == null ? "" : coord.lat());
						lngField.val(coord == null ? "" : coord.lng());
					}
					
					function addMarker(coord) {
						if (coord == null) {
							marker.setPosition(null);
							marker.setMap(null);
							googleMapMessage.text("Unable to find");
							googleMapMessage.show();
						} else {
							marker.setPosition(coord);
							marker.setMap(map);
							map.setCenter(coord);
							googleMapMessage.hide();
						}
					}
					function updateMarker() {
						if (latField.val() != "" && lngField.val() != "") {
							var lat = parseFloat(latField.val());
							var lng = parseFloat(lngField.val());
							var coord = new google.maps.LatLng(lat, lng);
							addMarker(coord);
							return true;
						}
						return false;
					}
					
					function checkGeocodeAddress(){
						var c = $(country).val();
						var t = $(throughfare).val();
						var p = $(postalCode).val();
						if (c != "" && t != "" && p != "") {
							var address = t + ", " + p + ", " + c;
							geocoder.geocode( {'address': address}, function(results, status) {
								if (status == google.maps.GeocoderStatus.OK) {
									updateLatLngFields(results[0].geometry.location);
									addMarker(results[0].geometry.location);
									map.setZoom(15);
								} else {
									updateLatLngFields(null);
									addMarker(null);
									//alert("Geocode was not successful for the following reason: " + status);
								}
							});
						}
					}
					
					function registerChangeHandlers() {
						latField.change(updateMarker);
						lngField.change(updateMarker);
						$(country).change(checkGeocodeAddress);
						$(throughfare).change(checkGeocodeAddress);
						$(postalCode).change(checkGeocodeAddress);
					}
					$(document).ajaxSend(registerChangeHandlers);
					registerChangeHandlers();
					
					if (updateMarker()){
						map.setZoom(15);
					}
					if (latField.val() == "" && lngField.val() == "") {
						checkGeocodeAddress();
					}
				});
			}
		},
		googleMap: function(){
			// Setup vars
			var markerLatitude,
				markerLongitude,
				markerLatLng,
				markerCount,
				mapCenter = new google.maps.LatLng(39.023168,-98.261719),
				markersArray = [],
				mapOptions = {
					zoom: 3,
					center: mapCenter,
					navigationControl: true,
					navigationControlOptions: {
						style: google.maps.NavigationControlStyle.ZOOM_PAN
			    	},
			    	mapTypeId: google.maps.MapTypeId.ROADMAP
				},
				map = new google.maps.Map(document.getElementById("dealer-listings"), mapOptions);
			
			var boundsChangeTimer = null;
			function boundsChange() {
				if (boundsChangeTimer != null) {
					clearTimeout(boundsChangeTimer);
				}
				boundsChangeTimer = setTimeout(loadMarkersAtMapLocation, 2000);
			}
			var boundsChangeListenerId = google.maps.event.addListener(map, 'bounds_changed', boundsChange);

			function removeMarkers(){
				for(i in markersArray){
					markersArray[i].setMap(null);
				}
				markersArray = [];
			}
			function loadMarkersAtMapLocation() {
				var center = map.getCenter();
				loadMarkers(center.toString(), function(response) {
					findADealerResults(response, false);
				});
			}
			function loadMarkers(address, successHandler) {
				if (markersArray.length != 0){
					removeMarkers();
				}
				
				$.ajax({
					url: "do/find-a-dealer.json",
					dataType: 'json',
					data: {
						address: address,
						// Searches 200 mile radius
						distance: 100
					},
					success: successHandler
				});
			}
			function displayErrorMsg(msg){
				var mapError;
				if ($("#map-errors").length == 0){
					mapError = '<p id="map-errors">' + msg + '</p>';
					$("#dealer-listings-wrap").after(mapError);
					
					setTimeout(function(){
						$("#map-errors").fadeOut(750, function(){
							$(this).remove();
						});
					},2500);
				}
			}
			function findADealerResults(response, userRequestedAddress) {
				var mapError;
				
				if (typeof(response.error) != "undefined") {
					if (userRequestedAddress) {
						displayErrorMsg(response.error);
					}
				} else if (typeof(response.points) == "undefined" || response.points.length == 0) {
					if (userRequestedAddress) {
						displayErrorMsg("No locations in your area");
					}
				} else {
					var infoWindow = new google.maps.InfoWindow();
					// Add all points and make map zoom to only show them.
					var bounds = new google.maps.LatLngBounds();
					$.each(response.points, function(index,point){
						markerLatLng = new google.maps.LatLng(point.lat, point.long);
						
						bounds.extend(markerLatLng);
						
						var marker = new google.maps.Marker({
							position: markerLatLng,
							map: map
						});
						
						var address = point.street + " " + point.city + " " + point.state + " " + point.postalCode;
						
						markersArray.push(marker);
						
						google.maps.event.addListener(marker, 'click', function(){
							infoWindow.setOptions({
								position: markerLatLng,
								content: '<div class="info-window">' +
											'<h2>' + point.name + '</h2>' +
											'<p>' + point.phone + '</p>' +
											'<p>' + point.street + '</p>' +
											'<p>' + point.city + ", " + point.state + " " + point.postalCode + '</p>' +
											(typeof(point.website) == "undefined" || point.website == ""
													? ""
													:
													'<p><a href="' + point.website + '" target="_blank">'+point.website+'</a></p>'
												) +
											'<p><a href="http://maps.google.com/?saddr=&amp;daddr='
												+ encodeURI(address) +
												'" target="_blank">Driving Directions</a></p>' +
										'</div>'
							});
							infoWindow.open(map,marker);
						});
					});
				
					if (userRequestedAddress) {
						
						// Remove listener so it isn't triggered when we change bounds,
						// then add it back.
						google.maps.event.removeListener(boundsChangeListenerId);
						setTimeout(function() {
							boundsChangeListenerId = google.maps.event.addListener(map, 'bounds_changed', boundsChange);
						}, 1000);
							
						
						map.fitBounds(bounds);
						
						if(map.getZoom() > 15){
							// make sure didn't zoom in too far
							map.setZoom(15);
						}
					}
				}
			}
			$("#dealer-listings-wrap").show();
			$("#find-by-zip").submit(function(e){
				var address = $(this).find(".address-field").val();
				e.preventDefault();
				loadMarkers(address, function(response) {
					findADealerResults(response, true);
				});
			});
		}, // google map
		productImageGallery: function(){
			/*
			 * Product Image Gallery
			 * Used on all product pages for image slider
			 */
			var $gallery = $("#gallery");
			var $imgs = $("img", $gallery);
			if ($imgs.size() == 1) {
				$('#next-image, #prev-image').hide();
			} else {
				$gallery.cycle({
					fx: 'scrollHorz',
					timeout: 4000,
					pause: true,
					pauseOnPagerHover: true,
					pager: '#image-controls',
					next: '#next-image',
					prev: '#prev-image'
				});
			}
		}, // productImageGallery
		newsTicker: function(){
			/*
			 * News Ticker
			 * Used on homepage to rotate through "featured news items
			 */
			var newsTicker = $("#featured-news");
			
			newsTicker.find("li").css({"display": "block"});
			
			newsTicker.find("ul").cycle({
				fx: 'fade',
				timeout: 3000,
				speedIn: 2000
			});
		}, // newsTicker
		homeCategorySlider: function(){
			/*
			 * Home Category Slider
			 * Used on homepage for category slider
			 */
			var scroller = $("#featured-categories"),
				itemWrap = '<div id="featured-categories-inner"><div id="items"></div></div>',
				prevBtn = '<span class="featured-categories-prev" id="prev"></span>',
				nextBtn = '<span class="featured-categories-next" id="next"></span>';
				
			scroller.wrapInner(itemWrap);
			scroller.prepend(prevBtn)
			scroller.prepend(nextBtn); 
			
			$("#items").cycle({
				fx: 'scrollHorz',
				timeout: 0,
				next: '#next',
				prev: '#prev',
				cssBefore: {
					paddingLeft: 0
				},
				cssAfter: {
					paddingLeft: 30
				}
			})
		}, // homeCategorySlider
		homepageImageGallery: function(){
			/*
			 * Homepage Image Gallery
			 * Used on homepage for main animation
			 */
			$("#animation").cycle({
				fx: 'blindY',
				cleartypeNoBg: true,
				timeout: 5000,
				easeOut: "swing",
				speedOut: 400,
				easeIn: "swing",
				speedIn: 750,
				pager: '#image-controls',
				pause: true
			});
		} // homepageImageGallery
		
	}; 
	
})(jQuery);

jQuery(function(){
	plauditAnalytics.init();
	plauditUI.init();
});

