var C4=C4||{};
C4.My4oD=C4.My4oD||{};
C4.My4oD.Model=(function($,utils){return{History:{ANON_COOKIE_NAME:"C4_History_Anonymous",STORAGE_KEY:"C4_History",SO_KEY:"C4_History",ANON_MAX_ITEMS:2,USER_MAX_ITEMS:15},Playlist:{STORAGE_KEY:"C4_Playlist",SO_KEY:"C4_Playlist",MAX_ITEMS:50},Favs:{STORAGE_KEY:"C4_Favourites",SO_KEY:"C4_Favourites",MAX_ITEMS:50},ITEMS_PER_PAGE:5,removedItemNo:null,FLASH_SO_EXPIRE_MINS:525600,EXPIRE_MINS:60,ADD_MSG:"ADD_MSG",REMOVE_MSG:"REMOVE_MSG",REMOVE_ERROR_MSG:"REMOVE_ERROR_MSG",REMOVE_ALL_MSG:"REMOVE_ALL_MSG",EXISTS_MSG:"EXISTS_MSG",MAX_REACHED_MSG:"MAX_REACHED_MSG",NEW_EPS_MSG:"NEW_EPS_MSG",HISTORY:"HISTORY",PLAYLIST:"PLAYLIST",FAVS:"FAVS",UNWATCHED_LIST:"UNWATCHED_LIST",LOGINSTATECHANGE:"LOGIN",ACTION_COOKIE:"My4oD_ACTION",PLAYING:"PLAYING",PLAY_AGAIN:"PLAY_AGAIN",RESUME:"RESUME",PLAY:"PLAY",ADD_ACTION:"ADD",REMOVE_ACTION:"REMOVE",options:null,logInStateChanged:null,initCallbackFunc:null,isWindows7:/nt 6.1/.test(navigator.userAgent.toLowerCase()),feedbackMsg:null}
})(jQuery,C4.Util);
C4.My4oD.View=(function($,utils){var Model=C4.My4oD.Model;
var View={buildMarkup:function buildMarkup(type,tabSelector,my4odObj){if(Model.options.disableView){return 
}var isLoggedIn=Identity.isLoggedIn(),getListItemFunc=null,title=null,my4odEmptySel=tabSelector+" ol li .no-my4od",clearAll="",closeLink='<li><a class="close" href="#"><span>Close</span></a></li>',historySignIn='<div class="signin"><div id="signInHistory" /></div>',historySignInPromptText='<div class="signin-prompt"><p><strong>Sign in to get the most from 4oD History</strong></p><ul><li>View the last 15 4oD shows you watched or started to watch</li><li>Make your 4oD History personal and access it wherever you are </li></ul></div>',i=0;
switch(type){case Model.HISTORY:title="History";
getListItemFunc=View.getEpisodeItemMarkup;
break;
case Model.PLAYLIST:title="Playlist";
clearAll='<li><a class="clear-all" href="#"><span>Clear Playlist</span></a></li>';
getListItemFunc=View.getEpisodeItemMarkup;
break;
case Model.FAVS:title="Favourites";
clearAll='<li><a class="clear-all" href="#"><span>Clear Favourite Shows</span></a></li>';
getListItemFunc=C4.Favourites.View.getView().getFavListItem;
break;
default:break
}$(tabSelector).html('<h3 class="accessibility">'+title+'</h3><ul class="my4od-links">'+closeLink+'</ul><ol class="promo-container"></ol>');
if(my4odObj&&my4odObj.list&&my4odObj.list.length>0){var my4odArray=my4odObj.list;
for(i=0;
i<my4odArray.length;
i++){if(type===Model.HISTORY&&((isLoggedIn&&i<Model.History.USER_MAX_ITEMS)||(!isLoggedIn&&i<Model.History.ANON_MAX_ITEMS))){if(!isLoggedIn){$(tabSelector+" .promo-container").addClass("not-logged-in")
}$(tabSelector+" .promo-container").append(getListItemFunc(type,my4odArray[i]))
}else{if(isLoggedIn&&type===Model.PLAYLIST&&i<Model.Playlist.MAX_ITEMS){$(tabSelector+" .promo-container").append(getListItemFunc(type,my4odArray[i]));
if($(tabSelector+" .clear-all").length===0){$(clearAll).insertBefore(tabSelector+" .my4od-links li:first-child")
}}else{if(isLoggedIn&&type===Model.FAVS&&i<Model.Favs.MAX_ITEMS){$(tabSelector+" .promo-container").append(getListItemFunc(my4odArray[i]));
if($(tabSelector+" .clear-all").length===0){$(clearAll).insertBefore(tabSelector+" .my4od-links li:first-child")
}}}}}C4.ButtonManager.Controller.addButtons(type,C4.ButtonManager.Model.REMOVE_BTN,tabSelector+" .promo-container > li",false,null);
if(!isLoggedIn&&(type===Model.PLAYLIST||type===Model.FAVS)){View.showNotLoggedInState(tabSelector,title)
}if(type===Model.HISTORY&&!isLoggedIn&&(my4odArray.length>=1&&my4odArray.length<=2)){$(tabSelector).append(historySignInPromptText+historySignIn).addClass("register-incentive");
View.addSignInFlash("signInHistory")
}}else{if(!isLoggedIn&&(type===Model.PLAYLIST||type===Model.FAVS||type===Model.HISTORY)){View.showNotLoggedInState(tabSelector,title)
}else{View.showEmptyState(type,tabSelector)
}}},getEpisodeItemMarkup:function getEpisodeItemMarkup(type,episode){var episodeInfo=View.getEpisodeInfo(episode);
var timeStr="",currentDate=new Date();
if(type===Model.HISTORY){var timeDiff=utils.getReadableTimeDiff(currentDate,episode.timeStamp);
if(timeDiff!==null){if(timeDiff.indexOf("year")!=-1){timeDiff="Over 1 year"
}timeStr='<p class="time-diff">'+timeDiff+" ago</p>"
}}var guidance=episode.guidance?'<li class="guidance"><span class="accessibility">'+episode.guidanceText+"</span></li>":"",subtitles=episode.subtitles?'<li class="subtitles"><span class="accessibility">This programme has episodes with subtitltes available.</span></li>':"",ad=episode.audioDescribed?'<li class="audiodesc"><span class="accessibility">This programme has episodes with audio description available.</span></li>':"";
var indicators="";
if(guidance.length>0||subtitles.length>0||ad.length>0){indicators='<ul class="indicators">'+guidance+subtitles+ad+"</ul>"
}var expired=(episode.expired?'<span class="expiredContainer"></span><span class="expiredText">Unavailable</span>':"");
var playIconClass=type===Model.HISTORY?"play-again-icon":"play";
return'<li class="promo" data-brandwst="'+episode.brandWst+'" data-wsprogrammeid="'+episode.programmeId+'" data-assetid="'+episode.assetId+'"><a class="promo-link" href="/programmes/'+episode.brandWst+"/4od#"+episode.assetId+'"><img src="'+episode.imagePath+'" width="145" height="82" alt="Programme Image"/><span class="'+playIconClass+'"></span>'+expired+'<p class="title">'+episode.title1+"</p>"+episodeInfo+timeStr+"</a>"+indicators+"</li>"
},getEpisodeInfo:function getEpisodeInfo(episode){if(episode&&episode.title2&&episode.title2.length>0){return'<p class="series-info">'+episode.title2+"</p>"
}else{return""
}},showEmptyState:function showEmptyState(type,tabSelector){var mainText=null,sideText=null,imgTag=null,closeLink='<a class="close" href="#"><span>Close</span></a>';
$(tabSelector).find(".promo-container").remove();
if(type===Model.HISTORY&&$(tabSelector+" .no-my4od").length===0){mainText='<p class="no-my4od">Start accessing your 4oD History today</p>';
imgTag='<img class="empty-history" width="200" height="113" src="/static/global/css/4od/img/noHistory.jpg" alt=""/>';
sideText='<div class="resume"><ul><li>Your recently watched 4oD shows will appear here</li><li>You can view the last 15 4oD shows you watched or started to watch</li><li>Your 4oD History is personal to you &ndash; useful if you\'re sharing a computer</li></ul></div>'
}else{if(type===Model.PLAYLIST&&$(tabSelector+" .no-my4od").length===0){mainText='<p class="no-my4od">Your 4oD Playlist is currently empty</p>';
imgTag='<img class="empty-favs" width="200" height="113" src="/static/global/css/4od/img/no-playlist.jpg" alt=""/>';
sideText='<div class="resume"><ul><li>Look out for the add to Playlist button as you browse the site</li><li>Use the button to save the 4oD episodes you want to watch in one place</li><li>Save time searching. Never forget that episode you wanted to watch.</li></ul></div>'
}else{if(type===Model.FAVS&&$(tabSelector+" .no-my4od").length===0){mainText='<p class="no-my4od">Your Favourite Shows list is currently empty</p>';
imgTag='<img class="empty-favs" width="200" height="113" src="/static/global/css/4od/img/no-favs.jpg" alt=""/>';
sideText='<div class="resume"><ul><li>Look out for the add to Favourite Shows button as you browse the site</li><li>Use the buttons to create a list of all your favourite shows</li><li>New 4oD episodes are flagged here so you don\'t miss out</li></ul></div>';
$(tabSelector).find(".clear-all").remove();
$(tabSelector).find(".close").removeClass("separator")
}}}$(tabSelector).append(mainText+imgTag+sideText)
},showNotLoggedInState:function showNotLoggedInState(tabSelector,title){var mainText=null,sideText=null,imgTag=null;
var signInId="signIn"+title;
var signIn='<div class="signin"><div id="'+signInId+'" /></div>';
$(tabSelector).find(".promo-container, .resume, .signin-prompt, .signin, .empty").remove();
if(tabSelector==="#playlist"){mainText='<p class="no-my4od">Start creating your 4oD Playlist today</p>';
imgTag='<img class="empty-favs" width="200" height="113" src="/static/global/css/4od/img/no-playlist.jpg" alt=""/>';
sideText='<div class="resume"><ul><li>Look out for the add to Playlist button as you browse the site</li><li>Use the button to save the 4oD episodes you want to watch in one place</li><li>Save time searching. Never forget that episode you wanted to watch.</li></ul></div>'
}else{if(tabSelector==="#favourites"){mainText='<p class="no-my4od">Start using Favourite Shows today</p>';
imgTag='<img class="empty-playlist" width="200" height="113" src="/static/global/css/4od/img/no-favs.jpg" alt=""/>';
sideText='<div class="resume"><ul><li>Look out for the add to Favourite Shows button as you browse the site</li><li>Use the buttons to create a list of all your favourite shows</li><li>New 4oD episodes are flagged here so you don\'t miss out</li></ul></div>'
}else{if(tabSelector==="#history"){mainText='<p class="no-my4od">Start accessing your 4oD History today</p>';
imgTag='<img class="empty-history" width="200" height="113" src="/static/global/css/4od/img/noHistory.jpg" alt=""/>';
sideText='<div class="resume"><ul><li>Keep track of shows you recently watched or started to watch</li><li>Access your 4oD History wherever you are &ndash; at home or at work</li><li>Make your 4oD History personal &ndash; useful if you\'re sharing a computer</li></ul></div>'
}else{mainText+='<p class="no-my4od">Please login <a href="/4me/login?redirectUrl='+window.location.href+'">here</a> to make use of '+title+".</p>"
}}}$(tabSelector).append('<div class="empty cf">'+mainText+imgTag+sideText+signIn+"</div>");
View.addSignInFlash(signInId)
},addSignInFlash:function addSignInFlash(locId){var flashvars={afterLogin:"C4.My4oD.Controller.onFlashLogin"};
swfobject.embedSWF(swfRoot+"asset/flash/swf/inpagelogin.swf",locId,314,206,"9.0.115",swfRoot+"asset/flash/swf/expressInstall.swf",flashvars,{wmode:"opaque",scale:"noscale",align:"top"})
},removeItemMarkup:function removeItemMarkup(type,tabSelector,attrVal){var attrName=type===Model.FAVS?"brandwst":"wsprogrammeid";
$(tabSelector+" li[data-"+attrName+"="+attrVal+"]").remove();
if($(tabSelector+" ol li").length===0){if(!Identity.isLoggedIn()&&type===Model.HISTORY){View.showNotLoggedInState(tabSelector,"History")
}else{View.showEmptyState(type,tabSelector)
}$(tabSelector+" .clear-all").remove()
}},updateCount:function updateCount(type,my4odObj,countSelector,maxItems){if(Model.options.disableView){return 
}var count=0;
if(my4odObj&&my4odObj.list){var my4odArray=my4odObj.list;
count=Math.min(my4odArray.length,maxItems)
}$(countSelector).text(count);
View.Fixes.webkitFixTabs(count,type)
},addCarousel:function addCarousel(type,tabSelector,setterFunc){$(tabSelector+" .promo-container").wrap('<div class="carousel cf" />');
setterFunc(utils.Carousel(tabSelector+" .carousel",{itemsPerPage:Model.ITEMS_PER_PAGE,paddingModifier:4,marginModifier:5}))
},removeCarousel:function removeCarousel(carousel,setterFunc){var $carousel=carousel.getCarouseljQuery();
$carousel.remove();
setterFunc()
},removeClearAllLink:function removeClearAllLink(tabSelector){if(Model.options.disableView){return 
}$(tabSelector+" .clear-all").remove();
$(tabSelector+" .close").removeClass("separator")
},adjustPromoItems:function adjustPromoItems(tabSelector){if(Model.options.disableView){return 
}tabSelector=tabSelector||"my4od";
$(tabSelector+" .promo-container").promoHover({showFullyOpened:false})
},showClearAllMessage:function showClearAllMessage(list){var listType="";
switch(list){case"PLAYLIST":listType="playlist";
callbackStr="C4.Playlist.Controller.getHelper().clearPlaylistAJAX";
break;
case"FAVS":listType="favourite shows";
callbackStr="C4.Favourites.Controller.getHelper().removeAllFavsAJAX";
break;
default:return null
}var confirmWin='<div id="my4odClearAll" class="cf"><div class="transparent"></div><div class="confirmContainer"><h1>Are you sure you want to clear your <span class="listType'+list+'">'+listType+'</span>?</h1><p><button type="button" class="close icon confirm" onclick="C4.My4oD.View.removeClearAllMessage('+callbackStr+')">yes</button><button type="button" class="close icon cancel" onclick="C4.My4oD.View.removeClearAllMessage()">cancel</button></p></div></div>';
$("#my4od .my4od-tabs").after(confirmWin);
if($.browser.webkit){$("#my4od").addClass("webkit")
}return false
},removeClearAllMessage:function removeClearAllMessage(callbackStr){if(callbackStr){callbackStr()
}$("#my4odClearAll").remove()
},showMessage:function showMessage(opTitle,opTitleClass,msgType,val,highlightSel,highlightCallback,skipMsgQueue,options){var msg=null,msgClass=null;
switch(msgType){case Model.ADD_MSG:msg="<span class='brand-title'>"+val+"</span> has been added to your";
msgClass="added";
break;
case Model.ADD_ERROR_MSG:msg="Please try again. There was an error adding the item to your";
msgClass="error";
break;
case Model.REMOVE_MSG:msg="<span class='brand-title'>"+val+"</span> has been removed from your";
msgClass="removed";
break;
case Model.REMOVE_ALL_MSG:msg="All items have been removed from your";
msgClass="removed";
break;
case Model.REMOVE_ERROR_MSG:msg="Please try again. There was an error removing the item from your";
msgClass="error";
break;
case Model.EXISTS_MSG:if(opTitleClass==="favourite"){msg="<span class='brand-title'>"+val+"</span> is already in your"
}else{msg="This episode from <span class='brand-title'>"+val+"</span> is already in your"
}msgClass="error";
break;
case Model.MAX_REACHED_MSG:msg="You have reached the maximum of 50 items in your";
msgClass="error";
break;
case Model.NEW_EPS_MSG:var epText=(parseInt(val,10)==1)?"episode":"episodes";
msg="You have "+val+" new "+epText+" available in your";
msgClass="added";
break;
default:return null
}var msgOptions={message:msg,messageClass:msgClass,operationTitle:opTitle,operationTitleClass:opTitleClass,highlightSel:highlightSel,highlightCallback:highlightCallback,skipMsgQueue:skipMsgQueue,options:options};
Model.feedbackMsg=new utils.InfoMessage(msgOptions)
},scrollToMy4od:function scrollToMy4od(callback,animated){var top=132;
if(animated){jQuery("html, body").animate({scrollTop:top+"px"},500,"linear",callback)
}else{window.scrollTo(0,top);
callback()
}},triggerOpenTab:function triggerOpenTab(type){var tabClass="";
switch(type){case Model.HISTORY:tabClass="clock";
break;
case Model.PLAYLIST:tabClass="playlist";
break;
case Model.FAVS:tabClass="heart";
break;
default:break
}if($("#my4od .tabs ."+tabClass).hasClass("selected")===false){$("#my4od .tabs ."+tabClass).click()
}},tabOpen:function tabOpen(){$(".four-on-demand-nav .utilities-tabs").addClass("tab-open");
if($.browser.webkit){$(".four-on-demand-nav .local-sub-nav-links li.selected").height("27px")
}if($(".four-on-demand-nav li.selected .heart").length===1){C4.Favourites.Controller.removeFavsHighlight();
if(Model.feedbackMsg){Model.feedbackMsg.clearMessage()
}}C4.My4oD.Controller.trackOpenTab()
},tabClose:function tabClose(){$(".four-on-demand-nav .utilities-tabs").removeClass("tab-open");
if($.browser.webkit){$(".four-on-demand-nav .local-sub-nav-links li").height("auto")
}},updateAllButtons:function updateAllButtons(){if(C4&&C4.ButtonManager&&C4.ButtonManager.Controller&&C4.ButtonManager.Controller.updateAllButtons){C4.ButtonManager.Controller.updateAllButtons()
}},setButtonNormal:function setButtonNormal($button){if(C4&&C4.ButtonManager&&C4.ButtonManager.View&&C4.ButtonManager.View.setNormal){C4.ButtonManager.View.setNormal($button)
}},setButtonWaiting:function setButtonWaiting($button){if(C4&&C4.ButtonManager&&C4.ButtonManager.View&&C4.ButtonManager.View.setWaiting){C4.ButtonManager.View.setWaiting($button)
}},updatePlayIcon:function updatePlayIcon($promo,iconType){if($promo.length>0){switch(iconType){case Model.PLAYING:$promo.find(".promo-link > img + span").attr("class","now-playing-icon");
break;
case Model.RESUME:$promo.find(".promo-link > img + span").attr("class","resume-icon");
break;
case Model.PLAY_AGAIN:$promo.find(".promo-link > img + span").attr("class","play-again-icon");
break;
case Model.PLAY:default:$promo.find(".promo-link > img + span").attr("class","play");
break
}}},Fixes:{webkitFixTabs:function webkitFixTabs(count,type){if($.browser.webkit){var tabNo=null,minWidth=null;
if(type==="HISTORY"){tabNo=":eq(0)";
minWidth=58
}if(type==="PLAYLIST"){tabNo=":eq(1)";
minWidth=65
}if(type==="FAVS"){tabNo=":eq(2)";
minWidth=117
}if(parseInt(count)<10){$(".my4od-tabs .local-sub-nav-links a"+tabNo).css("min-width",minWidth+"px")
}else{$(".my4od-tabs .local-sub-nav-links a"+tabNo).css({"min-width":(minWidth+12)+"px"})
}}},firefoxButtons:function firefoxButtons(){if($.browser.mozilla&&parseInt($.browser.version)>4.9){$("body").addClass("ff5up")
}}}};
return{getView:function getView(){return View
}}
})(jQuery,C4.Util);
C4.My4oD.Controller=(function($,utils){var Model=C4.My4oD.Model,View=C4.My4oD.View.getView(),Helper={updateView:function updateView(type,tabSelector,countSelector,carousel,maxItems,options){if(Model.options.disableView){return 
}var isLoggedIn=Identity.isLoggedIn(),my4odObj=Helper.getLocalObject(type);
View.buildMarkup(type,tabSelector,my4odObj);
View.Fixes.firefoxButtons();
View.adjustPromoItems(tabSelector);
View.updateCount(type,my4odObj,countSelector,maxItems);
var count=(my4odObj&&my4odObj.list?my4odObj.list.length:0);
Helper.updateCarousel(type,carousel,tabSelector,count,options)
},addNewItem:function addNewItem(type,newItem){var isLoggedIn=Identity.isLoggedIn(),my4odObj=Helper.getLocalObject(type);
if(my4odObj===null){my4odObj=Helper.createEmptyObject(type,isLoggedIn)
}if(type===Model.HISTORY||type===Model.FAVS){my4odObj=Helper.addObjectToArray(my4odObj,newItem)
}else{my4odObj.list.push(newItem)
}if(type===Model.HISTORY){my4odObj=Helper.removeDuplicatesOfFirst(my4odObj);
if(isLoggedIn===false&&my4odObj.list.length>Model.History.ANON_MAX_ITEMS){my4odObj.list.pop()
}}Helper.setLocalObject(type,my4odObj);
Helper.tellFlashReady(type)
},getItem:function getItem(type,propertyName,propertyValue){var my4odObj=My4od.Helper.getLocalObject(type);
if(my4odObj&&my4odObj.list){var my4odArray=my4odObj.list;
if(my4odArray){var item=null;
for(var i=0;
i<my4odArray.length;
i++){item=my4odArray[i];
if(item[propertyName]==propertyValue){return item
}}}}return null
},removeItem:function removeItem(type,propName,propVal,tabSelector,countSelector,maxItems,carousel){var my4odObj=Helper.getLocalObject(type),count=null;
my4odObj=Helper.removeObjectFromArray(type,my4odObj,propName,propVal);
Helper.setLocalObject(type,my4odObj);
View.removeItemMarkup(type,tabSelector,propVal);
if(type===Model.HISTORY){C4.History.Controller.fillEmptySlots();
if(my4odObj.list.length>Model.History.USER_MAX_ITEMS){count=Model.History.USER_MAX_ITEMS
}else{count=my4odObj.list.length
}}else{count=my4odObj.list.length
}View.updateCount(type,my4odObj,countSelector,maxItems);
Helper.updateCarousel(type,carousel,tabSelector,count,{exists:true});
Helper.tellFlashReady(type)
},getLocalObject:function getLocalObject(type,userId){var my4odVal=null,keys=Helper.getStorageKeys(type,userId);
if(Identity.isLoggedIn()){if(window.localStorage){my4odVal=utils.getStorageValue(keys.browserKey)
}else{try{my4odVal=$("#soAPI")[0].getData(keys.sharedObjectKey)
}catch(e){}}}else{if(type===Model.HISTORY){my4odVal=utils.getCookieValue(Model.History.ANON_COOKIE_NAME)
}}var my4odObj=null;
try{my4odObj=$.evalJSON(my4odVal)
}catch(e){}return my4odObj
},setLocalObject:function setLocalObject(type,my4odObj,userId){var isLoggedIn=Identity.isLoggedIn(),keys=Helper.getStorageKeys(type,userId);
var jsonStr=null;
try{jsonStr=$.toJSON(my4odObj)
}catch(e){}if(isLoggedIn){if(window.localStorage){utils.setStorageValue(keys.browserKey,jsonStr)
}else{$("#soAPI")[0].setData(keys.sharedObjectKey,jsonStr,Model.FLASH_SO_EXPIRE_MINS)
}}else{if(type===Model.HISTORY){$.cookie(Model.History.ANON_COOKIE_NAME,jsonStr,{path:"/"})
}}},clearLocalObject:function clearLocalObject(type,userId){var isLoggedIn=Identity.isLoggedIn(),keys=Helper.getStorageKeys(type,userId);
if(isLoggedIn){if(window.localStorage){utils.removeStorageValue(keys.browserKey)
}else{$("#soAPI")[0].deleteData(keys.sharedObjectKey)
}}else{if(type===Model.HISTORY){document.cookie=Model.History.ANON_COOKIE_NAME+"=deletion; expires=Fri, 27 Jul 2001 02:47:11 UTC; path=/"
}}},hasLocalObject:function hasLocalObject(type){var keys=Helper.getStorageKeys(type);
if(Identity.isLoggedIn()){if(window.localStorage){return utils.getStorageValue(keys.browserKey)!==null
}else{return $("#soAPI")[0].objExists(keys.sharedObjectKey)!==false
}}else{if(type===Model.HISTORY){return utils.getCookieValue(Model.History.ANON_COOKIE_NAME)!==null
}}},createEmptyObject:function createEmptyObject(type){var isLoggedIn=Identity.isLoggedIn(),userId=isLoggedIn?Identity.getUserId():"anonymous";
switch(type){case Model.HISTORY:return{userId:userId,list:[]};
case Model.PLAYLIST:case Model.FAVS:return userId!=="anonymous"?{userId:userId,list:[]}:null;
default:return null
}},setExpiryDate:function setExpiryDate(storedData){storedData.expiryDate=(new Date()).getTime()+Model.EXPIRE_MINS*1000*60;
return storedData
},localObjectExpired:function localObjectExpired(storedData){var currentDate;
if(storedData&&storedData.expiryDate!==null){currentDate=new Date();
if(storedData.expiryDate<currentDate.getTime()){return true
}}return false
},isSharedObj:function isSharedObj(){if(window.localStorage){return false
}else{return true
}},addObjectToArray:function addObjectToArray(my4odObj,newItem){if(my4odObj&&my4odObj.list&&newItem){my4odObj.list.unshift(newItem)
}return my4odObj
},removeObjectFromArray:function removeObjectFromArray(type,my4odObj,propertyName,propertyValue){var index=null,my4odArray=my4odObj.list,my4odItem=null;
propertyValue+="";
for(var i=0;
i<my4odArray.length;
i++){my4odItem=my4odArray[i];
if(my4odItem[propertyName]===propertyValue){index=i
}}if(index!==null){my4odArray.splice(index,1);
Model.removedItemNo=index
}my4odObj.list=my4odArray;
return my4odObj
},removeDuplicatesOfFirst:function removeDuplicatesOfFirst(my4odObj){if(my4odObj&&my4odObj.list&&my4odObj.list.length>1){var noDuplicates=[];
var my4odArray=my4odObj.list;
var firstItem=my4odArray[0];
for(var i=1;
i<my4odArray.length;
i++){if(firstItem.programmeId!==my4odArray[i].programmeId){noDuplicates.push(my4odArray[i])
}}noDuplicates.unshift(firstItem);
my4odObj.list=noDuplicates
}return my4odObj
},updateNowPlaying:function updateNowPlaying(playingId){if(typeof playingId=="undefined"&&C4&&C4.Model&&C4.Model.getCurrentAsset){playingId=C4.Model.getCurrentAsset();
if(typeof (playingId.assetId)==="string"||typeof (playingId.assetId)==="number"){playingId=playingId.assetId
}}var $promo=null,assetId=null,resumeList=[];
if($("#resumeAPI")[0]&&$("#resumeAPI")[0].getAssetIDs){resumeList=($("#resumeAPI")[0].getAssetIDs()).split(",")
}$("#history .promo, #playlist .promo").each(function(i){$promo=$(this),assetId=$promo.data("assetid");
if(resumeList.length>0){for(var i=0;
i<resumeList.length;
i++){if(parseInt(assetId,10)===parseInt(resumeList[i],10)){View.updatePlayIcon($promo,Model.RESUME);
i=resumeList.length
}else{Helper.setPlayed($promo)
}}}else{Helper.setPlayed($promo)
}});
var $nowPlayingPromos=$("#history .promo[data-assetid="+playingId+"], #playlist .promo[data-assetid="+playingId+"]");
if($nowPlayingPromos.length>0){View.updatePlayIcon($nowPlayingPromos,Model.PLAYING)
}},setPlayed:function setPlayed($promo){if($promo.parents("#history").length===1){View.updatePlayIcon($promo,Model.PLAY_AGAIN)
}else{var hasBeenPlayed=C4.History.Controller.hasEpisode($promo.data("wsprogrammeid"));
if(hasBeenPlayed){View.updatePlayIcon($promo,Model.PLAY_AGAIN)
}else{View.updatePlayIcon($promo,Model.PLAY)
}}},saveAction:function saveAction(type,actionType,uniqueValue){var today=new Date(),expiryMs=today.getTime()+300000,jsonObj={type:type,action:actionType,val:uniqueValue,expiryMs:expiryMs,used:false};
var jsonStr=null;
try{jsonStr=$.toJSON(jsonObj)
}catch(e){}if(jsonStr&&jsonStr.length>0){document.cookie="My4oD_ACTION=deletion; expires=Fri, 27 Jul 2001 02:47:11 UTC; path=/";
$.cookie(Model.ACTION_COOKIE,jsonStr,{path:"/"})
}},doQueuedAction:function doQueuedAction(callback){if(Identity.isLoggedIn()){var actionJSON=utils.getCookieValue(Model.ACTION_COOKIE),timeMs=(new Date()).getTime();
if(actionJSON){var actionObj=null;
try{actionObj=$.evalJSON(actionJSON)
}catch(e){callback()
}var within5Mins=null;
if(actionObj){within5Mins=Math.abs(actionObj.expiryMs-timeMs)>0
}if(actionObj&&within5Mins){switch(actionObj.type){case Model.PLAYLIST:C4.Playlist.Controller.add(actionObj.val,false,null,true,callback);
break;
case Model.FAVS:C4.Favourites.Controller.add(actionObj.val,false,null,true,callback);
break;
default:break
}document.cookie="My4oD_ACTION=deletion; expires=Fri, 27 Jul 2001 02:47:11 UTC; path=/"
}else{callback()
}}else{callback()
}}},updateCarousel:function updateCarousel(type,carousel,tabSelector,itemCount,options){options=options||{};
var removedItemNo=null,isLoggedIn=Identity.isLoggedIn(),exists=options.exists||false,itemsPerPage=Model.ITEMS_PER_PAGE,setterFunc=Helper.getCarouselSetter(type);
if(Model.removedItemNo!==null){removedItemNo=Model.removedItemNo+1
}if(isLoggedIn){if(exists){if(itemCount===0){if(carousel){View.removeCarousel(carousel,setterFunc)
}}else{if(carousel){var currentItemIndex=(removedItemNo&&(removedItemNo-1)!==itemCount)?removedItemNo:itemCount;
var pageNo=Math.ceil(currentItemIndex/itemsPerPage);
Model.removedItemNo=null;
carousel.resetPaging(itemCount,pageNo)
}}}else{if(itemCount>0){View.addCarousel(type,tabSelector,setterFunc)
}}}},getStorageKeys:function getStorageKeys(type,userId){var browserKey=null,soKey=null,keyName=null;
switch(type){case Model.HISTORY:browserKey=Model.History.STORAGE_KEY;
soKey=Model.History.SO_KEY;
break;
case Model.PLAYLIST:browserKey=Model.Playlist.STORAGE_KEY;
soKey=Model.Playlist.SO_KEY;
break;
case Model.FAVS:browserKey=Model.Favs.STORAGE_KEY;
soKey=Model.Favs.SO_KEY;
break;
default:keyName="C4_"+type+(typeof userId!=="undefined"?"_"+userId:"");
return{browserKey:keyName,sharedObjectKey:keyName}
}return{browserKey:browserKey,sharedObjectKey:soKey}
},getCarouselSetter:function getCarouselSetter(type){switch(type){case Model.HISTORY:return C4.History.Model.setHistoryCarousel;
break;
case Model.PLAYLIST:return C4.Playlist.Model.setPlaylistCarousel;
break;
case Model.FAVS:return C4.Favourites.Model.setFavsCarousel;
break;
default:return null
}},tellFlashReady:function tellFlashReady(type){switch(type){case Model.HISTORY:if($("#catchUpPlayer").length>0){$("#catchUpPlayer")[0].historyLoad()
}break;
case Model.PLAYLIST:if($("#catchUpPlayer").length>0&&$("#catchUpPlayer")[0].playlistLoad){$("#catchUpPlayer")[0].playlistLoad()
}break;
case Model.FAVS:if($("#catchUpPlayer").length>0&&$("#catchUpPlayer")[0].favouritesLoad){$("#catchUpPlayer")[0].favouritesLoad()
}break;
case Model.LOGINSTATECHANGE:if($("#catchUpPlayer").length>0&&$("#catchUpPlayer")[0].loginStateChange){$("#catchUpPlayer")[0].loginStateChange()
}break;
default:return null
}},sendFlashErrorMsg:function sendFlashErrorMsg(typeNum,actionNum,msg){if($("#catchUpPlayer").length>0&&$("#catchUpPlayer")[0].showLeanbackError){$("#catchUpPlayer")[0].showLeanbackError(typeNum,actionNum,msg)
}},getDateParam:function getDateParam(){var urlParam=window.location.search;
return urlParam.indexOf("date=")>-1?urlParam:""
},delegateInit:function delegateInit(){if(window.localStorage){Helper.initResumeSWF()
}else{Helper.initSharedObject()
}},initSharedObject:function initSharedObject(){$(function(){var options={funcStr:"C4.My4oD.Controller.getHelper().initResumeSWF",funcRef:C4.My4oD.Controller.getHelper().initResumeSWF};
utils.embedSharedObjectSWF(options)
})
},initResumeSWF:function initResumeSWF(){if($("object#resumeAPI").length===0){swfobject.embedSWF("/static/programmes/asset/flash/swf/resumeAPI.swf","resumeAPIPlaceholder","10","10","9.0.115",null,{onReadyFunc:"C4.My4oD.Controller.getHelper().initAfterSWF"},{bgcolor:"#000000",allowScriptAccess:"always",wmode:"transparent"},{id:"resumeAPI"},function callbackFn(e){if(!e.success){C4.My4oD.Controller.getHelper().noFlashFailover()
}})
}else{Helper.initAfterSWF()
}},noFlashFailover:function noFlashFailover(){Helper.initAfterSWF();
$("div.signin").html('<div class="flashNotEnabled">'+utils.getNoFlashHtml()+"</div>")
},initAfterSWF:function initAfterSWF(){Helper.initTabs();
C4.History.Controller.init(Model.options.disableView);
Event.bind()
},initTabs:function initTabs(){if(Model.options.disableView){return 
}new utils.Tabbing($("#my4od"),{selected:":lt(0)",closeClass:"close",hiddenClass:"tab-content-invisible",duration:250,closeSelf:true,openCallback:C4.My4oD.View.tabOpen,closeCallback:C4.My4oD.View.tabClose})
},initHandler:function initHandler(type){switch(type){case Model.HISTORY:C4.Playlist.Controller.init(Model.options.disableView);
break;
case Model.PLAYLIST:C4.Favourites.Controller.init(Model.options.disableView);
break;
case Model.FAVS:Helper.initComplete();
break;
default:break
}},initComplete:function initComplete(){Helper.handleOnLogin(Model.options.logInStateChanged);
Helper.doQueuedAction(C4.Favourites.Controller.showNewEpisodesMsg);
View.Fixes.firefoxButtons();
Helper.updateNowPlaying();
if(Model.initCallbackFunc){Model.initCallbackFunc()
}},handleOnLogin:function handleOnLogin(logInStateChanged){if(logInStateChanged){Helper.tellFlashReady(Model.LOGINSTATECHANGE)
}},setOptionDefaults:function setOptionDefaults(){var options=Model.options;
options.logInStateChanged=options.logInStateChanged||false;
options.disableView=options.disableView||false;
if((options.callbackFunc!==null)&&(options.callbackFunc!==Model.initCallbackFunc)){Model.initCallbackFunc=options.callbackFunc||function(){}
}Model.options=options
}},Omniture={trackOpenTab:function trackOpenTab(){var my4odCode=Omniture.getCode(Omniture.getOpenType());
var s=s||{};
if(typeof s_gi==="function"){s=s_gi(s_account);
s.linkTrackVars="prop66,eVar66,events,products,prop26,eVar26,prop67,eVar67";
s.linkTrackEvents=s.events="event66";
s.prop66=s.eVar66=my4odCode+" list_open";
s.prop67=s.eVar67="my4oD_ajax";
s.prop26=s.eVar26=s.events;
if(typeof s.tl==="function"){s.tl(this,"o",s.prop66)
}}},trackAddItem:function trackAddItem(type,uniqueKey,isFlash){var s=s||{};
if(typeof s_gi==="function"){s=s_gi(s_account);
s.linkTrackVars="events,products,prop66,eVar66,prop26,eVar26,prop68,eVar68,prop67,eVar67";
s.linkTrackEvents=s.events="event67";
s.products=";4oD "+type.toLowerCase()+";;;;";
s.prop66=s.eVar66=Omniture.getCode(type)+" List_Add";
s.prop67=s.eVar67="my4oD_"+(isFlash==1?"flash":"ajax");
s.prop68=s.eVar68=Omniture.getCode(type)+" List_Add|"+uniqueKey;
s.prop26=s.eVar26=s.events;
if(typeof s.tl==="function"){s.tl(this,"o",s.prop66)
}}},trackRemoveItem:function trackRemoveItem(type,uniqueKey,isFlash){var s=s||{};
if(typeof s_gi==="function"){s=s_gi(s_account);
s.linkTrackVars="events,products,prop66,eVar66,prop26,eVar26,prop68,eVar68,prop67,eVar67";
s.linkTrackEvents=s.events="event68";
s.products=";4oD "+type.toLowerCase()+";;;;";
s.prop66=s.eVar66=Omniture.getCode(type)+" List_Rmv";
s.prop67=s.eVar67="my4oD_"+(isFlash==1?"flash":"ajax");
s.prop68=s.eVar68=Omniture.getCode(type)+" List_Rmv|"+uniqueKey;
s.prop26=s.eVar26=s.events;
if(typeof s.tl==="function"){s.tl(this,"o",s.prop66)
}}},getCode:function getCode(type){switch(type){case Model.HISTORY:return"Hist";
case Model.PLAYLIST:return"Plst";
case Model.FAVS:return"FV";
default:return""
}},getOpenType:function getOpenType(){var $selectedLink=$(".my4od-tabs .selected"),hrefVal=$selectedLink.find("a").attr("href");
switch(hrefVal){case"#history":return Model.HISTORY;
case"#playlist":return Model.PLAYLIST;
case"#favourites":return Model.FAVS;
default:return""
}}},Event={itemClick:function itemClick(e){var isAvailable=$(e.currentTarget).parent().find(".expiredContainer").length===0;
if(!isAvailable){$(e.currentTarget).blur();
return false
}if($("body#catchUp").length===1){if(C4.Controller&&C4.Controller.getEvent().my4odItemClick){C4.Controller.getEvent().my4odItemClick(e)
}}},bind:function bind(){if(Model.options.disableView){return 
}$("#history .promo-link, #playlist .promo-link, #favourites .promo-link").live("click",Event.itemClick)
},onFlashLogin:function onFlashLogin(){C4.Identity.Controller.init(null,function(){C4.My4oD.Controller.init(Model.options)
})
}};
return{init:function init(options){Model.options=options||{};
Helper.setOptionDefaults();
Helper.delegateInit()
},getHelper:function getHelper(){return Helper
},initHandler:Helper.initHandler,onFlashLogin:Event.onFlashLogin,updateNowPlaying:Helper.updateNowPlaying,getEpisodeItemMarkup:View.getEpisodeItemMarkup,trackAddItem:Omniture.trackAddItem,trackRemoveItem:Omniture.trackRemoveItem,trackOpenTab:Omniture.trackOpenTab}
})(jQuery,C4.Util);
