CBC.namespace("APP");
CBC.APP.UberPlayer = (function () {
	var $S = CBC.SETTINGS;
	var $U = CBC.UTIL;
	var $E = CBC.EVENT;
	var $D = CBC.DOM;
	var $ = $U.getElementsById;
	var _this;
	var _lastCategory = {};
	var currentCategory = {};
	var _previousCategory;
	var _currentSortField;
	var _site = "cbc.news.ca";
	var _pureMax = 500;
	var currentRelease = {};
	var _currentSection="shows";
	var allCategories = [];
	var allReleases = [];
	var currentSearcheReleases = [];
	var feedPID;
	var feed_uri;
	//*****MATT
	var googleDeepLink=false;
	var page_data = {
		pageMax: 6,
		currentPage: 1,
		totalPages: 1,
		onclickfunc:'CBC.APP.UberPlayer.changePage',
		container:'pagination'
	};
	var deepLinkRelease = {};
	var defaultSponsorImage = "imgs/bg-shows.jpg";
	var currentSponsorImage = "";
	//var currentAdCategory = "";
	var playerMode = "";
	var showFeatures = true;
	// UI vars
	var _maxDescLength = 100; // maximum length of description to show
	var _extendedDescLength = 145; // maximum length of description to show if no expiry date appears (1 extra line available)
	var _maxExpiryHrs = 168; // do not display expiry information if higher than this number
	var _defaultThumbPath = 'imgs/thumb-default.gif';
	// Search vars
	var _googleSearchBaseUrl = '/search/cbc?json=true&sitesearch=www.cbc.ca/video/watch&';
	var _searchResultsPerPage = 9; // max search items to display per page
	var _searchStartIndex; // stores the position in search results the user is currently at
	var _searchQuery; // search keywords
	var _searchFilter = ''; // holds current search filter
	var _searchObjects = [];
	// Templates
	$S.setVal('tpl_cat_item',new $U.Template('<li id="#{id}"><a href="#{link}">#{label}</a></li>'));
	$S.setVal('tpl_library_clip', new $U.Template('<div id="#{id}" class="clip">#[liveState: {not:<div class="head clearfix"><p class="date">#{date}</p><p class="dur">#{duration}</p></div>||now:<div class="head livenow clearfix">Live Now</div>||later:<div class="head livelater clearfix"><em>Live</em> #{liveDate} at #{liveTime}</div>}]<a href="#{link}" #{anchorAttrib}><img src="#{thumbnailURL}" alt="#{label} - #{title}" width="220" height="124" /><span class="id">#{label}</span><span class="title #{icon_style}">#{title}</span><span class="desc">#{description}<em>#{expiry}</em></span></a></div>'));
	$S.setVal('tpl_video_clip', new $U.Template('<div id="#{id}" class="videoClip clip">#[liveState: {not:<div class="head clearfix"><p class="date">#{date}</p><p class="dur">#{duration}</p></div>||now:<div class="head livenow clearfix">Live Now</div>||later:<div class="head livelater clearfix"><em>Live</em> #{liveDate} at #{liveTime}</div>}]<a href="#{link}" #{anchorAttrib}><img src="#{thumbnailURL}" alt="#{label} - #{title}" width="220" height="124" /><span class="id">#{label}</span><span class="title #{icon_style}">#{title}</span><span class="desc">#{description}<em>#{expiry}</em></span></a></div>'));
	$S.setVal('tpl_audio_clip', new $U.Template('<div id="#{id}" class="audioClip clip">#[liveState: {not:<div class="head clearfix"><p class="date">#{date}</p><p class="dur">#{duration}</p></div>||now:<div class="head livenow clearfix">Live Now</div>||later:<div class="head livelater clearfix"><em>Live</em> #{liveDate} at #{liveTime}</div>}]<a href="#{link}" #{anchorAttrib}><img src="#{thumbnailURL}" alt="#{label} - #{title}" width="220" height="124" /><span class="id">#{label}</span><span class="title #{icon_style}">#{title}</span><span class="desc">#{description}<em>#{expiry}</em></span></a></div>'));
	$S.setVal('tpl_link',new $U.Template('<a href="#{link}">#{label}</a>'));
	$S.setVal('tpl_page_step',new $U.Template('<a href="#" class="#{prevnext}" onclick="return #{onclickfunc}(#{pg});">#{label}</a>'));
	$S.setVal('tpl_page_step_disabled',new $U.Template('<a href="#" class="#{prevnext} disabled" onclick="return false;">#{label}</a>'));
	$S.setVal('tpl_page_num',new $U.Template('<a href="#" class="pg #[active: {false:||true:active}]" onclick="return #{onclickfunc}(#{pg});">#{pg}</a>'));
	
	//request objects
	var categoriesByTitleRequest, categoriesByParentIDRequest, categoriesByIdRequest, numberOfReleasesRequest, releaseListRequest, releaseRequest;
	categoriesByTitleRequest = categoriesByParentIDRequest = categoriesByIdRequest = numberOfReleasesRequest = releaseListRequest = releaseRequest = { kill: function () {} };
	
	// shortcut 
	var Release = CBC.video.Release;
	
	var lastGetCategories = {};
	
	var selectedClipCategoryId;
	var selectedClipId;
	
	var _omni_id;
	
	var events = { onGetCategoriesByParentIDEvent: new YAHOO.util.CustomEvent("onGetCategoriesByParentIDEvent", this) };
	
	return {
	
		ON_GET_CATEGORY_BY_PARENT_ID_EVENT: "onGetCategoriesByParentIDEvent",
	
		init: function (initObject) {
			_this = this;
			feedPID = initObject.feedPID;
			_omni_id = initObject.omni_id;
			feed_uri = initObject.feed_uri;
			
			this.CATEGORY_QUERY = this.CATEGORY_QUERY();
			this.RELEASE_QUERY = this.RELEASE_QUERY();
			
			SWFAddress.addEventListener(SWFAddressEvent.EXTERNAL_CHANGE, this.handleLocationChange );
			
			//****
			var swfa_val=0;
			if (this.getQuerystring('clip').length > 1) {
				googleDeepLink=true;
				swfa_val=this.getQuerystring('clip');
				
			} else {
	
				swfa_val = SWFAddress.getValue();
		
			}
			//****
			//var swfa_val = SWFAddress.getValue();
			
			if (swfa_val.length > 1) {
				if (swfa_val == "/Search") {
					this.switchLibraryTab('search');
					this.switchMode("features");
					$('bbox').src = "bigbox.html?shows";
				} else {
					this.deepLink(swfa_val);
				}
			} else {
				this.deepLink(initObject.categoryName);
			}
			
			//****MATT
			if (swfa_val.length > 1) {
				if (swfa_val == "/Search") {
					this.switchLibraryTab('search');
					this.switchMode("features");
					$('bbox').src = "bigbox.html?shows";
				} else {
					this.deepLink(swfa_val);
				}
			} else {
				this.deepLink(initObject.categoryName);
			}
		},
		
		//****MATT
		getQuerystring: function (key, default_) {
		  if (default_==null) default_="";
		  key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
		  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
		  var qs = regex.exec(window.location.href);
		  if(qs == null)
			return default_;
		  else
			return qs[1];
		},

		setBigBoxCategory : function (category) {
			if (playerMode=="features" || playerMode=="") {
				document.getElementById('bbox').src = "bigbox.html?"+category;
			}
		},

		deepLink: function (fullCategoryName) {
			
			var clipId, rootCategory, category, i = 0, match, categoryId;
			
			var orgPath = fullCategoryName;
			
			fullCategoryName = this.replaceAmpersands(fullCategoryName);
			fullCategoryName = this.replaceQuestionMarks(fullCategoryName);
			fullCategoryName 	= this.replaceUnderscores(fullCategoryName);
			
			fullCategoryName = fullCategoryName.replace( /\/+$/, "" )
			
			// clipId category
			// /123/ID=1234,/123,123,1234
			match = fullCategoryName.match( /(\/([0-9]+))?\/ID=([0-9]+)$/ );
			if( match )
			{
				clipId = parseInt( match[3], 10 );
				categoryId = parseInt( match[2], 10 );
				
				//category end index
				i += clipId ? match[0].length : 0; 
				
				if( !selectedClipCategoryId && categoryId && clipId )
				{
					this.getCategoriesById( categoryId, clipId );
					return;
				}
			}

			category = fullCategoryName.substring( (fullCategoryName.charAt(0) == '/') ? 1 : 0,
													fullCategoryName.length - i );
			
			if( !category.match( /^shows\/?|radio\/?|news\/?|sports\/?|search\/?/i ) )
			{
				category = 'shows';//default to shows
			}
			
			if( clipId && !categoryId ) {// must be an old link
				
				//add hook for clip
				var temp = this.$releaseLoaded;
				_this.$releaseLoaded = function ()
				{
					var c = _this.findCategoryByFullTitle( category );
					if( c )
					{
						_this.$playClipAndValidateCategory.call( _this, clipId, c.ID );
					}
					_this.$releaseLoaded = temp;
				};
				
				//root category
				i = category.indexOf( "/" );
				rootCategory = category.substring( 0, (i == -1) ? category.length : i ).toLowerCase();
				
				//load category
				if( rootCategory != "search" )
				{
					this.$setinitState( rootCategory );
					
					//do not set url on initial load
					var temp2 = this.$releaseLoaded;
					this.$releaseLoaded = function ()
					{
						this.$releaseLoaded = temp2;
						this.playClip.call( this, clipId );
					}
					
					this.getCategoriesByTitle( category.split( "/" ) );
				}
				else
				{
					//play search clip
					this.$setinitState( "search" );
					this.playRelease(clipId);
				}
			}
			else if( selectedClipCategoryId && selectedClipId ) {
				this.handleSWFAddressChange( category + "/" + selectedClipCategoryId + "/ID=" + selectedClipId );
			}
			else {
				this.handleSWFAddressChange( category );
			}
		},
		
		handleSWFAddressChange: function ( path )
		{
			var clipId, rootCategory, category, i = 0, match, categoryId;
			
			path = this.replaceAmpersands(path);
			path = this.replaceQuestionMarks(path);
			path = this.replaceUnderscores(path);
			
			match = path.match( /(\/([0-9]+))?\/ID=([0-9]+)$/ );
				
			if( match )
			{
				clipId = parseInt( match[3], 10 );
				categoryId = parseInt( match[2], 10 );
				
				//category end index
				i += clipId ? match[0].length : 0; 
				
				if( !selectedClipCategoryId && categoryId && clipId )
				{
					this.getCategoriesById( categoryId, clipId );
					return;
				}
			}
			
			category = path.substring( (path.charAt(0) == '/') ? 1 : 0, path.length - i );
			
			//root category
			i = category.indexOf( "/" );
			rootCategory = category.substring( 0, (i == -1) ? category.length : i ).toLowerCase();
			
			var fullCategoryArray;
			if( !rootCategory ||  !rootCategory.match( /^shows|radio|news|sports|search/ ) )
			{ 
				rootCategory = "shows"; 
				fullCategoryArray = ["Shows"];
			} 
			else
			{
				fullCategoryArray = category.split( "/" );
			}
			
			if( fullCategoryArray.length == 1 && !clipId ) // set initial 
			{
				this.$setinitState( rootCategory );
				this.$showFeatures( rootCategory );
				if( rootCategory != "search" )
				{
					this.getCategoriesByTitle( fullCategoryArray );
				}
			}
			else if ( fullCategoryArray.length > 1 && !clipId )//set category only state
			{
				this.$setinitState( rootCategory );
				this.$showFeatures( rootCategory );
				this.getCategoriesByTitle( fullCategoryArray );
			}
			else //set category and clip state
			{
				
				if( rootCategory == "search" )
				{
					this.$setinitState( rootCategory );
				}
				else
				{
					var loadCategory = true;
					if( currentCategory )
					{
						if( currentCategory.fullTitle == category )
						{
							loadCategory = false;
						}
					}
					
					if( loadCategory ) {
						this.$setinitState( rootCategory );
						this.getCategoriesByTitle( fullCategoryArray );
					}
				}
				
				if( selectedClipId != clipId )
				{
					var temp = this.$releaseLoaded;
					_this.$releaseLoaded = function ()
					{
						_this.playClip.call( _this, clipId );
						_this.$releaseLoaded = temp;
					}
				}
			}
		},
		
		//hook hack
		$releaseLoaded: function (){
			this.setURL();
		},
		
		$setinitState: function ( rootCategory )
		{
			page_data.pageMax = 6;
			
			switch( rootCategory )
			{
				case 'radio' :
				page_data.pageMax = 12;
				site = "cbc.ca/radio";
				defaultSponsorImage = "imgs/bg-radio.jpg";
				_currentSection="radio";
				break;
				
				case 'news' :
				_site = "cbc.news.ca";
				defaultSponsorImage = "imgs/bg-news.jpg";
				_currentSection="news";
				break; 
				
				case 'sports' :
				_site = "cbc.sports.ca";
				defaultSponsorImage = "imgs/bg-sports.jpg";
				_currentSection="sports";
				break;
				
				case 'search' :
				_site = "cbc.ent.ca";
				defaultSponsorImage = "imgs/bg-shows.jpg";
				_currentSection="shows";
				break;
				
				default :
				_site = "cbc.ent.ca";
				defaultSponsorImage = "imgs/bg-shows.jpg";
				_currentSection="shows";
				rootCategory = 'shows';
				break;
				
			}
			
			this.switchLibraryTab( rootCategory );
			this.setBigBoxCategory( rootCategory );
			
		},
		
		$showFeatures: function ( rootCategory )
		{
			this.switchMode("features");
			
			var swf = swfobject.getObjectById("features_id");
			if (swf){
				if (swf.setCategoryId != null){
					swf.setCategoryId( rootCategory );
				}
			}
		},
		
		$isReleaseCategoryIdValid: function ( release, categoryId )
		{
			if( release.categoryIDs instanceof Array )
			{
				var list = release.categoryIDs;
				var i = list.length;
				while( i-- )
				{
					if( list[i] == categoryId )
					{
						return true;
					}
				}
			}
			return false;
		},
		
		$playClipAndValidateCategory: function ( clipId, categoryId )
		{
			var r = this.findRelease( clipId );
			if( r ){
				if (r.ID && r.URL){
					if( !this.$isReleaseCategoryIdValid( r, categoryId )  )
					{
						selectedClipCategoryId = r.categoryIDs[r.categoryIDs.length	];
					}
					this.playRelease(r.ID);
				}
			}
			if( !r )
			{
				var temp = this.onGetReleaseByIdHook;
				this.onGetReleaseByIdHook = function (release)
				{
					if(release)
					{
						if( !this.$isReleaseCategoryIdValid( release, categoryId ) )
						{
							selectedClipCategoryId = release.categoryIDs[release.categoryIDs.length];
						}
					}
					this.onGetReleaseByIdHook = temp;
				}
				
				this.getReleaseById( clipId );
			}
		},
		
		playClip: function ( clipId )
		{
			var r = this.findRelease( clipId );
			if( r ){
				if (r.ID != null && r.URL != null){
					this.playRelease(r.ID);
				}
			}
			if( !r )
			{
				if( CBC.radio ) { 
					if( CBC.radio.streams ) {
							var obj = CBC.radio.streams.getStreamByClipId( clipId );
							if( obj ){ CBC.radio.streams.playStream( obj ); return; }
						}
				}
			}
			if( !r )
			{
				this.getReleaseById( clipId );
			}
		},
		
		
		handleLocationChange: function (e) {

			CBC.APP.UberPlayer.handleSWFAddressChange( e.path );
			
			SWFAddress.setTitle("CBC - Videos - "+e.path);
		},
		
		
		
		getCategoriesById: function ( id, clipId )
		{
			 
			var query = feed_uri + "/categories?byId=" + id + "&fields=fullTitle,id&context=" + clipId + "&form=json";
			
			categoriesByIdRequest.kill();
			var request = new JSONRequest( query, 'CBC.APP.UberPlayer.onGetCategoriesById');
			request.send();
			categoriesByIdRequest = request;
		},
		
		onGetCategoriesById: function (response)
		{
			 
			if( typeof( response ) != "string" )
			{
				if (response.entries.length > 0 ) {
					
					var obj = response.entries[0];
					selectedClipCategoryId = CBC.video.Category.$getCategoryId( obj.id );
					_this.handleSWFAddressChange( obj.plcategory$fullTitle + "/" + selectedClipCategoryId + "/ID=" + arguments[1] );
				}
			}
		},
		
		CATEGORY_QUERY: function (){
			
			var query = feed_uri + "/categories?form=json"
			
			return query;
		},
		
		getCategoriesByTitle: function (fullCategoryArray) 
		{
			
			this.displayLoading(true);
			
			var list = fullCategoryArray;
			var count = list.length - 1;
			var titles = "";
			var i;
			for( i = 0; i < count; i++ )
			{
				titles += list.slice(0,i+1).join("/") + '|';
			}
			titles += list.slice(0,count+1).join("/");
			
			var query = this.CATEGORY_QUERY + "&byFullTitle=" + titles;
			
			categoriesByTitleRequest.kill();
			var request = new JSONRequest( query, 'CBC.APP.UberPlayer.onGetCategoriesByTitle');
			request.send();
			categoriesByTitleRequest = request;
		},
		
		onGetCategoriesByTitle: function (response)
		{
			_this.displayLoading(false);
			
			if ( response ) {
				
				var cats = CBC.video.Category.create( response );
				var sort = function (a,b)
				{
					if( a.fullTitle.length > b.fullTitle.length ) { return 1; }
					if( a.fullTitle.length < b.fullTitle.length ) { return -1; }
					return 0;
				}
				cats.sort(sort);
				var i, j = cats.length - 1;
				var cat;
				var catById;
				
				for( i = 0; i < j; i++ )
				{
					cat = cats[i];
					if( cat.hasChildren )
					{
						catById = cat;
					}
					_this.pushToAllCategories( cat );
				}
				
				cat = cats[ cats.length - 1 ];
				if(( !catById ) || ( cat.hasChildren )) { catById = cat; }
				
				_this.pushToAllCategories( cat );
				
				_this.getCategoriesByParentID( catById.ID );
				
				currentCategory = cat;
				
			} else {
				_this.deepLink("Shows");
			}
		},
		
		getCategoriesByParentID: function (categoryID ) {
			 
			this.switchFilter('libraryfilters',$('fFeatured'));
			this.displayLoading(true);
			
			page_data.currentPage = 1;
			
			currentCategory = this.findCategory(categoryID);
			
			var categoryRequestString = this.CATEGORY_QUERY + "&byParentId=" + categoryID;
			categoriesByParentIDRequest.kill();
			var request;
			request = new JSONRequest(categoryRequestString, "CBC.APP.UberPlayer.onGetCategoriesByParentID" );
			request.send();
			categoriesByParentIDRequest = request;
		},
		
		onGetCategoriesByParentID: function (response)
		{
			 if( typeof( response ) != "string" )
			 {
				_this.displayLoading(false);
				_this.createCategoryObjects(response);
				_this.$displayBreadcrumb( currentCategory.ID );
				_this.getReleaseList( currentCategory.ID, _this.getCurrentPage() );
				
				events[this.ON_GET_CATEGORY_BY_PARENT_ID_EVENT].fire();
			 }
		},
		
		getCategories: function ( id )
		{
			//little optimization
			// TODO: re-enable this (nussbauj, 20110627)
			//if( lastGetCategories[ id ] ) return lastGetCategories[ id ];
			
			var cat = this.findCategory( id );
			var list = [];
			while( cat )
			{
				list.push( cat );
				if( cat.hasOwnProperty( "parentID") )
				{
					cat = this.findCategory( cat.parentID );
					if( !cat.hasOwnProperty( "ID" ) ){ cat = null; }
				}
				else
				{
					cat = null;
				}
			}
			
			lastGetCategories[ id ] = list;
			
			return list;
		},
		
		$displayBreadcrumb: function ( id )
		{
			//list of categories
			var list = this.getCategories( id );
			var i = list.length;
			var dataList = [];
			while( i-- )
			{
				dataList.push( { link:list[i].hyperlink, label:list[i].title } );
			}
			
			this.displayBreadcrumb( dataList );
		},

		isEmpty: function (ob) {
			for (var i in ob) {
				return false;
			}
			return true;
		},

		pushToAllCategories: function (category) {
			if (this.isEmpty(this.findCategory(category.ID))) {
				allCategories.push(category);
			}
		},

		getCategoriesByParentId: function ( id )
		{
			var i = allCategories.length;
			var list = [];
			while( i-- )
			{
				if( allCategories[ i ].parentID == id )
				{
					list.push( allCategories[ i ] );
				}
			}
			return list;
		},
		
		createCategoryObjects: function (response) {
			
			
			var cats = CBC.video.Category.create( response ),
			cat = cats[ cats.length-1 ],
			i = cats.length,
			j = i;
			while( j-- ) {
				this.pushToAllCategories( cats[j] );
			}
			
			if( !cat ){ cat = this.findCategory( currentCategory.parentID ); }
			else{ cat =	this.findCategory( cat.parentID ); }
			
			var list = this.getCategoriesByParentId( cat.ID );
			
			i = list.length;
			var displayList = [];
			while( i-- )
			{
				cat = list[i];
				displayList.push( {
					id: cat.ID,
					link: cat.hyperlink,
					label: cat.title,
					group: cat.GroupLevel || 1,
					order: cat.GroupOrder || 1,
					logic: {
						isActive: false
					}
				});
			}
			
			displayList.sort(this.categorySort);
			
			this.displayCategories( displayList, currentCategory.treeOrder );
			this.hightlightCategory( currentCategory.ID );
		},
		
		RELEASE_QUERY: function (){
			
			var query = feed_uri + "?form=json";
			var fields = [ "added", "categories", "categoryIds", "content", "defaultThumbnailUrl", "description", "expirationDate", "keywords", "pubDate", "title", ":adSite", ":adCategory", ":audioVideo", ":commentsEnabled", ":episodeNumber", ":event", ":genre", ":isPLS", ":liveOndemand", ":relatedURL1", ":relatedURL2", ":relatedURL3", ":seasonNumber", ":segment", ":show", ":sport", ":subtitles", ":type" ];
			var releaseFields = [ "approved", "id", "url" ];
			
			query += "&fields=" + fields.join(",");
			query += "&releaseFields=" + releaseFields.join(",");
			
			query += "&byApproved=true&count=true";
			
			return query;
		},	
		
		getReleaseById: function ( id )
		{
			 
			releaseRequest.kill();
			releaseRequest = new JSONRequest( this.RELEASE_QUERY + "&byContent=byReleases%3DbyId%253D" + id, "CBC.APP.UberPlayer.onGetReleaseById" );
			releaseRequest.send();
		},
		
		onGetReleaseById: function ( response )
		{
			 
			
			if( typeof(response) != "string" )
			{
				if( response.entries.length > 0 )
				{
					var clip = response.entries[0];
			
					release = new Release(clip);
			
					/*
					var adcat = currentCategory.AdCategory;
					if( !adcat ) {
						var list = this.getCategories( currentCategory.ID );
						var j = list.length;
						while( j-- )
						{
							adcat += this.cleanAdParams( list[j].title );
						}
					}
					*/
					this.setAdCategory( release );
					release.setAdParameters( _currentSection, release.adCategory );

					this.pushToAllReleases(release);
					
					this.onGetReleaseByIdHook( release );
					
					_this.playRelease( release.ID );
				}
			}
		},
		
		onGetReleaseByIdHook: function (release){},
		
		getReleaseList: function (categoryID, currentPage) {
			 
			this.displayLoading(true);
			
			var q = this.RELEASE_QUERY;
			
			//var cat = this.getCategories( categoryID );
			var cat = currentCategory; // ??
			
			if( cat ) 
			{
				if (cat.FeedUrl) {
					q = cat.FeedUrl + q.substr( q.indexOf("?") );
				} else if ((cat.IsDynamicPlaylist == "true") || (cat.IsDynamicPlaylist === true)) {
					var customValues = [];

					if (cat.Keywords) {
						q += "&q=" + cat.Keywords.split(", ").join(",");
					}

					if (cat.AudioVideo) {
						customValues.push("{audioVideo}{" + cat.AudioVideo + "}");
					}
					if (cat.BylineCredit) {
						customValues.push("{bylineCredit}{" + cat.BylineCredit + "}");
					}
					if (cat.CBCPersonalities) {
						customValues.push("{cBCPersonalitiesReporter}{" + cat.CBCPersonalities + "}");
					}
					if (cat.Characters) {
						customValues.push("{characters}{" + cat.Characters + "}");
					}
					if ((cat.Account) && (cat.Account !== "(not specified)")) {
						customValues.push("{contentArea}{" + cat.Account + "}");
					}
					if (cat.EpisodeNumber) {
						customValues.push("{episodeNumber}{" + cat.EpisodeNumber + "}");
					}
					if ((cat.Event) && (cat.Event !== "(not specified)")) {
						customValues.push("{event}{" + cat.Event + "}");
					}
					if ((cat.Genre) && (cat.Genre !== "Other")) {
						customValues.push("{genre}{" + cat.Genre + "}");
					}
					if ((cat.LiveOnDemand) && (cat.LiveOnDemand !== "(not specified)")) {
						customValues.push("{liveOndemand}{" + cat.LiveOnDemand + "}");
					}
					if (cat.Organizations) {
						customValues.push("{organizations}{" + cat.Organizations + "}");
					}
					if (cat.People) {
						customValues.push("{people}{" + cat.People + "}");
					}
					if (cat.Producers) {
						customValues.push("{producers}{" + cat.Producers + "}");
					}
					if ((cat.Region) && (cat.Region !== "(not specified)")) {
						customValues.push("{region}{" + cat.Region + "}");
					}
					if (cat.SeasonNumber) {
						customValues.push("{seasonNumber}{" + cat.SeasonNumber + "}");
					}
					if (cat.Segment) {
						customValues.push("{segment}{" + cat.Segment + "}");
					}
					if ((cat.Show) && (cat.Show !== "(not specified)")) {
						customValues.push("{show}{" + cat.Show + "}");
					}
					if ((cat.Sport) && (cat.Sport !== "(not specified)")) {
						customValues.push("{sport}{" + cat.Sport + "}");
					}
					if (cat.SubEvent) {
						customValues.push("{subEvent}{" + cat.SubEvent + "}");
					}
					if ((cat.ClipType) && (cat.ClipType !== "(not specified)")) {
						customValues.push("{type}{" + cat.ClipType + "}");
					}
					if (customValues.length > 0) {
						q += "&byCustomValue=" + customValues.join(",");
					}
					
					if ((cat.CreatedAfter) || (cat.CreatedBefore)) {
						q += '&byUpdated=' + cat.CreatedAfter + '-' + cat.CreatedBefore;
					}
					
				} else {
					q += '&byCategoryIds=' + categoryID;
				}
			}


			var unmappedSortField, mappedSortField, mappedSortOrder = "";
			if (_currentSortField) {
				unmappedSortField = _currentSortField;
				mappedSortOrder = "|desc";
			} else if (currentCategory.SortField != "(not specified)") {
				unmappedSortField = currentCategory.SortField;
				if (currentCategory.SortOrder == "Descending") {
					mappedSortOrder = "|desc";
				}
			}
			
			if (unmappedSortField) {
				switch (unmappedSortField) { // added, airdate, lastModified, requestCount, title
					case "airdate":
						mappedSortField = "pubDate";
						break;
					case "lastModified":
						mappedSortField = "updated";
						break;
					case "requestCount":
						mappedSortField = "metrics.viewCount.last7Days";
						break;
					default: // added, title
						mappedSortField = unmappedSortField;
						break;
				}
				
				q += "&sort=" + mappedSortField + mappedSortOrder;
			}
			
			var maxClips = (currentCategory.MaxClips) ? currentCategory.MaxClips : _pureMax;
			page_data.currentPage = currentPage;
			var n = page_data.currentPage * page_data.pageMax;
			var start = Math.max(0, n - (page_data.pageMax - 1) );
			var end = Math.min( parseInt( maxClips ), n );
			q += "&range=" + start + "-" + end;
			
			releaseListRequest.kill();
			var releaseRequest = new JSONRequest(q, "CBC.APP.UberPlayer.onGetReleaseList");
			releaseRequest.send();
			releaseListRequest = releaseRequest;
		},
		
		onGetReleaseList: function (response)
		{
			 
			_this.displayLoading(false);
			if (response.entries.length) {
				if( response.hasOwnProperty("totalResults") ) {
					_this.setPageData( response.totalResults );
				}
				_this.createReleaseObjects(response.entries, 'clips');
				_this.displayPagination(page_data);
			}
			//initializing = false;
		},
		
		reOrder: function (targ, sortField) {
			this.switchFilter('libraryfilters',targ);

			this.getReleaseList( currentCategory.ID, this.getCurrentPage() );

		},
		
		getCurrentPage: function ()
		{
			return page_data.currentPage;
		},

		setPageData: function ( totalCount )
		{
			if( !isNaN( totalCount ) )
			{
				var maxClips = (currentCategory.MaxClips) ? currentCategory.MaxClips : _pureMax;
				if (maxClips < totalCount ) {
					page_data.numOfReleases = maxClips;
				} else {
					page_data.numOfReleases = totalCount;
				}
				page_data.totalPages = Math.ceil(page_data.numOfReleases / page_data.pageMax);
				page_data.currentPage = this.getCurrentPage();
			}
		},

		pushToAllReleases: function (release) {
			if (this.isEmpty(this.findRelease(release.ID))) {
				allReleases.push(release);
			}
		},

		createReleaseObjects: function (response, container) {
			var library_clip_data = [];
			var clip, release, highlightClipID;
			for (var i = 0; i < response.length; i++) 
			{
				clip = response[i];
				
				release = new Release(clip);
				
				/*
				var adcat = currentCategory.AdCategory;
				if( !adcat ) {
					var list = this.getCategories( currentCategory.ID );
					var j = list.length;
					while( j-- )
					{
						adcat += this.cleanAdParams( list[j].title );
					}
				}
				*/
				this.setAdCategory( release );
				release.setAdParameters( _currentSection, release.adCategory );
				
				//thisRelease = new this.release(response[i]);
				
				library_clip_data.push({
					id: release.ID,
					rating: "35",
					ratings: "23",
					mediaType: release.hasClosedCaptions() ? "CCVideo" : release.audioVideo,
					length: release.length,
					link: release.hyperlink,
					thumbnailURL: release.thumbnailURL,
					label: release.show,
					title: release.title,
					description: release.description,
					expiry: release.expirationDate,
					airdate: release.airdate,
					relatedClips: release.relatedClips,
					LiveOnDemand: release.liveOnDemand
				});
				
				this.pushToAllReleases(release);
				
				if(selectedClipId == release.ID ) {
					highlightClipID = release.ID;
				}
			}
			
			this.displayLibraryClips(library_clip_data, container);
			
			if ( highlightClipID ) 
			{
				this.highlightElement( highlightClipID );
			}
			
			this.$releaseLoaded();
			
		},

		findCategory: function (categoryID) {
			var returnedCategory = {};
			for (x in allCategories) {
				if (allCategories[x].ID == categoryID) {
					return allCategories[x];
				}
			}
			return returnedCategory;
		},
		
		findCategoryByFullTitle: function (fullTitle)
		{
			var regex = new RegExp( "^"+fullTitle, "i" );
			var i = allCategories.length;
			while( i-- )
			{
				if( regex.test( allCategories[i].fullTitle ) ){ return allCategories[i]; } 
			}
			return null;
		},
		
		findRelease: function (releaseID) {
			var i = allReleases.length;
			
			while( i-- ){
				if( allReleases[ i ].ID == releaseID )
				return allReleases[ i ].clone();
			}
			//check search releases
			i = currentSearcheReleases.length;
			if( i-- ){
				if( currentSearcheReleases[ i ].ID == releaseID )
					return currentSearcheReleases[ i ];
			}
			return null;
		},

		replaceSpaces: function (s) {
			return s && s.replace(/[ ]/g, "_");
		},

		replaceUnderscores: function (s) {
			return s && s.replace(/[_]/g, " ");
		},
		
		replaceAmpersands: function (s) {
			return s && s.replace(/[&]/g, "%26");
		},
		
		replaceQuestionMarks: function (s) {
			return s && s.replace(/[?]/g, "%3F");
		},
		
		replaceApostrophe: function (s) {
			return s && s.replace(/[']/g, "\\'");
		},

		setURL: function (ID) {
			
			if( !currentCategory ) return;
					//|| initializing ) return;
			
			var list = this.getCategories( currentCategory.ID );
			
			var path = "";
			var i = list.length;
			while( i-- )
			{
				path += "/" + this.replaceSpaces( list[i].title );
			}
			
			//if( page_data.currentPage > 1 )
			//{
			//	path += "/" + page_data.currentPage;
			//}
			
			
			if (selectedClipId && selectedClipCategoryId )//&& ID 
			{
				deepLinkRelease.ID = selectedClipId;
				path += "/" + selectedClipCategoryId + "/ID=" + selectedClipId;
				
			}
			else if( path.toLowerCase() == "/shows")
			{
				path = "/";
			}
			
			this.$updateTabLinks( selectedClipCategoryId, selectedClipId );
			
			if( SWFAddress.getValue() != path )
			{
				SWFAddress.setValue( path );
			}
		},

		$updateTabLinks: function ( categoryID, clipId )
		{
			//updated tab links
			var divLinks = ["nshows", "nradio", "nnews", "nsports", "nsearch"];
			var divLinkValues = [ "Shows", "Radio", "News", "Sports", "Search" ];
			var i = divLinks.length;
			var hrefStart = "javascript:CBC.APP.UberPlayer.handleSWFAddressChange('";
			var hrefEnd = "'); void 0;";
			var e;
			
			if( clipId && categoryID )
			{
				while(i--)
				{
					e = document.getElementById( divLinks[i] );
					if( e ){ e = $D.getFirstChild( e ); 
						if( e ){ e.setAttribute( "href", hrefStart + divLinkValues[i] + "/" + categoryID + "/ID=" + clipId + hrefEnd ); }
					}
				}
			}
			else
			{
				while(i--)
				{
					e = document.getElementById( divLinks[i] );
					if( e ){ e = $D.getFirstChild( e );
						if( e ){ e.setAttribute( "href", hrefStart + divLinkValues[i] + hrefEnd ); }
					}
				}
			}
		},
		
		playRelease: function (id) {
		
			//*****MATT
			if (googleDeepLink==true) {
				var fullURL = SWFAddress.getBaseURL()
				var charWhere = fullURL.indexOf("?");
				var baseURL = fullURL.substr(0,charWhere);
				var newURL = baseURL + "#/" + currentCategory.fullTitle + "/ID=" + id;
				SWFAddress.href(newURL);
			}
			//**
		
			if( !this.isSearchTabSelected() )
			{
				selectedClipCategoryId = currentCategory.ID;
			}
			else
			{
				selectedClipCategoryId = null;
			}
			
			CBC.APP.Controller.playClipById(id);
		},
		
	    /**
		 * 
		 * @param {Object} clip 
		 */
		
		setBackgroundByClip: function ( clip )
		{
			if( !clip ) return;
			
			if ( ! clip.hasOwnProperty('backgroundImage') ){
				var c = currentCategory;
				var flag = false;
				
				while( c && ( ! this.isEmpty(c)) ){
					if (c.backgroundImage) {
						
						clip.backgroundImage = currentCategory.backgroundImage;
						flag = true;
						break;
					}
					else 
						c = this.findCategory(c.parentID);
				}
				
				if ( ! flag )
					clip.backgroundImage = defaultSponsorImage;
				
				this.displaySponsorBg( clip.backgroundImage );
			}
			else if (clip.backgroundImage){
				this.displaySponsorBg( clip.backgroundImage );
			}
			else{
				this.displaySponsorBg( defaultSponsorImage );
			}
		},
		
		setAdCategory: function ( clip )
		{
			if( !clip ) return;
			
			if ( ! clip.hasOwnProperty('adCategory') ){
				var c = currentCategory;
				
				while( c && ! c.ID ){
					if (c.adCategory) {
						
						clip.adCategory = currentCategory.AdCategory;
						return;
					}
					else 
						c = this.findCategory(c.parentID);
				}
				
				clip.adCategory = this.getDefaultAdCategory();
			}
		},
		
		getDefaultAdCategory: function(){
			
			if ( ! currentCategory)
				return 'shows';
			
			var adcat = currentCategory.AdCategory;
			if( !adcat ) {
				var list = this.getCategories( currentCategory.ID );
				var j = list.length;
				while( j-- )
				{
					adcat += this.cleanAdParams( list[j].title );
				}
			}
			
			return adcat;
		},
		
		setReleaseMetaData: function (thisRelease) {
			var meta_data = {};
			meta_data.title = thisRelease.title;
			meta_data.date = this.makeAirDate(thisRelease.airdate);
			meta_data.desc = thisRelease.description;
			
			var list = this.getCategories( currentCategory.ID );
			var i = list.length;
			var dataList = [];
			var link;
			var bc = "";
			while( i-- )
			{
				bc += this.replaceApostrophe( list[i].title ) + "/";
				link = "javascript:CBC.APP.UberPlayer.deepLink('" + bc + "');" + "CBC.APP.UberPlayer.scrollPage('library');"
				dataList.push( { link:link, label:list[i].title } );
			}
			
			meta_data.breadcrumb = dataList;
			
			meta_data.rlinks = [];
			if (thisRelease.relatedURL1) {
				meta_data.rlinks.push(thisRelease.relatedURL1);
			}
			if (thisRelease.relatedURL2) {
				meta_data.rlinks.push(thisRelease.relatedURL2);
			}
			if (thisRelease.relatedURL3) {
				meta_data.rlinks.push(thisRelease.relatedURL3);
			}
			this.displayMetaData(meta_data);
		},

		makeExpirationDate: function (expirationDate) {
			var expirationDateHours = new Date(expirationDate).getTime();
			var todayHours = new Date().getTime();
			var newExpirationDate = (expirationDateHours - todayHours) / 3600000;
			return newExpirationDate;
		},

		removeSpaces: function (s) {
			return s && s.replace(/[ ]/g, "");
		},

		cleanAdParams: function (s) {
			return s && s.toLowerCase().replace(/[.,<>?\/;:"'{\[}\]|\\+=_-`!@#$%\^&*()]*|~*/g, "").replace(/[ ]/g, "_");
		},

		switchMode: function (mode) {
			if ( mode != playerMode ) {
				
				switch (mode) {
				
					case "features":
						var _catId = "shows";
						var _match = SWFAddress.getValue().match(/Shows|News|Sports|Radio/i);
						if (_match) _catId = _match[0];
						var flashvars = { categoryId: _catId };
						var params = {
							allowScriptAccess: "always",
							wmode: "transparent",
							menu: "false",
							salign: "tl",
							scale: "noscale",
							bgcolor: "#222222" };
						var attributes = { id: "player", name: "player" };
						swfobject.embedSWF("swf/Feature.swf", "player", "666", "250", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
						
						$D.addClass('player', 'features');
						$D.removeClass('clipinfo', 'enabled');
						$D.addClass('ad', 'enabled');
						$D.removeClass('relatedplaylist', 'enabled');
						var newHeight = '270';
						showFeatures = true;
						break;
						
					case "player_1":
						var flashvars = {
							ID: "player",
							RSI: _omni_id,
							URI: encodeURIComponent( feed_uri )
						};
						
						if( arguments.length > 1 )
						{
							flashvars.url = encodeURIComponent( arguments[1].toString() );
						}
						
						var params = {
							allowFullScreen: "true",
							allowScriptAccess: "always",
							menu: "true",
							salign: "tl",
							scale: "noscale",
							bgcolor: "#000000" 
						};
						var attributes = { id: "player", name: "player" };
						swfobject.embedSWF("swf/UberPlayer.swf", "player", "640", "429", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
					
						$D.removeClass('player', 'features');
						$D.addClass('clipinfo', 'enabled');
						$D.addClass('ad', 'enabled');
						$D.addClass('relatedplaylist', 'enabled');
						showFeatures = false;
						var newHeight = '600';
						break;
						
					case "player_2":
						var flashvars = {
							ID: "player",
							RSI: _omni_id,
							PID: feedPID
						};
						
						if( arguments.length > 1 )
						{
							flashvars.clipId = arguments[1].toString();
				}
			
						var params = {
							allowFullScreen: "true",
							allowScriptAccess: "always",
							menu: "true",
							salign: "tl",
							scale: "noscale",
							bgcolor: "#000000" 
						};
						var attributes = { id: "player", name: "player" };
						swfobject.embedSWF("swf/RadioPlayer.swf", "player", "640", "429", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
					
						$D.removeClass('player', 'features');
						$D.addClass('clipinfo', 'enabled');
						$D.addClass('ad', 'enabled');
						$D.addClass('relatedplaylist', 'enabled');
						showFeatures = false;
						var newHeight = '600';
						break;
					
				}
			
			// Add an extra 1px to the height inorder to reveal the playlist and have it initialize.
				newHeight = (parseInt(newHeight)+1).toString();
			
				$D.setStyle( "maincontainer",  'height', newHeight+ "px" );
			
				playerMode = mode;
				return true;
			}
			return false;
		},

		switchLibraryTab: function (library) {
			$('library').className = library.toLowerCase();
		},
		
		isSearchTabSelected: function ()
		{
			return ($('library').className == "search");
		},
		
		switchFilter: function (container, el) {
			if (el.id=='fFeatured') {_currentSortField=null;}
			if (el.id=='fRecent') {_currentSortField="airdate";}
			if (el.id=='fWatched') {_currentSortField="requestCount";}
			var els = $D.getElementsByClassName('active', 'li', container);
			$D.removeClass(els, 'active');
			$D.addClass(el, 'active');
		},

		displayMetaData: function (data) {
			$('clipTitle').innerHTML = data.title;
			$('metaDateBreadcrumb').innerHTML = "<span>" + data.date + "</span>" + this.buildMetaBreadcrumb(data.breadcrumb);
			$('metaDesc').innerHTML = data.desc;
			$('rlinks').innerHTML = this.buildRelatedLinks(data.rlinks);
		},

		buildRelatedLinks: function (data) {
			var output = [];
			if (data.length > 0) {
				output.push('<h2>Related links:</h2>');
				output.push('<ul>');
				for (var i = 0; i < data.length; i++) {
					if (data[i].label && data[i].label.length){
						
						output.push('<li><a href="');
						output.push(data[i].link);
						output.push('" target="');
						output.push(data[i].target);
						output.push('"><span>&raquo;</span>');
						
						if (data[i].label && data[i].label.length && data[i].label.length > 25)
							output.push($U.truncate(data[i].label, 25));
						else
							output.push(data[i].label);
							
						output.push('</a></li>');
					
					}
				}
				output.push('</ul>');
			}
			return output.join('');
		},

		buildMetaBreadcrumb: function (data) {
			var output = [];
			for (var i = 0; i < data.length; i++) {
				output.push('<a href="');
				output.push(data[i].link);
				output.push('">');
				output.push(data[i].label);
				output.push('</a>');
				if (i < data.length - 1) output.push(' &gt; ');
			}
			return output.join('');
		},

		categorySort: function (a, b) {
			var compare = function (x, y) {
				return x - y
			}
			return compare(a.group, b.group) || compare(a.order, b.order);
		},

		displayCategories: function (data, depth) {
			var output = "";
			var lastgroup = data[0].group;
			for (var i = 0; i < data.length; i++) {
				if (data[i].group != lastgroup) output += "<li></li>"; // inserts blank space between different groups
				lastgroup = data[i].group;
				output += $S.getVal('tpl_cat_item').evaluate(data[i]);
			}
			if (!depth) depth = 1;
			$('cats' + depth).innerHTML = output;
			// animation
			var newX = $D.getX('categories') + ($D.getX('catmask') - $D.getX('cats' + depth));
			var setAttr = function (a, v, u) {
				$D.setX('categories', v)
			};
			var anim = new YAHOO.util.Anim(null, {
				'scroll': {
					from: $D.getX('categories'),
					to: newX
				}
			},
			0.5, YAHOO.util.Easing.easeOut);
			anim.setAttribute = setAttr;
			anim.animate();
		},

		setClip: function ( clip ) 
		{
			selectedClipId = clip.ID;
			
			var modeChanged = false;
			
			if( this.isRadioLiveStream( clip ) ) {
				modeChanged = this.switchMode("player_2", clip.ID);
			}else {
			modeChanged = this.switchMode("player_1", clip.URL);
			}
			this.scrollPage("body");
			this.highlightElement(clip.ID);
			this.setURL(clip.ID);
			this.setReleaseMetaData( clip );
			this.setBackgroundByClip( clip );
			
			if( !modeChanged )
			{
				this.setReleaseUrl( clip.URL );
			}
		},
		
		isRadioLiveStream: function (clip) 
		{
			if( clip.hasOwnProperty( "liveOnDemand" ) )
			{
				if (clip.liveOnDemand.toLowerCase() === 'live' )
				{
					if( currentCategory.hasOwnProperty( "fullTitle" ) )
					{
						if( currentCategory.fullTitle.indexOf('Radio') === 0 ) { return true; }
					}
				}
				
			}
			return false;
		},
		
		setReleaseUrl: function ( url )
		{
			var t = 500;
			var swf = swfobject.getObjectById( "player" );
			if( swf ) {
				if( swf.setReleaseUrl ) {
					try {
						swf.setReleaseUrl( url );
						return;
					} catch(e) {
						t = 2000;
					}
				}
			}
			setTimeout( "CBC.APP.UberPlayer.setReleaseUrl('" + url + "');", t );
		},
		
		/**
		 * 
		 * @param {Object} id The clip id that you want selected.
		 */
		
		highlightElement: function (id) 
		{	
			if( !id ) return;
			
			id = id.toString();

			//remove active clips
			var activeClip = $D.getElementsByClassName('active', 'div', 'clips');
			var i = activeClip.length;
			while (i--)
			{
				activeClip[i].className = 'clip';
			}
			//set new actie clip
			$D.addClass(id, 'active');
		},
		
		hightlightCategory: function (id)
        {
        	if( !id ) return;
			
			id = id.toString();
			//get category element
			var el = document.getElementById("categories");	
			//remove active categories
			var activeCats = $D.getElementsByClassName('active', 'li', el);
			var i = activeCats.length;
			while (i--)
			{
				activeCats[i].className = '';
			}
			//set new actie category
			$D.addClass(id, 'active');
        },
		
		displayLibraryClips: function(data, container) {
			var output = "";
			for (var i=0; i<data.length; i++) {
				var o = data[i];
				var sclabel = o.label.replace(/'/g, "%27");
				var sctitle = o.title.replace(/'/g, "%27");
				var _link = o.link;
				if (_link.indexOf("javascript:") == -1) {
					var _split = _link.split("/ID=");
					var _id = (_split.length > 1) ? _split[1] : "";
					if (!_searchObjects[_id]) _searchObjects[_id] = o;
					o.anchorAttrib = "onclick=\"CBC.APP.UberPlayer.playReleaseFromSearch(" + _id + ");CBC.APP.SC.LinkTracker.registerLinkClick({target:this},{linkName:'Video Page:Main playlist:" + sclabel + " - " + sctitle+"', ajax: true});return false;\"";
				} else {
					o.anchorAttrib = "onclick=\"CBC.APP.SC.LinkTracker.registerLinkClick({target:this},{linkName:'Video Page:Main playlist:" + sclabel + " - " + sctitle+"', ajax: true});\"";
				}
				o.link = o.link.replace(/\/video\/watch\//ig,"/video/#/");
				trimLength = _maxDescLength;
				// Format expiry time to hours or days
				var e = o.expiry;
				if (e >= 24 && e <=_maxExpiryHrs) { // if expiry is between 1 and 7 days
					o.expiry = "Available for " + Math.round(e/24) + " more days";
				} else if (e > 0 && e < 24 ) { // if expiry is within 1 day
					o.expiry = "Available for " + Math.round(e) + " more hours";
				} else { // don't display expiry
					o.expiry = "";
					trimLength = _extendedDescLength; // create more space for description text
				}
				// Trim description if too long
				if (o.description.length > trimLength) {
					o.description = o.description.substr(0,trimLength) + "...";
				}
				// Format duration
				o.duration = this.msToHMS(o.length);
				// Use default thumb if necessary
				if (!o.thumbnailURL) o.thumbnailURL = _defaultThumbPath;
				// Add data required for live clips
				o.logic = {};
				if (o.LiveOnDemand == "Live") {
					var liveData = this.processLive(o.airdate);
					o.liveDate = liveData.date;
					o.liveTime = liveData.time;
					o.logic.liveState = liveData.state;
				} else {
					o.liveDate = '';
					o.liveTime = '';
					o.logic.liveState = "not";
					o.date = this.makeAirDate(o.airdate,true);
				}
				
				//icon style
				o.icon_style = "";
				switch( o.mediaType )
				{
					case "Audio" :
					o.icon_style = "audioIcon";
					break;
					
					case "Video" :
					o.icon_style = "videoIcon";
					break;
					
					case "CCVideo" :
					o.icon_style = "videoCCIcon";
					break;
				} 
				
				// Convert data into html
				
				if (o.mediaType == 'Video') 
					output+= $S.getVal('tpl_video_clip').evaluate(o,o.logic);
				else if (o.mediaType == 'Audio') 
					output+= $S.getVal('tpl_audio_clip').evaluate(o,o.logic);
				else
				output+= $S.getVal('tpl_library_clip').evaluate(o,o.logic);
			}
			$(container).innerHTML = output;
		},

		displayLoading: function (bool) {
			bool ? $D.addClass('loading', 'visible') : $D.removeClass('loading', 'visible');
		},

		displayBreadcrumb: function (data) {
			var output = "";
			var radioHeader = document.getElementById('radioHeader');
			
			if (data.length > 1) {
				
				radioHeader.style.display = 'none';
				
				for (var i = 0; i < data.length - 1; i++) {
					output += '<a href="' + data[i].link + '">' + data[i].label + '</a> &gt; ';
				}
			}else if(data[0].label.toLowerCase() == 'radio'){
				radioHeader.style.display = 'block';
				}
			else{
				radioHeader.style.display = 'none';
			}
			output += "<span>" + data[data.length - 1].label + "</span>";
			output += "<em>" + data[data.length - 1].label + "</em>";
			$('breadcrumb').innerHTML = 'CBC Player: ' +output;
		},

		displaySponsorBg: function (path) {
			if (path) {
				var bg = 'url(' + path + ') no-repeat';
				$D.setStyle('maincontainer', 'background', bg);
			} else {
				var bg = 'url(' + defaultSponsorImage + ') no-repeat';
				$D.setStyle('maincontainer', 'background', bg);
			}
		},

		displayPagination: function(data) {
			var output = "";
			if (data.totalPages > 1) {
				if (data.currentPage > 1) {
					output += $S.getVal('tpl_page_step').evaluate({prevnext:'prev',label:'Previous',onclickfunc:data.onclickfunc,pg:data.currentPage-1});
				} else {
					output += $S.getVal('tpl_page_step_disabled').evaluate({prevnext:'prev',label:'Previous'});
				}
				var pages = data.totalPages;
				var page_start = data.currentPage-4;
				var page_end = data.currentPage+3;
				while (page_end > pages) { page_end--; page_start--; }
				while (page_start < 1) { page_start++; page_end++; }
				if (page_end > pages) page_end = pages;
				for (var i=page_start; i<=page_end; i++) {
					output += $S.getVal('tpl_page_num').evaluate({pg:i,onclickfunc:data.onclickfunc},{active:data.currentPage==i});
				}
				if (data.currentPage < data.totalPages) {
					output += $S.getVal('tpl_page_step').evaluate({prevnext:'next',label:'Next',onclickfunc:data.onclickfunc,pg:data.currentPage+1});
				} else {
					output += $S.getVal('tpl_page_step_disabled').evaluate({prevnext:'next',label:'Next'});
				}
			}
			var clipholderDiv = document.getElementById('clipholder');
			var paginators = $D.getElementsByClassName('pagination', 'div', clipholderDiv);
			var i = paginators.length;
			while (i--){
				paginators[i].innerHTML = output;
			}
		},

		changePage: function (num) {
			// load new page of clips here
			page_data.currentPage = num;
			this.displayPagination(page_data);
			this.getReleaseList(currentCategory.ID, page_data.currentPage);
			CBC.APP.VideoPageStats.handlePaginationListener(num);
			return false;
		},

		scrollPage: function (id) {
			var setAttr = function (a, v, u) {
				window.scroll(0, v)
			};
			var anim = new YAHOO.util.Anim(null, {
				'scroll': {
					from: $D.getDocumentScrollTop(),
					to: $D.getXY(id)[1]
				}
			},
			0.5, YAHOO.util.Easing.easeOut);
			anim.setAttribute = setAttr;
			anim.animate();
		},

		getPlayerSwf: function ()
		{
			return swfobject.getObjectById("player");
		},

		setPlayerReleaseUrl: function ( url )
		{
			var swf = this.getPlayerSwf();
			if( swf )
			{
				if( swf.setReleaseUrl != null )
				{
					swf.setReleaseUrl( url );
				}
			}
		},

		// SEARCH //
		getSearchResults: function(fieldId) {
			_searchQuery=$(fieldId).value;
			$('q-main').value = _searchQuery;
			$('q-top').value = _searchQuery;
			this.switchLibraryTab('Search');
			if (fieldId == 'q-top') this.scrollPage('library');
			_searchStartIndex = 1;
			this.performSearch();
		},

		performSearch: function() {
			var qs="";
			qs+='q='+escape(_searchQuery);
			qs+='&start='+(_searchStartIndex-1);
			qs+='&num='+_searchResultsPerPage;
			qs+='&sort='+_searchFilter;
			this.displayLoading(true);
			$('searchclips').innerHTML = "";
			$('searchstatus').innerHTML = "Searching, please wait...";
			var callback = { success:this.performSearchResponse, failure: this.performSearchFail, scope: this, argument:{query:_searchQuery} };
			var req = YAHOO.util.Connect.asyncRequest('GET', _googleSearchBaseUrl+qs, callback);
			//$U.debug(_googleSearchBaseUrl+qs);
		},

		performSearchResponse: function(o) {
			this.displayLoading(false);
			$D.addClass('searchfilters', 'enabled');
			var numResults = 0;
			var totalPages = 0;
			var lastIndex = 0;
			var currentPage = 0;
			if (o.responseText) {
				var regex_node = new RegExp('&lt;(\/?.)&gt;','gm'); // convert entities to real characters
				o.responseText = o.responseText.replace(regex_node,'<$1>');
				o.responseText = o.responseText.replace(/&amp;/g,'&'); // convert ampersands
				//$U.debug(o.responseText);
				var data = eval('(' + o.responseText + ')').searchResults;
				_searchStartIndex = parseInt(data.firstIndex, 10);
				numResults = parseInt(data.numOfResults, 10);
				lastIndex = parseInt(data.lastIndex, 10);
				currentPage = Math.ceil(_searchStartIndex/_searchResultsPerPage);
				if (currentPage*_searchResultsPerPage > lastIndex) numResults = lastIndex;
					totalPages = Math.ceil(numResults/_searchResultsPerPage);
					if (data.items) {
						var newData = [];
						for (var i=0; i<data.items.length; i++) {
							var item = this.convertGoogleToPlatform(data.items[i]);
							newData.push(item);
						}
						
						currentSearcheReleases = newData;
					}
				}
			if (numResults > 0) {
				$('searchstatus').innerHTML = "<strong>" + numResults + "</strong> items found matching '<strong>" + o.argument.query + "</strong>'.<br /><br />Displaying results <strong>"+_searchStartIndex+"-" + lastIndex + "</strong>:";
				this.createReleaseObjects(newData, 'searchclips');
				this.displayPagination({currentPage:currentPage,totalPages:totalPages,onclickfunc:'CBC.APP.UberPlayer.changeSearchPage',container:'searchpagination'});
			} else {
				$('searchstatus').innerHTML = "No items were found matching '<strong>" + o.argument.query + "'</strong>.<br /><br />Please modify your search query.";
			}
		},

		convertGoogleToPlatform: function(data) {
			
			var m = data.metaData;
			if( !m.hasOwnProperty( "backgroundImage" ) )
			{
				m.backgroundImage = "";
			}
			
			return new CBC.video.SearchRelease( data );
		
		},

		convertTimeToMS: function(time) {
			var newTime = 0;
			if (time) {
				var timeArray = time.split(':');
				for (x in timeArray) {
					if (x==0) {
						newTime += timeArray[0]*3600000;
					} else if (x==1) {
						newTime += timeArray[1]*60000;
					} else if (x==2) {
						newTime += timeArray[2]*1000;
					}
				}
			}
			return newTime;
		}, 

		performSearchFail: function(o) {
			// Didn't get search results
			this.displayLoading(false);
			$('searchstatus').innerHTML = "A problem occurred with the search. Please try your search query again.";
			//$U.debug('Search failed');
			//$U.debug(o);
		},
		
		changeSearchPage: function(num) {
			_searchStartIndex = ((num-1)*_searchResultsPerPage)+1;
			this.scrollPage('library');
			this.performSearch();
			return false;
		},
		
		changeSearchFilter: function(targ, filter) {
			this.switchFilter('searchfilters',targ);
			_searchFilter = filter;
		},

		// COMMENTS mlwf //
		handleCommentsTabs: function(clipId) {
			try {
				var _clip = this.findRelease(clipId);
				if (_clip.commentsEnabled == "Yes") {
					$S.setVal("cid","vid-"+clipId);
					$('ncomments').style.display = "inline";
					$S.setVal("scped",_clip.commentsExpirationDate);
					var article_type = _clip.audioVideo.toLowerCase();
					if (_clip.commentsExpirationDate) {
						$S.setVal("spMsg","Comments are [B]open[/B] and welcome until " + this.formatExpDate(_clip.CommentsExpirationDate) + ". We reserve the right to close comments before then.");
					} else {
						$S.setVal("spMsg","Comments are [B]open[/B]. We reserve the right to close comments at any time.");
					}
					$S.setVal("seMsg","This " + article_type + " is now closed to commenting.");
					$S.setVal("articleType",article_type);
					$S.setVal("cbcModule","storywrapper");
				}
			} catch(e) { $U.debug(e); }
		},

		//mlwf
		renderComments: function(_el) {
			try {
				var ctitle = currentCategory.title;
				switch (_currentSection)	{
					case "shows":
					$S.setVal("colourTheme","pgold");
					break;
					case "news":
					$S.setVal("colourTheme","pred");
					break;
					case "sports":
					$S.setVal("colourTheme","pblue");
					break;
					default:
					$S.setVal("colourTheme","pgold");
					break;
				}
				var _body = document.body;
				_body.className = _body.className.replace(/pred/ig,"").replace(/pblue/ig,"").replace(/pgold/ig,"");
				$D.addClass(_body, $S.getVal("colourTheme"));
				var _clip = this.findRelease(currentRelease.ID);
				CBC.APP.PLUCK.Comments.getData({_el:null,on_page:1,_title:_clip.title});
			} catch(e) { $U.debug(e); }
		},

		formatExpDate: function(timestamp) {
			try {
				var date = new Date(timestamp);
				var _month = "0"+(parseInt(date.getMonth())+1);
				_month = _month.substring(_month.length-2,_month.length);
				var _mins = "0"+date.getMinutes();
				_mins = _mins.substring(_mins.length-2,_mins.length);
				var _time = (date.getHours() < 12) ? ( ((date.getHours() == 0) ? 12 : date.getHours() )+":"+_mins+" AM ET") : ( (date.getHours() == 12) ? (date.getHours()): (date.getHours()-12) ) +":"+_mins+" PM ET";
				var _ts = $U.utc_days[date.getDay()] + ', ' + $U.utc_months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear()+ " at " + _time;
				return _ts;
			} catch(e) {
				$U.debug(e);
				return "";
			}
		},

		// TEMP FIXES //
		playReleaseFromSearch: function(_id) { //_o: metadata object
			this.scrollPage('body');
//			this.switchMode("player");
			CBC.APP.Controller.setRelated(_searchObjects[_id]);
			this.setReleaseMetaData(_searchObjects[_id]);
			tpController.setReleaseURL(_searchObjects[_id].playerURL, true);
			//this.setPlayerReleaseUrl();
		},

		// UTILITY //
		makeAirDate: function (date,isShort) {
			if (!date) return "";
			date = new Date(parseInt(date,10));
			var m = $U.utc_months[date.getMonth()];
			if (isShort) m = m.substr(0,3);
			return (m+" "+date.getDate()+", "+date.getFullYear());
		},

		msToHMS: function(ms) {
			if (!ms) return "";
			var h = Math.floor(ms/3600000);ms=ms%3600000;
			var m = Math.floor(ms/60000);ms=ms%60000;
			var s = ('0'+Math.floor(ms/1000));
			s = s.substr(s.length-2,s.length);
			var time = '';
			if (h>0) {
				time+=h+':';	
			}
			if ((m<10) && (h>0)) {
				time+='0'+m+':'+s;
			} else {
				time+=m+':'+s;
			}
			return time;
		},

		processLive: function (ae) {
			var airEpoch = parseInt(ae,10);
			var airDate = new Date(airEpoch);
			var todayDate = new Date();
			var todayEpoch = todayDate.getTime();
			var diff = airEpoch-todayEpoch;
			var tmrDate = new Date(todayEpoch);
			tmrDate.setDate(tmrDate.getDate()+1);
			if (todayDate.toDateString() == airDate.toDateString()) {
				var date = "Today";
			} else if (tmrDate.toDateString() == airDate.toDateString()) {
				var date = "Tomorrow";
			} else {
				var date = $U.utc_months[airDate.getMonth()].substr(0,3)+" "+airDate.getDate();
			}
			var state = diff>0 ? "later" : "now";
			return {date:date, time:this.formatTime(airDate), state:state};
		},

		formatTime: function(d) {
			if (!d) return "";
			var h = d.getHours();
			var ampm = h<12?" AM":" PM";
			if (h>12) h-= 12;
			else if (h==0) h = 12;
			var m = "0"+d.getMinutes();
			m = m.substr(m.length-2,2);
			return h+":"+m+ampm;
		},

		
		getCurrentCategory: function(){
			var category = [];
			var list = this.getCategories( currentCategory.ID );
			var i = list.length;
			while(i--)
			{
				category.push( list[i].title );
			}
			
			return category.join('/');
		},
		
		subscribe: function () 
		{
			var args = Array.prototype.slice.call(arguments);
			var event = args.shift();
			if( typeof( event ) == "string" )
			{
				event = events[ event ];
				if( event )
				{
					event.subscribe.apply( event, args );
				}
			}
		},
		
		unsubscribe: function () 
		{
			var args = Array.prototype.slice.call(arguments);
			var event = args.shift();
			if( typeof( event ) == "string" )
			{
				event = events[ event ];
				if( event )
				{
					event.unsubscribe.apply( event, args );
				}
			}
		},
		
		unsubscribeAll: function () 
		{
			var prop;
			for( prop in events )
			{
				events[ prop ].unsubscribeAll();
			}
		}
	};
})();

var o = CBC.namespace("video");
o.Category = {
		create: function ( response ) {
			if( typeof( response ) == "object") {
				if( response.entries instanceof Array ) {
					var a = [];
					for( var i = 0; i < response.entries.length; i++ ) {
						a.push( this.$create( response.entries[i] ) );
					}
					return a;
				}
			}
		},
		$getCategoryId: function ( value ) {
			if( value ) {
				var m = value.match( /\/([0-9]+)$/ );
				if( m ){ return m[1]; }
			}
			return null;
		},
		$create: function ( obj ) {
			var id = this.$getCategoryId( obj.id )
			return {
					hyperlink: "javascript:CBC.APP.UberPlayer.getCategoriesByParentID('" + id + "');",
					hasChildren: null,
					treeOrder: null,
					ID: id,
					Account: obj.pl1$contentArea,
					AdCategory: obj.pl1$adCategory,
					Aired: obj.pl1$aired,
					AudioVideo: obj.pl1$audioVideo,
					backgroundImage: obj.pl1$backgroundImage,
					BylineCredit: obj.pl1$bylineCredit,
					CBCPersonalities: obj.pl1$cBCPersonalitiesReporter,
					Characters: obj.pl1$characters,
					ClipType: obj.pl1$type,
					CreatedAfter: obj.pl1$createdAfter,
					CreatedBefore: obj.pl1$createdBefore,
					EpisodeNumber: obj.pl1$episodeNumber,
					Event: obj.pl1$event,
					fullTitle: obj.plcategory$fullTitle,
					Genre: obj.pl1$genre,
					GroupLevel: obj.pl1$groupLevel,
					GroupOrder: obj.pl1$groupOrder,
					FeedUrl: obj.pl1$feedURL,
					IsDynamicPlaylist: obj.pl1$isDynamicPlaylist,
					Keywords: obj.pl1$keywords,
					LiveOnDemand: obj.pl1$liveOndemand,
					MaxClips: obj.pl1$maxClips,
					Organizations: obj.pl1$organizations,
					parentID: this.$getCategoryId( obj.plcategory$parentId ),
					People: obj.pl1$people,
					Producers: obj.pl1$producers,
					Region: obj.pl1$region,
					SeasonNumber: obj.pl1$seasonNumber,
					Segment: obj.pl1$segment,
					Show: obj.pl1$show,
					SortField: obj.pl1$sortField,
					SortOrder: obj.pl1$sortOrder,
					Sport: obj.pl1$sport,
					SubEvent: obj.pl1$subEvent,
					title: obj.title,
					feedURL: obj.pl1$feedURL
				}
		}//$create
}//Category

//videoPlayer
var o=CBC.namespace("video");o.VideoPlayer=(function(){var $CE=YAHOO.util.CustomEvent;var completeEvent=new $CE("onMediaComplete");var releaseEvent=new $CE("onReleaseStart");var clipStartEvent=new $CE("onClipStart");var events={onMediaComplete:completeEvent,onReleaseStart:releaseEvent,onClipStart:clipStartEvent};return{subscribe:function(type,fn,obj,override){if(events[type]){events[type].subscribe(fn,obj,override);}},unsubscribe:function(type,fn,obj){if(events[type]){events[type].unsubscribe(fn,obj,override);}},unsubscribeAll:function(type){if(events[type]){events[type].unsubscribeAll();}},onMediaComplete:function(){return completeEvent.fire.apply(completeEvent,arguments);},onReleaseStart:function(){return releaseEvent.fire.apply(releaseEvent,arguments);},onClipStart:function(){return clipStartEvent.fire.apply(clipStartEvent,arguments);}}})();
//playlist
var o=CBC.namespace("APP");o.Playlist=(function(){var g=YAHOO.util.Dom;var f=YAHOO.util.Element;var a=YAHOO.util.Event;var b=YAHOO.lang;var j;var i;var e;var k=false;var d=null;var c={};var h=this;return{init:function(){j=CBC.APP.UberPlayer;i=CBC.APP.Controller;e=CBC.video.VideoPlayer;var m=this;var l=j.displayLibraryClips;j.displayLibraryClips=function(p,n){l.apply(j,arguments);if(k){m.createButtons(d.getPlaylist())}else{c.createButtons=function(){m.createButtons(d.getPlaylist())}}}},onReady:function(){var l;k=true;d=swfobject.getObjectById("playlist");for(l in c){c[l]()}},createButtons:function(m){this.playlist=m||[];this.clips=g.getElementsByClassName("clip","div","clips");if(this.playlist.length>0){for(element in this.clips){var l=false;for(clip in this.playlist){if(this.playlist[clip].ID==this.clips[element].id){l=true}}if(l){this.clips[element].appendChild(this.createRemoveButton())}else{this.clips[element].appendChild(this.createPlaylistButton())}}}else{for(element in this.clips){this.clips[element].appendChild(this.createPlaylistButton())}}},createPlaylistButton:function(){var l=document.createElement("a");g.addClass(l,"addToPlaylist");l.innerHTML="add to My Playlist";l.href="#";a.addListener(l,"click",this.onClickAddToPlaylist,this,true);return l},createRemoveButton:function(){var l=document.createElement("a");g.addClass(l,"removeFromPlaylist");l.innerHTML="remove from My Playlist";l.href="#";a.addListener(l,"click",this.onClickRemoveFromPlaylist,this,true);return l},onClickAddToPlaylist:function(m){a.preventDefault(m);var l=a.getTarget(m);CBC.APP.VideoPageStats.handleMyPlaylistAction({node:l,add:true});d.addToPlaylist(j.findRelease(l.parentNode.id));l.parentNode.appendChild(this.createRemoveButton());l.parentNode.removeChild(l)},onClickRemoveFromPlaylist:function(m){a.preventDefault(m);var l=a.getTarget(m);CBC.APP.VideoPageStats.handleMyPlaylistAction({node:l,add:false});d.removeFromPlaylist(j.findRelease(l.parentNode.id));this.removeFromPlaylist(l.parentNode.id)},removeFromPlaylist:function(m){m+="";var l=g.getElementsByClassName("removeFromPlaylist","a",m);l=l[0];if(l){a.purgeElement(l);l.className="addToPlaylist";l.innerHTML="add to My Playlist";a.addListener(l,"click",this.onClickAddToPlaylist,this,true)}},setClip:function(l){if(k){d.setSelectedClip(l.ID)}else{c.setClip=function(){h.setClip(l)}}},onMediaComplete:function(l){if(k){if(this._containsClip(l)){d.playNext()}}else{c.onMediaComplete=function(){h.onMediaComplete(releaseID)}}},_containsClip:function(n){var m=d.getPlaylist();var l=m.length;while(l--){if(n==m[l].ID){return true}}return false}}}());
//controller
var o=CBC.namespace("APP");o.Controller=(function(){var e;var d;var c;var g=false;var a;var b;var f;return{init:function(){e=CBC.APP.UberPlayer;d=CBC.APP.Playlist;c=CBC.video.VideoPlayer;c.subscribe("onClipStart",this.checkAdState,this,true);c.subscribe("onMediaComplete",this.checkAdState,this,true)},playClipById:function(i){var h;if(!g&&i){h=e.findRelease(i);b=f;f=parseInt(i,10);e.setClip(h);d.setClip(h);CBC.APP.VideoPageStats.setClip(h)}else{a=i}},checkAdState:function(k,i){var h=false;var j=i[0];if(j){if(j.isAd){h=g=true}}if(!h){g=false;if(a){this.playClipById(a);a=null}else{if(k=="onMediaComplete"){if(parseInt(j.releaseID,10)==f){d.onMediaComplete(f)}}}}}}}());


