var ThePlatformPlaylist = function () {

	var $S = CBC.SETTINGS;
	var $U = CBC.UTIL;
	var $E = CBC.EVENT;
	var $D = CBC.DOM;
	var $ = $U.getElementsById;

	var _feedPID = "_DyE_l_gC9yXF9BvDQ4XNfcCVLS4PQij";
	var _releaseRequestBaseUrl = "http://feed.theplatform.com/f/h9dtGB/r3VD0FujBumK";
	var _categoryRequestBaseUrl = _releaseRequestBaseUrl + "/categories";

	// Configuration parameters - class variables
	var _getPlaylistByClipIds = false; //boolean to toggle fetching of a playlist by clip ids
	var _clipIds = ""; //string containing comma separated clip ids for the static playlist
	var _instance; // external javascript reference for the playlist application instance
	var _containerId; // div container for playlist
	var _categoryTitle; // theplatform category title
	var _categoryId; // theplatform category ID
	var _keywords; // stores keywords in case category is a dynamic playlist
	var _feedUrl;
	var _account;
	var _createdAfter;
	var _createdBefore;
	var _genre;
	var _show;
	var _seasonNumber;
	var _sport;
	var _region;
	var _event;
	var _people;
	var _cbcPersonalities;
	var _audioVideo;
	var _byLineCredit;
	var _characters;
	var _clipType;
	var _episodeNumber;
	var _liveOnDemand;
	var _organizations;
	var _producers;
	var _segment;
	var _subEvent;
	var _adCategory;	
	var _startIndex = 1; // index of first clip to display in playlist
	var _endIndex = 5; // index of last clip to display in playlist
	var _sortField; // field to sort playlist by
	var _sortDescending; // whether to reverse the sort
	var _customQuery = ""; // custom string for additional theplatform query parameters
	var _site;	
	var _playerId; // html id of the player to play clips in.
	var _defaultThumbUrl = "/video/imgs/thumb-default.gif"; // image to show if feed doesn't have a thumbnail
	var _descLength; // number of characters to truncate the description to
	var _releaseAdCategoires;
	var _callback = null; //the callback function to be called after the playlist html has been rendered
	var _callbackParams = {};
	
	// Default HTML Templates
	var _tpl_playlist_item = new $U.Template('<a class="playlistItem clearfix" onclick="#{playVideoCommand}" href="#{uberHref}" target="_blank" title="#{title}"><img width="110" height="62" alt="" src="#{thumbnailURL}"/><span class="meta"><span class="title">#{title}</span><span class="desc">#{description}</span></span><span class="cta">Watch #[liveState: {not:<em class="dur">#{dur}</em>||now:<em class="livenow">Live Now</em>||later:<em class="livelater">Live #{liveDate} at #{liveTime}</em>}] </span></a>');
	var _this = this;
	
	
	var o = {

		init: function (o) {

			// Required data
			_instance = 'CBC.APP.'+o.instance;
			_containerId = o.containerId;
			
			//create object for storing adCategories for releases
			_releaseAdCategoires = {};
			
			// Clip anchor play action
			if ( o.createPlayAction ){				
				this.createPlayAction = o.createPlayAction;
			}
			
			// Either/or required data
			if (o.categoryTitle) _categoryTitle = o.categoryTitle;
			if (o.categoryId) _categoryId = o.categoryId;

			// Optional data
			if (o.startIndex) _startIndex = o.startIndex;
			if (o.endIndex) _endIndex = o.endIndex;
			if (o.sortField) {
				_sortField = o.sortField;
				if (o.sortDescending === "true") {
					_sortDescending = true;
				} else {
					_sortDescending = false;
				}
			}
			if (o.customQuery) _customQuery = o.customQuery;
			if (o.playerId) _playerId = o.playerId;
			if (o.site) _site = o.site;
			if (o.defaultThumbUrl) _defaultThumbUrl = o.defaultThumbUrl;
			if (o.descLength) _descLength = o.descLength;
			if (o.itemTemplate) _tpl_playlist_item = new $U.Template(o.itemTemplate);
			if (o.getPlaylistByClipIds) {
				_getPlaylistByClipIds = true;
				_clipIds = o.clipIds; 
				this.getReleases("false");
			}
			else this.getCategoryDetail();
		},
		
		getCategoryDetail: function() {
			var qs="?form=json";
			var fields=[];
			var req;
			
			if (_categoryTitle) {
				qs+='&byFullTitle='+_categoryTitle;
			} else if (_categoryId) {
				qs+='&byId='+_categoryId;
			}
			
			fields.push("title");
			fields.push("fullTitle");
			fields.push("id");
			fields.push(":adCategory");
			fields.push(":audioVideo");
			fields.push(":bylineCredit");
			fields.push(":cBCPersonalitiesReporter");
			fields.push(":characters");
			fields.push(":contentArea");
			fields.push(":createdAfter");
			fields.push(":createdBefore");
			fields.push(":episodeNumber");
			fields.push(":event");
			fields.push(":feedURL");
			fields.push(":genre");
			fields.push(":isDynamicPlaylist");
			fields.push(":keywords");
			fields.push(":liveOndemand");
			fields.push(":organizations");
			fields.push(":people");
			fields.push(":producers");
			fields.push(":region");
			fields.push(":seasonNumber");
			fields.push(":segment");
			fields.push(":show");
			fields.push(":sortField");
			fields.push(":sortOrder");
			fields.push(":sport");
			fields.push(":subEvent");
			fields.push(":type");
			
			qs+='&fields='+fields.join(',');
			req = new JSONRequest(_categoryRequestBaseUrl+qs, _instance+".getCategoryDetailResponse");
			req.send();
		},

		getCategoryDetailResponse: function(data) {
			
			if( typeof(data) == "string" ) return;
			
			if (data.entries.length > 0) {
				var cat = data.entries[0];
				_categoryId = cat.id.match(/\/data\/Category\/([0-9]+)/)[1];
				_categoryTitle = cat.plcategory$fullTitle;
				_adCategory = cat.pl1$adCategory || "";				
				_audioVideo = cat.pl1$audioVideo || "";
				_byLineCredit = cat.pl1$bylineCredit || "";
				_cbcPersonalities = cat.pl1$cBCPersonalitiesReporter || "";
				_characters = cat.pl1$characters || "";
				_account = cat.pl1$contentArea || "";
				_createdAfter = cat.pl1$createdAfter || "";
				_createdBefore = cat.pl1$createdBefore || "";
				_episodeNumber = cat.pl1$episodeNumber || "";
				_event = cat.pl1$event || "";
				_feedUrl = cat.pl1$feedURL || "";
				_genre = cat.pl1$genre || "";
				_keywords = cat.pl1$keywords || "";
				_liveOnDemand = cat.pl1$liveOndemand || "";
				_organizations = cat.pl1$organizations || "";
				_people = cat.pl1$people || "";
				_producers = cat.pl1$producers || "";
				_region = cat.pl1$region || "";
				_seasonNumber = cat.pl1$seasonNumber || "";
				_segment = cat.pl1$segment || "";
				_show = cat.pl1$show || "";
				_sport = cat.pl1$sport || "";
				_subEvent = cat.pl1$subEvent || "";
				_clipType = cat.pl1$type || "";
				_sortField = _sortField || cat.pl1$sortField;
				if ((_sortDescending !== true) && (_sortDescending !== false))  {
					if (cat.pl1$sortOrder === "Ascending") {
						_sortDescending = false;
					} else if (cat.pl1$sortOrder === "Descending") {
						_sortDescending = true;
					}
				}
				this.getReleases(cat.pl1$isDynamicPlaylist);
			} else {
				// ERROR: Category not found
			}
		},


		getReleases: function(isDynamicPlaylist) { //isDynamicPlaylist: string "true" or "false"
			var clipUrl="";
			var qsFormat="?form=json";
			var qsQuery="";
			var fields=[];
			var releaseFields=[];
			var customValues=[];
			var fullRequestUrl, req;
			fields.push("categories");
			fields.push("content");
			fields.push("defaultThumbnailUrl");
			fields.push("description");
			fields.push("pubDate");
			fields.push("title");
			fields.push(":adSite");
			fields.push(":adCategory");
			fields.push(":event");
			fields.push(":genre");
			fields.push(":liveOndemand");
			fields.push(":seasonNumber");
			fields.push(":segment");
			fields.push(":show");
			fields.push(":sport");
			fields.push(":type");
			qsFormat+='&fields='+fields.join(",");
			
			releaseFields.push("approved");
			releaseFields.push("id");
			releaseFields.push("url");
			qsFormat+='&releaseFields='+releaseFields.join(",");

			qsFormat+='&range='+_startIndex+"-"+_endIndex;
			
			if (_sortField) {
				qsQuery+="&sort=";
				switch (_sortField) { // added, airdate, lastModified, requestCount, title
					case "airdate":
						qsQuery+="pubDate";
						break;
					case "lastModified":
						qsQuery+="updated";
						break;
					case "requestCount":
						qsQuery+="metrics.viewCount.last7Days";
						break;
					default: // added, title
						qsQuery+=_sortField;
						break;
				}
				if (_sortDescending) {
					qsQuery+="|desc";
				}
			}

			if ((isDynamicPlaylist === "true") || (isDynamicPlaylist === true)) {
				if (_keywords) qsQuery+='&q='+_keywords;

				if (_audioVideo) {
					customValues.push("{audioVideo}{" + _audioVideo + "}");
				}
				if (_byLineCredit) {
					customValues.push("{bylineCredit}{" + _byLineCredit + "}");
				}
				if (_cbcPersonalities) {
					customValues.push("{cBCPersonalitiesReporter}{" + _cbcPersonalities + "}");
				}
				if (_characters) {
					customValues.push("{characters}{" + _characters + "}");
				}
				if ((_account) && (_account !== "(not specified)")) {
					customValues.push("{contentArea}{" + _account + "}");
				}
				if (_episodeNumber) {
					customValues.push("{episodeNumber}{" + _episodeNumber + "}");
				}
				if ((_event) && (_event !== "(not specified)")) {
					customValues.push("{event}{" + _event + "}");
				}
				if ((_genre) && (_genre !== "Other")) {
					customValues.push("{genre}{" + _genre + "}");
				}
				if ((_liveOnDemand) && (_liveOnDemand !== "(not specified)")) {
					customValues.push("{liveOndemand}{" + _liveOnDemand + "}");
				}
				if (_organizations) {
					customValues.push("{organizations}{" + _organizations + "}");
				}
				if (_people) {
					customValues.push("{people}{" + _people + "}");
				}
				if (_producers) {
					customValues.push("{producers}{" + _producers + "}");
				}
				if ((_region) && (_region !== "(not specified)")) {
					customValues.push("{region}{" + _region + "}");
				}
				if (_seasonNumber) {
					customValues.push("{seasonNumber}{" + _seasonNumber + "}");
				}
				if (_segment) {
					customValues.push("{segment}{" + _segment + "}");
				}
				if ((_show) && (_show !== "(not specified)")) {
					customValues.push("{show}{" + _show + "}");
				}
				if ((_sport) && (_sport !== "(not specified)")) {
					customValues.push("{sport}{" + _sport + "}");
				}
				if (_subEvent) {
					customValues.push("{subEvent}{" + _subEvent + "}");
				}
				if ((_clipType) && (_clipType !== "(not specified)")) {
					customValues.push("{type}{" + _clipType + "}");
				}
				if (customValues.length > 0) {
					qsQuery+="&byCustomValue=" + customValues.join(",");
				}
				
				if ((_createdAfter) || (_createdBefore)) {
					qsQuery+='&byUpdated=' + _createdAfter + '-' + _createdBefore;
				}
			} else {  // regular playlist
				if (_getPlaylistByClipIds) {
					qsQuery += '&byContent=byReleases%3DbyId%253D' + encodeURIComponent( encodeURIComponent( _clipIds.replace(/ /g, '').replace(/,/g, '|') ) );
				} else {
					qsQuery += '&byCategoryIds=' + _categoryId;
				}
			}
			
			qsQuery+='&byApproved=true';
			
			if (_customQuery) qsQuery+='&'+_customQuery;
			
			if (_feedUrl) {
				fullRequestUrl = _feedUrl + qsFormat;
			} else if (clipUrl) {
				fullRequestUrl = _releaseRequestBaseUrl + clipUrl + qsFormat;
			} else {
				fullRequestUrl = _releaseRequestBaseUrl + qsFormat + qsQuery;
			}
			
			req = new JSONRequest(fullRequestUrl, _instance+".getReleasesResponse");
			req.send();
		},

		getReleasesResponse: function(payload) {
			var data = {};
			var i, l = payload.entries.length;
			var entry, liveData;
			data.items = [];
			
			var list = [];
			var r;
			
			for (i=0; i< l; i++) {
				entry = payload.entries[i];
				data.items[i] = {};
				data.items[i].logic = {};

				data.items[i].ID = entry.media$content[0].plfile$releases[0].id.match(/\/data\/Release\/([0-9]+)/)[1];
				data.items[i]._AdCategory = entry.pl1$adCategory;
				data.items[i].airdate = entry.pubDate;
				data.items[i].adSite = entry.pl1$adSite;
				data.items[i].category = _categoryTitle;
				data.items[i]._ClipType = entry.pl1$type;
				data.items[i].description = entry.description;
				data.items[i]._Event = entry.pl1$event;
				data.items[i].length = entry.media$content[0].plfile$duration;
				data.items[i]._LiveOnDemand = entry.pl1$liveOndemand;
				data.items[i]._SeasonNumber = entry.pl1$seasonNumber;
				data.items[i]._Segment = entry.pl1$segment;
				data.items[i]._Show = entry.pl1$show;
				data.items[i].show = entry.pl1$show;
				data.items[i]._Sport = entry.pl1$sport;
				data.items[i].thumbnailURL = entry.plmedia$defaultThumbnailUrl || _defaultThumbUrl;
				data.items[i].title = entry.title;
				data.items[i].URL = entry.media$content[0].plfile$releases[0].plrelease$url; // !!

				if (data.items[i]._AdCategory) {
					if( _releaseAdCategoires ) { 
						_releaseAdCategoires[ data.items[i].ID ] = data.items[i]._AdCategory;
					}
				}
				if ((_descLength) && (data.items[i].description.length > _descLength)) {
					data.items[i].description = data.items[i].description.substr(0, _descLength) + "...";
				}
				data.items[i].dur = this.secToHMS(data.items[i].length);
				//data.items[i].uberHref = "/video/#/" + _categoryTitle + "/ID=" + data.items[i].ID;
				this.createPlayAction(data.items[i]);

				data.items[i].URL = this.adParameters(data.items[i]);
				if (_playerId) {
					data.items[i].playVideoCommand = _instance + ".playVideo('" + data.items[i].ID + "');return false;";
				} else {
					data.items[i].playVideoCommand = "";
				}
				
				if ((data.items[i]._Show) && (data.items[i]._Show) != "(not specified)") {
					data.items[i].label = data.items[i]._Show;
					data.items[i].logic.labelType = "Show";
				} else if ((data.items[i]._Event) && (data.items[i]._Event) != "(not specified)") {
					data.items[i].label = data.items[i]._Event;
					data.items[i].logic.labelType = "Event";
				} else if ((data.items[i]._Sport) && (data.items[i]._Sport) != "(not specified)") {
					data.items[i].label = data.items[i]._Sport;
					data.items[i].logic.labelType = "Sport";
				} else if ((data.items[i]._Genre) && (data.items[i]._Genre) != "(not specified)") {
					data.items[i].label = data.items[i]._Genre;
					data.items[i].logic.labelType = "Genre";
				} else {
					data.items[i].label = "CBC";
					data.items[i].logic.labelType = "Default";
				}
				
				if (data.items[i]._LiveOnDemand === "Live") {
					liveData = this.processLive(data.items[i].airdate);
					data.items[i].liveDate = liveData.date;
					data.items[i].liveTime = liveData.time;
					data.items[i].logic.liveState = liveData.state;
					
					r = new _this.LiveRelease ( data.items[i].ID, 
												"",
												new Date( data.items[i].airdate ), 
												data.items[i].length,
												data.items[i].logic.labelType,
												data.items[i].title,
												data.items[i].description,
												data.items[i].thumbnailURL,
												null );
					
				} else {
					//( id, url, date, duration, show, title, description, image, relatedLinks )
						
					data.items[i].liveDate = "";
					data.items[i].liveTime = "";
					data.items[i].logic.liveState = "not";
					data.items[i].airdate = this.makeAirDate(data.items[i].airdate, true);

					r = new _this.Release ( data.items[i].ID, 
							"",
							new Date( data.items[i].airdate ), 
							data.items[i].length,
							data.items[i].logic.labelType,
							data.items[i].title,
							data.items[i].description,
							data.items[i].thumbnailURL,
							null );
				}
				
				r.url = data.items[i].hasOwnProperty( "uberHref" ) ? data.items[i].uberHref : "";
				
				list.push( r );
			}
			
			this.displayReleases(data);
			
			if( typeof( this.fire ) == "function" ) {
				this.fire( "onChange", list );
			}
			
		},
		
		
		cleanAdParams: function (s) {
			return s && s.toLowerCase().replace(/\s/g, "_").replace(/[^_a-z0-9]/g, "");
		},

		adParameters: function (release) {
			var releaseURL = [];
			
			releaseURL.push( "site=" + this.getSite() );
			
			var zone;
			if (release._AdCategory)
				zone = this.cleanAdParams(release._AdCategory);
			else if (_adCategory)
				zone = this.cleanAdParams(_adCategory);
			if (release.adSite)
				zone = release.adSite;
			
			if( zone )
				releaseURL.push( "zone=" + zone );
			
			releaseURL.push( "shortClip=" + this.getShortClip( release.length ) );
			
			var props = [ "_Show", "_Sport", "_SeasonNumber", "_ClipType", "_Segment", "_Event", "_LiveOnDemand" ];
			var params = [ "show", "sport", "season", "type", "section", "event", "liveondemand" ] 
			var i = props.length;
			var prop;
			while( i-- ){
				prop = this.cleanAdParams( release[ props[ i ]  ] );
				if( prop ){
					releaseURL.push( params[i] + "=" + prop );
				}
			}
			
			if( release.URL.lastIndexOf( "?" ) != -1 )
				return release.URL + "&" + releaseURL.join("&");
			else
				return release.URL +"?" + releaseURL.join("&");
		}, 
		
		getShortClip: function ( length ) 
		{
			return length < 120000;
		},
		
		getSite: function ()
		{
			//location.protocol, location.host, location.pathname
			//cbc.sports.ca, cbc.ent.ca, cbc.news.ca
			if ( _site ) 
			{
				return _site;
			}
			else if( typeof(advertising_site) != "undefined" ) // check in-page ads
			{
				//map values
				var values = [ "cbc.news.ca", "cbc.sports.ca", "cbc.ent.ca" ];
				var options = [[ "cbc.news.ca", "cbc.money.ca", "cbc.health.ca", "cbc.technology.ca", "cbc.ca" ],
							   ["cbc.sports.ca"],
							   ["cbc.ent.ca", "cbc.tv.ca", "cbc.src.ca"] ];
				var i = values.length; 
				var ops;
				while( i-- )
				{
					ops = options[ i ];
					j = ops.length;
					while( j-- )
					{
						if( ops[ j ] == advertising_site ) return values[ i ];
					}
				}
			}
			
			if (location.host.indexOf('sports') != -1) 
			{
				return 'cbc.sports.ca';
			}	
			else if (location.host.indexOf('entertainment') != -1) 
			{
				return 'cbc.ent.ca';
			}
			else
			{
				return 'cbc.news.ca';
			}	
		},
		
		// This Function might be over ridden durring the init() if the object 'o' has a 'createPlayAction' property defined
		createPlayAction: function( o ) {
			if( _categoryTitle ) {
				o.uberHref = "/video/#/"+_categoryTitle+"/ID="+o.ID;
			}
			else
			{
				o.uberHref = "/video/#/ID="+o.ID;
			}
		},
		
		displayReleases: function(data) {
			var output = "";
			var o;
			for (var i=0; i<data.items.length; i++) {
				o = data.items[i];
				output += _tpl_playlist_item.evaluate(o, o.logic);
				
			}
			// send html to page
			if ($(_containerId)) $(_containerId).innerHTML = output;
			
			// if callback exists then run function
			if (_callback != null) _callback({results:data, params:_callbackParams});
		},


		playVideo: function(clipId) {
			var swf = swfobject.getObjectById( _playerId );
			if (swf) {
				swf.setClipId( clipId );
			}
		},


		// Utility Functions
		flattenCustomData: function(data) {
			var o = {};
			var customObj = this.customDataToObj(data);
			for (key in customObj) {
				if (key.indexOf("RelatedURL") >= 0) {
					var linkParts = customObj[key].split("|");
					o['_'+key+'_title'] = linkParts[0];
					o['_'+key+'_href'] = linkParts[1];
					o['_'+key+'_target'] = linkParts[2];
				} else {
					o['_'+key] = customObj[key];
				}
			}
			return o;
		},

		customDataToObj: function(data) {
			var obj={};
			for (var i=0; i<data.length; i++) {
				var o = data[i];
				if (o.title && o.value) {
					obj[o.title.replace(/-/ig,"")]=o.value;
				}
			}
			return obj;
		},
		
		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());
		},

		secToHMS: function(sec) {
			return this.msToHMS(sec * 1000);
		},

		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);
			return h>0 ? h+':'+('0'+m).substr(-2)+':'+s : m+':'+s;
		},

		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;
		},
		
		getAdCategory: function ( clipId )
		{
			var adCat = _releaseAdCategoires[ clipId ];
			if( !adCat )
			{
				if (_adCategory) 
				{
					return _adCategory;
				}
			}
			return "";
		},
		setKeywords: function(val){
			_keywords = val;
		},
		getKeywords: function(){
			return _keywords;
		},
		setAccount: function(val){
			_account = val;
		},
		getAccount: function(){
			return _account;
		},
		setSport: function(val){
			_sport = val;
		},
		getSport: function(){
			return _sport;
		},
		setShow: function(val){
			_show = val;
		},
		getShow: function(){
			return _show;
		},
		setRegion: function(val){
			_region = val;
		},
		getRegion: function(){
			return _region;
		},
		setClipType: function(val){
			_clipType = val;
		},
		getClipType: function(){
			return _clipType;
		},
		setAudioVideo: function(val){
			_audioVideo = val;
		},
		getAudioVideo: function(){
			return _audioVideo;
		},
		setGenre: function(val){
			_genre = val;
		},
		getGenre: function(){
			return _genre;
		}
	}
	
	var TempWrapper = function (Y)
	{
		/***
		 * 
		 */
		_this.Release = function ( id, url, date, duration, show, title, description, image, relatedLinks )
		{
			this.id = id;
			this.url = url;
			this.date = date;
			this.duration = duration;
			this.show = show;
			this.title = title;
			this.description = description;
			this.image = image;
			this.relatedLinks = relatedLinks;
			this.cached = new Date().getTime();
		};
		
		
//		
//		//formated date
		_this.Release.prototype.getFormatedDuration = function ()
		{
			if( !isNaN( this.duration ) )
			{
				var ms = this.duration * 1000;
				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);
				return h>0 ? h+':'+('0'+m).substr(-2)+':'+s : m+':'+s;
			}
			return "";
		}

		
		_this.Release.prototype.clone = function ()
		{
			var c = new this.constructor ( this.id, this.date, this.duration, this.show, this.title, this.description, this.image, this.relatedLinks );
			c.cached = this.cached;
			return c;
		};
	
		_this.LiveRelease = function ()
		{
			var a = Y.Array(arguments);
			
			a[2] = 0;
			
			this.constructor.superclass.constructor.apply( this, a );
		};
	
		Y.extend( _this.LiveRelease, _this.Release );
	
		_this.AudioRelease = function ()
		{
			this.constructor.superclass.constructor.apply( this, Y.Array(arguments) );
		};
	
		Y.extend( _this.AudioRelease, _this.Release );
	
		_this.RelatedLink = function ( name, href, target )
		{
			this.name = name ? name : "";
			this.href = href ? href : "";
			this.target = target ? target : "_blank";
		};
		
		Y.augment(o, Y.EventTarget);
	}
	
	YUI().use( "node", TempWrapper );
	
	return o;

}

