// EMC Flyout
// By: R Brown
// May 2009

$.emc = $.emc || {};  // Make the EMC namespace availible

(function ( $ ) {                  // Compliant with jquery.noConflict()
	$.fn.emc_flyoutLocations = function(o) {
		
		o = $.extend({
				flyoutLinks : { textField: '', partnerField: '', flyoutTitle : ''  }, //an array of links that open the flyout
				offset_left : 0, //use to offset the default positioning
				offset_top : 0, //use to offset the default positioning
				btnUrl : '/media/aerlinguscom/styleassets/images/booking-engine/btn-airport.gif'
		}, o || {});
		
		var flyout, flyoutLink, flyoutTitle, targetField, partnerField, locationsContainer;
		
		flyout = $('#flyoutLocations');
		
		init();
		
		function init(){
			
			if(!flyout.length){
				//create the flyout
				flyout = $('<div id="flyoutLocations" class="flyout location"><div class="locations"><div class="tl"><div class="tr"><h2></h2></div></div><div class="ml"><div class="mr"><div class="middle"><div id="locationsContainer"></div></div><div class="footnote"><h3>Footnote: </h3><p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse.</p></div></div></div><div class="bl"><div class="br"></div></div></div></div>').appendTo("#page-container");
			}
				
			//insert the locations container
			locationsContainer = $('#locationsContainer');
		
			flyoutTitle = $('h2',flyout);
		
	
			//attach the show flyout event to the lcoation links
			$.each(o.flyoutLinks, function(i) {
				//add the link
				$('<a href="#none" id="' + o.flyoutLinks[i].textField + '-picker" class="location-picker"><img src="' + o.btnUrl + '" width="29" height="20" alt="Select airport" /></a>').insertAfter('#' + o.flyoutLinks[i].textField).click( function(){
																																																												   					targetField = $('#' + o.flyoutLinks[i].textField);																																										   					partnerField = $('#' + o.flyoutLinks[i].partnerField);
					showFlyout(this,o.flyoutLinks[i].flyoutTitle,o.flyoutLinks[i].textField);
					return false;
				});
			});
			
			//add the flyout to the flyouts array
			if($.emc.flyouts) $.emc.flyouts.push(flyout);
			else $.emc.flyouts = new Array(flyout);
			
			addCloseButton();
		}
		
		function addCloseButton(){
			$('<div class="close"><a href="#"><img src="/media/aerlinguscom/styleassets/images/js/flyout-login-btn-close.gif" alt="Back to content" width="20" height="20" /></a></div>').insertAfter($("div.ml",flyout)).find('a').click( closeFlyout );
		}
		
	
		function positionFlyout() {
		}
		
		function closeFlyout(){
			flyout.hide();
			
			$('body').unbind('click',closeFlyout);
			
			flyoutLink.focus();
			return false;
		}
		
		function showFlyout(obj,title,textField){
			flyoutLink = obj;
			flyoutTitle.html(title);
			flyout.attr('title',textField);
			
			//hide all other flyouts
			for(n=0;n<$.emc.flyouts.length;n++) $.emc.flyouts[n].hide();
			
			
			
			//get the partner fields code value to be used to filter destinations
			var code = false;
			
			if(partnerField.length){
				partnerLocation = partnerField.val();
				jQuery.each(keyArray, function(){
					if (this.meaning == partnerLocation) {
						code = this.code;
						return false;
					}
				});
				insertLocations();
			}
			if(code){
				insertLocationsFiltered(code);
			}
			else{
				insertLocations();
			}
			
			
			//first position the flyout of screen so we can display it so we can set it's width
			flyout.css({'left':'-10000px','display':'block'});
			
			//set the width of the flyout
			cols = $('div.col',locationsContainer);
			locationsContainer.css('width',cols.eq(0).outerWidth(true)*cols.length+'px');
			
			//reposition for internet explorer
			if($.browser.msie){
				//remove the width attributes to allow the container to resize to it's natural size
				$('div.tl,div.bl',flyout).css('width','auto');
				$('div.tl,div.bl',flyout).css('width',flyout.innerWidth() + 'px');
			}
			
			flyout.show();
			
			//calculate the default position
			x = obj.offsetLeft;            // Get left position from the parent object
			y = obj.offsetTop;            // Get top position from the parent object
			while(obj.offsetParent!=null) {   // Parse the parent hierarchy up to the document element
				oParent = obj.offsetParent;    // Get parent object reference
				x += oParent.offsetLeft; // Add parent left position
				y += oParent.offsetTop; // Add parent top position
				obj = oParent;
			}
			
			x = x + o.offset_left;
			y = y + o.offset_top;
			
			//ensure the flyout doesn't appear off screen
			var flyout_width = flyout.innerWidth();
			var flyout_height = flyout.innerHeight();
			var window_width = $(window).width();
			var window_height = $(window).height();
			
			if(x < 10) x = 10; //too far to the left
			else if(x + flyout_width + 10 > window_width) x = window_width - flyout_width - 10;	//too far to the right
			if(y - 10 < window.pageYOffset) y = window.pageYOffset + 10; //too high
			else if(y + flyout_height + 10 > window.pageYOffset + window_height) y = window.pageYOffset + window_height - flyout_height - 10;	//too low
			
			flyout.css( { 'top':y, 'left':x } );
			
			$('body').bind('click',closeFlyout);
			
			flyout.focus();
			return false;
		}

		function bindLocations() {
			
			$('.location li a').bind("mousedown",function() {
				var location = $(this).text();
				(location!='') ? targetField.val(location) : null;
				closeFlyout();
				return false;
			});
			
			locationHover();
			
		}
		
		function insertLocationsFiltered(code) {
			locationsContainer.empty();
			
			var prevCount = 0;
			var count = 0;
			// max 8 items per col
			
			var flyoutLocationCol = $('<div class="col"></div>');
			var flyoutLocationList = $('<ul></ul>');	
		
			var IrelandCount = 0;
			var IrelandRemaining = 0;
			var IrelandTotal = Ireland.length;
			jQuery.each(Ireland, function(){
				if (departureArray[code] && jQuery.inArray(this.code, departureArray[code]) != -1) {
					if (IrelandCount == 0)
					{
						$(flyoutLocationCol).append('<h3>Ireland</h3>');
					}
					$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
					count += 1;
					IrelandRemaining += 1;
					IrelandCount += 1;
				}
				
				if(count != prevCount && count % 8 == 0)
				{
					prevCount = count;
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					IrelandRemaining = 0;
				}
				
			});		
			
			if(IrelandCount > 0 && IrelandTotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			if(IrelandRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
		
		var flyoutLocationList = $('<ul></ul>');
			
			var UKCount = 0;
			var UKRemaining = 0;
			var UKTotal = UK.length;
			jQuery.each(UK, function(){
				if (departureArray[code] && jQuery.inArray(this.code, departureArray[code]) != -1) {
					if (UKCount == 0)
					{
						$(flyoutLocationCol).append('<h3>UK</h3>');
					}
					$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
					count += 1;
					UKRemaining += 1;
					UKCount += 1;
				}
				
				if(count != prevCount && count % 8 == 0)
				{
					prevCount = count;
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					UKRemaining = 0;
				}
				
			});		
			
			if(UKCount > 0 && UKTotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(UKRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var EuropeCount = 0;
			var EuropeRemaining = 0;
			var EuropeTotal = Europe.length;
			jQuery.each(Europe, function(){
				if (departureArray[code] && jQuery.inArray(this.code, departureArray[code]) != -1) {
					if (EuropeCount == 0)
					{
						$(flyoutLocationCol).append('<h3>Europe</h3>');
					}
					$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
					count += 1;
					EuropeRemaining += 1;
					EuropeCount += 1;
				}
				
				if(count != prevCount && count % 8 == 0)
				{
					prevCount = count;
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					EuropeRemaining = 0;
				}
				
			});		
			
			if(EuropeCount > 0 && EuropeTotal < 8 && (count % 8 == 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(EuropeRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var USACount = 0;
			var USARemaining = 0;
			var USATotal = USA.length;
			jQuery.each(USA, function(){
				if (departureArray[code] && jQuery.inArray(this.code, departureArray[code]) != -1) {
					if (USACount == 0)
					{
						$(flyoutLocationCol).append('<h3>USA</h3>');
					}
					$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
					count += 1;
					USARemaining += 1;
					USACount += 1;
				}
				
				if(count != prevCount && count % 8 == 0)
				{
					prevCount = count;
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					USARemaining = 0;
				}
				
			});		
			
			if(USACount > 0 && USATotal < 8 && (count % 8 == 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(USARemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var MiddleEastCount = 0;
			var MiddleEastRemaining = 0;
			var MiddleEastTotal = MiddleEast.length;
			jQuery.each(MiddleEast, function(){
				if (departureArray[code] && jQuery.inArray(this.code, departureArray[code]) != -1) {
					if (MiddleEastCount == 0)
					{
						$(flyoutLocationCol).append('<h3>Middle East</h3>');
					}
					$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
					count += 1;
					MiddleEastRemaining += 1;
					MiddleEastCount += 1;
				}
				
				if(count != prevCount && count % 8 == 0)
				{
					prevCount = count;
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					MiddleEastRemaining = 0;
				}
				
			});		
			
			if(MiddleEastCount > 0 && MiddleEastTotal < 8 && (count % 8 == 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(MiddleEastRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			bindLocations();
		}
		
		function insertLocations(){
			var count = 0;
			// max 8 items per col
			
			locationsContainer.empty();
			
			var flyoutLocationCol = $('<div class="col"></div>');
			var flyoutLocationList = $('<ul></ul>');	
			
			var IrelandCount = 0;
			var IrelandRemaining = 0;
			var IrelandTotal = Ireland.length;
			jQuery.each(Ireland, function(){
				
				if (IrelandCount == 0)
				{
					$(flyoutLocationCol).append('<h3>Ireland</h3>');
				}
				$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
				
				count += 1;
				IrelandCount += 1;
				IrelandRemaining += 1;
				
				if(count % 8 == 0)
				{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					IrelandRemaining = 0;
				}
				
			});		
			
			if(IrelandTotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			if(IrelandRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var UKCount = 0;
			var UKRemaining = 0;
			var UKTotal = UK.length;
			jQuery.each(UK, function(){
				
				if (UKCount == 0)
				{
					$(flyoutLocationCol).append('<h3>UK</h3>');
				}
				$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
				
				count += 1;
				UKCount += 1;
				UKRemaining += 1;
				
				if(count % 8 == 0)
				{
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					UKRemaining = 0;
				}
				
			});		
			
			if(UKTotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(UKRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var EuropeCount = 0;
			var EuropeRemaining = 0;
			var EuropeTotal = Europe.length;
			jQuery.each(Europe, function(){
				
				if (EuropeCount == 0)
				{
					$(flyoutLocationCol).append('<h3>Europe</h3>');
				}
				$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
				
				count += 1;
				EuropeCount += 1;
				EuropeRemaining += 1;
				
				if(count % 8 == 0)
				{
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					EuropeRemaining = 0;
				}
				
			});		
			
			if(EuropeTotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(EuropeRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var USACount = 0;
			var USARemaining = 0;
			var USATotal = USA.length;
			jQuery.each(USA, function(){
				
				if (USACount == 0)
				{
					$(flyoutLocationCol).append('<h3>USA</h3>');
				}
				$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
				
				count += 1;
				USACount += 1;
				USARemaining += 1;
				
				if(count % 8 == 0)
				{
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					USARemaining = 0;
				}
				
			});		
			
			if(USATotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(USARemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			var flyoutLocationList = $('<ul></ul>');
			
			var MiddleEastCount = 0;
			var MiddleEastRemaining = 0;
			var MiddleEastTotal = MiddleEast.length;
			jQuery.each(MiddleEast, function(){
				
				if (MiddleEastCount == 0)
				{
					$(flyoutLocationCol).append('<h3>Middle East</h3>');
				}
				$(flyoutLocationList).append('<li><a href="#none">' + this.meaning + '</a></li>');
				
				count += 1;
				MiddleEastCount += 1;
				MiddleEastRemaining += 1;
				
				if(count % 8 == 0)
				{
					$(flyoutLocationCol).append(flyoutLocationList);
					$(locationsContainer).append(flyoutLocationCol);	
					flyoutLocationCol = $('<div class="col"></div>');
					flyoutLocationList = $('<ul></ul>');			
					MiddleEastRemaining = 0;
				}
				
			});		
			
			if(MiddleEastTotal < 8 && (count % 8 != 0))
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			if(MiddleEastRemaining > 0)
			{
					$(flyoutLocationCol).append(flyoutLocationList);		
					$(locationsContainer).append(flyoutLocationCol);			
			}
			
			bindLocations();
		}
		
		function locationHover()
		{
			$('.locations li a')
			.bind(
			'mouseenter',
			function(){
				$(this).addClass('hover');
			})
			.bind(
			'mouseleave',
			function() {
				$(this).removeClass('hover');
			})
		}
		
			
	}
})(jQuery);
