var AND = 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("carousel")){
				 	TINUI.Carousels.Manager.initAll();
				}
				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.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'imageAlbum':
					new TINUI.Carousels.imageAlbumCarousel(obj.id,{
						rolloverScrollButtons : true
					});
					break;
					
				case'imageAlbumStatic':
					new TINUI.Carousels.imageAlbumCarousel(obj.id,{
						staticCarousel : true,
						rolloverScrollButtons : true
					});
					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
					});
					break;
					
				case'horizontalLocalMotors':
					//Horizontal
					new TINUI.Carousels.carousel(obj.id,{
						orientation:'horizontal',
						staticCarousel : true,
						randomStartPos : 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 = AND.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'
	};
	
	
	//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.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();	
			}
		}
	},
	/**
	* 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 );

		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 mouseover event on the container DOM element
	* @param {Object} event The event object
	*/
	mouseoverContainer : function( event ) {
		//console.log( 'mouseoverContainer' );
		if ( AND.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 ( AND.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 ( AND.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 ( AND.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() {
		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 ) );
		YAHOO.util.Dom.setXY( this.itemList, this.itemListOffset );
	},
	
	organiseItemsBwd : function() {
		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 ) );
		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();
		}
	}
}






var pollsArr = new Array();

var TIN = {};
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);
		},
		
		// Cross-browser multi-event adder; eg addEvent(window, 'load', function(){})
		addEvent : function(obj, evType, fn){
			if (obj.addEventListener){
				obj.addEventListener(evType, fn, false);
				return true;
			} else if (obj.attachEvent){
				var r = obj.attachEvent("on"+evType, fn);
				return r;
			} else {
				return false;
			}
		},
        
        
        getWeather : function() {
            WeatherAjaxController.getWeather(function(netWeatherVO) {
				var navWeather = document.getElementById("topNavWeather");
				var weatherHTML = '<button onclick="document.location.href=\'\/weather\'" class="fancy weatherIcon '+netWeatherVO.maxTempImage+'">'+netWeatherVO.maxTempImage+'</button>';
				weatherHTML += 'High:<strong>'+netWeatherVO.maxDayTimeTemp+'&deg;C</strong>&nbsp; Low:<strong>'+netWeatherVO.lowCelcius+'&deg;C</strong>';
				if(navWeather){
					navWeather.innerHTML = weatherHTML;	
				}	
				var navWeatherLink = document.getElementById("topNavWeatherLink");
				if(navWeatherLink){
					navWeatherLink.innerHTML = "5-Day Forecast";	
				}	
            });
        },
		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
					userId:userDetailsArray[0],
					firstname:userDetailsArray[1],
					surname:userDetailsArray[2],
					email:userDetailsArray[3],
					authid:userDetailsArray[4]
				};
				
				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=/";
		}
	}
}();


TIN.Poll = function(){
	// Public members
	return {
        updatePollDivWithResult : function(result, divsuffix) {
	        if ((null!=result)&&(null!=result.answers)) {
	            if (document.getElementById('pollheader'+result.id+divsuffix)) {
	
	                var pollHeaderDiv = document.getElementById('pollheader'+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>";
	                }
	                pollHeaderDiv.innerHTML="<h2>Thank you for your vote</h2><p class=\"question\">Results for: " + result.questionText + "</p>";;
	                pollOptionsDiv.innerHTML=newHtml;
					if (result.showResults) {
		                pollFooterDiv.innerHTML="<p>" + result.totalResponse + " votes cast.</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 = '389';
	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 = '<button id="hideTrailer" onClick="TIN.filmWidget.closeTrailer();" class="fancy trailer hide" type="trailer" name="hideTrailer">Show Trailer</button>';
			buttonShow = '<button id="showTrailer" onClick="TIN.filmWidget.openTrailer();" class="fancy trailer show" type="trailer" name="showTrailer">Show Trailer</button>';
		},
		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.updateSearchType = function(linkId, newLinkText, chooseIndex, searchMenu){
	//update the link
	var linkEl = document.getElementById(linkId);
	linkEl.innerHTML = newLinkText;
	
	//update the select option
	document.forms["siteSearch"].searchType.options[chooseIndex].selected = true;
	
	//hide the menu
	var menuEl = document.getElementById(searchMenu);
	menuEl.style.display='none';
	
	//change text inputs
	var pcDiv = document.getElementById('postCodeInputs');
	var textDiv = document.getElementById('searchTextInput');
	if(chooseIndex==3){
		//reset the form
		//document.siteSearch.reset();
		//display postcode div #postCodeInputs
		pcDiv.style.display = 'block';
		//clear the postcode inputs on update
		pcDiv.innerHTML =	'<label for="postcode1" class="ah">Postcode part 1</label>'+
							'<input id="postcode1" class="text pc1" type="text" maxlength="4" name="postcode1"/>'+
							'<label for="postcode2" class="ah">Postcode part 2</label>'+
							'<input id="postcode2" class="text pc2" type="text" maxlength="3" name="postcode2"/>';
		//delete the text input and
		textDiv.innerHTML  = '';
	}else{
		//delete postcode div #postCodeInputs
		pcDiv.style.display = 'none';
		//clear the postcode inputs on update
		pcDiv.innerHTML = '';
		if(textDiv.innerHTML==''){
			//add it again - to fully clear the input
			textDiv.innerHTML = '<label for="q" class="ah">Search: </label>'+
							'<input type="text" class="text phrase" value="" id="q" name="searchPhrase"/>';
		}
	
	}
}

TIN.initSearchType = function(chooseOption) {
	
	if(chooseOption == 'googleSearch'){
		//update the link
		var linkEl = document.getElementById('searchTypeLink');
		linkEl.innerHTML = 'Web';
	}
	if(chooseOption == 'thisSite'){
		//update the link
		var linkEl = document.getElementById('searchTypeLink');
		linkEl.innerHTML = 'This site';
	}
	if(chooseOption == 'allSites'){
		//update the link
		var linkEl = document.getElementById('searchTypeLink');
		linkEl.innerHTML = 'This is Network';
	}
	if(chooseOption == 'postcodeSearch'){
		//update the link
		var linkEl = document.getElementById('searchTypeLink');
		linkEl.innerHTML = 'Postcode';
		//display postcode div with imputs
		var pcDiv = document.getElementById('postCodeInputs');
		pcDiv.style.display = 'block';
		
	}
}

TIN.pageClickHandler = function(e){
	
	//get the resolved (non-text node) target:
	var elTarget = YAHOO.util.Event.getTarget(e);	
	//walk up the DOM tree looking for an searchTypeLink
	while (elTarget.id != "container") {
		if(elTarget.id == "searchTypeLink") {
			//toggle menu on click on link
			TIN.toggleDisplay('searchTypeMenu');
			//stop the default right click
			YAHOO.util.Event.stopEvent( e ) 	 
			return false;
			//stop looking
			break;
		} else {
			//hide menu
			var element = document.getElementById('searchTypeMenu');
			element.style.display='none';
			elTarget = elTarget.parentNode;
		}
	}
}

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">'+
		'<p>'+
			'<label for="q" class="">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="fancy">Search</button><br class="shimZeroH" />'+
		'</p>'+
	'</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">'+
		'<p>'+
			'<label for="postcode1" class="">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="fancy">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: "320px", 
		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.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);
		}
	}
}();


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) {
					document.getElementById(commentEleIds[i]).innerHTML = commentText[i] + '(' + count + ')';
				}
			}
		}
	};
}

