(function($){$.belowthefold=function(element,settings){var fold=$(window).height()+$(window).scrollTop();return fold<=$(element).offset().top-settings.threshold;};$.abovethetop=function(element,settings){var top=$(window).scrollTop();return top>=$(element).offset().top+$(element).height()-settings.threshold;};$.rightofscreen=function(element,settings){var fold=$(window).width()+$(window).scrollLeft();return fold<=$(element).offset().left-settings.threshold;};$.leftofscreen=function(element,settings){var left=$(window).scrollLeft();return left>=$(element).offset().left+$(element).width()-settings.threshold;};$.inviewport=function(element,settings){return!$.rightofscreen(element,settings)&&!$.leftofscreen(element,settings)&&!$.belowthefold(element,settings)&&!$.abovethetop(element,settings);};$.extend($.expr[':'],{"below-the-fold":function(a,i,m){return $.belowthefold(a,{threshold:0});},"above-the-top":function(a,i,m){return $.abovethetop(a,{threshold:0});},"left-of-screen":function(a,i,m){return $.leftofscreen(a,{threshold:0});},"right-of-screen":function(a,i,m){return $.rightofscreen(a,{threshold:0});},"in-viewport":function(a,i,m){return $.inviewport(a,{threshold:0});}});})(jQuery);

	function gmap(el) {
		if (!el.length) {
			return false;
		}

		var loc = el.attr('data-loc');
		loc = $.parseJSON(loc);

		var myloc = {
			lat: 0,
			lng: 0	
		};

		if ($("#listings").data('loc')) {
			myloc = $("#listings").data('loc');
		}

		var latlng = new google.maps.LatLng(loc.lat,loc.lng);

		var zoom = 13;
		
		var myOptions = {
			zoom: zoom,
			center: latlng,
			mapTypeControl: false,
			navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};

		var map = new google.maps.Map(el.get(0), myOptions);

		google.maps.event.trigger(map, 'resize');

		if (myloc.lat !== 0) {
			var mymarker = new google.maps.Marker({
				position: new google.maps.LatLng(myloc.lat,myloc.lng),
				map: map,
				icon: '/assets/img/icn-map-l.png'
			});
		}

		var clubmarker = new google.maps.Marker({
			position: new google.maps.LatLng(loc.lat, loc.lng),
			map: map,
			icon: '/assets/img/icn-map-r.png'
		});

 		var infowindow = new google.maps.InfoWindow();

		google.maps.event.addListener(clubmarker, 'click', (function(marker) {
			return function() {

				infowindow.setContent(
					"<div id=\"map-info\">\
						<div>\
							<a href=\"http://maps.google.com/maps?daddr="+loc.lat+","+loc.lng+"&saddr="+myloc.lat+","+myloc.lng+"\" target=\"_blank\">Click here to get directions</a>\
						</div>\
					</div>"
				);
				infowindow.open(map, clubmarker);
			}
		})(clubmarker));

	}

$(function(){
	// Limit autocomplete results
	$.ui.autocomplete.prototype._renderMenu = function( ul, items ) {
		var self = this;
		$.each( items, function( index, item ) {
			if (index < 10)
			{self._renderItem( ul, item );}
		});
	}

	$.ajaxSetup({
		beforeSend: function (a, b) {
			if (b.url != '/xhr/sports') {
				$("#listings").prepend(
					$("<div>", {id: 'overlay'}).css({
						'height': $("#listings").height(),
						'width': $("#listings").width()
					})
				);
			}
		},
		complete: function () {
			$("#overlay").remove();
		},
	});

	/**
	 * Sports Lists
	 */ 
	$.getJSON('/xhr/sports', sports);

	var _sports = [];

	function sports(json) {
		_sports = json.data;
	}

	/**
	 * Ticker
	 */
	$("#js-news").ticker();

	/**
	 * Category Builder
	 */
	
	function build_cats(json) {
		$("#cat li[data-type]").remove();
		$("#cat li").addClass('on');

		$.each(json.reverse(), function(i, t) {
			$("#cat ul").prepend(
				$("<li>", {
					text: t.name
				})
				.addClass('on')
				.attr('data-type', t.safe)
			);
		});
	}

	/**
	 * View Builder
	 */
	function build_view(json) {
		var title = $("#results h2.content").html().split('—');

		if (!json.result) {
			$("#listings").html(json.error.message);
			$("#results h2.content").html(title[0] + ' &mdash; 0 results');
			return false;
		}

		build_cats(json.data.types);

		var total = json.data.organisations.length;

		if (json.data.remaining) {
			total += json.data.remaining;
		}

		$("#results h2.content").html(title[0] + ' &mdash; ' + total + ' results');

		$("#listings").empty();

		build_cards(json.data.organisations, parseInt(json.data.remaining));
	 }

	/**
	 * Card Builder
	 */
	function build_cards(cards, more) {
		$.each(cards, function(i, o) {
			if ($("#org-" + o.org_id).length) {
				return true;
			}
			var card = $("<article>")
				.addClass('vcard')
				.attr('data-type', o.type_name_safe)
				.attr('id', 'org-' + o.org_id)
				.addClass(function() {
					if (o.premium) return 'premium'
				});

			//Details
			var details = $("<div>").addClass('details');

			var tel = 
				$("<div>", {
					text: o.org_auth_tel
				}).addClass('tel');

			var email = 
				$("<a>", {
					href: 'mailto:' + o.org_auth_email,
					text: o.org_auth_email
				}).addClass('email');
			
			var url = 
				$("<a>", {
					href: o.org_url,
					text: o.org_url
				}).addClass('url');
			
			var adr = 
				$("<div>")
				.addClass('adr')
				.append(
					$("<span>", {
						text: o.org_town
					}).addClass('locality'),
					$("<span>", {
						text: ' ' + o.org_postcode
					}).addClass('postal-code')
				);

			if (o.premium) {
				details.append(
					$("<div>", {
						html: o.org_desc
					}).addClass('description')
				);
			}

			if (o.org_auth_tel) details.append(tel);
			if (o.org_auth_email) details.append(email);
			if (o.org_url) details.append(url);

			details.append(adr);

			card.append(
				details,
				$("<div>").addClass('clear')
			);

			// Header
			card.prepend(
				$("<header>")
				.append(
					$("<h1>", {
						text: o.org_name
					}).addClass('fn org'),
					$("<span>", {
						text: o.distance + ' mi'
					}).addClass('result-dist')
				)
			);

			// Footer
			card.append(
				$("<footer>")
				.addClass('open-map')
				.append(
					$("<span>", {
						html: 'Map &amp; Directions'
					}).addClass('link')
				),
				$("<section>")
				.addClass('map-directions')
				.append(
					$("<h1>", {
						html: 'Map &amp; Directions'
					})
					.addClass('more-info'),
					$("<div>")
					.addClass('map')
					.attr('data-loc', o.location_safe)
				)
			);

			$("#listings").append(card);

			if (o.premium) {
				$("#listings").append(
					$("<div>", {
						text: 'The listing above is a Sponsored Listing. '
					})
					.addClass('sponsored-listing')
					.append(
						$("<a>", {
							href: '/advertise-with-us',
							text: 'Want your own sponsored listing?',
							title: 'Want a Sponsored Listing?'
						})
					)
				);
			}

			if (more && i + 1 === cards.length) {
				$("#listings").append(
					$("<div>", {
						id: 'loadmore'
					})
				);
			}
		});
	}
		 
	/**
	 * Slider
	 */
	var distance = $("#slider").data('distance');

	$("#slider").slider({
		value: (distance <= 0) ? 55 : distance,
		min: 5,
		max: 55,
		step: 5,
		animate: true,
		slide: function(event, ui) {
			if (ui.value <= 50) {
				$("#dist h1").text('Distance: ' + ui.value + ' miles');
			} else {
				$("#dist h1").text('Distance: Nationally');
			}
		},
		stop: function(event, ui) {
			$.getJSON('/xhr/distance/'  + ui.value, build_view);
		}
	});

	/**
	 * Form Placeholders and Autocomplete
	 */
	$("#search-form form input:text[value='']").parent().siblings('.placeholder').show();

	$("#search-form form input:text").focus(function() {
		var input = $(this);

		input.parent().siblings('.placeholder').hide();
		input.siblings('.helper').remove();

		if (input.next('.helper').length) {
			return false;
		}

		var helper = $("<div>")
						.addClass('helper')
						.append(
							$("<div>")
								.addClass('autofill')
						);
		
		var helptext = $("<div>").addClass('helper-text');

		switch ($(this).attr('name')) {
			case 'sport':
				helptext.append(
					$("<span>", {
						html: 'eg: Golf Club, Trainer, Organisation, etc&hellip;'
					})
				);
				break;
			case 'location':
				helptext.append(
					$("<span>", {
						html: 'eg: Postcode, Town, etc&hellip;'
					})
				);
				break;
		}

		helptext.appendTo(helper);

		input.after(helper);

		if (input.attr('name') == 'sport') {
			input.autocomplete({
				source: _sports,
				appendTo: $(".autofill"),
				delay: 50,
				change: function() {
					$(this).autocomplete("destroy");
					input.siblings('.helper').remove();
				}
			});
		}
	}).blur(function() {
		if ($(this).attr('name') != 'sport') {
			$(this).siblings('.helper').remove();
		}

		if (!$(this).val()) {
			$(this).parent().siblings('.placeholder').show();
		}
	});


	/**
	 * Form Submission
	 */
	$("#search-form form").submit(function(e) {
		// Collect form elements
		var f = {
			s: $(this).find('input:text[name=sport]'),
			l: $(this).find('input:text[name=location]'),
			sm: $(this).find('input:submit')
		};

		// Store the submit button value and disable it
		var sm_name = f.sm.attr('name');
		f.sm.attr('disabled', 'disabled').attr('value', 'loading');

		// If sport or location is empty, cancel the form
		if (!f.s.val() || !f.l.val()) {
			e.preventDefault();
			f.sm.removeAttr('disabled').attr('value', sm_name); // Reset the submit button

			$(this).find('p.error').remove(); // Remove previous errors

			// Trim the field values
			var s = $.trim(f.s.val());
			var l = $.trim(f.l.val());

			var error = $("<p>", {
							text: 'This field is required'
						}).addClass('error');
			
			// Append the errors where required
			if (!s) {
				f.s.after(error.clone());
			}

			if (!l) {
				f.l.after(error.clone());
			}
		}
	});

	/**
	 * Filter Cards
	 */
	$("#cat li").live('click', function(e) {
		var el = $(this);
		var action = $(this).data('type');

		el.toggleClass('on');

		if (action === undefined) {
			if (el.hasClass('on')) {
				el.siblings().addClass('on');
				$("#listings [data-type]").show();
			} else {
				el.siblings().removeClass('on');
				$("#listings [data-type]").hide();
			}
		} else {
			$("#cat ul li:last-child").removeClass('on');

			if (el.hasClass('on')) {
				$("#listings [data-type="+action+"]").show();

				if (!$("#listings [data-type="+action+"]").length || $("#listings [data-type="+action+"]").length >= 5) {
					get_more();
				}

				var ul = el.parent();

				if (ul.find('.on').length >= ul.children().length - 1) {
					ul.find('li:last-child').addClass('on');
				}
			} else {
				$("#listings [data-type="+action+"]").hide();
			}
		}

		$(window).trigger('scroll');
	});


	/**
	 * Sort
	 */
	$("#sort li").live('click', function(e) {
		if (!$(this).hasClass('on')) {
			$(this).addClass('on').siblings().removeClass('on');
			$.getJSON('/xhr/sort/' + $(this).data('by'), build_view);
		}
	});

	function get_more() {
		var data = {
			offset: $("#listings [data-type]").length,
			cats: []
		};

		$("#cat .on[data-type]").each(function() {
			data.cats.push($(this).data('type'));
		});
		
		$("#loadmore").remove();

		if (data.cats.length) {
			$.getJSON("/xhr/more", data, function(json) {
				build_cards(json.data.orgs, parseInt(json.data.remaining));
			});	
		}
	}

	/**
	 * Scrolling
	 */

	$(window).bind("scroll", function(event) {
		if ($("#loadmore:in-viewport").length) {
			get_more();
		}

		if ($("#refine h1:above-the-top").length && !$("#gototop").length) {
			$("body").append(
				$("<div>", {
					text: 'Go to Top',
					id: 'gototop'
				}).click(function() {
					var offset = $("#refine h1").offset();
					$('html, body').animate({scrollTop: offset.top - 20}, 250);
				}).hide().fadeIn(250)
			);
		} else if ($("#refine h1:in-viewport").length) {
			$("#gototop").fadeOut(250, function() {
				$(this).remove();
			});
		}
	});

	/**
	 * Maps
	 */
	
	$(".open-map .link").live('click', function() {
		var holder = $(this).parent().next('.map-directions');
		var button = $(this);

		button.html('Close Map');

		holder.slideToggle(250, function() {
			if($(this).is(':visible')) {
				if (!$(this).find('.map').children().length) {
					gmap($(this).find('.map'));
				}
			} else {
				button.html('Map &amp; Directions');
			}
		});
	});

	/**
	 * Classifieds
	 */

	$("#product form[id=signup] textarea").keydown(function(e) {
		if ($(this).val().length >= 500 && e.keyCode !== 8) {
			e.preventDefault();
		}
	});

	$("#product form input, #product form textarea").bind('parse', function(e, refresh) {
		var v = $(this).val();
		var id = $(this).attr('id');

		switch (id) {
			case 'postcode':
				v = v.toUpperCase();
				$(this).val(v);
				break;
			case 'town':
				v = v.replace(/[^\w\s-]/gi, "");
				var f = v.charAt(0).toUpperCase();
				v = f + v.substr(1);
				if (refresh) $(this).val(v);
				break;
			case 'description':
				v = v.substring(0, 500);
				v = v.replace(/[\n]{3,}/gi, "\n\n");
				if (refresh) $(this).val(v);
				$(this).next('span.count').find('span').text(v.length);
				v = v.replace(/[\n]/gi, "<br />");
				break;
			case 'business_url':
				if (v && !v.match(/^[http]/gi)) {
					v = 'http://' + v;
					if (refresh) $(this).val(v);
				}
				break;
			case 'business_email': break;
			case 'contact_email': break;
			default:
				v = v.replace(/[^\w\s-\'\,]/gi, "");
				if (refresh) $(this).val(v);
		}

		v = $.trim(v);
		var el = $("article.vcard [id=cla-"+id+"]");

		if (!el.data('o')) {
			el.attr('data-o', el.text());
		}

		if (id == 'facebook' || id == 'twitter') {
			if (v) {
				$("article.vcard .social a."+id).addClass('on');
			} else {
				$("article.vcard .social a."+id).removeClass('on');;
			}

			return true;
		}

		if (v) {
			if (id == 'description') {
				el.html(v);
			} else {
				el.text(v);
			}
		} else if (el.data('o')) {
			el.text(el.data('o'));
		}
	}).keyup(function(){
		$(this).trigger('parse');
	}).blur(function() {
		if ($(this).attr('id') != 'postcode') {
			$(this).trigger('parse', [true]);
		}
	});

	$("#product form[id=signup] input[val!=''], #product form[id=signup] textarea[val!='']").trigger('parse');

	$("#product form input[id=postcode]").blur(function() {
		var pc = $(this).val();

		$.getJSON('/xhr/latlng/' + pc, function(json) {
			if (json.result) {
				$(".map-directions .map").removeAttr('data-loc');
				$(".map-directions .map").attr('data-loc', JSON.stringify(json.data.latlng));

				if ($('.map-directions').is(':visible')) {
					$(".open-map .link").click();
					$('.map-directions .map').empty().attr('style', '');
				}

				$(".open-map .link").click();

			}	
		});
	});

	if ($("#product form input[id=postcode]").val()) {
		$("#product form input[id=postcode]").trigger('blur');
	}

	if ($("#preview #listings").length) {
		var top = $("#listings").offset().top;
		var slider = $("#preview").offset().top;

		$(window).scroll(function (event) {
			var y = $(this).scrollTop();
			var offs = y - slider;

			if (y >= top) {
				$("#listings").stop().animate({'top': offs+10}, 500);
			} else {
				$("#listings").stop().animate({'top': 0}, 500);
			}
		});
	}

	$("#product form").submit(function() {
		$(this).find('input:submit').attr('disabled', 'disabled');
	});

	$(".pre_toggle").click(function() {
		$("body").toggleClass('premium');
		var $is_premium = $("#is_premium");
		$is_premium.attr('checked', !$is_premium.attr('checked'));
	});

	$("#feature-tables div.toggle div:not(.on)").live('click', function() {
		$(this).parent().children().toggleClass('on');
		$(this).parent().parent().find('table').toggle();
	});
});

