var $Y = YAHOO.util;
var $D = YAHOO.util.Dom;
var $G = YAHOO.util.Dom.get;
var $$ = YAHOO.util.Dom.getElementsByClassName;
var $El = YAHOO.util.Element;
var $E = YAHOO.util.Event;
var $K = YAHOO.util.KeyListener;
var $An = YAHOO.util.Anim;
var $M = YAHOO.util.Motion;
var $T = YAHOO.Tools;


var TIN = function() {

	return {
		/**
		 * Basic inheritance
		 */
		extendObject : function(destination, source) {
			// console.log('extendObject');
			for (var property in source) {
				destination[property] = source[property];
			};
			return destination;
		},
		
		/**
		 * mouse enter or leave
		 */
		mouseEnterOrLeave : function(event, target) {
			// console.log('mouseEnterOrLeave');
			var relatedTarget = YAHOO.util.Event.getRelatedTarget(event) ? YAHOO.util.Event.getRelatedTarget(event) : event.type === 'mouseout' ? event.toElement : event.fromElement;
			if (typeof relatedTarget === 'undefined') {
				return false;
			};
			while (relatedTarget && relatedTarget != target) {
				relatedTarget = relatedTarget.parentNode;
			};
			return (relatedTarget != target);
		}
	}
}();



var TINUI = function() {
	var modules = {}, // will contain hash of booleans, set byt the moduloe JSPs
		initialised;

	
	function exists(key) {
		if(modules[key]) return true;
		else return false;
	}
	
	/* Usage example; in module jsp, place an inline script with this line 
		TINUI.has("carousel");
	*/
	function has(key) {
		modules[key] = true;
	}
	
	return {
		/**
		* global initialise
		*/
		init : function() {
			if(!initialised){
				if (exists("promoregion")){
				 	TINUI.Promoregions.Manager.initAll();
				}
				if (exists("carousel")){
				 	TINUI.Carousels.Manager.initAll();
				}
				if (exists("ticker")){
					TIN.tickerManager();
				}
				initialised = true;
			}	
		},
		popup : function(url, w, h){
			var _popupFeatures = "menubar=false,location=false,statusbar=false,toolbar=false,resizable=false",
				_popupfpFeatures = "resizable=1,scrollbars=1",
				nw = window.open( url, "_blank", "width=" + w + ",height=" + h + "," + _popupFeatures + "," + _popupfpFeatures);
				
			nw.focus();
			return nw;
		},
		exists: exists,
		has: has
	}
}();


TINUI.Promoregions = {};
TINUI.Promoregions.Manager=function(){
	var promoregions = [];
	
	var register = function(id){
		promoregions.push({
			id 		: id
	    });
	}
	
	var initAll = function(){
		for(var i=0,len=promoregions.length;i<len;i++){
			init(promoregions[i]);
		}
	}
	
	var init = function(obj){
		new TINUI.Promoregions.promoregion(obj.id,{});
	}
	
	return {
		register 	: register,
		initAll		: initAll
	}
}();

TINUI.Promoregions.promoregion = function(container, options){
	this.container = YAHOO.util.Dom.get(container);

	this.options = TIN.extendObject({
		fireSelect : true,
		timeout : 1000,
		updateFrequency : 6000
	}, options );
	
	this.classes = {
		itemListContainer : 'fBlock',
		itemList : 'fbArticleList',
		item : 'fbArticle',
		fbLink : 'fbLink'
	};
	
	//define this here so that events are unique per promoregion
	this.events = {
		deselectItem : new YAHOO.util.CustomEvent( 'deselect' ),
		selectItem : new YAHOO.util.CustomEvent( 'select' ),
		nextItem : new YAHOO.util.CustomEvent( 'next' ),
		previousItem : new YAHOO.util.CustomEvent( 'previous' )
	};
	
	this.init();
	
	this.periodicallySwitchSelected();
}

TINUI.Promoregions.promoregion.prototype = {
	
	inlineElements : 'img, span, strong, em, abbr',
	selectedClassName : 'selected',
	firstItemClassName : 'first',
	firstItem : 0,
	
	moveFwd : function(){},
	moveBwd : function(){},
	
	init : function(){
		var firstItem;
		var lastItem;

		this.containerParent = this.container.parentNode;
		this.containerGrandparent = this.containerParent.parentNode;

		if ( this.container ) {
			
			this.itemListContainer = YAHOO.util.Dom.getElementsByClassName( this.classes.itemListContainer, 'div', this.container )[0];
			this.itemList = YAHOO.util.Dom.getElementsByClassName( this.classes.itemList, 'ul', this.container )[0];
			this.linkItems = YAHOO.util.Dom.getElementsByClassName( this.classes.fbLink, 'a', this.itemList );

			if (this.linkItems.length > 0) {
				
				this.currentItemIndex = this.firstItem;
				
				this.currentItem = this.linkItems[this.currentItemIndex];
				
				//remove the first class name from the first item this class name for non-JS users
				YAHOO.util.Dom.removeClass(this.currentItem, this.firstItemClassName);
				
				//add the selected class name to the first list element
				YAHOO.util.Dom.addClass(this.currentItem, this.selectedClassName);
				
				this.addEventHandlers();	
			}
		}
	},
	/**
	* Adds event handlers to the DOM and to custom events
	*/
	addEventHandlers : function() {

		YAHOO.util.Event.addListener( this.itemListContainer, 'mouseover', this.mouseoverContainer, this, true );
		YAHOO.util.Event.addListener( this.itemListContainer, 'mouseout', this.mouseoutContainer, this, true );
		
		YAHOO.util.Event.addListener( this.itemList, 'mouseover', this.mouseoverItemList, this, true );
		YAHOO.util.Event.addListener( this.itemList, 'mouseout', this.mouseoutItemList, this, true );
		
		//to aid accessibility
		YAHOO.util.Event.addListener( this.linkItems,'focus',this.focusLink, this, true );
		YAHOO.util.Event.addListener( this.linkItems,'blur',this.blurLink, this, true );
		
		this.events.selectItem.subscribe( this.selectItem, this, true );
		
	},
	/**
	* Handles the focus event on a link
	* @param {Object} event The event object
	*/
	focusLink : function( event ) {
		this.clearTimer();
		
		this.target = YAHOO.util.Event.getTarget( event );
		var nodeName = this.target.nodeName.toLowerCase();
		if ( this.inlineElements.indexOf( nodeName ) > -1 ) {
			this.target = YAHOO.util.Dom.getAncestorByTagName( this.target, 'a' ) || this.target;
		};
		
		if(this.options.fireSelect){
			if ( this.target.nodeName.toLowerCase() === 'a' ) {
				this.events.selectItem.fire( this.target );
			};
		}
		YAHOO.util.Event.preventDefault( event );
	},
	/**
	* Handles the blur event on link
	* @param {Object} event The event object
	*/
	blurLink : function( event ) {
		this.periodicallySwitchSelected();
	},
	/**
	* Handles the mouseover event on the itemList DOM element
	* @param {Object} event The event object
	*/
	mouseoverItemList : function( event ) {
		//console.log( 'mouseoverItemList' );
		this.target = YAHOO.util.Event.getTarget( event );
		var nodeName = this.target.nodeName.toLowerCase();
		if ( this.inlineElements.indexOf( nodeName ) > -1 ) {
			this.target = YAHOO.util.Dom.getAncestorByTagName( this.target, 'a' ) || this.target;
		};
		
		if(this.options.fireSelect){
			if ( this.target.nodeName.toLowerCase() === 'a' ) {
				if ( TIN.mouseEnterOrLeave( event, this.target ) ) {
					this.events.selectItem.fire( this.target );
				};
			};
		}
		YAHOO.util.Event.preventDefault( event );
	},

	/**
	* Handles the mouseout event on the itemList DOM element
	* @param {Object} event The event object
	*/
	mouseoutItemList : function( event ) {
		//console.log( 'mouseoutItemList' );
		this.target = YAHOO.util.Event.getTarget( event );
		var nodeName = this.target.nodeName.toLowerCase();
		if ( this.inlineElements.indexOf( nodeName ) > -1 ) {
			this.target = YAHOO.util.Dom.getAncestorByTagName( this.target, 'a' ) || this.target;
		};
		if(this.options.fireSelect){
			if ( this.target.nodeName.toLowerCase() === 'a' ) {
				if ( TIN.mouseEnterOrLeave( event, this.target ) ) {
					this.events.deselectItem.fire( this.target );
				};
			};
		}
		YAHOO.util.Event.preventDefault( event );
	},
	/**
	* Handles the mouseover event on the container DOM element
	* @param {Object} event The event object
	*/
	mouseoverContainer : function( event ) {
		if ( TIN.mouseEnterOrLeave( event, this ) ) {
			this.clearSelected();
			this.clearTimer();
		};
	},
	/**
	* Handles the mouseout event on the container DOM element
	* @param {Object} event The event object
	*/
	mouseoutContainer : function( event ) {	
		if ( TIN.mouseEnterOrLeave( event, this ) ) {
			YAHOO.util.Dom.addClass(this.currentItem, this.selectedClassName);
			this.periodicallySwitchSelected();
		};
	},
	/**
	* Move to the next item in the promo region
	*/
	moveNext : function() {	
		if(this.currentItemIndex + 1 < this.linkItems.length){
			this.currentItemIndex += 1;
		}else{
			this.currentItemIndex = 0;
		}
		
		this.currentItem = this.linkItems[this.currentItemIndex];
		
		//remove the selected class name from items in the list
		this.clearSelected();
		
		//add the selected class name to the current item
		this.highlightCurrentItem();	
	},
	/**
	* Select an Item
	*/
	selectItem : function( event, obj ) {
		
		this.clearSelected();
		this.currentItem = obj;
		this.highlightCurrentItem();	
	},
	/**
	* Hilight current item
	*/
	highlightCurrentItem : function() {
		//add the selected class name to the current item
		YAHOO.util.Dom.addClass(this.currentItem, this.selectedClassName);	
	},
	/**
	* Clears the selected item class from all items
	*/
	clearSelected : function() {
		//remove the selected class name from items in the list
		for(var i=0,len=this.linkItems.length;i<len;i++){
			YAHOO.util.Dom.removeClass(this.linkItems[i], this.selectedClassName);
		}
	},
	/**
	* Clears the timer
	*/
	clearTimer : function() {
		clearTimeout( this.timer );
		this.timer = null;
	},
	/**
	* Switch highlighted item
	*/
	periodicallySwitchSelected : function()	{	
		if ( this.timer != null ) {
			this.clearTimer.call(this);
		}
		var that = this;
		this.timer = setTimeout(proxyFunc, this.options.updateFrequency);
		function proxyFunc(){
			that.moveNext();
			that.periodicallySwitchSelected();
		}
	}
}





TINUI.Carousels = {};
TINUI.Carousels.Manager=function(){
	var carousels = [];
	
	var register = function(id, type){
		carousels.push({
			id 		: id,
			type 	: type
	    });
	}
	
	var initAll = function(){
		for(var i=0,len=carousels.length;i<len;i++){
			init(carousels[i]);
		}
	}
	
	var init = function(obj){
	
	 	var ancestor = YAHOO.util.Dom.getAncestorByClassName  ( obj.id , 'narrowSection' );
	 
	 	if (YAHOO.lang.isNull(ancestor)){
	 		
	 		//Select Orientation by config
	 		switch(obj.type){
	 		
				case'horizontalPromoCarousel':
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						rolloverScrollButtons : false
					});
					break;
					
				case'horizontalEventThisWeek':
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						staticCarousel : true,
						randomStartPos : true
					});
					break;
					
				case'horizontalLocalBusinesses':
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						staticCarousel : true,
						randomStartPos : true
					});
					break;
					
				case'horizontalLocalProperty':
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						staticCarousel : true,
						randomStartPos : true,
						rolloverScrollButtons : true
					});
					break;
					
				case'horizontalLocalMotors':
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						staticCarousel : true,
						randomStartPos : true,
						rolloverScrollButtons : true
					});
					break;
					
				case'horizontalHypPreview':
					//Vertical
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						rolloverScrollButtons : true
					});
					break;
					
				case'verticalHypPreview':
					//Vertical
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'vertical',
						rolloverScrollButtons : true
					});
					break;
					
				case'horizontal':
					//Vertical
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal'
					});
					break;
					
				case'vertical':
					//Vertical
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'vertical'
					});
					break;
					
				default:
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{});
					break;
	 		}	
	 	}else{
	 		//Select Orientation by checking parent classname
	 		//Vertical
				new TINUI.Carousels.carousel(obj.id,{
					orientation:'vertical'
				});
	 	}
	 	
	}
	
	return {
		register 	: register,
		initAll		: initAll
	}
}();


TINUI.Carousels.carousel = function(container, options){
	this.container = YAHOO.util.Dom.get(container);

	this.options = TIN.extendObject({
		orientation : 'horizontal',
		staticCarousel : false,
		randomStartPos : false,
		rolloverScrollButtons : false,
		timeout : 1000,
		updateFrequency : 6000,
		scrollMethod : YAHOO.util.Easing.easeOut,
		scrollDuration : 1
	}, options );
	
	this.classes = {
		scroller : 'scroller',
		itemList : 'itemlist',
		pagingControls : 'paging-controls',
		carouselLink : 'cLink'
	};
	
	
	//define this here so that events are unique per carousel
	this.events = {
		deselectItem : new YAHOO.util.CustomEvent( 'deselect' ),
		selectItem : new YAHOO.util.CustomEvent( 'select' ),
		nextItem : new YAHOO.util.CustomEvent( 'next' ),
		previousItem : new YAHOO.util.CustomEvent( 'previous' )
	};
	
	this.init();
	if(this.options.staticCarousel == false){
		this.periodicallyScroll();
	}
	if(this.options.randomStartPos == true){
		var randomnumber = Math.floor(Math.random()*11);
		for(var j=0; j<randomnumber+2; j++){
			this.scrollTo('previous', false);
		}
	}
}

TINUI.Carousels.carousel.prototype = {
	
	inlineElements : 'img, span, strong, em, abbr',
	
	moveFwd : function(){},
	moveBwd : function(){},
	
	init : function(){
		var firstItem;
		var lastItem;

		this.currentGalleryFrame = 0;
		
		this.containerParent = this.container.parentNode;
		this.containerGrandparent = this.containerParent.parentNode;

		if ( this.container ) {
			
			this.scroller = YAHOO.util.Dom.getElementsByClassName( this.classes.scroller, 'div', this.container )[ 0 ];
			this.itemList = YAHOO.util.Dom.getElementsByClassName( this.classes.itemList, 'ul', this.scroller )[ 0 ];
			this.items = YAHOO.util.Dom.getChildren( this.itemList );
			this.linksInItems =  YAHOO.util.Dom.getElementsByClassName( this.classes.carouselLink, 'a', this.itemList );
			
			this.pagingControls = YAHOO.util.Dom.getElementsByClassName( this.classes.pagingControls, 'div', this.container )[ 0 ];

			if (this.items.length > 0) {
				this.currentItem = YAHOO.util.Dom.getNextSibling( YAHOO.util.Dom.getFirstChild( this.itemList ) );
				this.addEventHandlers();	
			}
		}
		//YAHOO.util.Dom.insertAfter( YAHOO.util.Dom.getNextSibling( YAHOO.util.Dom.getFirstChild( this.itemList ) ).cloneNode( true ), YAHOO.util.Dom.getLastChild( this.itemList ) );
		//YAHOO.util.Dom.insertBefore( YAHOO.util.Dom.getPreviousSibling( YAHOO.util.Dom.getLastChild( this.itemList ) ).cloneNode( true ), YAHOO.util.Dom.getFirstChild( this.itemList ) );
		
	},
	/**
	* Adds event handlers to the DOM and to custom events
	*/
	addEventHandlers : function() {
		// console.log( 'addEventHandlers' );
		YAHOO.util.Event.addListener( this.container, 'mouseover', this.mouseoverContainer, this, true );
		YAHOO.util.Event.addListener( this.container, 'mouseout', this.mouseoutContainer, this, true );
		YAHOO.util.Event.addListener( this.itemList, 'mouseover', this.mouseoverItemList, this, true );
		YAHOO.util.Event.addListener( this.itemList, 'mouseout', this.mouseoutItemList, this, true );

		//to aid accessibility
		YAHOO.util.Event.addListener(this.linksInItems,'focus',this.focusCLink, this, true );
		YAHOO.util.Event.addListener(this.linksInItems,'blur',this.blurCLink, this, true );
		
		YAHOO.util.Event.addListener(document.body, 'scroll', this.scrollListener, this, true);

		if ( this.pagingControls ) {
			this.events.nextItem.subscribe( this.scrollTo, this, true );
			this.events.previousItem.subscribe( this.scrollTo, this, true );
			YAHOO.util.Event.addListener( this.pagingControls, 'click', this.clickPagingControls, this, true );
		};
	},
	/**
	* Handles the focus event on a link in the moving carousel
	* @param {Object} event The event object
	*/
	focusCLink : function( event ) {

		this.clearTimer();

		if ( this.scrolling ) {
			this.wasScrolling = true;
		};

	},
	/**
	* Handles the mouseout event on the container DOM element
	* @param {Object} event The event object
	*/
	blurCLink : function( event ) {

			if(this.options.staticCarousel == false){
				this.periodicallyScroll();
			}

			if ( this.wasScrolling ) {
				this.wasScrolling = false;
			};
			//YAHOO.util.Dom.setXY( this.itemList, this.itemListOffset );
	},
	/**
	* Handles the mouseover event on the container DOM element
	* @param {Object} event The event object
	*/
	mouseoverContainer : function( event ) {
		//console.log( 'mouseoverContainer' );
		if ( TIN.mouseEnterOrLeave( event, this ) ) {
			this.clearTimer();
			if(this.options.rolloverScrollButtons == true){
				this.showControls();
			}
			if ( this.scrolling ) {
				this.wasScrolling = true;
			};
		};
	},
	/**
	* Handles the mouseout event on the container DOM element
	* @param {Object} event The event object
	*/
	mouseoutContainer : function( event ) {
		//console.log( 'mouseoutContainer' );
		if ( TIN.mouseEnterOrLeave( event, this ) ) {
			if(this.options.staticCarousel == false){
				this.periodicallyScroll();
			}
			if(this.options.rolloverScrollButtons == true){
				this.hideControls();
			}
			if ( this.wasScrolling ) {
				this.wasScrolling = false;
			};
		};
	},
	/**
	* Handles the mouseover event on the itemList DOM element
	* @param {Object} event The event object
	*/
	mouseoverItemList : function( event ) {
		//console.log( 'mouseoverItemList' );
		this.target = YAHOO.util.Event.getTarget( event );
		var nodeName = this.target.nodeName.toLowerCase();
		if ( this.inlineElements.indexOf( nodeName ) > -1 ) {
			this.target = YAHOO.util.Dom.getAncestorByTagName( this.target, 'a' ) || this.target;
		};
		
		if(this.options.fireSelect){
			if ( this.target.nodeName.toLowerCase() === 'a' ) {
				if ( TIN.mouseEnterOrLeave( event, this.target ) ) {
					this.events.selectItem.fire( this.target );
				};
			};
		}
		YAHOO.util.Event.preventDefault( event );
	},

	/**
	* Handles the mouseout event on the itemList DOM element
	* @param {Object} event The event object
	*/
	mouseoutItemList : function( event ) {
		//console.log( 'mouseoutItemList' );
		this.target = YAHOO.util.Event.getTarget( event );
		var nodeName = this.target.nodeName.toLowerCase();
		if ( this.inlineElements.indexOf( nodeName ) > -1 ) {
			this.target = YAHOO.util.Dom.getAncestorByTagName( this.target, 'a' ) || this.target;
		};
		if(this.options.fireSelect){
			if ( this.target.nodeName.toLowerCase() === 'a' ) {
				if ( TIN.mouseEnterOrLeave( event, this.target ) ) {
					this.events.deselectItem.fire( this.target );
				};
			};
		}
		YAHOO.util.Event.preventDefault( event );
	},
	
	
	/**
	* Handles the click event on the pagingControls DOM element
	* @param {Object} event The event object
	*/
	clickPagingControls : function( event ) {
		// console.log( 'clickPagingControls' );
		this.target = YAHOO.util.Event.getTarget( event );
		var nodeName = this.target.nodeName.toLowerCase();
		
		if ( this.inlineElements.indexOf( nodeName ) > -1 ) {
			this.target = YAHOO.util.Dom.getAncestorByTagName( this.target, 'a' ) || this.target;
		};
		
		if ( this.target.nodeName.toLowerCase() === 'a' ) {
			if ( YAHOO.util.Dom.hasClass( this.target, 'next' ) ) {
				this.events.nextItem.fire();
			}
			else if ( YAHOO.util.Dom.hasClass( this.target, 'previous' ) ) {
				this.events.previousItem.fire();
			};
		};

		YAHOO.util.Event.preventDefault( event );
	},

	/**
	* Scrolls the carousel based on the type of scroll
	* @param {Object} type The type of scroll, 'next' or 'previous'
	*/
	scrollTo : function( type, animate ) {
		
		if ( this.scrolling ) {
			if ( this.scrolling.isAnimated() ) {
				this.scrolling.stop();
			};
		};

		this.scrollerOffset = YAHOO.util.Dom.getXY( this.scroller );

		this.itemListOffset = YAHOO.util.Dom.getXY( this.itemList );

		if ( type === 'next' ) {
			
			this.moveFwd();			
			this.currentItem = YAHOO.util.Dom.getNextSibling( this.currentItem );
			this.organiseItems = this.organiseItemsFwd;
			
		} else if ( type === 'previous' ) {
			this.moveBwd();
			this.currentItem = YAHOO.util.Dom.getPreviousSibling( this.currentItem );
			this.organiseItems = this.organiseItemsBwd;
		};

		this.itemOffset = YAHOO.util.Dom.getXY( this.currentItem );
		
		if ( this.options.orientation === 'horizontal' ) {
			this.scrollDistance = this.itemOffset[ 0 ] - this.scrollerOffset[ 0 ];
			this.attributes = {
				points : {
					by : [ - this.scrollDistance, 0 ]
				}
			};
		} else if ( this.options.orientation === 'vertical' ) {
			this.scrollDistance = this.itemOffset[ 1 ] - this.scrollerOffset[ 1 ];
			this.attributes = {
				points : {
					by : [ 0, - this.scrollDistance ]
				}
			};
		};
		if(animate === false){
			this.organiseItems();
		}else{
			this.scrolling = new YAHOO.util.Motion( this.itemList, this.attributes, this.options.scrollDuration, this.options.scrollMethod );
			this.scrolling.onComplete.subscribe( this.organiseItems, this, true );
			this.scrolling.animate();	
		}
	},
	
	
	organiseItemsFwd : function() {
		//remove events from the node before removing it
		YAHOO.util.Event.purgeElement(YAHOO.util.Dom.getFirstChild( this.itemList ), true);
		
		this.itemList.removeChild( YAHOO.util.Dom.getFirstChild( this.itemList ) );
		YAHOO.util.Dom.insertAfter( YAHOO.util.Dom.getNextSibling( YAHOO.util.Dom.getFirstChild( this.itemList ) ).cloneNode( true ), YAHOO.util.Dom.getLastChild( this.itemList ) );
		
		//add events to new node
		var listEl = YAHOO.util.Dom.getLastChild( this.itemList );
		var linksInlistEl =  YAHOO.util.Dom.getElementsByClassName( this.classes.carouselLink, 'a', listEl );
		YAHOO.util.Event.addListener(linksInlistEl, 'focus', this.focusCLink, this, true );
		YAHOO.util.Event.addListener(linksInlistEl, 'blur', this.blurCLink, this, true );
		
		YAHOO.util.Dom.setXY( this.itemList, this.itemListOffset );
	},
	
	organiseItemsBwd : function() {
		//remove events from the node before removing it
		YAHOO.util.Event.purgeElement(YAHOO.util.Dom.getLastChild( this.itemList ), true);
		
		this.itemList.removeChild( YAHOO.util.Dom.getLastChild( this.itemList ) );
		YAHOO.util.Dom.insertBefore( YAHOO.util.Dom.getPreviousSibling( YAHOO.util.Dom.getLastChild( this.itemList ) ).cloneNode( true ), YAHOO.util.Dom.getFirstChild( this.itemList ) );
		
		//add events to new node
		var listEl = YAHOO.util.Dom.getFirstChild( this.itemList );
		var linksInlistEl =  YAHOO.util.Dom.getElementsByClassName( this.classes.carouselLink, 'a', listEl );
		YAHOO.util.Event.addListener(linksInlistEl, 'focus', this.focusCLink, this, true );
		YAHOO.util.Event.addListener(linksInlistEl, 'blur', this.blurCLink, this, true );
		
		YAHOO.util.Dom.setXY( this.itemList, this.itemListOffset );
	},
	/**
	* Clears the timer
	*/
	clearTimer : function() {
		// console.log( 'clearTimer' );
		clearTimeout( this.timer );
		this.timer = null;
	},
	/**
	* Show Controls
	*/
	showControls : function() {
		this.pagingControls.style.display = 'block';
	},
	/**
	* Hide Controls
	*/
	hideControls : function() {
		this.pagingControls.style.display = 'none';
	},
	periodicallyScroll : function()	{
		if ( this.timer != null ) {
			this.clearTimer.call(this);
		}
		var that = this;
		this.timer = setTimeout(proxyFunc, this.options.updateFrequency);
		function proxyFunc(){
			that.scrollTo('next');
			that.periodicallyScroll();
		}
	}
}









TIN.JsUtils = function(){
	// Public members
	return {
        htmlDecode : function(value) {
            return !value ? value : String(value).replace(/&amp;/g, "&").replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&quot;/g, '"').replace(/&apos;/g, '\'');
        },
		// Parse & run javascript from the supplied URL and then execute the supplied function
		dynamicLoadJs : function(jsUrl, callbackFunc) {
			var newScript = document.createElement("script");
			newScript.type = "text/javascript";
			if(callbackFunc != null) {	
				if(newScript.addEventListener) {
					// Non-broken browsers
					newScript.addEventListener("load", callbackFunc, false)
				} else if(newScript.attachEvent) {
					// IE
					newScript.onreadystatechange = function() {
						if(this.readyState == "complete") {
							callbackFunc.call(this);
						}
					}
				}
			}
			newScript.src = jsUrl;
			var headEle = document.getElementsByTagName("head")[0];
			headEle.appendChild(newScript);
		},
        getWeather : function() {
            WeatherAjaxController.getWeather(function(netWeatherVO) {
				var navWeather = document.getElementById("topNavWeather");
				var weatherHTML = '<div class="icon"><a title="'+netWeatherVO.maxTempImage+' - Click for 5 day forecast" href="/weather"><img src="/images/shared/iconsLand/48/bgwhite/'+netWeatherVO.maxTempImage+'.png" alt="Todays forecast is '+netWeatherVO.maxTempImage+'" /></a></div>';
				weatherHTML += '<div class="temps"><em class="tpHI" title="Max temperature">'+netWeatherVO.maxDayTimeTemp+'&deg;C</em><em class="tpLO" title="Min temperature">'+netWeatherVO.lowCelcius+'&deg;C</em></div>';
				weatherHTML += '<p class="time">'+TIN.TodaysDate();+'</p>';
				if(navWeather){
					navWeather.innerHTML = weatherHTML;	
				}		
            });
        },
		readUserDetailsFromCookie : function () {
			var cookieValue = TIN.Cookie.read("userDetails");
			if (cookieValue != null && cookieValue != '') {
				//remove quotes. TCServer encloses cookie details in double quotes
				if (cookieValue.length > 1 && cookieValue.charAt(0) == '"' && cookieValue.charAt(cookieValue.length - 1) == '"') {
					cookieValue = cookieValue.substring(1, cookieValue.length - 1);
	           	}
				var userDetailsArray =  cookieValue.split('|');
				var userDetailsObj = {
					// cookie format : userId|firstname|surname|email|authid|username
					userId:userDetailsArray[0],
					firstname:userDetailsArray[1],
					surname:userDetailsArray[2],
					email:userDetailsArray[3],
					authid:userDetailsArray[4],
					username:userDetailsArray[5]
				};
				
				if (userDetailsObj.firstname == 'null') {
				    userDetailsObj.firstname = '';
				}
				if (userDetailsObj.username == 'null') {
				    userDetailsObj.username = '';
				}
				
				return  userDetailsObj;
			}
			
			return null; 
		},
		logout : function logout() {
			TIN.Cookie.erase("userDetails");
	        var firstnameSpan = document.getElementById('userFirstNameSpan');
	        firstnameSpan.innerHTML="GUEST";
			var loginLogoutLinkAnchor = document.getElementById('loginLogoutLinkAnchor');
	        loginLogoutLinkAnchor.setAttribute("href", loginUrl);
	        loginLogoutLinkAnchor.innerHTML="Login";
			
			var strHref = new String(window.location.href);
			if(strHref.indexOf('?authid=')!=-1) {
				strHref = strHref.substring(0,strHref.indexOf('?authid='));
			} else if(strHref.indexOf('&authid=')!=-1) {
				strHref = strHref.substring(0,strHref.indexOf('&authid='));
			}
			
			window.location = strHref;
		}  
	};
}();


TIN.Cookie = function(){
	// Public members
	return {
        create : function(name, value, days){
			if (days){
				var date = new Date();
				date.setTime(date.getTime()+(days*24*60*60*1000));
				var expires = "; expires="+date.toGMTString();
			}else{
				var expires = "";
			}
			document.cookie = name+"="+value+expires+"; path=/";
		},
        read : function(name){
			var nameEQ = name + "=";
			var ca = document.cookie.split(';');
			for(var i=0;i < ca.length;i++) {
				var c = ca[i];
				while (c.charAt(0)==' ') c = c.substring(1,c.length);
				if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
			}
			return null;
		},
		erase : function(name){
			document.cookie = name + "=; expires=Thu, 01-Jan-70 00:00:01 GMT" + ";path=/";
		}
	}
}();


//todo make part of tin.poll
var pollsArr = new Array();

TIN.Poll = function(){
	// Public members
	return {
        updatePollDivWithResult : function(result, divsuffix) {
	        if ((null!=result)&&(null!=result.answers)) {
	            if (document.getElementById('pollquestion'+result.id+divsuffix)) {
	
	                var pollQuestionDiv = document.getElementById('pollquestion'+result.id+divsuffix);
	                var pollOptionsDiv = document.getElementById('polloptions'+result.id+divsuffix);
	                var pollFooterDiv = document.getElementById('pollfooter'+result.id+divsuffix);
	                var newHtml = "";
	                for(i=0;i<result.answers.length;i++) {
	                    newHtml += "<p>" + result.answers[i].percentage + "\%\: " + result.answers[i].answerText + "</p>";
	                    newHtml += "<div title='" + result.answers[i].percentage + "\%\ indicator' class='indicator'><div class='indicatorBar' style='width:" + result.answers[i].percentage + "\%\;'></div></div>";
	                }
	                pollQuestionDiv.innerHTML="<p class=\"question\">Results for: " + result.questionText + "</p>";;
	                pollOptionsDiv.innerHTML=newHtml;
					if (result.showResults) {
		                pollFooterDiv.innerHTML="<p>" + result.totalResponse + " votes cast.</p><p class='thanks'>Thank you for your vote</p>";
					}
	            }
	        }
	    },
        saveAnswer : function (pollId, answer, divsuffix, button) {
	        for(i=0; i<answer.length; i++) {
	            if(answer[i].checked) {
		        	if(button){
		        		button.disabled=true;
		        	}
	                PollAjaxController.vote(pollId, answer[i].value, function (result) {
				        TIN.Cookie.create("pollVoted-" + pollId, "true", 100);
						TIN.Poll.updatePollDivWithResult(result, divsuffix);
					});
	                break;
	            }
	        }
	    },
		updateResult : function (pollId, expired, divsuffix) {
	        var cookieValue = TIN.Cookie.read("pollVoted-" + pollId);
			if (cookieValue != null && cookieValue != '' || expired != undefined && expired) {
				PollAjaxController.getResult(pollId, function(result) {
					TIN.Poll.updatePollDivWithResult(result, divsuffix);
				});
			}
		},
		alreadyAnswered : function (pollId, expired) {
	        var cookieValue = TIN.Cookie.read("pollVoted-" + pollId);
			if (cookieValue != null && cookieValue != '' || expired != undefined && expired) {
				return true;
			}else{
				return false;
			}
		}
	}
}();



TIN.Article = function(){
	// Public members
	return {
        comment : function(articleId, resultsDivName) {
			AjaxArticleCommentHelper.comment(articleId, function(result) {
				resultsDiv = document.getElementById(resultsDivName);
				resultsDiv.innerHTML = "Thank you for your comment";
			});
		}
	}
}();


TIN.ImagePager = function(){
	this.lastItem = 0;
	this.activeItem = 0;
	this.clickItem = function updateImagePager(clickedItem){
		this.activeItem = clickedItem;
		//previous and next links can make circular list
		if(this.activeItem < 0){
			this.activeItem = this.imageUrls.length - 1; //Previous button
		}
		if(this.activeItem > this.imageUrls.length - 1){
			this.activeItem = 0; //Next button
		}
		//swap the image
		this.swapImage();

		var startIndex = Number(this.activeItem);
		var endIndex = Number(this.activeItem+2);
		var totalImages = this.imageUrls.length;
		
		if (totalImages <= 3) {
			startIndex = 1;
			endIndex = totalImages;
		}
		else {
		
			if (Number(this.activeItem) <= 1) {
				startIndex = 1;
				endIndex = 3;
			}
			if (Number((this.activeItem + 1)) >= Number(totalImages - 1)) {
				startIndex = Number(totalImages - 2);
				endIndex = totalImages;
			}
		}
		
		digitDiv = document.getElementById('pageDigitSpan');
		var digitHtml="";
		for(i=Number(startIndex);i<=Number(endIndex);i++) {
			if(i==Number(this.activeItem+1)) {
		    	digitHtml = digitHtml + "&nbsp;<span class=\"currentPage\">" + i + "</span>";
			} else {
	            digitHtml = digitHtml + "&nbsp;<a onclick=\"Pager1.clickItem(" + Number(i-1) + ");\">" +i+ "</a>";  
			}			
		}
		digitDiv.innerHTML = digitHtml;

	};
	this.swapImage = function imageSwap() {
		var i =document.getElementById(this.imageTargetId);
		i.src = this.imageUrls[this.activeItem];
		i.setAttribute("alt",this.imageAltTags[this.activeItem]);
		document.getElementById('mainImageCaption').innerHTML=TIN.JsUtils.htmlDecode(this.imageCaptions[this.activeItem]);
	};	
	this.imageUrls = [];
	this.imageCaptions = [];
	this.imageAltTags = [];
	this.imageTargetId = "";
	return true;
};

TIN.TodaysDate = function(){
	
    var now = new Date();
    var days = new Array(
      'Sun','Mon','Tue',
      'Wed','Thur','Fri','Sat');
    var months = new Array(
      'Jan','Feb','Mar','Apr','May',
      'Jun','Jul','Aug','Sep','Oct',
      'Nov','Dec');
    var date = ((now.getDate()<10) ? "0" : "")+ now.getDate();
    var today =  days[now.getDay()] + ", " +
       months[now.getMonth()] + " " +
       date + ", " +
       now.getFullYear();
	return today;
	
}

TIN.setValAndSubmit = function(formEl, el,val,doOffSet) {
	document.getElementById(el).value = val;
	if (doOffSet) {
		document.getElementById('pageOffset').value = '1';
	}
	document.getElementById(formEl).submit();
}

TIN.checkRadio = function(radioEl) {
	var radioEl = document.getElementById(radioEl);
	radioEl.checked = true;
}

TIN.toggleDisplay = function(el){
	//element to toggle display of
	var element = document.getElementById(el);
	if(element){
		if(element.style.display=='none'){
			//if hidden then show
			element.style.display='block';
		} else {
			//if shown then hide
			element.style.display='none';
		}
	}
}

TIN.toggleClassFromTagClass = function(classToggle1, classToggle2, tagName, classToFind){
	if(typeof(YAHOO) != 'undefined'){
		var elements = YAHOO.util.Dom.getElementsByClassName(classToFind, tagName)
		for (var i in elements){
			if(YAHOO.util.Dom.hasClass(elements[i], classToggle1)){
				YAHOO.util.Dom.replaceClass  ( elements[i] , classToggle1 , classToggle2 ) 
			}else{
				YAHOO.util.Dom.replaceClass  ( elements[i] , classToggle2 , classToggle1 ) 
			}
		}
	}
}

TIN.toggleLink = function(linkEl, linkTextState1, linkTextState2, state1testRE){
	//the link element to toggle the contents of 
	if(linkEl){
		var re = new RegExp(state1testRE);
		if ( linkEl.innerHTML.match(re) ){
			linkEl.innerHTML = linkTextState2;
		} else {
			linkEl.innerHTML = linkTextState1;
		}
	}
}

TIN.toggleEvtDateDisplay = function(classToggle1, classToggle2, tagName, classToFind, linkEl, linkTextState1, linkTextState2, state1testRE){
	//toggle dates display
	TIN.toggleClassFromTagClass(classToggle1, classToggle2, tagName, classToFind);
	//toggle link display
	TIN.toggleLink(linkEl, linkTextState1, linkTextState2, state1testRE);
}

TIN.navMoreLess = function(navSection, linkEl, linkTextState1, linkTextState2, state1testRE){
	//toggle section display
	TIN.toggleDisplay(navSection);
	//toggle link display
	TIN.toggleLink(linkEl, linkTextState1, linkTextState2, state1testRE);
}


TIN.filmWidget = function() {
	
	var HasWMP11 = false;
	var HasWMP = false;
	var videoMimeType = 'application/x-mplayer2';//WMP 6+
	var trailerBoxEl = null;
	var trailerButEl = null;
	var w = '584';
	var h = '360';
	var html = '';
	var buttonHide = '';
	var buttonShow = '';
	
	return {
		init : function(url){
			for(var i=0; i<navigator.plugins.length; i++){
				if (navigator.plugins[i].description == 'np-mswmp'){
					//Media player 11 is available
					HasWMP11 = true;
				}
				if (navigator.plugins[i].description == 'Npdsplay dll'){
					//Media player is available
					HasWMP = true;
				}
			}
			if(HasWMP11 == true){
				videoMimeType = 'application/x-ms-wmp';//WMP 11 can use stretchToFit
			}
			html = '<object classid="CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6" type="application/x-oleobject" width="'+w+'" height="'+h+'" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715" standby="Loading Microsoft Windows Media Player components...">'+
				'<param name="url" value="'+url+'">'+
				'<param name="autostart" value="1">'+
				'<param name="ShowStatusBar" value="0">'+
				'<param name="volume" value="100">'+
				'<param name="autosize" value="1">'+
				'<param name="displaysize" value="1">'+
				'<param name="stretchToFit" value="1">'+
				'<![if !IE]>'+
					'<object width="'+w+'" height="'+h+'" type="'+videoMimeType+'">'+
						'<param name="fileName" value="'+url+'">'+
						'<param name="autostart" value="1">'+
						'<param name="ShowStatusBar" value="0">'+
						'<param name="volume" value="100">'+
						'<param name="autosize" value="1">'+
						'<param name="displaysize" value="1">'+
						'<param name="stretchToFit" value="1">'+
					'</object>'+
				'<![endif]>'+
			'</object>'
			buttonHide = '<div class="icn24 video24"></div><a id="hideTrailer" onClick="TIN.filmWidget.closeTrailer();" class="trailer hide" type="trailer" name="hideTrailer">Hide Trailer</a>';
			buttonShow = '<div class="icn24 video24"></div><a id="showTrailer" onClick="TIN.filmWidget.openTrailer();" class="trailer show" type="trailer" name="showTrailer">Show Trailer</a>';
		},
		showTrailerButton : function(){	
			trailerButEl = document.getElementById('trailerBut');
			if(trailerButEl){
				trailerButEl.innerHTML = buttonShow;
			}
		},
		openTrailer : function(){	
			trailerBoxEl = document.getElementById('trailerBox');
			trailerButEl = document.getElementById('trailerBut');	
			//show trailer
			if(trailerBoxEl){
				trailerBoxEl.innerHTML = html;
				trailerBoxEl.style.display = 'block';	
			}
			//swap to hide button
			if(trailerButEl){
				trailerButEl.innerHTML = buttonHide;
			}
		},
		closeTrailer : function(){	
			trailerBoxEl = document.getElementById('trailerBox');
			trailerButEl = document.getElementById('trailerBut');
			//hide trailer
			if(trailerBoxEl){
				trailerBoxEl.innerHTML = ''; 
				trailerBoxEl.style.display = 'none';	
			}
			//swap to show button
			if(trailerButEl){
				trailerButEl.innerHTML = buttonShow;
			}
		}
	}
}();


//--JIVE functions begin--
	TIN.jivePostForm =function(form) {
	    form.refererURL.value = TIN.getRefererURL();
	    if(TIN.validateJivePostForm(form)){
		    TIN.setTitleDescriptionValues(form);
		    form.submitButton.disabled = true;
		    form.submit();	
	    }
	}
	
	TIN.validateJivePostForm = function(form){
		var message = "";
		var validated = true;
		if(form.name.value == ""){
			message += "Name is required. ";
			validated = false;
		}
		if(form.email.value == ""){
			message += "Email address is required. ";
			validated = false;
		}else{
			if(form.email.value.indexOf("@") == -1 || form.email.value.indexOf("\.") == -1 ){
				message += "Email address is invalid. ";
				validated = false;
			}
		}
		if(form.location.value == ""){
			message += "Location is required. ";
			validated = false;
		}
		if(form.comment.value == ""){
			message += "Comments are required. "; 
			validated = false;
		}
		
		if(validated){
			return true;	
		}else{
			alert(message);
			return false;	
		}
	}
	
	TIN.jivePostAbuseForm = function(formID){
		form = document.getElementById(formID);
		if(form){
			if(TIN.validateJivePostAbuseForm(form)){
				form.refererURL.value = TIN.getRefererURL();
				form.submit();
			}
		}
	}
	
	TIN.validateJivePostAbuseForm = function(form){
		var message = "";
		var validated = true;
		if(form.name.value == ""){
			message += "Name is required. ";
			validated = false;
		}
		if(form.email.value == ""){
			message += "Email address is required. ";
			validated = false;
		}else{
			if(form.email.value.indexOf("@") == -1 || form.email.value.indexOf(".") == -1){
				message += "Email address is invalid. ";
				validated = false;
			}
		}
		
		if(validated){
			return true;	
		}else{
			alert(message);
			return false;	
		}
	}
	
	TIN.getRefererURL = function() {
		var url = location.href;
		var hashes =  location.hash;
		var hashesIndex = url.indexOf(hashes);
		if (hashes.length >0 && hashesIndex > 0) {
		    url = url.substring(0, hashesIndex);
		}
		if (url.charAt(url.length-1) == '/') {
		    url = url.substring(0, url.length-1);
		}
		return url;
	}  
	
	TIN.setTitleDescriptionValues = function(form) {
	    // undefined for FF, object for IE6
	    if (typeof(jiveTitle)=="undefined" || typeof(jiveTitle)=="object") {
	        // check meta-tags for title
	        var metaArray = document.getElementsByName('jiveTitle');
	        for (var i=0; i<metaArray.length; i++) {
	            form.title.value = metaArray[i].content;
	            break;
	        }
	    } else {
	        form.title.value = jiveTitle;
	    }
	
	    // undefined for FF, object for IE6
	    if (typeof(jiveDescription)=="undefined" || typeof(jiveDescription)=="object") {
	        // check meta-tags for description
	        var metaArray = document.getElementsByName('jiveDescription');
	        for (var i=0; i<metaArray.length; i++) {
	            form.description.value = metaArray[i].content;
	            break;
	        }
	    } else {
	        form.description.value = jiveDescription;
	    }
	
	    // undefined for FF, object for IE6
	    if (typeof(jiveArticleUrl)=="undefined" || typeof(jiveArticleUrl)=="object") {
	        // check meta-tags for description
	        var metaArray = document.getElementsByName('jiveArticleUrl');
	        for (var i=0; i<metaArray.length; i++) {
	            form.articleurl.value = metaArray[i].content;
	            break;
	        }
	    } else {
	        form.articleurl.value = jiveArticleUrl;
	    }
	}
	
	TIN.textCounter = function(textAreaFieldId, countdownSpanId, maxlimit) {
	    var textAreaField = document.getElementById(textAreaFieldId);
	    var countdownSpan = document.getElementById(countdownSpanId);
	    if(textAreaField){
		    if (textAreaField.value.length > maxlimit){
		        // too long, trim it
		        textAreaField.value = textAreaField.value.substring(0, maxlimit);
		    }else{
		        // otherwise, update counter
		    	if(countdownSpan){
		    		countdownSpan.innerHTML = maxlimit - textAreaField.value.length;
		    	}
		    }	
	    }  
	}
//--JIVE functions end--

TIN.showEventSubcat = function(catId){
	var selectedElements = YAHOO.util.Dom.getElementsByClassName('selected', 'select');
	for ( var i in selectedElements ){
	    selectedElements[i].className = "unselected";
	    selectedElements[i].name = "null";
	}
	var re = new RegExp("\\s", "g");
	var selId = 'typeOfEvent'+catId.replace(re,'');
	document.getElementById(selId).name = "eventSubcategory";
	document.getElementById(selId).className = "selected";
}

TIN.searchType = function() {
	//elements for search phrase input, post code inputs, search type drop down
	var elQ, elPC1, elPC2, elTypeOption;
	var SEARH_THIS_SITE_INDEX = 0;
	var POST_CODE_SEARCH_OPTION = 'postcodeSearch';
	function getElements(){
		elQ = $G("q");
		elPC1 = $G("postcode1");
		elPC2 = $G("postcode2");
		elTypeOption = $G("searchType");
	}
	return{
		init : function(chooseOption){
			getElements();
			if(chooseOption == POST_CODE_SEARCH_OPTION){
				elPC1.style.display='block';
				elPC2.style.display='block';
				elQ.style.display='none';
			} else {
				elPC1.style.display='none';
				elPC2.style.display='none';
				elQ.style.display='block';
				//select 'this site' option as default
				elTypeOption.selectedIndex = SEARH_THIS_SITE_INDEX;
			}
		},
		change : function(){
			//if post code type selected search show post code inputs, clear the text field
			if(elTypeOption[elTypeOption.selectedIndex].value == POST_CODE_SEARCH_OPTION){
				elPC1.style.display='block';
				elPC2.style.display='block';
				elQ.style.display='none';
				elQ.value = "";
			} else {
				elPC1.style.display='none';
				elPC2.style.display='none';
				elQ.style.display='block';
				elPC1.value = "";
				elPC2.value = "";
			}
		}
	};
}();


TIN.clickHandler = function (e) {
	//get the resolved (non-text node) target:
	var elTarget = YAHOO.util.Event.getTarget(e);	
	//walk up the DOM tree looking for an <img>
	while (elTarget.id != "container") {
		if(elTarget.nodeName.toUpperCase() == "IMG") {
			//stop the default right click
			YAHOO.util.Event.stopEvent( e ) 	 
			return false;
			//stop looking
			break;
		} else {
			//step up the DOM and keep looking:
			elTarget = elTarget.parentNode;
		}
	}
}

TIN.initSearchPanel = function() {

	TIN.textSearchHTML = '<form action="search.html" id="popUpText" name="popUpText">'+
	'<div id="popUpSearchForm" class="cl">'+
			'<label for="q" class="cl">Search term</label>' +
			'<input id="q" class="text" type="text" value="" name="searchPhrase"/>'+
			'<input type="hidden" value="{searchTypeValue}" name="searchType"/>'+
			'<button type="submit" id="searchPannelButton" class="">Search</button><br class="shimZeroH" />'+
	'</div>'+
	'</form>';
	TIN.textSearchHeader = 'Enter a Search Term and click the button to continue';
	
	TIN.pcSearchHTML = '<form action="search.html" id="popUpPC" name="popUpPC">'+
	'<div id="popUpSearchForm" class="cl">'+
		'<p>'+
			'<label for="postcode1" class="cl">Postcode</label>' +
			'<input id="postcode1" class="text pc1" type="text" maxlength="4" value="{postcode1Value}" name="postcode1"/>'+
			'<input id="postcode2" class="text pc2" type="text" maxlength="3" value="" name="postcode2"/>'+
			'<input type="hidden" value="{searchTypeValue}" name="searchType"/>'+
			'<button type="submit" id="searchPannelButton" class="">Search</button><br class="shimZeroH" />'+
		'</p>'+
	'</div>'+
	'</form>';
	TIN.pcSearchHeader = 'Enter a Postcode and click the button to continue';
	
	TIN.searchPanel = new YAHOO.widget.Panel("searchPanel", { 	
		width: "360px", 
		fixedcenter: true, 
		close: true, 
		draggable: false, 
		zindex:4,
		modal: true,
		visible: false
	} );
	TIN.searchPanel.setHeader(TIN.pcSearchHeader);
	TIN.searchPanel.setBody(TIN.pcSearchHTML);
	TIN.searchPanel.render(document.body);

}

TIN.setSearchPanelHTML = function(searchPhrase, postcode1, typeOfSearch, panelHTML, panelHeader) {
	
	if(typeOfSearch == 'googleSearch'){
		//require search phrase
		if(searchPhrase == ''){
			var HTML = panelHTML.replace('{searchTypeValue}', typeOfSearch);
			TIN.searchPanel.setHeader(panelHeader);
			TIN.searchPanel.setBody(HTML);
			TIN.searchPanel.show();
			return false;
		}else{
			return true;
		}
	}
	if(typeOfSearch == 'thisSite'){
		//require search phrase
		if(searchPhrase == ''){
			var HTML = panelHTML.replace('{searchTypeValue}', typeOfSearch);
			TIN.searchPanel.setHeader(panelHeader);
			TIN.searchPanel.setBody(HTML);
			TIN.searchPanel.show();
			return false;
		}else{
			return true;
		}
	}
	if(typeOfSearch == 'allSites'){
		//require search phrase
		if(searchPhrase == ''){
			var HTML = panelHTML.replace('{searchTypeValue}', typeOfSearch);
			TIN.searchPanel.setHeader(panelHeader);
			TIN.searchPanel.setBody(HTML);
			TIN.searchPanel.show();
			return false;
		}else{
			return true;
		}
	}
	if(typeOfSearch == 'postcodeSearch'){
		//require postcode1
		if(postcode1 == ''){
			var HTML = panelHTML.replace('{searchTypeValue}', typeOfSearch);
			HTML = HTML.replace('{postcode1Value}', postcode1);
			TIN.searchPanel.setHeader(panelHeader);
			TIN.searchPanel.setBody(HTML);
			TIN.searchPanel.show();
			return false;
		}else{
			return true;
		}
	}
	return false;

}

TIN.showSocialLinks = function(socialLinkeleId) {

	TIN.toggleDisplay(socialLinkeleId);
}

TIN.whatsOnWidget = function() {
	
	var defaultSearchPhrase = 'e.g. Venue, Name';
	var emptySearchPhrase = '';
	var searchPhraseEl = null;
	var submitButtonEl = null;
	
	function resetSearchPhrase(){
		//reset colour
		searchPhraseEl.style.color = "#000";
		searchPhraseEl.value = '';
	}
	
	function submitSearch(e){
		//if the default phrase is still set use empty search phrase
		if(searchPhraseEl.value == defaultSearchPhrase){
			searchPhraseEl.value = '';
		}
	}

	return {
		init : function(){	
			if(YAHOO){
				//get search box element
				searchPhraseEl = YAHOO.util.Dom.getElementBy( function(el){ return(el.id == 'searchPhrase'); } , 'input' , 'event-listings-site-search' );	
				//reset colour
				searchPhraseEl.style.color = "#000";
				//if no value set already
				if(searchPhraseEl.value == ''){
					//set colour
					searchPhraseEl.style.color = "#999";
					//set default phrase
					searchPhraseEl.value = defaultSearchPhrase;
				}
				//set event to clear search box when focused on
				YAHOO.util.Event.on(searchPhraseEl, "focus", resetSearchPhrase );
				//get submit button element
				submitButtonEl = document.getElementById('eventListingsSearch');
				//set event for submit button click
				YAHOO.util.Event.on(submitButtonEl, "click", submitSearch );
			}
		}
	}
}();


TIN.adverts = function(){
	//tile for DC ads
	var tile=1;
	//build up empty arrays for adverts
	var i,
		type=[],
		adTags = [],
		ads=[],
		aambTags = ['AAMB1','AAMB2','AAMB3','AAMB4','AAMB5','AAMB6','AAMB7','AAMB8','AAMB9','AAMB10','AAMB11','AAMB12','AAMB13','AAMB14','AAMB15','AAMB16','AAMB17'];

	function renderAd(divName, aambTag){
		var invObj = 'INV' + divName;
		try {
			var code = eval(aambTag);
		} catch (aamErr){
		}

		if(typeof code !=='undefined'){
			if(navigator.userAgent.indexOf('MSIE') > -1) {
				document.getElementById(divName).innerHTML +=
				'<div id="TMP' + divName +'" style="display:none;">' +
				escape('<body><div id="adDiv">' + code + '</div>')+
				'</div><iframe name="' + invObj + '" width="0" height="0" frameborder="0" ' +
				'onload="try{document.getElementById(\'' + divName + '\').' +
				'insertAdjacentElement(\'beforeEnd\',window.frames[\'' + invObj + '\'].' +
				'document.getElementById(\'adDiv\')) } catch(aamErr){}"></iframe>';

				window.frames[invObj].document.location = 'javascript:unescape(parent.document.getElementById(\'TMP' + divName + '\').innerHTML)';

			} else {
				document.writeln('<div id="' + invObj + '" style="display:none;">' +
				code + '<script type="text/javascript" defer="true">' +
				'document.getElementById(\'' + divName + '\').innerHTML = ' +
				'document.getElementById(\'' + invObj + '\').innerHTML;' +
				'document.getElementById(\'' + invObj + '\').innerHTML = \'\';</scr' + 'ipt></div>'); 
			}
		}
	}
	return {
		adWriteDC : function(divId, renderDetails){

			if (typeof ord=='undefined') {ord=Math.random()*10000000000000000;}
			
			//Insert global Ad variable values
			var adServerUrl = adServer.toLowerCase();
			var site = adAccountCode.toLowerCase();
			var siteLastFourLetters = adAccountCode.slice(adAccountCode.length-4).toLowerCase();
			var area = "area";
			var subArea = adSubareaId.toLowerCase();
			var article = adArticleId.toLowerCase();
			if(adAreaId != ""){
				area = adAreaId.toLowerCase();
			}
			if(subArea == ""){
				subArea = area; //use area if subarea null
			}
			var divName = "";
			var invObj = "";
			var scriptBlock = "";
			var overlayParam = "";
			var isMsie = (navigator.userAgent.indexOf('MSIE') > -1);
			
			if(renderDetails=="468x60,728x90"){
				overlayParam="dcopt=ist;";
			}
			divName = divId;
	
			scriptBlock = "<scr" + "ipt language=\"JavaScript\" src=\""+adServerUrl+"/adj/"+site+"/"+site+"_"+siteLastFourLetters+area+"_"+subArea+";area="+area+";subarea="+subArea+";target=;article="+article+";"+segQS+overlayParam+"tile="+tile+";sz="+renderDetails+";ord="+ord+"?\" type=\"text/javascript\"></script>";
	
			document.writeln(scriptBlock); 
	
			overlayParam = "";
			
			tile++;
			
		},
		ads : function(){	
			i=ads.length;
			while(i>0){
				--i;
				renderAd(ads[i], aambTags[i]);
			}
		},
		init : function(){
		
			i = ads.length;
			//TIN uses pos differently to other sites
			while(i>0){
				 --i;
				adTags[i] = type[i];
			}
			
			//Cache-busting and pageid value
			var aamRnd = Math.round(Math.random() * 10000000000);
	
			//As tag targeting values which will be appended to each ad request section in the bserver ad call
			var allAdTags = [adServer,'/AAMALL/SITE=',adAccountCode,'/AREA=',adAreaId,'/SUBAREA=',adSubareaId,'/ARTICLE=',adArticleId,'/acc_random=',aamRnd,'/pageid=/RS=',segQS].join('');
			//build string of all ad calls
			var adString='';
			
			i=adTags.length;
			while(i>0){
				--i;
				adString += ['/AAMB',(i+1),'/',adTags[i]].join('');
			}
			//write script to call adServer
			document.writeln("<script type=\"text/javascript\" src=\""+allAdTags+adString+"\"></script>");
		},
		addToArray : function(name,typeName){
			ads.push(name);
			type.push(typeName);
		}
	}
}();


TIN.ticker = {
	currentItem : 0,
	itemsLength : 0,
	elBlind : null,
	elContainer : null,
	elLatest : null,
	blindStartXPos : 0,
	blindEndXPos : 0,
	blindStartYPos : 0,
	messageSwitchTimer : null,
	messageIntervalMsec : 7000,
	longIntervalMs : 1000000,
	revealDurationSec : 5,
	tickerItems : null,
	init : function(){
		TIN.ticker.elBlind = $G('js-ticker-blind');
		TIN.ticker.elContainer = $G('js-ticker-container');
		TIN.ticker.elLatest = $G('js-ticker-latest');
		
		// get all activity ticker items
		TIN.ticker.tickerItems = TIN.ticker.elContainer.getElementsByTagName("li");
		
		//number of items
		TIN.ticker.itemsLength = TIN.ticker.tickerItems.length;
		
		// set listener for mouseover
		$E.addListener(TIN.ticker.elContainer,"mouseover",this.pauseAnim,this);
		$E.addListener(TIN.ticker.elLatest,"mouseover",this.pauseAnim,this);
		
		// set listener for mouseout
		$E.addListener(TIN.ticker.elContainer,"mouseout",this.restartAnim,this);
		$E.addListener(TIN.ticker.elLatest,"mouseout",this.restartAnim,this);
		
		// start animation
		this.startAnim(TIN.ticker.elContainer);
	},
	startBlindAnim : function() {
    	//start wide enough to cover text, shrink to reveal, make width dynamic?
    	this.anim = new YAHOO.util.Anim(TIN.ticker.elBlind, { width: { from: 950, to: 10 } }, TIN.ticker.revealDurationSec, YAHOO.util.Easing.easeNone);
    	//this.anim.onComplete.subscribe(this.endAnim,this);
    	this.anim.animate(); 
	},
	startAnim : function() {
		//start reveal before show
		TIN.ticker.elBlind.style.width = "950px";
		TIN.ticker.startBlindAnim();
		
		TIN.ticker.tickerItems[TIN.ticker.currentItem].style.display = 'block';
		
		if((TIN.ticker.currentItem - 1) >= 0){
			TIN.ticker.tickerItems[TIN.ticker.currentItem - 1].style.display = 'none';
		}
		if(TIN.ticker.currentItem == 0){
			TIN.ticker.tickerItems[TIN.ticker.itemsLength-1].style.display = 'none';
		}
			
		TIN.ticker.currentItem ++;
		if(TIN.ticker.currentItem > TIN.ticker.itemsLength-1){
			TIN.ticker.currentItem = 0;
		}
		
		TIN.ticker.messageSwitchTimer = setTimeout(TIN.ticker.onTimeout, TIN.ticker.messageIntervalMsec);
	},
	onTimeout : function() {
    	TIN.ticker.startAnim();
	},
    pauseAnim : function(e,obj) {
    	obj.anim.stop(true);//true param makes the animation jump to the end ie clear the text underneath
    	clearTimeout(TIN.ticker.messageSwitchTimer);
        TIN.ticker.messageSwitchTimer = setTimeout(TIN.ticker.onTimeout, TIN.ticker.longIntervalMs);
    },
	restartAnim : function(e,obj) {
    	clearTimeout(TIN.ticker.messageSwitchTimer);
    	TIN.ticker.messageSwitchTimer = setTimeout(TIN.ticker.onTimeout, TIN.ticker.messageIntervalMsec);
	}
};

TIN.tickerManager = function(){
	TIN.ticker.init();
};


TIN.omn = function(){
	//TODO:set s_account as global page var coming from WPS
	var s_account = omnitureAccountCode;
	return{
		//CP:commercial partner
		exitLinkCP : function(obj, cpTypeName, linkName){
			var s = s_gi(s_account);
			s.linkTrackVars = 'prop36,prop37,eVar36,eVar37';
			s.linkTrackEvents = 'None';
			s.prop37 = s.pageName;
			s.prop36 = cpTypeName; //Jobs, Motors etc
			s.tl(obj, 'o', linkName);
		},
		//SB:social bookmark
		exitLinkSB : function(obj, sbName, linkName){
			var s = s_gi(s_account);
			s.linkTrackVars = 'prop5,prop26,prop27'; //article title
			s.linkTrackEvents = 'None';
			s.prop26 = s.prop5; //article title
			s.prop27 = sbName; //Facebook etc
			s.tl(obj, 'o', linkName);
		}
	}
}();


function uk_co_and_tin_ClearspaceComments(config) {
	var cfg = config;
	var commentEleIds = [];
	var commentKeys = [];
	var commentText = [];
	
	// Public members
	return {
		addClearspaceComment: function(countEleId, commentKey, displayText) {
			commentEleIds[commentEleIds.length] = countEleId;
			commentKeys[commentKeys.length] = commentKey;
			commentText[commentText.length] = displayText;
		},
		// Makes the call to clearspace to get the comment values - put this call in its own <script> tag
		getValues: function() {
			if(commentKeys.length > 0) {
				var keyParam = 'key=';
				for(i=0;i<commentKeys.length;i++) {
					if(i>0) {
						keyParam += ',';
					}
					keyParam += commentKeys[i];
				}
				var clearspaceUrl = cfg.baseUrl + '&' + keyParam;
				document.write('<scr' + 'ipt src="' + clearspaceUrl + '" type="text/javascript">');
				document.write('</scr' + 'ipt>');
			}
		},
		// Renders the comment values - put this call in its own <script> tag
		renderComments: function() {
			// Clearspace should have set the counts for each of our articles into JS vars called count_<key>
			for(i=0;i<commentKeys.length;i++) {
				var count = eval('count_'+commentKeys[i]);
				if(count > 0) {
					var commentText = count + ' comment';
					if(count > 1){commentText += 's';}
					document.getElementById(commentEleIds[i]).innerHTML = commentText;
				}
			}
		}
	};
}

