/*!
 * File: 		jquery.application.js
 * Author: 	twitter.com/jhw_
 */

var AHDL = AHDL || {};

AHDL.app = {
	version : '1.0.0',
	author : '@jhw_',
	theme : 'default',
	textsize: 10,
	contrast: '',
	init : function() {
		AHDL.app.methods.auiColourbars();
		AHDL.app.methods.auiNavigation();
		AHDL.app.methods.auiQuicklinksPrimary();
		AHDL.app.methods.auiPagination();
		AHDL.app.methods.auiToggleBox();
		AHDL.app.methods.auiSlideShow();
		AHDL.app.methods.auiLightBox();
		AHDL.app.methods.auiAccessibility();
		AHDL.app.methods.auiUtility();
	},
	methods : {
		auiColourbars: function() {
			
			var $MH = $('#aui-masthead');
			
			if ($MH.length > 0) {
				
				var colour = $MH.find('img#aui-masthead-image').attr("class");
				var $CO = $('#aui-content');
				$MH.addClass(colour);
				$CO.addClass(colour);

			};
			
		},
		auiNavigation: function() {
		  
		  var $N = $('#aui-navigation-primary');
		  
		  if ($N.length > 0) {
		    
		    $N.find('li.parent').hover(function() {
		      $(this).addClass('hover');
		    }, function() {
		      $(this).removeClass('hover');
		    });
		    
		    $('.theme-uk li#complex ul.child-menu-1 > li.child-1-4').after('<li class="rule">&nbsp;</li>');

		  };
		  
		},
		auiQuicklinksPrimary: function() {
			
			var $QLP = $('#aui-quicklinks-primary');
			
			if ($QLP.length > 0) {
				
				var $QL = $QLP.find('.quicklink');
				
				if ($QL.length > 1) {
				  
				  var titleMemo = '';
				  
				  $QL.each(function() {
				    var title = $(this).find('h2 a').text();
				    if (title == titleMemo) $(this).remove();
				    titleMemo = title;
				  });
				  
				  $QL = $('#aui-quicklinks-primary .quicklink');
					
					$QLP.attr({
					  "data-pos": 0,
					  "data-length": $QL.length - 1,
						"data-paused": false
					});
					
					var $ol = $('<ol id="navigation"></ol>');
					$QL.each(function(index) {
					  var title = $(this).find('h2 a').text();
						var $li = $('<li><a href="#" title="' + title + '">' + (index + 1) + '</a></li>');
						$ol.append($li);
					});
					$ol.find('li:first').addClass('first');
					$ol.find('li:last').addClass('last');
					$QLP.find('#layout-column_column-1').append($ol);
					
					$QLP.hover(function() {
						$(this).attr("data-paused", true);
					}, function() {
						$(this).attr("data-paused", false);
					});
					
					var setPos = function(pos) {
						$QLP.attr('data-pos', pos);
					};
					
					var get = function(attr) {
						return parseInt($QLP.attr('data-' + attr));
					};
					
					var nextPos = function() {
						var pos = get('pos') + 1;
						pos = (pos > get('length')) ? 0 : pos;
						setPos(pos);
					};
					
					var getColour = function() {
						var pos = get('pos');
						return $QL.eq(pos).find('img').attr('class');
					};
					
					var setColour = function() {
						var colour = getColour();
						$QLP.attr('class', colour);
						$('#aui-content').attr('class', colour);
					};
					
					var active = function() {
						var pos = get('pos');
						$QL.removeClass('active').eq(pos).addClass('active');
						$ol.find('a').removeClass('active').eq(pos).addClass('active');
						setColour();
					};

					var fade = function() {
						var pos = get('pos');
						$QL.filter('.active').fadeOut(500, function() {
							active();
							$QL.hide().eq(pos).fadeIn(500);
						});
					};
					
					active();
					
					setInterval(function () {
						if ($QLP.attr('data-paused') == "false") {
							nextPos();
							fade();
						};
					}, 6000);
					
					$ol.find('li').click(function(e) {
						e.preventDefault();
						setPos($(this).index());
						fade();
					});

				};

			};
			
		},
		auiPagination: function() {
		  
		  var $P = $('.portlet-asset-publisher');
		  
		  if ($P.length > 0) {
		    
		    $A = $P.find('.asset-abstract');
		    
		    if ($A.length > 0) {
		      
		      var dataAssets = $A.length;
		      var dataPage = 1;
		      var dataShow = 10;
		      var dataPages = Math.ceil(dataAssets/dataShow);
		      
		      $P.attr({
		        'data-assets': dataAssets,
            'data-page': dataPage,
            'data-pages': dataPages,
            'data-show': dataShow
		      });
		      
		      var $pagination = $('<div class="intra-pagination"></div>');
		      
		      var paginateAssets = function() {
		        
		        var page = $P.attr('data-page');
		        var show = $P.attr('data-show');
		        var start = (page - 1) * show;
		        var finish = (page * show) -1;
		        
		        $A.hide();
		        
		        $A.each(function(index) {
		          if (index >= start && index <= finish )  $(this).show();
		        });
		        
		      };
		      
		      var drawPagination = function() {
		        
		        var page = $P.attr('data-page');
		        var pages = $P.attr('data-pages');
		        
		        var $previous, $next;
		        
		        var $links = $('<ul></ul>');
		        
		        if (page == 1) {
		          $previous = $('<li class="linkless">Previous</li>');
		        } else {
		          $previous = $('<li class="previous"><a href="#">Previous</a></li>');
		        }
		        $links.append($previous);
		        
		        var $buttons = $('<span></span>');
		        for (var i=0; i < pages; i++) {
		          var selected = ((i+1) == page) ? ' selected' : '';
		          $buttons.append('<li class="link' + selected + '"><a href="#">' + (i+1) + '</a></li>');
		        };
		        $links.append($buttons);
		        
		        if (page == pages) {
		          $next = $('<li class="linkless">Next</li>');
		        } else {
		          $next = $('<li class="next"><a href="#">Next</a></li>');
		        }
		        $links.append($next);
		        
		        $pagination.html($links);
		        $P.find('.portlet-body').append($pagination);
		        
		      };
		      
		      var bindPagination = function() {
		        
		        var $link = $pagination.find('.link');
		        
		        $link.click(function(e) {
		          
		          e.preventDefault();
		          
		          $link.removeClass('selected');
		          $(this).addClass('selected');
		          var page = $(this).text();
		          
		          $P.attr({'data-page': page});
		          
		          paginate();
		        });
		        
		        var $previous = $pagination.find('.previous');
		        
		        $previous.click(function(e) {
		          
		          e.preventDefault();
		          
		          var page = parseInt($P.attr('data-page'));
		          var pages = parseInt($P.attr('data-pages'));
		          
		          var previous = ((page - 1) == 0) ? 1 : page - 1;
          
		          $P.attr({'data-page': previous});
		          
		          paginate();
		        });
		        
		        var $next = $pagination.find('.next');
		        
		        $next.click(function(e) {
		          
		          e.preventDefault();
		          
		          var page = parseInt($P.attr('data-page'));
		          var pages = parseInt($P.attr('data-pages'));
		          
		          var next = ((page + 1) > pages) ? pages : page + 1;
          
		          $P.attr({'data-page': next});
		          
		          paginate();
		        });
		        
		      };
		      
		      var isPaginable = function() {
		        return $P.attr('data-pages') == 1 ? false : true;
		      };
		      
		      var paginate = function() {
		        if (isPaginable()) {
		          paginateAssets();
		          drawPagination();
		          bindPagination();
		        };
		      };
		      
		      paginate();

		    };

		  };

		},
		auiToggleBox : function() {
			
			var $TB = $('.aui-toggle-box');

			if ($TB.length > 0) {

				$TB.addClass('js').eq(0).addClass('active');
				$TB.find('.box').hide().eq(0).show();
				$TB.eq(0).find('img.lead').css('width', '200px');
				$TB.find('> h3').attr('title', 'Toggle…');

				$TB.find('> h3').click(function() {
					$(this).parent().toggleClass('active').find('.box').slideToggle(300);
					var width = $(this).parent().hasClass('active') ? "200px" : "50px";
					$(this).parent().find('img.lead').stop().animate({width: width}, 300);
				});

			}
			
		},
		auiSlideShow : function() {
			
			var $SS = $('.aui-slideshow');

			if ($SS.length > 0) {

				$SS.addClass('js');

				$SS.each(function(index) {

					var $S = $(this);

					var $slides = $S.find('.wrapper a');

				  if ($slides.length > 5) {

						$S.attr({
						  "data-pos": 0,
						  "data-pages": Math.ceil(($slides.length/5) - 1)
						});

						var getPos = function() {
							return parseInt($S.attr('data-pos'));
						};

						var setPos = function(pos) {
							$S.attr('data-pos', pos);
							setPointer();
						};

						var getPages = function() {
							return parseInt($S.attr('data-pages'));
						};

						var nextPos = function() {
							var pos = getPos() + 1;
							pos = (pos > getPages()) ? 0 : pos;
							setPos(pos);
						};

						var prevPos = function() {
							var pos = getPos() - 1;
							pos = (pos < 0) ? getPages() : pos;
							setPos(pos);
						};

						var slide = function() {
							var pos = getPos();
							$S.find('.wrapper').stop().animate({left: pos * -690}, 600);
						};

						var $buttons = $('<b class="button left" title="&larr; Previous"/><b class="button right" title="Next &rarr;"/>');
						$S.append($buttons);

						$buttons.click(function() {
							if ($(this).hasClass('right')) {
								nextPos();
								slide();
							} else {
								prevPos();
								slide();
							}
						});

						var setPointer = function() {
							var pos = getPos();
							$ol.find('li').removeClass('active').eq(pos).addClass('active');
						};

						var $ol = $('<ol class="navigation group"></ol>');
						var pages = getPages();
						for (var i = 0; i <= pages; i++) {
							var width = 100 / (pages + 1);
							var start = (i * 5) + 1;
							var end = ((i * 5) + 5) > $slides.length ? $slides.length : ((i * 5) + 5);
							var range = start + " - " + end;
							var $li = $('<li style="width: ' + width + '%"><span>' + range + '</span></li>');
							$ol.append($li);
						};

						$S.append($ol);

						setPointer();

						$ol.find('li').click(function() {
							var pos = $(this).index();
							setPos(pos);
							slide();
						});

					};

				});

			}
			
		},
		auiLightBox : function() {
			
			var $LB = $('a.aui-lightbox');

			if ($LB.length > 0) {
			
				$LB.fancybox({
					'overlayColor'			: '#000',
					'overlayOpacity'   	: 0.8,
					'transitionIn'  		: 'elastic',
					'transitionOut' 		: 'elastic',
					'centerOnScroll' 		: true
				});
				
			}
			
		},
		auiAccessibility: function() {
		  
		  // textonly
		  
		  var $styleSwitcher = $('li.styleswitcher a');

    	function switchStyleButtons() {
    		var label = (AHDL.app.theme == 'default') ? 'Text Only Version' : 'Full Version';
    		$styleSwitcher.text(label).attr('title', 'Switch to ' + label);
    	}

    	if ($.cookie('CSS_THEME')) {
    		AHDL.app.theme = $.cookie('CSS_THEME');
    		$('body').addClass('theme-' + AHDL.app.theme);
    		switchStyleButtons();
    	};

    	$styleSwitcher.click(function(e) {
    	  e.preventDefault();
    		$('body').removeClass('theme-' + AHDL.app.theme);
    		AHDL.app.theme = ( AHDL.app.theme == 'default' ) ? 'text' : 'default';
    		$('body').addClass('theme-' + AHDL.app.theme);
    		switchStyleButtons();
    		$.cookie('CSS_THEME', AHDL.app.theme, {expires: 365, path: '/'});
    		return false;
    	});
    	
    	// textsize
    	
    	var $textSize = $('li.textsize');

    	if ($.cookie('CSS_TEXTSIZE')) {
    		AHDL.app.textsize = parseInt($.cookie('CSS_TEXTSIZE'));
    		$('body').addClass('textsize-' + AHDL.app.textsize);
    	} 

    	$textSize.click(function(e) {
    	  e.preventDefault();
    		$('body').removeClass('textsize-' + AHDL.app.textsize);
    		var step = ( $(this).hasClass('enlarge') ) ? 1 : -1;
    		AHDL.app.textsize = ( (AHDL.app.textsize + step) > 13 || (AHDL.app.textsize + step) < 7 ) ? AHDL.app.textsize : AHDL.app.textsize + step;
    		$('body').addClass('textsize-' + AHDL.app.textsize);
    		$.cookie('CSS_TEXTSIZE', AHDL.app.textsize, {expires: 365, path: '/'});
    		return false;
    	});
    	
    	// contrastswitcher

    	var $contrastSwitcher = $('li.contrastswitcher a');

    	function switchContrastButtons() {
    		var label = (AHDL.app.contrast == 'normal') ? 'High Contrast Version' : 'Normal Contrast Version';
    		$contrastSwitcher.text(label).attr('title', 'Switch to ' + label);
    	}

    	if ($.cookie('CSS_CONTRAST')) {
    		AHDL.app.contrast = $.cookie('CSS_CONTRAST');
    		$('body').addClass('contrast-' + AHDL.app.contrast);
    		switchContrastButtons();
    	};

    	$contrastSwitcher.click(function(e) {
    	  e.preventDefault();
    		$('body').removeClass('contrast-' + AHDL.app.contrast);
    		AHDL.app.contrast = ( AHDL.app.contrast == 'normal' ) ? 'high' : 'normal';
    		$('body').addClass('contrast-' + AHDL.app.contrast);
    		switchContrastButtons();
    		$.cookie('CSS_CONTRAST', AHDL.app.contrast, {expires: 365, path: '/'});
    		return false;
    	});
    	
		},
		auiUtility: function() {
			
			// Prototypes
			
			String.prototype.capitalise = function() {
				var words = this.split(' ');
				for (var i=0; i < words.length; i++) {
					words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1);
				};
			  return words.join(' ');
			}
			
			// Enbolden first lead paragraph after h1 tag
			
			var $p = $('.journal-content-article > h1 + p');
			if (!$p.hasClass('no-bold')) $p.addClass('first');
			
			// Asset Publisher Abstracts Date
			
			var humanDate = function(context) {
				var days = {
					Sat: "Saturday",
					Sun: "Sunday",
					Mon: "Monday",
					Tue: "Tuesday",
					Wed: "Wednesday",
					Thu: "Thursday",
					Fri: "Friday"
				}
				var months = ["January ", "February ", "March ", "April ", "May ", "June ", "July ", "August ", "September ", "October ", "November ", "December "];
				var nums = $('.metadata-publish-date', context).text();
				var d = nums.split('/');
				var year = parseInt("20" + d[2]);
				var month = parseInt(d[0] - 1);
				var day = parseInt(d[1]);
				var date = new Date(year, month, day).toDateString();
				date = date.split(' ');
				date[0] = days[date[0]];
				date[1] = months[d[0] - 1];
				date = date.join(' ');
				return '<p class="date">' + date + '</p>';
			};

			var $AA = $('.asset-abstract');
			
			if ($AA.length > 0) {
				$AA.each(function() {
					$(this).prepend(humanDate($(this)));
				});
			};
			
			var $AF = $('.asset-full-content');
			
			if ($AF.length > 0) {
				$AF.find('.journal-content-article').prepend(humanDate($AF));
			};

			// Add .aui-table classname to <table>
			
			$('.journal-content-article table').addClass('aui-table');
			
			// RSS feed
			
			var $rss = $('.portlet-asset-publisher .subscribe a .taglib-text');
			
			if ($rss.length > 0) {
				var type = $('.portlet-asset-publisher h1').text();
				$rss.html('Subscribe to the ' + type + ' <acronym title="Really Simple Syndication">RSS</acronym> feed');
			};
			
			// Capitalise tags
			
			var capitaliseTags = function(context) {
				context.each(function() {
					var tag = $(this).text().capitalise();
				  $(this).text(tag);
				});
			};
			
			var ifTags = function(context) {
				if (context.length > 0) {
					capitaliseTags(context);
				};
			};
			
			var tags = [	'.taglib-asset-tags-summary a',
										'.portlet-asset-tags-navigation li a',
										'.portlet-asset-tags-navigation li strong'];
										
			_.each(tags, function(tag) {
				ifTags($(tag));
			});
			
			// Asset Publisher H1
			
			var $tagH1 = $('h1.asset-categorization-title');
					 
			if ($tagH1.length > 0) {
			  
			  var title = $('.portlet-asset-tags-navigation .tag-list li span strong').text();
				$tagH1.html(title).addClass('tag').show();
				$('div.subscribe').remove();
				
			} else {
			  
			  var $AP = $('.portlet-asset-publisher');
			
  			if ($AP.length > 0) {
  				var title = window.document.title.split(' ');
  				if (title[0] === 'News' || title[0] === 'Recalls') $AP.find('.portlet-body').prepend('<h1>' + title[0] + '</h1>');
  			};
			  
			}

			// Remove 'News' 'Recalls' from tags
			
			var $tags = $('.taglib-asset-tags-summary a');
			
			if ($tags.length > 0) {
			  $tags.each(function() {
			    if ($(this).text() === 'News' || $(this).text() === 'Recalls') $(this).remove();
			  });
			  
			};
			
		}
	}
};

jQuery(document).ready(function($) {

	AHDL.app.init();

});
