/* ----------------------------------------------------------------------- */
/* --- START: C4 News core  ---------------------------------------------- */
/* --- Author: Tim Pascoe   ---------------------------------------------- */
/* ----------------------------------------------------------------------- */
var C4GTI = C4GTI || {};
var C4News = {};

(function() {
	if ("jQuery" in window && 'C4News' in window) { 
		
		/* Core --------------------------------------------------------------------------- */
		
		C4News.core = {

			version: "1.5 - 08/2010",
			author: "Tim Pascoe",
			siteName: "news", // default
			ie6: false,
			isMobile: false,
			c4NewsHostDomain : "",
			
			
			init : function() {
				
				/* Set Up */
				
				var tmpSiteName = $('input[name="coreSiteName"]').attr('value');
				if (tmpSiteName > ""){ C4News.core.siteName = tmpSiteName ;}
				
				var tmpLoc = document.location.href.split('/'+ C4News.core.siteName );
				C4News.core.c4NewsHostDomain = tmpLoc[0];
				
				if($.browser.msie && parseFloat($.browser.version) == 6 ){
					C4News.core.ie6 = true; 
				} 
				
				/* Clear search field */
				$("#search input").click( function() {
					$(this).attr("value", "");
					$(this).attr("style", "color: #333333;");
				});
				
				/* Print and Share */	
				$("#toolbox").each( function(){
					
					// Print page
					$("#toolbox .print a").click( function(e){
						//console.log("Print page clicked");
						//var h = window.location.href.split("#");
						//var w = window.open(h[0] + "?print=true","c4newsprinter","height=480,width=640,menubar=yes,scrollbars=yes");
						window.print();  
						e.preventDefault();
					});

					// Share via Facebook
					$("#toolbox .facebook a").click( function(e){
						//console.log("Facebook sharer clicked");
						var w = window.open($(this).attr("href"),"c4newssharer","height=350,width=640,menubar=no,toolbar=no");
						e.preventDefault();
					});
					
					// Share via Twitter
					$("#toolbox .twitter a").click( function(e){
						var w = window.open($(this).attr("href"),"c4newssharer");
						e.preventDefault();
					});
				});

			},
			
			isSupportedMobileDevice: function(){
				var devices = ['iphone','ipad','ipod','android'];
				var ua = navigator.userAgent.toLowerCase();
				var isSupported = false;
				for(var i=0; i<devices.length; i++) {
					if(ua.search(devices[i]) != -1) {
						isSupported = true;
						break;
					}
				}
				C4News.core.isMobile = isSupported;
				return isSupported;
			}

    	};
		


		/* Gravigation Menu --------------------------------------------------------------------------- */
		
		C4News.gv = {
			siteName: "news", //Default
			gvMenuLoc : "#gravigation #gvMenu",
			gvTabsLoc : "#gravigation #gvTabs", 
			gvTabsOpen: "",
			gvY : 0, /* Gravigation Menu Location from page top */
			gvPageHeight : 0,
			gvNavHeight : 43,
			gvServicePath : "/gravigation",
			gvTabContentPath : {
				gvTab1 : "categories",
				gvTab2 : "special-reports", 
				gvTab3 : "countries", 
				gvTab4 : "news-team", 
				gvTab5 : "blogs"
			},
			gvTabContentUrl : "",
			errorMessage : "Sorry we are unable to get the latest stories at this time, please try again later or click explore to go to this section", 
			debug: false,
			
			init : function() {
				
				
				/* Set Up */
				var tmpSiteName = $('input[name="coreSiteName"]').attr('value');
				if (tmpSiteName > ""){ C4News.gv.siteName = tmpSiteName;}
				
				// Belt&Braces - Get a ref page height so if the page changes we know about it
				C4News.gv.gvPageHeight = $(document).height();
				
				// Set initial postion
				C4News.gv.setGvLoc();
				C4News.gv.setNavPosition();
				
				/* Setup Events */		
				// On scrolling window
				$(window).scroll(function() { C4News.gv.setNavPosition(); });
				
				// On resizing window
				$(window).resize(function() { C4News.gv.setNavPosition(); });
				
				// Bind GV Nav

				$(C4News.gv.gvMenuLoc + ' a:not(' +C4News.gv.gvMenuLoc + ' a.home, ' +C4News.gv.gvMenuLoc + ' a.gvTweetdock)').click( function(event) {
					event.preventDefault();
					var tab = $(this).attr("class");
					C4News.gv.toggelNavBg(tab);
					C4News.gv.toggelTab(tab);
				});

				// Close Tab button
				$(C4News.gv.gvTabsLoc + ' a.closeGvTab').click( function(event) {
					event.preventDefault();
					var tab = $(this).closest("div.on").attr("id");
					C4News.gv.toggelNavBg(tab);
					C4News.gv.toggelTab(tab);
					$("#gvMenu a." + C4News.gv.gvTabsOpen).focus();
				});
				
				// Closes on use of ESC button.
				$("#gravigation #gvTabs, #newsfooter").keyup( function(event) {
					if (event.keyCode == '27') {
						C4News.gv.closeTweetdock();
						C4News.gv.closeOpenTab();
						$("#gvMenu a." + C4News.gv.gvTabsOpen).focus();
					}	
				});
				
				$("#gvMenu a.gvTweetdock").keyup( function(event) {
					if (event.keyCode == '27') {
						C4News.gv.closeTweetdock();
						C4News.gv.closeOpenTab();
					}	
				});				
				
				// Tab vs Click - Check if a user is tabing through the nav 
				
				$("#gravigation").keyup( function(event) {
					if (event.keyCode == '9') {
						$("#gravigation").addClass("tabUser");
					}	
				});
				
				$("#gravigation #gvMenu").mouseup( function(event) {

						$("#gravigation").removeClass("tabUser");
						
				});
				
				// Tweetdock
				$("#gravigation #gvMenu a.gvTweetdock").click(C4News.gv.toggleTweetdock);
				
			},
			
			closeOpenTab : function() {
				/* Close Any Open Tab */
				if (C4News.gv.gvTabsOpen) {
					C4News.gv.toggelNavBg(C4News.gv.gvTabsOpen);
					C4News.gv.toggelTab(C4News.gv.gvTabsOpen);
				}
			},				
			
			
			setGvLoc : function() {
				
				/* Set Gravigation Menu Location from page top */
				
				/* IE Problems: */
				// 1. IE doesnt consitantly report correctly the offset().top when page is dynamically resized
				// Solution - amened the grav location based apon any height diff from the page load
				// 2. IE doesnt reset the nav to relative position (when called from 'resetGv' ) and therefore the page height doesnt add up correctly
				// Solution - use ghost grav to make sure heights are correct
				
				//if ($.browser.msie){
					
					var tmpPageHeight = $(document).height();
					var tmpPageHeightDiff;
					
					// Check to see if page has changed from initial set up
					if ( C4News.gv.gvPageHeight != tmpPageHeight ) {
						
						//alert("page size has changed");
						
						if (C4News.gv.gvPageHeight > tmpPageHeight) {
							//alert("Page Size Decreased. Init Size: " + C4News.gv.gvPageHeight + " | New Size: " + tmpPageHeight );
							
							tmpPageHeightDiff = C4News.gv.gvPageHeight - tmpPageHeight;
							C4News.gv.gvY -= tmpPageHeightDiff;

						} else {
							//alert("Page Size Increased. Init Size: " + C4News.gv.gvPageHeight + " | New Size: " + tmpPageHeight );
							
							tmpPageHeightDiff = tmpPageHeight - C4News.gv.gvPageHeight; 
							C4News.gv.gvY += tmpPageHeightDiff;
							
						}
						
					} else { 
					
						// Only set if we dont have a value for the nav location
						if (C4News.gv.gvY === 0) {
							C4News.gv.gvY = $("#gravigation").offset().top;
						}

					}
					

				//} else { 
				
				//	C4News.gv.gvY = $("#gravigation").offset().top;
					
				//}
				
				// Reset to the new page height
				C4News.gv.gvPageHeight = $(document).height();

			},	
			
			setNavPosition : function() {
				
					if (C4News.gv.debug) {
						$("#gravigation #gvDebug").show().html("gvY: " + C4News.gv.gvY + " | win h: " + $(window).height() + " | doc sTop: " + $(window).scrollTop() + "<br />doc h: " + $(document).height() + " | gvPageHeight: " + C4News.gv.gvPageHeight + " | grav contain size: " + $("#gravigation").height());
					}
		
					if ($(window).height() + ($(window).scrollTop()) > (C4News.gv.gvY + C4News.gv.gvNavHeight)) {
						//moved to static position
						if ($.browser.msie) {
							$("#gravigationGhost").hide();
						}
						$('#gravigation').css({position:'relative',top:null,bottom:null}); //IMPORTANT!
					} else {
						//keep at fixed position
						if ($.browser.msie) {
							$("#gravigationGhost").show();
						}
						$('#gravigation').css({position:'fixed',top:null,bottom:0});//IMPORTANT!
					}
			
			},
			
			resetGv  : function() {
				/* Function for other pages to call after changing the page */
				
				// Position nav back into place before working out its new position on the page
				// Doesnt work for ie but our ghost grav makes sure the page height is correct
				if ($.browser.msie) {
					$("#gravigationGhost").hide();
				} else {
					$('#gravigation').css({position:'relative',top:null,bottom:null});
				}

				C4News.gv.setGvLoc();
				C4News.gv.setNavPosition();

			},
			
			toggelNavBg : function(tab) {
				// Clear all the 'on' classes
				$(C4News.gv.gvMenuLoc + ' li').removeClass("on");
				// Only turn on buttons not already open
				if (C4News.gv.gvTabsOpen != tab) {
					$(C4News.gv.gvMenuLoc + " ." + tab).closest("li").addClass("on");
				}
			},			
			
			toggelTab : function(tab) {
				
				$("#gravigation #gvTabs").css({display:"block"}); //Reset for multiple click problem

				if (C4News.gv.gvTabsOpen){
				
					if (C4News.gv.gvTabsOpen === tab){
						// Close Already Open Tab
						$(C4News.gv.gvTabsLoc + " .on").animate({height:'hide'}, 500, 'swing', function() {
							C4News.gv.gvTabsOpen = "";
						}).removeClass("on");
						
					} else {
						// Open new tab & close open tabs
						// Knock back old tab 
						$(C4News.gv.gvTabsLoc + " #" + C4News.gv.gvTabsOpen).removeClass("on").css({zIndex:98});
						
						// Open new over it and hide when animation complete
						$(C4News.gv.gvTabsLoc + " #" + tab).animate({height:'toggle'}, 500, 'swing', function() {
							$(C4News.gv.gvTabsLoc + " #" + C4News.gv.gvTabsOpen).hide();
							C4News.gv.gvTabsOpen = tab;
							C4News.gv.focusTabExploreLink();
							C4News.gv.getvContent();
						}).css({zIndex:99}).addClass("on");

					}
				
				} else {
					// Open New Tab
					$(C4News.gv.gvTabsLoc + " #" + tab).animate({height:'toggle'}, 500, 'swing', function() {
							C4News.gv.gvTabsOpen = tab;
							C4News.gv.focusTabExploreLink();
							C4News.gv.getvContent();
					}).css({zIndex:99}).addClass("on");

				}
				
			}, 
			
			focusTabExploreLink : function() {

					$("#gvTabs #" + C4News.gv.gvTabsOpen + " .gvTabExploreLink a").focus();

			},	
			

			buildUrl : function() {
				C4News.gv.gvTabContentUrl = $('body').hasClass('blog') ? ("/" + C4News.gv.siteName + C4News.gv.gvServicePath + "?tab=") : ("/" + C4News.gv.siteName + C4News.gv.gvServicePath + "/");
				switch(C4News.gv.gvTabsOpen)
					{
					case "gvTab1":
						C4News.gv.gvTabContentUrl = C4News.gv.gvTabContentUrl + C4News.gv.gvTabContentPath.gvTab1; 
					  break;
					case "gvTab2":
						C4News.gv.gvTabContentUrl =  C4News.gv.gvTabContentUrl + C4News.gv.gvTabContentPath.gvTab2; 
					  break;
					case "gvTab3":
						C4News.gv.gvTabContentUrl =  C4News.gv.gvTabContentUrl + C4News.gv.gvTabContentPath.gvTab3; 
					  break;
					case "gvTab4":
						C4News.gv.gvTabContentUrl =  C4News.gv.gvTabContentUrl + C4News.gv.gvTabContentPath.gvTab4; 
					  break;
					case "gvTab5":
						C4News.gv.gvTabContentUrl =  C4News.gv.gvTabContentUrl + C4News.gv.gvTabContentPath.gvTab5; 
					  break;
					default:
					}
			},
			
			getvContent  : function() {
				
				C4News.gv.buildUrl();
				
				var tabToUpdate = C4News.gv.gvTabsOpen; // Make sure the Ajax updates the right tab in case we have moved to another page before the response
				
				$.ajax({
					cache: false,
					url: C4News.gv.gvTabContentUrl,
					complete: function(res, status){
						if (status == "success") {
							
							$( "#" + tabToUpdate + " .gvTabContent").css({'background-image':'none'}).html(res.responseText);
		
						} else {
							
							// Error loading content
							$( "#" + tabToUpdate + " .gvTabContent").css({'background-image':'none'}).html("<span class=\"error\">" + C4News.gv.errorMessage + "</span>");
							
						}
						
					}
				});				

			},
			
			toggleTweetdock : function() {
					if($('#gvTweetdock').length === 0) {
						$(this).parent().addClass('on');
						$('#gravigation #gvTabs').after('<div id="gvTweetdock"><h3><span>Channel4 News on Twitter</span></h3><a href="#" class="close"><span>Close Newsroom Updates panel</span></a><a target="_blank" href="http://twitter.com/channel4news" class="follow" title="Follow @channel4news on Twitter"><span>Follow @channel4news</span></a><ol id="tweetContainer"></ol></div>');
						C4News.gv.getTweetdockStatuses();
						$('#gvTweetdock a.close').click(C4News.gv.toggleTweetdock);
						$('#gvTweetdock').animate({height:476});
					} else {
						$('#gvMenu li a.gvTweetdock').parent().removeClass('on');
						$('#gvTweetdock').animate({height:0},function(){
							$(this).remove();
						});
					}
					return false;
			},
			
			closeTweetdock : function() {
					if($('#gvTweetdock').length !== 0) {
						$('#gvMenu li a.gvTweetdock').parent().removeClass('on');
						$('#gvTweetdock').animate({height:0},function(){
							$(this).remove();
						});
					}
					return false;
			},
				
						
			getTweetdockStatuses : function() {
				var account = 'channel4news';
				var queryUrl = 'http://search.twitter.com/search.json?q=from%3A'+account+'&since_id=0&callback=?';
				$.getJSON(queryUrl, function(data) {
					$.each(data.results, function(index, item){
						var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
						var exp2 = /\B@([_a-z0-9]+)/ig;
						item.text = item.text.replace(exp,"<a target='_blank' href='$1'>$1</a>").replace(exp2,"<a target='_blank' href='http://twitter.com/$1'>@$1</a>"); 

						var tweet = '<li>' + item.text + '</li>';
						$('#gvTweetdock #tweetContainer').append(tweet);
					});
				});	
			}
			
	
    	};
		
		C4News.altHeader = {
			
			init: function(){
				if(C4News.core.isSupportedMobileDevice()) {
					var siteName = $('input[name="coreSiteName"]').attr('value');
					if (siteName > ""){} else { siteName = "news"; }
					
					var navHTML = '<div id="altNav"><ul id="altNavMenu" class="cufon"><li class="home"><a href="/' + siteName + '/">Home</a></li><li><a href="/' + siteName + '/categories">Categories</a></li><li><a href="/' + siteName + '/special-reports">Special Reports</a></li><li><a href="/' + siteName + '/countries">Countries</a></li><li><a href="/' + siteName + '/news-team">News Team</a></li><li><a href="http://blogs.channel4.com/news/">Blogs</a></li></ul><div id="altNavPanel"></div></div>';
					$('#newshead').after(navHTML);
					$('body').addClass('altHeader');
					Cufon.refresh('.cufon');
					/*
					// Hover functionality
					$('#altNavMenu').delegate('a', 'click', C4News.altHeader.getTabContent);
					$('body').click(function(e){
						if(e.target.id != 'altNavPanel') {
							var panel = $('#altNavPanel');
							if(panel.css('display') == 'block') {
								$('#altNavMenu li').removeClass('selected');
								panel.css('display', 'none');
								Cufon.refresh('.cufon');
							}
						}
						return;
					});
					*/
				}				
			},
			
			getTabContent: function(){
				var parent = $(this).parent();
				if(parent.hasClass('home')) {
					return;
				}
				var isAlreadySelected = parent.hasClass('selected');
				$('#altNavMenu li').removeClass('selected');
				if(isAlreadySelected) {
					$('#altNavPanel').hide();
					Cufon.refresh('.cufon');
					return false;
				}
				parent.addClass('selected');
				Cufon.refresh('.cufon');
				var sectionUrl = $(this).attr('href');
				var section = sectionUrl.replace(/\/news\//ig, '');
				var url = '/' + C4News.core.siteName + '/gravigation/' + section;
				$('#altNavPanel').empty().load(url, function(){
					var linkText = '';
					switch(section) {
						case 'news-team':
							linkText = 'meet the team';
							break;
						default:
							linkText = 'explore all ' + section.replace(/\-/ig,' ');
							break;
					}
					$(this).append('<div class="exploreLinkContainer"><a href="' + sectionUrl + '" class="exploreLink">' + linkText + '</a></div>');
				}).show();
				
				return false;
			}
		};
		
		/* Predictive Search --------------------------------------------------------------------------- */
		
		C4News.preSearch = {

			inputText : "",
			textLength : 0,
			searchOnLength : 2,
			noResults : 0,
			realNoResults : 0,
			footerCopy : "There are more than 7 results - keep typing to redefine the list",

			init : function() {
				
				$("#search #freetext").attr('autocomplete', 'off');
				$("#searchPredictor #predictorResults").html("<ul class='resultsList'></ul>");
								
				$("#search input").keyup( function(event) {
					
					C4News.preSearch.inputText = $('#search input[name="freetext"]').attr('value');
					C4News.preSearch.textLength = C4News.preSearch.inputText.length;

					if (C4News.preSearch.textLength >= C4News.preSearch.searchOnLength && event.keyCode != '27' && event.keyCode != '38' && event.keyCode != '40' ){
						
						C4News.preSearch.getPredictions();
						
					} else {
						
						C4News.preSearch.fadeResults();
						
					}
					
					/* If we decide to add extra functionality */
					/*
					if (event.keyCode == '38'){ // Key up
						//alert("up");
					}
					if (event.keyCode == '40'){ // Key down
						//alert("down");
					}
					*/
					
				});
				
				$("#search input").blur( function() { C4News.preSearch.fadeResults(); });
				
				
			}, 
			

			fadeResults : function() {
					// If search box is visible fade out
					$("#searchPredictor:visible").fadeOut('fast');		
			}, 
			
			getPredictions : function() {
				
				$('#predictorResults ul').html(""); // Clear out the old results
				
				var searchUrl = $('body').hasClass('blog') ? ("/" + C4News.core.siteName + "/c4news-predictive-search?searchText=") : (C4News.core.c4NewsHostDomain + "/" + C4News.core.siteName + "/?searchAjax=true&searchText=");

				$.getJSON( searchUrl + C4News.preSearch.inputText, 
					function(data){
						
						C4News.preSearch.noResults = data.page.results.length; // Needed now?
						C4News.preSearch.realNoResults = data.page.size; 
				
						if (C4News.preSearch.realNoResults > 0) {
						
							// Reset Results
							$('#predictorResults ul').html("");
						
							$.each(data.page.results, function(index, value){
							
								var result = '<li class="r' + index + '"><a href="#" title="' + value + '">' + value + '</a></li>';
								
								$('#predictorResults ul').append(result);
								
								// Bind links
								$("#predictorResults .r" + index + " a" ).click( function(event) {
									event.preventDefault();
									C4News.preSearch.searchFromPrediction(this);
								});
								
							});
							
							// Get real number of results from JSON
							C4News.preSearch.updateFooter();
							$("#searchPredictor:hidden").fadeIn('fast');
							
						} else {
							
							C4News.preSearch.fadeResults();
							
						}
					}
				
				);

			},
			
			searchFromPrediction : function(link) {
				
				var searchValue = $(link).attr("title");
				
				// Update the form value 
				$('#search input[name="freetext"]').attr('value', searchValue );
				
				// Submit the form
				$('#search .search-form').submit();
				
			},			
			
			updateFooter : function() {
				
				if (C4News.preSearch.realNoResults > 7) {
					$("#predictorFooter").html(C4News.preSearch.footerCopy);
				} else {
					$("#predictorFooter").html("");
				}
			} 
			
		};
		

		/* Init --------------------------------------------------------------------------- */
		
		jQuery(function($) {
			C4News.core.init();
			if (!C4News.core.ie6 && !C4News.core.isMobile) { C4News.gv.init(); } // We are not supporting the gravigation on IE6 or touch devices
			C4News.preSearch.init();
    		
 		});
	}
})();
/* ----------------------------------------------------------------------- */
