$(function(){
	
	$('#nav_login').loginForm();
	
	$('#search,#get_support').inputText();
	
	$('#intro').homeIntro();
	
	$('.sub_nav').subNavToggle();
	
	$('#projects').ieHeightFix();
	
	$('#gallery').showMainImage();
	
	$('#map').distributorsMap();
	$("a[rel='galleryimage']").colorbox();
	
	
	$('#locations').filterPartners();
	$('.thickbox').colorbox();
	
});

$.fn.loginForm = function(){
	var form = $('#login');
	$(this).children('a').toggle(function(){
		form.show();
	},function(){
		form.hide();
	});
}

$.fn.inputText = function(){
	return this.each(function(){
		var input = $('input.text',this);
		var labelText = $('label',this).text();
		var initialText = input.val();
		
		if (!initialText) {
			initialText = labelText;
			input.val(initialText);
		}
		
		input.focus(function(){
			if (input.val()==initialText) input.val('');
		}).blur(function(){
			if (input.val()=='') input.val(initialText);
		});
	});
}


$.fn.homeIntro = function(){
	return this.each(function(){
		var container = $(this);
		var items = $('li',container);
		var controls, timer;
		var switchItem = function(){
			var link = $(this);
			if (!link.parent().is('.on')) {
				link.parent().addClass('on').siblings().removeClass('on');
				items.filter(':visible').fadeOut(250,function(){
					items.eq(link.attr('data-index')).fadeIn(250);
				});
			}
			return false;
		}
		
		if (items.length>1) {
			controls = $('<ul id="intro_controls" />');
			items.each(function(i){
				var listItem = $('<li><a href="#" data-index="'+i+'">Show '+(i+1)+'</a></li>');
				if (i==0) listItem.addClass('on');
				controls.append(listItem);
			});
			controls.delegate('a','click',function(){
				clearInterval(timer);
				return switchItem.call(this);
			}).appendTo(container).css({
				marginLeft: -controls.width()/2
			});
			
			items.not(':first').hide();
			
			timer = setInterval(function(){
				var current = controls.children('.on');
				var next = current.is(':last-child') ? controls.children(':first-child') : current.next();
				switchItem.call(next.children('a'));
			},7000)
		}
	});
}

$.fn.subNavToggle = function(){
	return this.each(function(){
		var subnavs = $('ul',this);
		subnavs.each(function(){
			var subnav = $(this);
			var a = subnav.prev('a');
			if (!subnav.children('.on').length) { subnav.hide(); } else { a.addClass('active'); }			
			a.click(function(){
				if (!subnav.is(':animated')) {
					subnav.slideToggle();
					a.is('.active') ? a.removeClass('active') : a.addClass('active');
				}
				return subnav.hasClass('noreturn');
				
			});
		});
	});
}


// IE6+7 don’t properly implement clearing, so here’s a height equalisation function
$.fn.ieHeightFix = function(){
	return this.each(function(){
		if ($.browser.msie && $.browser.version<8) {
			var items = $(this).children();
			var line_length = Math.ceil(items.length/items.filter('.row_leader').length);
			var start = 0;
			while (start<items.length) {
				var row = items.slice(start,start+line_length+1);
				var height = row.map(function(){
					return $(this).height();
				}).get().sort(function(a,b){return (a-b);}).pop();
				row.height(height);
				start+=(line_length+1);
			}
		}
	});
}


$.fn.showMainImage = function(){
	$('.image2, .image3, .image4, .image5').hide();
	return this.each(function(){
		var mainImage = $('#gallery_main img');
		var caption = mainImage.next('small');
		
		$(this).find('.link_image').click(function(){
			//$('.link_main').attr('href', $(this).attr('attr-full-image'));
			//mainImage.attr('src',this.href);
			//caption.text(this.title);
			$('.link_main, caption').hide();
			$('.' + $(this).attr('attr-target')).show();
			return false;
		})
	});
}

$.fn.distributorsMap = function(){
	return this.each(function(){

		var mapHolder = $(this);
		var locations = $('#locations').find('li>a');
		var table = $('#partners>table').hide();
		var tbody = table.children('tbody');
		
		var map = new google.maps.Map(this,{
			mapTypeId: google.maps.MapTypeId.ROADMAP,
			zoom: 6
		});
		
		var infowindow = new google.maps.InfoWindow();
		var markerShadow = '/images/marker_shadow.png';
		
		var setTableContent = function(data){
			var row = $('<tr><td class="address"></td><td></td><td></td></tr>');
			var address = data.address.html().replace(/,/g,',<br/>');
			if (!address.match(/^<p/)) address = '<p>'+address+'<p/>';
			row.children().eq(0).append(data.icon.clone()).append(' ').append(data.link.clone()).append(address)
				.next().append(data.dl.clone())
				.next().append(data.link.clone().text('Get directions'));
			tbody.empty().append(row);
			table.show();
		}
		
		locations.each(function(i){
			var link = $(this);
			var type = link.closest('li').is('.distributor') ? 'distributor' : 'rental';
			var latlngSource = link.attr('data-latlng').split(',');
			var latlng = new google.maps.LatLng(latlngSource[0],latlngSource[1])
			
			var marker = new google.maps.Marker({
				position: latlng,
				map: map,
				icon: '/images/marker_'+type+'.png',
				shadow: markerShadow
			});
			
			var content = '<div class="info_window"><h2>'+link.text()+'</h2>'+link.nextAll('dl').html()+'</div>';
			google.maps.event.addListener(marker, 'click', function() {
				infowindow.setContent(content);
				infowindow.open(map,marker);
				map.panTo(latlng);
				setTableContent({
					link: link,
					icon: link.prev('img'),
					address: link.nextAll('.address'),
					dl: link.nextAll('dl')
				});
			});
			
			link.click(function(){
				google.maps.event.trigger(marker,'click');
				$('html,body').animate({scrollTop: mapHolder.offset().top-30},200);
				return false;
			});

		});

		// initial location
		codeAddress($('#location').val(), mapHolder, map, locations);	

	});
}

function codeAddress(address, thisnode, map, locations) {
   geocoder = new google.maps.Geocoder();
   geocoder.geocode( { 'address': address}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK)
       {
		closest = 99999;
		mapHolder = thisnode  
        centerposition = results[0].geometry.location
        closestposition = centerposition
        locations.each(function(i){
			var link = $(this)
			var latlngSource = link.attr('data-latlng').split(',');
			var latlng = new google.maps.LatLng(latlngSource[0],latlngSource[1])
			distance = getdistance(centerposition, latlng);
			if (distance < closest)
			{
				closest = distance;
				closestposition = latlng;
				map.setCenter(closestposition)
			}
        });
      } else {
      }
    });

  }

function getdistance(latlng1, latlng2)
{
	var R = 6371;
	var dLat = toRad(latlng2.lat() - latlng1.lat());
	var dLon = toRad(latlng2.lng() - latlng1.lng());
	var a = Math.sin(dLat/2) * Math.sin(dLat/2) +  Math.cos(toRad(latlng1.lat())) * Math.cos(toRad(latlng2.lat())) * Math.sin(dLon/2) * Math.sin(dLon/2);
	var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
	var d = R * c;
	return d;
}

function toRad(num)
{
    return num * Math.PI / 180;
}



$.fn.filterPartners = function(){
	return this.each(function(){

		var container = $(this);
		var locations = container.find('.locations');
		var distributors = container.find('.distributor');
		var rentals = container.find('.rental');
		
		if (rentals.length && distributors.length) {
			var toggle = $('<div class="toggle">Show: <ul><li class="all"><a href="#">All</a></li><li class="d"><a href="#">Sales</a></li><li class="r"><a href="#">Rental</a></li></ul></div>').prependTo(container);
			toggle.find('a').click(function(){
				switch(this.parentNode.className) {
					case "all":
						distributors.show();
						rentals.show();
						break;
					case "d":
						distributors.show();
						rentals.hide();
						break;
					case "r":
						distributors.hide();
						rentals.show();
						break;
				}
				locations.show().not(':has(li:visible)').hide();
				return false;
			});
		}

	});
}
