/*CBCWIDGETPROPERTIES*/

var textLength = 140; //Maximum text size of feed.
var timeDuration = 7; //Time duration in minutes to get latest response from the servers.
var scrollInterval = 3.5; //Scroll interval time in seconds.
var fadeInSpeed = 1.5; //Fade In effect speed in seconds.
var noOfRSSFeedsFromURL = 9;
var resumeScrollTime = 6;
//var url = "http://localhost:8081/CityBeach/";
//var url = "http://localhost:8443/CityBeach/";
var rootURL = "http://www.citybeach.com.au/";
var url = "http://www.citybeach.com.au/CityBeach/";
var fbFeedIcon = "/CityBeach/images/fb_icon.gif";
var fbFeedImage = "/CityBeach/images/facebookImg.gif";
var rssFeedIcon = "/CityBeach/images/rssfeed.jpg";
var rssFeedImage = "/CityBeach/images/rssImg.gif";
var twitterIcon = "/CityBeach/images/twittericon.gif";
var btn_up = "/CityBeach/images/btn_up.gif";
var btn_up_gray = "/CityBeach/images/btn_up_gray.gif";
var btn_down = "/CityBeach/images/btn_down.gif";
var btn_down_gray = "/CityBeach/images/btn_down_gray.gif";
var maxFeedsInCBC = 50;
var itemsPerPageInCBC = 3;

	 /**
	 * This method to get the maximum length of the message to display
	 * @return textLength
	 */
	function getTextLength() {
		return textLength;
	}
	
	/**
	 * This method to get the time interval to get the feeds/tweets.
	 * @return textLength
	 */
	function getTimeDuration() {
		return timeDuration;
	}
	
	function getScrollInterval() {
		return scrollInterval * 1000; // Time interval in milliseconds.
	}
	
	function getFadeInSpeed() {
		return fadeInSpeed * 1000;
	}
	
	function getNoOfRSSFeedsFromURL() {
		return noOfRSSFeedsFromURL;
	}
	
	function getUrl() {
		return url;
	}
	
	function getFbFeedIcon() {
		return fbFeedIcon;
	}
	
	function getFbFeedImage() {
		return fbFeedImage;
	}
	
	function getRssFeedIcon() {
		return rssFeedIcon;
	}
	
	function getRssFeedImage() {
		return rssFeedImage;
	}
	
	function getTwitterIcon() {
		return twitterIcon;
	}
	
	function getBtnUp() {
		return btn_up;
	}
	
	function getBtnUpGray() {
		return btn_up_gray ;
	}
	
	function getBtnDown() {
		return btn_down;
	}
	
	function getBtnDownGray() {
		return btn_down_gray;
	}

	function getResumeScrollTime() {
		return resumeScrollTime*1000;
	}
	
	function getMaxFeedsInCBC() {
		return maxFeedsInCBC;
	}
	
	function getItemsPerPageInCBC() {
		return itemsPerPageInCBC;
	}
/*ALL WIDGET WIDGET*/


	var rssFeedCnt = 0;
	var fbCnt = 0;
	var tCounter = 0;
	var rssProfile = new Array();
	var rssFeedTime = new Array();
	var rssFeedDate = new Array();
	var rssFeedTitle = new Array();
	var rssFeedAuthor = new Array();
	var rssFeedLink = new Array();
	var rssFeedFieldsLength = 0;
	var totalRSSFeeds = 0;
	var rssItemsPerPage = 0;	
	var fbFeedFieldsLength = 0;
	var fbFeedTime = new Array();
	var fbFeedDate = new Array();
	var fbFeedTitle = new Array();
	var fbFeedAuthor = new Array();
	var fbFeedLink = new Array();	
	var fbProfiles = new Array();
	var fbItemsPerPage = 0;
	var fbTotalFeeds = 0;
	var totalFBFeeds = 0;
	var statusIdLength = 0;
	var allFeedsId = new Array();
	var fbFeedIcon = getFbFeedIcon();
	var rssFeedIcon = getRssFeedIcon();
	var twitterIcon = getTwitterIcon();
	var fbFeedImage = getFbFeedImage();
	var rssFeedImage = getRssFeedImage();
	var twitterCount = 0;
	var twitterProfile = new Array();
	var tweetId = new Array();
	var tweetImg = new Array();
	var tweetName = new Array();
	var tweetText = new Array();
	var tweetTime = new Array();	
	var tweetLink = new Array();
	var twtItemsPerPage = 0;
	var indFeedRow = "";
	var rssTotalFeeds = 0;
	var twtTotalFeeds = 0;
	var fadeEffectSpeed = getFadeInSpeed();
	var cbcScrollInterval = getScrollInterval();
	var intervalTime = getTimeDuration()*60*1000;
	var cbcModeType;
	var fbInterval = null;
	var twittInterval = null;
	var rssInterval = null;
	var allInterval = null;
	var fbScrollingTimeout = null;
	var rssScrollingTimeout = null;
	var twitterScrollingTimeout = null;
	var cbcScrollingTimeout = null;
	var feedTypes = new Array(); 
	

/**
 * This method processes the widget configuration from xml file and initializes the required values.
 * @param xmlDoc  - this variable contains the entire xml document fetched using Ajax request
 * @return
 */	
	
  function cbcXMLProcessor(xmlDoc) {
	  var tDataSources = xmlDoc.getElementsByTagName("TDataSource");
		var tDsLength = tDataSources.length;
		for(var ds = 0; ds < tDsLength; ds++) {
			var dsValue = tDataSources[ds].childNodes[0];
			twitterProfile[ds] = dsValue.nodeValue;
		}
		
	twitterCount = tDsLength;
	twtTotalFeeds = xmlDoc.getElementsByTagName("TotalFeeds")[0].childNodes[0].nodeValue;
	twtItemsPerPage = parseInt(xmlDoc.getElementsByTagName("Messages")[0].childNodes[0].nodeValue);
	
	
	var rssDataSources = xmlDoc.getElementsByTagName("WDataSource");
		var rssDsLength = rssDataSources.length;
		for(var ds = 0; ds < rssDsLength; ds++) {
			var dsValue = rssDataSources[ds].childNodes[0];
			rssProfile[ds] = dsValue.nodeValue;
	}
	totalRSSFeeds = rssDsLength;
	rssTotalFeeds = xmlDoc.getElementsByTagName("TotalFeeds")[1].childNodes[0].nodeValue;
	rssItemsPerPage = xmlDoc.getElementsByTagName("Messages")[1].childNodes[0].nodeValue;	
	
	
	var fbDataSources = xmlDoc.getElementsByTagName("FDataSource");
		var fbDsLength = fbDataSources.length;
		for(var ds = 0; ds < fbDsLength; ds++) {
			var dsValue = fbDataSources[ds].childNodes[0];
			fbProfiles[ds] = dsValue.nodeValue;
	}
	totalFBFeeds = fbDsLength;
	fbTotalFeeds = xmlDoc.getElementsByTagName("TotalFeeds")[2].childNodes[0].nodeValue;
	fbItemsPerPage = xmlDoc.getElementsByTagName("Messages")[2].childNodes[0].nodeValue;


	cbcModeType = xmlDoc.getElementsByTagName("WidgetMode")[0].childNodes[0].nodeValue;
  }
  
	/**
	 * This method limits the text size to 140 characters.
	 * @param text
	 * @return text with 140 characters length
	 */
	
	function cbcLimitedText(text) {
		var tLength = 0;
		var fixedLength = getTextLength();
		tLength = text.length;
		if(tLength > fixedLength)
			text = text.substring(0,fixedLength-3)+"...";
		var aOpen = text.lastIndexOf("<a");
		var aClose = text.lastIndexOf("</a>");
		if(aOpen > aClose) {
			if(text.lastIndexOf("\">")==-1)
				text += "\">";
			text += "</a>";
		}
		return text;
	}
	
	/**
	 * This method process the data fetched from each RSS feed
	 * @param result
	 * @return
	 */
	function cbcFeedLoad(result) {
			var author = result.feed.author;
			for(var i = 0; i < result.feed.entries.length; i++) {
				var entry = result.feed.entries[i];
				var date = entry.publishedDate; // date and time in standard format
				var timestamp = Number(new Date(date)); // timestamp 				
				rssFeedTime[rssFeedFieldsLength] = timestamp;
				feedTypes[timestamp] = 'r';
				rssFeedTitle[timestamp] = entry.title;
				rssFeedAuthor[timestamp] = author;
				rssFeedDate[timestamp] = date.toString();
				rssFeedLink[timestamp] = entry.link;
				rssFeedFieldsLength++;
			}
			rssFeedCnt++;
			if(rssFeedCnt == totalRSSFeeds) {
				var feedRow = "";
				rssFeedTime.sort(cbcSortNumber);
				allFeedsId = allFeedsId.concat(rssFeedTime);
				for(var feed = 0; feed < rssFeedFieldsLength && feed < rssTotalFeeds; feed++) {
					var ref = rssFeedTime[feed];
					var text = cbcLimitedText(rssFeedTitle[ref].linkify());
					if(cbcModeType == "stationary") {
						feedRow += "<tr height='86'  valign='top'>";
					}
					else if(cbcModeType == "scroll") {
						feedRow += "<tr height='86'  valign='top' style='display:none'>";
					}
					feedRow += "<td><a target='_blank' href='"+rssFeedLink[ref]+"'><img border='0' height='40' width='40' src='"+rssFeedImage+"'></a></td><td>";
					indFeedRow += "<tr height='65'  valign='top'><td>";
					if(rssFeedAuthor[ref] != "" && rssFeedAuthor[ref].length == 0)
						feedRow +="<font class='author'><a target='_blank' href='"+rssFeedLink[ref]+"' style='text-decoration: none;'>"+rssFeedAuthor[ref]+"</a></font><br>";
					feedRow += "<font class='txtmessage'>"+text+"</font><br>";
					feedRow += "<img height='14' width='14' src='"+rssFeedIcon+"'>&nbsp;&nbsp;<font class='time'>"+relative_time(rssFeedDate[ref],"r")+"</font></td>";
					feedRow += "</tr>";
				}
					var tbl = document.getElementById("rssTblDiv");
					var tblstart = "<table height='290' id='rssTbl' width='230'>";
					var tblend = "</table>";
					tbl.innerHTML = tblstart+feedRow+tblend;
					feedRow = "";

					rssPager.setItemsPerPage(rssItemsPerPage);
					if(cbcModeType == "stationary") {
						document.getElementById("rssTblDiv").className = "";
						rssPager.showPage(1);
					}
					else if(cbcModeType == "scroll") {
						clearInterval(rssInterval);
						document.getElementById("rssBtnUp").onclick = rssShowNextFeeds;
						document.getElementById("rssBtnDown").onclick = rssShowPrevFeeds;
						document.getElementById("rssBtnUp").src=getBtnUp();
						rssScrolling();
					}						
			}
	}

	var rssCurrentElement = null;
	var rssFirstMove = true;	 
	 
	/**
	 * This method applies scrolling effect for RSS messages.
	 * @return
	 */ 
 	function rssScrolling () {
 			var rssElement;
 			rssFirstMove = true;
		 	rssInterval = window.setInterval(function () {
				rssElement =  $("#rssTbl").find("tr:hidden:last");
				$("#rssTblDiv > table").prepend(rssElement);
				rssElement.fadeIn(fadeEffectSpeed);
				rssCurrentElement = rssElement;
				var eleToHide = $(rssElement).next().next().next(); // Element to hide
				$(eleToHide).css("display","none");
				rssElement.hover( function() {
					$(this).stop();
					$(this).fadeIn("fast");
					$(this).css({'opacity': null});
					clearInterval(rssInterval);
				}, function(){
					$(this).unbind('mouseenter mouseleave');
					rssScrolling();
				});
			},cbcScrollInterval);
	}	 

	/**
	 * Method to get the old items into the view on each click of down button.
	 * @return
	 */
	 function rssShowPrevFeeds() {
		 stopScrolling(rssFirstMove,rssCurrentElement,rssInterval);
		 rssSetScrollingTimeOut();
		 
		 var nextElement = $(rssCurrentElement).next(); // Element to display on top of the list
		 var commingElement = nextElement.next().next(); // Element to display on the bottom of the list

		 $(rssCurrentElement).css("display","none");
		 $("#rssTblDiv > table").append(rssCurrentElement);
		 rssCurrentElement = nextElement;		 
		 if(commingElement.css('display') == 'none') {
			 commingElement.fadeIn("fast");
		 }
	 }
	 
	 /**
	  * Method to set time out for scrolling method if no clicks for some time.
	  * 
	  */
	 function rssSetScrollingTimeOut() {
		 if(rssScrollingTimeout) {
		 		clearTimeout(rssScrollingTimeout);
			 }
		 rssScrollingTimeout = setTimeout("rssScrolling()",getResumeScrollTime());
	 }
	 
	 /**
	  * Method to get the latest the old items into the view on each click of up button.
	  * @return
	  */
	 function rssShowNextFeeds() {
		 stopScrolling(rssFirstMove,rssCurrentElement,rssInterval);
		 rssSetScrollingTimeOut();
		
		var prevElement = $("#rssTbl").find('tr:hidden:last'); // Element to display on top of the list
		$("#rssTblDiv > table").prepend(prevElement);
		var eleToHide = $(rssCurrentElement).next().next();
		$(eleToHide).css("display","none");
		if(prevElement.text()!="" && prevElement.text().length != 0)
			rssCurrentElement = prevElement;
		$(rssCurrentElement).fadeIn("fast");
	 }
	 
	/**
	 * This method process the data fetched from each Facebook profile.
	 * @param result
	 * @return
	 */
	function cbcFBFeedLoad(result) {
		 	var author = result.feed.author;
			var allIndexFB = 0;
			for(var i = 0; i < result.feed.entries.length; i++) {
				var entry = result.feed.entries[i];
				var date = entry.publishedDate; // date and time in standard format

				var timestamp = Number(new Date(date));
				
				fbFeedTime[fbFeedFieldsLength] = timestamp;
				feedTypes[timestamp] = 'f';
				fbFeedTitle[timestamp] = entry.title;
				fbFeedAuthor[timestamp] = author;
				fbFeedDate[timestamp] = date.toString();
				fbFeedLink[timestamp] = result.feed.entries[i].link;
				fbFeedFieldsLength++;
			}
			fbCnt++;
			if(fbCnt == totalFBFeeds) {
				var fbFeedRow = "";
				fbFeedTime.sort(cbcSortNumber);
				allFeedsId = allFeedsId.concat(fbFeedTime);
				for(var feed = 0; feed < fbFeedFieldsLength && feed < fbTotalFeeds; feed++) {
					var ref = fbFeedTime[feed];
					author = fbFeedAuthor[ref];
					if(cbcModeType == "stationary") {
						fbFeedRow += "<tr height='86'  valign='top'>";
					}
					else if(cbcModeType == "scroll") {
						fbFeedRow += "<tr height='86'  valign='top' style='display:none'>";
					}
					fbFeedRow += "<td><a target='_blank' href='"+fbFeedLink[ref]+"'><img height='40' width='40' border='0' src='"+fbFeedImage+"'></a></td><td>";
					if(author != "" && author.length != 0)
						fbFeedRow +="<font class='author'><a target='_blank' href='"+fbFeedLink[ref]+"' style='text-decoration: none;'>"+author+"</a></font><br>";
					fbFeedRow += "<font class='txtmessage'>"+cbcLimitedText(fbFeedTitle[ref].linkify())+"</font><br>";
					fbFeedRow += "<img height='14' width='14' src='"+fbFeedIcon+"'>&nbsp;&nbsp;<font class='time'>"+relative_time(fbFeedDate[ref],"f")+"</font></td>";
					fbFeedRow += "</tr>";
				}
					var tbl = document.getElementById("fbTblDiv");
					var tblstart = "<table height='290' id='fbTbl' width='230'>";
					var tblend = "</table>";
					tbl.innerHTML = tblstart+fbFeedRow+tblend;
					fbFeedRow = "";
					
					fbPager.setItemsPerPage(fbItemsPerPage);
					if(cbcModeType == "stationary") {
						document.getElementById("fbTblDiv").className = "";
						fbPager.showPage(1);
					}
					else if(cbcModeType == "scroll") {
						clearInterval(fbInterval);
						document.getElementById("fbBtnUp").onclick = fbShowNextFeeds;
						document.getElementById("fbBtnDown").onclick = fbShowPrevFeeds;
						document.getElementById("fbBtnUp").src=getBtnUp();
						faceBookScrolling();
					}
					// Initialize all feeds widget
					allFeeds();					
			}
	}

	var fbCurrentElement = null;
	var fbFirstMove = true;
	/**
	 * This method applies scrolling effect to Facebook messages.
	 * @param rowIndex
	 * @return
	 */
	function faceBookScrolling () {
			var element;
			fbFirstMove = true;
			fbInterval = window.setInterval(function () {
				element =  $("#fbTbl").find("tr:hidden:last");
				$("#fbTblDiv > table").prepend(element);
				element.fadeIn(fadeEffectSpeed);
				fbCurrentElement = element;
				var eleToHide = $(element).next().next().next(); // Element to hide
				$(eleToHide).css("display","none");
				element.hover( function() {
					$(this).stop();
					$(this).fadeIn("fast");
					$(this).css({'opacity': null});
					clearInterval(fbInterval);
				}, function(){ 
					$(this).unbind('mouseenter mouseleave');
					faceBookScrolling();	
				});
			},cbcScrollInterval);
	}	 
	
	
	/**
	 * Method to stop scrolling effect on first click on up and down buttons.
	 */ 

	 function stopScrolling(firstMove,currentElement,interval) {
		if(firstMove) {
			 $(currentElement).stop();
			 clearInterval(interval);
			 firstMove = false;
		}
	 }
	 
	/**
	 * Method to get the old items into the view on each click of down button.
	 * @return
	 */
	 function fbShowPrevFeeds() {
		 stopScrolling(fbFirstMove,fbCurrentElement,fbInterval);
		 fbSetScrollingTimeOut();
		 
		 var nextElement = $(fbCurrentElement).next(); // Element to display on top of the list
		 var commingElement = nextElement.next().next(); // Element to display on the bottom of the list

		 $(fbCurrentElement).css("display","none");
		 $("#fbTblDiv > table").append(fbCurrentElement);
		 fbCurrentElement = nextElement;		 
		 if(commingElement.css('display') == 'none') {
			 commingElement.fadeIn("fast");
		 }
	 }
	
	 /**
	  * Method to get the latest the old items into the view on each click of up button.
	  * @return
	  */
	 function fbShowNextFeeds() {
		 stopScrolling(fbFirstMove,fbCurrentElement,fbInterval);
		 fbSetScrollingTimeOut();
		
		var prevElement = $("#fbTbl").find('tr:hidden:last'); // Element to display on top of the list
		$("#fbTblDiv > table").prepend(prevElement);
		var eleToHide = $(fbCurrentElement).next().next();
		$(eleToHide).css("display","none");
		if(prevElement.text()!="" && prevElement.text().length != 0)
			fbCurrentElement = prevElement;
		$(fbCurrentElement).fadeIn("fast");
	 }
	 
	 /**
	  * Method to set time out for scrolling method if no clicks for some time.
	  * 
	  */
	 function fbSetScrollingTimeOut() {
		 if(fbScrollingTimeout) {
		 		clearTimeout(fbScrollingTimeout);
			 }
		 fbScrollingTimeout = setTimeout("faceBookScrolling()",getResumeScrollTime());
	 }
	 
	 
	 
	/**
	 * This method clear the arrays used.
	 * @return
	 */ 
	function clearArrays() {
		 	rssFeedTime.splice(0,rssFeedTime.length);
		 	rssFeedDate.splice(0,rssFeedDate.length);
		 	rssFeedTitle.splice(0,rssFeedTitle.length);
		 	rssFeedAuthor.splice(0,rssFeedAuthor.length);
		 	rssFeedLink.splice(0,rssFeedLink.length);
		 	fbFeedTime.splice(0,fbFeedTime.length);
		 	fbFeedDate.splice(0,fbFeedDate.length);
		 	fbFeedTitle.splice(0,fbFeedTitle.length);
		 	fbFeedAuthor.splice(0,fbFeedAuthor.length);
		 	fbFeedLink.splice(0,fbFeedLink.length);
		 	tweetId.splice(0,tweetId.length);
		 	tweetImg.splice(0,tweetImg.length);
		 	tweetName.splice(0,tweetName.length);
		 	tweetText.splice(0,tweetText.length);
		 	tweetTime.splice(0,tweetTime.length);
		 	tweetLink.splice(0,tweetLink.length);
		 	allFeedsId.splice(0,allFeedsId.length);
			rssFeedCnt = 0;
			rssFeedFieldsLength = 0;
			fbFeedFieldsLength = 0;
			fbCnt = 0;
			tCounter = 0;
			statusIdLength = 0;
	  }

	/**
	 * This method to display waiting message before loading messages.
	 * @param divName
	 * @return
	 */
	function cbcShowLoader(divName){
			document.getElementById(divName).innerHTML = "<br/><br/><center><font color=\"#FFFFFF\">Loading please wait...</font></center>";
		}
 
	/**
	 * This method fetches the data from Twitter sources
	 * @return
	 */
	function startTwitter() {

		var flg=0;
		statusIdLength = 0;
		
		for(var j = 0; j <= twitterCount-1; j++) {
			var twitterURL = "http://search.twitter.com/search.json?q="+twitterProfile[j]+"&callback=?";
			$.getJSON(twitterURL,loadTwitterData);
	    }
	 }
	 
	 
	 /**
	 * This method initialize CBCWidget.
	 * @return
	 */
	function cbcInit() {
	   
		cbcShowLoader("allTblDiv");
		
		// Load all Twitter sources data
		
		startTwitter();
		
		
		// Load all RSSFeeds data

		for(var feedCount = 0; feedCount < totalRSSFeeds; feedCount++) {
			var feed = new google.feeds.Feed(rssProfile[feedCount]); //TODO: Change this to blog url
			feed.setNumEntries(getNoOfRSSFeedsFromURL());
			feed.load(cbcFeedLoad);
		}

		
		
		// TODO : Testing purpose - in deployment we need to use the actual RSS url to pull data from Facebook 
		
		// Load all facebook feeds data
		for(var fbfeed = 0; fbfeed < totalFBFeeds; fbfeed++) {
			var ffeed = new google.feeds.Feed(fbProfiles[fbfeed]);
			ffeed.setNumEntries(getNoOfRSSFeedsFromURL());
			ffeed.load(cbcFBFeedLoad);
		}

	}
	
	
	 
	 /**
	 * This method fetches the data from each twitter source.
	 * @return
	 */
	 
	 function loadTwitterData(data){
		 	tCounter++;
			$.each(data, function(i, item) {
				if (i=='results'){
					for (var k=0; k< item.length;k++){
						var date = item[k].created_at;
						var tweetTimestamp = Number(new Date(date));
						tweetId[statusIdLength] = tweetTimestamp;
						feedTypes[tweetTimestamp] = 't';
						tweetImg[tweetTimestamp] = item[k].profile_image_url;
						tweetName[tweetTimestamp] = item[k].from_user;
						tweetText[tweetTimestamp] = item[k].text;
						tweetTime[tweetTimestamp] = item[k].created_at;
						tweetLink[tweetTimestamp] = "http://twitter.com/"+item[k].from_user;
						statusIdLength++;
					}
				}
			});
				if(tCounter == twitterCount) {
					tweetId.sort(cbcSortNumber);
					allFeedsId = allFeedsId.concat(tweetId);
					var text = "";
					var rowText = "";
					for(var status=0;status<statusIdLength && status<twtTotalFeeds;status++) {
				   		var itemID = tweetId[status];
				   		if(cbcModeType == "stationary") {
				   			rowText +="<tr height='86' valign='top'>";
				   		}
				   		else if(cbcModeType == "scroll") {
				   			rowText +="<tr height='86' valign='top' style='display:none'>";
				   		}
				   		rowText += "<td><a target='_blank' href='"+tweetLink[itemID]+"'><img  border='0' height='40' width='40' src='"+tweetImg[itemID]+"'></a></td>";
				   		rowText += "<td><a target='_blank' href='"+tweetLink[itemID]+"' style='text-decoration: none;'><font class='author'>"+tweetName[itemID]+"</font></a><br><font class='txtmessage'>"+tweetText[itemID].linkify()+"</font><br><img height='14' width='14' src='"+ twitterIcon +"'>&nbsp;&nbsp;<span class='created_at'><font class='time'>"+relative_time(tweetTime[itemID],"t")+"</font></span></td>";
				   		rowText += "</tr>";
				   		text += tweetText[itemID].linkify()+"<br>";
					}
						var tblDiv = document.getElementById("tweetTblDiv");
						var tblstart = "<table height='290' id='tweetTbl' width='230'>";
						var tblend = "</table>";							
						tblDiv.innerHTML = tblstart+rowText+tblend;
						rowText = "";
						tweetPager.setItemsPerPage(twtItemsPerPage);
						if(cbcModeType == "stationary") {
							document.getElementById("tweetTblDiv").className = "";
						    tweetPager.showPage(1);
						}
						else if(cbcModeType == "scroll") {
							clearInterval(twittInterval);
							document.getElementById("tweetBtnUp").onclick = twitterShowNextFeeds;
							document.getElementById("tweetBtnDown").onclick = twitterShowPrevFeeds;
							document.getElementById("tweetBtnUp").src=getBtnUp();
							twitterScrolling();
						}	
				}		

		}
	
	var twitterCurrentElement = null;
	var twitterFirstMove = true;	 
	
	 /**
	 * This method applies scrolling effect to twiter widget.
	 * @return
	 */
	 function twitterScrolling () {
		 	var element;
		 	twitterFirstMove = true;
		 	twittInterval = window.setInterval(function () {
				element =  $("#tweetTbl").find("tr:hidden:last");
				$("#tweetTblDiv > table").prepend(element);
				element.fadeIn(fadeEffectSpeed);
				twitterCurrentElement = element;
				var eleToHide = $(element).next().next().next(); // Element to hide
				$(eleToHide).css("display","none");
				element.hover( function() {
					$(this).stop();
					$(this).fadeIn("fast");
					$(this).css({'opacity': null});
					clearInterval(twittInterval);
				}, function(){ 
					$(this).unbind('mouseenter mouseleave');
					twitterScrolling();	
				});
			},cbcScrollInterval);
	}
	 
	 /**
	 * Method to get the old items into the view on each click of down button.
	 * @return
	 */
	 function twitterShowPrevFeeds() {
		 stopScrolling(twitterFirstMove,twitterCurrentElement,twittInterval);
		 twitterSetScrollingTimeOut();
		 
		 var nextElement = $(twitterCurrentElement).next(); // Element to display on top of the list
		 var commingElement = nextElement.next().next(); // Element to display on the bottom of the list

		 $(twitterCurrentElement).css("display","none");
		 $("#tweetTblDiv > table").append(twitterCurrentElement);
		 twitterCurrentElement = nextElement;		 
		 if(commingElement.css('display') == 'none') {
			 commingElement.fadeIn("fast");
		 }
	 }
	 
	 /**
	  * Method to get the latest the old items into the view on each click of up button.
	  * @return
	  */
	 function twitterShowNextFeeds() {
		 stopScrolling(twitterFirstMove,twitterCurrentElement,twittInterval);
		 twitterSetScrollingTimeOut();
		
		 var prevElement = $("#tweetTbl").find('tr:hidden:last'); // Element to display on top of the list
		 $("#tweetTblDiv > table").prepend(prevElement);
		 var eleToHide = $(twitterCurrentElement).next().next();
		 $(eleToHide).css("display","none");
		 if(prevElement.text()!="" && prevElement.text().length != 0)
			 twitterCurrentElement = prevElement;
		 $(twitterCurrentElement).fadeIn("fast");
	 }


	 /**
	  * Method to set time out for scrolling method if no clicks for some time.
	  * 
	  */
	 function twitterSetScrollingTimeOut() {
		 if(twitterScrollingTimeout) {
		 		clearTimeout(twitterScrollingTimeout);
			 }
		 twitterScrollingTimeout = setTimeout("twitterScrolling()",getResumeScrollTime());
	 }
	 
	 
	 /**
	 * This method shows messages from all feeds.
	 * @return
	 */
	 
		
	function allFeeds() {
		var tblStart = "<table height='290' id='allTbl' width='230'>";
		var tblEnd = "</table>";

		// Sort all feeds
		allFeedsId.sort(cbcSortNumber);
		
		var tblData = createAllFeedsData();
		
		var tblText = tblStart + tblData + tblEnd;
		var tblDiv = document.getElementById("allTblDiv");
		tblDiv.innerHTML = tblText;
		allPager.setItemsPerPage(itemsPerPage);
		if(cbcModeType == "stationary") {
			document.getElementById("allTblDiv").className = "";
			allPager.showPage(1);
		}
		else if(cbcModeType == "scroll") {
			clearInterval(allInterval);
			document.getElementById("cbcBtnUp").onclick = cbcShowNextFeeds;
			document.getElementById("cbcBtnDown").onclick = cbcShowPrevFeeds;
			document.getElementById("cbcBtnUp").src=getBtnUp();
			allScrolling();
		}
		
		// Call the timer to re-run the intit() method based on time interval.
		clearArrays();
	}

	/*
	 * Get feeds from all feed types and create table rows for CBC widget
	 */
	function createAllFeedsData() {
		var author = "";
		var text1 = "";
		var date;
		var link;
		var img = "";
		var icon = "";
		var allRowText = "";

		for(var element = 0; element < allFeedsId.length; element++) {
			
			var elemValue = allFeedsId[element];
			var type = feedTypes[elemValue];
			if(type == 't'){
				author = tweetName[elemValue];
				text1 = tweetText[elemValue];
				date = tweetTime[elemValue];
				img = tweetImg[elemValue];
				icon = twitterIcon;
				link = tweetLink[elemValue];
			}
			else if(type == 'r') {
				author = rssFeedAuthor[elemValue];
				text1 = rssFeedTitle[elemValue];
				date = rssFeedDate[elemValue];
				img = rssFeedImage;
				icon = rssFeedIcon;
				link = rssFeedLink[elemValue];
			}
			else if(type == 'f') {
				author = fbFeedAuthor[elemValue];
				text1 = fbFeedTitle[elemValue];
				date = fbFeedDate[elemValue];
				img = fbFeedImage;
				icon = fbFeedIcon;
				link = fbFeedLink[elemValue];
			}

			if(cbcModeType == "stationary") {
				allRowText += "<tr height='86' valign='top'>";
			}
			else if(cbcModeType == "scroll") {
				allRowText += "<tr height='86' valign='top' style='display:none'>";
			}
			allRowText += "<td><a target='_blank' href='"+link+"'><img  border='0' height='40' width='40' src='"+img+"'></a></td><td>";
			if(author != "" && author.length != 0)
				allRowText += "<font class='author'><a target='_blank' href='"+link+"' style='text-decoration: none;'>"+author+"</a></font><br>";
			allRowText += "<font class='txtmessage'>"+cbcLimitedText(text1.linkify())+"</font><br><img height='14' width='14' src='"+ icon +"'>&nbsp;&nbsp;<span class='created_at'><font class='time'>"+relative_time(date,type)+"</font></span></td></tr>";
		}
		
		return allRowText;
	}
	
	var cbcCurrentElement = null;
	var cbcFirstMove = true;	 
		
	/**
	 * This method applies scrolling effect for all feeds.
	 * @return
	 */
	function allScrolling () {
			var element;
			cbcFirstMove = true;
			allInterval = window.setInterval(function () {
				element =  $("#allTbl").find("tr:hidden:last");
				$("#allTblDiv > table").prepend(element);
				element.fadeIn(fadeEffectSpeed);
				cbcCurrentElement = element;
				var eleToHide = $(element).next().next().next(); // Element to hide
				$(eleToHide).css("display","none");				
				element.hover( function() {
					$(this).stop();
					$(this).fadeIn("fast");
					$(this).css({'opacity': null});
					clearInterval(allInterval);
				}, function(){ 
					$(this).unbind('mouseenter mouseleave');
					
					allScrolling();	
				});
			},cbcScrollInterval);
	}	 
	
	/**
	 * Method to get the old items into the view on each click of down button.
	 * @return
	 */
	 function cbcShowPrevFeeds() {
		 stopScrolling(cbcFirstMove,cbcCurrentElement,allInterval);
		 cbcSetScrollingTimeOut();
		 
		 var nextElement = $(cbcCurrentElement).next(); // Element to display on top of the list
		 var commingElement = nextElement.next().next(); // Element to display on the bottom of the list

		 $(cbcCurrentElement).css("display","none");
		 $("#allTblDiv > table").append(cbcCurrentElement);
		 cbcCurrentElement = nextElement;		 
		 if(commingElement.css('display') == 'none') {
			 commingElement.fadeIn("fast");
		 }
	 }
	 
	 /**
	  * Method to get the latest the old items into the view on each click of up button.
	  * @return
	  */
	 function cbcShowNextFeeds() {
		 stopScrolling(cbcFirstMove,cbcCurrentElement,allInterval);
		 cbcSetScrollingTimeOut();
		
		var prevElement = $("#allTbl").find('tr:hidden:last'); // Element to display on top of the list
		$("#allTblDiv > table").prepend(prevElement);
		var eleToHide = $(cbcCurrentElement).next().next();
		$(eleToHide).css("display","none");
		if(prevElement.text()!="" && prevElement.text().length != 0)
			cbcCurrentElement = prevElement;
		$(cbcCurrentElement).fadeIn("fast");
	 }
	 
	 /**
	  * Method to set time out for scrolling method if no clicks for some time.
	  * 
	  */
	 function cbcSetScrollingTimeOut() {
		 if(cbcScrollingTimeout ) {
		 		clearTimeout(cbcScrollingTimeout );
			 }
		 cbcScrollingTimeout = setTimeout("allScrolling()",getResumeScrollTime());
	 }
	 
    /**
	 * This method sorts the array elements.
	 * @return
	 */
	
    function cbcSortNumber(a,b)
	{
			return b - a;
	}
	
	/**
	 * This method formats the message data.
	 * @return
	 */
	String.prototype.linkify = function() {
		return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
			var url = m.link(m);
			url = url.substring(2);
			url = '<a target="_blank"'+url;
			return (url);
  		});
 	};
 
  	/**
	 * This method converts the date format into relative time fomat. IE 3 minutes ago.
	 * @return
	 */
	function relative_time(time_value,type) {
		  var values = time_value.split(" ");
		  time_value = values[1] + " " + values[2] + ", " + values[3] + " " +values[4] ;
		  var parsed_date = Date.parse(time_value);
		  var relative_to = (arguments.length > 2) ? arguments[2] : new Date();
		  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
		  delta = delta + (relative_to.getTimezoneOffset() * 60);
			if(type == 'r' || type == 'f') {
				delta = delta - 25200; // Minus 7 hours.
			}
		  var r = '';
		  if (delta < 60) {
			r = 'a minute ago';
		  } else if(delta < 120) {
			r = 'couple of minutes ago';
		  } else if(delta < (45*60)) {
			r = (parseInt(delta / 60)).toString() + ' minutes ago';
		  } else if(delta < (90*60)) {
			r = 'an hour ago';
		  } else if(delta < (24*60*60)) {
			r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
		  } else if(delta < (48*60*60)) {
			r = '1 day ago';
		  } else {
			r = (parseInt(delta / 86400)).toString() + ' days ago';
		  }
	
		  return r;
	}
	function twitter_callback ()
	{
		return true;
	}

	var itemsPerPage = getItemsPerPageInCBC();
	var allPager = new CBCPager("allTbl",itemsPerPage);
	var tweetPager = new CBCPager("tweetTbl",twtItemsPerPage);
	var rssPager = new CBCPager("rssTbl",rssItemsPerPage);
	var fbPager = new CBCPager("fbTbl",fbItemsPerPage);
	
	/**
	 * This class for apply pagination in stationary mode. 
	 */
	function CBCPager(tableName,itemsPerPage) {
			
			this.tableName=tableName;
			this.itemsPerPage=itemsPerPage;
			this.currentPage=1;
			this.pages=0;
			this.inited=false;
			
			this.setItemsPerPage = function(itemsCount) {
				this.itemsPerPage = itemsCount;
				this.init();
			}
	
			this.showRecords=function(from, to) {
				var rows = document.getElementById(this.tableName).rows;
				for (var i = 1; i < rows.length; i++) {
					if (i < from || i > to)
					rows[i].style.display = 'none';
					else
					rows[i].style.display = '';
				}
			}
	
			this.init = function() {
				var rows = document.getElementById(this.tableName).rows;
				var records = (rows.length);
				this.pages = Math.ceil(records / this.itemsPerPage);
				this.inited = true;
			}
	
			this.prev = function() {
				if (this.currentPage > 1)
				this.showPage(this.currentPage - 1);
			}
	
			this.next = function() {
				if (this.currentPage < this.pages)
					this.showPage(this.currentPage + 1);
				else
					this.showPage(this.currentPage);
			}
	
			this.showPage = function(pageNumber) {
				if (! this.inited) {
					return;
				}
	
			this.currentPage = pageNumber;
				var from = (pageNumber - 1) * this.itemsPerPage + 0;
				var to = (from) + (this.itemsPerPage - 1);
				this.showRecords(from,to);
			}
	
			this.showRecords=function(from, to) {
				var rows = document.getElementById(tableName).rows;
				for (var i = 0; i < rows.length; i++) {
					if (i < from || i > to)
						rows[i].style.display = 'none';
					else
						rows[i].style.display = '';
				}
			}
	}


	/**
	 * This method shows the widget content based on selected filter
	 * @return
	 */
	function show(tab){
		if(tab=="allTab"){
			document.getElementById("all").style.display='';
			document.getElementById("allFilter").style.display='';
			document.getElementById("tweetDiv").style.display='none';
			document.getElementById("twitFilter").style.display='none';
			document.getElementById("rssDiv").style.display='none';
			document.getElementById("rssFilter").style.display='none';
			document.getElementById("fbDiv").style.display='none';
			document.getElementById("fbFilter").style.display='none';
		}
		if(tab=="tweetTab"){
			document.getElementById("tweetDiv").style.display='';
			document.getElementById("twitFilter").style.display='';
			document.getElementById("all").style.display='none';
			document.getElementById("allFilter").style.display='none';
			document.getElementById("rssDiv").style.display='none';
			document.getElementById("rssFilter").style.display='none';
			document.getElementById("fbDiv").style.display='none';
			document.getElementById("fbFilter").style.display='none';
		}
		if(tab=="rssTab"){
			document.getElementById("rssDiv").style.display='';
			document.getElementById("rssFilter").style.display='';
			document.getElementById("all").style.display='none';
			document.getElementById("allFilter").style.display='none';
			document.getElementById("tweetDiv").style.display='none';
			document.getElementById("twitFilter").style.display='none';
			document.getElementById("fbDiv").style.display='none';
			document.getElementById("fbFilter").style.display='none';
		}
		if(tab=="fbTab"){
			document.getElementById("fbDiv").style.display='';
			document.getElementById("fbFilter").style.display='';
			document.getElementById("all").style.display='none';
			document.getElementById("allFilter").style.display='none';
			document.getElementById("tweetDiv").style.display='none';
			document.getElementById("twitFilter").style.display='none';
			document.getElementById("rssDiv").style.display='none';
			document.getElementById("rssFilter").style.display='none';
		}
	}
	
	
	/* GIG GUIDE WIDGET*/
	
	
	var gigTweetIdLength = 0;
	var gigGuideProfile = new Array();
	var gigTweetId = new Array();
	var gigTweetText = new Array();
	var gigTweetTime = new Array();
	var gigTweetLink = new Array();
	var callbackCount = 0;
	
	var xmlDoc;
	var gigTotalFeeds = 0;
	var gigTwitterCount = 0; //number of twitter profiles
	var gigModeType = "stationary";
	var gigItemsPerPage = 0;
	var gigIntervalTime = getTimeDuration()*60*1000;
	var gigGuideInterval = null;
	var gigScrollingTimeout = null; 
	/**
	 * This method processes the Gig Guide widget configuration from xml document.
	 * @param xmlDoc - Gig Guide widget configuration in xml format
	 * @return
	 */
	function gigXmlProcessor(xmlDoc) {
		  var dataSources = xmlDoc.getElementsByTagName("TDataSource");
			var dsLength = dataSources.length;
			
			for(var ds = 0; ds < dsLength; ds++) {
				var dsValue = dataSources[ds].childNodes[0];
				gigGuideProfile[ds] = dsValue.nodeValue;
			}
			
			gigTwitterCount = dsLength;
			gigTotalFeeds = xmlDoc.getElementsByTagName("TotalFeeds")[0].childNodes[0].nodeValue;
			gigModeType = xmlDoc.getElementsByTagName("WidgetMode")[0].childNodes[0].nodeValue;
			gigItemsPerPage = xmlDoc.getElementsByTagName("Messages")[0].childNodes[0].nodeValue;
	}
	
 
	/**
	 * This method limits the text size to 140 characters.
	 * @param text - Tweet message.
	 * @return
	 */
	
	function gigLimitText(text) {
		var tLength = 0;
		var fixedLength = getTextLength();
		tLength = text.length;
		if(tLength > fixedLength)
			text = text.substring(0,fixedLength-3)+"...";
		var aOpen = text.lastIndexOf("<a");
		var aClose = text.lastIndexOf("</a>");
		if(aOpen > aClose) {
			if(text.lastIndexOf("\">")==-1)
				text += "\">";
			text += "</a>";
		}
		return text;
	}
	
	/**
	 * This method clear all the arrays used.
	 * @param text - Tweet message.
	 * @return
	 */
	function gigguideClearArrays() {
		gigTweetId.splice(0,gigTweetId.length);
		gigTweetText.splice(0,gigTweetText.length);
		gigTweetTime.splice(0,gigTweetTime.length);
		gigTweetLink.splice(0, gigTweetLink.length);
		gigTweetIdLength = 0;
		callbackCount = 0;
	}

	
	/**
	 * This method to display waiting message before loading messages.
	 * @param divName
	 * @return
	 */
	function gigGuideShowLoader(divName){
		document.getElementById(divName).innerHTML = "<br/><br/><center>Loading please wait...</center>";
	}		
	
	
	/**
	 * This method fetches the data from Twitter sources
	 * @return
	 */
	function gigStartTwitter() {
		var gigTweetRow = "";
		var flg=0;
		for(var j = 0; j < gigTwitterCount; j++) {
			var twitterurl="http://search.twitter.com/search.json?q="+gigGuideProfile[j]+"&callback=?";
			$.getJSON(twitterurl,
		       function(data){
				$.each(data, function(i, item) {
					if (i=='results'){
						for (var k=0; k< item.length;k++){
							var date = item[k].created_at;
							var tweetTimestamp = Number(new Date(date));
							gigTweetId[gigTweetIdLength] = tweetTimestamp;
							gigTweetText[tweetTimestamp] = item[k].text;
							gigTweetTime[tweetTimestamp] = item[k].created_at;
							gigTweetLink[tweetTimestamp] = "http://twitter.com/"+item[k].from_user;
							gigTweetIdLength++;
						 }
						}
					});
					callbackCount++;
					if(callbackCount == gigTwitterCount) {
						gigTweetId.sort(gigSortNumber);
						for(var status=0;status<gigTweetIdLength && status<gigTotalFeeds;status++) {
							var itemID = gigTweetId[status];
							if(gigModeType == "scroll") {
								gigTweetRow += "<tr height='65' valign='top' style='display:none'>";
							} 
							else {
								gigTweetRow += "<tr height='65' valign='top'>";
							}
							var date = new Date(gigTweetTime[itemID]);
							date = date.getDate()+"/"+(date.getMonth()+1)+"/"+date.getFullYear();
							gigTweetRow += "<td>&nbsp;&nbsp;<span class='gigguide_date'>"+date+"</span>";
							gigTweetRow += "<br><font class='gigguide_text'><a style='display:inline;' target='_blank' href='"+gigTweetLink[itemID]+"' class='gigUrlLink'>"+gigLimitText(gigTweetText[itemID].linkify())+"</a></font></td>";
					   		gigTweetRow += "</tr>";
						}
						var gigTblDiv = document.getElementById("gigTblDiv");
						var tblstart = "<table cellpadding='3' cellspacing='3' height='180px' id='gigTbl' width='200'>";
						var tblend = "</table>";
						gigTblDiv.innerHTML = tblstart+gigTweetRow+tblend;
						gigTweetRow = "";
						gigPager.setItemsPerPage(gigItemsPerPage);
						if(gigModeType == "stationary") {
							document.getElementById("gigTblDiv").className = "";
							gigPager.showPage(1);
						}
						else if(gigModeType == "scroll") {
							clearInterval(gigGuideInterval);
							document.getElementById("gigBtnUp").onclick = gigShowNextFeeds;
							document.getElementById("gigBtnDown").onclick = gigShowPrevFeeds;
							document.getElementById("gigBtnUp").src=getBtnUp();
							gigScrolling();
						}
					}
				});
	    }
		gigguideClearArrays();
	}
	
	 var gigCurrentElement = null;
	var gigFirstMove = true;
	
	 /**
	 * This method applies scrolling effect to gigguide widget.
	 * @return
	 */	
	function gigScrolling () {
		var element;
		gigFirstMove = true;
		gigGuideInterval = window.setInterval(function () {
			element =  $("#gigTbl").find('tr:hidden:last');
			$("#gigTblDiv > table").prepend(element);
			element.fadeIn(getFadeInSpeed());
			gigCurrentElement = element;
			var eleToHide = $(element).next().next().next(); // Element to hide
			$(eleToHide).css("display","none");
			element.hover( function() {
					$(this).stop();
					$(this).fadeIn("fast");
					$(this).css({'opacity': null});
					clearInterval(gigGuideInterval);
				}, function(){
					$(this).unbind('mouseenter mouseleave');
					gigScrolling();
				});
		},getScrollInterval());
	}
	
	/**
	 * Method to stop scrolling effect on first click on up and down buttons.
	 */ 

	 function gigStopScrolling() {
		if(gigFirstMove) {
			 $(gigCurrentElement).stop();
			 clearInterval(gigGuideInterval);
			 gigFirstMove = false;
		}
	 }
	 
	/**
	 * Method to get the old items into the view on each click of down button.
	 * @return
	 */
	 function gigShowPrevFeeds() {
		 gigStopScrolling();
		 gigSetScrollingTimeOut();
		 
		 var nextElement = $(gigCurrentElement).next(); // Element to display on top of the list
		 var commingElement = nextElement.next().next(); // Element to display on the bottom of the list

		 $(gigCurrentElement).css("display","none");
		 $("#gigTblDiv > table").append(gigCurrentElement);
		 gigCurrentElement = nextElement;		 
		 if(commingElement.css('display') == 'none') {
			 commingElement.fadeIn("fast");
		 }

	 }
	
	 /**
	  * Method to get the latest the old items into the view on each click of up button.
	  * @return
	  */
	 function gigShowNextFeeds() {
		 gigStopScrolling();
		 gigSetScrollingTimeOut();
		
		var prevElement = $("#gigTbl").find('tr:hidden:last'); // Element to display on top of the list
		$("#gigTblDiv > table").prepend(prevElement);
		var eleToHide = $(gigCurrentElement).next().next();
		$(eleToHide).css("display","none");
		if(prevElement.text()!="" && prevElement.text().length != 0)
			gigCurrentElement = prevElement;
		$(gigCurrentElement).fadeIn(getFadeInSpeed());
	 }
	 
	 /**
	  * Method to set time out for scrolling method if no clicks for some time.
	  * @return
	  */
	 function gigSetScrollingTimeOut() {
		 if(gigScrollingTimeout) {
		 		clearTimeout(gigScrollingTimeout);
			 }
		 gigScrollingTimeout = setTimeout("gigScrolling()",getResumeScrollTime());
	 }
	
	 /**
	 * This method sorts the given array
	 * @return
	 */	

    function gigSortNumber(a,b)
	{
    		return b - a;
	}
	
	String.prototype.linkify = function() {
		return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
			var url = m.link(m);
			url = url.substring(2);
			url = '<a target="_blank"'+url;
			return (url);
  		});
 	};
 
	function twitter_callback ()
	{
		return true;
	}

	
	/**
	 * This class for apply pagination in stationary mode. 
	 */
	function GigGuidePager(tableName,itemsPerPage) {
		
		this.tableName=tableName;
		this.itemsPerPage=itemsPerPage;
		this.currentPage=1;
		this.pages=0;
		this.inited=false;
		
		this.setItemsPerPage = function(itemsCount) {
			this.itemsPerPage = itemsCount;
			this.init();
		}
		
	
		this.showRecords=function(from, to) {
			var rows = document.getElementById(this.tableName).rows;
			for (var i = 1; i < rows.length; i++) {
				if (i < from || i > to)
				rows[i].style.display = 'none';
				else
				rows[i].style.display = '';
			}
		}
	
		this.init = function() {
			var rows = document.getElementById(this.tableName).rows;
			var records = (rows.length);
			this.pages = Math.ceil(records / this.itemsPerPage);
			this.inited = true;
		}
	
		this.prev = function() {
			if(this.currentPage == 2 || this.currentPage == 1){
				document.getElementById("gigBtnUp").src=btn_up_gray;
				document.getElementById("gigBtnDown").src=btn_down;
			}else{
				document.getElementById("gigBtnUp").src=btn_up;
				document.getElementById("gigBtnDown").src=btn_down;
			}
			
			if (this.currentPage > 1)
				this.showPage(this.currentPage - 1);
		}
	
		this.next = function() {
			if(this.currentPage == this.pages-1 || this.currentPage == this.pages) {
				document.getElementById("gigBtnUp").src=btn_up;
				document.getElementById("gigBtnDown").src=btn_down_gray;
			}else {
				document.getElementById("gigBtnUp").src=btn_up;
				document.getElementById("gigBtnDown").src=btn_down;				
			}
			
			if (this.currentPage < this.pages)
				this.showPage(this.currentPage + 1);
			else
				this.showPage(this.currentPage);
		}
	
		this.showPage = function(pageNumber) {
			if (! this.inited) {
				return;
			}
			if(this.pages == 1) {
				document.getElementById("gigBtnDown").src=btn_down_gray;
				document.getElementById("gigBtnUp").src=btn_up_gray;
			}
			this.currentPage = pageNumber;
			var from = (pageNumber - 1) * this.itemsPerPage + 0;
			var to = (from) + (this.itemsPerPage - 1);
			this.showRecords(from,to);
		}
	
		this.showRecords=function(from, to) {
			var rows = document.getElementById(tableName).rows;
			for (var i = 0; i < rows.length; i++) {
				if (i < from || i > to)
					rows[i].style.display = 'none';
				else
					rows[i].style.display = '';
			}
		}
	}

	/**
	 * This call gigStartTwitter on ready of document.
	 */
	/*
	 $(document).ready( function() {
		gigGuideShowLoader("gigTblDiv");
		gigStartTwitter();
		setInterval("gigStartTwitter()",gigIntervalTime); // intervalTime in milliseconds
	});
*/
	/**
	 * Initialize the pager class for pagination.
	 */
	var gigPager = new GigGuidePager("gigTbl",gigItemsPerPage);
	
/* WORD UP WIDGET*/

	var totalFeedCount = 0; 
	var feedCounter = 0;
	var feedTime = new Array();
	var feedDate = new Array();
	var feedTitle = new Array();
	var feedURL = new Array();
	var wordUpProfiles = new Array();
	var feedFieldsLength = 0;
	var wordUpModeType = "";
	var wordTotalFeeds = 0;
	var wordItemsPerPage = 0;
	var wordUpIntervalTime = getTimeDuration()*60*1000;
	var wordUpInterval = null;
	var pageLoadCount = 0;
	var wordUpScrollingTimeout = null; 
	/**
	 * This method processes the WordUp widget configuration from xml document.
	 * @param xmlDoc - WordUp widget configuration in xml format
	 * @return
	 */	
	
	
	function wordUpXmlProcessor(xmlDoc) {
		  var dataSources = xmlDoc.getElementsByTagName("WDataSource");
			
			var dsLength = dataSources.length;
			for(var ds = 0; ds < dsLength; ds++) {
				var dsValue = dataSources[ds].childNodes[0];
				wordUpProfiles[ds] = dsValue.nodeValue;
			}
		totalFeedCount = dsLength;
		wordTotalFeeds = xmlDoc.getElementsByTagName("TotalFeeds")[1].childNodes[0].nodeValue;
		wordUpModeType = xmlDoc.getElementsByTagName("WidgetMode")[0].childNodes[0].nodeValue;
		wordItemsPerPage = xmlDoc.getElementsByTagName("Messages")[1].childNodes[0].nodeValue;
	  }
	
	/**
	 * This method limits the text size to 140 characters.
	 * @param text - Feed message.
	 * @return
	 */
	function wordUpLimitText(text) {
		var tLength = 0;
		var fixedLength = getTextLength();
		tLength = text.length;
		if(tLength > fixedLength)
			text = text.substring(0,fixedLength-3)+"...";
		var aOpen = text.lastIndexOf("<a");
		var aClose = text.lastIndexOf("</a>");
		if(aOpen > aClose) {
			if(text.lastIndexOf("\">")==-1)
				text += "\">";
			text += "</a>";
		}
		return text;
	}
	
	/**
	 * This method calls the feed loader method for each data source.
	 * @return
	 */
	function wordUpInit() {
		if(pageLoadCount < 1) 
			wordUpShowLoader('indTblDiv');
		pageLoadCount++;
		for(var feedCount = 0; feedCount < totalFeedCount; feedCount++) {
			feed = new google.feeds.Feed(wordUpProfiles[feedCount]);
			feed.setNumEntries(getNoOfRSSFeedsFromURL());
			feed.load(wordUpFeedLoad);
		}
		wordupClearArrays();
	}
	

	/**
	 * This method fetch data from the each RSS feed
	 * @param result
	 * @return
	 */
	function wordUpFeedLoad(result) {
			var author = result.feed.author;
			var allIndexRSS = 0;
			for(var i = 0; i < result.feed.entries.length; i++) {
				var entry = result.feed.entries[i];
				var date = entry.publishedDate; // date and time in standard format
				var timestamp = Number(new Date(date)); // timestamp 				
				feedTime[feedFieldsLength] = timestamp;
				feedTitle[timestamp] = entry.title;
				feedURL[timestamp] = entry.link;
				feedDate[timestamp] = date.toString();
				feedFieldsLength++;
			}
			feedCounter++;
			if(feedCounter == totalFeedCount) {
				var indFeedRow = "";
				feedTime.sort(wordUpSortNumber);
				for(var feed = 0; feed < feedFieldsLength && feed < wordTotalFeeds; feed++) {
					var ref = feedTime[feed];
					var text = wordUpLimitText(feedTitle[ref].linkify());
					if(wordUpModeType == "scroll") {
						indFeedRow += "<tr height='63'  valign='top' style='display:none'><td>";
					} else {
						indFeedRow += "<tr height='63'  valign='top'><td>";
					}
					
					var date = new Date(feedDate[ref]);
					date = date.getUTCDate()+"/"+(date.getUTCMonth()+1)+"/"+date.getUTCFullYear();
					indFeedRow+="&nbsp;&nbsp;<font class='ind_date'>"+date+"</font><br>";
					indFeedRow += "<font class='ind_text'><a style='display:inline;' target='_blank' href='"+feedURL[ref]+"' class='url_link'>"+text+"</a></font></td>";
					indFeedRow += "</tr>";
				}
					var indTbl = document.getElementById("indTblDiv");
					var tblstart = "<table cellpadding='3' cellspacing='3' height='196px' id='indTbl' width='215'>";
					var tblend = "</table>";
					indTbl.innerHTML = tblstart+indFeedRow+tblend;
					indFeedRow = "";
					indPager.setItemsPerPage(wordItemsPerPage);
					if(wordUpModeType == "stationary") {
						document.getElementById("indTblDiv").className = "";
						indPager.showPage(1);
					}
					else if(wordUpModeType == "scroll") {
						$("#indTbl").find('tr').css({'display':'none'});
						clearInterval(wordUpInterval);
						document.getElementById("wuBtnUp").onclick = wordUpShowNextFeeds;
						document.getElementById("wuBtnDown").onclick = wordUpShowPrevFeeds;
						document.getElementById("wuBtnUp").src=getBtnUp();
						wordUpScrolling();
					}
				}
	}

	/**
	 * This method display the waiting message while loading widget.
	 * @param divName
	 * @return
	 */
	function wordUpShowLoader(divName){
		document.getElementById(divName).innerHTML = "<br/><br/><center>Loading please wait...</center>";
	}	
	
	/**
	 * This method apply the scrolling effect for the WordUp widget.
	 * @param rowIndex
	 * @return
	 */

	 var wordUpCurrentElement = null; 
	 var wordUpFirstMove = true;
	 function wordUpScrolling () {
		var element;
		wordUpFirstMove = true;
		wordUpInterval = window.setInterval(function () {
			element = $("#indTbl").find('tr:hidden:last'); // Element to display
			$("#indTblDiv > table").prepend(element);
			element.fadeIn(getFadeInSpeed());
			wordUpCurrentElement = element;
			var eleToHide = $(element).next().next().next(); // Element to hide
			$(eleToHide).css("display","none");
			element.hover( function() {
				$(this).stop();
				$(this).fadeIn("fast");
				$(this).css({'opacity': null});
				clearInterval(wordUpInterval);
			}, function(){ 
				$(this).unbind('mouseenter mouseleave');
				wordUpScrolling();
			});
		},getScrollInterval());
	}
	
	
	/**
	 * Method to stop scrolling effect on first click on up and down buttons.
	 */ 

	 function wordUpStopScrolling() {
		if(wordUpFirstMove) {
			 $(wordUpCurrentElement).stop();
			 clearInterval(wordUpInterval);
			 wordUpFirstMove = false;
		}
	 }
	
	/**
	 * Method to get the old items into the view on each click of down button.
	 * @return
	 */
	 function wordUpShowPrevFeeds() {
		 wordUpStopScrolling();
		 wordUpSetScrollingTimeOut();
		 
		 var nextElement = $(wordUpCurrentElement).next(); // Element to display on top of the list
		 var commingElement = nextElement.next().next(); // Element to display on the bottom of the list

		 $(wordUpCurrentElement).css("display","none");
		 $("#indTblDiv > table").append(wordUpCurrentElement);
		 wordUpCurrentElement = nextElement;		 
		 if(commingElement.css('display') == 'none') {
			 commingElement.fadeIn("fast");
		 }

	 }
	 
	 /**
	  * Method to get the latest the old items into the view on each click of up button.
	  * @return
	  */
	 function wordUpShowNextFeeds() {
		wordUpStopScrolling();
		wordUpSetScrollingTimeOut();
		
		var prevElement = $("#indTbl").find('tr:hidden:last'); // Element to display on top of the list
		$("#indTblDiv > table").prepend(prevElement);
		var eleToHide = $(wordUpCurrentElement).next().next();
		$(eleToHide).css("display","none");
		if(prevElement.text()!="" && prevElement.text().length != 0)
		 wordUpCurrentElement = prevElement;
		$(wordUpCurrentElement).fadeIn(getFadeInSpeed());
	 }
	 
	 /**
	  * Method to set time out for scrolling method if no clicks for some time.
	  * @return
	  */
	 function wordUpSetScrollingTimeOut() {
		 if(wordUpScrollingTimeout) {
		 		clearTimeout(wordUpScrollingTimeout);
			 }
		 wordUpScrollingTimeout = setTimeout("wordUpScrolling()",getResumeScrollTime());
	 }
	 
	 
	 
	/**
	 * This method clear the arrays used.
	 * @return
	 */
	
	function wordupClearArrays() {
		feedTime.splice(0,feedTime.length);
		feedDate.splice(0,feedDate.length);
		feedTitle.splice(0,feedTitle.length);
		feedURL.splice(0,feedURL.length);
		feedCounter = 0;
		feedFieldsLength = 0;
	}
	
	/**
	 * This method to register the wordUpInit handler function to be called once the document loads.
	 * @return
	 */
	
	google.setOnLoadCallback(wordUpInit);
	setInterval("wordUpInit()",wordUpIntervalTime);	
		
	 /**
	 * This method to sort arrays
	 * @return
	 */
	/*function sortArray(array) {
			return array.sort(wordUpSortNumber);
	}
*/
	function wordUpSortNumber(a,b)
	{
			return b - a;
	}
	
	String.prototype.linkify = function() {
		return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
			var url = m.link(m);
			url = url.substring(2);
			url = '<a target="_blank"'+url;
			return (url);
		});
	};
 
	/**
	 * This class to perform pagination effect.
	 * @return
	 */

	function wordUpPager(tableName,itemsPerPage) {
			
			this.tableName=tableName;
			this.itemsPerPage=itemsPerPage;
			this.currentPage=1;
			this.pages=0;
			this.inited=false;
			
			this.setItemsPerPage = function(itemsCount) {
				this.itemsPerPage = itemsCount;
				this.init();
			}
	
			this.showRecords=function(from, to) {
				var rows = document.getElementById(this.tableName).rows;
				for (var i = 1; i < rows.length; i++) {
					if (i < from || i > to)
					rows[i].style.display = 'none';
					else
					rows[i].style.display = '';
				}
			}
	
			this.init = function() {
				var rows = document.getElementById(this.tableName).rows;
				var records = (rows.length);
				this.pages = Math.ceil(records / this.itemsPerPage);
				this.inited = true;
			}
	
			this.prev = function() {
				if(this.currentPage == 2 || this.currentPage == 1){
						document.getElementById("wuBtnUp").src=btn_up_gray;
						document.getElementById("wuBtnDown").src=btn_down;
				}else{
						document.getElementById("wuBtnUp").src=btn_up;
						document.getElementById("wuBtnDown").src=btn_down;
				}
	
				if (this.currentPage > 1)
					this.showPage(this.currentPage - 1);
			}
	
			this.next = function() {
				if(this.currentPage == this.pages-1 || this.currentPage == this.pages) {
					document.getElementById("wuBtnUp").src=btn_up;
					document.getElementById("wuBtnDown").src=btn_down_gray;
				}else {
					document.getElementById("wuBtnUp").src=btn_up;
					document.getElementById("wuBtnDown").src=btn_down;				
				}
			
				if (this.currentPage < this.pages)
					this.showPage(this.currentPage + 1);
				else
					this.showPage(this.currentPage);
			}
	
			this.showPage = function(pageNumber) {
				if (! this.inited) {
					return;
				}
				if(this.pages == 1) {
					document.getElementById("wuBtnDown").src=btn_down_gray;
					document.getElementById("wuBtnUp").src=btn_up_gray;
				}
				this.currentPage = pageNumber;
				var from = (pageNumber - 1) * this.itemsPerPage + 0;
				var to = (from) + (this.itemsPerPage - 1);
				this.showRecords(from,to);
			}
	
			this.showRecords=function(from, to) {
				var rows = document.getElementById(tableName).rows;
				for (var i = 0; i < rows.length; i++) {
					if (i < from || i > to)
						rows[i].style.display = 'none';
					else
						rows[i].style.display = '';
				}
			}
	}	
	
	// Initialize the pagination for wordup widget.
	var indPager = new wordUpPager("indTbl",wordItemsPerPage);


	
	
	/*PAGE LOAD*/
	
	  //when the page is finished loading
	  $(document).ready(function(){

		gigGuideShowLoader("gigTblDiv");
		gigStartTwitter();
		setInterval("gigStartTwitter()",gigIntervalTime); // intervalTime in milliseconds	

		var seekToTime; //variable to work out the time to seek to based on a percentage length of the seeker.
		$("#slider").slider({
					min: 0,
					max: 100,
					start: function () { //event is triggered when the user starts sliding. Pauses the video
						seekWithVideo = false; //stop the slider moving if video is playing

					},
					change: function (event, ui) { //event is triggered on slide stop to seek the video
						if(ytplayer) {
							seekToTime = ytplayer.getDuration() * (ui.value/100);
							seekTo(seekToTime);
							if(playerState == 3){
								document.getElementById("playpause").className = "pausebtn";
							}
						}
					},
					stop: function () { //event is triggered when the user stops sliding. resumes playback
						if(playerState == 1){
							play();
						}
						seekWithVideo = true; //start the slider moving again

					},
					slide: function(event, ui) { //event is triggered as the user slides. it updates the video time.
						seekWithVideo = false; //stop the slider moving if video is playing
						var videotime = ytplayer.getDuration() * (ui.value/100);
						var formattedTime = (getMinutesSecond(videotime))+"/"+(getMinutesSecond(getDuration()));
						updateHTML("formattedTime", formattedTime); //ISSUE! This is being over written by constant checks...

					}
				});
		});


function loadXMLDoc(fileName) {
	var xhttp = null;
	if (window.XMLHttpRequest)
	{
	xhttp=new window.XMLHttpRequest()
	}
	else
	{
	xhttp=new ActiveXObject("Microsoft.XMLHTTP")
	}
	xhttp.open("GET","/CityBeach/"+fileName,false);
	xhttp.send("");
	xmlDoc=xhttp.responseXML;
	return xmlDoc;
}
//process the configuration file for CBCWidget
cbcXMLProcessor(loadXMLDoc("CBCWidget.xml"));
//process the configuratin file for WordUp Widget
wordUpXmlProcessor(loadXMLDoc("WordUp.xml"));
//process the configuratin file for GigGuide Widget
gigXmlProcessor(loadXMLDoc("GigGuide.xml"));



	/**
	* Get the festured Video from database.
	*/

	function getFeaturedVideoId()
		{
		var featuredVideoRequest;
		if (window.XMLHttpRequest)
		{
		  featuredVideoRequest = new window.XMLHttpRequest();
		  featuredVideoRequest.open("GET","/CityBeach/ProcessRequestServlet",false);
		  featuredVideoRequest.setRequestHeader('RequestType','Action.View.FeaturedVideo');
		  featuredVideoRequest.send("");
		  return featuredVideoRequest.responseText;
		}
		// IE 5 and IE 6
		else if (ActiveXObject("Microsoft.XMLDOM"))
		  {
			featuredVideoRequest = new ActiveXObject("Microsoft.XMLDOM");
			featuredVideoRequest.async = false;
			featuredVideoRequest.load("/CityBeach/ProcessRequestServlet");
		  return featuredVideoRequest;
		 }
		alert("Error loading document");
		return null;

	}

    function onYouTubePlayerReady(playerId) {
        ytplayer = document.getElementById("ytapiplayer");
        setInterval(updateytplayerInfo, 250);
		updateytplayerInfo();
		ytplayer.addEventListener("onStateChange", "onytplayerStateChange");
		ytplayer.addEventListener("onError", "onPlayerError");
		var videoId = getFeaturedVideoId();
		var videoIdArr = getFeaturedVideoId().split("~"); //Gets the video id along with the channel with a separator ~ between them
		//update nowPlayingLink with the link to the CBTV Page
		cueNewVideo(videoIdArr[0], 0); //videoIdArr[0] has the video id and the videoIdArr[1] has the channel name
		//HERE! Update Video Image
		//update nowPlayingLink with the link to the CBTV Page
		var CBTVURL = rootURL + "webapp/wcs/stores/servlet/StaticPageDisplay?storeId=10551&identifier=CBTV_Channel&langId=-1&catalogId=10101&channel="+ videoIdArr[1] + "&v=" + videoIdArr[0];
		$('#nowPlayingLink').attr('href', CBTVURL);
		
	}

