
MyMusic=Class.create();
MyMusic.EVT_PAGE_LOADED='myMusicPageLoaded';
MyMusic.EVT_PAGE_UNLOADED='myMusicPageUnloaded';
MyMusic.EVT_PAGE_RESIZE='myMusicPageResize';
MyMusic.EVT_PAGE_SCROLL='myMusicPageScroll';
MyMusic.pageRegistryByPath={};
MyMusic.pageRegistryByRules={};

MyMusic.addPage=function(path,factory){
var paths=[];
if(mojo.isString(path)){
paths=[path];
}else{
paths=path;
}

paths.leach(function(p){
MyMusic.pageRegistryByPath[p.toLowerCase()]=factory;
});
};

MyMusic.addPageRegex=function(firstPart,regex,factory,config){
firstPart=firstPart.toLowerCase();
var rules=MyMusic.pageRegistryByRules[firstPart];
if(!rules){
rules=[];
MyMusic.pageRegistryByRules[firstPart]=rules;
}

rules.push({
regex:regex,
config:config,
factory:factory
});
};

MyMusic.getPageByPath=function(path,decodedParts){

path=path.toLowerCase();
path=path.replace(/\/+$/,'');
path=path.replace(/::.*$/,'');
if(path==''||path=='/'||path=='home')path='home';



var pageFactory=null;
var parts=path.split('/');




var regexRules=MyMusic.pageRegistryByRules[parts[0]];
if(regexRules&&regexRules.length>0){
for(var i=0;i<regexRules.length;i++){
var rule=regexRules[i];

if(path.match(rule.regex)){


if(!rule.config||!rule.config.hasAPage||!path.lcontains('/more/')){
pageFactory=rule.factory;

break;
}
}
}
}

if(!pageFactory){
for(var j=parts.length;j>0;j--){
var checkPath=parts.slice(0,j).join('/')

pageFactory=MyMusic.pageRegistryByPath[checkPath];
if(pageFactory){

break;
}
}
}

var page=pageFactory?pageFactory(decodedParts):null;
if(page&&page.onlyNoAuth&&lala.user){
if(page.getOnlyNoAuthRedirectPage){

lala.showAck("Sorry, this promotion is only available for new users.");

page=page.getOnlyNoAuthRedirectPage();
}else{
if(page.showOnlyNoAuthAck){


lala.showAck("Sorry, this promotion is only available for new users.");
}



page=new HomePage();
}
}
if(frontend.isLimitedSiteDown&&!lala.user){

return new NonLoggedHomePageSiteDown();
}
return page;
};

MyMusic.prototype={
initialize:function(){
this.history=new HistoryManager();
this.tradeNumbersUpdater=new TradeNumbersUpdater();
this.isArtistAutoComplete=null;
this.activePagePath=null;
this.interruptedReqs=[];
this.hasSongs=false;
this._goToPageTransientState=null;
this.metaKeyTimeout=null;
this.pageFlipCount=0;
},

onLoad:function(){
var self=this;
if(typeof(g_pageData)=='undefined')return;


if(this._rewriteLandingUrl())return;



mojo.cookie.remove("adWordsConversion");


lala.app.onHttpRedirect=this.onHttpRedirectDelegate.lbind(this);
frontend.requiresSignin=this.requiresSignin.lbind(this);
frontend.onPiggyBackData=this._processPiggyBackData.lbind(this);

mojo.http.onBeforeSend=function(params,req){
if(!params.partnerId)params.partnerId='lala';

params.counterIds=lala.Track.getQueuedEventsString(true);

if(!DataModel.g.isAllPendingCountsUpToDate()){
params.includePiggyExtras=true;
}
};

if(lala.user){
lala.testGroup=lala.user.testGroup;
}

MojoNewTabs.onGlobalBeforeTabClick=function(widgetId,tabId){
lala.Track.clientPageInteraction(widgetId+'.'+tabId);
};



lala.showFacebookConnect=lala.showFacebookConnect&&(typeof(FB)!='undefined');


HeaderSearchBox.g=new HeaderSearchBox();
HeaderSearchBox.g.render();

MyMusic.g.hasSongs=g_pageData.songCount>0;

Player.g.init(g_pageData.queueData);


DataModel.g.init(g_pageData);

this.renderSkeleton();


window.onresize=function(){
mojo.listeners.notify(MyMusic.EVT_PAGE_RESIZE,{});
};

window.onscroll=function(){
mojo.listeners.notify(MyMusic.EVT_PAGE_SCROLL,{});
};

mojo.listeners.addGlobal(
HistoryManager.EVT_CHANGE,
this.onHistoryChange.lbind(this));
mojo.listeners.addGlobal(
api.MicroWallet.EVT_BALANCE_CHANGE,
this.updateMicroWallet.lbind(this));
mojo.listeners.addGlobal(
api.MicroWallet.EVT_BUYSONG_CHANGE,
this.showBuySongDrawer.lbind(this));
mojo.listeners.addGlobal(
api.MicroWallet.EVT_BUYSONG_CHANGE,
function(){lala.hideAck()});
mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_RESIZE,
this.onPageResize.lbind(this));
mojo.listeners.addGlobal(
Player.EVT_STATUS_CHANGE,
this.updateDocumentTitlePlayingStatus.lbind(this));

api.MicroWallet.init(g_pageData.wallet,lala.microWalletOffers);
$TC(lt.MyMusic.headerNavControls,'headerNavControls');


mojo.newtabs.onBeforeActivate=function(tab){
lala.params={};
};
mojo.newtabs.onActivate=function(tab){
if(!tab.params.path)return;
MyMusic.g.history.push(new PageTurnEvent(tab.params.path));
};



mojo.newtabs.onAddTab=function(tab,params){
if(params.path){
params.href=lala.URL.MyMusic+params.path;
}
};

MyMusic.g.loginSongCount=g_pageData.songCount;
MyMusic.g.hasUserImage=g_pageData.hasUserImage;


this.initCookieData();

if(!mojo.IE&&!mojo.cookie.contains('lqtp')){
var val=ITSMediaPlayer.probe();
if(val){
if(parseInt(val)>0){
val='installed.'+val;
}
}else{
val='unknown';
}
mojo.cookie.set('lqtp',true,30);
lala.Track.client('quickTimeProbe.'+val);

}

var defPath=this.getWindowPath('/');
this.gotoPage(defPath);

if(lala.user){
this._renderBetaFeedbackLink();




this.processPaymentMethodContext();

if(MyMusic.g.page.pageId=='Home'){
if(api.MicroWallet.credits>0
&&frontend.creditsAboutToExpire()){

Header.g.headerMenus.showMenu('credits');
}
}
}

var ieBackEnabled=true;
if(ieBackEnabled&&mojo.IE67){
mojo.history.onBack=function(state){
MyMusic.g.history.onIEBrowserBackFwd(state);
};

mojo.history.init(lala.URL.BrowserBackTestFrame);
}

$('imagePreloadFrame').src=lala.URL.ImagePreload;
$('googleLoadFrame').src=lala.URL.GoogleAnalytics;

if(!mojo.IE6){
if(DataModel.g.getUserPreference('keyboardShortcutsMap',false)){
this._setupGlobalKeyboardEventListeners(DataModel.g.getUserPreference('keyboardShortcutsMap'));
}else{
this._setupGlobalKeyboardEventListenersLite();
}
}

if(lala.showFacebookConnect){
LalaFBConnect.init(g_pageData.fbConnectConfig);
}


mojo.cookie.remove('_lcuvc');
mojo.cookie.remove('_lcumc');
mojo.cookie.remove('_lcvhpv');
mojo.cookie.remove('_lcvhpvcr');


},

_renderBetaFeedbackLink:function(){
if(lala.isBetaEnabled&&!mojo.IE6&&!$('betaFeedbackButton')){
mojo.dom.parseHTMLFragment($TC(lt.MyMusic.betaFeedbackLink),
document.body);
}else if(lala.isBetaEnabled&&mojo.IE6&&!$('betaFeedbackLink')){
$TC(lt.MyMusic.betaFeedbackLinkHorizontal,'footerFeedbackItem');
}
},

_processPiggyBackData:function(data){
if(lala.user){
if(mojo.isDefined(data.isUseHttpPost)){
lala.user.isUseHttpPost=data.isUseHttpPost;
}
if(mojo.isDefined(data.credits)){
api.MicroWallet.updateWallet({credits:data.credits});
}
if(mojo.isDefined(data.signupCredit)){
lala.user.signupCredit=data.signupCredit;
}
}

if(data.pendingCounts){
DataModel.g.updateAllPendingCounts(data.pendingCounts);
}
},






_rewriteLandingUrl:function(){
if(mojo.LALA_CRAWLER)return false;

var urlHash=mojo.url.getHash();
var urlPath=window.location.pathname;
var urlHost=window.location.host;
var urlProtocol=window.location.protocol;


if(urlPath.match(/^\/.+/)
&&!urlHash
&&!urlPath.lcontains('signup')){


window.location.replace(urlProtocol+"//"+urlHost+"/#"+urlPath.replace(/^\//,""));
return true;


}else if(urlPath.match(/^\/.+/)
&&urlHash
&&!urlPath.lcontains('signup')){
window.location.replace(urlProtocol+"//"+urlHost+"/#"+urlHash);
return true;
}

return false;
},

renderSkeleton:function(){
var t=$T(lt.MyMusic.pageTemplate,'contentRegion');
t.replaceToken('trackingId','globalNav.Footer.navigation');
if(!lala.user){
t.removeTokenBlock('FeedbackLinkBlock');
}
t.replaceToken('userToken',lala.user?lala.user.userToken:'');
t.compose();

if(mojo.IE67){
frontend.setContentAreaMinHeight();
}
},

_setMetaKeyTimeout:function(){
if(MyMusic.g.metaKeyTimeout){
clearTimeout(MyMusic.g.metaKeyTimeout);
}
MyMusic.g.metaKeyTimeout=window.setTimeout(MyMusic.g._resetMetaKeyTimeout,250);
},

_resetMetaKeyTimeout:function(){
MyMusic.g.metaKeyTimeout=null;
},

_setupGlobalKeyboardEventListeners:function(keymapVersion){




document.onkeypress=function(event){
event=mojo.event.create(event);
var keyPressed=event.charCode||event.keyCode;
if(!(event.altKey||event.ctrlKey)
&&event.target.tagName!='INPUT'
&&event.target.tagName!='TEXTAREA'
&&!MyMusic.g.metaKeyTimeout){
switch(keyPressed){
case 43:
case 61:
case 107:
Player.g.increaseVolume(2);
event.stopPropagation();
break;
case 45:
case 95:
case 109:
Player.g.decreaseVolume(2);
event.stopPropagation();
break;
}
}else{
if(event.altKey||event.ctrlKey){
MyMusic.g._setMetaKeyTimeout();
}
}
};







document.onkeydown=function(event){
event=mojo.event.create(event);
if(!(event.altKey||event.ctrlKey)
&&event.target.tagName!='INPUT'
&&event.target.tagName!='TEXTAREA'
&&!MyMusic.g.metaKeyTimeout){
switch(keymapVersion){
case'A':
if(
event.keyCode==32
||event.keyCode==37
||event.keyCode==39
){
event.stopPropagation();
return false;
}else if(
event.keyCode==43
||event.keyCode==61
||event.keyCode==107
||event.keyCode==45
||event.keyCode==95
||event.keyCode==109
||event.keyCode==70
){
event.stopPropagation();
return true;
}
break;
case'B':
if(
event.keyCode==88
||event.keyCode==90
||event.keyCode==67
||event.keyCode==43
||event.keyCode==61
||event.keyCode==107
||event.keyCode==45
||event.keyCode==95
||event.keyCode==109
||event.keyCode==70
){
event.stopPropagation();
return true;
}
break;
default:
DataModel.g.setUserPreference('keyboardShortcutsMap',false);
return true;
}
}else{
if(event.altKey||event.ctrlKey){
MyMusic.g._setMetaKeyTimeout();
}
}
};

document.onkeyup=function(event){
event=mojo.event.create(event);



if(!(event.altKey||event.ctrlKey)
&&event.target.tagName!='INPUT'
&&event.target.tagName!='TEXTAREA'
&&!MyMusic.g.metaKeyTimeout){
switch(keymapVersion){
case'A':
switch(event.keyCode){
case 32:
Player.g.togglePlayback();
event.stopPropagation();
break;
case 37:
Player.g.prevTrack();
event.stopPropagation();
break;
case 39:
Player.g.nextTrack();
event.stopPropagation();
break;
case 70:
if(DataModel.g.getUserPreference('showFullscreenOption',false)){
Player.g.renderFullScreen(true);
}
event.stopPropagation();
break;
}
break;
case'B':
switch(event.keyCode){
case 88:
Player.g.togglePlayback();
event.stopPropagation();
break;
case 90:
Player.g.prevTrack();
event.stopPropagation();
break;
case 67:
if(event.altKey){
return true;
}
Player.g.nextTrack();
event.stopPropagation();
break;
case 70:
if(DataModel.g.getUserPreference('showFullscreenOption',false)){
Player.g.renderFullScreen(true);
}
event.stopPropagation();
break;
}
break;
default:
DataModel.g.setUserPreference('keyboardShortcutsMap',false);
return true;
}
return false;
}else{
if(event.altKey||event.ctrlKey){
MyMusic.g._setMetaKeyTimeout();
}
}
}
},

_setupGlobalKeyboardEventListenersLite:function(){



document.onkeydown=function(event){
event=mojo.event.create(event);
if(!(event.altKey||event.ctrlKey)
&&event.target.tagName!='INPUT'
&&event.target.tagName!='TEXTAREA'){
if(event.keyCode==32){
event.stopPropagation();
return false;
}
}
};

document.onkeyup=function(event){
event=mojo.event.create(event);



if(!(event.altKey||event.ctrlKey)
&&event.target.tagName!='INPUT'
&&event.target.tagName!='TEXTAREA'){
if(event.keyCode==32){
Player.g.togglePlayback();
event.stopPropagation();
return false;
}
}
}
},

getFromContext:function(){
return this.fromContext;
},

initCookieData:function(){
if(g_pageData.invite){
var escToken=unescape(g_pageData.invite.token);
mojo.cookie.set('inviteToken',escToken);




this.invite=g_pageData.invite;
}
},




gotoPageViaClick:function(evt,path,clickTrackingId,fromCode){
if(!fromCode){
if(mojo.event.isShiftKey(evt))return true;
if(mojo.event.isCtrlKey(evt))return true;


evt=new MojoEvent(evt);
var anchor=mojo.dom.getAncestorByTagName(evt.target,'A');
if(anchor){
anchor.blur();
}
}

if(clickTrackingId){
if(!clickTrackingId.match('globalNav')){


lala.Track.clientPageNav(clickTrackingId);
}else{


var name=clickTrackingId.replace(/globalNav\./,'');
lala.Track.clientPageGlobalNav(name);
lala.Track.client(name);
}
}else{

lala.Track.clientPageNav('unknown.'+path.replace(/\/.*$/,''));
}

this.gotoPage(path);
return false;
},




gotoPage:function(path){
try{

this.isFirstTimeVisitor=!lala.user&&(Cookies.getVisitorCookie()==null);
if(!this._isRecorded){
frontend.recordVisitorCounters();
this._isRecorded=true;
}


this._clearOverlays();
this.prevPage=this._unloadPreviousPage();


this.activePagePath=this._normalizePath(path);
lala.params=this.parseParamsFromHash(this.activePagePath);
var decodedParts=this._parsePathParts(this.activePagePath);

var page=MyMusic.getPageByPath(this.activePagePath,decodedParts);
if(page){
this.page=page;


if(this.page.getAuthLevel()>=1&&!lala.user){
this.requiresSignin({showSignIn:true});
return;
}
if(this.page.isTradingOnly()&&!lala.isTradingEnabled){
this.pageNotAccessible('trading');
return;
}












page.setupSkeleton();
page.onLoad(decodedParts,this._goToPageTransientState);
page.setSearchMode();

this._doneLoadingPage();
if(page.onAfterLoad)page.onAfterLoad();



if(lala.showFacebookConnect&&lala.user&&(this.pageFlipCount%10==0)){
LalaFBConnect.hasSession(null,true);
}
this.pageFlipCount++;
}else{
this.pageNotFound(this.activePagePath);
}
}catch(e){
mojo.log.error('gotoPage: '+e);
MyMusic.g.history.stopPolling();
throw e;
}
},


_clearOverlays:function(){

mojo.pulldown.hide();
mojo.autocomplete.hide();
mojo.popup.close();
widgets.core.LightDialog.hide();
MojoDialog.close();
widgets.core.PlayButtonHover.close();
widgets.core.HelpBubble.close();
PlayerQueue.g.close();
Header.g.closeHeaderMenu();
},

_unloadPreviousPage:function(){
this.clearUnloadState();
if(mojo.LALA_CRAWLER)MyMusic.g.resetDocumentMetaInfo();

var prevPage=this.page;
if(prevPage){
prevPage.onUnloadBase();
prevPage.onUnload();
mojo.listeners.notify(MyMusic.EVT_PAGE_UNLOADED);
}

return prevPage;
},

clearUnloadState:function(){
mojo.listeners.removePageListeners();

MojoHttpClient.pageCounter++;
},

_normalizePath:function(path){

path=path.replace(/^[#\/]+/,'');


if(!mojo.DEV_FLAG){
var debugPath=path||'_home_';
lala.debugPagePath=
this.activePagePath?this.activePagePath+'-->'+debugPath:debugPath;
if(lala.user){
lala.debugPagePath+=',c:'+api.MicroWallet.credits
+',w:'+api.MicroWallet.balance;
}
lala.debugPagePath+=',u:'+(lala.user?lala.user.userToken:'anon');

}

return path;
},

parseParamsFromHash:function(path){
if(!path)path=this._normalizePath(mojo.url.getHash());


var params={};
if(path.indexOf('::')>=0){
var paramsStr=path.substring(path.indexOf('::')+2);
if(!paramsStr.lisEmpty()){
var paramsArr=paramsStr.split(':');
for(var pi=0;pi<paramsArr.length;pi++){
var paramSplit=paramsArr[pi].split('=');
params[paramSplit[0]]=unescape(paramSplit[1]);
}
}
}
return params;
},

_parsePathParts:function(path){



var decodedParts=path.split('/');
for(var i=0;i<decodedParts.length;i++){
var dPart=decodedParts[i];

dPart=dPart.replace(/::.*$/,'');
dPart=dPart.replace(/%26/g,'&');
decodedParts[i]=dPart.lunescapeForHash();
}

return decodedParts;
},

_displayLeftNav:function(prevPage){
if(this.page.hideNavCol){
$D('navPaneCol',false);
}else if(prevPage&&prevPage.hideNavCol){

$D('navPaneCol',true,
mojo.FF||mojo.SAFARI?'table-cell':'block');
}
},

_doneLoadingPage:function(){
this._goToPageTransientState=null;

var pageViewTrackingId=this.page.pageId;
if(this.page.getPageViewId){
pageViewTrackingId=this.page.getPageViewId();
}
if(pageViewTrackingId){
lala.Track.pageView(pageViewTrackingId);
}

if(this.page.pageTitleManual){
MyMusic.g.setDocumentTitle(this.page.getPageTitle(),true);
}else if(this.page.pageId!="HomeNoAuth"){
MyMusic.g.setDocumentTitle(this.page.getPageTitle());
}else{
MyMusic.g.setDocumentTitle("Lala - Where music plays",true);
}

MyMusic.g.history.push(new PageTurnEvent(this.activePagePath));
mojo.listeners.notify(MyMusic.EVT_PAGE_LOADED);
},























setGoToPageTransientState:function(context,obj){
this._goToPageTransientState={
context:context,
data:obj
};
},

getGoToPageTransientState:function(){
return this._goToPageTransientState;
},

setDocumentTitle:function(newTitle,dontModify,fromPlayer){
if(!newTitle)return;




try{
if(!dontModify){
newTitle=newTitle+" - Listen free on Lala";
}

if(!fromPlayer){


this.lastCleanTitle=newTitle;
}

if(fromPlayer||!Player.g.isPlaying()){
document.title=newTitle;
if(mojo.FF){
$S('documentTitle',newTitle);
}
}
}catch(e){
lala.Track.client('Player.updateTitleError');
mojo.log.error(e);
}
},





updateDocumentTitlePlayingStatus:function(){



if(!Player.g.isPlaying()){

this.setDocumentTitle(this.lastCleanTitle,true,true);
}else{
var song=Player.g.getPlayingInfo().song;
this.setDocumentTitle('* '+song.title+' by '+song.artist,true,true);
}
},

setDocumentMetaInfo:function(description){
var metas=document.getElementsByTagName('meta');
for(var i=0;i<metas.length;i++){
if(metas[i].name=='description'){
metas[i].content=description;
i=metas.length;
}
}
},

resetDocumentMetaInfo:function(){
MyMusic.g.setDocumentMetaInfo(
"All the music you could ever want, playable in a web "
+"browser. Take your music and fuse it with a "
+"massive licensed catalog to easily play, buy, "
+"and share on the web..."
);
},

pageNotFound:function(path){
frontend.go.Home();
lala.showAck("Sorry, we couldn't find page: "+path,{isTimedHide:true});
},

pageNotAccessible:function(type){
frontend.go.Home();
var msg=
type=='trading'?"Sorry, your account isn't activated for trading"
:"Sorry, you don't have access to that page";
lala.showAck(msg,{isTimedHide:true});
},

onHttpRedirectDelegate:function(url,req){
this.signInRequired(true,req);
},

getWindowPath:function(defaultPath){


var path=mojo.url.getHash();
if(!path){
path=window.location.pathname.replace(/^.*mymusic\/*/,'');
}

if(!path&&defaultPath){
path=defaultPath;
}
return path;
},

forgotPassword:function(){
if(this.forgotPasswordBox==null){
this.forgotPasswordBox=new ForgotPassword();
}
this.forgotPasswordBox.open();
},

resetPassword:function(token){
if(this.resetPasswordBox==null){
this.resetPasswordBox=new ResetPassword();
}
this.resetPasswordBox.open(token);
},

signInRequired:function(showSignIn,req,context,title,
reactivateToken,openDialogContext,isFacebook){
var self=this;
if(this.page&&this.page.isSignupPage){

this.highlightInPageSignupField();
return;
}
if(!showSignIn&&this.page&&this.page.onCustomSignupDialog){
if(this.page.onCustomSignupDialog())return;
}

if(context){
this.setFromSignupCookie(context);
}

var expiredAuth=lala.user!=null;

if(this.signinBox==null){
this.signinBox=new SignInOrUp();
this.signinBox.onSignedInCallback=function(newUserToken){
if(lala.user&&(lala.user.userToken!=newUserToken)){

window.location.reload();
return;
}
if(expiredAuth){
for(var i=0;i<self.interruptedReqs.length;i++){
mojo.http.sendRequest(self.interruptedReqs[i]);
}
self.interruptedReqs=[];
MojoDialog.close();
}else{
window.location.reload();
}
};
this.signinBox.onSignedUpCallback=function(){
if(this.__openContext=='play'){


window.location.reload();
return;
}

if(SignInOrUp.freePlaylistToken||SignInOrUp.freeWebSong){
lala.gotoPage.url(frontend.url.Collection());
return;
}

if(!mojo.SAFARI){
lala.gotoPage.id('MyMusic');
}else{


window.location=lala.URL.HomeRedirect;
}
};
this.signinBox.onForgotPasswordCallback=function(){
if(reactivateToken){
MyMusic.g.resetPassword(reactivateToken);
}else{
MyMusic.g.forgotPassword();
}
};
this.signinBox.onCancel=function(){
};
}
this.signinBox.__openContext=context;

DataModel.g.isUsIpAddress(
function(){
self.signinBox.open(
{showSignIn:showSignIn,
title:title,
expiredAuth:expiredAuth,
openDialogContext:openDialogContext,
isFacebook:isFacebook});
});

if(req){
this.interruptedReqs.push(req);
}

return null;
},

highlightInPageSignupField:function(){
MojoDialog.close();
lala.showAck('Please create your FREE lala account to add this '
+'song to your collection');
var emailField=$('email');
if(emailField){
emailField.style.backgroundColor='lightYellow';
mojo.focus(emailField);
emailField.onchange=function(){
this.style.backgroundColor='white';
};
}
},






getLiquidHeight:function(){
var vbounds=mojo.geometry.getViewportBounds();

var lheight=vbounds.height
-92;
if(mojo.IE7)lheight--;
return lheight;
},

onHistoryChange:function(evt){
mojo.css.removeClass('backward','disabledBackward');
mojo.css.removeClass('forward','disabledForward');

if(!evt.canGoBack){
mojo.css.addClass('backward','disabledBackward');
}
if(!evt.canGoForward){
mojo.css.addClass('forward','disabledForward');
}
},

onWebUploadButton:function(){
if(frontend.requiresSignin())return;
lala.Track.click('webUpload');

var win=window.open(
frontend.url.Mp3Upload(),
'mp3Upload',
'toolbar=no,scrollbars=yes,width=705,height=500,resizable=no');
win.focus();
},

openCreatePlaylistDialog:function(onCreateDoneCallback){
var self=this;
var dialog=new MojoDialog({title:'Create Playlist',
id:'playlistInfoDialog'});
dialog.onOpen=function(){
$('playlistInfoTitle').focus();
mojo.event.onEnterKey('playlistInfoTitle',
self.onCreatePlaylistDialogSubmit.lbind(self));
};

if(onCreateDoneCallback){
dialog.__onCreateDoneCallback=onCreateDoneCallback;
}

dialog.open(
$T(lt.Collection.playlistInfoDialog)
.replaceToken(
'limit',
CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT)
.replaceToken('charsLeft',
CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT)
.removeTokenBlock('EditBlock').compose());
},

onCreatePlaylistDialogSubmit:function(){
var dialog=MojoDialog.all.playlistInfoDialog;

var title=$F('playlistInfoTitle');
var desc=$F('playlistInfoDesc');
if(desc.length>CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT)return;
if(title.lisEmpty())return;

api.Playlists.createPlaylist(title,desc,function(res){
dialog.close();

if(dialog.__onCreateDoneCallback){
dialog.__onCreateDoneCallback(res.data);
}
dialog.__onCreateDoneCallback=null;
});
},


addSongsToPlaylist:function(playlistId,selSongs){


var songsToKeep=selSongs.lgrep(function(s){if(s.isDigied)return true;});
if(songsToKeep.length<=0)return;

var pl=DataModel.g.getPlaylist(playlistId);
var srcPlaylist=CollectionPage.g?CollectionPage.g.playlist:null;

if(!srcPlaylist||!srcPlaylist.isSelectAllAllMode){
api.Playlists.addSongs(
pl,songsToKeep,
function(res){
pl.clearSongs();
});
}else{
api.Playlists.copy(
srcPlaylist,pl,
function(res){
pl.clearSongs();
srcPlaylist.isSelectAllAllMode=false;
},
CollectionPage.g.getQueryParams());
}
},

onFinishedUploading:function(){
var fn=function(){
DataModel.g.getPlaylist('songs').clearSongs();
};



window.setTimeout(fn,1);
},

onUploadDone:function(){
window.setTimeout("frontend.go.RecentlyUploaded();",20);
},








onGoToPaymentMethod:function(successContext,type,isFreeDownload){
var params={};
if(successContext)params.paymentMethodContext=successContext;
var onOk=function(){frontend.goToPaymentMethod(params,type);};

if(Player.g.isPlaying()){
frontend.showMusicInterruptDialog(onOk,isFreeDownload);
}else{
onOk();
}
},





processPaymentMethodContext:function(){
var context=mojo.cookie.get('paymentMethodContext');
if(context){

var contextParts=context.split(':');
var userAction=contextParts[0];
if(userAction=='addWalletFundsDialog'){
var firstTime=contextParts[1]&&contextParts[1]=='firstTime';
widgets.core.BuyWalletDialog.openWalletAck(firstTime);
}
mojo.cookie.remove('paymentMethodContext');
}
},

requiresSignin:function(params){
if(lala.user)return false;
if(!params)params={};
if(!mojo.isDefined(params.showSignIn))params.showSignIn=false;

this.signInRequired(params.showSignIn,null,params.trackingId,
params.title,null,params.openDialogContext);
return true;
},


reloadToRecentlyAdded:function(){
window.location.href=frontend.url.RecentlyAdded();
},

updateMicroWallet:function(){
if(!lala.user)return;

var showCredits=api.MicroWallet.credits>0;
var showWallet=api.MicroWallet.balance>=1||!showCredits;

if(showWallet){
$D('headerWalletBalance');
$S('microWalletAmount','$'+mojo.util.formatPrice(api.MicroWallet.balance));
}else{
$D('headerWalletBalance',false);
}

var creditCount=$('headerCreditCount');
if(showCredits){
$D(creditCount);
$S('creditAmount',api.MicroWallet.credits);
if(api.MicroWallet.credits<=0||frontend.creditsAboutToExpire()){
$AC(creditCount,'runningOut');
}else{
$DC(creditCount,'runningOut');
}
}else{
$D(creditCount,false);
}
},

onMicroWalletClick:function(){
widgets.core.BuyWalletDialog.open();
},

showBuySongDrawer:function(evt){

Cookies.removePurchasePartnerId();

if(evt.isDownload)return;
var numSongs=evt.songs.length;
var html=$T(lt.MyMusic.headerSongAddedDrawer)
.replaceToken('numSongs',numSongs)
.replaceToken('s',numSongs>1?'s':'')
.compose();
var w=mojo.drawer.create({targetId:'rightToolbar',
html:html,
delay:2,
id:'headerSongAddedDrawer',
direction:'bottom'});
w.open();
},

onPageResize:function(evt){
if(mojo.IE67){
frontend.setContentAreaMinHeight();
}
},




getPagePath:function(stripParams){
var path=this.activePagePath;
if(stripParams){
path=path.replace(/:.*$/,'');
}
return path;
},

getPageId:function(){
return this.page?this.page.pageId:null;
},

setFromSignupCookie:function(context){
lala.Track.client('signupDialog.'+context);
},





getHomePage:function(params){
if(lala.user){
return new HomePage();
}else{
return new NonLoggedHomePageB(params);
}
}
};

DataModel=Class.create();
DataModel.EVT_PENDING_DOWNLOAD_COUNT_CHANGE='pendingDownloadCountChange';
DataModel.EVT_PENDING_BLURB_COUNT_CHANGE='pendingBlurbCountChange';
DataModel.EVT_PENDING_GIFT_COUNT_CHANGE='pendingGiftCountChange';
DataModel.EVT_PENDING_PLAYLIST_COUNT_CHANGE='pendingPlaylistCountChange';
DataModel.EVT_PENDING_FOLLOWER_COUNT_CHANGE='pendingFollowerCountChange';
DataModel.EVT_PENDING_RECO_COUNT_CHANGE='pendingRecoCountChange';
DataModel.EVT_PLAYLIST_ADDED='dm_playlistAdded';
DataModel.prototype={
init:function(data){
var self=this;
this._favGenres=['Rock','Pop','Jazz','Hip-Hop'];
this._defaultGenres=[
"Hip-Hop",
"Rock",
"R&B",
"Pop",
"Country",
"Alternative",
"Latin",
"Electronic"
];
this._realFavGenres=[];
this._allGenres=data.allGenres.values.lpluck('name');
this._playlists=[];
this._recentPlaylists=[];
this._lockerPlaylists=[];
this._allPlaylistsById={};
this._ccOnFile='none';
this._ccIsPaypal=false;
this._collectionHistos=null;
this._isUsIpAddress=null;
this._userPreferences={};
this._playlistCounts={};
this._pendingCounts={};
this._lastNotificationsUpdateTimestamp=new Date().getTime();

if(lala.user){
this._favGenres=data.favGenres.length>0
?data.favGenres:this._favGenres;
if(data.favGenres.length>0)this._realFavGenres=data.favGenres;
this._favGenres.ltruncate(4);
this._playlists=data.playlists;
this._playlists.leach(function(pl){
self._initPlaylist(pl);
});
this._recentPlaylists=this._playlists.lclone().sort(function(a,b){
return b.lastModifiedDate-a.lastModifiedDate;
});

this._lockerPlaylists=[
{title:'All songs',
type:'locker',
subtype:'locker',
id:'songs',
sid:data.lockerCollectionId,
nickName:lala.user.nickName
},
{title:'Recent adds',
type:'locker',
subtype:'recentlyAdded',
id:'recentlyAdded',
sid:data.lockerRecentAddsId,
nickName:lala.user.nickName
},
{title:'Recent uploads',
type:'locker',
subtype:'recentlyUploaded',
id:'recentlyUploaded',
sid:data.lockerRecentUploadsId,
nickName:lala.user.nickName
},
{title:'Recent listens',
type:'locker',
subtype:'recentlyListened',
id:'recentlyListened',
sid:data.lockerRecentListensId,
isRecentlyListened:true,
nickName:lala.user.nickName
}];
if(lala.params.showUploadQ=='true'){
this._lockerPlaylists.push(
{title:'Upload queue',
id:'uploadQ',
sid:data.lockerUploadQId,
type:'locker',
subtype:'uploadQ'});
}
this._lockerPlaylists.leach(function(pl){
self._initPlaylist(pl);
});
this._ccOnFile=data.ccOnFile;
this._ccIsPaypal=data.ccType=='PayPal';
this._userPreferences=data.userPreferences;
this._rssFeedToken=data.rssFeedToken;

this.updateAllPendingCounts(data.pendingCounts);

$D('fullScreenButton',!mojo.IE6&&DataModel.g.getUserPreference('showFullscreenOption',false));
}

mojo.listeners.addGlobal(
api.Playlists.EVT_SONG_ADDED,
this.onSongAdded.lbind(this));

mojo.listeners.addGlobal(
api.MicroWallet.EVT_BUY_MP3_SONGS,
this.onSongsPurchased.lbind(this));

mojo.listeners.addGlobal(
api.MicroWallet.EVT_BUY_MP3_ALBUM,
this.onAlbumPurchased.lbind(this));

mojo.listeners.addGlobal(
api.MicroWallet.EVT_BUY_MP3_PLAYLIST,
this.onPlaylistPurchased.lbind(this));

mojo.listeners.addGlobal(
api.Friends.EVT_FRIENDS_CHANGED,
function(){
self._friends=null;
});
mojo.listeners.addGlobal(
api.Playlists.EVT_PLAYLIST_DELETED,
function(evt){
delete self._allPlaylistsById[evt.playlistToken];
});
mojo.listeners.addGlobal(
api.User.EVT_CREDIT_CARD_CLEARED,
function(evt){
lala.user.hasCreditCard=false;
lala.user.isCreditCardRequired=true;
self._ccOnFile=null;
self._ccIsPaypal=false;
});
},

initPreferences:function(prefs){
this._userPreferences=prefs;
},

getRssFeedToken:function(){
return this._rssFeedToken;
},

setUserPreference:function(key,value){
this._userPreferences[key]=value;
if(lala.user){
api.User.setUserPreference(key,value);
}
},

setUserPreferences:function(keys,values){
for(var i=0;i<keys.length;i++){
this._userPreferences[keys[i]]=values[i];
}
if(lala.user){
api.User.setUserPreferences(keys,values);
}
},

removeUserPreference:function(key){
delete this._userPreferences[key];
if(lala.user){
api.User.removeUserPreference(key);
}
},

getUserPreference:function(key,defVal){

var val=this._userPreferences[key];
if(val=='false'){
val=false;
}else if(val=='true'){
val=true;
}
if(val==null&&mojo.isDefined(defVal)){
val=defVal;
}
return val;
},

isUsIpAddress:function(onResponse){
var self=this;
if(this._isUsIpAddress==null){
api.User.isInUS(function(res){
self._isUsIpAddress=res.data;
if(!res.data){
lala.Track.counter('stats.internationalip');
}
if(onResponse){
onResponse(self._isUsIpAddress);
}
});
}else if(onResponse){
onResponse(this._isUsIpAddress);
}else{
return this._isUsIpAddress;
}
},


updateAllPendingCounts:function(countsMap){
for(var alertType in countsMap){

if(alertType.toLowerCase()=='uploadedsong'){
this.setPlaylistCount('recentlyUploaded',countsMap[alertType]);
delete countsMap[alertType];
}
this._pendingCounts[alertType.toLowerCase()]=countsMap[alertType];
mojo.listeners.notify(
DataModel['EVT_PENDING_'+alertType.toUpperCase()+'_COUNT_CHANGE'],
{count:countsMap[alertType]});
}
this.lastNotificationsUpdateTimestamp=new Date().getTime();
},

isAllPendingCountsUpToDate:function(){
if(!lala.user||!this.lastNotificationsUpdateTimestamp){
return true;
}else{


var isUpToDate=
((new Date().getTime()-this.lastNotificationsUpdateTimestamp)<5*60*1000);
if(!isUpToDate){



this.lastNotificationsUpdateTimestamp=new Date().getTime();
}
return isUpToDate;
}
},



getPendingCountTotal:function(menuName){
var total=0;
var menus={
'home':{
'blurb':true,
'gift':true,
'follower':true,
'reco':true,
'download':true
},
'collection':{
'recentlyuploaded':true,
'recentlyadded':true
}
};
if(menuName.toLowerCase()=='collection'){






for(var type in this._pendingCounts){
total+=!menus.home[type]?this._pendingCounts[type]||0:0;
}
}else{
for(var type in menus[menuName.toLowerCase()]){
total+=this._pendingCounts[type]||0;
}
}
return total;
},

getPendingCount:function(alertType){
var count=this._pendingCounts[alertType.toLowerCase()];
if(isNaN(count)||count==null){

count=0;
}
return count;
},

setPendingCount:function(alertType,count){
this._pendingCounts[alertType.toLowerCase()]=count;
mojo.listeners.notify(
DataModel['EVT_PENDING_'+alertType.toUpperCase()+'_COUNT_CHANGE'],
{count:this._pendingCounts[alertType.toLowerCase()]}
);
},






decrementPendingCount:function(alertType,count){
var decrCount=count||1;
this._pendingCounts[alertType.toLowerCase()]=this.getPendingCount(alertType)-decrCount;
mojo.listeners.notify(
DataModel['EVT_PENDING_'+alertType.toUpperCase()+'_COUNT_CHANGE'],
{count:this._pendingCounts[alertType.toLowerCase()]}
);
},






incrementPendingCount:function(alertType,count){
var incrCount=count||1;
this._pendingCounts[alertType.toLowerCase()]=this.getPendingCount(alertType)+incrCount;
mojo.listeners.notify(
DataModel['EVT_PENDING_'+alertType.toUpperCase()+'_COUNT_CHANGE'],
{count:this._pendingCounts[alertType.toLowerCase()]}
);
},


getCreditCardOnFile:function(){
return this._ccOnFile;
},


isCreditCardPaypal:function(){
return this._ccIsPaypal;
},

getCreditCardText:function(){
return this._ccIsPaypal?'PayPal account':'credit card';
},

getFavoriteGenres:function(dontUseDefaults){


if(dontUseDefaults){
return this._realFavGenres;
}else{
return this._favGenres;
}
},

getDefaultGenres:function(){
var defGenres=this._defaultGenres.lclone();
var favGenres=this.getFavoriteGenres(true);
var genres=null;
if(favGenres.lisEmpty()){
genres=defGenres.sort();
}else{
genres=favGenres.lclone();
var numToGet=defGenres.length-favGenres.length;
var g=null;
var count=0;
for(var i=0;i<defGenres.length;i++){
g=defGenres[i];
if(!favGenres.lcontains(g)){
genres.push(g);
count++;
if(count==numToGet)break;
}
}
}
return genres;
},

getAllGenres:function(){
return this._allGenres;
},

getFriends:function(callback){
if(this._friends){
callback(this._friends,true);
}else{
var self=this;
api.Friends.getFollowing(
lala.user.userToken,
function(res){
self._friends=res.data.list;
callback(res.data.list,true);
},
1000,'Alpha',true
);
}
},

getFacebookFriends:function(callback){
if(this._facebookFriends){
callback(this._facebookFriends,true);
}else{
var self=this;
LalaFBConnect.getFriendsForShare(function(result){

var friends=[];
result.leach(function(one){
var obj={};
obj.nickName=one.name;
obj.displayName=one.name;
obj.nameLowerCase=obj.nickName.toLowerCase();
obj.facebookImgUrl=one.pic_square_with_logo
||'http://static.ak.connect.facebook.com/pics/q_silhouette_logo.gif';
obj.userToken=one.uid;
obj.isFacebook=true;
friends.push(obj);
});
friends.sort(function(a,b){
var x=a.nameLowerCase;
var y=b.nameLowerCase;
return((x<y)?-1:((x>y)?1:0));
});
self._facebookFriends=friends;
callback(self._facebookFriends,true);
});
}
},

onSongsPurchased:function(evt){
var songs=evt.songs;
this.incrementPendingCount('Download',songs.length);
},

onAlbumPurchased:function(evt){
var album=evt.album;

this.incrementPendingCount('Download',album.albumDownloadableTrackCount);
},

onPlaylistPurchased:function(evt){
var numTracks=evt.numTracks;

this.incrementPendingCount('Download',numTracks);
},

onSongAdded:function(evt){
var plToken=evt.playlistToken;
if(plToken=='playerQueue'){
return;
}


if(evt.src=='PlaylistBuilder'
||evt.fromContext=='suggestions')return;

var count=this._playlistCounts[plToken]||0;
count+=evt.count;

this._playlistCounts[plToken]=count;
this._pendingCounts[plToken.toLowerCase()]=count;

mojo.listeners.notify(
DataModel.EVT_PENDING_PLAYLIST_COUNT_CHANGE,
{id:plToken,count:count});
},

setPlaylistCount:function(playlistId,count){
this._playlistCounts[playlistId]=count;
this._pendingCounts[playlistId.toLowerCase()]=count;

mojo.listeners.notify(DataModel.EVT_PENDING_PLAYLIST_COUNT_CHANGE,{id:playlistId,count:count});
},

getPlaylistCounts:function(){
return this._playlistCounts||{};
},

getPlaylists:function(){
return this._playlists;
},

getRecentPlaylists:function(){
return this._recentPlaylists;
},

getPlaylist:function(token){
return this._allPlaylistsById[token];
},

getSongsPlaylist:function(){
return this.getPlaylist('songs');
},

containsPlaylist:function(token){
return this.getPlaylist(token)!=null;
},

getLockerPlaylists:function(){
return this._lockerPlaylists;
},

addPlaylist:function(playlist,numTracks){
this._playlists.linsertAt(playlist,0);
this._playlists.sort(function(a,b){
if(a.title.toLowerCase()>b.title.toLowerCase()){
return 1;
}else if(a.title.toLowerCase()<b.title.toLowerCase()){
return-1;
}else{
return 0;
}
});
this._recentPlaylists.linsertAt(playlist,0);
this._initPlaylist(playlist);
mojo.listeners.notify(
DataModel.EVT_PLAYLIST_ADDED,{playlist:playlist});

if(numTracks){
mojo.listeners.notify(
api.Playlists.EVT_SONG_ADDED,
{count:numTracks,playlistToken:playlist.id});
}
},


onPlaylistsUpdated:function(){
this._playlists.sort(function(a,b){
if(a.title.toLowerCase()>b.title.toLowerCase()){
return 1;
}else if(a.title.toLowerCase()<b.title.toLowerCase()){
return-1;
}else{
return 0;
}
});

this._recentPlaylists=this._recentPlaylists.sort(function(a,b){
return b.lastModifiedDate-a.lastModifiedDate;
});
},

removePlaylist:function(playlistId){
this._playlists.lremoveIf('id',playlistId);
this._recentPlaylists.lremoveIf('id',playlistId);
},

_initPlaylist:function(pl){
this._allPlaylistsById[pl.id]=pl;



if(!pl.type){
pl.type=lala.user.userToken==pl.userToken?'my':type;
}

pl.sourceTitle='Playlist: '+pl.title;
if(pl.type=='my'){
pl.sourcePath='playlist/'+pl.id;
}else{
pl.sourcePath=pl.id;
}

pl.isInfoEditable=pl.type=='my';
pl.isPublicViewable=pl.type=='my';
pl.isEmbedable=true;
pl.isSongsEditable=pl.type=='my'||pl.subtype=='locker';
pl.isDeleteable=pl.type=='my';
pl.isCacheable=pl.subtype=='locker';
pl.isSongsAddable=pl.type=='my';
pl.isSongsMoveable=pl.type=='my'||pl.subtype=='uploadQ';
pl.isSongsGiftable=pl.type=='my'||pl.type=='locker';
pl.isSongsDownloadable=pl.type=='my'||pl.subtype=='locker'
||pl.subtype=='recentlyAdded'||pl.subtype=='recentlyListened';
pl.isDownloadable=pl.type=='my';
pl.isPlayable=true;
pl.shouldUpdateTimestamp=pl.subtype=='recentlyUploaded';
pl.artistMatcher=null;


if(pl.type=='my'){
pl.pageId='CollectionPlaylist';
}else if(pl.subtype=='locker'){
pl.pageId='Collection';
}else if(pl.subtype=='recentlyAdded'){
pl.pageId='CollectionAdded';
}else if(pl.subtype=='recentlyUploaded'){
pl.pageId='CollectionUploaded';
}else if(pl.subtype=='recentlyListened'){
pl.pageId='CollectionListens';
}else if(pl.subtype=='uploadQ'){
pl.pageId='CollectionUploadQ';
}

pl.defaultViewMode='list';
if(pl.subtype=='locker'){
pl.defaultViewMode='histo';
}

pl.clearSongs=function(keepHistoSelected,keepHistos,keepSort,keepKeywords){
this.songs=null;
if(!keepSort){
this.sortState={};
this.so='AddedTimestamp';
this.sortState[this.so]=false;
if(this.subtype=='locker'){
this.so='Artist';
this.sortState[this.so]=true;
}else if(this.subtype=='recentlyListened'){
this.so='LastListenTimestamp';
this.sortState[this.so]=false;
}
if(this.type=='my'){
this.so='Offset';
this.sortState[this.so]=true;
}
}
this.songPageSize=50;
this.songSkipCount=0;
if(!keepKeywords){
this.keywords=null;
}

if(!keepHistos)this.histos=null;
if(!keepHistoSelected)this.histosSelected=null;
};





pl.clone=function(){
return{
id:this.id,
isRecentlyListened:this.isRecentlyListened,
title:this.title,
description:this.description,
userNickName:this.nickName,
songs:null
};
};

pl.loadArtistMatcher=function(cb,histo){
if(!histo){
var self=this;
api.Playlists.getArtistHisto(
this,
function(res){
if(!self.artistMatcher){
self.artistMatcher=
new widgets.core.ClientAutoCompleteMatcher();
}
self.artistMatcher.setData(res.data);
if(cb)cb();
});
}
};
pl.preloadArtistMatcher=function(histo){
var self=this;
if(!self.artistMatcher){
self.artistMatcher=new widgets.core.ClientAutoCompleteMatcher();
}
self.artistMatcher.setData(histo);
};

pl.clearSongs();
pl.page=new CollectionPage(pl);
},




updateCollectionHistos:function(histos){
this._collectionHistos=histos;
},


getCollectionHistos:function(callback){
if(this._collectionHistos){
callback(this._collectionHistos);
}else{
var self=this;
api.Playlists.getSongsHisto(
DataModel.g.getSongsPlaylist(),
function(res){
self._collectionHistos=res.data;
callback(self._collectionHistos)
});
}
}
};
DataModel.g=new DataModel();





var Page=Class.create();
Page.prototype={
initPage:function(params){
this.pageTitle=params.pageTitle||'';
this.pageTitleManual=params.pageTitleManual;
this.authLevel=
mojo.isDefined(params.authLevel)?params.authLevel:0;
this.tradingOnly=
mojo.isDefined(params.tradingOnly)?params.tradingOnly:false;
this.theme='blueTheme';
this.pageId=params.pageId;
this.hideNavCol=params.hideNavCol;
this.isSignupPage=mojo.isDefined(params.isSignupPage);
this.onlyNoAuth=params.onlyNoAuth;
this.showOnlyNoAuthAck=params.showOnlyNoAuthAck;
this.skelClass=params.skelClass;
this.contentId='scrollableViewDiv';
this.isLiquid=false;
return this;
},


setupSkeleton:function(){
this.adjustSkeletonForLiquidChange();
},









renderIntoContentRegion:function(t){
$(this.contentId).innerHTML=t.compose();
$('scrollableViewDiv').className=this.skelClass;
$D('footer',true);
if(lala.isBetaEnabled&&!mojo.IE6){

if(!$('betaFeedbackButton'))MyMusic.g._renderBetaFeedbackLink();
$D('betaFeedbackButton');
}
window.setTimeout(function(){
frontend.scrollToPageTop();
},1);
},

onLoad:function(){
mojo.log.error('Page.onLoad: abstract');
},



onUnloadBase:function(){
},

onUnload:function(){
},

isAuthRequired:function(){
return this.authLevel==0;
},

isTradingOnly:function(){
return this.tradingOnly;
},

getAuthLevel:function(){
return this.authLevel;
},

getPageTitle:function(){
return this.pageTitle;
},

setDocumentTitle:function(title){
this.pageTitle=title;
MyMusic.g.setDocumentTitle(title);
},

getPageId:function(){
return this.pageId;
},

getTheme:function(){
return this.theme;
},

setSearchMode:function(){
HeaderSearchBox.g.setMode('lala');
},

adjustSkeletonForLiquidChange:function(){


if(this.isLiquid){
if(!$('centeredPageContainer').className.lcontains('liquid')){
$AC('centeredPageContainer','liquid');
$AC('headerRegion','liquid');
}
}else{
$DC('centeredPageContainer','liquid');
$DC('headerRegion','liquid');
}

Player.g.updatePlayerPosition();
}
};

HistoryManager=Class.create();
HistoryManager.EVT_CHANGE='historyChange';
HistoryManager.prototype={
initialize:function(){
this.stack=[];
this.cursor=-1;
this.isPending=false;
this.isFirstPush=true;
this.currHash=window.location.hash;
this.pollingTimer=null;

this.startPolling();
},

stopPolling:function(){
if(this.pollingTimer!=null){
window.clearInterval(this.pollingTimer);
}
this.pollingTimer=null;
},

startPolling:function(){
if(mojo.IE67)return;

var self=this;
this.stopPolling();
this.pollingTimer=
window.setInterval(
function(){
var jsHash=self.currHash.replace(/^[#\/]+/,'');


jsHash=jsHash.lequalizeFromHash();

var browserHash=mojo.url.getHash(true);


if(jsHash!=browserHash){





self.onBrowserBackFwd(true);
}
},
1000);
},

canGoBack:function(){
return!(this.cursor<=0);
},

canGoForward:function(){
return!(this.cursor>=(this.stack.length-1));
},

onIEBrowserBackFwd:function(state){
mojo.url.setHash(state);
this.onBrowserBackFwd();
},




onBrowserBackFwd:function(fromPoller){

this.stopPolling();

var hash=mojo.url.getHash();





if(this.canGoForward()
&&this.stack[this.cursor+1].getHash().lequalizeFromHash()==hash){
this.onGoForward(true);
this.startPolling();
}else{
var goBack=true;
if(fromPoller){
if(!(this.canGoBack()&&(this.stack[this.cursor-1].getHash().lequalizeFromHash()==hash))){

MyMusic.g.gotoPage(hash);
goBack=false;
}
}
if(goBack){
this.onGoBack(true);
this.startPolling();
}
}
},

onGoBack:function(isBrowser){
if(!this.canGoBack())return;
this.cursor--;
this.go(isBrowser);

var counter='Header.navigation.back.'+(isBrowser?'browser':'lala');
lala.Track.clientPageGlobalNav(counter);
lala.Track.client(counter);
},


onGoForward:function(isBrowser){
if(!this.canGoForward())return;
this.cursor++;
this.go(isBrowser);

var counter='Header.navigation.fwd.'+(isBrowser?'browser':'lala');
lala.Track.clientPageGlobalNav(counter);
lala.Track.client(counter);
},

go:function(isBrowser){
var evt=this.stack[this.cursor];
this.isPending=true;


evt.run();
this.isPending=false;

if(!isBrowser){
this.stopPolling();
}
this.currHash=evt.getHash();

if(!isBrowser){
mojo.url.setHash(this.currHash);
this.startPolling();
}
this.notify();
},

push:function(hEvent){


if(this.isPending)return;
if(this.stack.length>0
&&(hEvent.getHash()==this.stack[this.cursor].getHash()))return;

this.stack.length=++this.cursor;
this.stack.push(hEvent);

this.notify();

if(!this.isFirstPush){
var hash=hEvent.getHash();

this.currHash=hash;
mojo.url.setHash(hash);
if(mojo.IE){
mojo.history.push(hash);

}
}
this.isFirstPush=false;

},



pushInPageEvent:function(state,path){
var currState=MyMusic.g.parseParamsFromHash();
Object.extend(currState,state);

this.push(new PageTurnEvent(path||null,currState));
},

notify:function(){
mojo.listeners.notify(HistoryManager.EVT_CHANGE,
{canGoBack:this.canGoBack(),
canGoForward:this.canGoForward()});
}
};


HistoryManager.Event=Class.create();
HistoryManager.Event.prototype={
run:function(){
mojo.log.error("abstract method run() needs to be implemented");
},

toString:function(){
mojo.log.error("abstract method toString() needs to be implemented");
}
};

PageTurnEvent=Class.create();
PageTurnEvent.prototype={
initialize:function(path,params){
if(!path)path=MyMusic.g.getPagePath(true);
if(params){
path+=frontend.escapeInPageParams(params);
}
this.path=path;
},

getHash:function(){
return this.path.replace(/^[\/\#]/,'');
},

run:function(){
MyMusic.g.gotoPage(this.path);
},

toString:function(){
return'page turn: '+this.path;
}
};

HeaderSearchBox=Class.create();
HeaderSearchBox.prototype={
initialize:function(){
var self=this;

this._autoComplete=null;
this._pulldown=null;
this._allModes={};
this._currMode=null;


this._allModes.lala=new LalaHeaderSearchBoxMode();
if(lala.user){

this._allModes.collection=
new HeaderSearchBoxMode({
id:'collection',
clearIconEnabled:true,
autoCompleteEnabled:true,
onFillDelegate:function(sterm){
CollectionPage.SearchBox.g.onAutoComplete(sterm,'collection');
},
displayName:'Search Collection',
onSearch:function(text){
var ratingFrom=-1;
var ratingTo=-1;
if(MyMusic.g.page&&MyMusic.g.page.pageId=='Collection'){
ratingFrom=MyMusic.g.page.ratingFrom;
ratingTo=MyMusic.g.page.ratingTo;
}
HeaderSearchBox.g.gotoSearchCollection(text,null,ratingFrom,ratingTo);
}});
}

this._allModes.member=
new HeaderSearchBoxMode({
id:'member',
displayName:'Search Members',
onSearch:function(text){
frontend.go.MemberSearch(text);
}});

HeaderSearchBox.g=this;
},











setMode:function(modeId,defaultText){
this._changeMode(modeId);

if(defaultText){
var inputField=$('searchBoxQuery');

inputField.value=defaultText;
inputField.onclick=null;
inputField.style.color='black';



this._showSearchClear(this._currMode.clearIconEnabled);
}else{
this._displayModeContext();
this._showSearchClear(false);
}


if(modeId!='custom'){
delete this._allModes.custom;
}
},

setInputText:function(text){
$F('searchBoxQuery',text);
},





setCustomMode:function(mode,defaultText){
this._allModes.custom=mode;
this.setMode('custom',defaultText);
},






onPulldownChangeMode:function(id){

if(this._currMode.id==id)return;

var oldMode=this._currMode;
var currText=$F('searchBoxQuery');


this._changeMode(id);



if(!currText.lisEmpty()
&&currText!=oldMode.displayName){
this._doSearch(currText);
}else{
this._displayModeContext();
}
},

gotoSearchCollection:function(q,playlistPath,ratingFrom,ratingTo){
if(!playlistPath)playlistPath='songs';
if(q.lisEmpty())q='_';
frontend.go.CollectionPageSearch(playlistPath,q,ratingFrom,ratingTo);
},

_changeMode:function(modeId){
this._currMode=this._allModes[modeId];
if(this._currMode==null){
mojo.log.error('invalid change mode: '+modeId);
}


this._autoComplete.disable(!this._currMode.autoCompleteEnabled);
this._autoComplete.customizeQ(this._currMode.appendQ);
this._autoComplete.onFillDelegate=this._currMode.onFillDelegate;
},

_displayModeContext:function(){
var queryBox=$('searchBoxQuery');
queryBox.value=this._currMode.displayName;
queryBox.style.color='#999999';
mojo.input.clearOnClick(queryBox);
},

render:function(){
var self=this;


$TC(lt.HeaderSearchBox.main,'headerSearchBox');
this._autoComplete=
new widgets.SearchAutoComplete({
inputId:'searchBoxQuery',
global:true,
offsets:{ie:2,ff:2},
onRunSearch:function(text,suggestion){
self._doSearch(text,suggestion);
}});

this._pulldown=this._createPulldown();



this.setMode('lala');
},

getAutoComplete:function(){
return this._autoComplete;
},

_doSearch:function(text,suggestion){
lala.Track.clientPageGlobalNav('SearchBox.search');

this._currMode.onRunSearch(text,suggestion);
if(this._currMode.clearIconEnabled&&!text.lisEmpty()){
this._showSearchClear(true);
}
},

_createPulldown:function(){
var self=this;
var pulldown=mojo.pulldown.create(
{id:'searchPulldown',
target:'searchIcon',
animate:false,
openBelowTarget:'searchIcon',
isTargetInHeader:true});
pulldown.offsets={top:3};
pulldown.onBeforeOpen=function(div){
self._autoComplete.hide();
var t=$T(lt.HeaderSearchBox.pulldownItem);


var items=mojo.util.values(self._allModes);
var customItem=items.lremoveIf('id','custom');
if(customItem){
items.linsertAt(customItem,0);
}


items.leach(function(item){
if(item.id==self._currMode.id){
t.replaceToken('selected','selected');
}
t.replaceToken('item',item.displayName);
t.replaceToken('id',item.id);
if(item.id!='custom'){
t.removeTokenBlock('DividerBlock');
}
t.next();
});
div.innerHTML=t.compose();
}

return pulldown;
},

_showSearchClear:function(show){
var self=this;
var searchIcon=$('searchClearIcon');

searchIcon.className=
show?'search_clear_icon png':'search_clear_icon_off png';
searchIcon.onclick=
show?function(){self.onClearSearch()}:null;
},

onClearSearch:function(){
this._doSearch('');
this._showSearchClear(false);
this._displayModeContext();
}
};

HeaderSearchBoxMode=Class.create();
HeaderSearchBoxMode.prototype={

initialize:function(p){
this.initHeaderSearchBoxMode(p);
this.onSearch=p.onSearch;
},

initHeaderSearchBoxMode:function(p){
this.id=p.id||'custom';
this.displayName=p.displayName;
this.appendQ=p.appendQ;

this.autoCompleteEnabled=
mojo.isDefined(p.autoCompleteEnabled)?p.autoCompleteEnabled:false;
this.clearIconEnabled=
mojo.isDefined(p.clearIconEnabled)?p.clearIconEnabled:false;

this.onFillDelegate=p.onFillDelegate;
},

onRunSearch:function(text,suggestion){
if(text.lisEmpty()){
var clearIcon=$('searchClearIcon');
if(clearIcon&&clearIcon.onclick){
this.onSearch(text);
return;
}
return;
}

this.onSearch(text,suggestion);
},

onSearch:function(text,suggestion){
mojo.log.error('HeaderSearchBoxMode.onSearch - abstract method');
}
};

LalaHeaderSearchBoxMode=Class.create();
LalaHeaderSearchBoxMode.prototype={
initialize:function(){
this.initHeaderSearchBoxMode({
id:'lala',
displayName:'Search Lala',
autoCompleteEnabled:true})
},

onSearch:function(text,suggestion){

if(suggestion){
this._gotoArtist(text);
return;
}

var skipArtistCheck=false;
if(text.lstartsWith('#')){
skipArtistCheck=true;
}


if(!skipArtistCheck){
this._runArtistCheck(text);
return;
}

this._gotoSearch(text);
},

_runArtistCheck:function(text){
var self=this;

api.AutoComplete.artistCheck(
text,
function(isArtist,noop,runValue){
if(isArtist){
self._gotoArtist(runValue,text);
}else{
self._gotoSearch(text);
}
});
},

_gotoArtist:function(text,origSearchText){
$('searchBoxQuery').blur();
ArtistPage.wrongArtistName=origSearchText||text;
frontend.go.Artist(text);
},

_gotoSearch:function(text){
frontend.go.Search(text);
}
};
Object.extend(LalaHeaderSearchBoxMode.prototype,HeaderSearchBoxMode.prototype,true);

var TradeNumbersUpdater=Class.create();
TradeNumbersUpdater.prototype={
init:function(){
if(!lala.isTradingEnabled)return;

this.MIN_DELAY=(1000*60)*5;
this.lastUpdateTimestamp=new Date().getTime()+this.MIN_DELAY;

mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_LOADED,
this.updateTradeModel.lbind(this));
mojo.listeners.addGlobal(
Player.EVT_SONG_PLAYING,
this.updateTradeModel.lbind(this));
},

updateTradeModel:function(){
if(new Date().getTime()-this.lastUpdateTimestamp<this.MIN_DELAY)return;

var self=this;
var fn=function(res){

self.lastUpdateTimestamp=new Date().getTime();


lala.user.haveListCount=res.data.haveListCount;
lala.user.requestedCount=res.data.requestedCount;
lala.user.wantListCount=res.data.wantListCount;
lala.user.willReceiveCount=res.data.willReceiveCount;
lala.user.tradedCount=res.data.tradedCount;
lala.user.canShipCount=res.data.canShipCount;


mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
}
api.User.getTradeNumbers(fn);
}
};


MyMusic.g=new MyMusic();
lala.registerPage(MyMusic.g);

strings.MyMusic={
deleteSongs:"Are you sure you want to remove the @count@"
+"selected song@s@ from the playlist \"@playListName@?\"",
deleteSongsFromLocker:"Are you sure you want to *permanently* delete the @count@selected "
+"song@s@ from your collection?\nThere is no way to undo this!",
deleteSongsFromRecentListens:"Are you sure you want to remove the @count@selected "
+"song@s@ from your recent listens?",
deletePlaylist:"Are you sure you want to delete the playlist '@title@'?",
ipod:{
deleteSongs:"Are you sure you want to permanently delete the selected "
+"songs from your ipod?",
notLoggedIn:"You first need to log into your account before using your "
+"iPod with Lala",
accessDenied_max_count:"You've reached the limit for number of iPods "
+"associated with one account. Visit the help pages for "
+"more information",
accessDenied_already_attached:"Your iPod is already attached to "
+"another account. Visit the help pages or contact support for "
+"more information",
syncNotConnected:'Connect your iPod to your computer and try again.',
syncNoSelection:'Select the songs from your library you want to sync '
+'to your iPod and try again. You can also drag and drop '
+'songs from your library onto the iPod icon.',
syncFull:'Your iPod is full. You will need to delete some songs from '
+'the iPod before syncing.',
syncBusy:'Your iPod is busy.  Try again later.'
},
welcomeText:{
listen:{
listen:'You can now listen to your digital album at any time, '
+'from any computer. Go to your Library of Songs in the '
+'left navigation to begin listening!',
upload:'Gain access to your own music from any computer by '
+'uploading your tracks to lala.com. Click '
+'the \'upload songs\' button above to get your '
+'music on the net.',
create:'Use your own music and our catalog of thousands of titles '
+'to create playlists to enjoy for yourself or share '
+'with friends. Just click the \'create playlist\' button '
+'at the top of the page to get started.'
},
sync:{
sync:'Sync your purchased tracks directly to your iPod from '
+'your lala.com account. Connect your iPod to your '
+'computer and select the songs you\'d like to add to '
+'your iPod. Then click the Sync iPod button above.'
},
buy:{
cdpd:'For a select number of titles, we offer the "CD plus '
+'Digital" format so that you no longer need to make '
+'a tradeoff between digital and physical. You can '
+'get the CD for your collection, AND the instant '
+'gratification of having the tunes available on '
+'your PC or iPod immediately!',
newCds:'With lala.com, you get great prices on our vast catalog '
+'of albums, which includes artists from countless '
+'genres and eras. Buying music supports your favorite '
+'artists, and enables them to continue recording the '
+'music that you love.'
}
},
shareConfirm:'You\'re about to enable a group playlist that allows your '
+'Lala friends to add song recommendations to your playlist.'
};




Player=Class.create();
Player.EVT_STATUS_CHANGE='flashplayer_status_change';
Player.EVT_SONG_PLAYING='flashplayer_song_playing';
Player.ADD_SONG_TOOLTIP="Add this web song to your online collection";
Player.PREV_BUTTON_TOOLTIP="Previous";
Player.NEXT_BUTTON_TOOLTIP="Next";
Player.PAUSE_BUTTON_TOOLTIP="Pause";
Player.PLAY_BUTTON_TOOLTIP="Play";
Player.MUTE_BUTTON_TOOLTIP="Mute";
Player.UNMUTE_BUTTON_TOOLTIP="Unmute";
Player.SHUFFLE_ON_TOOLTIP="Turn shuffle on";
Player.SHUFFLE_OFF_TOOLTIP="Turn shuffle off";
Player.QUEUE_DIALOG_TOOLTIP="View your queued music";
Player.BUY_SONG_TOOLTIP="Purchase this DRM-Free MP3";
Player.SHARE_BUTTON_TOOLTIP="Share this song";
Player.SHOUT_BUTTON_TOOLTIP="Post this song on Twitter, Facebook, or Lala"
Player.PLAYLIST_BUTTON_TOOLTIP="Add this song to a playlist";
Player.ALBUM_COVER_TOOLTIP="Go to album page";
Player.ADDED_SONG_TOOLTIP="This song is in your collection";
Player.BOUGHT_SONG_TOOLTIP="You already purchased this MP3";
Player.FIVE_DAY_MILLISECONDS=5*24*60*60*1000;
Player.HOURS_TO_MILLIS_FACTOR=60*60*1000;

Player.prototype={
init:function(queueData){
if(window.location.protocol=='https:')return;

this.flashversion=-1;
this.playStatus='stopped';
this.playerLoaded=false;
this.flashBlockStatus=null;
this.onVideosFoundResponse=null;
this.shuffleMode=false;
this.lastVolume=1;
this.historyCount=0;
this.autoPlay=false;
this.playingData=null;
this.errorCount=0;
this.errorTimeout=null;
this.currentQueueTrack=null;
this.playbackCompleted=true;
this.initQueueData=queueData;
this.saveVolumeInterval=null;
this.loadInterval=null;




this.activeCount=queueData?queueData.activeCount:0;
this.render();

if(queueData){
api.Queue.preprocessSourceParams(queueData.result);



this.loadQueueData({data:queueData},this.activeCount==0);
}

this.renderSWF();

mojo.listeners.addGlobal(
api.LalaForecast.EVT_FORECAST_UPDATED,
this.onForecastUpdated.lbind(this));

mojo.listeners.addGlobal(
api.Queue.EVT_QUEUE_UPDATED,
this.onQueueUpdated.lbind(this));

this.addSongWidgetListener_Init(true,true);
this.isFlashInstalled();
},

clearLoadInterval:function(){
if(this.loadInterval){
clearInterval(this.loadInterval);
}

this.loadInterval=null;
this.loadIntervalCount=0;
},

waitForPlayer:function(){
try{
this.loadIntervalCount++;
this.flashPlayer=frontend.FlashEmbed.getSWF('lalaLitePlayer');
}catch(e){
}finally{
if(this.flashPlayer||this.loadIntervalCount>10){
this.clearLoadInterval();
}
}
},

reloadPlayer:function(){
this.renderSWF();
},

reset:function(){

this.autoPlay=false;
},

render:function(){
$T(lt.Player.playerUI,'headerPlayerUI')
.replaceToken('queueCount',this.activeCount)
.replaceToken('queueDisplay',!lala.user?'lnone':'')
.replaceToken('shuffleEnabled',this.shuffleMode?'enabled':'')
.compose();

this.ratingStrip=new RatingWidget({
type:RatingWidget.TYPE_USER,
size:RatingWidget.SIZE_LARGE,
rateApi:RatingWidget.RATE_API_QUEUE,
globalTrackingId:'Player',
isGlobal:true
});
},

renderSWF:function(){
this.clearLoadInterval();

var flashConfig={
widgetId:'LalaLitePlayer',
id:'lalaLitePlayer',
swf:lala.staticBaseURL+'flash/LalaPlayer.swf',
width:'308',
height:'18',
scale:'noscale',
salign:'TL'
};

flashConfig.wmode='transparent';
frontend.FlashEmbed.compose(flashConfig,'litePlayerEmbed');

this.loadInterval=setInterval(this.waitForPlayer.lbind(this),100);
},

isFlashInstalled:function(){
if(this.flashversion<0){
this.flashversion=mojo.flash.getVersion()[0];
}
if(this.flashversion>=9){
return true;
}else{
window.setTimeout(Player.g.showFlash10RequiredDrawer,500);
}
},


isFlashBlocked:function(){
if(this.isFlashInstalled()){
if(!this.isPlayerReady()
||(!$('lalaLitePlayer')&&mojo.FF)){
this.flashBlockStatus=true;
Player.g.showFlashBlockedDrawer();
}else{
this.flashBlockStatus=false;
}
}else{
this.flashBlockStatus=true;
}
return this.flashBlockStatus;
},



showSignupIfRequiredForPlay:function(){

if(lala.cookiesDisabled)return true;
if(lala.user)return false;




if(this.is5DayRule()
||(MyMusic.g.pageFlipCount>1
&&MyMusic.g.page.pageId!='HomeNoAuth')){
frontend.requiresSignin({
trackingId:'play',
title:'Sign up with Lala to keep listening. Sign up is free.'
});
return true;
}else{

return false;
}
},

is5DayRule:function(){
if(lala.user)return false;


var timeNow=(new Date()).getTime();
var fdCookie=mojo.cookie.get("_lfdt",null);
var fdTimestamp=0;
if(fdCookie!=null){
fdTimestamp=fdCookie*Player.HOURS_TO_MILLIS_FACTOR;
if(fdTimestamp>0
&&fdTimestamp+Player.FIVE_DAY_MILLISECONDS<timeNow){
return true;
}
}

if(fdTimestamp==0){

mojo.cookie.set(
'_lfdt',
Math.floor(timeNow/Player.HOURS_TO_MILLIS_FACTOR),
5000,
'.lala.com');
}
return false;
},

isPlaying:function(){
return this.playStatus=='playing';
},

updatePlayerPosition:function(){

var PLAYER_DEFAULT_LEFT=78;
var playerUI=$('headerPlayerUI');
if(playerUI){
if(MyMusic.g.page.isLiquid){
var bounds=mojo.geometry.getBounds('headerRegion');

playerUI.style.left=PLAYER_DEFAULT_LEFT+Math.max(0,(bounds.width-970)/2)+"px";
}else{
playerUI.style.left=PLAYER_DEFAULT_LEFT+"px";
}
}
},


loadQueueData:function(res,bCompleted){
var oldQueueTrackId=this.currentQueueTrack?this.currentQueueTrack.id:null;
this.currentQueueTrack=res.data.result;

if(this.ratingStrip&&this.currentQueueTrack){
this.ratingStrip.clearSongCache();
this.ratingStrip.render(this.currentQueueTrack.song,
this.currentQueueTrack.playbackUrl,'headerRatingStrip',
true);
}

this.updateShuffleMode(res);
this.updateQueueCounts(res);
this.updateTrackInfo();


if(!this.currentQueueTrack)this.autoPlay=false;

if(this.playerLoaded){
this.playbackCompleted=bCompleted?true:!this.currentQueueTrack;
lala.hideAck('restrictedListen');
this.flashPlayer.loadTrack(this.currentQueueTrack,this.autoPlay);

if(this.fullScreenMode){
this.renderFullScreen();
}
}

if(!this.currentQueueTrack||this.currentQueueTrack.id!=oldQueueTrackId){

PlayerQueue.g.onHeadChangeEvent();
}
},

renderFullScreen:function(toggle){
var closeFn=function(){
new MojoDialog({}).showModalShield(false,'fullScreen');
Player.g.fullScreenMode=false;
};
if(toggle&&this.fullScreenMode){
closeFn();
return;
}
this.fullScreenMode=true;
if(this.currentQueueTrack){
if(!$('fullScreen')){
mojo.dom.parseHTMLFragment("<div id='fullScreen' class='fullScreen'></div>",document.body);
var targ=mojo.IE?document.body:window;
mojo.event.onEscapeKey(targ,closeFn);
mojo.dom.addEventListener('fullScreen','onclick',closeFn);
}
$T(lt.Player.fullScreen,'fullScreen')
.replaceTokensWithBean('song',this.currentQueueTrack.song)
.replaceToken('songDuration',mojo.util.secondsToTime(this.currentQueueTrack.song.duration,true))
.compose();

api.Queue.getItems(2,1,function(res){
var q=res.data.result;
if(q.historyTracks.list.length>0)
$('prevArt').style.backgroundImage='url('+frontend.img.Album(q.historyTracks.list[0].song.discLalaId,'albumXLarge')+')';
if(q.activeTracks.list.length>0)
$('nextArt').style.backgroundImage=this.Player.g.shuffleMode
?'':'url('+frontend.img.Album(q.activeTracks.list[0].song.discLalaId,'albumXLarge')+')';
})

new MojoDialog({}).showModalShield(true,'fullScreen');
}else if(this.playbackCompleted){
closeFn();
}
},

refreshQueueData:function(){
var self=this;
api.Queue.getNext(function(res){
self.loadQueueData(res);
});
},

getHeadQueueTrack:function(){

return this.currentQueueTrack;
},

onGotoSource:function(){
if(this.currentQueueTrack&&this.currentQueueTrack.clientSourcePath){
MyMusic.g.gotoPageViaClick(null,this.currentQueueTrack.clientSourcePath,'globalNav.Player.navigation.sourceLink',true);
}
},

onReplayTrack:function(data){
this.flashPlayer.replayTrack(data);
lala.Track.client('Player.replayTrack')
},

onPlayTrackWithoutQueue:function(){
this.flashPlayer.playTrackWithoutQueue(this.currentQueueTrack);
lala.Track.client('Player.playTrackWithoutQueue')
},

onLoadTrack:function(res){
this.loadQueueData(res);
},

isPlaybackDisabled:function(){
if(!this.flashPlayer)return true;
if(this.isFlashBlocked())return true;

return this.showSignupIfRequiredForPlay();
},



initPlayback:function(bNoRollbackIfStopped){



if(!bNoRollbackIfStopped&&!this.playbackCompleted&&this.playStatus=='stopped'){

}



this.playbackCompleted=false;

this.autoPlay=true;
this.resetErrorCount();
},

playAlbum:function(album,fromTrackingId){
this.play('album',album,fromTrackingId);
},

playDisc:function(disc,fromTrackingId){
this.play('disc',disc,fromTrackingId);
},

playSong:function(song,fromTrackingId){
this.play('song',song,fromTrackingId);
},

play:function(type,obj,fromTrackingId){
if(this.isPlaybackDisabled())return;

var self=this;
this.initPlayback();

if(lala.user){
api.Queue.play(type,obj,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,false);
});
}else{
if(type=='song'){
Player.g.playTrackWithoutQueue(obj);
}else{
Player.g.playTrackWithoutQueue(obj.clientAllTracks[0]);
}
}
},

_checkAndRequireSigninForAnonUser:function(type){
if(lala.user)return false;
this.requireSigninForAnonUser(type);
return true;
},

requireSigninForAnonUser:function(type){
frontend.requiresSignin({
trackingId:'play',
title:'Sign up to play '+type+' in full for FREE'
});
},

playPrivateFeed:function(filterType,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

var self=this;
this.initPlayback();

api.Queue.playPrivateFeed(filterType,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,true);
});
},

playPublicFeed:function(userToken,filterType,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

var self=this;
this.initPlayback();

api.Queue.playPublicFeed(userToken,filterType,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,true);
});
},

playFeedStory:function(id,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

var self=this;
this.initPlayback();

api.Queue.playFeedStory(id,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,true);
});
},


playMemberPlaylist:function(playlistId,fromTrackingId,sourcePath,firstTrack){
if(this.isPlaybackDisabled())return;

var self=this;
this.initPlayback();

if(lala.user){
api.Queue.playMemberPlaylist(playlistId,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,true);
},sourcePath);
}else if(firstTrack){
Player.g.playTrackWithoutQueue(firstTrack);
}else{
this.requireSigninForAnonUser('this playlist');
}


},

playPlaylist:function(playlistToken,queryParams,sourceTitle,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('this playlist'))return;

var self=this;
this.initPlayback();

api.Playlists.playPlaylist(playlistToken,queryParams,sourceTitle,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,true);
});
},

playSongsWithQuery:function(sourceId,queryParams,sourceTitle,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

var self=this;
this.initPlayback();

api.Queue.playSongsWithQuery(sourceId,queryParams,sourceTitle,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,true);
});
},

queueSongsWithQuery:function(sourceId,queryParams,sourceTitle,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

api.Queue.queueSongsWithQuery(sourceId,queryParams,sourceTitle,function(res){
lala.Track.clientPageQueue(fromTrackingId,true);
});
},

playSongsByRanges:function(playlistToken,indexes,queryParams,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

var self=this;
this.initPlayback();

api.Playlists.playSongsByRanges(playlistToken,indexes,queryParams,function(res){
self.onLoadTrack(res);
lala.Track.clientPagePlay(fromTrackingId,indexes.length>1);
});
},

playCustomBag:function(playIds,sourceTitle,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('these songs'))return;

var self=this;
this.initPlayback();

api.Queue.playCustomBag(playIds,sourceTitle,function(res){
self.onLoadTrack(res);
lala.Track.clientPageQueue(fromTrackingId,playIds.length>1);
});
},

jumpToTrack:function(trackId,onResponse){
if(this.isPlaybackDisabled())return;

var self=this;
this.initPlayback(true);

api.Queue.jumpTo(trackId,function(res){
self.onLoadTrack(res);

if(onResponse){
onResponse(res);
}
});
},


moveToHeadAndPlay:function(itemId,onResponse){
if(this.isPlaybackDisabled())return;

var self=this;
this.initPlayback();

api.Queue.moveToHeadAndPlay(itemId,function(res){
self.onLoadTrack(res);

if(onResponse){
onResponse(res);
}
});
},

queueSong:function(song,onResponse,fromTrackingId){
this.queue('song',song,onResponse,fromTrackingId);
},

queueAlbum:function(album,onResponse,fromTrackingId){
this.queue('album',album,onResponse,fromTrackingId);
},

queueDisc:function(disc,onResponse,fromTrackingId){
this.queue('disc',disc,onResponse,fromTrackingId);
},

queue:function(type,obj,onResponse,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Queue.queue(type,obj,function(res){
if(onResponse){
onResponse(res);
}
lala.Track.clientPageQueue(fromTrackingId,type!='song');
});
},

queuePrivateFeed:function(filterType,fromTrackingId,onResponse){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Queue.queuePrivateFeed(filterType,function(res){
lala.Track.clientPageQueue(fromTrackingId,true);
if(onResponse)onResponse(res);
});
},

queuePublicFeed:function(userToken,filterType,fromTrackingId,onResponse){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Queue.queuePublicFeed(userToken,filterType,function(res){
lala.Track.clientPageQueue(fromTrackingId,true);
if(onResponse)onResponse(res);
});
},

queueFeedStory:function(id,fromTrackingId,onResponse){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Queue.queueFeedStory(id,function(res){
lala.Track.clientPageQueue(fromTrackingId,true);
if(onResponse)onResponse(res);
});
},

queueMemberPlaylist:function(playlistId,fromTrackingId,onResponse){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Queue.queueMemberPlaylist(playlistId,function(res){
lala.Track.clientPageQueue(fromTrackingId,true);
if(onResponse)onResponse(res);
});
},

queuePlaylist:function(playlistToken,queryParams,sourceTitle,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Playlists.queuePlaylist(playlistToken,queryParams,sourceTitle,function(){
lala.Track.clientPageQueue(fromTrackingId,true);
});
},

queueSongsByRanges:function(playlistToken,indexes,queryParams,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Playlists.queueSongsByRanges(playlistToken,indexes,queryParams,function(){
lala.Track.clientPageQueue(fromTrackingId,indexes.length>1);
});
},

queueCustomBag:function(playIds,sourceTitle,fromTrackingId){
if(this.isPlaybackDisabled())return;
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the queue feature'))return;

api.Queue.queueCustomBag(playIds,sourceTitle,function(res){
lala.Track.clientPageQueue(fromTrackingId,playIds.length>1);
});
},

prevTrack:function(isClick){
var self=this;
var bPrevious=true;



if(this.flashPlayer&&this.flashPlayer.getPlayingInfo){
var info=this.flashPlayer.getPlayingInfo(true);
if(info.canSeek&&info.position>10000){
bPrevious=false;
}
}

if(bPrevious){

api.Queue.getPrevious(this.currentQueueTrack!=null,function(res){
self.onLoadTrack(res);
});
}else{
this.flashPlayer.jumpToStart();
}
if(isClick)lala.Track.client('Player.interaction.prevTrack')
},

nextTrack:function(isClick){
var self=this;
api.Queue.getNext(function(res){
self.onLoadTrack(res);
});
if(isClick)lala.Track.client('Player.interaction.nextTrack')
},

toggleVolume:function(isClick){
var volBounds=$B('headerVolumeBG','headerPlayControls');
var knobBounds=$B('headerVolumeKnob','headerPlayControls');
var volKnob=$('headerVolumeKnob');
var volTrack=$('headerVolumeTrack');
var volIcon=$('headerVolumeIcon');


if(volTrack.clientWidth==0){
var offset=this.lastVolume*(volBounds.width-knobBounds.width);
volKnob.style.left=(volBounds.left+offset)+"px";
volTrack.style.width=offset+"px";
}else{
this.lastVolume=(knobBounds.left-volBounds.left)
/(volBounds.width-knobBounds.width);
volKnob.style.left=volBounds.left+"px";
volTrack.style.width="0px";
}

if(!this.lastVolume){
this.lastVolume=1;
}

this.saveVolume();
if(isClick)lala.Track.client('Player.interaction.toggleVolume')
},

pausePlayback:function(){
if(this.playStatus=='playing'){
this.autoPlay=false;
this.flashPlayer.togglePlayback();
}
},

togglePlayback:function(isClick){
var pendingStatus=this.playStatus!='playing'?'playing':'stopped';
if(this.playStatus=='stopped'){
if(this.currentQueueTrack){
if(lala.user){
this.jumpToTrack(this.currentQueueTrack.id);
}else{
this.playTrackWithoutQueue(this.currentQueueTrack.song);
}
}
}else{
this.autoPlay=this.playStatus!='playing';
this.flashPlayer.togglePlayback();
}

PlayerQueue.g.onHeadStatusChangeEvent(pendingStatus);
if(isClick)lala.Track.client('Player.interaction.togglePlayback')
},

updateShuffleMode:function(res){
this.shuffleMode=res.data.shuffleMode;
var shuffleButton=$('headerShuffleButton');
if(this.shuffleMode){
mojo.css.addClass(shuffleButton,'enabled');
shuffleButton.title=Player.SHUFFLE_OFF_TOOLTIP;
}else{
mojo.css.removeClass(shuffleButton,'enabled');
shuffleButton.title=Player.SHUFFLE_ON_TOOLTIP;
}
},

toggleShuffle:function(isClick){
if(this._checkAndRequireSigninForAnonUser('','Sign up for free to enable the shuffle feature'))return;

api.Queue.setShuffleMode(!this.shuffleMode);
if(isClick)lala.Track.client('Player.interaction.toggleShuffle')
},

stopPlayback:function(){
this.autoPlay=false;
this.flashPlayer.stopPlayback();
},

onForecastUpdated:function(evt){
if(!this.flashPlayer||
!(this.currentQueueTrack&&this.currentQueueTrack.song))
return;

var currentSong=this.currentQueueTrack.song;
if(evt.type=='delete'){
evt.songs=[evt.extra];
}

for(var i=0;i<evt.songs.length;i++){
var song=evt.songs[i];

if(currentSong.songLalaId==song.songLalaId){
var isForecast=evt.type!='delete';
currentSong.isForecast=isForecast;
this.flashPlayer.onForecastUpdated(song,isForecast);
break;
}
}
},

addSongWidgetListener_GetSongByLinkLalaId:function(id){
if(!this.flashPlayer||!(this.currentQueueTrack&&this.currentQueueTrack.song))return;
if(this.currentQueueTrack.song.linkSongLalaId==id){
return this.currentQueueTrack.song;
}else{
return null;
}
},

addSongWidgetListener_SongAddedCallback:function(song){
if(!this.flashPlayer||
!(this.currentQueueTrack&&this.currentQueueTrack.song))
return;
this.updateTrackInfo();
this.flashPlayer.onBuySong(song);
},

addSongWidgetListener_Mp3PurchasedCallback:function(song){
if(!this.flashPlayer||
!(this.currentQueueTrack&&this.currentQueueTrack.song))
return;

this.updateTrackInfo();
this.flashPlayer.onBuySong(song);
},

showRestrictListenMsg:function(song){



lala.showAck(
$T(lt.Header.restrictListenMsg)
.replaceToken('songId',song.id)
.compose(),
{isTimedHide:true,hideDelay:28*1000,name:'restrictedListen'});
},

resetErrorCount:function(){
this.errorCount=0;
},

showIOErrorDrawer:function(){
if(mojo.LALA_CRAWLER)return;

this.errorCount++;
if(this.errorTimeout){
clearTimeout(this.errorTimeout);
this.errorTimeout=null;
}

var self=this;
this.errorTimeout=setTimeout(function(){
self.resetErrorCount();
},5000);

var targetId='headerTrackInfo';
if(!this.ioErrorDrawer){
var html=$T(lt.Header.ioErrorDrawer)
.replaceToken('width',$B(targetId).width)
.compose();

this.ioErrorDrawer=mojo.drawer.create({targetId:targetId,
html:html,
delay:3,
id:'headerIOErrorDrawer',
direction:'bottom'});
}else{
mojo.geometry.setBounds('headerIOErrorDrawer',{width:$B(targetId).width});
}

this.ioErrorDrawer.open();
lala.Track.client('Player.showIODrawerAck');

var songInfo='';
if(this.currentQueueTrack&&this.currentQueueTrack.song){
var song=this.currentQueueTrack.song;
songInfo="["+song.songLalaId+"] "+
"["+song.title+"|"+
song.artist+"|"+
song.discTitle+"]";
}
lala.Track.logServerMessage(
'INFO',
'PlaybackUIError',
'playback error occured for song: '+songInfo);
},

showFlashBlockedDrawer:function(){
if(mojo.LALA_CRAWLER)return;

var dwidth=$B('headerTrackInfo').width;
if(dwidth<200){
dwidth=400;
}
if(!this.flashBlockedDrawer){
var html=$T(lt.Header.flashBlockedDrawer)
.replaceToken('width',dwidth)
.compose();
this.flashBlockedDrawer=mojo.drawer.create({targetId:'headerTrackInfo',
html:html,
disableAutoClose:true,
id:'headerFlashBlockedDrawer',
direction:'bottom'});
}else{
mojo.geometry.setBounds('headerFlashBlockedDrawer',{width:dwidth});
}
lala.Track.client('Player.flashBlocked');
this.flashBlockedDrawer.open();
},

closeFlashBlockedDrawer:function(){
this.flashBlockedDrawer.close();
},


showFlash10RequiredDrawer:function(){
if(mojo.LALA_CRAWLER)return;

var dwidth=$B('headerTrackInfo').width;
if(dwidth<200){
dwidth=400;
}
if(!Player.g.flash10RequiredDrawer){
var html=$T(lt.Header.flash10RequiredDrawer)
.replaceToken('width',dwidth)
.compose();
Player.g.flash10RequiredDrawer=mojo.drawer.create({targetId:'headerTrackInfo',
html:html,
disableAutoClose:true,
id:'headerFlash10RequiredDrawer',
direction:'bottom'});
}else{
mojo.geometry.setBounds('headerFlash10RequiredDrawer',{width:dwidth});
}
lala.Track.client('Player.noFlash');
Player.g.flash10RequiredDrawer.open();
},

closeFlash10RequiredDrawer:function(){
this.flash10RequiredDrawer.close();
},

addToLocker:function(elem,isFromRestrictedListenDialog){
if(elem.className.lcontains('disabled')
||elem.parentNode.className.lcontains('disabled'))return;


var credits=api.MicroWallet.credits;
if(this.currentQueueTrack&&this.currentQueueTrack.song){
var song=this.currentQueueTrack.song;
frontend.buyWebSong(
song,
function(){
var paidOrNot=((credits>0)?'unpaid':'paid');
lala.Track.client(
'Player.interaction.buyWebSong.'+paidOrNot);
if(isFromRestrictedListenDialog){
lala.Track.client(
'Player.interaction.buyWebSongRestricted.'+paidOrNot);
}
lala.hideAck();
},
null,
null,
null,
this.getFromHeaderContext());
}
},

addToLockerFromRestrictedListenDialog:function(elem,songId){

if(this.currentQueueTrack&&this.currentQueueTrack.song){
var song=this.currentQueueTrack.song;
if(song.id==songId){
this.addToLocker(elem,true);
}
}
},

getFromHeaderContext:function(){
return{
isFromHeader:true,
fromPage:this._getFromPageFromSourcePath(this.currentQueueTrack)
};
},

buySongDownload:function(elem){
if(elem.className.lcontains('disabled')||elem.className.lcontains('purchased')){
return;
}


if(this.currentQueueTrack&&this.currentQueueTrack.song){
var song=this.currentQueueTrack.song;
widgets.store.openBuySongDownloadDialog(
song,
function(){
lala.Track.client('Player.interaction.buyMp3Song');
},
this.getFromHeaderContext());
}
},

onShareClick:function(evt){
lala.Track.client('Player.interaction.openShare');

if(this.currentQueueTrack&&this.currentQueueTrack.song){
mojo.event.create(evt).stopPropagation();
widgets.Share.openSharePulldown({
song:this.currentQueueTrack.song,
elemId:'headerShareButton',
outsideScroll:true,
inHeader:true
});
}
},

onPlaylistClick:function(evt){
if(frontend.requiresSignin({trackingId:'addToPlaylist'}))return;

if(this.currentQueueTrack&&this.currentQueueTrack.song){
var song=this.currentQueueTrack.song;
var elemId='headerPlaylistButton';

if(!this.a2p){
this.a2p=new widgets.AddToPlaylist({elemId:elemId});
this.a2p.onAddedCallback=function(){
lala.Track.client('Player.interaction.addedToPlaylist');
};
}
this.a2p.onClick(
{songsToAdd:[song],
evt:evt,
inHeader:true});
}
},

_getFromPageFromSourcePath:function(qTrack){
var fromPage='Unknown';
if(qTrack.clientSourcePath){
fromPage=qTrack.clientSourcePath.split(/[\/:]/)[0];
fromPage=fromPage.ltoFirstUpperCase();
}
return fromPage;
},

updateNowPlaying:function(event){

var qTrack=this.currentQueueTrack;
if(event.status!='playing'||!qTrack||!qTrack.song){
return;
}

var fromPage=this._getFromPageFromSourcePath(qTrack);
var song=event.song;



if(song&&song.id==qTrack.song.id&&this.playStatus=='stopped'){
if(song.isRestrictedListen
&&song.isLicensedForStreaming&&song.duration>30){
this.showRestrictListenMsg(song);
lala.Track.client('Player.songPlayed.restricted');
}else{

var type='';
if(song.isDigied){
type='digied.';
if(song.isLicensedForStreaming){



if(song.isUploaded&&song.isQuasiUploaded){

type+='quasiUploaded';
}else if(song.isLicensedForDownload&&song.isDownloadPurchased){

type+='webMp3';
}else{

type+='webSong';
}
}else if(song.isLicensedForDownload){


type+='webMp3';
}else if(song.isUploaded){

type+='bruteUploaded';
}else if(song.isQuasiUploaded&&!song.isUploaded){

type+='webSongFunny';
}else{

type+='sampleLegacy';
}
}else if(song.isLicensedForStreaming){
type='free';
}else if(song.isLicensedForDownload){

type='sample.mp3Only';
lala.Track.click('player.play.sampleMp3');
}else{
type='sample.muzeOrUploaded';
}
lala.Track.client('Player.songPlayed.'+type+'.'+fromPage);
}

lala.Track.client('Player.songPlayedByBagType.'
+(qTrack.trackBagType||'none')+'.'+fromPage);
if(!lala.user&&song.isLicensedForStreaming){
lala.Track.client('Player.anonListen');
}

mojo.listeners.notify(Player.EVT_SONG_PLAYING);
}
},

updatePlayIcons:function(){
var offset=-1;
var aCount=this.activeCount-offset;
var hCount=this.historyCount+offset;

var playButton=$('headerPlayButton');
var pauseButton=$('headerPauseButton');
var prevButton=$('headerPrevButton');
var nextButton=$('headerNextButton');

if(this.currentQueueTrack){
mojo.css.removeClass(playButton,'disabled');
playButton.title=Player.PLAY_BUTTON_TOOLTIP;
pauseButton.title=Player.PAUSE_BUTTON_TOOLTIP;

if(this.playStatus=='playing'){
mojo.css.visibility(playButton,false);
mojo.css.visibility(pauseButton,true);
}else{
mojo.css.visibility(playButton,true);
mojo.css.visibility(pauseButton,false);
}
}else{
mojo.css.addClass(playButton,'disabled');
playButton.title="";

mojo.css.visibility(playButton,true);
mojo.css.visibility(pauseButton,false);
}

if(aCount>1){
mojo.css.removeClass(nextButton,'disabled');
nextButton.title=Player.NEXT_BUTTON_TOOLTIP;
}else{
mojo.css.addClass(nextButton,'disabled');
nextButton.title="";
}

if(hCount>0){
mojo.css.removeClass(prevButton,'disabled');
prevButton.title=Player.PREV_BUTTON_TOOLTIP;
}else{
mojo.css.addClass(prevButton,'disabled');
prevButton.title="";
}
},

updateTrackInfo:function(){
var song=this.currentQueueTrack?this.currentQueueTrack.song:null;
var trackInfo=$('headerTrackInfo');
var title=$('headerTrackTitle');
var artist=$('headerTrackArtist');
var albumLink=$('headerAlbumLink');
var albumImage=$('headerAlbumImage');
var addButton=$('headerAddButton');
var buyButton=$('headerBuyButton');
var shareButton=$('headerShareButton');
var shoutButton=$('headerTootButton');
var playlistButton=$('headerPlaylistButton');
var classPrefix="headerSkin";

if(song){


if(song.isLicensedForStreaming||song.isDigied){
if(!mojo.css.containsClass(trackInfo,'ratingEnabled')){
mojo.css.addClass(trackInfo,'ratingEnabled');
}
}else{
mojo.css.removeClass(trackInfo,'ratingEnabled');
}

if(song.linkDiscLalaId){
var titleTmpl=$T(lt.Header.titleLink);
titleTmpl.replaceToken('title',song.title);
titleTmpl.replaceToken(
'href_and_onclick',
frontend.link.Album(song.linkDiscLalaId,song.discTitle,'globalNav.Player.navigation.songLink')
);
title.innerHTML=titleTmpl.compose();


albumLink.onclick=function(){
frontend.go.Album(song.linkDiscLalaId,song.discTitle,'globalNav.Player.navigation.albumPicLink');
return false;
};
albumLink.href=frontend.url.Album(song.linkDiscLalaId,song.discTitle,null,song.artist);
albumLink.style.cursor="pointer";
albumLink.title=Player.ALBUM_COVER_TOOLTIP;
albumImage.src=frontend.img.Album(song.linkDiscLalaId,'small');
}else{
title.innerHTML=song.title;
albumLink.onclick=function(){return false;};
albumLink.style.cursor="default";
albumLink.title="";
albumImage.src=lala.staticBaseURL+'default-images/album-placeholder-80.jpg';
}
artist.innerHTML="by "+frontend.link.ArtistList(song.artistList,null,null,null,'globalNav.Player.navigation.artistLink');
albumLink.style.visibility="visible";

if(!frontend.canPurchaseDownload(song)){
if(frontend.hasDownload(song)){
buyButton.className=classPrefix+" purchased";
buyButton.title=Player.BOUGHT_SONG_TOOLTIP;
}else{
buyButton.className=classPrefix+" disabled";
buyButton.title="";
}
}else{
buyButton.className=classPrefix;
if(song.isFreeMp3)buyButton.className+=' free';
buyButton.title=Player.BUY_SONG_TOOLTIP;
}

var plButtonEnabled=true;
if(song.isDigied){
addButton.className=classPrefix+" digied";
addButton.title=Player.ADDED_SONG_TOOLTIP;
}else if(frontend.isSongAddable(song)){
addButton.className=classPrefix;
addButton.title=Player.ADD_SONG_TOOLTIP;
}else{
addButton.className=classPrefix+" disabled";
addButton.title="";
plButtonEnabled=false;
}

if(plButtonEnabled){
mojo.css.removeClass(playlistButton,'disabled');
playlistButton.title=Player.PLAYLIST_BUTTON_TOOLTIP;
}else{
mojo.css.addClass(playlistButton,'disabled');
playlistButton.title="";
}

if(song.isLicensedForStreaming){
mojo.css.removeClass(shareButton,'disabled');
shareButton.title=Player.SHARE_BUTTON_TOOLTIP;

mojo.css.removeClass(shoutButton,'disabled');
shoutButton.title=Player.SHOUT_BUTTON_TOOLTIP;
}else{
mojo.css.addClass(shareButton,'disabled');
shareButton.title="";

mojo.css.addClass(shoutButton,'disabled');
shoutButton.title='';
}
}else{
mojo.css.removeClass(trackInfo,'ratingEnabled');

title.innerHTML="";
artist.innerHTML="";

albumLink.style.visibility="hidden";

addButton.className=classPrefix+" disabled";
addButton.title="";
buyButton.className=classPrefix+" disabled";
buyButton.title="";
mojo.css.addClass(shareButton,'disabled');
shareButton.title="";
mojo.css.addClass(shoutButton,'disabled');
shoutButton.title="";
mojo.css.addClass(playlistButton,'disabled');
playlistButton.title="";
}


if(mojo.IE6){
if(buyButton.className.match(/purchased/)){
buyButton.style.backgroundPosition="-1362px -10px";
buyButton.style.cursor="default";
}else if(buyButton.className.match(/disabled/)){
buyButton.style.backgroundPosition="-614px -67px";
buyButton.style.cursor="default";
}else{
buyButton.style.backgroundPosition="-1214px -10px";
buyButton.style.cursor="pointer";
}

if(addButton.className.match(/digied/)){
addButton.style.backgroundPosition="-1140px -10px";
addButton.style.cursor="default";
}else if(addButton.className.match(/disabled/)){
addButton.style.backgroundPosition="-540px -67px";
addButton.style.cursor="default";
}else{
addButton.style.backgroundPosition="-992px -10px";
addButton.style.cursor="pointer";
}
}

mojo.css.visibility('headerSourceButton',song!=null);
},

updateQueueCounts:function(res){
this.historyCount=res.data.historyCount;
this.activeCount=res.data.activeCount;

var queueCount=$('queueCount');
if(queueCount){
queueCount.innerHTML=this.activeCount;
}
this.updatePlayIcons();
},

onQueueUpdated:function(res){


if(lala.user&&this.playbackCompleted&&res.data.activeCount>0){
this.refreshQueueData();
}else{
this.updateShuffleMode(res);
this.updateQueueCounts(res);
}
},

restoreVolume:function(volume){
var volBounds=$B('headerVolumeBG','headerPlayControls');
var knobBounds=$B('headerVolumeKnob','headerPlayControls');
var volKnob=$('headerVolumeKnob');
var volTrack=$('headerVolumeTrack');
var volIcon=$('headerVolumeIcon');

if(volume==0){
mojo.css.addClass(volIcon,'muted');
volIcon.title=Player.UNMUTE_BUTTON_TOOLTIP;
}else{
volIcon.title=Player.MUTE_BUTTON_TOOLTIP;
}

var offsetX=Math.sqrt(volume)*(volBounds.width-knobBounds.width);
volKnob.style.left=(volBounds.left+offsetX)+"px";
volTrack.style.width=offsetX+"px";
},

adjustVolume:function(evt){
this.doVolDrag(evt);
this.saveVolume();
},

decreaseVolume:function(pixels){
this.increaseVolume(0-pixels);
},

increaseVolume:function(pixels){
var volKnob=$('headerVolumeKnob');
var volKnobB=$B('headerVolumeKnob');
var volTrack=$('headerVolumeTrack');
var volTrackB=$B('headerVolumeTrack');
var volBounds=$B('headerVolumeBG','headerPlayControls');

if(volKnob&&volTrack){
var newVolTrackWidth=Math.max(Math.min(volTrackB.width+pixels,volBounds.width-volKnobB.width),0);
volTrack.style.width=newVolTrackWidth+'px';
volKnob.style.left=newVolTrackWidth+volBounds.left+"px";
}
this.saveVolume();
},

saveVolume:function(){

var volBounds=$B('headerVolumeBG','headerPlayControls');
var knobBounds=$B('headerVolumeKnob','headerPlayControls');
var volTrack=$('headerVolumeTrack');
var volIcon=$('headerVolumeIcon');

if(volTrack.clientWidth==0){
mojo.css.addClass(volIcon,'muted')
volIcon.title=Player.UNMUTE_BUTTON_TOOLTIP;
}else{
mojo.css.removeClass(volIcon,'muted')
volIcon.title=Player.MUTE_BUTTON_TOOLTIP;
}

var volume=(knobBounds.left-volBounds.left)
/(volBounds.width-knobBounds.width);


this.flashPlayer.saveVolume(Math.pow(volume,2));
},

startVolDrag:function(){
Player.g.saveVolumeInterval=setInterval(function(){
Player.g.saveVolume();
},100);

mojo.dom.addEventListener(document,"onmouseup",Player.g.stopVolDrag);
mojo.dom.addEventListener(document,"onmousemove",Player.g.doVolDrag);
},

stopVolDrag:function(){
clearInterval(Player.g.saveVolumeInterval);

mojo.dom.removeEventListener(document,"onmouseup",Player.g.stopVolDrag);
mojo.dom.removeEventListener(document,"onmousemove",Player.g.doVolDrag);

Player.g.saveVolume();
},

doVolDrag:function(evt){
evt=evt||window.event;

var volKnob=$('headerVolumeKnob');
var volTrack=$('headerVolumeTrack');
var volBounds=$B('headerVolumeBG','headerPlayControls');
var clientBounds=$B('headerVolumeBG');

if(volKnob&&volTrack){
var offsetX=evt.clientX-clientBounds.left+volKnob.clientWidth;

var knobX=Math.max(Math.min(volBounds.left+volBounds.width
-volKnob.clientWidth,offsetX),volBounds.left);

volKnob.style.left=knobX+"px";
volTrack.style.width=Math.max(0,knobX-volBounds.left)+"px";
}
},

getYouTubeVideos:function(artist,title,onResponse){
this.onVideosFoundResponse=onResponse;
this.flashPlayer.getYouTubeVideos(artist,title);
},








getPlayingInfo:function(){
if(!this.flashPlayer)return{};

var evt={};
try{
if(this.flashPlayer.getPlayingInfo){
evt=this.flashPlayer.getPlayingInfo();
}
if(!evt){
evt={};
}
}catch(e){


evt.data={};
}

return evt;
},

getPlaybackUrl:function(song){
var self=this;
api.Queue.getPlaybackUrl(song,function(res){
res.data.playToken=song.playToken;
self.onReplayTrack(res.data);
});
},

playTrackWithoutQueue:function(song){
var self=this;
mojo.assert(!lala.user,"playTrackWithoutQueue should only be used for anon users");
api.Queue.getPlaybackUrl(song,function(res){

self.currentQueueTrack={
song:song,
playbackUrl:res.data};
self.updateTrackInfo();
self.flashPlayer.loadTrack(self.currentQueueTrack);
self.onPlayTrackWithoutQueue();
});
},

isPlayerReady:function(){
return this.playerLoaded&&this.flashPlayer.loadTrack;
},

onComplete:function(){
this.playbackCompleted=true;

if(lala.user&&this.activeCount>0){
if(this.errorCount>=3){
this.autoPlay=false;
}
this.nextTrack();
}else{
this.reset();
}
},

onPlayerLoaded:function(){
this.playerLoaded=true;



this.playbackCompleted=this.activeCount==0;
},

onPlayingStatusChange:function(evt){
this.updateNowPlaying(evt);

this.playStatus=evt.status;
this.updatePlayIcons();


if(this.playStatus=='stopped'){
mojo.css.addClass('headerTrackInfo','playStatusStopped');
}else{

mojo.css.removeClass('headerTrackInfo','playStatusStopped');
}

mojo.listeners.notify(Player.EVT_STATUS_CHANGE,evt);
},

onYouTubeVideosFound:function(evt){
if(this.onVideosFoundResponse){
this.onVideosFoundResponse(evt);
this.onVideosFoundResponse=null;
}
}
};
Object.extend(Player.prototype,AddSongWidgetListener,true);
Player.g=new Player();





function Flash_onPlayerStatusChange(event){
Player.g.onPlayingStatusChange(event);
};

function Flash_onYouTubeVideosFound(event){
Player.g.onYouTubeVideosFound(event);
};

function Flash_onPlayerIOError(){
Player.g.autoPlay=false;

api.User.checkAudioStream(function(res){


if(!res.data){
lala.showAck("Sorry for the interruption. It looks like you may be "
+"playing music from another browser.")
lala.Track.client('Player.showSessionInterruptedAck');
}else{
Player.g.showIOErrorDrawer();
}
});
};

function Flash_onComplete(){
Player.g.onComplete();
};

function Flash_getNewPlaybackUrl(data){


setTimeout(function(){
Player.g.getPlaybackUrl(data.song);
},0);
}

function Flash_restoreVolume(volume){
Player.g.restoreVolume(volume);
};

function Flash_playerLoaded(){
Player.g.onPlayerLoaded();
}

function Flash_trackPlayerError(type){

lala.Track.client('Player.errorsViaFlash.'+type);
}

function Flash_getHeadQueueTrack(){
return Player.g.getHeadQueueTrack();
}

function Flash_log(msg){
mojo.log.info(msg);
}

function Flash_onProgressClicked(){



window.setTimeout(function(){
$('browserFocus').focus();
$('browserFocus').blur();
},100);
}

OverlayUtil={
setupOverlayEventHandlers:function(onClose,disableCloseOnClick){
if(!disableCloseOnClick){
setTimeout(
function(){
mojo.dom.setEventListener(
document.body,
'onclick',
function(evt){
evt=mojo.event.create(evt);
var target=evt.target;
while(target!=null){
if(target.id=='headerPlayButton'
||target.id=='headerPauseButton'
||target.id=='headerPrevButton'
||target.id=='headerNextButton'
||target.id=='headerVolumeIcon'
||target.id=='headerVolumeKnob'
||target.id=='headerVolumeTrack'
||target.id=='headerShuffleButton'
||target.id=='headerVolumeBG'
||target.id=='litePlayerEmbed'){
return;
}
target=target.parentNode;
}
document.body.onclick=null;
onClose();
});
},
100);
}

mojo.event.onEscapeKey(
mojo.IE?document.body:window,
function(){onClose();});
},

clearOverlayEventHandlers:function(){
mojo.event.onEscapeKey(mojo.IE?document.body:window,null);
document.body.onclick=null;
}
};







PlayerDrawer=Class.create();
PlayerDrawer.EVT_CLOSED='PlayerDrawerClosed'
PlayerDrawer.prototype={
initialize:function(){
this._divId='queueDrawer';
this._contentDivId='queueDrawerContent';
this._isVeryFirstOpen=true;
this._openType=null;
},



open:function(disableCloseOnClick,type){
var self=this;
var div=this._positionDiv();
this._openType=type;

OverlayUtil.setupOverlayEventHandlers(self.close.lbind(this),disableCloseOnClick);

if(this._isVeryFirstOpen){
mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_RESIZE,
function(){
if(self.isOpen())self._positionDiv();
});

if(mojo.IE6){
mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_SCROLL,
function(){
if(self.isOpen())self.close();
});
}
this._isVeryFirstOpen=false;
}

return $(this._contentDivId);
},

close:function(){
this._openType=null;
var div=$(this._divId);
if(!div)return;

mojo.css.display(div,false);
$(this._contentDivId).innerHTML='';
mojo.listeners.notify(PlayerDrawer.EVT_CLOSED);

OverlayUtil.clearOverlayEventHandlers();
},

isOpen:function(type){
var open=mojo.css.isDisplayed(this._divId);
if(open&&mojo.isDefined(type)){
open=type==this._openType;
}
return open;
},

getDiv:function(){
var div=$(this._divId);
if(div==null){
div=
mojo.dom.parseHTMLFragment(lt.PlayerQueue.drawer,document.body);
new widgets.core.DropShadowBox({renderTargetId:this._divId})
.render($TC(lt.PlayerQueue.contentSkel));
}
return div;
},

getContentDiv:function(){
this.getDiv();
return $(this._contentDivId);
},

_positionDiv:function(){
var div=$(this._divId);
if(!div){
div=this.getDiv();
}

var bounds=mojo.geometry.getBounds('playerRegion');
var top=bounds.top+bounds.height+5;
var divBounds={
top:top,
left:bounds.left-8,
width:bounds.width+16
};
mojo.geometry.setBounds(div,divBounds);
mojo.css.display(div,true);
return div;
}
};
PlayerDrawer.g=new PlayerDrawer();







PlayerQueue=Class.create();
PlayerQueue.EVT_CHANGE='PlayerQueue_Change';
PlayerQueue.prototype={
initialize:function(){
PlayerQueue.g=this;

this._model=null;
this._isFirstOpen=true;
this._isOpen=false;
},

close:function(){
if(!PlayerDrawer.g.isOpen())return;
PlayerDrawer.g.close();
},

open:function(){
var self=this;
if(this._isOpen)return;



this.historyCount=3;
this.activeCount=100;
this.historyPageSize=2;
this.activePageSize=25;

this._render();


if(this._isFirstOpen){
mojo.listeners.addGlobal(
PlayerDrawer.EVT_CLOSED,
function(){
MojoDialog.close();
self._model=null;
self._isOpen=false;
});
mojo.listeners.addGlobal(
api.Queue.EVT_QUEUE_UPDATED,
function(){
if(!self._isOpen)return;
self._reload(false);
lala.Track.client('PlayerQueue.queueUpdatedNotification');
});
this.addSongWidgetListener_Init(true,true);
}
this._isFirstOpen=false;
this._isOpen=true;
},

onClose:function(){
this.close();
},

onOpen:function(){
if(this._isOpen){
this.onClose();
}else{
this.open();
lala.Track.client('PlayerQueue.interaction.openQueue');
}
},

onClear:function(){
var self=this;
MojoDialog.close();

if(this._model.activeTracks.total>25){
if(!confirm('Are you sure you want to clear all the tracks in the queue?'))return;
}

api.Queue.removeActiveItems(
function(){
lala.Track.client('PlayerQueue.interaction.clearAll');
mojo.listeners.notify(PlayerQueue.EVT_CHANGE);
self._reload(true);
});
},

onQueueItemAdd:function(id,type){
MojoDialog.close();

var qTrack=this._getItemById(id,type);
frontend.buyWebSong(qTrack.song);
lala.Track.client('PlayerQueue.interaction.addWebSong.'+type);
},

onQueueItemPlay:function(id,type){
MojoDialog.close();

var qTrack=this._getItemById(id,type);

Player.g.moveToHeadAndPlay(qTrack.id);
lala.Track.client('PlayerQueue.interaction.playSong.'+type);
},

onQueueItemMoveToTop:function(id){
var self=this;
MojoDialog.close();

var qItem=this._getItemById(id,'active');


api.Queue.moveToTop(
qItem,
function(){
var tracks=self._model.activeTracks;
var oldFirst=tracks.list[0];


tracks.list.lremoveIf('id',id);
tracks.list.linsertAt(qItem,0);

var bag=null;
if(qItem.bagId){
bag=self._model.activeBags[qItem.bagId];
bag.tracks.lremoveIf('id',id);
bag.tracks.linsertAt(qItem,0);
}


var row=$('queueItemRow_'+id);
var parent=row.parentNode;
parent.removeChild(row);
parent.insertBefore(row,$('queueItemRow_'+oldFirst.id));

if(oldFirst.bagId&&(oldFirst.bagId==qItem.bagId)){

row.className=row.className.replace('lastBagTrackFlag','');
var bag=self._model.activeBags[qItem.bagId];


var lastBagRow=$('queueItemRow_'+bag.tracks.llast().id);
lastBagRow.className+=' lastBagTrackFlag';
}else{

row.className=row.className.replace('lastBagTrackFlag','');
row.className=row.className.replace('bagTrackFlag','');
qItem.bagId=null;
}


self._clearHoverFlags(row);
self._modelChanged();
lala.Track.client('PlayerQueue.interaction.moveSongToTop');
});
},

onQueueItemDelete:function(id,type){
var self=this;
MojoDialog.close();

if(type=='head'){
lala.Track.client('PlayerQueue.interaction.deleteSongAtHead');
Player.g.nextTrack();
return;
}

var qItem=this._getItemById(id,type);


api.Queue.removeItem(
qItem,
function(){

var tracks=self._model.activeTracks;
tracks.list.lremoveIf('id',id);
tracks.total--;

var bag=null;
var bagOrigLastTrack=null;
if(qItem.bagId){

bag=self._model.activeBags[qItem.bagId];
bagOrigLastTrack=bag.tracks.llast();

bag.tracks.lremoveIf('id',id);
if(bag.tracks.length==0){
delete self._model.activeBags[qItem.bagId];
}
}


mojo.dom.removeElement('queueItemRow_'+id);

if(bag&&(bagOrigLastTrack.id==id)&&bag.tracks.length>0){


var lastBagRow=$('queueItemRow_'+bag.tracks.llast().id);
lastBagRow.className+=' lastBagTrackFlag';
}
self._modelChanged();
lala.Track.client('PlayerQueue.interaction.deleteSong');
});
},

onQueueBagOpenMenu:function(id,type){
var self=this;
if(this.dialog&&this.dialog.isOpen){
MojoDialog.close();
return;
}

var qItem=this._getItemById(id,type);
var qBag=this._getBagById(qItem.bagId,type);
var elem=$('queueBagMenu_'+id);

this.dialog=new MojoDialog({
id:'queueBagActionsDialog',
contextualElemId:elem.id
});

this.dialog.fixedScrollingContainerId='queueDrawerSongsBox';

var t=$T(lt.PlayerQueue.bagMenu);
t.replaceToken('bagType',qBag.clientBagType);
t.replaceToken('type',type);
t.replaceToken('id',qBag.id);
t.replaceToken('title',qBag.clientSourceTitle.lescapeHTML());
if(type=='head'){
t.removeTokenBlock('PlayBlock');
t.removeTokenBlock('MoveBlock');
}else if(type=='history'){
t.removeTokenBlock('MoveBlock');
t.removeTokenBlock('DeleteBlock');
}else if(type=='active'){
var firstTrack=this._model.activeTracks.list[0];
if(firstTrack.bagId&&(firstTrack.bagId==qBag.id)){

t.removeTokenBlock('MoveBlock');
t.removeTokenBlock('PlayBlock');
}
}

if(!qBag.clientSourcePath){
t.removeTokenBlock('SourceBlock');
}
this.dialog.open(t.compose(),null,null,null,true);
lala.Track.client('PlayerQueue.interaction.openBagMenu.'+type);
},


onQueueBagSource:function(bagId,type){
MojoDialog.close();

var qBag=this._getBagById(bagId,type);
this.close();
MyMusic.g.gotoPageViaClick(null,qBag.clientSourcePath,'globalNav.PlayerQueue.navigation.goToBagSource.'+type,true);
},

onQueueBagDelete:function(bagId,type){
var self=this;
MojoDialog.close();

var isHead=false;
var head=Player.g.getHeadQueueTrack();
if(type=='head'||(head&&(bagId==head.bagId))){

isHead=true;
}

var qBag=this._getBagById(bagId,type);
api.Queue.removeItem(
qBag,
function(){
if(isHead){
Player.g.nextTrack();
lala.Track.client('PlayerQueue.interaction.deleteBagAtHead');
}else{
lala.Track.client('PlayerQueue.interaction.deleteBag');
self._reload(false,true);
}
});
},

onQueueBagMoveToTop:function(bagId,type){
var self=this;
MojoDialog.close();

var qBag=this._getBagById(bagId,type);
api.Queue.moveToTop(
qBag,
function(){
self._reload();
lala.Track.client('PlayerQueue.interaction.moveBagToTop');
});
},

onQueueBagPlay:function(bagId,type){
MojoDialog.close();


Player.g.moveToHeadAndPlay(bagId);
lala.Track.client('PlayerQueue.interaction.playBag.'+type);
},



onHeadChangeEvent:function(){

if(!this._isOpen)return;

MojoDialog.close();
this._reload(true);
},


onHeadStatusChangeEvent:function(status){
var head=Player.g.getHeadQueueTrack();
if(!head)return;

var row=$('queueItemRow_'+head.id);
if(!row)return;

if(status=='playing'&&!row.className.lcontains('playingFlag')){
row.className=row.className.lappend('playingFlag');
}else{
row.className=row.className.lremove('playingFlag');
}
},

onQueueShowMoreHistory:function(){
this.historyCount+=this.historyPageSize;
this._reload(true,true);
lala.Track.client('PlayerQueue.interaction.showMoreHistory');
},

onQueueShowMoreActive:function(){
this.activeCount+=this.activePageSize;
this._reload(true,true);
lala.Track.client('PlayerQueue.interaction.showMoreActive');
},

onQueueItemMouseOver:function(elem,evt,id){

var div=$('queueItemRow_'+id);
var classes=' hoverFlag';



if(!this._model)return;

var headTrack=Player.g.getHeadQueueTrack();
if(this._model.activeTracks.list.length>0){
var qItem=this._getItemById(id,'active');
var onDeckTrack=this._model.activeTracks.list[0];
if(qItem){
if(qItem.id!=onDeckTrack.id){
classes+=' hoverMoveFlag';
}
if(qItem.bagId){




var bag=this._model.activeBags[qItem.bagId];
if(bag.tracks.length>1){
classes+=' hoverBagTrackFlag';
}else if(headTrack!=null&&(onDeckTrack.bagId==headTrack.bagId)){
classes+=' hoverBagTrackFlag';
}
}
}
}
if(this._model.historyTracks.list.length>0){
var qItem=this._getItemById(id,'history');
if(qItem&&qItem.bagId){
var bag=this._model.historyBags[qItem.bagId];
if(bag.tracks.length>1){

classes+=' hoverBagTrackFlag';
}
}
}
div.className+=classes;
},

onQueueItemMouseOut:function(elem,evt,id){

var div=$('queueItemRow_'+id);
this._clearHoverFlags(div);
},

_modelChanged:function(){
mojo.listeners.notify(PlayerQueue.EVT_CHANGE);
this._updateFooter();
},

_clearHoverFlags:function(elem){
elem.className=elem.className.replace(/hover.*Flag/,'');
},

_updateFooter:function(){
var total=this._model.activeTracks.total;
mojo.css.visibility('queueDrawerClear',total>0);

var text='&nbsp;';
if(total>this.activeCount){
text+='Songs: '+this.activeCount+' of '+total+' ';
}else if(total>1){
text+=total+' songs';
}else if(total==1){
text+='1 song';
}
mojo.setContent('queueDrawerActiveCount',text);
},

_reload:function(skipNotify,keepScroll){
if(!skipNotify)mojo.listeners.notify(PlayerQueue.EVT_CHANGE);

this._model=null;
this._render(keepScroll);
},

addSongWidgetListener_GetSongByLinkLalaId:function(linkSongLalaId){

if(!this._model)return;
if(!this._isOpen)return;

var head=Player.g.getHeadQueueTrack();
var songs=[];
songs.laddAll(
this._model.activeTracks.list.lfindIfWithSubKey(
'song','linkSongLalaId',linkSongLalaId).lpluck('song'));
songs.laddAll(
this._model.historyTracks.list.lfindIfWithSubKey(
'song','linkSongLalaId',linkSongLalaId).lpluck('song'));
if(head&&(head.song.linkSongLalaId==linkSongLalaId)){
songs.ladd(head.song);
}
return songs;
},

addSongWidgetListener_SongAddedCallback:function(updatedSong){
var elem=$('buySong_'+updatedSong.clientQTrackId);
elem.innerHTML=widgets.SongList.IN_ICON;
},

_getItemById:function(id,type){
if(type=='head'){
return Player.g.getHeadQueueTrack();
}

var list=this._model[type+'Tracks'].list;
var item=list.lfindObject('id',id);
if(item==null){

item=this._model[type+'Bags'][id];
}
return item;
},

_getBagById:function(bagId,type){
if(type=='head'){
var bag=null;
var qTrack=Player.g.getHeadQueueTrack();
if(qTrack&&qTrack.bagId!=null){
bagId=qTrack.bagId;
bag=this._model.activeBags[bagId];
if(!bag){
bag=this._model.historyBags[bagId];
}
}
return bag;
}else{
var bags=this._model[type+'Bags'];
return bags[bagId];
}
},

_render:function(keepScroll,scrollTop){
var self=this;



var box=$('queueDrawerSongsBox');
if(!mojo.isDefined(scrollTop))scrollTop=0;
if(box&&keepScroll){
scrollTop=box.scrollTop;
}

if(!this._model){



api.Queue.getItems(this.historyCount,this.activeCount,function(res){
self._model=res.data.result;
self._render(keepScroll,scrollTop);
})
return;
}

var currPlayingQTrack=Player.g.getHeadQueueTrack();


if(currPlayingQTrack&&this._model.historyTracks.list.length>0
&&(this._model.historyTracks.list.llast().id==currPlayingQTrack.id)){
this._model.historyTracks.list.length--;
this._model.historyTracks.total--;
}else if(this._model.historyTracks.list.length>(this.historyCount-1)){
this._model.historyTracks.list.lremoveAt(0);
this._model.historyTracks.total--;
}

var t=$T(lt.PlayerQueue.skel,PlayerDrawer.g.getContentDiv().id);
t.replaceToken('trackingId','globalNav.PlayerQueue.navigation');
var iter=t.getTokenBlock('SongBlock');

this._renderQueueTrackList(iter,'history',2);
if(!currPlayingQTrack){
this._renderNotPlayingTrack(iter);
}else{
this._renderHeadTrack(iter,currPlayingQTrack);
}
this._renderQueueTrackList(iter,'active',10);

if(this._model.activeTracks.total==0){
t.replaceToken('hideClear','lhidden');
}
t.compose();

box=$('queueDrawerSongsBox');
if(keepScroll&&(scrollTop>=0)){

box.scrollTop=scrollTop;
}else{
box.scrollTop=0;

}
this._updateFooter();
PlayerDrawer.g.open(false);

if(mojo.IE){
box.onselectstart=function(){return false;};
}
},

_renderQueueTrackList:function(iter,type,minRows){
var self=this;
var head=Player.g.getHeadQueueTrack();
var isHistory=type=='history';
var qTrackList=this._model[type+'Tracks'];
var qTracks=this._model[type+'Tracks'].list;

if(isHistory){
this._renderPager(iter,true,qTrackList);
}

if(isHistory&&minRows>0&&qTracks.length<minRows){

for(;minRows>qTracks.length;minRows--){
this._renderBlankQueueTrack(iter);
}
}

qTracks.leach(function(qTrack,index,isLast){
if(isHistory){
self._renderHistoryTrack(iter,qTrack,isLast);
}else{
self._renderActiveTrack(iter,qTrack,index==0);
}
minRows--;
});

if(!isHistory&&minRows>0){

for(;minRows>0;minRows--){
this._renderBlankQueueTrack(iter);
}
}
if(!isHistory){
this._renderPager(iter,false,qTrackList);
}
},

_renderHistoryTrack:function(iter,qTrack,isLast){
iter.removeTokenBlock('PlayingNowBlock');

var flags='historyFlag';
if(isLast){
flags+=' lbordernobottom';
}
this._renderCommonTrackTokens(iter,qTrack,flags,'history');

var hide='style="visibility:hidden" ';
iter.replaceToken('deleteStyle',hide);
iter.replaceToken('diamondTooltip','See option to play');

iter.next();
},

_renderActiveTrack:function(iter,qTrack,isFirst){

iter.removeTokenBlock('PlayingNowBlock');
this._renderCommonTrackTokens(iter,qTrack,'activeFlag','active');
iter.next();
},

_renderNotPlayingTrack:function(iter){
iter.replaceToken('flags','headFlag nonePlayingFlag');
iter.replaceTokenBlock('AddActionBlock','&nbsp;');
iter.replaceTokenBlock('ActiveActionsBlock','&nbsp;');
iter.replaceTokenBlock('TitleLinkBlock','No song currently playing');
iter.replaceTokenBlock('ArtistLinkBlock','&nbsp;');
iter.removeTokenBlock('MouseOverBlock');
iter.removeTokenBlock('PlayActionBlock');
iter.next();
},

_renderHeadTrack:function(iter,qTrack){

iter.removeTokenBlock('PlayActionBlock');

var flags='headFlag';
if(Player.g.isPlaying()){
flags+=' playingFlag';
}

this._renderCommonTrackTokens(iter,qTrack,flags,'head');


var hide='style="visibility:hidden" ';
var show='style="visibility:visible" ';
iter.replaceToken('deleteStyle',show);
iter.replaceToken('moveStyle',hide);
iter.replaceToken('diamondStyle',hide);
iter.replaceToken('diamondTooltip','Delete');
if(qTrack.bagId){
var bag=this._getBagById(qTrack.bagId,'head');


if(bag.tracks.length>0
&&this._model.activeTracks.list.length>0
&&this._model.activeTracks.list[0].bagId==qTrack.bagId){
iter.replaceToken('diamondStyle',show);
}
}

iter.next();


qTrack.song.clientQTrackId=qTrack.id;
},

_renderCommonTrackTokens:function(iter,qTrack,flags,type){
var song=qTrack.song;
var isHead=type=='head';
var bag=qTrack.bagId?this._getBagById(qTrack.bagId,type):null;

iter.replaceTokensWithBean('qTrack',qTrack);
iter.replaceTokensWithBean('song',song);
iter.replaceToken('type',type);

if(!song.linkSongLalaId){

iter.replaceTokenBlock('TitleLinkBlock','<span title="'+song.title+'">'+song.title+'</span>');
iter.replaceTokenBlock('ArtistLinkBlock','<span title="'+song.artist+'">'+song.artist+'</span>');
}

if(!isHead&&(qTrack.bagId!=null)){
flags+=' bagTrackFlag';
if(bag&&bag.tracks.llast().id==qTrack.id){
flags+=' lastBagTrackFlag';
}
}
iter.replaceToken('flags',flags);

if(song.isDigied){
iter.replaceTokenBlock('AddActionBlock',widgets.SongList.IN_ICON);
iter.replaceToken('addTooltip',widgets.SongList.TIP_BOUGHT);
}else if(!frontend.isSongAddable(song)){
iter.replaceTokenBlock('AddActionBlock','&nbsp;');
}else{
iter.replaceToken('addTooltip',widgets.SongList.TIP_BUY);
}

if(song.playType=='Sample'){
iter.replaceToken('isSample','playActionSample');
}

if(bag){
iter.replaceToken('bagTitle',bag.clientSourceTitle.lescapeHTML());
iter.replaceToken('bagType',bag.clientBagType);
iter.replaceToken('diamondTooltip','Delete, move, or play');
}
},

_renderBlankQueueTrack:function(iter){
iter.replaceTokensWithBean('song',{title:'&nbsp;'});
iter.replaceToken('flags','blankFlag');
iter.replaceTokenBlock('AddActionBlock','&nbsp;');
iter.replaceTokenBlock('ActiveActionsBlock','&nbsp;');
iter.replaceTokenBlock('TitleLinkBlock','&nbsp;');
iter.replaceTokenBlock('ArtistLinkBlock','&nbsp;');
iter.removeTokenBlock('MouseOverBlock');
iter.replaceTokenBlock('PlayActionBlock','&nbsp;');
iter.replaceTokenBlock('PlayingNowBlock','&nbsp;');
iter.next();
},

_renderPager:function(iter,isUp,pagedList){
var isEnabled=pagedList.total>pagedList.list.length&&(pagedList.total>1);
if(!isEnabled)return;

var t=$T(lt.PlayerQueue.pager);
t.replaceToken('dir',isUp?'history':'active');
var text=isUp?'queue history':'queue';



if(isEnabled){
t.replaceToken('tooltip','Show more tracks from your '+text);
t.replaceToken('onClick','PlayerQueue.g.onQueueShowMore'+(isUp?'History':'Active')+'()');
t.replaceToken('disabledPager','activePager');
}else{
t.replaceToken('disabled','_disabled');
t.replaceToken('disabledPager','disabledPager');
t.replaceToken('tooltip','You don\'t have anymore tracks in your '+text);
}
iter.addNextHtmlChunk(t.compose());
}
};
Object.extend(PlayerQueue.prototype,AddSongWidgetListener,true);
PlayerQueue.g=new PlayerQueue();

CustomPageWidget=Class.create();
CustomPageWidget.prototype={
IMG_VERT_TOP:-20,
ONE_ALBUM_IMG_TOP:-63,
ONE_ALBUM_IMG_LEFT:-33,

initialize:function(params){
this.struct=params.struct;
this.renderTargetId=params.renderTargetId;
this.pageId=params.pageId;
this.firstTime=true;
this.albumCache={};

this.albumPriceListener_Init(this.onAlbumPriceUpdated.lbind(this));

CustomPageWidget.g=this;
},

renderSkel:function(){
$T(lt.CustomPageWidget.skeleton,this.renderTargetId)
.replaceToken('title',this.struct.title)
.replaceToken('subTitle',this.struct.subTitle)
.compose();
$T(lt.CustomPageWidget.content,'customPageContent')
.removeTokenBlock('LinksBarBlock',this.struct.hideLinks)
.compose();
},

render:function(){
var self=this;
this.renderSkel();

var discsArray=[];
var songsArray=[];
this.struct.data.leach(function(s){
switch(s.type){
case'grid':
discsArray.push(s.discIds.replace(/\,/g,";"));
break;
case'oneAlbum':
discsArray.push(s.discId);
break;
case'twoAlbums':
discsArray.push(s.left.discId+";"+s.right.discId);
break;
case'carousel':
discsArray.push(s.discIds.replace(/\,/g,";"));
break;
case'songs':
s.left.leach(function(l){
songsArray.push(l.songIds.replace(/\,/g,";"));
});
s.right.leach(function(r){
songsArray.push(r.songIds.replace(/\,/g,";"));
});
break;
case'footnote':
break;
default:
break;
}
});

api.Content.getContentForCustomPage(discsArray,songsArray,function(res){
var songIndex=0;
var discIndex=0;
self.struct.data.leach(function(item){
if(item.type=='songs'){
item.left.leach(function(l){
l.songs=res.data.songs[songIndex];
songIndex++;
});
item.right.leach(function(r){
r.songs=res.data.songs[songIndex];
songIndex++;
});
}else if(item.type!='footnote'){
item.discs=res.data.discs[discIndex];
discIndex++;
}
});
self.carouselIndex=0;
self.songsModuleIndex=0;
self.oneAlbumModuleIndex=0;
self.twoAlbumsModuleIndex=0;
self.footnoteIndex=0;
self.struct.data.leach(function(s){
switch(s.type){
case'grid':
self.renderGrid(s);
break;
case'oneAlbum':
self.renderOneAlbum(s);
self.oneAlbumModuleIndex++;
break;
case'twoAlbums':
self.renderTwoAlbums(s);
self.twoAlbumsModuleIndex++;
break;
case'carousel':
self.renderCarousel(s);
self.carouselIndex++;
break;
case'songs':
self.renderSongs(s);
self.songsModuleIndex++;
break;
case'footnote':
self.renderFootnote(s);
self.footnoteIndex++;
break;
default:
break;
}
});
});


},

renderIntoDom:function(t){
if(this.firstTime){
this.firstPageCopyDiv=t.composeIntoDom('customPageMain');
this.firstTime=false;
}else{
this.firstPageCopyDiv.parentNode.appendChild(
mojo.dom.parseHTMLFragment(t.compose()),
this.firstPageCopyDiv);
}
},

renderSongs:function(data){
var t=$T(lt.CustomPageWidget.songsWrapper)
.replaceToken('index',this.songsModuleIndex);
this.renderIntoDom(t);


var topOffset;
if(mojo.IE6){
topOffset=0;
}else if(mojo.CHROME){
topOffset=-1;
}else if(mojo.MAC&&mojo.FF){
topOffset=-4;
}else if(mojo.IE){
topOffset=-2;
}else{
topOffset=-3;
}
var leftHtml='';
data.left.leach(function(l){
leftHtml+=$T(lt.CustomPageWidget.songItem)
.replaceToken('title',l.title)
.replaceToken('content',
new widgets.SongList({
layout:'simple',
hideDuration:true,
hideNum:true,
hideAlbum:true,
showListens:false,
showPrice:true,
showBuyActions:true,
buyMode:'mp3',
hideAddedTransient:true,
offsets:{top:topOffset}
}).render(l.songs))
.compose();
});
var rightHtml='';
data.right.leach(function(r){
rightHtml+=$T(lt.CustomPageWidget.songItem)
.replaceToken('title',r.title)
.replaceToken('content',
new widgets.SongList({
layout:'simple',
hideDuration:true,
hideNum:true,
hideAlbum:true,
showListens:false,
showPrice:true,
showBuyActions:true,
buyMode:'mp3',
hideAddedTransient:true,
offsets:{top:topOffset}
}).render(r.songs))
.compose();
});

var twoCol=new widgets.core.TwoColumn({
col1Content:leftHtml,
col2Content:rightHtml
});

var content=$T(lt.CustomPageWidget.songs)
.replaceToken('bgColor',data.titleColor?'background-color: '+data.titleColor:'')
.replaceTokensWithBean('module',data)
.replaceToken('content',twoCol.render());
if(data.imgShow){
content.replaceToken('imagePos'+data.imgPos,
$T(lt.CustomPageWidget.titleImg)
.replaceToken('imgSrc',data.imgUrl)
.replaceToken('top',this.IMG_VERT_TOP+(parseInt(data.imgVerticalTweak)||0))
.replaceToken('id','songs_'+this.songsModuleIndex)
.compose());
}
var sb=new widgets.core.ShadowBox({
renderTargetId:'songsModule_'+this.songsModuleIndex,
content:content.compose()
});
sb.render();
if(data.imgShow)$('titleImg_songs_'+this.songsModuleIndex).style.left='0px';
},

renderGrid:function(data){
var t=$T(lt.CustomPageWidget.grid)
.replaceToken('title',data.title)
.replaceToken('subTitle',data.subTitle)
.replaceToken('content',
new widgets.AlbumList({
hideYear:true,
showPriceField:data.whichPrice!='none',
showMp3Price:data.whichPrice!='webOnly',
showWebPrice:data.whichPrice!='mp3Only'
}).getHtml(data.discs,'grid'));
this.renderIntoDom(t);
},

renderOneAlbum:function(data){
var disc=data.discs[0];
var t=$T(lt.CustomPageWidget.oneAlbum)
.replaceToken('index',this.oneAlbumModuleIndex);
this.renderIntoDom(t);
var content=$T(lt.CustomPageWidget.oneAlbumItem)
.replaceToken('imgTop',this.ONE_ALBUM_IMG_TOP+(parseInt(data.imgYTweak)||0))
.replaceToken('imgLeft',this.ONE_ALBUM_IMG_LEFT+(parseInt(data.imgXTweak)||0))
.replaceToken('imgUrl',data.imgUseArtistPage
?frontend.img.Artist(data.imgArtistBasePath,'large')
:data.imgUrl)
.removeTokenBlock('BGImageBlock',!data.imgShow)
.replaceToken('title',data.title)
.replaceTokensWithBean('disc',disc)
.replaceToken('text',data.text)
.replaceToken('webPrice',mojo.util.formatPrice(disc.webAlbumPriceInCents))
.replaceToken('mp3Price',mojo.util.formatPrice(disc.downloadAlbumPriceInCents))
.replaceToken('numPriceCols',data.whichPrice=='mp3Only'||data.whichPrice=='webOnly'||disc.webAlbumPriceInCents<=0||disc.downloadAlbumPriceInCents<=0?1:2)
.replaceToken('priceTableWidth',data.whichPrice=='mp3Only'||data.whichPrice=='webOnly'||disc.webAlbumPriceInCents<=0||disc.downloadAlbumPriceInCents<=0?116:232)
.replaceToken('priceTitle',data.priceTitle)
.removeTokenBlock('PriceTitleBlock',!data.priceTitle)
.replaceToken('index',this.oneAlbumModuleIndex);
if(data.whichPrice=='mp3Only'||disc.webAlbumPriceInCents<=0){
content.removeTokenBlock('WebBlock');
}else{
if(disc.addMissingTracksCount<=0){
content.getTokenBlock('WebBlock').removeTokenBlock('WebBuyBlock');
content.replaceToken('webDisabled','Disabled');
}else{
content.getTokenBlock('WebBlock').removeTokenBlock('WebCheckBlock');
}
}
if(data.whichPrice=='webOnly'||disc.downloadAlbumPriceInCents<=0){
content.removeTokenBlock('MP3Block');
}else{
if(disc.downloadMissingTracksCount<=0){
content.getTokenBlock('MP3Block').removeTokenBlock('MP3BuyBlock');
content.replaceToken('mp3Disabled','Disabled');
}else{
content.getTokenBlock('MP3Block').removeTokenBlock('MP3CheckBlock');
}
}
new widgets.core.ShadowBox({
renderTargetId:'oneAlbumContent_'+this.oneAlbumModuleIndex,
content:content.compose()}).render();

this.albumCache[disc.id]=disc;

},

renderTwoAlbums:function(data){
var disc1=data.discs[0];
var disc2=data.discs[1];
var t=$T(lt.CustomPageWidget.twoAlbums)
.replaceToken('index',this.twoAlbumsModuleIndex);
this.renderIntoDom(t);

var content='';
if(data.left.imgShow){
content=$T(lt.CustomPageWidget.twoAlbumsImageItem)
.replaceTokensWithBean('item',data.left)
.replaceToken('trackingId','customPageTwoAlbum.'+this.pageId+'.'+this.twoAlbumsModuleIndex+'.'+'left');
}else{
content=$T(lt.CustomPageWidget.twoAlbumsItem)
.replaceTokensWithBean('item',data.left)
.replaceTokensWithBean('disc',disc1)
.replaceToken('webPrice',mojo.util.formatPrice(disc1.webAlbumPriceInCents))
.replaceToken('mp3Price',mojo.util.formatPrice(disc1.downloadAlbumPriceInCents))
.replaceToken('numPriceCols',data.left.whichPrice=='mp3Only'||data.left.whichPrice=='webOnly'||disc1.webAlbumPriceInCents<=0||disc1.downloadAlbumPriceInCents<=0?1:2)
.replaceToken('priceTableWidth',data.left.whichPrice=='mp3Only'||data.left.whichPrice=='webOnly'||disc1.webAlbumPriceInCents<=0||disc1.downloadAlbumPriceInCents<=0?116:232)
.removeTokenBlock('PriceTitleBlock',!data.left.priceTitle);
if(data.left.whichPrice=='mp3Only'||disc1.webAlbumPriceInCents<=0){
content.removeTokenBlock('WebBlock');
}else{
if(disc1.addMissingTracksCount<=0){
content.getTokenBlock('WebBlock').removeTokenBlock('WebBuyBlock');
content.replaceToken('webDisabled','Disabled');
}else{
content.getTokenBlock('WebBlock').removeTokenBlock('WebCheckBlock');
}
}
if(data.left.whichPrice=='webOnly'||disc1.downloadAlbumPriceInCents<=0){
content.removeTokenBlock('MP3Block');
}else{
if(disc1.downloadMissingTracksCount<=0){
content.getTokenBlock('MP3Block').removeTokenBlock('MP3BuyBlock');
content.replaceToken('mp3Disabled','Disabled');
}else{
content.getTokenBlock('MP3Block').removeTokenBlock('MP3CheckBlock');
}
}
this.albumCache[disc1.id]=disc1;
}
new widgets.core.ShadowBox({
renderTargetId:'twoAlbumsContentLeft_'+this.twoAlbumsModuleIndex,
content:content.compose()
}).render();

var content2='';
if(data.right.imgShow){
content2=$T(lt.CustomPageWidget.twoAlbumsImageItem)
.replaceTokensWithBean('item',data.right)
.replaceToken('trackingId','customPageTwoAlbum.'+this.pageId+'.'+this.twoAlbumsModuleIndex+'.'+'right');
}else{
content2=$T(lt.CustomPageWidget.twoAlbumsItem)
.replaceTokensWithBean('item',data.right)
.replaceTokensWithBean('disc',disc2)
.replaceToken('webPrice',mojo.util.formatPrice(disc2.webAlbumPriceInCents))
.replaceToken('mp3Price',mojo.util.formatPrice(disc2.downloadAlbumPriceInCents))
.replaceToken('numPriceCols',data.right.whichPrice=='mp3Only'||data.right.whichPrice=='webOnly'||disc2.webAlbumPriceInCents<=0||disc2.downloadAlbumPriceInCents<=0?1:2)
.replaceToken('priceTableWidth',data.right.whichPrice=='mp3Only'||data.right.whichPrice=='webOnly'||disc2.webAlbumPriceInCents<=0||disc2.downloadAlbumPriceInCents<=0?116:232)
.removeTokenBlock('PriceTitleBlock',!data.right.priceTitle);
if(data.right.whichPrice=='mp3Only'||disc2.webAlbumPriceInCents<=0){
content2.removeTokenBlock('WebBlock');
}else{
if(disc2.addMissingTracksCount<=0){
content2.getTokenBlock('WebBlock').removeTokenBlock('WebBuyBlock');
content2.replaceToken('webDisabled','Disabled');
}else{
content2.getTokenBlock('WebBlock').removeTokenBlock('WebCheckBlock');
}
}
if(data.right.whichPrice=='webOnly'||disc2.downloadAlbumPriceInCents<=0){
content2.removeTokenBlock('MP3Block');
}else{
if(disc2.downloadMissingTracksCount<=0){
content2.getTokenBlock('MP3Block').removeTokenBlock('MP3BuyBlock');
content2.replaceToken('mp3Disabled','Disabled');
}else{
content2.getTokenBlock('MP3Block').removeTokenBlock('MP3CheckBlock');
}
}
this.albumCache[disc2.id]=disc2;
}
new widgets.core.ShadowBox({
renderTargetId:'twoAlbumsContentRight_'+this.twoAlbumsModuleIndex,
content:content2.compose()
}).render();
},

renderCarousel:function(data){
var t=$T(lt.CustomPageWidget.carousel).replaceToken('index',this.carouselIndex);
this.renderIntoDom(t);
var pageTemplate=lt.CustomPageWidget.carouselThumb;

var title=$T(lt.CustomPageWidget.carouselTitle)
.replaceToken('bgColor',data.titleColor?'background-color: '+data.titleColor:'')
.replaceTokensWithBean('module',data);
if(data.imgShow){
title.replaceToken('imagePos'+data.imgPos,
$T(lt.CustomPageWidget.titleImg)
.replaceToken('imgSrc',data.imgUrl)
.replaceToken('top',this.IMG_VERT_TOP+(parseInt(data.imgVerticalTweak)||0))
.replaceToken('id','carousel_'+this.carouselIndex)
.compose());
}
var content={
list:data.discs,
title:title.compose()
};
if(data.moreText&&data.morePath){
content.moreLink={};
content.moreLink.title=data.moreText;
content.moreLink.url='href="javascript:MyMusic.g.gotoPage(\''+data.morePath+'\')"';
}

var w=new widgets.core.Carousel({
renderTargetId:'customPageCarousel_'+this.carouselIndex,
contents:[content],
pageTemplate:pageTemplate,
thumbHeight:165,
itemRenderFunction:function(itemTemplate,item,trackingId){
var mp3Price=item.isFreeMp3?'Free'
:'$'+mojo.util.formatPrice(item.downloadAlbumPriceInCents);
itemTemplate.replaceToken(
'itemContent',
$T(pageTemplate)
.replaceTokensWithBean('item',item)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('webPrice',mojo.util.formatPrice(item.webAlbumPriceInCents))
.replaceToken('mp3Price',mp3Price)
.removeTokenBlock('WebPriceBlock',data.whichPrice=='mp3Only'||data.whichPrice=='none'||item.webAlbumPriceInCents<=0)
.removeTokenBlock('MP3PriceBlock',data.whichPrice=='webOnly'||data.whichPrice=='none'||(item.downloadAlbumPriceInCents<=0&&!item.isFreeMp3))
.removeTokenBlock('')
.compose());
},
numCols:4,
numRows:data.numRows
});
w.render();
if(data.imgShow)$('titleImg_carousel_'+this.carouselIndex).style.left='0px';
},

renderFootnote:function(data){
var t=$T(lt.CustomPageWidget.footnote)
.replaceToken('index',this.footnoteIndex)
.replaceToken('html',data.text);
this.renderIntoDom(t);
},

onPurchaseWebAlbum:function(discId){
var album=this.albumCache[discId];
widgets.store.openBuyWebAlbumDialog(album,mojo.emptyFunction);
},

onPurchaseDownloadAlbum:function(discId){
var album=this.albumCache[discId];

widgets.store.openBuyAlbumDownloadDialog(album,mojo.emptyFunction);
},

onAlbumPriceUpdated:function(disc){
var discId=disc.id;
var webPriceElem=$('customPage_'+discId+'_webPrice');
var webPriceArea=$('customPage_'+discId+'_webPriceArea');
var webBuyButton=$('customPage_'+discId+'_webBuyButton');
if(webPriceArea){
if(disc.addMissingTracksCount==0){
$S(webBuyButton,$TC(lt.CustomPageWidget.miniCheck));
$D(webPriceArea,false);
$AC(webBuyButton,'checkButton');
$DC(webBuyButton,'lbutton');
$AC(webBuyButton,'lbuttonDisabled');
}else{
var webPrice=StoreUtil.getRealWebPrice(disc);
$S(webPriceElem,mojo.util.formatPrice(webPrice));
}
}

var mp3PriceElem=$('customPage_'+discId+'_mp3Price');
var mp3PriceArea=$('customPage_'+discId+'_mp3PriceArea');
var mp3BuyButton=$('customPage_'+discId+'_mp3BuyButton');
if(mp3PriceArea){
if(disc.downloadMissingTracksCount<=0){
$S(mp3BuyButton,$TC(lt.CustomPageWidget.miniCheck));
$D(mp3PriceArea,false);
$AC(mp3BuyButton,'checkButton');
$DC(mp3BuyButton,'lbutton');
$AC(mp3BuyButton,'lbuttonDisabled');
}else{
var mp3Price=StoreUtil.getRealDownloadPrice(disc);
$S(mp3PriceElem,mojo.util.formatPrice(mp3Price));
}
}
},

albumPriceListener_GetAlbumById:function(discId){
return this.albumCache[discId];
}

};
Object.extend(CustomPageWidget.prototype,AlbumPriceListener,true);

MixDrawer=Class.create();
MixDrawer.prototype={
MORE_LIMIT:3,
DEFAULT_SHOWING:15,
initialize:function(params){
this.type=params.type;
this.artistName=params.artistName;
this.Q=params.Q;
this.displayValue=params.displayValue;
this.moreCount=0;
this.numShowing=this.DEFAULT_SHOWING;

this.addSongWidgetListener_Init();

MixDrawer.g=this;
},

open:function(){
var div=PlayerDrawer.g.open(null,'mix');
$T(lt.MixDrawer.loading,div.id)
.replaceToken('what',this.displayValue)
.compose(),

this._getSongs(true);
lala.Track.clientPageInteraction('widget.Mix.open');
},

onRemix:function(){
lala.Track.clientPageInteraction('widget.Mix.remix');
if(this.numShowing<=0)this.numShowing=this.DEFAULT_SHOWING;
this._getSongs(false);
},

_getSongs:function(doWait){
var self=this;
if(this.type=='Q'){
api.SearchUtils.getMixWithQ(
this.Q,
function(res){
self._render(doWait,res.data);
});
}else{
api.SearchUtils.getMixWithArtist(
this.artistName,
function(res){



self._render(doWait,res.data);
});
}
},

_renderSongBlock:function(r,songs,startIndex){
var totalDuration=0;
var numPartial=0;
var pricePartial=0;
songs.leach(function(item,index){
r.replaceTokensWithBean('item',item)
.replaceToken('num',startIndex+index+1)
.replaceToken('songIndex',startIndex+index);
if(item.isDigied){
r.replaceTokenBlock('AddActionBlock',widgets.SongList.IN_ICON);
r.replaceToken('addTooltip',widgets.SongList.TIP_BOUGHT);
}else{
r.replaceToken('addTooltip',widgets.SongList.TIP_BUY);
}
if(item.isRestrictedListen){
numPartial++;
pricePartial+=item.addPrice;
}else{
r.removeTokenBlock('AlertBlock');
}
r.next();
totalDuration+=item.duration;
});
return{totalDuration:totalDuration,
numPartial:numPartial,
pricePartial:pricePartial};
},

_render:function(doWait,songs,fromDelete){
var divId=PlayerDrawer.g.getContentDiv().id;
if(this.numShowing<=0||songs.length<=0){
if(fromDelete){
$T(lt.MixDrawer.mixEmptyFromDelete,divId)
.replaceToken('moreDisabled','Disabled')
.replaceToken('playDisabled','Disabled')
.replaceToken('queueDisabled','Disabled')
.replaceToken('numSongs',0)
.replaceToken('duration',mojo.util.secondsToTime(0))
.compose();
}else{
$TC(lt.MixDrawer.mixEmpty,divId);
}
return;
}

if(this.numShowing>songs.length)this.numShowing=songs.length;
var t=$T(lt.MixDrawer.mixDiv,divId)
.replaceToken('numSongs',this.numShowing)
.replaceToken('widthStyle',this.numShowing>this.DEFAULT_SHOWING&&mojo.IE?'width:'+(mojo.IE7?388:398)+' px;':'');
var r=t.getTokenBlock('RowBlock');
var obj=this._renderSongBlock(r,songs.slice(0,this.numShowing),0);
var totalDuration=obj.totalDuration;
t.replaceToken('duration',mojo.util.secondsToTime(totalDuration));
if(obj.numPartial>0){
t.replaceToken('mix30Sec',this.renderPartialMsg(obj.numPartial,obj.pricePartial));
}else{
t.replaceToken('mix30SecDisplay','none');
}
this.numPartial=obj.numPartial;
this.pricePartial=obj.pricePartial;
var m=t.getTokenBlock('MoreBlock');
var rm=m.getTokenBlock('MoreRowBlock');
var start=this.numShowing;
var newStart;
this.newDurations=[];
this.newNumPartial=[];
this.newPricePartial=[];
t.replaceToken('moreDisabled',start+5>=songs.length?'Disabled':'');
for(var i=0;i<this.MORE_LIMIT&&start+i*5<songs.length;i++){
newStart=start+i*5;
m.replaceToken('index',i);
var moreObj=this._renderSongBlock(rm,songs.slice(newStart,newStart+5),newStart);
var durationBlock=moreObj.totalDuration;
totalDuration+=durationBlock;
obj.numPartial+=moreObj.numPartial;
obj.pricePartial+=moreObj.pricePartial;
this.newDurations.push(totalDuration);
this.newNumPartial.push(obj.numPartial);
this.newPricePartial.push(obj.pricePartial);
m.next();
}
this.numMore=i;
if(doWait){
window.setTimeout(function(){
t.compose();
},1000);
}else{
t.compose();
}
this.songs=songs;
this.moreCount=0;

if(this.numPartial>0){
lala.Track.clientPage(
'widget.Mix.showingRestrictedSongs.'
+((this.numPartial>1)
?'moreThanOne':'one'));
}
},

renderPartialMsg:function(numPartial,pricePartial){
return numPartial<=0
?''
:numPartial==1
?$TC(lt.MixDrawer.thirtySecMsgOne)
:numPartial==this.numShowing
?$T(lt.MixDrawer.thirtySecMsgAll)
.replaceToken('numPartialSongs',numPartial)
.replaceToken('partialS',numPartial==1?'':'s')
.replaceToken('price',mojo.util.formatPrice(pricePartial))
.removeTokenBlock('PriceBlock',api.MicroWallet.credits>=numPartial)
.removeTokenBlock('CreditBlock',api.MicroWallet.credits<numPartial)
.compose()
:$T(lt.MixDrawer.thirtySecMsg)
.replaceToken('numPartialSongs',numPartial)
.replaceToken('partialS',numPartial==1?'':'s')
.replaceToken('price',mojo.util.formatPrice(pricePartial))
.removeTokenBlock('PriceBlock',api.MicroWallet.credits>=numPartial)
.removeTokenBlock('CreditBlock',api.MicroWallet.credits<numPartial)
.compose();
},

onClose:function(){
PlayerDrawer.g.close();
},

playSongs:function(){
lala.Track.clientPageInteraction('widget.Mix.play');
Player.g.playCustomBag(this.songs.slice(0,this.numShowing).lpluck('songLalaId'),this.displayValue+' Mix','mixDrawer');
this.onClose();
},

onQueue:function(){
lala.Track.clientPageInteraction('widget.Mix.queue');
Player.g.queueCustomBag(this.songs.slice(0,this.numShowing).lpluck('songLalaId'),this.displayValue+' Mix','mixDrawer');
this.onClose();
},

onMore:function(){
if(this.moreCount>=this.numMore)return;
var id='moreMix_'+this.moreCount;
$D(id);
mojo.geometry.scrollIntoView(id,'mixBottom');
if(mojo.IE)mojo.geometry.setBounds('mixSongList',{width:mojo.IE7?388:398});
this.numShowing=this.numShowing+5>=this.songs.length
?this.songs.length:this.numShowing+5;
$S('mixNumSongs',this.numShowing);
$S('mixDuration',mojo.util.secondsToTime(this.newDurations[this.moreCount]));
this.numPartial=this.newNumPartial[this.moreCount];
this.pricePartial=this.newPricePartial[this.moreCount];
this.renderPartialAndDisplay();
this.moreCount++;
if(this.moreCount>=this.numMore){
$AC('mixDrawerMoreButton','lbuttonDisabled');
$DC('mixDrawerMoreButton','lbutton');
}
lala.Track.clientPageInteraction('widget.Mix.addMore');
},

renderPartialAndDisplay:function(){
var partial=this.renderPartialMsg(this.numPartial,this.pricePartial);
$S('mix30SecMsgDiv',partial);
$D('mix30SecMsgDiv',partial!='');
},

onAdd:function(index){
var song=this.songs[index];
frontend.buyWebSong(song);
lala.Track.clientPageInteraction(
'widget.Mix.addWebSong.'
+(song.isRestrictedListen?'restricted':'unrestricted'));
},

onDelete:function(index){
this.songs.lremoveAt(index);
this.numShowing--;
this._render(false,this.songs,true);
lala.Track.clientPageInteraction('widget.Mix.deleteSong');
},

addSongWidgetListener_GetSongByLinkLalaId:function(linkSongLalaId){
return this.songs.lfindIf('linkSongLalaId',linkSongLalaId);
},

addSongWidgetListener_SongAddedCallback:function(updatedSong){
var elem=$('mixBuySong_'+updatedSong.id);
if(!elem)return;

elem.innerHTML=widgets.SongList.IN_ICON;

if($('mixAlert_'+updatedSong.id)){

$S('mixAlert_'+updatedSong.id,'');
this.numPartial--;
this.pricePartial-=updatedSong.addPrice;
this.renderPartialAndDisplay();
}
},

buyPartial:function(){
lala.Track.clientPageInteraction('widget.Mix.openAddRestrictedWebSongs');
var showingSongs=this.songs.slice(0,this.numShowing);
widgets.store.openBuyWebSongsDialog(showingSongs.lfindIf('isRestrictedListen',true));
},

removePartial:function(){
var firstHalf=this.songs.slice(0,this.numShowing);
var secondHalf=this.songs.slice(this.numShowing);
firstHalf.lremoveIf('isRestrictedListen',true);
this.songs=firstHalf.concat(secondHalf);
this.numShowing-=this.numPartial;
this._render(false,this.songs,true);
lala.Track.clientPageInteraction('widget.Mix.removeRestrictedWebSongs');
}
};
Object.extend(MixDrawer.prototype,AddSongWidgetListener,true);


widgets.core.AlbumBuy=Class.create();
widgets.core.AlbumBuy.all={};
widgets.core.AlbumBuy.prototype={
initialize:function(params){
this.disc=params.disc;
this.renderTargetId=params.renderTargetId;
this.wiid='albumBuyWidget_'+mojo.idGenerator++;
this.customText=params.customText;
this.customTitle=params.customTitle;
this.clickTrackingId=params.trackingId||'widget.AlbumBuy';
this.dontLink=params.dontLink;

widgets.core.AlbumBuy.all[this.wiid]=this;
},

render:function(){
var disc=this.disc;
var content=$T(lt.AlbumBuyWidget.main,this.renderTargetId)
.replaceTokensWithBean('disc',disc)
.replaceToken('webPrice',mojo.util.formatPrice(StoreUtil.getRealWebPrice(disc)))
.replaceToken('mp3Price',mojo.util.formatPrice(StoreUtil.getRealDownloadPrice(disc)))
.removeTokenBlock('LinkBlock',this.dontLink)
.removeTokenBlock('ImgOnlyBlock',!this.dontLink)
.replaceToken('wiid',this.wiid);
if(this.customTitle){
content.replaceTokenBlock('TitleBlock',this.customTitle);
}
if(this.customText){
content.replaceTokenBlock('RightBlock',this.customText);
}else{
var right=content.getTokenBlock('RightBlock');
var priceBlock=right.getTokenBlock('PriceTable');
var cantBuyWeb=disc.webAlbumPriceInCents<=0;
var cantBuyMP3=disc.downloadAlbumPriceInCents<=0;
if(cantBuyWeb&&cantBuyMP3){
right.removeTokenBlock('PriceTable');
}else{
if(cantBuyWeb){
priceBlock.removeTokenBlock('WebBlock');
}else{
if(disc.addMissingTracksCount<=0){
priceBlock.getTokenBlock('WebBlock').removeTokenBlock('WebBuyBlock');
content.replaceToken('webDisabled','Disabled');
}else{
priceBlock.getTokenBlock('WebBlock').removeTokenBlock('WebCheckBlock');
}
}
if(cantBuyMP3){
priceBlock.removeTokenBlock('MP3Block');
}else{
if(disc.downloadMissingTracksCount<=0){
priceBlock.getTokenBlock('MP3Block').removeTokenBlock('MP3BuyBlock');
content.replaceToken('mp3Disabled','Disabled');
}else{
priceBlock.getTokenBlock('MP3Block').removeTokenBlock('MP3CheckBlock');
}
}
}
}
content.compose();

this.albumPriceListener_Init(this.onAlbumPriceUpdated.lbind(this));
},

onPurchaseWeb:function(){
lala.Track.clientPageInteraction(this.clickTrackingId+'.openBuy.webAlbum');
widgets.store.openBuyWebAlbumDialog(this.disc,mojo.emptyFunction);
},

onPurchaseDownload:function(){
lala.Track.clientPageInteraction(this.clickTrackingId+'.openBuy.downloadAlbum');
widgets.store.openBuyAlbumDownloadDialog(this.disc,mojo.emptyFunction);
},

onAlbumPriceUpdated:function(disc){
var discId=disc.id;
var webPriceElem=$('albumBuyWidget_'+discId+'_webPrice');
var webPriceArea=$('albumBuyWidget_'+discId+'_webPriceArea');
var webBuyButton=$('albumBuyWidget_'+discId+'_webBuyButton');
if(webPriceArea){
if(disc.addMissingTracksCount==0){
$S(webBuyButton,$TC(lt.CustomPageWidget.miniCheck));
$AC(webBuyButton,'checkButton');
$DC(webBuyButton,'lbutton');
$AC(webBuyButton,'lbuttonDisabled');
$D(webPriceArea,false);
}else{
var webPrice=StoreUtil.getRealWebPrice(disc);
$S(webPriceElem,mojo.util.formatPrice(webPrice));
}
}

var mp3PriceElem=$('albumBuyWidget_'+discId+'_mp3Price');
var mp3PriceArea=$('albumBuyWidget_'+discId+'_mp3PriceArea');
var mp3BuyButton=$('albumBuyWidget_'+discId+'_mp3BuyButton');
if(mp3PriceArea){
if(disc.downloadMissingTracksCount<=0){
$S(mp3BuyButton,$TC(lt.CustomPageWidget.miniCheck));
$AC(mp3BuyButton,'checkButton');
$DC(mp3BuyButton,'lbutton');
$AC(mp3BuyButton,'lbuttonDisabled');
$D(mp3PriceArea,false);
}else{
var mp3Price=StoreUtil.getRealDownloadPrice(disc);
$S(mp3PriceElem,mojo.util.formatPrice(mp3Price));
}
}
},

albumPriceListener_GetAlbumById:function(discId){
if(discId!=this.disc.id)return null;
return this.disc;
}
};
Object.extend(widgets.core.AlbumBuy.prototype,AlbumPriceListener,true);

ActionButtons=Class.create();
ActionButtons.prototype={
initialize:function(params){
if(!params)params={};
this._wiid='actionButtons_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.onShout=params.onShout||mojo.emptyFunction;
this.onShare=params.onShare||mojo.emptyFunction;
this.onEmbed=params.onEmbed||mojo.emptyFunction;
this.onGetUrl=params.onGetUrl||mojo.emptyFunction;
this.disableSharing=params.disableSharing;
this.type=params.type;
this.itemId=params.itemId;

if(this.disableSharing){
this.onShout=this.onShare=this.onEmbed=mojo.emptyFunction;
}

ActionButtons.all[this._wiid]=this;
},

render:function(){
$S(this.renderTargetId,this.getHtml());
},

getHtml:function(){
var t=$T(lt.ActionButtons.buttons)
.replaceToken('wiid',this._wiid)
.replaceToken('shoutTooltip',ActionButtons.TOOLTIP.SHOUT)
.replaceToken('shareTooltip',ActionButtons.TOOLTIP.SHARE)
.replaceToken('bookmarkTooltip',ActionButtons.TOOLTIP.BOOKMARK)
.replaceToken('embedTooltip',ActionButtons.TOOLTIP.EMBED)
.replaceToken('urlTooltip',ActionButtons.TOOLTIP.URL)
.replaceToken('shareToolbarHideBookmark',lala.isBookmarksEnabled
?'':'shareToolbarHideBookmark');
if(this.disableSharing){
t.replaceToken('disabled','disabled')
.replaceToken('shoutTooltip',ActionButtons.TOOLTIP.DISABLED)
.replaceToken('shareTooltip',ActionButtons.TOOLTIP.DISABLED)
.replaceToken('embedTooltip',ActionButtons.TOOLTIP.DISABLED);
}
return t.compose();
},

onBookmark:function(elem){
api.Bookmarks['add'+this.type.ltoFirstUpperCase()](this.itemId,function(res){
elem=mojo.dom.getAncestorByTagName(elem,'A');
elem.className='bookmarked';
elem.onclick='';
});
lala.Track.clientPageInteraction('shareActionsBar.bookmark');
}
};
Object.extend(ActionButtons,{
all:{},

TOOLTIP:{
SHOUT:'Shout about this on Facebook, Twitter, and Lala',
SHARE:'Send a recommendation to friends',
BOOKMARK:'Bookmark this for future reference',
EMBED:'Embed this as a widget on another website',
URL:'Get a short URL for easy sharing',
DISABLED:'Unavailable for unlicensed content'
},

popupUrlDialog:function(url){
var URLDialog=new MojoDialog({
id:'urlDialog',
title:''
});
URLDialog.open($TC(lt.Share.shareURL));

$('shareURLBox').value=url;
$('shareURLBox').select();
}
});

ActionLinks={
getHtml:function(params){
var t=$T(lt.ActionLinks.links);
t.dateFormatString='%b %e';
if(params.timestamp){
var d=new Date();
d.setTime(parseInt(params.timestamp));
t.replaceToken('bookmarkDate',d);
}
t=t.keepTokenBlock('AddBookmarkLink',!params.bookmarkId&&lala.isBookmarksEnabled)
.keepTokenBlock('SongActionsBlock',params.songActions)
.removeTokenBlock('ShareBlock',params.songActions&&!params.songActions.share)
.replaceToken('id',params.id)
.replaceToken('type',params.type)
.replaceToken('getShareObj',params.getShareObj)
.replaceToken('thisContext',params.thisContext);


t.getTokenBlock('ShareBlock')
.keepTokenBlock('DownArrowBlock',params.songActions);
if(params.songActions){
t.getTokenBlock('SongActionsBlock')
.keepTokenBlock('PlaylistBlock',params.songActions.playlist)
.replaceToken('playlistFunction',params.songActions.playlist)
.keepTokenBlock('VideoBlock',params.songActions.video)
.replaceToken('videoFunction',params.songActions.video)
.replaceToken('index',params.songActions.index);
}else{
t=t.removeTokenBlock('SongActions')
.removeTokenBlock('SongActions');
}
return t.compose();
},

onBookmark:function(id,type,anchor){
api.Bookmarks['add'+type.ltoFirstUpperCase()](id,function(res){
anchor=mojo.dom.getAncestorByTagName(anchor,'A');

$AC(anchor,'bookmarked');
anchor.onclick='';
});
},

onRemoveBookmark:function(bookmarkId){
api.Bookmarks.deleteBookmark(bookmarkId,mojo.emptyFunction);
},



onShare:function(id,type,thisContext,getShareObj,event){
var trackingId='share'+type.ltoFirstUpperCase();
if(frontend.requiresSignin({trackingId:trackingId}))return;



if(type=='song'){
getShareObj.call(thisContext,id,event);
}else{var shareObj=getShareObj.call(thisContext,id);
widgets.Share.dialogShareWidget=new widgets.Share({
shareObj:shareObj,
shareType:type
});
widgets.Share.openRecoDialog(shareObj,type);
}
},


onPlaylistClick:function(index,thisContext,playlistFunction,event){
playlistFunction.call(thisContext,index,event);
},


onVideoClick:function(index,thisContext,videoFunction,event){
videoFunction.call(thisContext,index,event);
}
};


























































ITSMediaPlayer={};
ITSMediaPlayer._qtVersion='undefined';

ITSMediaPlayer.probe=function _probe(){
return ITSMediaPlayer.quicktimeVersionStringForReporting();
};

ITSMediaPlayer._canDetectPlugins=function _canDetectPlugins(){



if(ITSMediaPlayer.detectableWithVB||(navigator.plugins&&navigator.plugins.length>0)){
return true;
}else{
return false;
}
};

ITSMediaPlayer._detectPlugin=function _detectPlugin(){

var daPlugins=ITSMediaPlayer._detectPlugin.arguments;

var pluginFound=false;

if(navigator.plugins&&navigator.plugins.length>0){
var pluginsArrayLength=navigator.plugins.length;

for(pluginsArrayCounter=0;pluginsArrayCounter<pluginsArrayLength;pluginsArrayCounter++){

var numFound=0;
for(namesCounter=0;namesCounter<daPlugins.length;namesCounter++){

if((navigator.plugins[pluginsArrayCounter].name.indexOf(daPlugins[namesCounter])>=0)||
(navigator.plugins[pluginsArrayCounter].description.indexOf(daPlugins[namesCounter])>=0)){

numFound++;
}
}


if(numFound==daPlugins.length){
pluginFound=true;

break;
}
}
}
return pluginFound;
};

ITSMediaPlayer._detectQuickTime=function _detectQuickTime(redirectURL,redirectIfFound){
var pluginFound=ITSMediaPlayer._detectPlugin('QuickTime');



if(!pluginFound&&ITSMediaPlayer.detectableWithVB){
pluginFound=detectQuickTimeActiveXControl();
}

return ITSMediaPlayer._redirectCheck(pluginFound,redirectURL,redirectIfFound);
};



ITSMediaPlayer.quicktimeVersionStringForReporting=function reportQuicktimePluginVersion(){

var qtVersion=(ITSMediaPlayer._canDetectPlugins)?ITSMediaPlayer._quickTimeVersion():'unknown';
if('undefined'===qtVersion){qtVersion="not_installed";}
return qtVersion;
};

ITSMediaPlayer._quickTimeVersion=function _quickTimeVersion(){
if(ITSMediaPlayer._qtVersion==='undefined'){
var qtExpression=new RegExp("([0-9])\.([0-9])\.([0-9])");
if(navigator.plugins&&navigator.plugins.length){
for(var i=0;i<navigator.plugins.length&&ITSMediaPlayer._qtVersion==='undefined';i++){

var match=navigator.plugins[i].name.match(/quicktime\D*([\.\d]*)/i);
if(match&&match[1]){
var qtv=match[1];
if(qtv){
qtv=qtExpression.exec(qtv);
var digit1=0,digit2=0,digit3=0;
if(RegExp.$1){digit1=parseInt(RegExp.$1)};
if(RegExp.$2){digit2=parseInt(RegExp.$2)};
if(RegExp.$3){digit3=parseInt(RegExp.$3)};
ITSMediaPlayer._qtVersion=(digit1*100)+(digit2*10)+digit3;
}
}
}
}else if(typeof(execScript)!='undefined'){
ieQTVersion=null;
execScript('on error resume next: ieQTVersion = CreateObject("QuickTimeCheckObject.QuickTimeCheck.1").QuickTimeVersion','VBScript');
if(ieQTVersion){
ITSMediaPlayer._qtVersion=(ieQTVersion>>16).toString(16);
}
}
}
return ITSMediaPlayer._qtVersion;
};
qtv=ITSMediaPlayer._quickTimeVersion;




NewAPage=Class.create();
NewAPage.ALL_SORT_OPTIONS=[
{id:'mostListens',name:'Most listens',key:'Listens7',dir:'Desc'},
{id:'myListens',name:'My listens',key:'UserListens',dir:'Desc'},
{id:'webBestsellers',name:'Bestsellers',key:'WebAdds',dir:'Desc'},
{id:'mp3Bestsellers',name:'Bestsellers',key:'Buys',dir:'Desc'},
{id:'rank',name:'Rank',key:'Rank',dir:'Asc'},
{id:'risers',name:'Risers',key:'Trend',dir:'Asc'},
{id:'fallers',name:'Fallers',key:'Trend',dir:'Desc'},
{id:'relevance',name:'Relevance',key:'Relevance',dir:'Desc'},
{id:'releaseDate',name:'Release date',key:'Release',dir:'Desc'},
{id:'newest',name:'Newest',key:'Year',dir:'Desc'},
{id:'myNewest',name:'Newest',key:'AddedTimestamp',dir:'Desc'},
{id:'oldest',name:'Oldest',key:'Year',dir:'Asc'},
{id:'myOldest',name:'Oldest',key:'AddedTimestamp',dir:'Asc'},
{id:'topRated',name:'Top rated',key:'Rating',dir:'Desc'},
{id:'myTopRated',name:'My top rated',key:'Rating',dir:'Desc'}
];
NewAPage.prototype={
renderAPage:function(config){
var self=this;

MyMusic.g.setDocumentTitle(config.title);
var t=$T(lt.NewAPage.main);
t.replaceToken('pageTitle',config.title);
t.replaceToken('link',config.titleLink);
t.keepTokenBlock('TitleBlock',!config.titleLink);
t.keepTokenBlock('TitleLinkBlock',config.titleLink);

this.renderIntoContentRegion(t);

this.renderAPageTabs(config,'aPageTabsContainer','aPageTabsContent');
},

renderAPageTabs:function(config,containerId,tabContentId,usePipedTabs,openTabId){
this.aPageIsFirstRender=true;
this.aPageDefAllFilter='All';
NewAPage.g=this;

this.tabs=mojo.newtabs.create({
id:'aPage',
divTabsId:containerId,
divTabsContentId:tabContentId,
usePipedTabs:usePipedTabs});
this.tabs.onTabClick=this._onTabClick.lbind(this);


this.preprocessAPageTabConfigs(config.tabs);
this.tabs.activate(openTabId||config.pathParts.llast());
},

preprocessAPageTabConfigs:function(allTabConfigs){
var self=this;

var currPath=MyMusic.g.getPagePath();
currPath=currPath.substring(0,currPath.indexOf('more')+4);

allTabConfigs.leach(function(tabConfig){
var path=tabConfig.path||'/'+currPath+'/'+tabConfig.id;
var tab=self.tabs.add({id:tabConfig.id,title:tabConfig.title,path:path});
tabConfig.sortOptions=[];
if(tabConfig.sort){
tabConfig.sort.leach(function(key){
tabConfig.sortOptions.push(NewAPage.ALL_SORT_OPTIONS.lfindObject("id",key));
});


var firstSortOption=tabConfig.sortOptions[0];
var defSortOrder=tabConfig.defaultSortOrder;
mojo.assert(defSortOrder,
"defaultSortOrder is required");
mojo.assert(firstSortOption.key==defSortOrder.key,
"defaultSortOrder doesn't match first sort option: "
+firstSortOption.key+' != '+defSortOrder.key);
mojo.assert(firstSortOption.dir==defSortOrder.dir,
"defaultSortOrder doesn't match first sort option: "
+firstSortOption.dir+' != '+defSortOrder.dir);
}

if(tabConfig.histos){
tabConfig.histoOptionsById={};
tabConfig.histos.leach(function(key){

if(key=='Genre'&&(self.genre||self.subGenre))return;

if(key=='Subgenre'&&self.subGenre)return;

tabConfig.histoOptionsById[key]=true;
});
if(mojo.util.isEmpty(tabConfig.histoOptionsById)){
tabConfig.histoOptionsById=null;
}
}
tab.aPageConfig=tabConfig;
})
},

renderAPageSongsTab:function(res,pagedList,histos,config){
config.renderTargetId=this.aPageRenderTargetId;
config.customFrameClass='lclearTopBorder';
config.emptyText=lt.NewAPage.emptySongs;

new widgets.SongList(config).render(pagedList);
this._renderPaginators(res,pagedList);
this._renderControls(histos);
},

renderAPageAlbumsTab:function(res,pagedList,histos,config){
var self=this;

config.renderTargetId=this.aPageRenderTargetId;
config.customFrameClass='lclearTopBorder';
config.noAlbumsTemplate=lt.NewAPage.emptyAlbums;
config.toggleId='aPageAlbumListToggle';
if(!config.layout)config.layout='list';

var w=new widgets.AlbumList(config);
w.onViewModeToggledCallback=function(newMode){
self.aPageAlbumsToggleMode=newMode;
self._pushBackEvent();
};

w.render(pagedList,this.aPageAlbumsToggleMode||lala.params.albumView);
this._renderPaginators(res,pagedList);
this._renderControls(histos);
},

renderAPageArtistsTab:function(res,pagedList,histos,config){
config.renderTargetId=this.aPageRenderTargetId;
new widgets.ArtistList(config).render(pagedList);
this._renderPaginators(res,pagedList);
this._renderControls(histos);
},

renderAPagePlaylistsTab:function(res,pagedList,histos,config){
config.renderTargetId=this.aPageRenderTargetId;
config.layout='wide';

new widgets.PlaylistList(config).render(pagedList);

this._renderPaginators(res,pagedList);
this._renderControls(histos);
},

renderAPageFeaturedMembersTab:function(res,pagedList,histos,config){
config.renderTargetId=this.aPageRenderTargetId;
new InfluencerListWidget(config).render(pagedList);

this._renderPaginators(res,pagedList);
this._renderControls(histos);
},

getAPageQueryParams:function(baseQ,searchType){
var state=this.getAPageState();
var Q=baseQ;
Q+=' '+state.filterQ;

if(state.keywords){
var preQ=state.keywords+' ';
if(searchType=='songs'){
preQ+=' rank:song';
}else if(searchType=='albums'){
preQ+=' rank:album';
}
Q=preQ+' '+Q;
}

return{Q:Q,
sortKey:state.sortKey,
sortDir:state.sortDir,
histos:state.histos,
keywords:state.keywords,
count:24,
skip:state.skip};
},

getAPageState:function(){
var tabConfig=this._getTabConfig();


var filterQ='';
var histosToLoad=[];
if(tabConfig.histoOptionsById){


if(tabConfig.histoOptionsById.Genre&&!this.aPageHistos.Genre){
histosToLoad.push('Genre');
}
if(tabConfig.histoOptionsById.Subgenre
&&!this.aPageHistos.Subgenre
&&(this.aPageHistos.selectedGenre||(this.genre&&!this.subGenre))){
histosToLoad.push('Subgenre');
}
if(tabConfig.histoOptionsById.AlbumType&&!this.aPageHistos.AlbumType){
histosToLoad.push('AlbumType');
}


if(this.aPageHistos.selectedGenre){
filterQ+=' genre: "'+this.aPageHistos.selectedGenre+'"';
}
if(this.aPageHistos.selectedSubgenre){
filterQ+=' subgenre: "'+this.aPageHistos.selectedSubgenre+'"';
}
if(this.aPageHistos.selectedAlbumType){
filterQ+=' type: "'+this.aPageHistos.selectedAlbumType+'"';
}
}
return{
skip:this.aPagePaginator.skipped,
sortKey:this.aPageSearchKeywords
?'Relevance'
:this.aPageSortOption?this.aPageSortOption.key:null,
sortDir:this.aPageSearchKeywords
?'Desc'
:this.aPageSortOption?this.aPageSortOption.dir:null,
keywords:this.aPageSearchKeywords,
histos:histosToLoad,
filterQ:filterQ.ltrim()
};
},

_pushBackEvent:function(){
var skipped=this.aPagePaginator.skipped||null;



var pagedPath=mojo.url.getHash(null,true);
pagedPath=pagedPath.replace(/&/g,'%26');

var params={
skip:skipped,
sort:this.aPageSortOption?this.aPageSortOption.id:null,
genre:this.aPageHistos.selectedGenre,
subgenre:this.aPageHistos.selectedSubgenre,
keywords:this.aPageSearchKeywords,
albumType:this.aPageHistos.selectedAlbumType,
albumView:this.aPageAlbumsToggleMode=='grid'?'grid':null
};
MyMusic.g.history.push(new PageTurnEvent(pagedPath,params));
},

_getTabConfig:function(){
return this.tabs.active.aPageConfig;
},

_onTabClick:function(){
var tabConfig=this._getTabConfig();
if(tabConfig.rogueTabOnClick){





tabConfig.rogueTabOnClick();
this.aPageIsFirstRender=true;
return;
}

if(this.aPageIsFirstRender){
this._initAPage();
}else{
this._resetTabState();
}

this._loadTab();
this.aPageIsFirstRender=false;
},

_initAPage:function(){
var self=this;

var layout=new widgets.core.TwoColumn({
renderTargetId:this.tabs.active.contentId,
id:'aPageTwoCol',
classes:'aPageWidget'});
layout.render();

$TC(lt.NewAPage.col1,layout.col2);
$TC(lt.NewAPage.col2,layout.col1);

this.aPageHistos={};
this.aPageRenderTargetId='aPageContent';

this.aPagePaginator=new widgets.core.Paginator(
'aPagePaginator_bottom','big',
'aPagePaginator_top','lite',true,true);
this.aPagePaginator.onPagedCallback=function(){
self._pushBackEvent();
};


if(lala.params.skip){
this.aPagePaginator.skipped=parseInt(lala.params.skip);
}
if(lala.params.sort){
this.aPageSortOption=NewAPage.ALL_SORT_OPTIONS.lfindObject("id",lala.params.sort);
}
if(lala.params.genre){
this.aPageHistos.selectedGenre=lala.params.genre;
}
if(lala.params.subgenre){
this.aPageHistos.selectedSubgenre=lala.params.subgenre;
}
if(lala.params.albumType){
this.aPageHistos.selectedAlbumType=lala.params.albumType;
}
if(lala.params.keywords){
this.aPageSearchKeywords=lala.params.keywords;
}
},


_resetTabState:function(){
$('aPageAlbumListToggle').innerHTML='';
$('aPageSort').innerHTML='';
$('aPageFilterColumn').innerHTML='';

this.aPageAlbumsToggleMode=null;
this.aPageSortOption=null;
this.aPageSearchKeywords=null;
this.aPagePaginator.skipped=0;
this.aPageHistos={};
},

_loadTab:function(){


if(!this.aPageSortOption){
var sortOptions=this._getTabConfig().sortOptions;
if(sortOptions.length>0){
this.aPageSortOption=NewAPage.ALL_SORT_OPTIONS.lfindObject("id",sortOptions[0].id);
}
}

var tabId=this.tabs.active.id;
var methodName='onLoadAPage'+tabId.ltoFirstUpperCase()+'Tab';
this[methodName](this.tabs.active.contentId);
},

_renderPaginators:function(res,pagedList){
this.aPagePaginator.renderTwo(res,pagedList);
},

_renderControls:function(loadedHistos){
var self=this;
var tabConfig=this._getTabConfig();

this._renderSort(tabConfig);


if(!tabConfig.histoOptionsById&&tabConfig.disableSearch){
return;
}


var rb=new widgets.core.RoundedBox({
renderTargetId:'aPageFilterColumn'
}).render();


var t=$T(lt.NewAPage.filters,rb.contentId);
if(tabConfig.disableSearch){
t.removeTokenBlock('SearchBlock');
}else{
t.replaceToken('searchClearClass',this.aPageSearchKeywords?'':'lhidden');
t.replaceToken('searchButtonText',mojo.FF?'Go':'&nbsp;Go&nbsp;');
}
t.compose();


if(!tabConfig.disableSearch){
mojo.input.onEnterKey('aPageSearchBox',this.onFilterBySearch.lbind(this));
if(this.aPageSearchKeywords){
$('aPageSearchBox').value=this.aPageSearchKeywords;
}
}

this._renderHistosSection(tabConfig,loadedHistos);
},

_renderSort:function(tabConfig){
var self=this;
var sortOptions=tabConfig.sortOptions;
if(sortOptions.length<=1||this.aPageSearchKeywords){
$('aPageSort').innerHTML='';
return;
}

var t=$T(lt.NewAPage.sort,'aPageSort');
var iter=t.getTokenBlock('OptionBlock');


var selId=lala.params.sort;
if(this.aPageSortOption)selId=this.aPageSortOption.id;

sortOptions.leach(function(option){
iter.replaceToken('name',option.name);
iter.replaceToken('id',option.id);
iter.replaceToken('key',option.key);

if(selId&&(option.id==selId)){
iter.replaceToken('selected','selected');
self.aPageSortOption=option;
}
iter.next();
});
t.compose();


if(!this.aPageSortOption){
this.aPageSortOption=sortOptions[0];
}
},

_renderHistosSection:function(tabConfig,loadedHistos){
var self=this;
if(!tabConfig.histoOptionsById)return;


for(var histoKey in loadedHistos){
var vals=loadedHistos[histoKey].values;
self.aPageHistos[histoKey]=vals;


vals.linsertAt({name:self.aPageDefAllFilter},0);
}


['Genre','Subgenre','AlbumType'].leach(function(histoKey){
self._renderHisto(histoKey);
});
},

_renderHisto:function(histoKey){
var values=this.aPageHistos[histoKey];
if(!values||values.length==1)return;

var t=$T(lt.NewAPage.histos,'histosBy'+histoKey);
t.replaceToken('title',histoKey=='AlbumType'?'Type':histoKey+'s');
t.replaceToken('onClick','onFilterBy'+histoKey)

var currSelected=this.aPageHistos['selected'+histoKey];
if(!currSelected)currSelected=this.aPageDefAllFilter;

var iter=t.getTokenBlock('HistoBlock');
values.leach(function(val){
iter.replaceToken('value',val.name)
iter.replaceToken('valueJs',val.name.lescapeQuotes())
iter.replaceToken('selected',val.name==currSelected?'selected':'')
iter.next();
});
t.compose();
},

onFilterByGenre:function(val){
lala.Track.clientPageInteraction('filterByGenre');

this.aPageHistos.selectedGenre=val!=this.aPageDefAllFilter?val:null;


this.aPageHistos.Subgenre=null;
this.aPageHistos.selectedSubgenre=null;
this.aPageHistos.AlbumType=null;
this.aPageHistos.selectedAlbumType=null;
this.aPagePaginator.skipped=0;

this._pushBackEvent(true);
this._loadTab();
},


onFilterBySubgenre:function(val){
lala.Track.clientPageInteraction('filterBySubgenre');

this.aPageHistos.selectedSubgenre=val!=this.aPageDefAllFilter?val:null;

this.aPageHistos.AlbumType=null;
this.aPageHistos.selectedAlbumType=null;
this.aPagePaginator.skipped=0;

this._pushBackEvent(true);
this._loadTab();
},

onFilterByAlbumType:function(val){
lala.Track.clientPageInteraction('filterByAlbumType');

this.aPageHistos.selectedAlbumType=val!=this.aPageDefAllFilter?val:null;
this.aPagePaginator.skipped=0;
this._pushBackEvent(true);
this._loadTab();
},

onFilterBySearch:function(){
lala.Track.clientPageInteraction('filterBySearch');

this.aPageSearchKeywords=$F('aPageSearchBox');
this.aPagePaginator.skipped=0;
this._pushBackEvent(true);
this._loadTab();
},

onFilterBySearchClear:function(){
lala.Track.clientPageInteraction('filterBySearchClear');

this.aPageSearchKeywords=null;
this.aPagePaginator.skipped=0;
this._pushBackEvent(true);
this._loadTab();
},

onSortChange:function(){
lala.Track.clientPageInteraction('sortChange');

var options=this._getTabConfig().sortOptions;
this.aPageSortOption=options.lfindIf('id',$F('aPageSortSelect'))[0];

this.aPagePaginator.skipped=0;
this._pushBackEvent(true);
this._loadTab();
},

aPageLoadAndRenderSongs:function(Q,widgetConfig){
var self=this;
var params=this.getAPageQueryParams(Q,'songs');

api.Q.searchSongsForAPage(
params,
function(res){
self.renderAPageSongsTab(
res,
res.data.songs,
res.data.histos,
widgetConfig);
});
},

aPageLoadAndRenderAlbums:function(Q,widgetConfig){
var self=this;
var params=this.getAPageQueryParams(Q,'albums');

api.Q.searchAlbumsForAPage(
params,
function(res){
self.renderAPageAlbumsTab(
res,
res.data.albums,
res.data.histos,
widgetConfig);
});
},

aPageLoadAndRenderArtists:function(Q,widgetConfig){
var self=this;
var params=this.getAPageQueryParams(Q);

api.Q.searchArtistsForAPage(
params,
function(res){
self.renderAPageArtistsTab(
res,
res.data.artists,
res.data.histos,
widgetConfig);
});
},

aPageLoadAndRenderPlaylists:function(Q,widgetConfig){
var self=this;
var params=this.getAPageQueryParams(Q);

api.Q.searchPlaylists(
params,
function(res){
self.renderAPagePlaylistsTab(
res,
res.data.playlists,
res.data.histos,
widgetConfig);
});
},

aPageLoadAndRenderInfluencers:function(Q,widgetConfig){
var self=this;
var params=this.getAPageQueryParams(Q);

api.SearchUtils.getInfluencers(
params,
function(res){
self.renderAPageFeaturedMembersTab(
res,
res.data,
null,
widgetConfig);
});
},

aPageLoadAndRenderListeners:function(Q,widgetConfig){
var self=this;
var params=this.getAPageQueryParams(Q);

api.SearchUtils.getListeners(
params,
function(res){
self.renderAPageFeaturedMembersTab(
res,
res.data,
null,
widgetConfig);
});
}
};





PlaylistBuilder=Class.create();
PlaylistBuilder.all={};
PlaylistBuilder.prototype={
initialize:function(params){
this._wiid=params.id||"pb_"+mojo.idGenerator++;
this._playlistData=params.playlist||null;
this._playlistId=params.playlist?params.playlist.lalaId:params.playlistId;
this._playlistLalaId=params.playlist?params.playlist.lalaId:null;
this._containerId=params.renderTargetId;
this.trackingId='widget.PlaylistBuilder';


this.onViewHeightChange=params.onViewHeightChange||mojo.emptyFunction;
this.onSongAddedCallback=mojo.emptyFunction;
this.onPlaySongs=mojo.emptyFunction;
this.onQueueSongs=mojo.emptyFunction;


this.picker=new PlaylistSongPicker({
renderTargetId:'pbSongPickerContainer_'+this._wiid,
trackingId:this.trackingId,
onAddToPlaylist:this.addSongToPlaylist.lbind(this),
onViewHeightChange:this.onViewHeightChange.lbind(this)
});

this.suggest=new PlaylistSuggestions({
renderTargetId:'pbSuggestionsContainer_'+this._wiid,
trackingId:this.trackingId,
onAddToPlaylist:this.addSongToPlaylist.lbind(this),
onViewHeightChange:this.onViewHeightChange.lbind(this),
playlistId:this._playlistId
});

mojo.listeners.add(
api.Playlists.EVT_PLAYLIST_INFO_CHANGED,
this._onPlaylistInfoChanged.lbind(this));
mojo.listeners.add(
api.Playlists.EVT_SONGS_LOADED,
this._onPlaylistInfoChanged.lbind(this));
PlaylistBuilder.all[this._wiid]=this;
},

loadAndRender:function(){
var self=this;
if(!this._playlistData){
api.Playlists.get(
this._playlistId,
function(res){
self._playlistLalaId=res.data.lalaId;
self._playlistData=res.data;
self.render();
});
}else{
this.render();
}
},

render:function(){
$T(lt.PlaylistBuilder.main,this._containerId)
.replaceToken('pngClass',!mojo.IE6?'play_icon_full_large_png':'')
.replaceToken('wiid',this._wiid)
.replaceToken('playlistId',this._playlistData.id)
.replaceToken('plTitle',this._playlistData.title)
.replaceToken('title',this._playlistData.title.lescapeHTML())
.replaceToken('creationDate',this._formatDateString(this._playlistData.createDate))
.replaceToken('updatedDate',this._formatDateString(this._playlistData.lastModifiedDate))
.replaceToken('numSongs',this._playlistData.numTracks)
.compose();
},

_formatDateString:function(date){
var dateStr=date.toDateString();
return dateStr.substring(4);
},

_onPlaylistInfoChanged:function(){
$S('pbTitle_'+this._wiid,this._playlistData.title.lescapeHTML());

var count=this._playlistData.songs
?this._playlistData.songsTotal:this._playlistData.numTracks;
$S('pbSongCount_'+this._wiid,count);

this._playlistData.lastModifiedDate=new Date();
$S('pbLastUpdated_'+this._wiid,
this._formatDateString(this._playlistData.lastModifiedDate));
},

onPickClick:function(){
if(!this.picker.isOpen()){
if(this.suggest.isOpen())this.suggest.hide();
this.picker.render();
}else{
this.picker.hide();
}
},

onSuggestionsClick:function(){
if(!this.suggest.isOpen()){
if(this.picker.isOpen())this.picker.hide();
this.suggest.loadAndRender();
}else{
this.suggest.hide();
}
},

addSongToPlaylist:function(song){
var evtData={fromContext:'suggestions'};
if(!song.isDigied){
frontend.buyWebSong(
song,this.onSongAddedCallback,MyMusic.g.getPageId(),
this._playlistData.id,null,evtData);
}else{
api.Playlists.addSongs(this._playlistData,[song],this.onSongAddedCallback,evtData);
}
}
};
PlaylistBuilder.recordAddCounter=function(trackingId,song){
var digiedOrNotText=song.isDigied;
if(!song.isDigied){
digiedOrNotText='undefined.'+(api.MicroWallet.credits>0?'unpaid':'paid');
}
lala.Track.clientPageInteraction(trackingId+'.addSong.'+digiedOrNotText);
};

PlaylistSuggestions=Class.create();
PlaylistSuggestions.all={};
PlaylistSuggestions.prototype={
initialize:function(params){
this._wiid=params.id||'playlistSuggestions_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.trackingId=params.trackingId+'.Suggestions';
this.onAddToPlaylist=params.onAddToPlaylist||mojoEmptyFunction;
this.onViewHeightChange=function(){
params.onViewHeightChange();
};
this._playlistLalaId=params.playlistId;

this._curIndex=0;
this._collectionOnly=false;
this._suggestions=[];
this._numSuggestions=0;
this._playingSong=Player.g.getPlayingInfo().song;
this.contentId='suggestionsContent_'+this._wiid;

mojo.listeners.add(
Player.EVT_STATUS_CHANGE,
this.onPlayingSongEvent.lbind(this));

PlaylistSuggestions.all[this._wiid]=this;

this.addSongWidgetListener_Init();
},


loadAndRender:function(){
this._collectionOnly=false;
$D(this.renderTargetId);
$TC(lt.PlaylistSuggestions.loadingSuggestions,this.renderTargetId);
this.onViewHeightChange();
this._curIndex=0;
this._suggestions=[];
this.getPlaylistSuggestions();
lala.Track.clientPageInteraction(this.trackingId+'.opened');
},


getPlaylistSuggestions:function(){

if(this._suggestions.length<=this._curIndex){
var self=this;
this._getPlaylistSuggestions(this._curIndex,function(res){
self.renderSkel();
self._numSuggestions=res.data.total;
self._suggestions=res.data.list;
self.renderSuggestions();
});
}else{
this.renderSkel();
this.renderSuggestions();
}
},

_getPlaylistSuggestions:function(skip,onResponse){
api.SearchUtils.getPlaylistSuggestions(this._playlistLalaId,
this._collectionOnly,skip,5,
function(res){
onResponse(res);
});
},

renderSkel:function(){
if(!$('playlistSuggestions_'+this._wiid)){
$T(lt.PlaylistSuggestions.skel,this.renderTargetId)
.replaceToken('wiid',this._wiid)
.compose();
}
},

hide:function(){
mojo.css.display('playlistSuggestions_'+this._wiid,false);
this.onViewHeightChange();
},

isOpen:function(){
return mojo.css.isDisplayed('playlistSuggestions_'+this._wiid);
},

onAddClick:function(oldIndex,songLalaId){
var self=this;
var row=$('pbRow_'+this._wiid+'_'+songLalaId);

if(row){
var loadingRow=this.renderLoadingRow(row);

var song=this._suggestions[oldIndex];
this.onAddToPlaylist(song);
PlaylistBuilder.recordAddCounter(this.trackingId,song);

setTimeout(function(){
self.fetchNextSuggestion(loadingRow);
},500);
}
},

renderLoadingRow:function(tr){
var loadingRow=$T(lt.PlaylistSuggestions.loadingRow)
.replaceToken('id',tr.id)
.compose();
loadingRow=mojo.dom.parseHTMLFragment('<table>'
+loadingRow
+'</table>');
var tbody=tr.parentNode;
tbody.replaceChild(loadingRow,tr);
return loadingRow;
},

addSongToPlaylist:function(song){
var evtSrc={src:'PlaylistBuilder'};
var onAfterPurchase=this.onSongAddedCallback.lbind(this);
if(!song.isDigied){
frontend.buyWebSong(
song,onAfterPurchase,MyMusic.g.getPageId(),
this._playlistData.id,
null,
evtSrc);
}else{
api.Playlists.addSongs(
this._playlistData,
[song],
onAfterPurchase,
evtSrc);
}
},

onDeleteClick:function(songLalaId){
var row=$('pbRow_'+this._wiid+'_'+songLalaId);
if(row){
var loadingRow=this.renderLoadingRow(row);
lala.Track.clientPageInteraction(this.trackingId+'.remove');

var self=this;
setTimeout(function(){
self.fetchNextSuggestion(loadingRow);
},500);
}
},

fetchNextSuggestion:function(row){

if(this._numSuggestions<=this._curIndex){
var tbody=row.parentNode;
tbody.removeChild(row);
if(tbody.rows.length==0){
$TC(lt.PlaylistSuggestions.noMoreSuggestions,this.contentId);
}
this.onViewHeightChange();
}else if(this._suggestions.length<=this._curIndex){
var self=this;
this._getPlaylistSuggestions(this._curIndex,function(res){
self._numSuggestions=res.data.total;
self._suggestions=self._suggestions.concat(res.data.list);
self.renderNextSuggestion(row);
});
}else{
this.renderNextSuggestion(row);
}
},

renderNextSuggestion:function(row){

var nextSuggestion=this._suggestions[this._curIndex];

var rowIndex=row.rowIndex;
var songTable=row.parentNode;

var newRow=$T(lt.PlaylistSuggestions.songList).getTokenBlock('SongBlock');
this._replaceSongRowTokens(this._curIndex,rowIndex==songTable.rows.length-1,
nextSuggestion,newRow);
newRow=newRow.compose();
newRow=mojo.dom.parseHTMLFragment('<table>'+newRow.compose()+'</table>');

songTable.replaceChild(newRow,row);

this._curIndex++;
this.onViewHeightChange();
},

renderSuggestions:function(){
if(this._suggestions.length>0){
this.renderSongList();
}else{
$TC(lt.PlaylistSuggestions.noSuggestions,this.contentId);
lala.Track.clientPageInteraction(this.trackingId+'.noSuggestions');
this.onViewHeightChange();
}
},

renderSongList:function(){
var t=$T(lt.PlaylistSuggestions.songList,this.contentId);
var songBlock=t.getTokenBlock('SongBlock');
var startIndex=this._curIndex;
var endIndex=Math.min(4,this._numSuggestions-1);
for(var i=startIndex;i<=endIndex;i++){
var song=this._suggestions[i];
if(song){
this._replaceSongRowTokens(i,i==endIndex,song,songBlock);
songBlock.next();
}
this._curIndex++;
}
t.compose();
this.onViewHeightChange();
},

_replaceSongRowTokens:function(index,atEnd,song,songBlock){
var rowClass=atEnd?'':'borderRow';
if(this._playingSong&&song.songLalaId==this._playingSong.songLalaId){
rowClass+=' playing';
}
songBlock.replaceToken('detailsBlock',this.getSongDetailsHtml(index));
songBlock.replaceToken('wiid',this._wiid);
songBlock.replaceToken('songLalaId',song.songLalaId);
songBlock.replaceToken('rowClass',rowClass);
},

getSongDetailsHtml:function(songIndex,withChrome){
var song=this._suggestions[songIndex];
var detailsBlock=withChrome
?$T('<table><tr>'+lt.PlaylistSuggestions.songDetails+'</tr></table>')
:$T(lt.PlaylistSuggestions.songDetails);
var coverArtUrl;
if(song.linkSongLalaId){
coverArtUrl=frontend.img.Album(song.linkDiscLalaId,'small');
}else{
coverArtUrl=lala.staticBaseURL+'default-images/album-placeholder-80.jpg';
}

if(song.isDigied){
detailsBlock.removeTokenBlock('AddBlock');
}else{
detailsBlock.removeTokenBlock('DigiedBlock');
detailsBlock.replaceToken('songPrice',mojo.util.formatPrice(song.addPrice));
}

detailsBlock.replaceToken('wiid',this._wiid);
detailsBlock.replaceToken('songIndex',songIndex);
detailsBlock.replaceTokensWithBean('song',song);
detailsBlock.replaceToken('duration',mojo.util.secondsToTime(song.duration,true));

return detailsBlock.compose();
},

onPlayingSongEvent:function(event){
if(!event)return;

var song=event.song;
if(!song){
this._playingSong=null;
return;
}

var status=event.status;

var row=$('pbRow_'+this._wiid+'_'+song.songLalaId);
if(row){
if(status=='playing'){
this._playingSong=song;
if(!mojo.css.containsClass(row,'playing')){
mojo.css.addClass(row,'playing');
}
}else{
this._playingSong=null;
mojo.css.removeClass(row,'playing');
}
}else{
this._playingSong=null;
}
},

onCollectionOnlyClick:function(event){
event=new MojoEvent(event);
this._collectionOnly=event.target.checked;


this._curIndex=0;
this._suggestions=[];
this.getPlaylistSuggestions();
lala.Track.clientPageInteraction(this.trackingId+'.mySongsOnly');
},

onPlayClick:function(songIndex){
var song=this._suggestions[songIndex];
Player.g.playSong(song);
lala.Track.clientPageInteraction(this.trackingId+'.playSong');
},

addSongWidgetListener_GetSongByLinkLalaId:function(id){
return this._suggestions.lfindIf('linkSongLalaId',id,false,true);
},

addSongWidgetListener_SongAddedCallback:function(song){
var trackPrice=$('pbRow_price_'+song.id+'_'+this._wiid);
if(trackPrice){
$S(trackPrice,
$T(lt.PlaylistSuggestions.songDetails).getTokenBlock('DigiedBlock').compose());
}
},

onPlayButtonHover:function(index,elem,event){
var song=this._suggestions[index];
var offsets={};
if(mojo.FF)offsets.top=-2;
else if(mojo.IE7)offsets.top=-3;
else if(mojo.IE8)offsets.top=-1;
widgets.core.PlayButtonHover.open('medium',song,elem,event,
offsets,null,this.trackingId);
}
};
Object.extend(PlaylistSuggestions.prototype,AddSongWidgetListener,true);

PlaylistSongPicker=Class.create();
PlaylistSongPicker.all={};
PlaylistSongPicker.prototype={
initialize:function(params){
this._wiid=params.id||'playlistSongPicker_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.trackingId=params.trackingId+'.Picker';

this.onViewHeightChange=params.onViewHeightChange||mojo.emptyFunction;
this.onAddToPlaylist=params.onAddToPlaylist||mojo.emptyFunction;

PlaylistSongPicker.all[this._wiid]=this;

this.artist='';
this.artistSongs=null;
this.artistAlbums=null;
this._albumCache=[];
this.relatedArtists=null;
this._searchCount=50;
},

render:function(){
$D(this.renderTargetId);
$S(this.renderTargetId,this.getHtml());
this.setupAutocomplete();
this.onViewHeightChange();
lala.Track.clientPageInteraction(this.trackingId+'.opened');
},

getHtml:function(){
var t=$T(lt.PlaylistSongPicker.skel)
.replaceToken('wiid',this._wiid)

var optionBlock=t.getTokenBlock('PlaylistsBlock').getTokenBlock('OptionBlock');
var playlists=DataModel.g.getLockerPlaylists();
playlists.leach(function(playlist){
if(playlist.subtype=='locker')return;
optionBlock.replaceTokensWithBean('playlist',playlist);
optionBlock.next();
});

return t.compose();
},

hide:function(){
$D(this._wiid,false);
this.onViewHeightChange();
},

isOpen:function(){
return mojo.css.isDisplayed(this._wiid);
},

onSelectPlaylist:function(){

if(mojo.IE6)$('siteSearch_'+this._wiid).focus();
var self=this;
var playlistId=$('playlistSelect_'+this._wiid).value;
if(playlistId=='default')return;
var playlist=DataModel.g.getPlaylist(playlistId);

var mySongs=playlist.id=='recentlyListened'
&&$('mySongs_'+this._wiid)
&&$('mySongs_'+this._wiid).checked;

api.Playlists.getSongs(playlist,function(res){
self.renderPlaylist(res,playlist,mySongs);
},{mySongs:mySongs},this._searchCount,0);
lala.Track.clientPageInteraction(this.trackingId+'.selectPlaylist.'+playlist.id);
},

renderPlaylist:function(res,playlist,mySongs){
this._renderResultsSkel(true);

$T(lt.PlaylistSongPicker.playlistResultsHeader,'resultsHeader_'+this._wiid)
.replaceToken('playlistTitle',playlist.title)
.replaceToken('wiid',this._wiid)
.replaceToken('checked',mySongs?'checked':'')
.removeTokenBlock('MySongsBlock',playlist.id!='recentlyListened')
.compose();

new SongPickerSongList({
pagedList:res.data.tracks,
pagedRes:res,
onAddToPlaylist:this.onAddToPlaylist,
renderTargetId:'searchResults_'+this._wiid,
noSongsText:'This playlist has no songs...',
extraClass:'scrollingResults'
}).render();
},

setupAutocomplete:function(){
var searchBoxId='siteSearch_'+this._wiid;

var self=this;
this._autoComplete=new widgets.SearchAutoComplete({
inputId:searchBoxId,
offsets:{},
onRunSearch:function(text,suggestion){
self.onSubmitSearch(suggestion!=null);
}});

window.setTimeout(function(){$(searchBoxId).focus()},100);
},

_renderResultsSkel:function(isPlaylist){
$T(lt.PlaylistSongPicker.resultsSkel,'resultsSkel_'+this._wiid)
.replaceToken('wiid',this._wiid)
.replaceToken('customClass',isPlaylist?'playlistResults':'')
.compose();
},

onForceSearch:function(searchTerm){
$('siteSearch_'+this._wiid).value=searchTerm;
this.onSubmitSearch(false,true);
},

onSubmitSearch:function(isAutoCompleted,dontAutocomplete){
var self=this;

var searchTerm=$F('siteSearch_'+this._wiid);
if(!searchTerm)return;
$('playlistSelect_'+this._wiid).value='default';

this._autoComplete.hide();

this._renderResultsSkel();
lala.Track.clientPageInteraction(this.trackingId+'.runSearch');

if(isAutoCompleted&&!dontAutocomplete){
this.searchTerm=searchTerm;
this.loadAndRenderArtist(searchTerm,false);
}else{

api.AutoComplete.artistCheck(
searchTerm,
function(isArtist,noop,artistName){
self.searchTerm=searchTerm;
if(isArtist&&!dontAutocomplete){
self.loadAndRenderArtist(artistName,true);
}else{
self.loadAndRenderSearchResults(searchTerm);
}
});
}
},

loadAndRenderSearchResults:function(searchTerm){
var self=this;
api.SearchPage.runBucketedSearch({
albumsQ:searchTerm+' rank:album +filter:full',
doAlbums:false,
artistsCount:this._searchCount,
artistsQ:searchTerm+' +filter:full',
songsCount:this._searchCount,
songsQ:searchTerm+' rank:song +filter:full',
sortDir:'Desc',
sortKey:'Relevance'
},function(res){
self.renderSearchResults(res,searchTerm);
});
},

renderSearchResults:function(res,searchTerm){

this.searchArtists=res.data.artists;
this.searchSongs=res.data.songs;
this.shortcuts=res.data.shortcuts;

$T(lt.PlaylistSongPicker.searchResultsHeader,'resultsHeader_'+this._wiid)
.replaceToken('wiid',this._wiid)
.replaceToken('terms',searchTerm)
.compose();

this.searchTabs=mojo.newtabs.create({
divTabsId:'searchTabs_'+this._wiid,
divTabsContentId:'searchResults_'+this._wiid,
trackingId:'songPicker'
});

this.searchTabs.add({id:'artists',title:'Artists ('
+mojo.util.addCommasToNumber(this.searchArtists.total)
+')'});
this.searchTabs.add({id:'songs',title:'Songs ('
+mojo.util.addCommasToNumber(this.searchSongs.total)
+')'});
this.searchTabs.onTabClick=this.onSearchTabsClick.lbind(this);

if(this.searchArtists.total!=0||this.searchSongs.total==0){
this.searchTabs.activate('artists');
}else{
this.searchTabs.activate('songs');
}
},

onSearchTabsClick:function(activeTab){
if(activeTab.id=='artists')this.renderSearchArtistResults();
else this.renderSearchSongResults();
},


renderSearchSongResults:function(res){
lala.Track.clientPageInteraction(this.trackingId+'.showSearchSongResults');
new SongPickerSongList({
renderTargetId:'searchResults_'+this._wiid,
pagedList:res?res.data.songs:this.searchSongs,
pagedRes:res,
onAddToPlaylist:this.onAddToPlaylist,
extraClass:'scrollingResults',
pagerNextOverride:this._onSongsNext.lbind(this),
count:this._searchCount
}).render();
},


_onSongsNext:function(){
var self=this;
api.Q.searchSongsForAPage(
this._getSongSearchQ(this.searchTerm,{skip:this._searchCount}),
self.renderSearchSongResults.lbind(self)
);
},


renderSearchArtistResults:function(res){
var artistPager=new widgets.core.Paginator('artistPager_'+this._wiid,'buttons');
if(!res){
lala.Track.clientPageInteraction(this.trackingId+'.showSearchArtistResults');
if(this._searchCount>=this.searchArtists.total){

artistPager=null;
}else{
artistPager.count=this._searchCount;
var self=this;
artistPager.onFirstPageOverride=function(){

api.Q.searchArtistsForAPage(
self._getSearchQ(self.searchTerm,{skip:self._searchCount}),
self.renderSearchArtistResults.lbind(self)
);
}
}
}

var noneMsg='Sorry, there were no matches.  Please try another search.';
if(this.shortcuts&&this.shortcuts.length>0){
var spellingShortcuts=this.shortcuts.lfindIf('type','spellcheck');
if(spellingShortcuts.length>0){
var spellingText=$T(lt.PlaylistSongPicker.spellcheck)
.replaceToken('wiid',this._wiid);
var artistBlock=spellingText.getTokenBlock('ArtistLinkBlock');
spellingShortcuts.leach(function(shortcut,index,isLast){
artistBlock.replaceTokensWithBean('artist',shortcut);
artistBlock.removeTokenBlock('CommaBlock',isLast);
artistBlock.next();
});
noneMsg=noneMsg+spellingText.compose();
}
}

this._renderArtists(res?res.data.artists:this.searchArtists,
noneMsg,
artistPager,
res);
},






loadAndRenderArtist:function(artistName,isAutocomplete){

this.artist=null;
this.artistSongs=null;
this.artistAlbums=null;
this.relatedArtists=null;

var self=this;
api.SearchUtils.getArtist(
artistName,
function(res){
self.artist=res.data;
self.renderArtist(isAutocomplete)
});
lala.Track.clientPageInteraction(this.trackingId+'.showArtist');
},

renderArtist:function(isAutocomplete){
this.artist.displayName=this.artist.artist.ltruncate(50);
$T(lt.PlaylistSongPicker.artistResultsHeader,'resultsHeader_'+this._wiid)
.replaceTokensWithBean('artist',this.artist)
.replaceToken('wiid',this._wiid)
.compose();
this.artistTabs=mojo.newtabs.create({
divTabsId:'artistTabs_'+this._wiid,
divTabsContentId:'searchResults_'+this._wiid,
trackingId:'songPicker'
});
this.artistTabs.add({id:'songs',title:'Songs'});
this.artistTabs.add({id:'mySongs',title:'My Songs'});
this.artistTabs.add({id:'albums',title:'Albums'});
this.artistTabs.onTabClick=this.onArtistTabsClick.lbind(this);
this.artistTabs.activate('songs',!isAutocomplete);
},


onArtistTabsClick:function(activeTab,isClick){
switch(activeTab.id){
case'songs':
this.loadAndRenderArtistSongs(!isClick);
break;
case'albums':
this.loadAndRenderArtistAlbums();
break;
case'mySongs':
this.loadAndRenderMySongs();
break;
default:
break;
}
if(isClick){
lala.Track.clientPageInteraction(this.trackingId+'.artistTabs.'+activeTab.id);
}
},

loadAndRenderArtistSongs:function(showSearchLink){
var self=this;
api.Q.searchSongs(
this._getQueryParams(),
function(res){
self.renderArtistSongs(res,showSearchLink);


showSearchLink=false;
});
},

renderArtistSongs:function(res,showSearchLink){
this.artistSongs=res.data.songs;

var html='';
if(showSearchLink){
html+=$T(lt.PlaylistSongPicker.showSearchResults)
.replaceToken('wiid',this._wiid)
.replaceToken('searchTerm',this.searchTerm.lescapeQuotes())
.compose();
}

var self=this;
html+=new SongPickerSongList({
pagedList:this.artistSongs,
onAddToPlaylist:this.onAddToPlaylist,
pagedRes:res,
noSongsText:'This artist has no songs',
onPageCallback:function(){
if($('showSearchResults_'+self._wiid)){
$D('showSearchResults_'+self._wiid,false);
}
}
}).getHtml(true);

$T(lt.PlaylistSongPicker.artistSongResults,'searchResults_'+this._wiid)
.replaceToken('msg',html)
.compose();
},

loadAndRenderMySongs:function(){
var params=this._getQueryParams(null,{sortKey:'UserListens'},true);
api.Q.searchCollectionSongs(params,this.renderMySongs.lbind(this));
},

renderMySongs:function(res){
new SongPickerSongList({
extraClass:'scrollingResults',
onAddToPlaylist:this.onAddToPlaylist,
pagedList:res.data.songs,
pagedRes:res,
renderTargetId:'searchResults_'+this._wiid,
noSongsText:'You don\'t have any songs by this artist...'
}).render(true);
},

loadAndRenderArtistAlbums:function(){
this.selectedAlbum=null;
if(this.artistAlbums){
this.renderArtistAlbums();
}else{
this.selectedAlbum=null;
var self=this;
api.Q.searchAlbums(
this._getQueryParams('-type:"Compilation" -type:"Other"'),
function(res){
self.artistAlbums=res.data.albums.list;
self.renderArtistAlbums();
});
}
},

renderArtistAlbums:function(){
if(this.artistAlbums.length==0){
$T(lt.PlaylistSongPicker.noneMsg,'searchResults_'+this._wiid)
.replaceToken('msg','This artist has no albums')
.compose();
}else{
var t=$T(lt.PlaylistSongPicker.artistAlbumResults,'searchResults_'+this._wiid)
.replaceToken('wiid',this._wiid);

var albumBlock=t.getTokenBlock('AlbumBlock');
this.artistAlbums.leach(function(album){
albumBlock.replaceTokensWithBean('album',album);
albumBlock.next();
});

t.compose();
this.onSelectAlbum(this.artistAlbums[0].id);
}
},

onSelectAlbum:function(albumId){
var self=this;
lala.Track.clientPageInteraction(this.trackingId+'.selectArtistAlbum');
if(this.selectedAlbum){
$DC('albumSelector_'+this.selectedAlbum.id+'_'+this._wiid,'selected');
}
this.selectedAlbum=this.artistAlbums.lfindIf('id',albumId,false,true);
$AC('albumSelector_'+this.selectedAlbum.id+'_'+this._wiid,'selected');

$('artistAlbumSongs_'+this._wiid).scrollTop=0;

if(this._albumCache[albumId]){
this._renderAlbumSongs(albumId);
}else{
this._showLoadingMessage('artistAlbumSongs_'+this._wiid);
api.Catalog.getAlbumGroupInfo(albumId,
function(res){
self._albumCache[albumId]=res.data;
self._renderAlbumSongs(albumId);
});
}
},

_renderAlbumSongs:function(albumId){
var self=this;
var album=this._albumCache[albumId];
var albumSongs=$T(lt.PlaylistSongPicker.albumSongs,'artistAlbumSongs_'+this._wiid);

var discBlock=albumSongs.getTokenBlock('DiscBlock');
album.discs.leach(function(disc,index){
var title='';
var info='';
if(index==0){
title=disc.title.ltruncate(30);
info=disc.albumTrackCount
+' song'+(disc.albumTrackCount==1?'':'s');
if(album.discs.length>1){
info+=', '+album.discs.length
+' disc'+(album.discs.length==1?'':'s');
}
}else{
title='Disc '+(index+1);
}
var songList=new SongPickerSongList({
onAddToPlaylist:self.onAddToPlaylist,
songs:disc.tracks
});

discBlock.replaceToken('title',title);
discBlock.replaceToken('discInfo',info);
discBlock.replaceToken('songList',songList.getHtml(true));
discBlock.next();
});

albumSongs.compose();
},

loadAndRenderArtistRelated:function(){
lala.Track.clientPageInteraction(this.trackingId+'.showRelatedArtists');
this.artistTabs.deActivate();
var self=this;
if(this.relatedArtists){
this.renderRelatedArtists();
}else{
api.Catalog.getSimilarArtists(this.artist.artist,
function(res){
self.relatedArtists=res.data;
self.renderRelatedArtists();
});
}
},

renderRelatedArtists:function(){
this._renderArtists(this.relatedArtists,'There are no related artists');
},

_renderArtists:function(listOrPagedList,noneMsg,pager,pagedRes){
var artistList=listOrPagedList.list?listOrPagedList.list:listOrPagedList;

var renderTargetId='searchResults_'+this._wiid;

if(artistList.length==0){
$T(lt.PlaylistSongPicker.noneMsg,renderTargetId)
.replaceToken('msg',noneMsg)
.compose();
}else{
var t=$T(lt.PlaylistSongPicker.artistPicker,renderTargetId)
.replaceToken('wiid',this._wiid);
var artistBlock=t.getTokenBlock('ArtistBlock');
artistList.leach(function(artist){
artistBlock.replaceToken('artistName',artist.artist.lescapeQuotes().lescapeHTMLAttrQuotes());
artistBlock.replaceTokensWithBean('artist',artist);
artistBlock.next();
});

if(pager){
pager.renderToken(pagedRes,t,'pager','buttons',listOrPagedList);
}
else{
t.removeTokenBlock('PagerBlock');
}

t.compose();
}
},

onArtistRowMouseOver:function(row){
$AC(row,'hovered');
},

onArtistRowMouseOut:function(row){
$DC(row,'hovered');
},

onArtistClick:function(artistName){


this._showLoadingMessage();
this.loadAndRenderArtist(artistName);
},

_showLoadingMessage:function(id){
if(!id)id='searchResults_'+this._wiid;
$TC(lt.PlaylistSongPicker.loadingMsg,id);
},

_getQueryParams:function(baseQ,overrides,noFilter){
if(!overrides)overrides={};
if(!baseQ)baseQ='';
if(!noFilter)baseQ=' filter:+full '+baseQ;
var params={
Q:'artist: "'+this.artist.artist.lescapeQuotes()+'"'+baseQ,
sortKey:'Listens7',
sortDir:'Desc',
count:50,
skip:0
};
Object.extend(params,overrides,false);
return params;
},

_getSongSearchQ:function(searchTerm,overrides){
return this._getSearchQ(searchTerm+' rank:song',overrides);
},

_getSearchQ:function(baseQ,overrides){
if(!overrides)overrides={};
baseQ+=' filter:+full';
var params={
Q:baseQ,
sortKey:'Relevance',
sortDir:'Desc',
count:this._searchCount,
skip:0
}
Object.extend(params,overrides);
return params;
}
};

SongPickerSongList=Class.create();
SongPickerSongList.all={};
SongPickerSongList.prototype={
initialize:function(params){
if(params.pagedList){
this.pagedList=params.pagedList;
this.pagedRes=params.pagedRes;
this.songs=params.pagedList.list;

this.pagerNextOverride=params.pagerNextOverride;
this.countOverride=params.count;
}else{
this.songs=params.songs;
}
this.onAddToPlaylist=params.onAddToPlaylist||mojo.emptyFunction;

this.trackingId='widget.PlaylistBuilder.Picker';

this._wiid=params.id||'songPickerSongList_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.extraClass=params.extraClass||'';
this.noSongsText=params.noSongsText;
this.onPageCallback=params.onPageCallback||mojo.emptyFunction;

SongPickerSongList.all[this._wiid]=this;
this.addSongWidgetListener_Init();
},

render:function(dontShowAllSameArtist){
$S(this.renderTargetId,this.getHtml(dontShowAllSameArtist));
},

getHtml:function(dontShowAllSameArtist){
var self=this;
var songTable=$T(lt.SongPickerSongList.skel)
.replaceToken('wiid',this._wiid)
.replaceToken('extraClass',this.extraClass);

if(this.songs.length==0){
var msg=$T(lt.SongPickerSongList.noSongsText)
.replaceToken('msg',this.noSongsText)
.compose();
songTable.replaceTokenBlock('TableBlock',msg);
}else{
var songRow=songTable.getTokenBlock('TableBlock').getTokenBlock('SongRow');

var allSameArtist=dontShowAllSameArtist?this.songs.lfindIfNot('artist',this.songs[0].artist).length<=0
:false;

this.songs.leach(function(song){
songRow.replaceToken('wiid',self._wiid);
songRow.replaceTokensWithBean('song',song);
songRow.removeTokenBlock('ArtistBlock',allSameArtist);

if(song.playType=='Sample'){
songRow.replaceToken('isSample','playActionSample');
}

widgets.SongList.renderDuration(song,songRow);

var price='';
if(song.isDigied){
price=widgets.SongList.IN_ICON_TINY;
songRow.replaceToken('priceDisplay','display: inline');
}else if(song.isLicensedForStreaming){
price='$'+mojo.util.formatPrice(song.addPrice);
}else{
price=song.isLicensedForDownload
?$TC(lt.SongPickerSongList.mp3Only)
:'';
songRow.removeTokenBlock('AddToPlaylistBlock');
songRow.removeTokenBlock('PlayIcon');
}
songRow.replaceToken('price',price);

songRow.next();
});
}

if(this.pagedList&&this.pagedList.total>this.pagedList.list.length){
var pager=new widgets.core.Paginator('songPager_'+this._wiid,'buttons');
pager.onPagedCallback=this.onPageCallback;
if(this.pagerNextOverride&&!this.pagedRes){
pager.count=this.countOverride;
pager.onFirstPageOverride=function(){
self.pagerNextOverride();
};
}
pager.renderToken(this.pagedRes,songTable,'pager','buttons',this.pagedList);
}else{
songTable.removeTokenBlock('PagerBlock');
}

return songTable.compose();
},

onAddSongToPlaylist:function(songId){
var song=this.songs.lfindIf('id',songId,false,true);
this.onAddToPlaylist(song);
PlaylistBuilder.recordAddCounter(this.trackingId,song);
},

onPlaySong:function(songId){
var song=this.songs.lfindIf('id',songId,false,true);
Player.g.playSong(song);
lala.Track.clientPageInteraction(this.trackingId+'.playSong');
},

onTrackRowMouseOver:function(row,evt,songId){
var idSuffix='_'+songId+'_'+this._wiid;

$D('price'+idSuffix,true,'inline');
$AC('songRow'+idSuffix,'hovered');


var addToPlaylist=$('addToPlaylist'+idSuffix);
if(addToPlaylist)$D(addToPlaylist,true,'inline');
},

onTrackRowMouseOut:function(row,evt,songId){
var idSuffix='_'+songId+'_'+this._wiid;

var firstChild=$('price'+idSuffix).firstChild;
if(firstChild&&firstChild.tagName!='IMG'){
$D('price'+idSuffix,false,'inline');
}
$DC('songRow'+idSuffix,'hovered');

var addToPlaylist=$('addToPlaylist'+idSuffix);
if(addToPlaylist)$D(addToPlaylist,false);
},

addSongWidgetListener_GetSongByLinkLalaId:function(id){
return this.songs.lfindIf('linkSongLalaId',id,false,true);
},

addSongWidgetListener_SongAddedCallback:function(song){
var trackPrice=$('price_'+song.id+'_'+this._wiid);
if(trackPrice){
$S(trackPrice,widgets.SongList.IN_ICON_TINY);
trackPrice.style.display='inline';
}
}
};
Object.extend(SongPickerSongList.prototype,AddSongWidgetListener,true);




GiftCardsPage=Class.create();
GiftCardsPage.prototype={
initialize:function(){
this.initPage({
pageId:'GiftCards',
skelClass:'giftCards',
pageTitle:'Lala Gift Cards'
});
},

onLoad:function(){
var topBox=new widgets.core.RoundedBox({
backgroundColor:'white',
contentHTML:$TC(lt.GiftCards.topBox),
mode:'tinyBorderCCC'
});

var redeemBox=new widgets.core.RoundedBox({
backgroundColor:'transparent',
contentHTML:$TC(lt.GiftCards.redeemOption),
mode:'tinyBorderCCC'
});

var signupLinkFunc=function(trackingId){
return'href="'+frontend.url.PaymentMethod('giftcard')+'"';
};
var skel=$T(lt.GiftCards.skel)
.replaceToken('topBox',topBox.getHTML())
.replaceToken('redeemOption',redeemBox.getHTML())
.replaceToken('buyEmailLink',lala.user?frontend.link.EmailGiftCard():signupLinkFunc('buyGiftCardEmail'))
.replaceToken('buyPrintLink',lala.user?frontend.link.PrintGiftCard():signupLinkFunc('buyGiftCardPrint'));

this.renderIntoContentRegion(skel);

GiftCardsPage.g=this;
},

onOpenToolTip:function(elem){
widgets.core.Tooltip.open(elem,$TC(lt.GiftCards.webSongs),null,250,'body');
}
};
Object.extend(GiftCardsPage.prototype,Page.prototype,true);
MyMusic.addPage('giftcards',function(){return new GiftCardsPage();});


BuyGiftCardPage=Class.create();
BuyGiftCardPage.prototype={

initialize:function(pageId,userToken){
this.mode=pageId=='EmailGiftCard'?'email':'print';



this.userToken=userToken;


this.initPage({
pageId:pageId,
authLevel:1,
skelClass:'buyGiftCard',
pageTitle:this.mode=='email'?'Email a Lala Gift Card'
:'Print a Lala Gift Card'
});

this.member=null;
this.selectedCard='xmas';


this.cardIds=[
'xmas',
'carolers',
'snowflake',
'redhearts',
'pinkhearts',
'babybluehearts',
'bluehearts',
'bdaycake',
'default',
'black',
'white'];
this.MAX_MSG_LEN=300;
this.NAME_MAX_LEN=64;
this.isDiscounted=lala.user&&lala.user.marketingSource
&&lala.user.marketingSource.lcontains('instyle.giftcardpromo')
&&mojo.cookie.get('lsgcp','')=='true';

if(this.isDiscounted){
lala.Track.client('partnerPromos.instyle.giftcard.purchasePage');
}

this.offers=this.isDiscounted?lala.discountedGiftOffers:lala.giftCardOffers;
BuyGiftCardPage.g=this;
},

onLoad:function(){



if((!lala.user.hasCreditCard||lala.user.isCreditCardRequired)
&&api.MicroWallet.balance<100){
var url=frontend.url.PaymentMethod('giftcard');
lala.gotoPage.url(url);
return;
}else if(this.userToken){
var self=this;
api.User.getBasicInfo(this.userToken,function(res){
self.member=res.data.user;
self.renderPage();
});
}else{
this.renderPage();
}
},

renderPage:function(){
var skel=$T(lt.BuyGiftCard.skel);

if(this.mode=='email'){
if(this.member){
skel.replaceToken('smallHeader',$TC(lt.BuyGiftCard.userGiftCardHeader));
}else{
skel.replaceToken('smallHeader',$TC(lt.BuyGiftCard.emailGiftCardHeader));
}
var customFormSection='';
var recipientSkel=$T(lt.BuyGiftCard.recipientSkel);
if(this.member){
customFormSection=$T(lt.BuyGiftCard.chosenMember)
.replaceTokensWithBean('user',this.member)
.compose();
}else{
customFormSection=$TC(lt.BuyGiftCard.recipient);
}
recipientSkel=recipientSkel
.replaceToken('recipient',customFormSection)
.compose();

skel.replaceToken('customFormSection',recipientSkel);
}else{
skel.replaceToken('smallHeader',$TC(lt.BuyGiftCard.printGiftCardHeader));
}
var optionBlock=skel.getTokenBlock('GiftCardOptionBlock');
this.offers.leach(function(offer){
optionBlock.replaceToken('id',offer.id);
optionBlock.replaceToken('label','$'+offer.value);
optionBlock.next();
});

var defAmountIndex=1;
var defAmountCard=this.offers[defAmountIndex];

skel.replaceToken('bigCardClass',this.selectedCard);
skel.replaceToken('defaultGiftCardValue',defAmountCard.value);
skel.replaceToken('realPrice',defAmountCard.price);
skel.replaceToken('maxCharCount',this.MAX_MSG_LEN);
skel.replaceToken('nameMaxLength',this.NAME_MAX_LEN);

skel.keepTokenBlock('DiscountBlock',this.isDiscounted);

var selector=skel.getTokenBlock('GiftCardSelectBlock');
for(var i=0;i<this.cardIds.length;i++){
var id=this.cardIds[i];
if(id==this.selectedCard){
selector.replaceToken('class','selectedGiftCard');
}
selector.replaceToken('id',id);
selector.next();
}
this.renderIntoContentRegion(skel);

if(lala.user)$('from').value=lala.user.nickName;
if(this.member)$('to').value=this.member.nickName;


$('giftCardId').selectedIndex=defAmountIndex;
this.onChangeDollarValue();
},

onSubmit:function(event){
var self=this;

mojo.event.create(event).stopPropagation();
if(!this._validateBuyGiftCardForm())return;

var toEmail='';
if(this.mode=='email'){
toEmail=$F('recipientEmail');
}

var giftCardId=$F('giftCardId');
var toName=$F('to');
var fromName=$F('from');
var message=$F('message');
var toToken=this.member?this.member.userToken:'';

lala.Track.click('giftCardsPage.purchasePreview');
widgets.store.openBuyGiftCardDialog(
{giftCardMode:this.mode,
giftCardId:giftCardId,
fromName:fromName,
toEmail:toEmail,
toName:toName,
toToken:toToken,
offer:this.offers.lfindObject('id',giftCardId),
note:message,
giftTheme:this.selectedCard
},
function(res){

mojo.cookie.remove('lsgcp');
if(self.isDiscounted){
lala.Track.client('partnerPromos.instyle.giftcard.purchased');
}

var type=self.mode;
if(type=='email'){
type=toToken?'emailMember':'emailAnon';
}
lala.Track.click('giftCardsPage.purchaseConfirm');
lala.Track.click('giftCardsPage.purchaseConfirm.'+type);
frontend.go.GiftCardSuccess(self.mode,res.data.result.giftCard.lalaId);
});
},

_validateBuyGiftCardForm:function(){
try{
if(this.mode=='email'&&!this.member){
mojo.util.validate({
fieldId:'recipientEmail',
type:'email',
isRequired:true
});
}
mojo.util.validate({
fieldId:'to',
type:'text',
isRequired:true,
maxLength:this.NAME_MAX_LEN
});
mojo.util.validate({
fieldId:'from',
type:'text',
isRequired:true,
maxLength:this.NAME_MAX_LEN
});
mojo.util.validate({
fieldId:'message',
maxLength:this.MAX_MSG_LEN,
type:'text'
});
return true;
}catch(e){
return false;
}
},

onChangeDollarValue:function(){
var selBox=$('giftCardId');
var option=selBox.options[selBox.selectedIndex];
$S('dollarValue',option.text);

var offer=this.offers.lfindObject('id',option.value);
if(this.isDiscounted){
$S('discountedPrice','$'+offer.price);
}

lala.Track.click('giftCardsPage.onChangeDollarValue');
},

onOpenMemberSelector:function(evt,elem){
evt=mojo.event.create(evt);
widgets.core.friendOrMemberSelectorDialog.open(evt,elem,this.onSelectMember.lbind(this));
lala.Track.click('giftCardsPage.onOpenMemberPicker');
},

onSelectMember:function(member){
MojoDialog.close();
$T(lt.BuyGiftCard.chosenMember,'recipient')
.replaceTokensWithBean('user',member)
.compose();

$('to').value=member.nickName;
this.member=member;
this.setSmallHeader($TC(lt.BuyGiftCard.userGiftCardHeader));
lala.Track.click('giftCardsPage.onMemberSelected');
},

onSwitchToEmail:function(){
this.member=null;
$S('recipient',$TC(lt.BuyGiftCard.recipient));
$('to').value='';
this.setSmallHeader($TC(lt.BuyGiftCard.emailGiftCardHeader));
lala.Track.click('giftCardsPage.onSwitchToEmail');
},

setSmallHeader:function(headerContent){
$S('smallHeader',headerContent);
},

onSelectCardType:function(id){
mojo.css.removeClass('gc_thumb_wrap_'+this.selectedCard,'selectedGiftCard');
this.selectedCard=id;
$('bigCard').className=id;
mojo.css.addClass('gc_thumb_wrap_'+id,'selectedGiftCard');
lala.Track.click('giftCardsPage.onChangeTheme');
},

updateCharCount:function(textarea){
$S('messageCharCount',this.MAX_MSG_LEN-textarea.value.length);
var tooLong=this.MAX_MSG_LEN<textarea.value.length;
textarea.style.backgroundColor=tooLong?'#FFCCCC':'white';
}
};
Object.extend(BuyGiftCardPage.prototype,Page.prototype,true);
MyMusic.addPage('giftcards/email',function(){return new BuyGiftCardPage('EmailGiftCard');});
MyMusic.addPage('giftcards/print',function(){return new BuyGiftCardPage('PrintGiftCard');});
MyMusic.addPageRegex('giftcards',/giftcards\/email\/.*$/,
function(pageParams){
return new BuyGiftCardPage('EmailGiftCard',pageParams[2]);
});

BoughtGiftCardPage=Class.create();
BoughtGiftCardPage.prototype={
initialize:function(giftCardType,giftCardId){
this.type=giftCardType;
this.giftCardId=giftCardId

var title='';
if(this.type=='print'){
title='You\'re almost done';
}else if(this.type=='email'){
title='Congratulations,  you\'re done!';
}

this.initPage({
pageId:'BoughtGiftCard',
skelClass:'boughtGiftCard',
pageTitle:title
});

BoughtGiftCardPage.g=this;
},

onLoad:function(){
var skel=$T(lt.BoughtGiftCard.skel);

var ackMsg='';
if(this.type=='print'){
ackMsg=$T(lt.BoughtGiftCard.printAck)
.replaceToken('giftCardId',this.giftCardId)
.compose();
}else if(this.type=='email'){
ackMsg=$TC(lt.BoughtGiftCard.emailAck);
}

var ackRb=new widgets.core.RoundedBox({
contentHTML:ackMsg,
backgroundColor:'white',
mode:'tinyBorder'
});
skel.replaceToken('ackMessage',ackRb.getHTML());

this.renderIntoContentRegion(skel);
}
};
Object.extend(BoughtGiftCardPage.prototype,Page.prototype,true);


MyMusic.addPageRegex('giftcards',/giftcards\/congrats\/(print|email)\/.*/,
function(pageParams){
return new BoughtGiftCardPage(pageParams[2],pageParams[3]);
});



CollectionPage=Class.create();
CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT=250;
CollectionPage.prototype={
initialize:function(playlist){
this.initCollectionPage(playlist);
},

initCollectionPage:function(playlist){
this.initPage({
authLevel:1,
skelClass:'collection',
pageId:playlist.pageId
});
this.playlist=playlist;
},

onLoad:function(){




CollectionPage.g=this;

this.isLiquid=DataModel.g.getUserPreference('isCollectionLiquid',false);
this.isNewSongsView=DataModel.g.getUserPreference('isNewSongsView',false);
this.adjustSkeletonForLiquidChange();
lala.Track.clientPage('impressions.songsView.'+(this.isNewSongsView?'new':'old'));



this.view=this.isNewSongsView
?new CollectionPage.FancySongsView()
:new CollectionPage.ClassicSongsView();
this.selMgr=new CollectionPage.SelectionManager();
this.leftPane=new CollectionPage.LeftPane();
this.dragHandler=new CollectionPage.DragHandler();
this.histoPane=new CollectionPage.HistoPane();
this.infoPane=new CollectionPage.InfoPane();


this._initAndResetFromParams();
this.toolbar=new CollectionPage.Toolbar();



var liquidHeight=MyMusic.g.getLiquidHeight()-1;
var t=$T(lt.Collection.skeleton)
.replaceToken('height',liquidHeight+'px');
this.renderIntoContentRegion(t);


if(mojo.IE){
$('songsPane').onselectstart=function(){return false;};
}
this.renderPaneSkeletons();


this.loadAndRenderSongs({
forceHistosDraw:true,
reloadSongs:true,
keepKeywords:true
});


mojo.listeners.add(
api.Playlists.EVT_SONG_ADDED,
this._onPlaylistSongAddedEvent.lbind(this));
mojo.listeners.add(
MyMusic.EVT_PAGE_RESIZE,
this.onPageResize.lbind(this));
mojo.listeners.add(
RatingWidget.EVT_USER_RATING_CHANGED,
this.onSongRated.lbind(this));
mojo.listeners.addGlobal(
api.MicroWallet.EVT_BUYSONG_CHANGE,
this._onPlaylistSongPurchased.lbind(this));
mojo.listeners.add(
api.MicroWallet.EVT_BUYSONG_CHANGE,
this._onPlaylistSongPurchasedLocal.lbind(this));
this._updatePendingCounts();

this.processSignupLanding();
},

processSignupLanding:function(){
var self=this;
var signupContext=Cookies.getFromSignupContext();
if(!signupContext)return;
if(signupContext=='fbConnectLinked'){
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
if(!self.facebookLinkedDialogShown){
LalaFBConnect.openFacebookLinkedDialog();
}
self.facebookLinkedDialogShown=true;
});
}
},

onUnload:function(){
if(this.playlist.keywords){

this.playlist.keywords=null;
this.playlist.clearSongs();
}




this.selMgr.reset();
this.view.onUnload();
},

_initAndResetFromParams:function(){
var searchKeywords=lala.params.keywords;
if(searchKeywords||!this.playlist.isCacheable){
this.playlist.clearSongs();
this.selMgr.reset();

if(searchKeywords!='_')this.playlist.keywords=searchKeywords;
}

this.playlist.ratingTo=lala.params.ratingTo;
this.playlist.ratingFrom=lala.params.ratingFrom;

if(this.playlist.ratingTo==null)this.playlist.ratingTo=-1;
if(this.playlist.ratingFrom==null)this.playlist.ratingFrom=-1;



this.playlist.songSkipCount=0;
this.pendingRequests=[];
},

_updatePendingCounts:function(){
if(this.playlist.subtype=='recentlyUploaded'){
api.Alerts.getNewItems('UploadedSong',function(){
DataModel.g.setPendingCount('recentlyUploaded',0);
});
}



DataModel.g.setPlaylistCount(this.playlist.id,0);
},

getPageTitle:function(){
return this.playlist.type=='locker'
?this.playlist.title
:"Playlist: "+this.playlist.title;
},

getPageId:function(){
return this.playlist.pageId;
},


setSearchMode:function(){
CollectionPage.SearchBox.g.setSearchMode(this.playlist);
},

loadAndRenderSongs:function(params){
if(!params)params={};
if(this.playlist.clientIsCacheStale||params.reloadSongs){

if(this.playlist.clientIsCacheStale){

this.clearServerCache=this.view.isUnfilteredView()&&this.playlist.subtype=='locker';
this.playlist._allHistos=null;
this.playlist._allSongs=null;
this.playlist._allSongsTotal=null;
if(!params.keepSort){
this.playlist._so='Artist';
this.playlist._sa=null;
}
}

var oldSo=this.playlist.so;
var oldSa=this.playlist.sortState[oldSo];


this.playlist.clearSongs(
params.keepHistoSelected,
params.keepHistos,
params.keepSort,
params.keepKeywords);
this.playlist.clientIsCacheStale=false;
this.playlist.songSkipCount=this.getSongSkip();


if(this.view.isUnfilteredView()&&this.playlist.subtype=='locker'){
this.playlist.histos=mojo.util.clone(this.playlist._allHistos);
this.playlist.songs=this.playlist._allSongs;
this.playlist.songsTotal=this.playlist._allSongsTotal;
this.playlist.histosSelected={genre:null,artist:null,album:null};
if(this.playlist._so!=null){
this.playlist.so=this.playlist._so;
this.playlist.sortState[this.playlist.so]=this.playlist._sa;
}
}

this.updateColumnHeaders(oldSo,oldSa,this.playlist.so,
this.playlist.sortState[this.playlist.so]);

if(!this.playlist.clientIsCacheStale&&this.view.isUnfilteredView()){
this.view.updateScrollBars();
this.histoPane.render(true);
this.toolbar.onSelectionChange();
}
}

var self=this;
params.onLoaded=function(){
self.view.renderSongsTable();
if(params.onDone)params.onDone();
};

this.loadSongs(params);
},

loadSongs:function(params){
var onLoaded=params.onLoaded;
var histosUnchanged=params.histosUnchanged;
var forceHistosDraw=params.forceHistosDraw;
var goingUp=params.goingUp;

var songSkip=params.customSkip||this.playlist.songSkipCount;
var songCount=this.view.songPageSize;
if(this.playlist.songs){
if(this.playlist.songsTotal<songCount)songCount=this.playlist.songsTotal;


var startIndex=songSkip;
var endIndex=startIndex+songCount-1;



if(goingUp){
for(var j=endIndex;j>=startIndex;j--){
if(this.playlist.songs[j]==null){
break;
}else{
songCount--;
}
}
}else{
for(var i=startIndex;i<=endIndex;i++){
if(this.playlist.songs[i]==null){
songSkip=i;
break;
}else{
songCount--;
}
}}
}else if(!params.suppressBlankTable){
this.view.renderAllFillers();
}

if(songCount>0){


if(this._checkForPendingRequests(songSkip,songCount))return;

var grabCount=songCount;
var grabSkip=songSkip;


if(goingUp){
grabSkip-=50;
grabSkip=Math.max(grabSkip,0);
}

grabCount+=50;

this._addPendingRequest(grabSkip,grabCount);

var self=this;
api.Playlists.getOwnSongs(
this.playlist,
function(res){
self._clearPendingRequest(grabSkip,grabCount);

if(!self.playlist.songs){
self.playlist.songs=[];
}
res.data.tracks.list.leach(function(track,index){
var plIndex=grabSkip+index;
self.playlist.songs[plIndex]=track;
});
self.playlist.songsTotal=res.data.tracks.total;
if(self.view.isUnfilteredView()&&self.playlist.subtype=='locker'){
self.playlist._allSongs=self.playlist.songs;
self.playlist._allSongsTotal=self.playlist.songsTotal;
self.playlist._so=self.playlist.so;
self.playlist._sa=self.playlist.sortState[self.playlist.so];
}
if(res.data.histos&&!mojo.isEmpty(res.data.histos)){
self.preprocessHistos(res.data.histos);





if(self.playlist.subtype=='locker'&&!self.playlist.keywords){
self.playlist.preloadArtistMatcher(res.data.histos.artist);
}
if(self.view.isUnfilteredView()){
self.playlist._allHistos=mojo.util.clone(self.playlist.histos);
}
}



self.view.updateScrollBars();
self.toolbar.onSelectionChange();

if(onLoaded)onLoaded(grabSkip,grabCount);
if(!params.skipHistos)self.histoPane.render();
},
this.getQueryParams({
histosUnchanged:histosUnchanged,
pageSize:grabCount,
skip:grabSkip,
clearServerCache:this.clearServerCache
}));
this.clearServerCache=false;
}else{
if(forceHistosDraw)this.histoPane.render(true);
if(onLoaded)onLoaded();
}
},




renderPaneSkeletons:function(){

this.adjustLiquidHeights();

this.leftPane.render();
this.infoPane.render();
this.histoPane.renderSkeleton();
this.toolbar.renderSkeleton();
this.view.renderSkeleton();


this.attachScrollListener();
this.attachWheelListener();
},


_checkForPendingRequests:function(skip,count){
for(var i=0;i<this.pendingRequests.length;i++){
var req=this.pendingRequests[i];
if(skip>=req[0]&&skip+count<=req[1]){
return true;
}
}
return false;
},

_addPendingRequest:function(skip,count){
var req=[];
req[0]=skip;
req[1]=skip+count;
this.pendingRequests.push(req);
},

_clearPendingRequest:function(skip,count){
for(var i=this.pendingRequests.length-1;i>=0;i--){
var req=this.pendingRequests[i];
if(req[0]==skip&&req[1]==skip+count){
this.pendingRequests.lremoveAt(i);
}
}
},

_onPlaylistSongAddedEvent:function(evt){
var plToken=evt.playlistToken;

if(evt.fromContext=='suggestions'||plToken=='playerQueue')return;
this._onPlaylistSongAdded(DataModel.g.getPlaylist(plToken));
},

_onPlaylistSongAdded:function(playlist,onDone,overrides){


if(playlist.isCacheable){
playlist.clearSongs();
}

playlist.lastModifiedDate=new Date();




if(playlist.subtype=='recentlyUploaded'
||playlist.subtype=='recentlyAdded'){
DataModel.g.getSongsPlaylist().clearSongs();
}

if(this.playlist.id==playlist.id){
this.reloadCurrentView(null,onDone,overrides);
}
},

_onPlaylistSongPurchased:function(evt){
if(this.playlist.subtype!='recentlyListened'){
this.playlist.clientIsCacheStale=true;
}
},

_onPlaylistSongPurchasedLocal:function(evt){
if(this.playlist.subtype=='recentlyAdded'){
this.reloadCurrentView();
}
},

getLiquidHeight:function(){

var lheight=MyMusic.g.getLiquidHeight()-44;
if(mojo.WEBKIT)lheight+=1;
if(mojo.IE8)lheight-=2;
if(mojo.IE6)lheight-=4;
return lheight;
},




adjustLiquidHeights:function(){
var lheight=this.getLiquidHeight();
if(!this.histoPane.isEnabled()){
if(!this.infoPane.isEnabled()){

this.view.songDivHeight=lheight;
}else{

this.view.songDivHeight=lheight-this.infoPane.getHeight()+2;
}
}else{

this.histoPane.updateHeight(lheight);
this.view.songDivHeight
=lheight-this.histoPane.getHeight()+1;
}


this.view.songPageSize=Math.floor(
this.view.songDivHeight/this.view.songRowHeight)+1;
},

getSourceInfo:function(startIndex){
var info={};
info.lalaId=this.playlist.sourceId;
info.query=mojo.url.buildQueryString(
this.getQueryParams({startIndex:startIndex}));
return info;
},





onPlayFromSelectedSong:function(){
if(this.selMgr.getCount()==0)return;

var startIndex=this.selMgr.getSortedIndexes()[0];
var queryParams=this.getQueryParams();
queryParams.skip=startIndex;

Player.g.playPlaylist(this.playlist.id,queryParams,"All Songs");
},

onPlaySongAtIndex:function(index){
var song=this.getSongForIndex(index);
Player.g.playSong(song,'collectionView.playSongIcon');
},


onSongRated:function(ratingInfo){
var shouldReload=false;
if(this.playlist.so=='Rating'){
shouldReload=true;
}else if(this.playlist.ratingFrom==0){
shouldReload=true;
}else if(this.playlist.ratingFrom!=-1){
if(ratingInfo.rating<this.playlist.ratingFrom
||ratingInfo.rating>this.playlist.ratingTo){
shouldReload=true;
}
}

if(shouldReload){
this.playlist.clientIsCacheStale=true;
this.loadAndRenderSongs({
keepHistoSelected:true,
keepHistos:true,
keepSort:true,
keepKeywords:true
});
}
},

onBuySong:function(index){
var song=this.getSongForIndex(index);
frontend.buyWebSong(song);
},

onBuyDownloadSong:function(index){
var song=this.getSongForIndex(index);
widgets.store.openBuySongDownloadDialog(song);
},

onBuyMultipleSongMP3s:function(){
var mp3Songs=[];
this.selMgr.getSongs().leach(function(song){
if(frontend.canPurchaseDownload(song)){
mp3Songs.ladd(song);
}
});

if(mp3Songs.length==1){
lala.Track.click('collectionView.buySongMp3');
widgets.store.openBuySongDownloadDialog(mp3Songs[0]);
}else{
lala.Track.click('collectionView.buySongMultipleMp3s');
widgets.store.openBuySongDownloadsDialog(mp3Songs);
}
},

onBuyPlaylistMP3s:function(){
lala.Track.click('collectionView.buyPlaylistMp3s');


this.playlist.clientAllTracks=this.playlist.songs;

var clientUndownloadedTracksCount=0;
var clientDownloadPriceInCents=0;
var uniqueTracks=[];
this.playlist.clientAllTracks.leach(function(song){
if(frontend.canPurchaseDownload(song)){
if(uniqueTracks.lfindIf('linkSongLalaId',song.linkSongLalaId)==0){
clientUndownloadedTracksCount++;
clientDownloadPriceInCents+=song.downloadPriceInCents;
uniqueTracks.push(song);
}
}
});
this.playlist.clientUndownloadedTracksCount=clientUndownloadedTracksCount;
this.playlist.clientDownloadPriceInCents=clientDownloadPriceInCents;



widgets.store.openBuyDownloadPlaylistDialog(this.playlist);
},

onEditPlaylistDialog:function(playlistId){
var playlist=DataModel.g.getPlaylist(playlistId);
var t=$T(lt.Collection.playlistInfoDialog)
.replaceToken('limit',CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT)
.replaceToken('charsLeft',CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT-playlist.description.length)
.replaceToken('pid',playlistId);

t.removeTokenBlock('CreateBlock');
t.replaceTokensWithBean('playlist',playlist);

var dialog=new MojoDialog({
title:'Edit Playlist Info',
id:'playlistInfoDialog'
});
dialog.onOpen=function(){
$('playlistInfoTitle').focus();
};
dialog.open(t.compose());
},

onEditPlaylistDialogSubmit:function(playlistId){
var title=$F('playlistInfoTitle');
var desc=$F('playlistInfoDesc');

if(title.lisEmpty())return;
if(desc.length>CollectionPage.PLAYLIST_DESCRIPTION_LIMIT_COUNT)return;

var pl=DataModel.g.getPlaylist(playlistId);
api.Playlists.updatePlaylistInfo(
pl,
title,
desc,
function(res){
MojoDialog.close();
});
},


onEditSongInfo:function(){
DataModel.g.getCollectionHistos(this.onStartEditingSongInfo.lbind(this));
},

onStartEditingSongInfo:function(histos){
if(!this._genreMatcher){
this._genreMatcher=new widgets.core.ClientAutoCompleteMatcher();
}
if(!this._artistMatcher){
this._artistMatcher=new widgets.core.ClientAutoCompleteMatcher();
}

this._genreMatcher.setData(histos.genre);
this._artistMatcher.setData(histos.artist);

var songs=this.selMgr.getSongs();
var songLCD=mojo.util.clone(songs[0]);
songs.leach(function(song){
for(var key in song){
if(songLCD[key]!=song[key]){
songLCD[key]='[various]';
}
}
});
var t=$T(lt.Playlist.id3Dialog);
t.replaceTokensWithBean('song',songLCD);

this.editSongInfoDialog=new MojoDialog({title:'Edit Song Info',id:'editSongInfo'});
this.editSongInfoDialog.onOpen=function(){
$('song_title').focus();
};
this.editSongInfoDialog.open(t.compose());
this.editSongInfoDialog.songLCD=songLCD;

var self=this;

var genreAutoComplete=new widgets.SearchAutoComplete({
inputId:'song_genre',
onRunSearch:mojo.emptyFunction,
global:false,
onkeyup:function(evt){
self.onEditSongInfoFieldKeyup(evt.target);
}
});
genreAutoComplete.onFillDelegate=function(sTerm){
genreAutoComplete.fillMatches(self._genreMatcher.getMatches(sTerm),sTerm);
};

var artistAutoComplete=new widgets.SearchAutoComplete({
inputId:'song_artist',
onRunSearch:mojo.emptyFunction,
global:false,
onkeyup:function(evt){
self.onEditSongInfoFieldKeyup(evt.target);
}
});
artistAutoComplete.onFillDelegate=function(sTerm){
artistAutoComplete.fillMatches(self._artistMatcher.getMatches(sTerm),sTerm);
};
},

onEditSongInfoSubmit:function(){
var songFields={};
songFields.title=$F('song_title');
songFields.artist=$F('song_artist');
songFields.discTitle=$F('song_discTitle');
songFields.genre=$F('song_genre');
songFields.trackNumber=$F('song_trackNumber');

var songLCD=this.editSongInfoDialog.songLCD;
for(var key in songFields){
if(songFields[key]==songLCD[key]){
delete songFields[key];
}
}

var songIndexes=this.selMgr.getSortedIndexes();

var self=this;
var onResponse=function(res){
self.selMgr.clear();
self.playlist.clientIsCacheStale=true;
self.loadAndRenderSongs({
keepHistoSelected:true,
keepHistos:true,
keepKeywords:true,
suppressBlankTable:true,
reloadSongs:true,
keepSort:true
});

MojoDialog.close();
};
api.Playlists.setTrackInfo(this.playlist,songIndexes,songFields,this.getQueryParams(),onResponse);
},

onEditSongInfoFieldKeyup:function(field){
if($F(field)!=$F(field.id+'_hidden')){
field.className='modified';
}else{
field.className='';
}
},

onDeletePlaylist:function(playlistId){
var pl=DataModel.g.getPlaylist(playlistId);
var msg=$T(strings.MyMusic.deletePlaylist)
.replaceToken('title',pl.title)
.compose();
if(!confirm(msg))return;

api.Playlists.deletePlaylist(pl.id);
},

onDeleteSongAtIndex:function(index){
this.selMgr.selectSong(index);
this.onDeleteSongs(true);
},

onDeleteSongs:function(isFromRowClick){
var msg=this.playlist.type=='my'
?$T(strings.MyMusic.deleteSongs)
:(this.playlist.id=='recentlyListened')
?$T(strings.MyMusic.deleteSongsFromRecentListens)
:$T(strings.MyMusic.deleteSongsFromLocker);
var selCount=this.selMgr.getCount();

msg.replaceToken('count',selCount>1?selCount+' ':'');
msg.replaceToken('s',selCount==1?'':'s');
msg.replaceToken('playListName',this.playlist.title);
var yes=confirm(msg.compose());
if(yes){

if(this.selMgr.getSortedIndexes().length==this.playlist.songsTotal){
var youSure=(this.playlist.id=='songs'&&this.view.isShowingAll())
?confirm('This will delete ALL the songs in your collection.  Are you REALLY sure!?')
:true;
if(youSure){
api.Playlists.deleteAllSongs(
this.playlist,
this.getQueryParams(),
this.reloadCurrentView.lbind(this)
);
}
}else{
var queryParams=this.getQueryParams();
api.Playlists.deleteSongs(
this.playlist,
this.selMgr.getSortedIndexes(),
this.playlist.songs,
this.reloadCurrentView.lbind(this),
queryParams);}
}else if(isFromRowClick){
this.selMgr.clear();
}
return true;
},




playSongs:function(forceAll){
var indexes=this.selMgr.getSortedIndexes();
if(forceAll||indexes.length<=0){
Player.g.playPlaylist(this.playlist.id,this.getQueryParams(),this.playlist.title,'collectionView.playButton');
lala.Track.clientPageInteraction('playAll');
}else{
Player.g.playSongsByRanges(this.playlist.id,indexes,this.getQueryParams(),'collectionView.playButton');
lala.Track.clientPageInteraction('playSongs.'+(indexes.length>1?'multiple':'single'));
}
},

queueSongs:function(forceAll){
var indexes=this.selMgr.getSortedIndexes();
if(forceAll||indexes.length<=0){
lala.Track.clientPageInteraction('queueAll');
Player.g.queuePlaylist(this.playlist.id,this.getQueryParams(),this.playlist.title,'collectionView.queueButton');
}else{
Player.g.queueSongsByRanges(this.playlist.id,indexes,this.getQueryParams(),'collectionView.queueButton');
lala.Track.clientPageInteraction('queueSongs.'+(indexes.length>1?'multiple':'single'));
}
},

getSongForIndex:function(index){
return this.playlist.songs[index];
},

preprocessHistos:function(histos){
if(!this.playlist.histos){

this.playlist.histos=histos;
}else{

for(var key in histos){
this.playlist.histos[key]=histos[key];
this.playlist.histos[key].__updated=true;
}
}


if(!this.playlist.histosSelected){
this.playlist.histosSelected={
'genre':null,
'artist':null,
'album':null
};
}



if(this.playlist.subtype=='locker'){
if(this.playlist.histosSelected.genre
&&this.playlist.histosSelected.artist
&&this.playlist.histosSelected.album){

}
}
},

getQueryParams:function(options){
if(!options)options={};
var p={};
var selHistos=this.playlist.histosSelected;
if(this.histoPane.isEnabled()&&selHistos
&&(selHistos.genre||selHistos.artist||selHistos.album)){

p.filterByGenre=this._getHistoParamValue(selHistos.genre);
p.filterByArtist=this._getHistoParamValue(selHistos.artist);
p.filterByAlbum=this._getHistoParamValue(selHistos.album);
}


if(!options.histosUnchanged){
p.includeHistos=this.histoPane.isEnabled();
}
p.count=options.pageSize?options.pageSize:this.view.songPageSize;
p.skip=this.playlist.songSkipCount
+(options.startIndex?options.startIndex:0);


if(mojo.isDefined(options.skip))p.skip=options.skip;
p.sortKey=this.playlist.so;
p.sortDir=this.playlist.sortState[this.playlist.so]?'Asc':'Desc';
p.keywords=this.playlist.keywords;
p.ratingFrom=this.playlist.ratingFrom;
p.ratingTo=this.playlist.ratingTo;
p.clearServerCache=options.clearServerCache;
return p;
},

_getHistoParamValue:function(histo){
if(!histo)return null;
else if(histo.name==='')return'_blank_';
else return histo.name;
},

onSortSongs:function(sortKey){
this.selMgr.clear(null,true);
var sa=this.playlist.sortState[this.playlist.so];

var oldSo=this.playlist.so;
var oldSa=sa;

this.playlist.clearSongs(true,true,null,true);

if(oldSo==sortKey&&sa!=null){
sa=!sa;
}else{
sa=true;
}

this.playlist.sortState[sortKey]=sa;
this.playlist.so=sortKey;

this.updateColumnHeaders(oldSo,oldSa,sortKey,sa);
this.loadAndRenderSongs({histosUnchanged:true});

lala.Track.clientPageInteraction('sortFilter.'+sortKey);
},

updateColumnHeaders:function(oldSo,oldSa,newSo,newSa){

if($(oldSo.ltoFirstLowerCase()+'ColHeader')){
mojo.css.removeClass(oldSo.ltoFirstLowerCase()+'ColHeader',
'sortedCol'+(oldSa?'Asc':'Desc'));
}


if($(newSo.ltoFirstLowerCase()+'ColHeader')){
$AC(newSo.ltoFirstLowerCase()+'ColHeader',
'sortedCol'+(newSa?'Asc':'Desc'));
}
},



onPageResize:function(){
if(!$('scrollableViewDiv'))return;

if(this.resizeTimer){
window.clearTimeout(this.resizeTimer);
this.resizeTimer=null;
}

this.resizeTimer=
window.setTimeout(
'CollectionPage.g.resizeTimer = null;CollectionPage.g.onInPageResize()',
10);
},


onInPageResize:function(){

var liquidHeight=MyMusic.g.getLiquidHeight()-1;
$('collectionTable').style.height=liquidHeight+'px';

var oldSongPageSize=this.view.songPageSize;


this.adjustLiquidHeights();

this.histoPane.resize();
this.leftPane.resize();
this.view.resize();


if(oldSongPageSize&&oldSongPageSize<this.view.songPageSize){
this.loadAndRenderSongs();
}else if(oldSongPageSize&&oldSongPageSize>this.view.songPageSize){
var table=$('songTable');
while(table&&table.rows.length>this.view.songPageSize){
table.deleteRow(table.rows.length-1);
}
}
},





onAddToPlaylistDragAddDropTargets:function(){
var scrollContainer=$('collectionLeftNav');

var selPlaylist=this.playlist;
if(selPlaylist.subtype=='uploadQ')return;

DataModel.g.getPlaylists().leach(function(pl){
if(pl==selPlaylist)return;
if(!pl.isSongsAddable)return;

var plLink=$('playlist_'+pl.id);
plLink.__playlist=pl;
mojo.drag.addTarget(plLink,scrollContainer);
});
},




onAddToPlaylistDragTargetDrop:function(table){
if(table.getAttribute('_dropTarget')!='true'){
return;
}
var src=this.playlist;
var dstId=table.__playlist.id;
var indexes=this.selMgr.getSortedIndexes();
api.Playlists.addSongsByRanges(src,dstId,indexes,this.getQueryParams());
lala.Track.clientPageInteraction('dragToPlaylist');
},




onRearrangeDragAddDropTargets:function(){
if(!this._canRearrange())return;

mojo.drag.addTarget($('songTable'));
mojo.drag.addTarget($('songsPaneColumnHeaders'));
},

_canRearrange:function(){

return!(!this.playlist.isSongsMoveable
||(this.playlist.so&&this.playlist.so!='Offset')
||(this.playlist.sortState
&&!this.playlist.sortState[this.playlist.so]))
},

onRearrangeDragTargetDrop:function(elem,state){
if(elem.id!='songTable')return;
var self=this;

var row=mojo.dom.getAncestorByTagName(state.currentEvent.target,'TR');
var belowIndex=parseInt(row.getAttribute('_index'));

if(belowIndex>=this.playlist.songsTotal)belowIndex=this.playlist.songsTotal-1;



if(this.selMgr.getCount()==1
&&this.selMgr.getIndexes()[0]==belowIndex)return;


var belowId=this.playlist.songs[belowIndex].id;
api.Playlists.moveSongsByRanges(
this.playlist,this.selMgr.getSortedIndexes(),belowIndex,belowId,
function(res){
self.moveSelectedSongs(row);
});
lala.Track.clientPageInteraction('dragRearrange');
},

addSelectedSongs:function(dstPlaylistId){
var src=this.playlist;
var indexes=this.selMgr.getSortedIndexes();
api.Playlists.addSongsByRanges(src,dstPlaylistId,indexes,this.getQueryParams());
},




moveSelectedSongs:function(row){
var self=this;



var belowIndex=Math.min(parseInt(row.getAttribute('_index')),this.playlist.songsTotal-1);
var selIndexes=self.selMgr.getIndexes();

var newIndex=belowIndex;
selIndexes.leach(function(index){
if(index<belowIndex)newIndex--;
});
belowIndex=newIndex;

var newIndexes=[];
for(var i=0;i<selIndexes.length;i++){
newIndexes.push(belowIndex+1+i);
}


this.playlist.songs=[];
this.selMgr.reset();
this.loadAndRenderSongs({
onDone:function(){self.selMgr.reselectSongs(newIndexes);}});
},


reloadCurrentView:function(res,onDone,overrides){
if(!overrides)overrides={};

this.selMgr.clear();
this.playlist.clientIsCacheStale=true;

var loadParams={
keepSort:true,
keepHistoSelected:true,
keepHistos:true,
forceHistosDraw:true,
keepKeywords:true,
suppressBlankTable:true,
reloadSongs:true,
onDone:onDone
};
Object.extend(loadParams,overrides);
this.loadAndRenderSongs(loadParams);
},

reloadPage:function(){


MyMusic.g.clearUnloadState();
this.onUnload();
this.onLoad();
},

attachWheelListener:function(){

var songs=$('songsPane');
if(mojo.IE||mojo.WEBKIT){
songs.onmousewheel=this.onMousewheel.lbind(this);
}else{
songs.addEventListener('DOMMouseScroll',
this.onMousewheel.lbind(this),
true);
}
},

attachScrollListener:function(){
$('endlessScrollBar').onscroll=this.onSongsScroll.lbind(this);
},

detachScrollListener:function(){
$('endlessScrollBar').onscroll=null;
},

onSongsScroll:function(evt){
var self=this;
var firstTime=(!this.loadSongTimer&&!this.drawScrollTimer);
if(this.loadSongTimer){
window.clearTimeout(this.loadSongTimer);
this.loadSongTimer=null;
}
if(this.drawScrollTimer){
window.clearTimeout(this.drawScrollTimer);
this.drawScrollTimer=null;
}

var skip=this.getSongSkip();
var goingUp=skip<this.playlist.songSkipCount;

var redrawSongs=mojo.emptyFunction();
var delta=skip-this.playlist.songSkipCount;
var shouldLoad=false;
if(Math.abs(delta)>(.5*this.view.songPageSize)){
redrawSongs=function(){
self.playlist.songSkipCount=skip;
self.view.renderSongsTable();
self.drawScrollTimer=null;
};
shouldLoad=true;
}else{
redrawSongs=function(){
self.songCursorMoved(delta);
self.drawScrollTimer=null;
};
}

if(firstTime){
redrawSongs();
}else{

this.drawScrollTimer=window.setTimeout(redrawSongs,10);
}


if(shouldLoad){
this.loadSongTimer=window.setTimeout(function(){
if(self.drawScrollTimer)window.clearTimeout(self.drawScrollTimer);
self.loadSongTimer=null;
self.loadAndRenderSongs({
histosUnchanged:true,
goingUp:goingUp,
skipHistos:true
});
},250);
}
},

onMousewheel:function(evt){
var delta=null;
var evnt=mojo.event.create(evt);


if(evnt.raw&&evnt.raw.wheelDelta){
delta=-evnt.raw.wheelDelta/120;
}else{
delta=evnt.raw.detail/3;
}
if(mojo.FF){
if(!this.wheelBounceTimer){
var self=this;
this.wheelBounceTimer=window.setTimeout(function(){
self.wheelBounceCount=0;
self.wheelBounceTimer=null;
self.onMouseWheelHelper(delta);
},5);
}
}else{
this.onMouseWheelHelper(delta);
}
},

onMouseWheelHelper:function(delta){
delta=(delta>0)?Math.floor(delta):Math.ceil(delta);
$('endlessScrollBar').scrollTop+=delta*this.view.songRowHeight;
},


songCursorMoved:function(songDelta){
var self=this;
var oldIndex=this.playlist.songSkipCount;
var newIndex=oldIndex+songDelta;

var totalSongs=this.playlist.songsTotal;
var pageSize=this.view.songPageSize;
var lastScrollIndex=totalSongs-pageSize+2;

var goingUp=songDelta<=0;


if((goingUp&&oldIndex==0)||(!goingUp&&oldIndex==lastScrollIndex)){
return;
}

var shouldLoad=false;
if(songDelta>0){
if(newIndex>lastScrollIndex){
songDelta=songDelta-(newIndex-lastScrollIndex);
newIndex=oldIndex+songDelta;
}
shouldLoad=this.view.renderIncrementalSongs(songDelta,'down');
}else{
if(newIndex<0){
songDelta=-oldIndex;
newIndex=0;
}
shouldLoad=this.view.renderIncrementalSongs(Math.abs(songDelta),'up');
}
this.playlist.songSkipCount=newIndex;

if(shouldLoad){
this.loadAndRenderSongs({
histosUnchanged:true,
goingUp:goingUp,
suppressPartialRender:true,
skipHistos:true
});
}else{


for(var k=0;k<20;k++){
var iToCheck=goingUp?this.playlist.songSkipCount-k
:(this.playlist.songSkipCount+this.view.songPageSize-1)+k
if(iToCheck<this.playlist.songsTotal&&iToCheck>=0
&&this.playlist.songs[iToCheck]==null){
this.loadSongs({
customSkip:iToCheck,
goingUp:goingUp,
skipHistos:true,
histosUnchanged:true,
onLoaded:function(songSkip,songCount){
var a1=songSkip;
var a2=songSkip+songCount;

var b1=self.playlist.songSkipCount;
var b2=self.playlist.songSkipCount+self.view.songPageSize;

if(!(a1>b2||b1>a2)){
self.view.renderSongsTable();
}
}
});
break;
}
}
}
},

getSongSkip:function(){
var elem=$('endlessScrollBar');
var skip=0;
if(elem.scrollTop>0){
skip=Math.floor(elem.scrollTop/this.view.songRowHeight);
if(skip>0)skip++;
}
return skip;
}
};
Object.extend(CollectionPage.prototype,Page.prototype,true);






CollectionPage.SongsView=Class.create();
CollectionPage.SongsView.prototype={
initBase:function(skelTemplate,songRowTemplate,songsTableTemplate){
this.skelTemplate=skelTemplate;
this.songsTableTemplate=songsTableTemplate;

this.playlist=CollectionPage.g.playlist;
this.rating=new RatingWidget({
type:RatingWidget.TYPE_USER,
size:RatingWidget.SIZE_LARGE,
isRateEnabled:false,
eventOffset:mojo.IE67?-10:null
});

if(!this._songRowTemplate){
this._songRowTemplate=$T(songRowTemplate);
this._songRowTemplate.setEmptyTokenText('&nbsp;');
this._songRowTemplate.getTokenBlock('Timestamp').dateFormatString="%n-%e-%y";
}


mojo.listeners.add(
Player.EVT_STATUS_CHANGE,
this.updatePlayingSongStatus.lbind(this));
mojo.listeners.add(
CollectionPage.SelectionManager.EVT_SELECTION_CHANGE,
this.showRatingForSelectedSong.lbind(this));
this.addSongWidgetListener_Init(true);
},

renderSkeleton:function(){

var t=$T(this.skelTemplate,'songsPane')
.replaceToken('style','height:'+this.songDivHeight+'px');
if(this.playlist.type=='locker'){
t.replaceToken('buyCol','none');
}


var subtype=this.playlist.subtype;
if(subtype=='locker'){
t.replaceToken('timestampColTitle','Added');
}else if(this.playlist.id=='recentlyListened'){
t.replaceToken('timestampColTitle','Listen');
}else{
t.removeTokenBlock('TimestampColumnTitle');
}

if(!this.playlist.isSongsDownloadable){
t.removeTokenBlock('DownloadColumnTitle');
}


var sa=this.playlist.sortState[this.playlist.so];
var sortToken=this.playlist.so+'Sorted';
t.replaceToken(sortToken,'sortedCol'+(sa?'Asc':'Desc'));
t.compose();


if(this.playlist.type=='locker'&&this.playlist.id!='songs'){
$('numberCol').onclick=null;
$('numberCol').style.cursor='default';
}
},

isHistoSelected:function(){
return this.playlist.histosSelected!=null
&&(this.playlist.histosSelected.genre!=null
||this.playlist.histosSelected.artist!=null
||this.playlist.histosSelected.album!=null);
},

isUnfilteredView:function(){
return!this.isHistoSelected()&&!this.playlist.keywords
&&!this.isRatingFiltered();
},





isFilteredView:function(){
return(!this.playlist.keywords
&&this.playlist.histosSelected
&&(this.playlist.histosSelected.genre
||this.playlist.histosSelected.artist
||this.playlist.histosSelected.album));
},

isRatingFiltered:function(){
return this.playlist.ratingFrom!=-1&&this.playlist.ratingTo!=-1;
},

isShowingAll:function(){
return!(this.playlist.keywords!=null
||this.playlist.histosSelected['genre']!=null
||this.playlist.histosSelected['artist']!=null
||this.playlist.histosSelected['album']!=null);
},



updateScrollBars:function(){
if(this.playlist.songsTotal){
var newHeight=this.playlist.songsTotal*this.songRowHeight;
$('innerScrollDiv').style.height=newHeight+'px';
}
},

renderSongsTable:function(suppressPartialRender){
if(this.playlist.songsTotal==0){
this.showNoSongsMessage();
}else{
var startIndex=this.playlist.songSkipCount;
var endIndex=this.playlist.songSkipCount+this.songPageSize;


var rowsRendered=0;

var t=$T(this.songsTableTemplate,'collectionViewContent');
var songRow=t.getTokenBlock('SongRow');
songRow.dateFormatString="%n-%e-%y";

for(var i=startIndex;i<endIndex;i++){
if(this.renderSongRow(i,songRow))rowsRendered++;
songRow.next();
}

if(rowsRendered==0){
t.removeTokenBlock('SongRow');
}

t.compose();





if(rowsRendered==0){
this.renderAllFillers(this.playlist.songsTotal==0);
}else if(rowsRendered<this.songPageSize&&!suppressPartialRender){
this.renderFillerRows(this.songPageSize-rowsRendered);
}
}

this.updatePlayingSongStatus();
},



renderSongRow:function(i,songRow){
var subtype=this.playlist.subtype;
var song=this.playlist.songs[i];


if(!song){

songRow.replaceTokenBlock(
'EventBlock',
'onclick=CollectionPage.g.selMgr.clear()');
songRow.replaceToken('index',i);
songRow.replaceToken('oddOrEven',(i%2)==0?'even':'odd');
songRow.removeTokenBlock('BuyLink');
songRow.getTokenBlock('Download').removeTokenBlock('DownloadLink');
if(this.playlist.subtype!='locker'&&this.playlist.subtype!='recentlyListened'){
songRow.removeTokenBlock('Timestamp');
}else{
songRow.getTokenBlock('Timestamp').removeTokenBlock('BuyLink');
}

if(!this.playlist.isSongsDownloadable){
songRow.removeTokenBlock('Download');
}
songRow.replaceToken('rowClasses','emptyRow');


return i>=this.playlist.songsTotal;
}else{
song.time=new Date(parseInt(song.timestamp));

if(song.trackNumber<1){
song.trackNumber='';
}
songRow.replaceTokensWithBean('song',song);

if(subtype!='locker'&&this.playlist.subtype!='recentlyListened'){
songRow.removeTokenBlock('Timestamp');
}else if(this.playlist.subtype=='recentlyListened'
&&!song.isDigied&&song.isLicensedForStreaming
&&!song.isFreeMp3){
songRow.getTokenBlock('Timestamp').removeTokenBlock('Time');
}else{
songRow.getTokenBlock('Timestamp').removeTokenBlock('BuyLink');
}

if(!this.playlist.isSongsDownloadable){
songRow.removeTokenBlock('Download');
}

songRow.replaceToken('number',i+1);
songRow.replaceToken('index',i);

var rowClasses='';
if(CollectionPage.g.selMgr.isSelected(i))rowClasses+='selected ';
if(song.failedUpload){
rowClasses+='failedUpload';
songRow.replaceToken('failedReason','<span style="color:black">('+song.failedUpload+')</span>');
}
songRow.replaceToken('rowClasses',rowClasses);

songRow.replaceToken('index',i);
songRow.replaceToken('artistPath',song.artist.lescapePath());
songRow.replaceToken('discTitlePath',song.discTitle.lescapePath());
songRow.replaceToken('oddOrEven',(i%2)==0?'even':'odd');
if(!song.artist){
songRow.removeTokenBlock('ArtistLinkBlock');
}
if(!song.discTitle){
songRow.removeTokenBlock('AlbumLinkBlock');
}

var yr=song.year?song.year:'&nbsp;';
if(song.year&&song.genre){
yr=', '+yr;
}
songRow.replaceToken('songYear',yr);
songRow.replaceToken('discTitle',song.discTitle||'<span style="color:#999;font-style:italic">Unknown album</span>');



if(!frontend.isSongAddable(song)){
songRow.removeTokenBlock('BuyLink');
}

if(this.playlist.isSongsDownloadable){
var downloadHtml=null;
if(frontend.canPurchaseDownload(song)){
var downloadPriceUI=song.isFreeMp3?'Free'
:'$'+mojo.util.formatPrice(song.downloadPriceInCents);
downloadHtml=$T(lt.Collection.buyDownloadLink)
.replaceToken('index',i)
.replaceToken('songId',song.id)
.replaceToken('downloadPriceInCents',downloadPriceUI)
.compose();
}else if(frontend.hasDownload(song)){
downloadHtml=$TC(lt.Collection.hasDownload);
}else if(song.isLicensedForDownload&&song.isDownloadAlbumOnly){
downloadHtml='Album only';
}else{
downloadHtml='N/A';
}

songRow.getTokenBlock('Download')
.replaceTokenBlock('DownloadLink',downloadHtml);
}

if(this.playlist.type=='locker'){
songRow.replaceToken('buyCol','none');
}

if(song.rating>0){
songRow.replaceToken('rating',this.rating.render(song));
}
widgets.SongList.renderDuration(song,songRow);
return true;
}
},

renderIncrementalSongs:function(count,dir){
var shouldLoad=false;
var row=this.getSongRowTemplate();
var oldIndex=this.playlist.songSkipCount;
var table=$('songTable');

for(var i=0;i<count;i++){
var songIndex=
dir=='down'?oldIndex+this.songPageSize+i:oldIndex-(i+1);



if(table.tBodies.length==0){


shouldLoad=!this.playlist.songs[songIndex]
&&songIndex<this.playlist.songsTotal;
break;
}
var delIndex=dir=='down'?0:table.rows.length-1;

if(delIndex>=0&&table.rows.length>delIndex)table.deleteRow(delIndex);

if(!this.renderSongRow(songIndex,row)){

shouldLoad=true;
}
var refRow=dir=='down'?null:table.rows[0];

mojo.table.insertRow(table,row.compose(),refRow);
}


this.updatePlayingSongStatus();
return shouldLoad;
},


showRatingForSelectedSong:function(){
this.rating.clearSongCache();


if(this._oldSelectedSongRating){
var song=this._oldSelectedSongRating;
var elem=$('rating_'+song.id);
if(elem&&song.rating<=0){
$S(elem,'');
}else if(elem){
this.rating.render(song,null,elem.id,false);
}
this._oldSelectedSongRating=null;
}

if(CollectionPage.g.selMgr.getCount()==1){
var song=CollectionPage.g.selMgr.getSongs()[0];
if(song){
var elem=$('rating_'+song.id);
if(elem){
this.rating.render(song,null,'rating_'+song.id,true);
}
this._oldSelectedSongRating=song;
}
}
},

resize:function(){
$('collectionViewDiv').style.height=(this.songDivHeight)+'px';
if(!mojo.FF&&!mojo.SAFARI3&&!mojo.IE){

}
},

getSongRowTemplate:function(){
return this._songRowTemplate;
},

getLoadingHtml:function(){
return $T(lt.Collection.loadingCollection)
.replaceToken('style','position:absolute;top:50%;left:50%;')
.compose();
},

updatePlayingSongStatus:function(){
var evt=Player.g.getPlayingInfo();
var song=evt.song;
if(!song)return;


if(this.currPlayerSong){
this.clearPlayingNowRow();
this.currPlayerSong=null;
}

if(evt.status=='playing'){
this.currPlayerSong=song;
this.setPlayingNowRow();
}
},

addSongWidgetListener_GetSongByLinkLalaId:function(linkSongLalaId){

if(!this.playlist.songs)return;



return this.playlist.songs.lfindIfSparse('linkSongLalaId',linkSongLalaId);
},

addSongWidgetListener_SongAddedCallback:function(updatedSong){
var elem=$('collectionAddLink'+updatedSong.id);
if(elem){
elem.innerHTML='';
elem.onclick=function(){return false;};
elem.style.textDecoration='none';
elem.parentNode.innerHTML='added';
}

var dlPriceArea=$('downloadPrice_'+updatedSong.id);
if(frontend.canPurchaseDownload(updatedSong)&&dlPriceArea){
$S(dlPriceArea,updatedSong.isFreeMp3?'Free'
:'$'+mojo.util.formatPrice(updatedSong.downloadPriceInCents));
}
},

addSongWidgetListener_Mp3PurchasedCallback:function(updatedSong,isLast){
var cell=$('songDownload_'+updatedSong.id);
if(cell)cell.innerHTML=$TC(lt.Collection.hasDownload);

if(isLast){

CollectionPage.g.selMgr.fireSelectionChangeEvent();
}
},

showNoSongsMessage:function(){
if(!this.playlist.songs||this.playlist.songs.length>0)return;

if(this.playlist.id=='recentlyUploaded'&&this.isUnfilteredView()){
$TC(lt.Collection.emptyUploaded,'collectionViewContent');
}else{
var t=$T(lt.Collection.emptyPlaylist,'collectionViewContent');
var msg='';

if(this.playlist.keywords){
var searchMsg=$T(lt.Collection.emptySearch);
var playlistName='';
if(this.playlist.id=='recentlyListened'){
playlistName='recent listens';
}else if(this.playlist.id=='songs'){
playlistName+='in your collection';
}else if(this.playlist.id=='recentlyAdded'){
playlistName+='in your recent adds';
}else if(this.playlist.id=='recentlyUploaded'){
playlistName+='in your recent uploads';
}else{
playlistName+='playlist';
}
searchMsg.replaceToken('playlistName',playlistName);
msg=searchMsg.compose();
}else if(this.isRatingFiltered()){
msg='There are no songs with this rating.  '
+'<br>Remove the filter to see more songs.';
}else if(this.playlist.id=='songs'
||this.playlist.id=='recentlyAdded'){
msg='Your collection is empty, find some music!';
}else if(this.playlist.id=='recentlyListened'){
msg='You haven\'t listened to anything yet, find some music!';
}else{
msg='This playlist has no songs.';
}

t.keepTokenBlock('PickBlock',this.playlist.type=='my'
&&this.isUnfilteredView());
t.replaceToken('msg',msg);
t.compose();



if(this.playlist.keywords
||(this.isUnfilteredView()&&this.playlist.type=='locker')){
new widgets.ChunkySearchBox({
renderTargetId:'emptyCollectionViewSearch',
hideMix:true
}).render();
}
}
},

onUnload:function(){mojo.emptyFunction();},
renderAllFillers:function(){mojo.impossible('abstract: renderAllFillers');},
renderFillerRows:function(){mojo.impossible('abstract: renderFillerRows');},
clearPlayingNowRow:function(){mojo.impossible('abstract: clearPlayingNowRow');},
setPlayingNowRow:function(){mojo.impossible('abstract: setPlaylingNowRow');}
};
Object.extend(CollectionPage.SongsView.prototype,AddSongWidgetListener,true);





CollectionPage.ClassicSongsView=Class.create();
CollectionPage.ClassicSongsView.prototype={
initialize:function(){
this.initBase(lt.Collection.classicSongsPaneTemplate,
lt.Collection.classicSongRow,
lt.Collection.classicSongsTable);
this.songRowHeight=((mojo.FF3||mojo.SAFARI)&&mojo.MAC)?19:18;
},


renderFillerRows:function(numEmptyRows){
var songRow=$T(this.songsTableTemplate).getTokenBlock('SongRow');
for(var i=0;i<=numEmptyRows;i++){
songRow.replaceTokenBlock(
'EventBlock',
'onclick=CollectionPage.g.selMgr.clear()');
songRow.replaceToken('oddOrEven',(i%2)==0?'even':'odd');
songRow.removeTokenBlock('BuyLink');
songRow.getTokenBlock('Download').removeTokenBlock('DownloadLink');

if(this.playlist.subtype!='locker'
&&this.playlist.subtype=='recentlyListened'){
songRow.removeTokenBlock('Timestamp');
}else{
songRow.getTokenBlock('Timestamp').removeTokenBlock('BuyLink');
}
if(!this.playlist.isSongsDownloadable){
songRow.removeTokenBlock('Download');
}
mojo.table.insertRow('songTable',songRow.compose());
}
},

renderAllFillers:function(hideSpinner){
var t=$T(this.songsTableTemplate,'collectionViewContent');
var songRow=t.getTokenBlock('SongRow');
for(var i=0;i<this.songPageSize;i++){
songRow.replaceTokenBlock(
'EventBlock',
'onclick=CollectionPage.g.selMgr.clear()');
songRow.replaceToken('oddOrEven',(i%2)==0?'even':'odd');
songRow.removeTokenBlock('BuyLink');
songRow.getTokenBlock('Download').removeTokenBlock('DownloadLink');

if(this.playlist.subtype!='locker'
&&this.playlist.subtype!='recentlyListened'){
songRow.removeTokenBlock('Timestamp');
}else{
songRow.getTokenBlock('Timestamp').removeTokenBlock('BuyLink');
}
if(!this.playlist.isSongsDownloadable){
songRow.removeTokenBlock('Download');
}
songRow.next();
}
if(!hideSpinner){
t.replaceToken('extra',this.getLoadingHtml());
}
t.compose();
},

setPlayingNowRow:function(){
var newIcon=$('currPlayingIcon'+this.currPlayerSong.songLalaId);
if(newIcon)mojo.css.show(newIcon);
},

clearPlayingNowRow:function(){
var oldIcon=$('currPlayingIcon'+this.currPlayerSong.songLalaId);
if(oldIcon)mojo.css.hide(oldIcon);
}
};
Object.extend(CollectionPage.ClassicSongsView.prototype,CollectionPage.SongsView.prototype,true);






CollectionPage.FancySongsView=Class.create();
CollectionPage.FancySongsView.prototype={
initialize:function(){
this.initBase(
lt.Collection.fancySongsPaneTemplate,
lt.Collection.fancySongRow,
lt.Collection.fancySongsTable);
this.songRowHeight=mojo.FF?40:43;

CollectionPage.FancySongsView.g=this;
},

onUnload:function(){},

renderFillerRows:function(){},

renderAllFillers:function(hideSpinner){
if(hideSpinner)return;

var t=$T(this.songsTableTemplate,'collectionViewContent');
t.removeTokenBlock('SongRow');
t.replaceToken('extra',this.getLoadingHtml());
t.compose();
},

onRowMouseOver:function(elem,evt,index){
if(mojo.drag.isDragging)return;
if(!this.playlist.songs)return;

var song=CollectionPage.g.getSongForIndex(index);
if(!song)return;

var row=$('songRow'+song.id);

if(!row.className.lcontains('fancyMouseOver')){
if(this.__currRow&&$(this.__currRow)){
$(this.__currRow).className=$(this.__currRow).className.replace('fancyMouseOver','');
}

this.__currRow='songRow'+song.id;
row.className+=' fancyMouseOver';
}

this.showOrHidePlayAndRemove(true,song);
},

onRowMouseOut:function(elem,evt,index){
if(!this.playlist.songs)return;

var song=CollectionPage.g.getSongForIndex(index);
if(!song)return;

var row=$('songRow'+song.id);
row.className=row.className.replace(' fancyMouseOver','');

this.showOrHidePlayAndRemove(false,song);
},

onPlayButtonHover:function(btn,evt,index){
if(mojo.drag.isDragging)return;
var song=CollectionPage.g.getSongForIndex(index);
var rowId='songRow'+song.id;


$(rowId).className+=' fancyMouseOver';

this.suppressNextPlayAndRemoveHide=true;

var self=this;
var onOpen=function(){


if($(rowId)&&$(rowId).className.lcontains('fancyMouseOver')){
self.showOrHidePlayAndRemove(true,song);
}
};
var onClose=function(){
var row=$(rowId);
if(row){
row.className=row.className.replace(' fancyMouseOver','');



if(!row.className.lcontains('fancyMouseOver')){
self.showOrHidePlayAndRemove(false,song);
}
self.suppressNextPlayAndRemoveHide=false;
}
};

var offsets={};
if(mojo.FF3){
offsets.top=-3;
offsets.left=-1;
}else if(mojo.IE7){
offsets.top=-3;
}
widgets.core.PlayButtonHover.open('medium',song,btn,evt,offsets,null,null,
onOpen,onClose);
},

setPlayingNowRow:function(){
var img=$('songPlayIconImg_'+this.currPlayerSong.songLalaId);
if(!img)return;

var icon=img.parentNode;
if(icon){
var row=mojo.dom.getAncestorByTagName(icon,'TR');
mojo.css.addClass(row,'playingNowRow');
icon.className=icon.className.replace(
'play_icon_full_medium','play_icon_full_medium_pause');
mojo.css.show(icon);
}
},

clearPlayingNowRow:function(){
var img=$('songPlayIconImg_'+this.currPlayerSong.songLalaId);
if(!img)return;

var icon=img.parentNode;
if(icon){
var row=mojo.dom.getAncestorByTagName(icon,'TR');
mojo.css.removeClass(row,'playingNowRow');
icon.className=icon.className.replace(
'play_icon_full_medium_pause','play_icon_full_medium');
mojo.css.hide(icon);
}
},

showOrHidePlayAndRemove:function(isShow,song){

if(!isShow&&this.suppressNextPlayAndRemoveHide){
this.suppressNextPlayAndRemoveHide=false;
return;
}
var id=song.id;
if(isShow){
if(this.__currentSong){
this.showOrHidePlayAndRemove(false,this.__currentSong);
}
this.__currentSong=song;
mojo.css.show('songPlayIcon_'+id);
mojo.css.show('removeLink_'+id);
$('removeLink_'+id).title=this.playlist.type=='my'
?'Remove song from this playlist':
(this.playlist.id=='recentlyListened')
?'Remove song from your recent listens'
:'Permanently delete this song';
}else if(song){
if(!(this.currPlayerSong&&song.songLalaId==this.currPlayerSong.songLalaId)){
if($('songPlayIcon_'+id))mojo.css.hide('songPlayIcon_'+id);
}
if($('removeLink_'+id))mojo.css.hide('removeLink_'+id);
}
}
};
Object.extend(CollectionPage.FancySongsView.prototype,CollectionPage.SongsView.prototype,true);





CollectionPage.SelectionManager=Class.create();
CollectionPage.SelectionManager.EVT_SELECTION_CHANGE='sm_selectionChange';
CollectionPage.SelectionManager.prototype={
initialize:function(){
this.SELECTED='__selected';

this.view=CollectionPage.g.view;
this.playlist=CollectionPage.g.playlist;

this.selection=[];
this.orderedSelection=[];

this.lastClickedIndex=null;
},

onSongClick:function(id,evt,index){
if(!this.selection)return;

var event=mojo.event.create(evt);
if(event.target){
if(event.target.tagName=='INPUT'){
event.ctrlKey=true;
}else if(event.target.tagName=='A'){

if(event.target.className.lcontains('ignoreClick'))return;
}
}


var lastIndex=this.lastClickedIndex;
this.lastClickedIndex=index;

var isSelected=this.isSelected(index);


if(!event.ctrlKey&&!event.shiftKey){
if(isSelected&&this.getCount()==1)return;
this.clear(null,null,true);
this.lastClickedIndex=index;
this.selectSong(index);
}else if(event.ctrlKey){
if(isSelected){
this.clear([index]);
}else{

this.selectSong(index);
}
}else if(event.shiftKey){


if(this.getCount()==0){
this.selectSong(index);
}else{

if(index==lastIndex){
return;
}else{
this.selectSongRange(lastIndex,index,true);
}
}
}
this.fireSelectionChangeEvent();
},

selectSong:function(index,andFire){
if(!this.isSelected(index))this.orderedSelection.push(index);
this.selection[index]=this.SELECTED;

if(this.isShowing(index)&&this.playlist.songs[index]){
var row=$('songRow'+this.playlist.songs[index].id);
if(row&&!row.className.lcontains('selected'))$AC(row,'selected');
}

if(andFire){
this.fireSelectionChangeEvent();
}
},

selectSongRange:function(start,end,skipNotify){
if(start<=end){
for(var i=start;i<=end;i++){
this.selectSong(i);
}
}else{
start--;
for(var j=start;j>=end;j--){
this.selectSong(j);
}
}

if(!skipNotify){
this.fireSelectionChangeEvent();
}
},

fireSelectionChangeEvent:function(){
mojo.listeners.notify(CollectionPage.SelectionManager.EVT_SELECTION_CHANGE);
},


reselectSongs:function(indexes){
var startIndex=Math.max(this.playlist.songSkipCount-2,0);
var endIndex=startIndex+this.view.songPageSize;

if(indexes==null){
endIndex=Math.min(endIndex+2,this.getCount());
for(var j=startIndex;j<endIndex;j++){
if(!this.isSelected(j))this.selectSong(j);
}
}else{
for(var i=0;i<indexes.length;i++){
var index=indexes[i];
if(index<startIndex)continue;
if(index>endIndex)break;

if(!this.isSelected(index)){
this.selectSong(index);
}
}
}
this.fireSelectionChangeEvent();
},

isShowing:function(index){
var start=this.playlist.songSkipCount;
var end=this.playlist.songSkipCount+this.view.songPageSize-1;
return(index>=start&&index<=end);
},

isSelected:function(index){
return this.selection&&this.selection[index]==this.SELECTED;
},

isSongsInModel:function(){
return this.getCount()==this.getSongs().length;
},

clear:function(indexes,resetScroll,skipNotify){
if(!indexes){
this.lastClickedIndex=null;
indexes=this.getSortedIndexes();
}



for(var i=indexes.length-1;i>=0;i--){
var index=indexes[i];
if(this.isSelected(index)){
this.selection[index]=null;
this.orderedSelection.lremove(index);

if(this.isShowing(index)){
$DC('songRow'+this.playlist.songs[index].id,'selected');
}
}
}

if(resetScroll)$('endlessScrollBar').scrollTop=0;
if(!skipNotify){
this.fireSelectionChangeEvent();
}
},

getIndexes:function(){
return this.orderedSelection;
},


getSortedIndexes:function(){
return this.getIndexes().lsortNumeric();
},

getSongs:function(){
var songs=[];
var indexes=this.getIndexes();
for(var i=0;i<indexes.length;i++){
var index=indexes[i];
if(this.playlist.songs&&this.playlist.songs[index]){
songs.push(this.playlist.songs[index]);
}
}
return songs;
},

getCount:function(){
return this.orderedSelection.length;
},



reset:function(){
this.selection=[];
this.orderedSelection=[];
}
};





CollectionPage.Toolbar=Class.create();
CollectionPage.Toolbar.PULLDOWN_OFFSETS={scrollId:'scrollableViewDiv',left:-23,top:-2};
CollectionPage.Toolbar.prototype={
initialize:function(){
this.view=CollectionPage.g.view;
this.playlist=CollectionPage.g.playlist;
this.selMgr=CollectionPage.g.selMgr;
this.pulldowns={};

this.buttons=[];
this.buttons.push(new CollectionPage.Toolbar.ShareButton('slShareButton',this));
this.buttons.push(new CollectionPage.Toolbar.ViewButton('slViewButton',this));
this.buttons.push(new CollectionPage.Toolbar.EditButton('slEditButton',this));
this.buttons.push(new CollectionPage.Toolbar.BuyButton('slBuyButton',this));
this.buttons.push(new CollectionPage.Toolbar.AddButton('slAddButton',this));
this.buttons.push(new CollectionPage.Toolbar.PlayButton('slPlayButton',this));
this.buttons.push(new CollectionPage.Toolbar.QueueButton('slQueueButton',this));
this.buttons.push(new CollectionPage.Toolbar.SelectAllButton('slSelectButton',this));
this.buttons.push(new CollectionPage.Toolbar.UnselectAllButton('slDeselectButton',this));
this.buttons.push(new CollectionPage.Toolbar.ViewToggleButton('viewToggleButton',this));
this.buttons.push(new CollectionPage.Toolbar.LiquidButton('liquidToggleButton',this));


this.filterButton=new CollectionPage.Toolbar.FilterButton('filterTriggerLink',
this,this.onFilterRating.lbind(this));
this.buttons.push(this.filterButton);
},

renderSkeleton:function(){
var bounds=mojo.geometry.getViewportBounds();
var t=$T(lt.Collection.toolbar,'songsToolbar');
var showShrinkToggle=CollectionPage.g.isLiquid||bounds.width>1000;
t.keepTokenBlock('ShrinkExpandBlock',showShrinkToggle);
t.compose();

this.filterButton.render();

mojo.listeners.add(
CollectionPage.SelectionManager.EVT_SELECTION_CHANGE,
this.onSelectionChange.lbind(this));
},


onSelectionChange:function(){
if(!$('slPlayButton'))return;


var selCount=this.selMgr.getCount();
var songs=this.selMgr.getSongs();
var state={
selCount:selCount,
playlist:this.playlist,
playlistHasSongs:this.playlist.songsTotal>0,
songs:songs,
isDigiedSelection:
!this.selMgr.isSongsInModel()
?true:songs.leachBreak(function(s){return s.isDigied;})
};


this.buttons.leach(function(btn){btn.update(state);});


this._displaySelectedCount(selCount);
this._displayTotalSongsCount();
},

_displayTotalSongsCount:function(){
var total=this.playlist.songsTotal;


if(total!=null){
$T(lt.Playlist.songTotals,'songTotals')
.replaceToken('total',mojo.util.addCommasToNumber(total))
.replaceToken('s',total==1?'':'s')
.compose();
}
},

_displaySelectedCount:function(count){
if(count>0){
$S('selectedCount',mojo.util.addCommasToNumber(count)+" selected");
mojo.css.show('selectedCountContainer');
}else{
mojo.css.hide('selectedCountContainer');
$S('selectedCount','&nbsp;');
}
$S('slSelectButton',count>0?'All':'Select all');
},

onFilterRating:function(selectedId,oldId){
var pl=this.playlist;
if(!selectedId){
pl.ratingFrom=-1;
pl.ratingTo=-1;
}else if(selectedId=='unrated'){
pl.ratingFrom=0;
pl.ratingTo=0;
}else{

pl.ratingFrom=parseInt(selectedId.charAt(0));
if(selectedId.length>1&&selectedId.charAt(1)=='+'){
pl.ratingTo=5;
}else{
pl.ratingTo=pl.ratingFrom;
}
}

lala.Track.clientPageInteraction('ratingsFilter');
frontend.go.CollectionPageSearch(
pl.sourcePath,pl.keywords,
pl.ratingFrom,pl.ratingTo);
}
};





CollectionPage.Toolbar.Button=Class.create();
CollectionPage.Toolbar.Button.all={};
CollectionPage.Toolbar.Button.prototype={

initialize:function(id,toolbar){
this.initButton(id,toolbar);
},

initButton:function(id,toolbar){
this.id=id;
this.toolbar=toolbar;
CollectionPage.Toolbar.Button.all[this.id]=this;
},

update:function(state){
if(this.canEnable(state)){
this.enable();
}else{
this.disable();
}
},

enable:function(){
var elem=$(this.id);
if(!elem.className.lcontains('enabledAction')){
elem.className+=' enabledAction';
elem.href='javascript:CollectionPage.Toolbar.Button.all[\''
+this.id+'\'].onAction();';
}
},

disable:function(){
var elem=$(this.id);
elem.className=elem.className.replace(' enabledAction','');
elem.href='javascript:void 0';
},

onClick:function(){
if(!$(this.id).className.lcontains('enabledAction'))return;

this.onAction();
},

canEnable:function(state){},
onAction:function(){},

openPulldown:function(pulldownId,onBeforeOpen){
if(this.toolbar.pulldowns[pulldownId])return;

var w=mojo.pulldown.create({
id:pulldownId,
target:this.id,
openBelowTarget:this.id,
animate:false
});
w.offsets=CollectionPage.Toolbar.PULLDOWN_OFFSETS;
w.onBeforeOpen=onBeforeOpen;

this.toolbar.pulldowns[pulldownId]=w;
this.toolbar.pulldowns[pulldownId].open();
},

createPulldownBox:function(pulldownId){
return new widgets.core.RoundedBox({
renderTargetId:pulldownId,
openBelowTarget:this.id,
mode:'dropShadow',
animate:false
}).render();
}
};


CollectionPage.Toolbar.ShareButton=Class.create();
CollectionPage.Toolbar.ShareButton.prototype={
canEnable:function(state){
var song=state.songs&&state.selCount==1?state.songs[0]:null;
return state.playlistHasSongs
&&(state.playlist.isEmbedable||this._canEmbedSong(song));
},

onAction:function(){
var song;
var sel=CollectionPage.g.selMgr.getSongs();
var pl=CollectionPage.g.playlist;
if(sel.length==1&&this._canEmbedSong(sel[0])){
song=sel[0];
}


widgets.Share.openSharePulldown({
song:song,
elemId:this.id,
relHackId:'songsToolbar',
showEmbedPlaylist:true,
onEmbedPlaylistCallback:pl.isEmbedable?this._onEmbedPlaylist.lbind(this):null,
onSharePlaylistCallback:pl.isEmbedable&&pl.type!='locker'?this._onSharePlaylist.lbind(this):null
});
},

_canEmbedSong:function(song){
return song.isLicensedForStreaming
||(lala.user.isPartnerUploader&&song.isDigied);
},

_onEmbedPlaylist:function(){
lala.Track.click('collectionView.embedPlaylist');

var pl=CollectionPage.g.playlist;
var token=pl.sid||pl.id;
var vars={playlistId:token};
if(pl.type=='locker'){
vars.showItemTime=true;
vars.showItemArt=true;
}

var params={
type:'playlist',
title:'Playlist',
vars:vars,
shareTitle:"Listen to my playlist '"+pl.title+"' for free.",
shareLink:frontend.path.MemberPlaylist(token),
footerText:pl.title
};
widgets.core.WidgetEmbed.open(params);
},

_onSharePlaylist:function(){
lala.Track.click('collectionView.sharePlaylist');

widgets.Share.dialogShareWidget=new widgets.Share({
shareObj:CollectionPage.g.playlist,
shareType:'playlist'
});
widgets.Share.openRecoDialog(CollectionPage.g.playlist,'playlist');
}
};
Object.extend(CollectionPage.Toolbar.ShareButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.ViewButton=Class.create();
CollectionPage.Toolbar.ViewButton.prototype={
canEnable:function(state){
return state.playlistHasSongs
&&(state.playlist.isPublicViewable
||(state.selCount==1
&&state.songs&&state.songs[0]
&&(state.songs[0].artist||state.songs[0].linkDiscLalaId)));
},

onAction:function(){
var self=this;
var selMgr=CollectionPage.g.selMgr;
var pl=CollectionPage.g.playlist;
this.openPulldown(
'viewPulldown',
function(){
var selCount=selMgr.getCount();
var rbw=self.createPulldownBox('viewPulldown');
var t=$T(lt.Collection.viewPulldown,rbw.contentId)
.replaceToken('s',selCount>1?'s':'');

var song=
selCount==1
?selMgr.getSongs()[0]:null;
if(song){
if(song.artist){
t.replaceToken(
'artistSongLink',
frontend.link.Artist(
song.artist,
null,'collectionPage.viewSongArtist'));
}else{
t.replaceToken('disableViewArtist','disabledMenuItem');
}

if(song.linkSongLalaId){
t.replaceToken(
'albumSongLink',
frontend.link.Album(
song.linkDiscLalaId,
null,'collectionPage.viewSongAlbum'));
}else{
t.replaceToken('disableViewAlbum','disabledMenuItem');
}
}else{
t.replaceToken('disableViewArtist','disabledMenuItem');

}

if(pl.isPublicViewable){
t.replaceToken(
'playlistLink',
frontend.link.MemberPlaylist(
pl.id,
'collectionPage.viewPublicPlaylist',
pl.title));
}else{
t.replaceToken('disableViewPlaylist','disabledMenuItem');
}
t.compose();
});
}
};
Object.extend(CollectionPage.Toolbar.ViewButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.EditButton=Class.create();
CollectionPage.Toolbar.EditButton.prototype={
canEnable:function(state){
return state.playlist.isInfoEditable
||state.selCount>0
||state.playlist.isDeleteable;
},

onAction:function(){
var self=this;
var pl=this.toolbar.playlist;
this.openPulldown(
'editPulldown',
function(){
var isNonDigiedSel=false;
var sel=CollectionPage.g.selMgr.getSongs();
sel.leach(function(song){
if(!song.isDigied)isNonDigiedSel=true;
});
var selCount=self.toolbar.selMgr.getCount();
var rbw=self.createPulldownBox('editPulldown');
var t=$T(lt.Collection.editPulldown,rbw.contentId)
.replaceToken('s',selCount>1?'s':'')
.replaceToken('playlistId',pl.id);

if(selCount==0||isNonDigiedSel){
t.replaceToken('disableEditSong','disabledMenuItem');
t.replaceToken('disableEditSongAction','return false');
}
if(selCount==0){
t.replaceToken('disableDeleteSong','disabledMenuItem');
t.replaceToken('disableDeleteSongAction','return false');
}
if(!pl.isInfoEditable){
t.replaceToken('disableEditPlaylist','disabledMenuItem');
t.replaceToken('disableEditPlaylistAction','return false');
}
if(!pl.isDeleteable){
t.replaceToken('disableDeletePlaylist','disabledMenuItem');
t.replaceToken('disableDeletePlaylistAction','return false');
}
t.compose();
});
}
};
Object.extend(CollectionPage.Toolbar.EditButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.BuyButton=Class.create();
CollectionPage.Toolbar.BuyButton.prototype={
canEnable:function(state){
return state.playlistHasSongs
&&(this._canBuyPlaylist()||this._canBuyMp3s());
},

onAction:function(){
var self=this;
this.openPulldown(
'buyPulldown',
function(){
var rbw=self.createPulldownBox('buyPulldown');
var canBuyPlaylist=self._canBuyPlaylist();
var mp3Count=self._canBuyMp3s(true);

var t=$T(lt.Collection.buyPulldown,rbw.contentId)
.replaceToken('s',mp3Count==1?'':'s');
if(mp3Count<=0||mp3Count>50){
t.replaceToken('disableSongs','disabledMenuItem');
t.replaceToken('disableSongsAction','return false');
}
if(!canBuyPlaylist){
t.replaceToken('disablePlaylist','disabledMenuItem');
t.replaceToken('disablePlaylistAction','return false');
}
t.compose();
});
},


_canBuyPlaylist:function(){

if(!this.toolbar.playlist.songs)return false;

var hasOneDownloadableSong=false;
for(var i=0;i<this.toolbar.playlist.songs.length;i++){
var song=this.toolbar.playlist.songs[i];
if(song&&frontend.canPurchaseDownload(song)){
hasOneDownloadableSong=true;
break;
}
}
return this.toolbar.playlist.isDownloadable
&&hasOneDownloadableSong
&&this.toolbar.playlist.songsTotal<=50
&&!this.toolbar.playlist.keywords;
},


_canBuyMp3s:function(count){
if(this.toolbar.selMgr.isSongsInModel()){
var num=0;
this.toolbar.selMgr.getSongs().leach(function(s){if(frontend.canPurchaseDownload(s))num++;})

if(count)return num;
else return(num>0&&num<=50);
}
return false;
}
};
Object.extend(CollectionPage.Toolbar.BuyButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.AddButton=Class.create();
CollectionPage.Toolbar.AddButton.prototype={
canEnable:function(state){
return state.isDigiedSelection;
},

onAction:function(){
var elemId=this.id;
if(!this.toolbar.pulldowns.add){
this.toolbar.pulldowns.add=new widgets.AddToPlaylist({elemId:elemId});
}


var self=this;
this.toolbar.pulldowns.add.onAddToPlaylist=function(dstId){
CollectionPage.g.addSelectedSongs(dstId);
self.toolbar.pulldowns.add.pulldown.close();
};

this.toolbar.pulldowns.add.onClick({});
}
};
Object.extend(CollectionPage.Toolbar.AddButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.PlayButton=Class.create();
CollectionPage.Toolbar.PlayButton.prototype={
canEnable:function(state){
return state.playlistHasSongs;
},

onAction:function(){
CollectionPage.g.playSongs();
}
};
Object.extend(CollectionPage.Toolbar.PlayButton.prototype,CollectionPage.Toolbar.Button.prototype,true);


CollectionPage.Toolbar.QueueButton=Class.create();
CollectionPage.Toolbar.QueueButton.prototype={
canEnable:function(state){
return state.playlistHasSongs;
},

onAction:function(){
CollectionPage.g.queueSongs();
}
};
Object.extend(CollectionPage.Toolbar.QueueButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.SelectAllButton=Class.create();
CollectionPage.Toolbar.SelectAllButton.prototype={
canEnable:function(state){
return state.playlistHasSongs&&state.selCount!=state.playlist.songsTotal;
},

onAction:function(){
if(this.toolbar.playlist.songs.length==0)return;
this.toolbar.selMgr.selectSongRange(0,this.toolbar.playlist.songsTotal-1);
}
};
Object.extend(CollectionPage.Toolbar.SelectAllButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.UnselectAllButton=Class.create();
CollectionPage.Toolbar.UnselectAllButton.prototype={
canEnable:function(state){
return state.selCount>0;
},

onAction:function(){
this.toolbar.selMgr.clear();
}
};
Object.extend(CollectionPage.Toolbar.UnselectAllButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.ViewToggleButton=Class.create();
CollectionPage.Toolbar.ViewToggleButton.prototype={
update:function(){

if(!$(this.id))return;

this._updateButton();
},

onAction:function(){

CollectionPage.g.isNewSongsView=!CollectionPage.g.isNewSongsView;

DataModel.g.setUserPreference('isNewSongsView',CollectionPage.g.isNewSongsView);
lala.Track.clientPageInteraction('songsViewToggle.'+CollectionPage.g.isNewSongsView);

CollectionPage.g.reloadPage();
},

_updateButton:function(){
var btn=$(this.id);
btn.className=CollectionPage.g.isNewSongsView?'switchToOldView':'switchToNewView';
btn.title=CollectionPage.g.isNewSongsView?'Switch to the old songs view':'Switch to the new songs view';
}
};
Object.extend(CollectionPage.Toolbar.ViewToggleButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.LiquidButton=Class.create();
CollectionPage.Toolbar.LiquidButton.prototype={
update:function(){

if(!$(this.id))return;

this._updateLiquidButton();
},

onAction:function(){

CollectionPage.g.isLiquid=!CollectionPage.g.isLiquid;
MyMusic.g.page.adjustSkeletonForLiquidChange();

this._updateLiquidButton();

DataModel.g.setUserPreference('isCollectionLiquid',CollectionPage.g.isLiquid);
lala.Track.clientPageInteraction('liquidToggle.'+CollectionPage.g.isLiquid);
},

_updateLiquidButton:function(){
var btn=$('liquidToggleButton');
btn.className=this._getLiquidToggleBtnClass();
btn.title=this._getLiquidToggleTitle();
},

_getLiquidToggleBtnClass:function(){
return CollectionPage.g.isLiquid?'shrink':'expand';
},

_getLiquidToggleTitle:function(){
return CollectionPage.g.isLiquid?'Use a fixed width':'Fill the screen';
}
};
Object.extend(CollectionPage.Toolbar.LiquidButton.prototype,CollectionPage.Toolbar.Button.prototype,true);

CollectionPage.Toolbar.FilterButton=Class.create();
CollectionPage.Toolbar.FilterButton.prototype={
initialize:function(id,toolbar,onFilterCallback){
this.initButton(id,toolbar);
this.onFilterCallback=onFilterCallback;
this.create();
},

canEnable:function(){


return this.toolbar.playlist.songsTotal>0
||this.toolbar.playlist.ratingTo!=-1
||this.toolbar.playlist.ratingFrom!=-1;
},

enable:function(){
var elem=$(this.id);
elem.className+=' enabledAction';
this.ratingPulldown.enable();
},

disable:function(){
this.ratingPulldown.disable();
var elem=$(this.id);
elem.className=elem.className.replace(' enabledAction','');
},

create:function(){
var filterTrigger=$T(lt.Collection.filterButton)
.replaceToken('buttonText','Filter')
.compose();

this.ratingPulldown=new widgets.core.Select({
id:'ratingPulldown',
selectBoxTargetId:'filterTrigger',
selectBoxHtml:filterTrigger,
pulldownWidth:'180px',
selectionCallback:this.onFilterCallback.lbind(this)
});

var rating=new RatingWidget({
type:RatingWidget.TYPE_USER,
size:RatingWidget.SIZE_LARGE
});

var fivestar=rating.renderFake(5);
var fourstar=rating.renderFake(4);
var threestar=rating.renderFake(3);
var twostar=rating.renderFake(2);
var onestar=rating.renderFake(1);


if(this.toolbar.view.isRatingFiltered()){
this.ratingPulldown.addOption('showAll','Show All',
{clearsSelection:true});
this.ratingPulldown.addHRule('hRuleTop');
}

this._addRatingsFilterOption(this.ratingPulldown,'4+',fourstar+' or more');
this._addRatingsFilterOption(this.ratingPulldown,'3+',threestar+' or more');
this._addRatingsFilterOption(this.ratingPulldown,'2+',twostar+' or more');
this._addRatingsFilterOption(this.ratingPulldown,'1+',onestar+' or more');

this.ratingPulldown.addHRule('hRule1');

this._addRatingsFilterOption(this.ratingPulldown,'5',fivestar);
this._addRatingsFilterOption(this.ratingPulldown,'4',fourstar);
this._addRatingsFilterOption(this.ratingPulldown,'3',threestar);
this._addRatingsFilterOption(this.ratingPulldown,'2',twostar);
this._addRatingsFilterOption(this.ratingPulldown,'1',onestar);

this.ratingPulldown.addHRule('hRule2');

this._addRatingsFilterOption(this.ratingPulldown,'unrated',
'Unrated songs only','Unrated');
},

_addRatingsFilterOption:function(pulldown,optionId,optionContent,buttonText){

var pl=this.toolbar.playlist;
var selected=null;
if(pl.ratingFrom==pl.ratingTo){
if(pl.ratingFrom==0){
selected='unrated';
}else if(pl.ratingFrom!=-1){
selected=pl.ratingFrom;
}
}else{
selected=pl.ratingFrom+'+';
}

if(!buttonText)buttonText=optionId;
buttonText='<span class="filterInfo">('+buttonText+')</span>';
var button=$T(lt.Collection.filterButton)
.replaceToken('buttonText','Filter '+buttonText)
.compose();
pulldown.addOption(
optionId,
optionContent,
{optionSelectedHtml:button,isSelected:optionId==selected});
},

render:function(){
this.ratingPulldown.render();
}
};
Object.extend(CollectionPage.Toolbar.FilterButton.prototype,CollectionPage.Toolbar.Button.prototype,true);





CollectionPage.LeftPane=Class.create();
CollectionPage.LeftPane.prototype={
initialize:function(){
this.sortKeyAlpha='a-z';
this.sortKeyEdit='edit';
this.sortPrefKey='collectionPlaylistSort';
this.footerHeight=26;
if(lala.isBetaEnabled){
this.footerHeight+=27;
}

this.playlistSort=
DataModel.g.getUserPreference(this.sortPrefKey,this.sortKeyAlpha);
this.selectSortMenu=this._createSortPlaylistsMenu();
},

render:function(){
var liquidHeight=MyMusic.g.getLiquidHeight()-1;
var t=$T(lt.Collection.leftPane,'leftPane');
t.removeTokenBlock('BetaFeedbackBlock',!lala.isBetaEnabled);

this._renderLockerPlaylists(t);
t.replaceToken('leftNavHeight',(liquidHeight-this.footerHeight)+'px');


t.replaceToken('sortMenuArrow',this.selectSortMenu.getHtml());
t.compose();


this._renderMyPlaylists();
this._updateFooter();
this._initListeners();
this._updatePlaylistCounts();
},

_initListeners:function(){
mojo.listeners.add(
api.Playlists.EVT_PLAYLIST_INFO_CHANGED,
this._onPlaylistInfoChanged.lbind(this));
mojo.listeners.add(
DataModel.EVT_PLAYLIST_ADDED,
this._onPlaylistAdded.lbind(this));
mojo.listeners.add(
api.Playlists.EVT_PLAYLIST_DELETED,
this._onPlaylistDeleted.lbind(this));
mojo.listeners.add(
DataModel.EVT_PENDING_PLAYLIST_COUNT_CHANGE,
this._onPlaylistCountChanged.lbind(this));
},


_renderLockerPlaylists:function(t){
var lockerPlaylistBlock=t.getTokenBlock('LockerPlaylistBlock');
DataModel.g.getLockerPlaylists().leach(function(pl){
if(pl.id=='songs')return;

lockerPlaylistBlock.replaceTokensWithBean('pl',pl)
.replaceToken('trackingId',pl.id.ltoFirstUpperCase())
.next();
});
},

_renderMyPlaylists:function(){
var t=$T(lt.Collection.userPlaylists,'myPlaylists');
if(DataModel.g.getPlaylists().length>0){
var playlistBlock=t.getTokenBlock('MyPlaylistBlock');
var playlists=
this.playlistSort==this.sortKeyEdit
?DataModel.g.getRecentPlaylists()
:DataModel.g.getPlaylists();
playlists.leach(function(pl,index){
playlistBlock.replaceTokensWithBean('pl',pl);
playlistBlock.replaceToken('href',frontend.link.Playlist(pl.id));
playlistBlock.replaceToken('index',index);
playlistBlock.next();
});
}else{
t.removeTokenBlock('MyPlaylistBlock');
}
t.compose();

this.scrollToSelectedPlaylist();
},

_createSortPlaylistsMenu:function(){
var offsets={};
if(mojo.FF){
offsets.left=30;
}else if(mojo.WEBKIT){
offsets.top=20;
offsets.left=130;
}else if(mojo.IE){
offsets.left=100;
}

var sortMenuArrow=$TC(lt.Collection.sortMenuArrow);
var menu=new widgets.core.Select({
selectBoxHtml:sortMenuArrow,
pulldownWidth:'155px',
selectionCallback:this.onSortPlaylists.lbind(this),
id:'sortMenu',
pulldownOffsets:offsets,
scrollContainer:'collectionLeftNav'
});

menu.addOption('createNew','Create new playlist',{
optionSelectedHtml:sortMenuArrow,
extraClass:'createOption'
});
menu.addHRule();
menu.addOption(
'sortLabel',
'<span class="sortLabel">Sort playlists:</span>',{
isSelectable:false
});
menu.addOption(this.sortKeyAlpha,'A-Z',{
isSelected:this.playlistSort==this.sortKeyAlpha,
optionSelectedHtml:sortMenuArrow
});
menu.addOption(this.sortKeyEdit,'Last edited',{
isSelected:this.playlistSort==this.sortKeyEdit,
optionSelectedHtml:sortMenuArrow
});
return menu;
},

_updateFooter:function(){
$D('footer',false);
if(lala.isBetaEnabled&&!mojo.IE6){

if($('betaFeedbackButton'))$D('betaFeedbackButton',false);
}
},

onOpenUploadPulldown:function(elem,event){
mojo.event.create(event).stopPropagation();
var w=mojo.pulldown.create({
id:'uploadPulldown',
target:elem,
openBelowTarget:elem,
animate:false
});

w.offsets=CollectionPage.Toolbar.PULLDOWN_OFFSETS;
w.onBeforeOpen=function(div){
var rbw=new widgets.core.RoundedBox({
renderTargetId:'uploadPulldown',
openBelowTarget:elem,
mode:'dropShadow',
animate:false,
width:'150px'
}).render();

$TC(lt.Collection.uploadPulldown,rbw.contentId);
};

w.open();
},

onSortPlaylists:function(selectedId,oldId){
if(selectedId=='createNew'){
this.selectSortMenu.manualSelect(oldId);
MyMusic.g.openCreatePlaylistDialog(function(pl){
frontend.go.Playlist(pl.id);
});
}else{
this.playlistSort=selectedId;
this._renderMyPlaylists();
DataModel.g.setUserPreference(this.sortPrefKey,selectedId);
}
},


onOpenEditPlaylistPulldown:function(elem,playlistId){
var pulldownId='editPlaylistPulldown_'+playlistId;
var w=mojo.pulldown.create({
id:pulldownId,
target:elem,
openBelowTarget:elem,
animate:false
});

w.offsets=CollectionPage.Toolbar.PULLDOWN_OFFSETS;
w.offsets.scrollId='collectionLeftNav';
w.offsets.checkBottom=true;
w.onBeforeOpen=function(div){
var rbw=new widgets.core.RoundedBox({
renderTargetId:pulldownId,
openBelowTarget:elem,
mode:'dropShadow',
animate:false,
width:'155px'
}).render();

$T(lt.Collection.editPlaylistPulldown,rbw.contentId)
.replaceToken('pid',playlistId)
.compose();

$AC(elem.parentNode,'opened');
};
w.onClose=function(){
if($(elem.parentNode))$DC(elem.parentNode,'opened');
};
w.open();
},

resize:function(){
var liquidHeight=MyMusic.g.getLiquidHeight()-1;
$('collectionLeftNav').style.height
=(liquidHeight-this.footerHeight)+'px';
},


scrollToSelectedPlaylist:function(){
var playlist=CollectionPage.g.playlist;
var index=$('playlist_'+playlist.id).getAttribute('_index');

if(index!=null){
var height=$B($('collectionLeftNav')).height;

if(170+20*index>height){

window.setTimeout(function(){
var elem=$('collectionLeftNav');
if(elem){
elem.scrollTop=170+20*(index-1);
}
},10);
}
}

this._updatePlaylistSelection(playlist);
},

_onPlaylistInfoChanged:function(evt){
this._renderMyPlaylists();
},

_onPlaylistAdded:function(evt){
this._renderMyPlaylists();



var playlistCounts=DataModel.g.getPlaylistCounts();
for(var pId in playlistCounts){
var count=playlistCounts[pId]||0;
if(count>0)this._updatePlaylistCount(pId,count);
}
},

_onPlaylistDeleted:function(evt){
var selPlaylist=DataModel.g.getPlaylists().lfirst();
if(selPlaylist==null&&DataModel.g.getLockerPlaylists().length>0){
selPlaylist=DataModel.g.getLockerPlaylists()[1];
}else if(selPlaylist==null){
frontend.go.Home();
return;
}

frontend.go.Playlist(selPlaylist.id);
},

_onPlaylistCountChanged:function(evt){
if(!evt||evt.id=='songs')return;
this._updatePlaylistCount(evt.id,evt.count);
},

_updatePlaylistCount:function(playlistId,count){
var bubble=$('playlistAdded_'+playlistId);
if(bubble){
var countInfo=Header.g.getAlertCountInfo(count);
bubble.className=countInfo.className;
Header.g.setAlertCountText(bubble,countInfo.label);
}
},

_updatePlaylistCounts:function(){

var playlistCounts=DataModel.g.getPlaylistCounts();
for(var pId in playlistCounts){
var count=playlistCounts[pId]||0;
if(count>0)this._updatePlaylistCount(pId,count);
}
},

_updatePlaylistSelection:function(pl){
var linkId='playlist_'+pl.id;
$AC(linkId,'selected');
}
};





CollectionPage.HistoPane=Class.create();
CollectionPage.HistoPane.prototype={
initialize:function(){
this.view=CollectionPage.g.view
this.playlist=CollectionPage.g.playlist;


this.height=null;
this.heightPerc=0.30;
},

isEnabled:function(){
return this.playlist.defaultViewMode=='histo';
},

updateHeight:function(lheight){
this.height=Math.floor(lheight*this.heightPerc);
},

getHeight:function(){
return this.height;
},

renderSkeleton:function(){
if(!this.isEnabled())return;

$TC(lt.Collection.histoPane,'previewPane');
this.resize();
},



render:function(forceRedraw){
if(!this.playlist.histos)return;

var isSurgicalUpdate=!forceRedraw&&this._isSurgicalUpdate();
for(var type in this.playlist.histos){
var vals=this.playlist.histos[type];
this._renderHistoType(type,vals,isSurgicalUpdate,forceRedraw);
}

this._tweakOverflowForBleeding();
},


_isSurgicalUpdate:function(){
var isUpdated=false;
for(var type in this.playlist.histos){
if(this.playlist.histos[type].__updated){
isUpdated=true;
break;
}
}

return isUpdated;
},

_renderHistoType:function(type,vals,isSurgicalUpdate,forceRedraw){

if(isSurgicalUpdate&&!vals.__updated)return;


var upperType=type.substring(0,1).toUpperCase()+type.substring(1)+'s';
var allName='All ('+vals.length+' '+upperType+')';
vals.linsertAt({name:allName,isAll:true},0);




var idGenerator=0;
var selHisto=this.playlist.histosSelected[type];
var currSelVal=selHisto?selHisto.clientId:0;
var t=$T(lt.Collection.histoValue,type+'Histos');

for(var j=0;j<vals.length;j++){
var v=vals[j];
v.clientId=idGenerator++;
this._renderHistoValue(t,v,currSelVal,type);

t.replaceToken('index',j-1);
t.next();
}
t.compose();

if(selHisto&&forceRedraw){
$(type+'Histos').scrollTop=Math.max(0,selHisto.clientId-2)*16;
}else if(!selHisto){
if($(type+'Histos').scrollTop!=0)$(type+'Histos').scrollTop=0;
}
vals.lremoveAt(0);
delete vals.__updated;
},

_renderHistoValue:function(t,v,currSelVal,type){
var valueName=v.name;
var valueId=v.clientId;
if(valueName==''){
valueName='&lt;Unknown&gt;';
}

t.replaceToken('type',type);
t.replaceToken('valueId',valueId);
t.replaceToken('valueName',valueName);

if(currSelVal==valueId){
t.replaceToken('selected','selected');
}
},


_tweakOverflowForBleeding:function(){
if(!(mojo.MAC&&mojo.FF))return;

var allHistos=['genreHistos','artistHistos','albumHistos'];
var self=this;
allHistos.leach(function(h){
if(self.playlist.songsTotal==0){
$(h).style.overflow='hidden';
}else{
$(h).style.overflowX='hidden';
$(h).style.overflowY='scroll';
}
})
},

onHistoClick:function(type,index){
var histo=this.playlist.histos[type][index];
if(histo==null){


histo={clientId:0,name:null};
}


for(var currType in this.playlist.histosSelected){
var tmpHisto=this.playlist.histosSelected[currType];
if(!tmpHisto){

tmpHisto={clientId:0};
}

var oldE=$(currType+tmpHisto.clientId);
if(oldE){
$DC(oldE,'selected');
}
}


if(type=='genre'){
this.playlist.histosSelected.artist=null;
this.playlist.histosSelected.album=null;
}else if(type=='artist'){
this.playlist.histosSelected.album=null;
}
this.playlist.histosSelected[type]=(histo.clientId==0)?null:histo;


for(var currType in this.playlist.histosSelected){
var tmpHisto=this.playlist.histosSelected[currType];
if(!tmpHisto){

tmpHisto={clientId:0};
}

var newE=$(currType+tmpHisto.clientId);
if(newE){
$AC(newE,'selected');
}
}


CollectionPage.g.selMgr.clear(null,true);
CollectionPage.g.loadAndRenderSongs({
keepHistoSelected:true,
keepHistos:true,
keepKeywords:true,
reloadSongs:true
});

lala.Track.clientPageInteraction('histoFilter.'+type);
},

resize:function(){
var self=this;
if(!this.isEnabled())return;


var cols=['genreHistos','artistHistos','albumHistos'];
cols.leach(function(id){
mojo.geometry.setBounds(id,{height:self.height-25});
});
},

onResizeDivider:function(evt){
var self=this;
var movingDiv=null;
var origTop=null;

mojo.drag.onstart=function(state){
var bounds=mojo.geometry.getBounds('previewPaneDivider');
movingDiv=mojo.dom.cloneElement('previewPaneDivider','movingDivider');
origTop=bounds.top;
};

mojo.drag.onmove=function(state){
var newTop=origTop+state.dy;
if(newTop<150)return;
if(newTop>(CollectionPage.g.getLiquidHeight()-100))return;

mojo.geometry.setBounds(movingDiv,{top:newTop});
};

mojo.drag.onstop=function(state){
var lastTop=parseInt($B(movingDiv).top);
var delta=lastTop-origTop;

var newHeight=self.height+delta;
var newPerc=newHeight/CollectionPage.g.getLiquidHeight();
self.heightPerc=newPerc;

CollectionPage.g.onInPageResize();
};

mojo.drag.onfinish=function(state){
if(movingDiv)movingDiv.parentNode.removeChild(movingDiv);
};

mojo.drag.start(evt);
}
};






CollectionPage.InfoPane=Class.create();
CollectionPage.InfoPane.prototype={
initialize:function(){
this.view=CollectionPage.g.view
this.playlist=CollectionPage.g.playlist;
this.height=80;
},

isEnabled:function(){
return this.playlist.type=='my';
},

getHeight:function(){
return this.height;
},

render:function(){
var self=this;
if(!this.isEnabled())return;

$TC(lt.Collection.infoPane,'previewPane');

this.builder=new PlaylistBuilder({
renderTargetId:'infoPane',
playlist:this.playlist,
onViewHeightChange:function(){
self.height=$B('previewPane').height;
CollectionPage.g.onInPageResize();
}
});
this.builder.onPlaySongs=function(){
CollectionPage.g.playSongs(true);
};
this.builder.onQueueSongs=function(){
CollectionPage.g.queueSongs(true);
};
this.builder.onSongAddedCallback=function(){
CollectionPage.g._onPlaylistSongAdded(self.playlist,
function(){

mojo.dom.scrollToBottom('endlessScrollBar');
CollectionPage.g.selMgr.selectSong(
self.playlist.songsTotal-1,true);
},
{keepSort:false});
};
this.builder.loadAndRender();
}
};





CollectionPage.DragHandler=Class.create();
CollectionPage.DragHandler.prototype={
initialize:function(){
this.view=CollectionPage.g.view;
this.playlist=CollectionPage.g.playlist;
this.selMgr=CollectionPage.g.selMgr;


this.row=null;
},

onMouseDown:function(songId,evt,index){
var self=this;
var song=CollectionPage.g.getSongForIndex(index);
if(!song.isDigied&&this.playlist.subtype!='uploadQ'){

this.onSongClick(songId,evt,index);
return;
}

mojo.drag.onclick=function(state,evt){
self.onSongClick(songId,evt,index);
};
mojo.drag.onstart=function(){

if(!self.selMgr.isSelected(index)){
self.selMgr.onSongClick(songId,evt,index);
}


var sel=self.selMgr.getSongs();
if(!$('draggingDiv')){
mojo.dom.parseHTMLFragment(lt.Playlist.draggingDiv,document.body);
}
mojo.drag.dragElem=$('draggingDiv');
$('draggingCount').innerHTML=self.selMgr.getCount();

self.onDragStart(sel);
};

mojo.drag.onsetstartposition=function(state){
return{
top:state.startEvent.pageY+mojo.drag.ELEM_OFFSET_Y,
left:state.startEvent.pageX+mojo.drag.ELEM_OFFSET_X+10
};
};

mojo.drag.start(evt);
},

onSongClick:function(songId,evt,index){
var event=mojo.event.create(evt);
if(event.target&&event.target.tagName=='A'){
var cls=event.target.className;
if(cls.lcontains('fancyNavLink')){


return;
}
}
this.selMgr.onSongClick(songId,evt,index);
},

onDragStart:function(selSongs){
var self=this;
CollectionPage.g.onAddToPlaylistDragAddDropTargets(selSongs);
CollectionPage.g.onRearrangeDragAddDropTargets(selSongs);

mojo.drag.ontargetover=function(elem,state){
if(elem.id=='songsPaneColumnHeaders'){
self._startMoveTimer(true);
}else{
mojo.drag.onmove(state);
}
};

mojo.drag.onmove=function(state){
if(!state.target)return;
if(state.target.id=='songTable'){
var row=mojo.dom.getAncestorByTagName(state.currentEvent.target,'TR');

if(row){

if(self.row&&row!=self.row){
$DC(self.row,'overTarget');
}
self.row=row;
if(!self.row.className.lcontains('overTarget')){
$AC(self.row,'overTarget');
}
}

var moveDownSlopBorder=
mojo.geometry.getViewportBounds().height-20;

if(state.currentEvent.pageY>=moveDownSlopBorder){

self._startMoveTimer(false);
}else if(state.currentEvent.pageY<moveDownSlopBorder){
self._clearMoveTimer();
}
}else{



if(self.hoveredPlaylist)$DC(self.hoveredPlaylist,'playlistLinkHover');
self.hoveredPlaylist=state.target.id;
$AC(self.hoveredPlaylist,'playlistLinkHover');
}
};

mojo.drag.ontargetout=function(elem,state){
self._clearMoveTimer();
if(elem.id=='songTable'&&self.row)$DC(self.row,'overTarget');
else if(self.hoveredPlaylist)$DC(self.hoveredPlaylist,'playlistLinkHover');
};

mojo.drag.ontargetdrop=function(div,state){
CollectionPage.g.onAddToPlaylistDragTargetDrop(div);
CollectionPage.g.onRearrangeDragTargetDrop(div,state);
};
},

_startMoveTimer:function(goingUp){
if(!this.moveTimer){
this.moveCount=0;
this.moveInterval=400;
this.accelerateThreshold=6;
var delta=(goingUp?-2:2)*CollectionPage.g.view.songRowHeight;
this._setMoveTimer(delta);
}
},

_setMoveTimer:function(delta){
var self=this;
this.moveTimer=window.setInterval(function(){


if(self.row)$DC(self.row,'overTarget');
$('endlessScrollBar').scrollTop+=delta;


self.moveCount++;
if(self.moveCount>self.accelerateThreshold&&self.moveInterval>=200){
self.moveInterval-=100;
self.accelerateThreshold*=2;
self._clearMoveTimer();
self._setMoveTimer(delta);
}
},this.moveInterval);
},

_clearMoveTimer:function(){
if(this.moveTimer){
window.clearInterval(this.moveTimer);
this.moveTimer=null;
}
}
};

CollectionPage.SearchBox=Class.create();
CollectionPage.SearchBox.prototype={
onAutoComplete:function(sterm,mode){
var playlist;
var matches=[];

if(mode=='collection'){
playlist=DataModel.g.getSongsPlaylist();
}else{

playlist=CollectionPage.g.playlist;
}

if(playlist){
if(playlist.artistMatcher){
matches=playlist.artistMatcher.getMatches(sterm);
}else{



playlist.loadArtistMatcher();
matches=null;

}
}
HeaderSearchBox.g.getAutoComplete().fillMatches(matches,sterm);
},

setSearchMode:function(pl){
var self=this;

if(pl.subtype=='locker'){

HeaderSearchBox.g.setMode('collection',pl.keywords);
}else{

var label;
if(pl.type!='locker'){

label='Playlist';
}else if(pl.subtype=='recentlyUploaded'){
label='Recent Uploads';
}else if(pl.subtype=='uploadQ'){
label='Upload Queue';
}else if(pl.subtype=='recentlyAdded'){
label='Recent Adds';
}else if(pl.subtype=='recentlyListened'){
label='Recent Listens';
}else{
mojo.log.error('unsupported collection type: '+pl.subtype);
}

HeaderSearchBox.g.setCustomMode(
new HeaderSearchBoxMode({
displayName:'Search '+label,
clearIconEnabled:true,
autoCompleteEnabled:true,
onFillDelegate:function(sterm){
self.onAutoComplete(sterm,'custom');
},
onSearch:function(text){
HeaderSearchBox.g.gotoSearchCollection(
text,
pl.sourcePath,
pl.ratingFrom,
pl.ratingTo);
}}),
pl.keywords);
}
}
};
CollectionPage.SearchBox.g=new CollectionPage.SearchBox();





MyMusic.addPageRegex(
'playlist',
/playlist\/.*$/,
function(pathParts){
var token=pathParts[1];
if(token){
token=token.replace(':auto','');
}




if(DataModel.g.containsPlaylist(token)){
var pl=DataModel.g.getPlaylist(token);
var page=pl.page;
return page;
}else{
return new MemberPlaylistPage();
}
});
MyMusic.addPage(
['songs','recentlyAdded','recentlyUploaded','recentlyListened','uploadQ'],
function(pathParts){
var page=null;
var pl=DataModel.g.getPlaylist(pathParts[0]);
if(pl!=null){
page=pl.page;
}else{




page=new Page().initPage({authLevel:1});
}
return page;
});















MemberPage=Class.create();
MemberPage.prototype={
initialize:function(){
this.initPage({pageTitle:'Member',pageId:'Member',
skelClass:'memberPage'});
this.userToken=null;
this.user=null;
this.userFriendInfo=null;

MemberPage.g=this;

mojo.listeners.add(
api.LalaForecast.EVT_FORECAST_UPDATED,
this.onForecastUpdated.lbind(this));
},

onLoad:function(pathParts){
var self=this;

this.userToken=pathParts[1];
var plPromo=ArtistPromos.g.byUser(this.userToken);
if(plPromo){
frontend.go.Artist(plPromo.artistName,null,'ArtistPromo.'+plPromo.cid);

return;
}

if(this.userToken=='cancelled'){
this.renderIntoContentRegion($T(lt.Member.cancelled));
return;
}
if(!this.userToken.lcontains('@')){
MyMusic.g.pageNotFound(pathParts.join('/'));
return;
}


this.initTabId=pathParts.length>1?pathParts[2]:null;

api.ProfilePage.getData(
this.userToken,
function(res){
self.user=res.data.user;
self.userFriendInfo=res.data.userExtra;
self.becauseOfYou=res.data.becauseOfYou;
self.forecastTracks=res.data.forecastTracks;
self.followerInfo={
recentlyFollowing:res.data.recentlyFollowing,
recentlyFollowedBy:res.data.recentlyFollowedBy
}
self.collectionCount=res.data.collectionCount;
self.playlistCount=res.data.playlistCount;
self.reviewsCount=res.data.reviewsCount;

self.renderPage(self.initTabId);
});
},

renderPage:function(){
MyMusic.g.setDocumentTitle("Member - "+this.user.nickName);

this.renderSkeleton();

if(!this.user.isPrivate&&!this.user.isCanceled){
this.renderCol1();
this.renderCol2();
}else{
this.renderHiddenMessage();
}
},

renderSkeleton:function(){
this.layout=new widgets.core.TwoColumn();
var t=$T(lt.Member.mainSkeleton)
.replaceToken('twoColLayout',this.layout.render());
this.renderIntoContentRegion(t);
},

renderHiddenMessage:function(){
var msg="This user's profile is hidden";
if(this.user.isCanceled)msg="This user's account has been canceled";

var isPrivateByMe=lala.user
&&(lala.user.userToken==this.user.userToken
&&this.user.isPrivate);
var html=$T(isPrivateByMe?lt.Member.hiddenByMe:lt.Member.hidden)
.replaceToken('msg',msg)
.compose();
this.layout.replace(html);
},

renderCol1:function(){
$TC(lt.Member.col1,this.layout.col1);
this.renderAboutInfo();
MemberPage.Browser.init(this.initTabId,this.collectionCount,this.playlistCount,this.reviewsCount);


if(!lala.isTradingTransition&&lala.user&&lala.user.isTradingEnabled&&this.user.isTradingEnabled){
MemberPage.Trading.init(this.initTabId);
}

this.renderBlurbs();
},

renderBlurbs:function(){
new widgets.Blurbs(
{renderTargetId:'blurbsSection',
title:'Recent blurbs',
showMore:true,
showCreate:!this.userFriendInfo.isCurrentUserBlockedBy,
count:5,
userToken:this.user.userToken}).loadAndRender();
},

renderAboutInfo:function(){
var t=$T(lt.Member.memberInfo,'memberInfoSection');
t.dateFormatString="%B %e, %Y";
t.replaceToken('nickName',this.user.nickName)
.replaceToken('nickNameClassName',frontend.getMemberClassName(this.user))

if(lala.user&&lala.user.userToken==this.userFriendInfo.userToken){
t.removeTokenBlock('FriendFollowBlock');
if(this.forecastTracks.length>0)
t.getTokenBlock('EditProfileBlock').removeTokenBlock('CreateForecast');
}else{
t.removeTokenBlock('EditProfileBlock');
var relBox=new widgets.core.Relationship({
mode:'lite',
trackingId:'memberPage',
renderTargetId:'profilePageRelBox',
them:this.userFriendInfo,
alwaysShowBlock:true
});
t.replaceToken('relBox',relBox.getHTML());
t.replaceToken('giftPromo',
widgets.core.GiftCards.getGiftToMemberHtml(this.userFriendInfo.userToken,'giftCardsPage.from.memberPage'));
}
t.replaceToken('lastLoginDate',this.userFriendInfo.isOnline
?$TC(lt.Member.onlineNow)
:this.userFriendInfo.lastLoginDate);
t.replaceToken('regDate',this.userFriendInfo.regDate)
.replaceTokensWithBean('user',this.userFriendInfo);



if(this.userFriendInfo.aboutMe){
var text=this.userFriendInfo.aboutMe;
text=text.lescapeHTML(true);
text=widgets.core.Util.replaceLalaLinks(text);
t.replaceToken('short','none');
t.replaceToken('aboutMe',text);
}else{
t.removeTokenBlock('AboutMeBlock');
}

if(!this.userFriendInfo.gender
||(this.userFriendInfo.gender
&&this.userFriendInfo.gender=="None"))
t.removeTokenBlock('GenderBlock');
if(!this.userFriendInfo.location)t.removeTokenBlock('LocationBlock');





if(!this.userFriendInfo.uniqueFact)t.removeTokenBlock('UniqueFactBlock');
else{
var fact=this.userFriendInfo.uniqueFact;
fact=fact.lescapeHTML();
fact=widgets.core.Util.replaceLalaLinks(fact);
t.replaceToken('uniqueFact',fact);
}

t.compose();
},

renderCol2:function(){
$T(lt.Member.col2,this.layout.col2).compose();

if(this.forecastTracks.length>0)this.renderForecast();

this.renderBecauseOfYou();
this.renderPeople();
},

renderForecast:function(){
var self=this;
var songs=this.forecastTracks;
var songsToRender=songs.lclone();


var numExtra=0;
if(songs.length<4){
numExtra=4-songs.length;
for(var i=0;i<numExtra;i++){
songsToRender.push({isEmpty:true});
}
}

var t=$T(lt.Member.forecastContainer,'memberForecast');
t.replaceToken('clickTrackingId','memberPage.forecast');

var rb=$T(lt.Member.forecastRow);
rb.replaceToken('clickTrackingId','memberPage.forecast');

songsToRender.leach(function(song,index){
if(song.isEmpty){
rb.replaceTokenBlock('ContentBlock',
$T(lt.Member.emptyForecast)
.replaceToken('num',songs.length)
.replaceToken('only',songs.length==0?'':'only ')
.compose());
}else{
rb.getTokenBlock('ContentBlock')
.replaceTokensWithBean('song',song)
.replaceToken('index',index);
if(song.comment){
rb.replaceToken('comment',song.comment.lescapeHTML());
}else{
rb.getTokenBlock('ContentBlock').removeTokenBlock('CommentBlock');
}
}
if(!(lala.user&&self.user.userToken==lala.user.userToken)){
rb.getTokenBlock('ContentBlock').removeTokenBlock('OwnerBlock');
}else{
rb.getTokenBlock('ContentBlock').getTokenBlock('OwnerBlock')
.replaceToken('addOrEdit',song.comment?'Edit':'Add');
}
rb.next();
});
t.replaceToken('content',rb.compose());
t.compose();
},

playForecast:function(index){
var song=this.forecastTracks[index];
Player.g.playSong(song,'memberPageForecast');
},

onEmbedForecast:function(){
var params={
type:'forecast',
title:'Forecast',
vars:{userToken:this.user.userToken},
shareTitle:"Listen to my Lala Music Forecast for free.",
shareLink:"/member/"+this.user.userToken,
footerText:"Profile: "+this.user.nickName
};
widgets.core.WidgetEmbed.open(params);
},

onForecastEditComment:function(index){
var song=this.forecastTracks[index];
widgets.core.Forecast.editComment(song);
},

onForecastRemove:function(index){
var song=this.forecastTracks[index];
widgets.core.Forecast.remove(song);
},

onForecastUpdated:function(evt){
if(lala.user.userToken==this.user.userToken){
this.forecastTracks=evt.songs;
this.renderForecast();
}
},

onForecastPlayButtonHover:function(index,button,evt){
var song=this.forecastTracks[index];
var offsets={};
if(mojo.SAFARI){
offsets.top=1;
if(mojo.MAC)offsets.top=-2;
}else if(mojo.FF3){
offsets.top=-3;
if(mojo.MAC)offsets.top=-4;
}else if(mojo.IE7){
offsets.top=-2;
}else if(mojo.FF2){
offsets.top=-2;
}
widgets.core.PlayButtonHover.open('medium',song,button,evt,offsets,null,'MemberForecast');
},

renderBecauseOfYou:function(){
if(!this.becauseOfYou||this.becauseOfYou.length==0)return;
var events=this.becauseOfYou;

$T(lt.Member.becauseOfYouPod,'becauseOfYouSection')
.replaceTokensWithBean('user',this.user)
.compose();
new widgets.core.BecauseOfYou({
renderTargetParentId:'becauseOfYou',
clickTrackingId:'memberPage.becauseOfYou',
profileUserName:this.user.nickName,
profileUserScore:this.userFriendInfo.score
}).render(events);
},

renderPeople:function(){
$TC(lt.Member.peoplePod,'peopleSection');

new widgets.core.People({
renderTargetParentId:'recentlyFollowing',
clickTrackingId:'memberPage.people',
profileUserToken:this.user.userToken
}).render(this.followerInfo.recentlyFollowing,
this.followerInfo.recentlyFollowedBy);
}
};
Object.extend(MemberPage.prototype,Page.prototype,true);
MyMusic.addPage('member',function(){return new MemberPage();});

MemberPage.Browser={
init:function(tabId,collectionCount,playlistCount,reviewsCount){
this.user=MemberPage.g.user;
this.divId='musicBrowserTabsContent';
this.playlistId=null;
this.isFirstLoad=true;
this.collectionCount=collectionCount;
this.playlistCount=playlistCount;
this.reviewsCount=reviewsCount;
this.SONGS_COUNT=10;
this.ALBUMS_COUNT=12;
this._resetState();
this._idGenerator=1;

this.tabs=this.renderTabs();
this.tabs.activate(tabId||'recentlyListened');
},

_resetState:function(){
this.genres=null;
this.artists=null;
this.albums=null;
this.songs=null;
this.selectedGenre=null;
this.selectedArtist=null;
this.selectedAlbum=null;
this.sortOrder='LastListenTimestamp';
},

renderTabs:function(){
var self=this;
var currPath=MyMusic.g.getPagePath();

$TC(lt.MemberBrowser.tabs,'musicBrowserSection');

var basePath='/member/'+this.user.userToken;
var tabs=mojo.newtabs.create({
id:'browser',
divTabsId:'musicBrowserTabsContainer',
divTabsContentId:this.divId
});
tabs.add({id:'recentlyListened',
title:'Listening',
path:basePath});
tabs.add({id:'minifeed',
title:'Activity',
path:basePath+'/minifeed'});
tabs.add({id:'reviews',
title:'Reviews ('+mojo.util.formatNumber(this.reviewsCount)+')',
path:basePath+'/reviews'});
tabs.add({id:'playlists',
title:'Playlists ('+mojo.util.formatNumber(this.playlistCount)+')',
path:basePath+'/playlists'});
tabs.add({id:'collection',
title:'Collection ('
+(this.collectionCount<100000
?mojo.util.formatNumber(this.collectionCount)
:mojo.util.formatBigNumber(this.collectionCount))
+')',
path:basePath+'/collection'});
tabs.onTabClick=function(tab){
self._resetState();
self.loadTab(tab.id,tab.contentId);
}

return tabs;
},

loadTab:function(playlistId){
var self=this;
this.playlistId=playlistId;

if(this.isFirstLoad){



this.renderEmptyTab('Loading ...');
this.isFirstLoad=false;
}

if(playlistId=='playlists'){
this.renderPlaylists();
}else if(playlistId=='minifeed'){
this.renderFeed();
}else if(playlistId=='reviews'){
this.renderReviews();
}else{
this.load(this.renderTab.lbind(this),playlistId);
}
},


renderTab:function(){
if(this.songs.total==0){
var msg;
if(this.playlistId=='recentlyListened'){
msg=(lala.user&&this.user.userToken==lala.user.userToken)
?"You haven't listened to any songs recently."
:"This person hasn't listened to any songs recently.";
}else if(this.playlistId=='collection'){
msg=(lala.user&&this.user.userToken==lala.user.userToken)
?"You have no songs in your collection."
:"This person has no songs in their collection.";
}
this.renderEmptyTab(msg);
return;
}

$T(lt.MemberBrowser.skeleton,this.divId)
.replaceToken('songCount',mojo.util.formatNumber(this.songs.total))
.replaceToken('albumCount',mojo.util.formatNumber(this.albums.total))
.replaceToken('userToken',this.user.userToken)
.replaceToken('nickName',this.user.nickName.lescapeHTML())
.replaceToken('topText',this.playlistId=='collection'
?'music collection on lala'
:'most recent listens')
.compose();
},







load:function(onBeforeRender,playlistId){
var self=this;

this._hideHover();

var params=this._getQueryParams();
Object.extend(params,{getPlaylistCount:this.isFirstLoad});

api.Playlists.getProfileData(
{id:this.playlistId},
function(res){

if(playlistId&&self.tabs.active.id!=playlistId)return;

self.loadResponseCallback(res,onBeforeRender);
},
params,
this.SONGS_COUNT,
0);
},

_getQueryParams:function(){
var params={
includeHistos:true,
filterByGenre:this._getHistoServerId(this.genres,this.selectedGenre,'name'),
filterByArtist:this._getHistoServerId(this.artists,this.selectedArtist,'name'),
filterByDiscId:this._getHistoServerId(this.albums,this.selectedAlbum,'id'),
sortKey:this.sortOrder,
sortDir:'Desc',
histoSortKey:'UserListens',
forUserToken:this.user.userToken
};
if(this.sortOrder=='Rating'){
params.ratingFrom=1;
params.ratingTo=5;
params.includeHistos=true;
}
return params;
},

_getHistoServerId:function(pagedList,selHisto,key){
if(!selHisto)return null;
return pagedList.list.lfindIf('id',selHisto)[0][key];
},

loadResponseCallback:function(res,onBeforeRender){
var genresChange=false;
var artistsChange=false;
var albumsChange=false;

this.songs=res.data.tracks;
if(res.data.histos.genre){
this.genres=res.data.histos.genre;
genresChange=true;
}
if(res.data.histos.artist){
this.artists=res.data.histos.artist;
artistsChange=true;
}
if(res.data.histos.album){
this.albums=res.data.histos.album;
albumsChange=true;
}

if(onBeforeRender)onBeforeRender();
if(this.songs.total==0){
if(this.sortOrder=='Rating'){
$TC(lt.MemberBrowser.emptyRatings,'topSongsContent');
return;
}else{
return;
}
}

if(genresChange)this.renderGenresHisto();
if(artistsChange)this.renderArtistsHisto();
if(albumsChange)this.renderAlbums();

this.renderSongs();
},

renderGenresHisto:function(){
var totalListens
=this.genres.list.lmapReturn(function(histo,total){return total+histo.listenCount},0);
this._renderHistos(this.genres.list,'topGenreValues',0,totalListens,'genre');
},

renderArtistsHisto:function(){
var totalListens
=this.artists.list.lmapReturn(function(histo,total){return total+histo.listenCount},0);
this._renderHistos(this.artists.list,'topArtistValuesCol1',0,totalListens,'artist');
this._renderHistos(this.artists.list,'topArtistValuesCol2',5,totalListens,'artist');


this._setSelectedContext(this.selectedGenre,'topArtistsContext','from');
},

_getSelectedHistoName:function(id,limit){
return $('histoValue_'+id).getAttribute('_histoName').ltruncate(limit);
},

_setSelectedContext:function(selectedId,spanId,prefix,limit){
if(selectedId){
$S(spanId,' '+prefix+' '
+this._getSelectedHistoName(selectedId,limit||20));
}else{
$S(spanId,'');
}
},

_renderHistos:function(histos,divId,startIndex,totalListens,type){
var t=$T(lt.MemberBrowser.histoValue,divId);
var max=5;

var rem=max;
for(var i=startIndex;i<histos.length&&rem>0;i++,rem--){
var histo=histos[i];
if(!histo.name)histo.name='Unknown';
if(type=='genre'||type=='artist'){

histo.id=this._idGenerator++;
}

t.replaceToken('name',histo.name);
t.replaceToken('tooltip','Filter music by this '+type+': '+histo.name);

var val=Math.round((histo.listenCount/totalListens)*100);



if(totalListens==0)val=0;

t.replaceToken('width',val);
t.replaceToken('type',type);
t.replaceToken('id',histo.id);

if(histo.isMatched){
t.replaceToken('arrowLink',frontend.link.BrowseGenre(histo.name));
t.replaceToken('arrowDisplay','');
t.replaceToken('imgPath','pages/MyMusic/images/table_icon_link.gif');
t.replaceToken('arrowTitle','Go to '+type+' page');
if(type=='genre'){
t.replaceToken('clickHandler',"frontend.go.BrowseGenre('"+histo.name.lescapeQuotes().lescapeHTMLAttrQuotes()+"',null,'CollectionBrowser.histo.goToGenre')");
}else{
t.replaceToken('clickHandler',"frontend.go.Artist('"+histo.name.lescapeQuotes().lescapeHTMLAttrQuotes()+"',null,'CollectionBrowser.histo.goToArtist')");
}
}else{
t.replaceToken('arrowDisplay','lhidden');
t.replaceToken('imgPath','images/blank.gif');
t.replaceToken('clickHandler','');
}
t.replaceToken('index',i);
t.next();

}

if(rem!=max){

t.compose();
}else{
$(divId).innerHTML='';
}
},

renderAlbums:function(){
var self=this;
this.albumsPager=
new widgets.core.Paginator('topAlbumsPaginator','superLite',null,null,false);
this.albumsPager.count=this.ALBUMS_COUNT;
this.albumsPager.onFirstPageOverride=function(){
lala.Track.clientPageInteraction('CollectionBrowser.paging.albums');

var params=self._getQueryParams();
params.filterByDiscId=null;
api.Playlists.getProfileAlbums(
{id:self.playlistId},
function(res){
self.albums=res.data;
self._renderAlbums(res);
},
params,
self.ALBUMS_COUNT,
self.ALBUMS_COUNT);
};

this._renderAlbums();


var contextId='topAlbumsContext';
var max=60;
if(this.selectedArtist){
this._setSelectedContext(this.selectedArtist,contextId,'by',max);
}else{
this._setSelectedContext(this.selectedGenre,contextId,'from',max);
}
},

_renderAlbums:function(res){
this._renderAlbumsRow('topAlbumsRow1',0,'row1');
if(this.albums.total>6){
this._renderAlbumsRow('topAlbumsRow2',6,'row2');
}else{
$('topAlbumsRow2').innerHTML='';
}
$('topAlbumsCount').innerHTML='('+mojo.util.formatNumber(this.albums.total)+')';

this.albumsPager.render(res,this.albums);
},


_renderAlbumsRow:function(divId,startIndex,rowId){
var max=6;

var t=$T(lt.MemberBrowser.topAlbums,divId);
t.replaceToken('rowId',rowId);

var rem=max;
var block=t.getTokenBlock('AlbumBlock');
for(var i=startIndex;rem>0;i++,rem--){
var album=i<this.albums.list.length?this.albums.list[i]:null;
if(album!=null){
block.replaceTokensWithBean('disc',album);
block.replaceToken('type','album');
block.replaceToken('index',i);
}else{
block.replaceTokenBlock('LinkBlock','&nbsp;');
}
block.next();
}

if(rem!=max){

t.compose();
}else{
$(divId).innerHTML='';
}
},





renderSongs:function(){
var self=this;

this.songsPager=
new widgets.core.Paginator('topSongsPaginator','superLite',null,null,false);
this.songsPager.count=this.SONGS_COUNT;
this.songsPager.onFirstPageOverride=function(){
api.Playlists.getProfileSongs(
{id:self.playlistId},
function(res){
lala.Track.clientPageInteraction('CollectionBrowser.paging.songs');
self.songs=res.data;
self._renderSongList(res);
},
self._getQueryParams(),
self.SONGS_COUNT,
self.SONGS_COUNT);
};
this.topSongTabs=this._renderSongTabs();
var activeId='';
if(this.sortOrder=='UserListens'){
activeId='mostListens';
}else if(this.sortOrder=='Rating'){
activeId='rating';
}else if(this.sortOrder=='LastListenTimestamp'){
activeId='mostRecent';
}
this.topSongTabs.activate(activeId);
$('topSongsCount').innerHTML='('+mojo.util.formatNumber(this.songs.total)+')';


var contextId='topSongsContext';
var max=60;
if(this.selectedAlbum){
this._setSelectedContext(this.selectedAlbum,contextId,'on',max);
}else if(this.selectedArtist){
this._setSelectedContext(this.selectedArtist,contextId,'by',max);
}else{
this._setSelectedContext(this.selectedGenre,contextId,'from',max);
}
},

_renderSongTabs:function(){
var self=this;

$S('topSongsSortTabs','');
var tabs=mojo.newtabs.create({
id:'topSongsSort',
divTabsId:'topSongsSortTabs',
divTabsContentId:'topSongsContent',
usePipedTabs:true
});
var basePath='/member/'+this.user.userToken;
tabs.add({id:'mostRecent',
title:'Last listen',
path:basePath});
tabs.add({id:'mostListens',
title:'Most listens',
path:basePath});
tabs.add({id:'rating',
title:'Rating',
path:basePath});
tabs.onTabClick=function(tab,isClick){
if(isClick){
self['_render'+tab.id.ltoFirstUpperCase()]();
}else{
self._renderSongList();
}

}


$D('recentListensRSS',this.tabs.active.id=='recentlyListened','inline');
return tabs;
},

_renderMostListens:function(){
this.sortOrder='UserListens';
this.onSelectionChange();
},

_renderMostRecent:function(){
this.sortOrder='LastListenTimestamp';
this.onSelectionChange();
},

_renderRating:function(){
this.sortOrder='Rating';
this.onSelectionChange();
},

_renderSongList:function(res){
var hoverOffsets={};
if(mojo.CHROME){
hoverOffsets.top=-1;
}else if(mojo.FF3){
hoverOffsets.top=-3;
if(mojo.MAC)hoverOffsets.top=-4;
}else if(mojo.FF2){
hoverOffsets.top=-2;
}else if(mojo.IE7){
hoverOffsets.top=-2;
}else if(mojo.SAFARI){
hoverOffsets.top=-3;
}
var w=new widgets.SongList({
renderTargetId:'topSongsContent',
trackingId:'memberPageBrowser',
clickTrackingId:'memberPage.songsBrowser',
showListens:'count',
hideAlbum:true,
layout:'simple',
showDateKey:'lastListenTime',
whichListen:'listens',
offsets:hoverOffsets,
showMemberRatings:true,
showRatings:true,
hideZeroRating:true,
username:this.user.nickName
});
w.render(this.songs);
this.songsPager.render(res,this.songs);
},

renderFeed:function(){
$TC(lt.MemberBrowser.feedTab,this.divId);
var feed=new widgets.Feed(
{renderTargetId:'feedSC',
userToken:this.user.userToken,
isProfileView:true});
feed.loadAndRender();
},

renderReviews:function(){
$T(lt.MemberBrowser.reviewsTab,this.divId)
.replaceToken('nickName',this.user.nickName)
.replaceToken('reviewsCount',this.reviewsCount)
.compose();

var w=new widgets.Review({renderDivId:'reviewsWidgetSC',
src:this.user.userToken,
paging:true,
noReviewsText:$TC(lt.MemberBrowser.noReviewsText)});
w.loadAndRender();
},

renderPlaylists:function(){
var self=this;
api.Q.searchPlaylists(
{Q:'userid: '+this.user.userToken,
skip:0,count:10},
function(res){
var playlistsPagedList=res.data.playlists;
$T(lt.MemberBrowser.playlistsTab,self.divId)
.replaceToken('nickName',self.user.nickName.lescapeHTML())
.replaceToken('count',playlistsPagedList.total)
.compose();
if(playlistsPagedList.total>0){
var paginator=new widgets.core.Paginator(
'playlistsPaginator','superLite');
paginator.autoScroll=false;
var w=new widgets.PlaylistList({
renderTargetId:'playlistsRegion',
hideMember:true,
hideNumber:true,
trackingId:'memberPlaylists',
layout:'wide'});
w.render(playlistsPagedList);
paginator.render(res,playlistsPagedList);
}else{
self.renderEmptyTab("This member doesn't have any playlists.");
}});
},

renderEmptyTab:function(msg){
$S(this.divId,
$T(lt.MemberBrowser.emptyList)
.replaceToken('msg',msg).compose());
},

onHistoClick:function(type,index,elem,selClsName){
var newId;
var select=true;
if(type=='genre'){
this._unselectHisto(this.selectedGenre,selClsName);

newId=this.genres.list[index].id;
if(this.selectedGenre==newId){
select=false;
this.selectedGenre=null;
}else{
this.selectedGenre=newId;
lala.Track.clientPageInteraction('CollectionBrowser.histo.genre');
}
this.selectedArtist=null;
this.selectedAlbum=null;

}else if(type=='artist'){
this._unselectHisto(this.selectedArtist,selClsName);

newId=this.artists.list[index].id;
if(this.selectedArtist==newId){
select=false;
this.selectedArtist=null;
}else{
this.selectedArtist=newId;
lala.Track.clientPageInteraction('CollectionBrowser.histo.artist');
}
this.selectedAlbum=null;

}else if(type=='album'){
this._unselectHisto(this.selectedAlbum,selClsName);

newId=this.albums.list[index].id;
if(this.selectedAlbum==newId){
select=false;
this.selectedAlbum=null;
}else{
this.selectedAlbum=newId;
lala.Track.clientPageInteraction('CollectionBrowser.histo.album');
}
}

if(select){
this._selectHisto(elem,selClsName);
}
this.onSelectionChange();
},

_unselectHisto:function(selId,selClsName){
if(!selId)return;
var elem=$('histoValue_'+selId);



if(elem){
mojo.css.replaceClass(elem,selClsName,'');
}
},

_selectHisto:function(elem,selClsName){
elem.className+=' '+selClsName;
},

onHistoAlbumOverTarget:function(index,rowId,target){
this._overTarget=true;
this._hideHover();

var elemId;
if(!this.albums)return;

var album=this.albums.list[index];
var bounds=mojo.geometry.getBounds(target,'scrollableViewDiv');

elemId='topAlbumHover';
$T(lt.MemberBrowser.albumHover,elemId)
.replaceTokensWithBean('disc',album)
.replaceToken('index',index)
.replaceToken('link',frontend.link.Album(album.id,null,'CollectionBrowser.histo.goToAlbum'))
.replaceToken('year',album.year?'('+album.year+')':'')
.compose();
mojo.geometry.setBounds(
elemId,
{top:bounds.top+67,left:bounds.left-32});
mojo.css.show(elemId);

},

onHistoAlbumOutTarget:function(index,rowId){
var self=this;
this._overTarget=false;

mojo.event.onMouseOver(
'albumHoverDude',
this._onOverHover.lbind(this),
this._onOutHover.lbind(this));


this._hoverTimer=
window.setTimeout(
function(){
self._hideHover();
},
1200);

},

_onOverHover:function(){

this._killHoverTimer();
},

_onOutHover:function(){

if(!this._overTarget){
this._hideHover();
}
},

_hideHover:function(){
mojo.css.hide('topAlbumHover',true,true);
this._killHoverTimer();
},

_killHoverTimer:function(){
if(this._hoverTimer){
window.clearTimeout(this._hoverTimer);
this._hoverTimer=null;
}
},

onClearSelection:function(){
this._hideHover();

this.selectedAlbum=null;
this.selectedArtist=null;
this.selectedGenre=null;
this.sortOrder='LastListenTimestamp';

this.onSelectionChange();
},

onSelectionChange:function(){
this._hideHover();

mojo.css.visibility(
'clearHistosLink',
this.selectedGenre||this.selectedArtist||this.selectedAlbum);
this.load();
},

onPlayAll:function(){
if(lala.user){
var sourceTitle=this.user.nickName;
if(sourceTitle.charAt(sourceTitle.length-1)!='s'){
sourceTitle+="'s"
}else{
sourceTitle+="'";
}

if(this.topSongTabs.active.id=='mostRecent'){
sourceTitle+=" Recently Listened Songs";
}else if(this.topSongTabs.active.id=='mostListens'){
sourceTitle+=" Most Listened Songs";
}else if(this.topSongTabs.active.id=='rating'){
sourceTitle+=' This Member\'s Rating';
}

var queryParams=this._getQueryParams();
queryParams.skip=0;
Player.g.playPlaylist(this.tabs.active.id,queryParams,sourceTitle);
}else if(this.songs.total>0){
Player.g.playTrackWithoutQueue(this.songs.list[0]);
}else{
Player.g.requireSigninForAnonUser('these songs');
}

}
};

MemberPage.Trading={
init:function(tabId){
this.user=MemberPage.g.user;
this.userToken=this.user.userToken;

$T(lt.MemberTrading.skeleton,'tradingSection')
.replaceToken('userToken',this.user.userToken)
.replaceToken('totalTradeCount',this.user.tradeCount)
.compose();

this.tabs=mojo.newtabs.create(
{id:'memberList',
divTabsId:'listTabs',
divTabsContentId:'listTabsContent'});
this.tabs.onTabClick=this.onTabClick.lbind(this);
this.tabs.add({
id:'havelistTab',
title:'Haves ('+this.user.haveListCount+')',
path:frontend.path.MemberHaves(this.user.userToken)});
if(this.user.isWantListPublic){
this.tabs.add({
id:'wantlistTab',
title:'Wants ('+this.user.wantListCount+')',
path:frontend.path.MemberWants(this.user.userToken)});






}

if(tabId){
tabId+='Tab';
}
this.tabs.activate(tabId||'havelistTab');
},

onTabClick:function(tab){
this['render'+tab.id.ltoFirstUpperCase()](tab);
},

renderHavelistTab:function(tab){
this.renderTradeListTab("have",tab.contentId);
},

renderWantlistTab:function(tab){
this.renderTradeListTab("want",tab.contentId);
},

renderGiftlistTab:function(tab){
this.renderTradeListTab("gift",tab.contentId);
},

renderTradeListTab:function(id,renderTargetId){
var params={};
var isGiftList=false;
if(id=="gift"){
isGiftList=true;
id="want";
}
params.Q="u"+id+": "+this.userToken+(isGiftList?" filter:+forsale":'');
params.count=24;
params.userToken=this.userToken;
params.sortKey=id=='want'?'WantListTimestamp':'HaveListTimestamp';
params.sortDir='Desc';

if(isGiftList){
id="gift";
}
var paginator=new widgets.core.Paginator(
'trade_albumsPaginator','lite',
'trade_albumsBottomPaginator','big');
paginator.autoScroll=false;
var ss=new widgets.core.StandardSelect(
{renderTargetId:'trade_albumsSelectSort',
options:['Date Added','Title','Artist','Popularity','Release Date'],
selectByDefault:'Date Added',
onChangeCallback:function(select){
switch(select){
case'Date Added':
this.res.req.params.sortKey=(id=='want'||id=="gift")
?'WantListTimestamp':'HaveListTimestamp';
this.res.req.params.sortDir='Desc';
break;
case'Title':
this.res.req.params.sortKey='Title';
this.res.req.params.sortDir='Asc';
break;
case'Artist':
this.res.req.params.sortKey='Artist';
this.res.req.params.sortDir='Asc';
break;
case'Popularity':
this.res.req.params.sortKey='Supply';
this.res.req.params.sortDir='Desc';
break;
case'Release Date':
this.res.req.params.sortKey='Year';
this.res.req.params.sortDir='Desc';
break;
}
lala.sendRequest(this.res.req);
}});
api.SearchUtils.searchTraderList(params,
function(res){
var w=new widgets.AlbumList({renderTargetId:'trade_memberAlbums'});
if(isGiftList){
w.layout='gift';
}
w.render(res.data);
paginator.renderTwo(res);
if(res.data.total>0)ss.render(res);
});
}
};







ContentPreviewPage=Class.create();
ContentPreviewPage.prototype={
initialize:function(blobId){
this.initPage({pageId:blobId+'Preview',
skelClass:'contentPreviewPage'});
this.blobId=blobId;

ContentPreviewPage.g=this;
},

onLoad:function(){
var self=this;
if(!lala.user||(lala.user&&!lala.user.isInternal)){
this.renderIntoContentRegion('Login to view');
return;
}
api.Content.getClientBlobForPreview(
'CustomPages',
this.blobId+"_workingCopy",
function(res){
if(!res.data){
self.renderIntoContentRegion('Nothing here');
return;
}
self.struct=mojo.evalJson(res.data);
self.setDocumentTitle(self.struct.title);
self.renderIntoContentRegion('<div id="contentPreviewPageContent"></div>');
new CustomPageWidget({
struct:self.struct,
renderTargetId:'contentPreviewPageContent'
}).render();
});


}




};
Object.extend(ContentPreviewPage.prototype,Page.prototype,true);
MyMusic.addPage('contentpreview',function(pathParts){return new ContentPreviewPage(pathParts[1]);});



FriendsPage=Class.create();
FriendsPage.prototype={
initialize:function(defaultTab,secondaryTab){
this.initPage({pageTitle:'People',authLevel:1,
theme:'purpleTheme',pageId:'Friends',
skelClass:'friendsPage'});
FriendsPage.g=this;

this.friendList=new widgets.FriendList({
renderTargetId:'friendsTabsContent',
trackingId:'friendsPage',
searchMemberMode:false,
friendList:true,
sortOrder:lala.params.sortOrder||null,
showSorter:true
});

this.friendList.changeSortOrderCallback=this.loadAndRenderMembers.lbind(this);

this.followerCount=0;
this.followingCount=0;
this.newMembers={};

this.defaultTab=defaultTab||'peopleList';
this.secondaryTab=secondaryTab||'following';
},

onLoad:function(pathParts){
this.facebookLinkAccountCalled=false;
this.ackCount=0;
this.renderPage();

this.mainTabs=mojo.newtabs.create({
id:'mainPeopleTabs',
divTabsId:'mainTabsContainer',
divTabsContentId:'friendsTabsContent'
});

this.mainTabs.add({
id:'peopleList',
title:'Your people',
path:frontend.path.People()
});
this.mainTabs.add({
id:'finderFriends',
title:'Find friends on Lala',
path:frontend.path.FinderFriends()
});
this.mainTabs.add({
id:'finderInvite',
title:'Invite friends by email',
path:frontend.path.FinderInvite()
});

this.mainTabs.onTabClick=this.loadMainTab.lbind(this);
this.mainTabs.activate(this.defaultTab,true);

var self=this;
mojo.listeners.add(
api.Friends.EVT_FOLLOWERS_CHANGED,
function(evt){
var amtChanged=evt.amountChanged;

self.followerCount+=amtChanged;
if(self.followerCount<0)self.followerCount=0;
self.updateCounts();
});

mojo.listeners.add(
api.Friends.EVT_FOLLOWING_CHANGED,
function(evt){
var amtChanged=evt.amountChanged;

self.followingCount+=amtChanged;
if(self.followingCount<0)self.followingCount=0;
self.updateCounts();
});



if(lala.params.closeFBInviteDialog&&LalaFBConnect.inviteDialog){
LalaFBConnect.inviteDialog.close();
LalaFBConnect.inviteDialog=null;
}
},

renderFacebookInvite:function(){
$TC(lt.Friends.facebookInvite,'facebookInviteBox');
},

updateCounts:function(){
if($('followerCount')){
if(this.followerCount>0){
$S('followerCount','('+this.followerCount+')');
}else{
$S('followerCount','');
}
if(this.followingCount>0){
$S('followingCount','('+this.followingCount+')');
}else{
$S('followingCount','');
}
}
},

renderPage:function(removeTabs){
this.layout=new widgets.core.TwoColumn();
var t=$T(lt.Friends.skeleton)
.replaceToken('twoCol',this.layout.render())
.replaceToken('title',this.pageTitle);
this.renderIntoContentRegion(t);

var col1=$T(lt.Friends.col1,this.layout.col1);
if(removeTabs){
col1.removeTokenBlock('TabsBlock');
}
col1.compose();
$T(lt.Friends.col2,this.layout.col2)
.replaceToken('facebookBlock',LalaFBConnect.isConnected()?$TC(lt.Friends.facebookInvite):'')
.compose();
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
this.renderFacebookInvite.lbind(this));

$TC(lt.Friends.searchBox,'friendsSearchBox');

new widgets.core.SearchMembers({
boxId:'newFriendsSearchBox',
buttonId:'newFriendsSearchButton'
});
},

loadMainTab:function(tab,firstTime){
this.showSearchBox();


$S('friendsTabsContent','');

if(!tab)tab=this.mainTabs.active;
if(tab.id=='peopleList'){
this.loadPeopleListTab(firstTime);
}else{
mojo.css.display('friendsTabs',false);
if(tab.id=='finderFriends'){
this.renderFriendFinder('members');
$D('invitesArea',false);
$D('inviteLinkArea',false);
}else if(tab.id=='finderInvite'){
this.renderFriendFinder('invite');
$D('invitesArea');
new widgets.core.Invite({
renderTargetId:'inviteBox',
hidePromoMsg:true,
mode:'sideBySide'
}).render();

$D('inviteLinkArea')
widgets.core.Invite.renderInviteLink('inviteLinkBox');
}
}

if(firstTime){
this.showCustomSignupLandingDialog();
}
},

showCustomSignupLandingDialog:function(){
var self=this;
if(lala.params.isFbSignup){
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
if(!self.facebookLinkedDialogShown){
LalaFBConnect.openFacebookLinkedDialog();
}
self.facebookLinkedDialogShown=true;
});
}
},

loadPeopleListTab:function(firstTime){
mojo.css.display('friendsTabs',true);
$S('friendsTabsContainer','');

this.memberTabs=mojo.newtabs.create({
id:'friendsTabs',
divTabsId:'friendsTabsContainer',
divTabsContentId:'friendsTabsContent',
usePipedTabs:true
});

this.memberTabs.add({
id:'following',
title:'People you follow <span id="followingCount"></span>',
path:frontend.path.Following()
});
this.memberTabs.add({
id:'followers',
title:'People following you <span id="followerCount"></span>',
path:frontend.path.Followers()
});







this.memberTabs.onTabClick=this.loadAndRenderMembers.lbind(this);
if(firstTime&&this.secondaryTab){
this.memberTabs.activate(this.secondaryTab);
}else{
this.memberTabs.activate('following');
}
},

loadAndRenderMembers:function(tab){
if(!tab)tab=this.memberTabs.active;

var self=this;
var skip=lala.params.skip?parseInt(lala.params.skip):0;
if(tab.id=='following'){
api.Friends.getFollowingWithCounts(
lala.user.userToken,
function(res){
self.followerCount=res.data.followerCount;
self.followingCount=res.data.following.total;
self.renderMembers(res.data.following,res,'following');
},
25,
this.friendList.sortOrder,
this.friendList.sortAsc,
skip);
}else if(tab.id=='followers'){
api.Friends.getFollowersWithCounts(
lala.user.userToken,
function(res){
self.followingCount=res.data.followingCount;
self.followerCount=res.data.followers.total;
DataModel.g.setPendingCount('Follower',0);
self.newMembers={};
res.data.newMembers.leach(function(i){
self.newMembers[i]=true;
});
self.renderMembers(res.data.followers,res,'followers');
},
25,
this.friendList.sortOrder,
this.friendList.sortAsc,
skip);
}
},

renderMembers:function(membersToRender,res,tabId){
this.friendList.shouldRemoveOnStopFollow=(this.memberTabs.active.id=='following');
this.friendList.shouldRemoveOnBlock=(this.memberTabs.active.id=='followers');


var t=$T(lt.Friends.noFriendsYet);

if(tabId=='following'){
t.replaceToken('follow','You don\'t follow anyone yet.');
}else{
t.replaceToken('follow','You\'re not being followed by anyone yet.');
}

var inviteFriends=$TC(lt.Friends.inviteFriendsBox);
t.replaceToken('inviteFriendsBox',new widgets.core.RoundedBox({
mode:'border',
contentHTML:inviteFriends,
backgroundColor:'#FFF',
id:'inviteFriendsBox',
width:'230px'
}).getHTML());

var findFriends=$TC(lt.Friends.findFriendsBox);
t.replaceToken('findFriendsBox',new widgets.core.RoundedBox({
mode:'border',
contentHTML:findFriends,
backgroundColor:'#FFF',
id:'findFriendsBox',
width:'230px'
}).getHTML());

this.friendList.render(membersToRender,t.compose(),res,this.newMembers);
this.updateCounts();
},

reloadFriendList:function(){
if(this.timerId){
window.clearTimeout(this.timerId);
}
var self=this;
this.timerId=window.setTimeout(
function(){
self.timerId=null;
if($('mainFriendsDiv'))self.friendList.setSortOrder('AddedTimestamp');
}
,2000);
},

searchPeopleList:function(text){
if(text.lisEmpty()){
frontend.go.People();
}else{
frontend.go.FriendsSearch(text);
}
},


renderFriendFinder:function(tab){
$T(lt.Friends.friendFinderSkel,'friendsTabsContent')
.removeTokenBlock(tab=='invite'?'FindTitle':'InviteTitle')
.removeTokenBlock('FacebookBlock',tab=='invite'||!lala.showFacebookConnect)
.compose();

var self=this;
var ff=new widgets.core.FriendFinder({
renderTargetId:'friendFinderArea',
mode:tab,
onStartCallback:function(){
self.hideSearchBox();
self.hideExtras();
},
onDoneCallback:function(){self.showSearchBox();},
onWrongPasswordCallback:function(){


var finderBox=$('friendFinderBox');
if(finderBox){
self.showSearchBox();
finderBox.style.border='1px solid #CCC';
}
},
noFocus:tab=='invite'
}).render();

if(tab=='members'&&lala.showFacebookConnect){
this.renderFacebookFinder();
}

},

renderFacebookFinder:function(){
var self=this;
if(LalaFBConnect.isConnected()){
api.FacebookConnect.linkAccount('friendfinder',function(resSuccess){
self.getFacebookFriendsAndRender();
if(resSuccess){
LalaFBConnect.openFacebookLinkedDialog();
}
});
}else{
$TC(lt.Friends.facebookFinder,'facebookBox');
if(!this.facebookFinderListenerSet){
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,this.renderFacebookFinder.lbind(this));
this.facebookFinderListenerSet=true;
}
}
},

getFacebookFriendsAndRender:function(){
var renderNone=function(){
$S('facebookBox',$T(lt.FriendFinder.facebookHeading)
.replaceToken('facebookImgUrl',lala.user.facebookImgUrl)
.replaceToken('num','None')
.replaceToken('areOrIs','are')
.removeTokenBlock('AlreadyBlock')
.removeTokenBlock('NotFollowingBlock')
.replaceToken('yet','yet')
.compose());
};
var renderAllFollowed=function(){
$S('facebookBox',$T(lt.FriendFinder.facebookHeadingAllFollowed)
.replaceToken('facebookImgUrl',lala.user.facebookImgUrl)
.compose());
};
LalaFBConnect.getFriends(function(uids){
if(!uids){
$TC(lt.Friends.facebookFinder,'facebookBox');
return;
}
if(!mojo.isDefined(uids.length)){
renderNone();
return;
}
api.FacebookConnect.getFacebookFriends(uids,function(res){
var total=res.data.length;
res.data.lremoveIf('isCurrentUserFollowing',true);
res.data.lremoveIf('isPrivate',true);
var foundIds=res.data.lpluck('facebookId');
if(total<=0){
renderNone();
}else if(total>0&&res.data.length<=0){
renderAllFollowed();
}else{
LalaFBConnect.getUsersInfo(
foundIds,
['name','affiliations','pic_square_with_logo'],
function(result){
var ff2=new widgets.core.FriendFinder({
id:'facebookBoxArea'
});
ff2.foundMembers=res.data;
$S('facebookBox',ff2.renderFacebookMembers(result,total));
});
}
});
});
},



hideExtras:function(){
$D('invitesArea',false);
$D('friendFinderTitle',false);
$D('inviteLinkArea',false);
if($('facebookArea'))$D('facebookArea',false);
if($('friendFinderBox'))$('friendFinderBox').style.border='none';
},

showSearchBox:function(){
$D('friendsSearchBox');
},

hideSearchBox:function(){
$D('friendsSearchBox',false);
}
};
Object.extend(FriendsPage.prototype,Page.prototype,true);
MyMusic.addPage('people',function(pathParts){
var tabIdToActivate='';
var secondaryTab='';
var pathOne='';
var pathTwo='';
if(pathParts.length>2){
pathTwo=pathParts[2];
}

if(pathParts.length>1){
pathOne=pathParts[1];
}




if(pathOne=='finder'){
if(pathTwo=='invite'){
tabIdToActivate='finderInvite';
}else{
tabIdToActivate='finderFriends';
}
}else{
tabIdToActivate='peopleList';
secondaryTab=pathOne;
}
return new FriendsPage(tabIdToActivate,secondaryTab);
});


MemberSearch=Class.create();
MemberSearch.prototype={
initialize:function(){
this.initSearchPage('Member Search','MemberSearch');
this.noResultTmpl=lt.MemberSearch.noMatches
},

initSearchPage:function(title,id){
this.initPage({
pageTitle:title,authLevel:0,
skelClass:'friendsPage',
pageId:id});
MemberSearch.g=this;

this.headingTitle=title;
this.query='';
this.friendList=new widgets.FriendList({
trackingId:'memberSearchPage',
renderTargetId:'mainFriendsDiv',
searchMemberMode:this.pageId=='MemberSearch'?true:false,
friendList:this.pageId=='MemberSearch'?false:true,
showSorter:true
});
this.friendList.changeSortOrderCallback=
this.loadAndRenderMembers.lbind(this);
},

onLoad:function(pathParts){
this.query=this.parsePath(pathParts);
this.renderPage(true);
this.loadAndRenderMembers();
},

parsePath:function(pathParts){
return pathParts[1].lspacesForUnderbars();
},

setSearchMode:function(){
HeaderSearchBox.g.setMode('member',this.query);
},

loadAndRenderMembers:function(){
var self=this;
api.SearchUtils.searchMember(
{Q:this.query,
count:10,
sortDir:this.friendList.sortAsc?'Asc':'Desc',
sortKey:this.friendList.sortOrder,
friendsOnly:this.friendsOnly},
function(res){
self.renderMembers(res);
$('pageHeader').innerHTML=self.headingTitle+': '+self.query;
$('newFriendsSearchBox').value=self.query;
});
},

renderMembers:function(res){
this.friendList.render(res.data.list,this.noResultTmpl,res);
}

};
Object.extend(MemberSearch.prototype,FriendsPage.prototype,true);
MyMusic.addPageRegex('membersearch',
/membersearch\/.*$/,
function(){return new MemberSearch();});


FriendsSearch=Class.create();
FriendsSearch.prototype={
initialize:function(){
this.initSearchPage('Search your people list','FriendsSearch');
this.friendsOnly=true;
this.noResultTmpl=lt.FriendsSearch.noMatches;
},

parsePath:function(pathParts){
return pathParts[2].lspacesForUnderbars();
},

setSearchMode:function(){
$('searchPeopleList').checked=true;
}
};
Object.extend(FriendsSearch.prototype,MemberSearch.prototype,true);
MyMusic.addPageRegex('people',
/people\/search\/.*$/,
function(){return new FriendsSearch();});




MemberFriendsPage=Class.create();
MemberFriendsPage.prototype={
initialize:function(){
this.initPage({theme:'purpleTheme',pageId:'MemberFriends'});

this.userToken=null;
this.user=null;
this.friendsOnly=false;
this.defaultTab='following';
MemberFriendsPage.g=this;

this.friendList=new widgets.FriendList({
trackingId:'memberFriendsPage',
renderTargetId:'memberFriendsContent',
searchMemberMode:true,
showSorter:true,
sortOrder:'LoginTimestamp'
});
this.friendList.changeSortOrderCallback=this.loadAndRenderFriends.lbind(this)
},

onLoad:function(pathParts){
MyMusic.g.setDocumentTitle('People');
this.renderPage();
this.userToken=pathParts[1];
if(pathParts[3])this.defaultTab=pathParts[3];
api.User.getBasicInfo(this.userToken,this.loadMember.lbind(this))
},

renderPage:function(){
this.layout=new widgets.core.TwoColumn();
var t=$T(lt.MemberFriends.skeleton)
.replaceToken('twoCol',this.layout.render());
this.renderIntoContentRegion(t);

$TC(lt.MemberFriends.col1,this.layout.col1);

},

loadMember:function(res){
this.user=res.data.user;
$S('memberFriendsTitle','People '+this.user.nickName+' is following');
MyMusic.g.setDocumentTitle('People '+this.user.nickName+' is following');

this.tabs=mojo.newtabs.create({id:'memberFriends',
divTabsId:'memberFriendsTabs',
divTabsContentId:'memberFriendsContent'});

var self=this;
this.tabs.onTabClick=function(tab){
self.loadAndRenderFriends();
}

this.tabs.add({
id:'followingTab',
title:'Follows'});
this.tabs.add({
id:'followedByTab',
title:'Followed by'});
this.tabs.activate(this.defaultTab+'Tab');

$D('memberFriends');
},

loadAndRenderFriends:function(){
var tabId=this.tabs.active.id;
var self=this;
if(tabId=="followingTab"){
api.Friends.getFollowingWithCounts(
this.userToken,
function(res){
$S('followingTab','Follows '+res.data.following.total);
$S('followedByTab','Followed by '+res.data.followerCount);
self.friendList.render(res.data.following,self.user.nickName+' is not following anyone',res);
},
20,
this.friendList.sortOrder,this.friendList.sortAsc,0);
}else{
api.Friends.getFollowersWithCounts(
this.userToken,
function(res){
$S('followingTab','Follows '+res.data.followingCount);
$S('followedByTab','Followed by '+res.data.followers.total);
self.friendList.render(res.data.followers,'Nobody is following '+self.user.nickName,res);
},
20,
this.friendList.sortOrder,this.friendList.sortAsc,0);
}
}
};
Object.extend(MemberFriendsPage.prototype,Page.prototype,true);
MyMusic.addPageRegex('member',/member\/.*\/people\/[following|followedBy]/,
function(){return new MemberFriendsPage();});



MemberPlaylistPage=Class.create();
MemberPlaylistPage.alreadyAutoOpenedSignup=false;
MemberPlaylistPage.prototype={
initialize:function(){
this.initPage({pageId:'MemberPlaylist',
skelClass:'memberPlaylistPage'});
this.playlist=null;
this.tracks=null;

MemberPlaylistPage.g=this;
},

onLoad:function(pathParts){
var self=this;
var playlistToken=pathParts[1];


this.specialPromo=ArtistPromos.g.byPlaylist(playlistToken);
if(this.specialPromo){
SignInOrUp.freePlaylistToken=this.specialPromo.playlistToken;
if(!lala.user){
var fc=mojo.cookie.get('fc');
if(!fc){
var cidLower=this.specialPromo.cid.toLowerCase();
mojo.cookie.set('fc','artist.'+cidLower+'.frontend');


lala.Track.rawCounter('2008.frontend.landing');
lala.Track.rawCounter('2008.frontend.landing.artist');
lala.Track.rawCounter('2008.frontend.landing.artist.'+cidLower);
lala.Track.rawCounter('2008.frontend.landing.artist.'+cidLower+'.frontend');
}
}
lala.Track.clientPage('ArtistPromo.viewed.'+this.specialPromo.cid+'.'+(lala.user?'member':'anon'));
}

this.isKOL=this.specialPromo&&(this.specialPromo.cid=='KingsOfLeon');
this.isRhettMiller=this.specialPromo&&(this.specialPromo.cid=='RhettMiller');
api.PlaylistPage.getData({
playlistToken:playlistToken,
specialAlbumId:this.specialPromo?this.specialPromo.albumIdShowOnPlaylistPage||this.specialPromo.albumId:null,
specialArtist:this.specialPromo?this.specialPromo.artistName:null,
skip:lala.params.skip,
msgToken:lala.params.msgToken
},
function(res){
if(!res.data){
self.renderIntoContentRegion($T(lt.MemberPlaylist.notFoundSkeleton));
return;
}

self.owner=res.data.owner;
if(self.owner.isCanceled){
self.renderIntoContentRegion($T(lt.MemberPlaylist.canceledAccount));
return;
}

self.playlist=res.data.playlist;
self.playlist.sid=playlistToken;
self.tracks=res.data.tracks;
self.albums=res.data.topAlbums;
self.recoData=res.data.recoData;
self.artists=res.data.topArtists;
self.listeners=res.data.recentListeners;
self.artistsCount=res.data.artistsCount;
self.genres=res.data.genres.ltruncate(3).join(', ');
if(self.specialPromo){
self.trackArtists=res.data.trackArtists;
self.specialAlbum=res.data.specialAlbum;
self.specialArtist=res.data.specialArtist;
}

self.renderPage();
});
},

onCustomSignupDialog:function(){
if(lala.user||!this.specialPromo||!this.isRhettMiller)return false;

this.onSpecialFreeClick('reopen');
return true;
},

renderPage:function(){
var self=this;
MyMusic.g.setDocumentTitle(
this.playlist.nickName+'\'s Playlist | '+this.playlist.title);

this.twoCol=new widgets.core.TwoColumn({
classes:this.specialPromo?'specialPromoTwoCol':null
});
this.renderIntoContentRegion($TC(lt.MemberPlaylist.skeleton));

this.renderRecoLanding();
$TC(this.twoCol.render(),'twoColContainer');

if(this.isKOL){
$(this.twoCol.wiid).parentNode.style.background='transparent url(images/promos/kol_footer.jpg) no-repeat bottom center';
}

var t='';
if(this.specialPromo){
$AC('scrollableViewDiv','specialPromoPlaylistPage');
if(this.isKOL){
$AC('scrollableViewDiv','kingsOfLeonPlaylistPage');
t=$T(lt.MemberPlaylist.col1KOL,this.twoCol.col1)
.replaceToken('title',this.playlist.title.lescapeHTML())
.removeTokenBlock('FreeBlock',lala.user);
}else if(this.isRhettMiller){
$AC('scrollableViewDiv','rhettMillerPlaylistPage');
t=$T(lt.MemberPlaylist.col1RhettMiller,this.twoCol.col1);
}
}else{
t=$T(lt.MemberPlaylist.col1,this.twoCol.col1)
.replaceToken('title',this.playlist.title.lescapeHTML());
this.renderAbout(t);
}


t.compose();

$T(lt.MemberPlaylist.col2,this.twoCol.col2)
.replaceToken('rhettMillerStyle',this.isRhettMiller
?'height: 349px':'')
.compose();

if(!this.isKOL&&!this.isRhettMiller){
new ActionButtons({
renderTargetId:'actionButtons',
onShout:this.onShout.lbind(this),
onShare:this.onShare.lbind(this),
onEmbed:this.onEmbedPlaylist.lbind(this),
onGetUrl:this.onGetPlaylistUrl.lbind(this),
itemId:this.playlist.lalaId,
type:'playlist'
}).render();
}else{
$D('actionButtons',false);
}

this.renderListeners();
this.renderSongs();

if(this.isKOL){
if(!lala.user)this.renderKOLPlaylistFree();
this.renderSpecialPromoAlbum(this.specialAlbum,'kolAlbum');
this.renderKOLArtist();
}else if(this.isRhettMiller){
this.renderRhettCol2();
}



this.purchaseUtil=
new PurchasePlaylistTracksUtil(
this.playlist,this.tracks,
function(){self.renderBuyDigitalSection();});
this.renderBuyDigitalSection();
if(this.isKOL)this.renderSpecialPromoSpreadWord('kolSpreadWord');

this.renderArtists();
this.renderAlbums();

if(!lala.user&&this.specialPromo){
this.signinBox=new SignInOrUp();
if(this.isRhettMiller){
this.signinBox.signupValuePropsTemplate=lt.MemberPlaylist.specialSignupValueProps;
}

this.signinBox.onSignedInCallback=function(newUserToken){
window.location.reload();
};
this.signinBox.onSignedUpCallback=function(){
window.location.reload();
};
this.signinBox.onCancel=function(){
lala.Track.clientPageInteraction(self.getPromoTrackingId('getFreePlaylistOfferCanceled'));
};
if(!MemberPlaylistPage.alreadyAutoOpenedSignup){

DataModel.g.isUsIpAddress(function(){});
MemberPlaylistPage.alreadyAutoOpenedSignup=true;
}
}
},

renderRecoLanding:function(){
if(!this.recoData)return;
var recoData=this.recoData;
recoData.displayNameUI=recoData.user.nickName?recoData.user.nickName:'Your friend';
recoData.text=recoData.text.replace('\n','<br>');
var t=$T(lt.MemberPlaylist.shareLanding,'shareLanding');
if(!recoData.user.userToken){
t.getTokenBlock('FromFriend').removeTokenBlock('MemberImage');
t.removeTokenBlock('FromFriend');
}else{
t.getTokenBlock('FromFriend')
.getTokenBlock('MemberImage')
.replaceTokensWithBean('user',recoData.user);
t.removeTokenBlock('NotFromFriend');
}
t.replaceTokensWithBean('msg',recoData);
if(lala.user){
t.removeTokenBlock('LoggedOut');
}else{
t.replaceToken('sharePlaylistLandingRightText',
$TC(lt.MemberPlaylist.shareLandingRightTextAnon));
}
t.compose();

$D('shareLanding');
},


hideShareLanding:function(){
$D('shareLanding',false);
},

renderRhettCol2:function(){
$TC(lt.MemberPlaylist.rhettMillerCol2,'rhettMillerSection');
$D('rhettMillerSection');
this.renderRhettAlbum();
this.renderRhettArtist();
this.renderRhettSpreadWord();
},

renderRhettAlbum:function(){
this.renderSpecialPromoAlbum(this.specialAlbum,'rhettAlbum');
},

renderRhettSpreadWord:function(){
this.renderSpecialPromoSpreadWord('rhettSpreadWord');
},

renderKOLArtist:function(){
$T(lt.MemberPlaylist.specialPromoArtist,'kolArtist')
.replaceToken('artistlink',frontend.img.ArtistLink(this.specialArtist))
.replaceTokensWithBean('spot',this.specialPromo)
.replaceToken('possessive','their')
.compose();
$D('kolArtist');
},

renderRhettArtist:function(){
$T(lt.MemberPlaylist.specialPromoArtist,'rhettArtist')
.replaceToken('artistlink',frontend.img.ArtistLink(this.specialArtist))
.replaceTokensWithBean('spot',this.specialPromo)
.replaceToken('possessive','his')
.compose();
},

renderKOLPlaylistFree:function(){
$T(lt.MemberPlaylist.kolPlaylistFree,'kolPlaylistFree')
.replaceToken('numTracks',this.tracks.list.length)
.compose();
$D('kolPlaylistFree');
},

renderSpecialPromoAlbum:function(disc,renderTargetId,customText,customTitle){
var b=new widgets.core.AlbumBuy({
disc:disc,
renderTargetId:renderTargetId,
customText:customText,
customTitle:customTitle,
dontLink:customText!=null,
trackingId:this.specialPromo.cid});
b.render();
$D('kolAlbum');
},

renderSpecialPromoSpreadWord:function(renderTargetId){
$TC(lt.MemberPlaylist.specialPromoSpreadWord,renderTargetId);
},

onShout:function(){
var obj=this.playlist;

if(this.tracks&&this.tracks.total>0){
obj.clientFbDiscId=this.tracks.list[0].linkDiscLalaId;
}
widgets.core.ShoutDialog.open(obj,'playlist');
lala.Track.clientPageInteraction('shareActionsBar.shout');
},

onShare:function(){
if(frontend.requiresSignin({trackingId:'sharePlaylist'}))return;
widgets.Share.dialogShareWidget=new widgets.Share({
shareObj:this.playlist,
shareType:'playlist'
});
widgets.Share.openRecoDialog(this.playlist,'playlist');
lala.Track.clientPageInteraction('shareActionsBar.share');
},

onGetPlaylistUrl:function(){
api.Tiny.forPlaylist(this.playlist.lalaId,ActionButtons.popupUrlDialog);
lala.Track.clientPageInteraction('shareActionsBar.url');
},

renderAbout:function(t){
if(this.tracks.total==0){
t.removeTokenBlock('ActionsBlock');
}

if(this.playlist.description){
t.replaceToken('desc',this.playlist.description.lescapeHTML());
}else{
t.removeTokenBlock('DescBlock');
}

if(this.tracks.total==0){
t.replaceTokenBlock('SongsBlock',lt.MemberPlaylist.emptyMsg);
}
t.replaceTokensWithBean('user',this.owner);
t.replaceToken('updatedTime',this.playlist.lastModifiedDate.lgetDaysAgoLabel(null,null,null,'%b %e, %Y'));
t.replaceToken('createdTime',this.playlist.createDate.lgetDaysAgoLabel(null,null,null,'%b %e, %Y'));
t.replaceToken('songCount',this.tracks.total);
t.replaceToken('artistCount',this.artistsCount);
t.replaceToken('genres',this.genres);
},

renderListeners:function(){
if(this.specialPromo&&(!lala.user||this.isRhettMiller))return;
if(this.listeners.length==0)return;

new widgets.core.SimplePeopleList({title:'Recent listeners',
renderTargetId:'playlistListeners'})
.renderPod(this.listeners);
},

renderSongs:function(){
var self=this;
if(this.tracks.total==0)return;

this.pager=new widgets.core.Paginator('songPaginator','lite');
this.pager.recordBackEvents=true;
this.pager.count=PurchasePlaylistTracksUtil.MAX_SONGS_COUNT;
this.pager.onFirstPageOverride=function(isNext){
var skip=parseInt(lala.params.skip)||0;

if(isNext){
skip+=PurchasePlaylistTracksUtil.MAX_SONGS_COUNT;
}else{
skip-=PurchasePlaylistTracksUtil.MAX_SONGS_COUNT;
}

api.Playlists.getSongs(
self.playlist,
function(res){
self.tracks=res.data.tracks;
self._renderSongList(res);
MyMusic.g.history.push(new PageTurnEvent(null,{skip:skip}));
},
null,
PurchasePlaylistTracksUtil.MAX_SONGS_COUNT,
skip);
};
this._renderSongList(null,parseInt(lala.params.skip));
},

_renderSongList:function(res,skip){
var w=new widgets.SongList({
renderTargetId:'songList',
trackingId:this.specialPromo?this.specialPromo.cid:null,
showListens:this.specialPromo?false:'count',
whichListen:'lalaListens',
showRatings:true,
hideZeroRating:true,
srcInfo:{
lalaId:this.playlist.id
},
hideAlbum:this.specialPromo,
showArtistImg:this.specialPromo,
artRight:this.specialPromo,
showComment:this.specialPromo,
hideActions:this.specialPromo&&!lala.user
});
if(this.specialPromo){
for(var i=0;i<this.tracks.list.length;i++){
this.tracks.list[i].leahArtist=this.trackArtists[i];
this.tracks.list[i].comment=this.specialPromo.comments[i];
if(this.isRhettMiller&&lala.user){
this.tracks.list[i].comment+='<br>&nbsp;';
}
}
}
w.render(this.tracks);
this.pager.render(res,this.tracks,skip);
},

renderArtists:function(){
if(this.specialPromo&&(!lala.user||this.isRhettMiller))return;
if(this.artists.length==0)return;

new widgets.ArtistList({
renderTargetId:'playlistArtists',
clickTrackingId:'memberPlaylist.artists',
title:'Featured artists',
layout:'listWithImages',
displayCount:10}).render(this.artists);
},

renderAlbums:function(){
if(this.albums.total==0||this.specialPromo)return;

new widgets.AlbumList({
renderTargetId:'playlistAlbums',
layout:'listNarrow'})
.renderPod(this.albums,'Featured albums');
},

getPromoTrackingId:function(counter){
if(this.specialPromo){
return'ArtistPromo.'+this.specialPromo.cid+'.'+counter;
}else{
return counter;
}
},

onBuyWebPlaylist:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('buyWebPlaylist'));
widgets.store.openBuyWebPlaylistDialog(this.playlist);
},

onBuyDownloadPlaylist:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('buyDownloadPlaylist'));
widgets.store.openBuyDownloadPlaylistDialog(this.playlist);
},

onPlayPlaylist:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('playPlaylist'));
Player.g.playMemberPlaylist(
this.playlist.lalaId,
'playAll.'+(this.specialPromo?this.specialPromo.cid:'member'),
null,
this.playlist.clientAllTracks?this.playlist.clientAllTracks[0]:null);
},

onQueuePlaylist:function(){
Player.g.queueMemberPlaylist(
this.playlist.lalaId,
'queueAll.'+(this.specialPromo?this.specialPromo.cid:'member'));
},


onCopyPlaylist:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('copyPlaylist'));
api.Playlists.clonePlaylist(
this.playlist,mojo.emptyFunction);
},

onEmbedPlaylist:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('embedPlaylist'));
var params={
type:'playlist',
title:'Playlist',
vars:{playlistId:this.playlist.lalaId},
shareTitle:"Listen to my playlist '"+this.playlist.title+"' for free.",
shareLink:frontend.path.MemberPlaylist(this.playlist.lalaId),
footerText:this.playlist.title
};
widgets.core.WidgetEmbed.open(params);
lala.Track.clientPageInteraction('shareActionsBar.embed');
},

renderBuyDigitalSection:function(){
if(this.specialPromo&&!lala.user)return;

var rb=new widgets.core.RoundedBox({
renderTargetId:'digitalBuy',
mode:this.specialPromo?'horizTwoToneBorder':'blueWithHeader',
topBGColor:this.isKOL?'#1a1818':this.isRhettMiller?'#1f1d1a':null,
bottomBGColor:this.isKOL?'#252222':this.isRhettMiller?'#2d2a25':null
}).render();
$TC(lt.MemberPlaylist.digitalBuyHeader,rb.topContentId);

if(this.tracks.total>PurchasePlaylistTracksUtil.MAX_SONGS_COUNT){
$TC(lt.MemberPlaylist.tooManySongs,rb.bottomContentId);
return;
}

if(this.purchaseUtil.hasDups&&this.purchaseUtil.totalWebTracks!=0){

$TC(lt.MemberPlaylist.songDups,rb.bottomContentId);
return;
}

var db=$T(lt.MemberPlaylist.digitalBuy,rb.bottomContentId);


if(this.purchaseUtil.totalWebTracks<=0){

db.replaceTokenBlock('WebAlbumBlock',$TC(lt.MemberPlaylist.noWebSongs));
}else if(this.purchaseUtil.unAddedTracksCount==0){

var alreadyHasWebMessage=$TC(lt.MemberPlaylist.hasAllWebSongs);
db.replaceToken('webPrice',widgets.SongList.IN_ICON)
.replaceToken('webText',alreadyHasWebMessage)
.replaceToken('webCellStyle','text-align: center');
if(lala.user&&(lala.user.userToken!=this.playlist.user.userToken)){
if(!this.specialPromo)mojo.css.display('copyPlaylistLink',true,'inline');
}
}else{

db.replaceToken('webPrice',
'$'+mojo.util.formatPrice(this.purchaseUtil.unAddedTracksPrice.toFixed(2)));
var webText=$T(lt.MemberPlaylist.buyWebSongs)
.replaceToken('unAddedTracksCount',this.purchaseUtil.unAddedTracksCount)
.replaceToken('s',this.purchaseUtil.unAddedTracksCount==1?'':'s')
.removeTokenBlock('QmarkBlock',this.purchaseUtil.totalWebTracks==this.purchaseUtil.tracks.list.length)
.compose();
db.replaceToken('webText',webText);
}


if(this.purchaseUtil.totalDownloadableTracks>0){
if(this.purchaseUtil.unDownloadedTracksCount==0){

var alreadyHasMP3Message=$TC(lt.MemberPlaylist.hasAllMp3s);
db.replaceToken('downloadPrice',widgets.SongList.IN_ICON)
.replaceToken('downloadText',alreadyHasMP3Message)
.replaceToken('dlCellStyle','vertical-align: middle;text-align:center');
}else{
var isFree=this.purchaseUtil.unDownloadedTracksPrice==0;
db.replaceToken('downloadPrice',isFree?'Free'
:'$'+mojo.util.formatPrice(this.purchaseUtil.unDownloadedTracksPrice));

var dlText=$T(lt.MemberPlaylist.buyDownloads)
.replaceToken('unDownloadedTracksCount',this.purchaseUtil.unDownloadedTracksCount)
.replaceToken('s',this.purchaseUtil.unDownloadedTracksCount==1?'':'s')
.removeTokenBlock('QmarkBlock',this.purchaseUtil.totalDownloadableTracks==this.purchaseUtil.tracks.list.length)
.compose();

db.replaceToken('downloadText',dlText);
}
}else{

db.replaceTokenBlock('DownloadBlock',$TC(lt.MemberPlaylist.noMp3s));
}

db.compose();
},

postSpecialPromoToTwitter:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('shout.twitter'));
widgets.core.WidgetEmbed.postSongToTwitter(
this.specialPromo.twitterText,
frontend.url.MemberPlaylist(this.specialPromo.playlistToken));

},

postSpecialPromoToFacebook:function(){
lala.Track.clientPageInteraction(this.getPromoTrackingId('shout.facebook'));
widgets.core.WidgetEmbed.postThingToFacebook(
frontend.url.MemberPlaylist(
this.specialPromo.playlistToken));
},

onSpecialFreeClick:function(context){
lala.Track.clientPageInteraction(this.getPromoTrackingId('getFreePlaylistOffer.'+(context||'promo')));
MemberPlaylistPage.alreadyAutoOpenedSignup=true;

this.signinBox.open();
}
};
Object.extend(MemberPlaylistPage.prototype,Page.prototype,true);
MyMusic.addPage('memberplaylist',function(pathParts){return new MemberPlaylistPage();});




AlbumGroupPage=Class.create();
AlbumGroupPage.prototype={
initialize:function(params){
this.initPage({theme:'greenTheme',pageId:'AlbumGroup',
skelClass:'albumGroupPage'});
this.isTradeMode=params.isTradeMode;
this.isBuyMode=params.isBuyMode;

AlbumGroupPage.g=this;
},

onLoad:function(pathParts){
this.groupId=pathParts[2];
this.digitalId=pathParts.length>2?pathParts[3]:null;
this.digitalTracksCount=0;

if(!this.isBuyMode&&lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}
if(this.isTradeMode&&!lala.isTradingEnabled){
this.renderIntoContentRegion($T(lt.AlbumGroup.tradingDisabled));
return;
}
if(this.isBuyMode){
this.loadBuyer();
}else{
this.loadTrader();
}
},

loadBuyer:function(){
var self=this;
api.Catalog.getAlbumBuyerInfo(this.groupId,
function(res){
if(!res.data||!res.data.masterDisc||res.data.boxsets.length==0){
var tmpl=self.isBuyMode?lt.AlbumGroup.invalidBuy
:lt.AlbumGroup.invalidTrade;
var t=$T(tmpl)
.replaceToken('mainAlbumId',res.data.masterDisc.id);
self.renderIntoContentRegion(t);
self._setDocumentTitle(res.data.masterDisc.title);
}else{
self.mainAlbum=res.data.masterDisc;
self.digitalDiscs=res.data.digitalDiscs;
self.albums=res.data.boxsets;



self.digitalVersions=res.data.digitalVersions.lgrep(function(one){
return one.isLicensedForStreaming;
});

self.renderPage();
}
},this.digitalId);
},

loadTrader:function(){
var self=this;
api.Catalog.getAlbumTraderInfo(this.groupId,
function(res){
if(!res.data||!res.data.master||res.data.discs.length==0){
var tmpl=self.isBuyMode?lt.AlbumGroup.invalidBuy
:lt.AlbumGroup.invalidTrade;
var t=$T(tmpl)
.replaceToken('mainAlbumId',res.data.master.id);
self.renderIntoContentRegion(t);
self._setDocumentTitle(res.data.master.title);
}else{
self.discs=res.data.discs;
self.mainAlbum=res.data.master;
self.albums=self.groupAlbums(self.discs);

self.renderPage();
}
});
},


groupAlbums:function(discs){
var albums=[];
for(var i=0;i<discs.length;){
var disc=discs[i];
if(disc.nbdisc>1){
i++;
disc.otherDiscs=[];
for(var n=2;i<discs.length&&n<=disc.nbdisc;n++,i++){
disc.otherDiscs.push(discs[i]);
}
}else{
i++;
}
albums.push(disc);
}
return albums;
},

_setDocumentTitle:function(albumTitle){
MyMusic.g.setDocumentTitle(albumTitle+" | Group");
},

renderPage:function(){
var self=this;
this._setDocumentTitle(this.mainAlbum.title);

var skeletonRenderId=this.contentId;

if(this.digitalDiscs&&!this.digitalDiscs.lisEmpty()){
var twoCol=new widgets.core.TwoColumn();
this.renderIntoContentRegion($T(twoCol.render()));

skeletonRenderId=twoCol.col1;


var numWillBeAdded=0;

var totalTracks=0;

this.digitalDiscs.leach(function(digitalDisc){
digitalDisc.tracks.leach(function(t){
totalTracks++;
if(!t.isLicensedForStreaming){
t.playType='NotPlayable';
t.title=null;
}else{
numWillBeAdded++;
}
});
});

var col2=$T(lt.AlbumGroup.col2,twoCol.col2)
.replaceToken('numSongs',numWillBeAdded)
.replaceToken('s',numWillBeAdded==1?'':'s');

if(numWillBeAdded==totalTracks)col2.removeTokenBlock('HelpBubbleBlock');

var version=null;
if(this.digitalVersions.length>1){
var isExplicit=false;
var tokens={};
for(var i=0;i<this.digitalVersions.length;i++){
version=this.digitalVersions[i];
if(this.digitalDiscs[0].id==version.discId){
tokens.numVersion=i+1;
if(version.isExplicit){
tokens.info=' - Explicit';
isExplicit=true;
}
tokens.year=version.year;
tokens.label=version.label;
tokens.upc=version.upc;
break;
}
}
col2.replaceTokensWithMap(tokens);
col2.getTokenBlock('MultiVersionBlock')
.removeTokenBlock('ExplicitBlock',!isExplicit);
}else if(this.digitalVersions.length==1){
version=this.digitalVersions[0];
col2.replaceTokenBlock(
'MultiVersionBlock',
$T(lt.AlbumGroup.versionSimple)
.replaceTokensWithMap({year:version.year,
label:version.label,
upc:version.upc})
.compose());
}else{
col2.removeTokenBlock('MultiVersionBlock');
}

var discSkelBlock=col2.getTokenBlock('DiscSkelBlock');
if(this.digitalDiscs.length==1)discSkelBlock.removeTokenBlock('DiscTitle');
this.digitalDiscs.leach(function(disc,index){
if(self.digitalDiscs.length!=1){
discSkelBlock.replaceToken('titleIndex',index+1);
}
discSkelBlock.replaceToken('index',index);
discSkelBlock.next();
});
col2.compose();

this.digitalDiscs.leach(function(disc,index){
new widgets.SongList({
renderTargetId:'albumGroupSongList_'+index,
trackingId:'albumGroupPageDigitalSongs',
clickTrackingId:'albumGroupPage.digitalSongs',
layout:'lite',
hideArtist:true,
hideActions:true,
showBuyActions:false,
hidePlayHover:true
}).render(disc.tracks);
self.digitalTracksCount+=disc.tracks.length;
});
}
var t=$T(lt.AlbumGroup.mainSkeleton);


if(this.isBuyMode){
t.removeTokenBlock('TradePageBlock');
}else{
t.removeTokenBlock('BuyPageBlock');
}


var iter=t.getTokenBlock('AlbumBlock');
this.albums.leach(function(album,index){
if(self.isTradeMode){
self.renderTradeAlbum(iter,album);
}else{
self.renderBuyAlbum(iter,album);
}
iter.replaceToken('num',index+1);
iter.next();
})
t.replaceToken('mainAlbumId',this.mainAlbum.id);










if(skeletonRenderId==this.contentId){
this.renderIntoContentRegion(t);
}else{



$S(skeletonRenderId,t.compose());
}
},

renderTradeAlbum:function(albumBlock,album){
albumBlock.removeTokenBlock('BuyAlbumBlock');

var isTradeMultiDiscs=false;
if(album.otherDiscs&&album.otherDiscs.length>0){


albumBlock.removeTokenBlock('TradeAlbumBlock');
isTradeMultiDiscs=true;
}

albumBlock.replaceToken('editions',this.renderEditions(album));
albumBlock.replaceTokensWithBean('disc',album);

if(!isTradeMultiDiscs){
this.renderListed(albumBlock.getTokenBlock('TradeAlbumBlock'),album);
}

albumBlock.replaceToken('tracksCellWidth',isTradeMultiDiscs?'width:450px':'width:350px');

var discs=[album];
if(album.otherDiscs)discs.laddAll(album.otherDiscs);

var discBlock=albumBlock.getTokenBlock('TracksBlock');

var self=this;
discs.leach(function(disc,index,isLast){
if(discs.length>1){
discBlock.replaceToken('discNum','Disc '+(index+1));
if(index>0){
discBlock.replaceToken('marginTop','margin-top:10px');
}
}
if(!isTradeMultiDiscs){
discBlock.removeTokenBlock('TradeDiscBlock');
discBlock.removeTokenBlock('RuleBlock');
}else{

discBlock.replaceTokensWithBean('disc',disc);
self.renderListed(discBlock.getTokenBlock('TradeDiscBlock'),disc);
if(isLast){
discBlock.removeTokenBlock('RuleBlock');
}
}

var iter=discBlock.getTokenBlock('TrackBlock');
disc.tracks.leach(function(track,index){
iter.replaceTokensWithBean('track',track);
iter.replaceToken('trackNum',index+1);
var duration=track.duration?mojo.util.secondsToTime(track.duration,true):'';
iter.replaceToken('trackDur',duration);
iter.next();
});
if(disc.tracks.length<=0){
discBlock.removeTokenBlock('TrackBlock');
}
discBlock.next();
});
},

renderBuyAlbum:function(albumBlock,album){
albumBlock.removeTokenBlock('TradeAlbumBlock');
albumBlock.replaceToken('editions',this.renderEditions(album[0]));
albumBlock.replaceTokensWithBean('disc',album[0]);
albumBlock.replaceToken('tracksCellWidth',this.digitalDiscs
?'width:270px':'width:350px');

var discs=album;
var discBlock=albumBlock.getTokenBlock('TracksBlock');

discs.leach(function(disc,index,isLast){
if(discs.length>1){
discBlock.replaceToken('discNum','Disc '+(index+1));
if(index>0){
discBlock.replaceToken('marginTop','margin-top:10px');
}
}
discBlock.removeTokenBlock('TradeDiscBlock');
discBlock.removeTokenBlock('RuleBlock');

var iter=discBlock.getTokenBlock('TrackBlock');
disc.tracks.leach(function(track,index){
iter.replaceTokensWithBean('track',track);
iter.replaceToken('trackNum',index+1);
var duration=track.duration?mojo.util.secondsToTime(track.duration,true):'';
iter.replaceToken('trackDur',duration);
iter.next();
});
if(disc.tracks.length<=0){
discBlock.removeTokenBlock('TrackBlock');
}
discBlock.next();
});
},

renderListed:function(block,album){
if(album.owned||album.wanted){
var text=album.owned?'have':'want';
block.replaceToken(
'tradeActions',
$T(lt.AlbumGroup.tradeListed)
.replaceToken('discId',album.id)
.replaceToken('list',text)
.compose());
}else{
block.replaceToken(
'tradeActions',
$T(lt.AlbumGroup.tradeActions)
.replaceToken('discId',album.id)
.compose());
}
},

renderEditions:function(album){
var editions=[];
if(album.isOffensiveContent)editions.push('Explicit');
if(album.isLimitedEdition)editions.push('Limited Edition');
if(album.isImport)editions.push('Import');
if(album.isRemastered)editions.push('Remastered');
if(album.isEdited)editions.push('Edited');
if(album.isExtendedPlay)editions.push('Extended Play');

return editions.length>0?'<h3>'+editions.join(', ')+'</h3>':'&nbsp;';
},

onAddToCart:function(index,elem){
lala.Track.click('albumPurchasePage.addToCart');

var self=this;
var album=this.albums[index][0];

api.Store.addToCart(
album.id,
function(cart){
var div=mojo.dom.getAncestorByTagName(elem,'DIV');
if(cart){
div.innerHTML=
$T(lt.AlbumGroup.buyAck)
.replaceToken('mainAlbumId',self.mainAlbum.id)
.compose();
}else{
div.innerHTML='Sorry, no longer available';
lala.Track.click('albumPurchasePage.addToCart.notAvailable');
}
},
this.digitalId);
},

onBuyNow:function(index,elem){
lala.Track.click('albumPurchasePage.buyNow');

var self=this;
var album=this.albums[index][0];

widgets.store.openBuyPhysicalCDDialog(
{album:album,
webAlbumId:this.digitalId,
webAlbumTracksCount:this.digitalTracksCount
},
function(res,noMoreLeft){
var div=mojo.dom.getAncestorByTagName(elem,'DIV');
if(!noMoreLeft){
div.innerHTML=lt.AlbumGroup.purchasedAck.compose();
}else{
div.innerHTML='Sorry, no longer available';
lala.Track.click('albumPurchasePage.buyNow.notAvailable');
}
});
},

onHave:function(discId,elem){
this._onTrade(discId,'havelist',elem);
},

onWant:function(discId,elem){
this._onTrade(discId,'wantlist',elem);
},

_onTrade:function(id,listId,ancElem){
api.Trading.addToList(
id,
listId,
function(res){
var text=listId.match('havelist')?'have':'want';
ancElem.parentNode.innerHTML=
$T(lt.AlbumGroup.tradeListAck)
.replaceToken('discId',id)
.replaceToken('list',text)
.compose();
});
},

onRemoveDisc:function(id,listId,ancElem){
api.Trading.deleteFromList(
{id:id},
listId,
function(res){
$S('tradeActions_'+id,
$T(lt.AlbumGroup.tradeActions)
.replaceToken('discId',id)
.compose());
});
},

openVersionMenu:function(evt){
if(!this.versionMenu){
this.versionMenu=new widgets.core.versionMenu({
elemId:'versionMenuLink',
selectedAlbum:this.digitalDiscs[0],
versions:this.digitalVersions,
onVersionClick:this.onVersionClick.lbind(this),
offsets:{left:-20}
});
}
this.versionMenu.open(evt);
},

onVersionClick:function(version){
frontend.go.AlbumGroup(this.groupId,'buy',version.discId);
}
};
Object.extend(AlbumGroupPage.prototype,Page.prototype,true);






PlaygroundPage=Class.create();
PlaygroundPage.prototype={
initialize:function(params){
this.initPage({
authLevel:1,
skelClass:'playgroundPage',
pageId:'Playground'
});
PlaygroundPage.g=this;
},


onLoad:function(pathParts){
var self=this;

var t=$T(lt.Playground.pageSkel);
this.renderIntoContentRegion(t);

lala.sendRequest(
{url:'ProfilePage/getArtistRecos',
params:{forUserToken:lala.params.forUserToken||lala.user.userToken},
onResponse:function(res){
new widgets.ArtistList({showRecoList:true,hideDetails:true,renderTargetId:'playgroundContent',layout:'list'}).render(res.data);
}});
}
};
Object.extend(PlaygroundPage.prototype,Page.prototype,true);
MyMusic.addPage('playground',function(){return new PlaygroundPage();});



HelpPage=Class.create();
HelpPage.prototype={
initialize:function(){
this.initPage({pageTitle:'Help',pageId:'Help',skelClass:'helpPage'});
this._categories={};
this._topLevelCategories=null;
this._selectedCategoryId=null;
this._categoriesByName={};
HelpPage.g=this;
},

onLoad:function(pathParts){
var self=this;
this.layout=new widgets.core.TwoColumn();
var t=$T(lt.Help.skeleton)
.replaceToken('twoCol',this.layout.render());
this.renderIntoContentRegion(t);

api.Content.getHelpConfig(
'HelpPage',
function(res){
self.preprocessResponse(res);


var catName=pathParts[1];
if(catName){
var cat=self._categoriesByName[catName.toLowerCase()];
if(cat){
self._selectedCategoryId=cat.cid;
}else{
mojo.log.error('invalid help category:'+catName);
}
}
var topicId=pathParts[2];
if(topicId){
self.topicId=topicId;
}
self.renderCategories();
});

},

preprocessResponse:function(res){
if(!res.data)return;

var self=this;
var catIndex=1;
this._topLevelCategories=res.data.categories;

res.data.categories.leach(function(cat){

cat.cid='category_'+catIndex++;
self._categories[cat.cid]=cat;
self._categoriesByName[cat.name.toLowerCase()]=cat;
if(cat.subCategories.length>0){
cat.subCategories.leach(function(subCat){
subCat.cid='category_'+catIndex++;
self._categories[subCat.cid]=subCat;
self._categoriesByName[subCat.name.toLowerCase()]=subCat;
});
}
});
},

renderCategories:function(){
var self=this;
if(mojo.util.isEmpty(this._topLevelCategories)){
$S(this.layout.col1,lt.Help.noConfig.compose());
return;
}

var t=$T(lt.Help.col2,this.layout.col2);
var catIter=t.getTokenBlock('CategoryBlock');

this._topLevelCategories.leach(function(cat){
if(cat.isTraderOnly&&!lala.isTradingEnabled)return;

self._renderCategory(catIter,cat);
if(cat.subCategories.length==0){
catIter.removeTokenBlock('SubCategorySectionBlock');
}else{
var subCatIter=
catIter.getTokenBlock('SubCategorySectionBlock')
.getTokenBlock('SubCategoryBlock');
cat.subCategories.leach(function(subCat){
self._renderCategory(subCatIter,subCat);
subCatIter.next();
});
}
catIter.next();
});
t.compose();

this.onSelectCategory(this._selectedCategoryId);
},

_renderCategory:function(t,cat){
t.replaceTokensWithBean('cat',cat);
},

renderTopics:function(){
var category=this._categories[this._selectedCategoryId];
var topics=category.topics;
if(category.subCategories.length>0&&topics.length==0){



category.subCategories.leach(function(subCat){
topics.laddAll(subCat.topics);
});
}

if(this.topicId){
var topicId=this.topicId;


topics.leach(function(topic,index){
if(topic.id==topicId){
index=topics.length;
topics=[topic];
}
});
}

var t=$T(lt.Help.col1,this.layout.col1);
var topicIter=t.getTokenBlock('TopicBlock');
topics.leach(function(topic){
topic.id=topic.id+"";
topicIter.replaceTokensWithBean('topic',topic);
topicIter.replaceToken('category',category.name);
topicIter.next();
});
t.compose();
},

onSelectCategory:function(cid){
if(!cid)cid=this._topLevelCategories.lfirst().cid;
var category=this._categories[cid];
if(this._selectedCategoryId){
var oldCatLink=$(this._selectedCategoryId);
if(oldCatLink){
$DC(oldCatLink,'selected');
}
}

this._selectedCategoryId=category.cid;

var newCatLink=$(this._selectedCategoryId);


if(newCatLink){
$AC(this._selectedCategoryId,'selected');
}

$S('headingCategoryName','> '+category.name);
this.renderTopics();
}
};
Object.extend(HelpPage.prototype,Page.prototype,true);
MyMusic.addPage('help',function(){return new HelpPage();});

HelpWizard=Class.create();
HelpWizard.prototype={
initialize:function(){
this.initPage({title:'Help ',authLevel:1,
theme:'grayTheme',pageId:'HelpWizard',skelClass:'helpWizard'});
this._bulletsById={};
this._idGenerator=1;
this._str=null;
this.context='';
this.transToken=null;
this.trans=null;
HelpWizard.g=this;
},



onLoad:function(params,isBack){
this.context=params[1];
this.transToken=params[2];
var str=strings.HelpWizard[this.context];
var t=$T(lt.HelpWizard.skeleton)
.replaceToken('pageTitle',str.title);
this.renderIntoContentRegion(t);


var self=this;

api.Content.getHelpWizard(
{transToken:this.transToken,context:this.context},
function(res){
self.onGetPageData(res)
});
},

getPageTitle:function(){
return strings.HelpWizard[this.context].title;
},

onGetPageData:function(res){
var t=$T(lt.HelpWizard.main,'col1')
.replaceToken("userEmail",lala.user.email);

this.trans=res.data.trans;
var str=strings.HelpWizard[this.context];

if(this.trans){
t.dateFormatString="%b %d, %y";
this.trans.artistjs=this.trans.artist.lescapeQuotes();
this._str=str;
t.replaceTokensWithBean("trans",this.trans);
widgets.core.Template.replaceTransactionCondition(t,this.trans,lala.user.isCoverArtNeutral);
if(this.context=='shipped'){
t.replaceToken(
'DateText',
str.date_prefix+' '+this.trans.shipDate.lformat("%b %d, %y"));
t.removeTokenBlock('ReceivedBlock');
t.removeTokenBlock('ReceivedConditionBlock');
}else{
t.removeTokenBlock('ShippedBlock');
t.replaceToken(
'DateText',
str.date_prefix+' '+this.trans.receiveDate.lformat("%b %d, %y"),true);
var b=t.getTokenBlock('ReceivedConditionBlock');
b.replaceToken('Condition',strings.conditions.text[this.trans.condition]);
b.next();
}
}

t.compose();

if(!this.trans){
mojo.setContent('leftHalf',strings.HelpWizard.invalid_trans);
}else if(this.context=='shipped'&&this.trans.receiveDate){
mojo.setContent('leftHalf',this._str.too_late);
}else if(this.context=='received'&&!this.trans.receiveDate){
mojo.setContent('leftHalf',this._str.too_late);
}else{
this.render();
}
},

render:function(){



api.Content.getHelpConfig('HelpWizard_'+this.context,function(res){
widgets.Help.renderBullets(res.data.categories[0].topics,2,'faqDiv');
});

},

openForm:function(){
if(this.context=='received'){
mojo.setContent('discStatus',strings.conditions.text[this.trans.condition]);
}
mojo.animate.open('formDiv');
},

closeForm:function(timer){
var fn=function(){
mojo.animate.close('formDiv',function(){mojo.css.display('formDiv',false);});
};
if(timer)window.setTimeout(fn,5000);
else fn();
},

submitForm:function(){
var self=this;
var why=mojo.form.getRadioValue(document.forms.support.conditions);
if(!why){
alert(this._str.no_radio);
return;
}

var params={
'cmd':this.context=='shipped'
?'cancelTrade':'changeCondition',
'transToken':this.trans.transToken,
'note':$('msg').value.ltrim(),
'userAgent':mojo.USER_AGENT,
'radio':why
};

lala.updateSubmitButton('submitForm');
api.Email.support(
params,
function(res){
lala.resetSubmitButton('submitForm');
mojo.css.displayToggle(['ackDiv','formTable']);
self.closeForm(true);
});
}
};
Object.extend(HelpWizard.prototype,Page.prototype,true);
MyMusic.addPage('helpwizard',function(){return new HelpWizard();});

widgets.Help={};
widgets.Help.bulletsById={};
widgets.Help._idGenerator=0;

widgets.Help.renderTopic=function(settings){
var topic=settings.topic;
var topicIndex=settings.topicIndex;
var t=settings.template;

if(topic.header){
t.replaceToken('header',topic.header);
}else{
t.removeTokenBlock('TopicHeaderBlock');
}
t.replaceToken('topicIndex',topicIndex);
topic.__index=topicIndex;

var open=topic.open=(topic.open!=null)?topic.open:true;
if(topic.bullets){
var max=topic.bullets.length;
if(topic.numberToShow){
max=topic.numberToShow;
}
t.replaceToken('closedOpenClass',open?'topicOpen':'topicClose');
t.replaceToken('showTopic',open?'block':'none');
var bb=t.getTokenBlock('BulletBlock');
for(var j=0;j<topic.bullets.length;j++){
var bullet=topic.bullets[j];
widgets.Help._renderBullet(bullet,bb,null,topic);
if(j>max){

}
}
}
t.next();
};

widgets.Help.renderBullets=function(bullets,cols,div,includeNum){
var t=$T(lt.HelpWidget.topicBullet,div);
var bb=t.getTokenBlock('BulletBlock');
var colBreak=Math.floor(bullets.length/cols)-1;
var num=null;
for(var i=0;i<bullets.length;i++){
if(i==0)t.replaceToken('isFirst','firstBullet');

var bullet=bullets[i];
if(includeNum)num=i+1;
widgets.Help._renderBullet(bullet,bb,num,null);
if(i==colBreak){
t.next();
}else if((i+1)==bullets.length){
t.replaceToken('lastBullet');
t.next();
}
}
t.compose();
};

widgets.Help._renderBullet=function(bullet,bb,num,parent){
if(!bullet)return;
if(bullet.hidden)return;

var id=widgets.Help._idGenerator++;
if(bullet.id!=null){
id=bullet.id;
}else{
id='bullet'+id;
}
bullet.__id=id;
bullet.parent=parent;

bb.replaceToken('id',id);
bb.replaceToken('title',!num?bullet.subject:num+'. '+bullet.subject);
bb.replaceToken('content',bullet.text);
bb.next();



widgets.Help.bulletsById[bullet.__id]=bullet;
}

widgets.Help.toggleBullet=function(id,scroll){
var bullet=widgets.Help.bulletsById[id];
if(bullet.parent&&!bullet.parent.open){
widgets.Help.toggleHeader(bullet.parent);
}
if(!bullet)return;
var elem=$('bulletContent'+id);
mojo.css.toggleDisplay(elem);
if(scroll)mojo.geometry.scrollIntoView('bulletLink'+id);
};

widgets.Help.toggleHeader=function(topic){
var oneTopic=topic;



var index=topic.__index;
if(oneTopic){
var className="topicOpen";
var shut=false;
if(!oneTopic.open){
className="topicOpen";
oneTopic.open=true;
}else{
className="topicClose";
oneTopic.open=false;
}
var elem=$('bulletsDiv'+index);
if(elem){
mojo.css.display(elem,oneTopic.open);
}
elem=$('topicHeaderTriangle'+index);
if(elem){
elem.className=className;
}
}
};

widgets.Help.getFAQTopic=function(){
var faqTopic={'header':'FAQ','bullets':[]};
for(var i=0;i<g_faqs.length;i++){
var entry=g_faqs[i];
if(mojo.isEmpty(entry.text))continue;

var bullet={};
bullet.__faq=true;
bullet.title=entry.subject;
bullet.text=entry.text;
bullet.id='faq'+i;
faqTopic.bullets.push(bullet);
}
return faqTopic.bullets.length>0?faqTopic:null;
};

strings.HelpWizard={
invalid_trans:"We don't have any record of this transaction.",
shipped:{
date_prefix:'You agreed to ship this CD on',
title:'Shipping Help',
too_late:'This CD has been marked as received.<br><br>If you want to report a problem with this trade, visit our help page.',
no_radio:'Please select a reason'
},
received:{
date_prefix:'Received status updated on ',
title:'Receiving Help',
too_late:"This CD is still in transit.<br><br>Click the in transit link in your trading history to update it's status.",
no_radio:'Please select a status'
},

topics:{
shipped:{
'header':"Frequently Asked Shipping Questions",
'bullets':[
{
'title':"I am a new member and need shipping envelopes.",
'text':"Lala will mail you a starter kit after you agree to ship your first CD.<br><br>Lala accounts for the time it takes to mail you a starter kit for your first shipments, so your account will not be penalized for any shipping delays while you wait for your kits.<br><br>So go ahead and agree to ship, but be sure to ship 'em as soon as you get the kits (they typically arrive within 3-5 days after agreeing to ship your 1st CD or registering your billing info)."
},
{
'title':"How do I get more envelopes/cardboard sleeves?",
'text':"You can order more envelopes with or without cardboard sleeves from your [[page::Trade::Have List::tabId_0=havelist]]."
},
{
'title':"I can't find this CD, what do I do?",
'text':"You can request to Cancel this trade by submitting the Cancel Request Form (see \"How do I cancel this trade?\" on this page).  Next time, verify you have the CD before agreeing to ship."
},

{
'title':"What is the shipping policy?",
'text':"Please take a look at our [[page::TradingPolicy::Trading Policies]] page for more info."
},
{
'title':"The address I'm supposed to ship to doesn't appear to be real, what should I do?",
'text':"You can request to Cancel this trade by submitting the Cancel Request Form (see \"How do I cancel this trade?\" on this page)."
},
{
'title':"How do I know if the member received my CD?",
'text':"The status of the trade will be updated to 'received' on your [[page::Trade::Trading History::tabId_0=tradinghistory]]."
},
{
'title':"I lost the shipping address",
'text':"No problem.  Click on the 'in transit' link to view the shipping information."
},

{
'title':"How do I cancel this trade?",
'text':'<a href="javascript:HelpWizard.g.openForm();" class="llink">Click here</a> to submit a support request to cancel this trade. Next time, please make sure you have the CD in good condition before agreeing to ship.  Canceled trades will affect your karma score.'
}
]
},
received:{
header:"Frequently Asked Receiving Questions",
bullets:[
{
'title':"I received this disc, but I never requested it",
'text':"If the transaction has been auto-confirmed as 'received', you can click the Change Status button to request changing the state to \"Not the one I requested\"."
},
{
'title':"I marked this disc as received, but it is unplayable",
'text':"If you've marked a disc as received, but later discover that it is not playable, you can click the Change Status button to request changing the state to \"Received, but the CD is broken or doesn't play\"."
},
{
'title':"I marked this disc as received, but it is broken",
'text':"If you've marked a disc as received, but later discover that it is broken, you can click the Change Status button to request changing the state to \"Received, but the CD is broken or doesn't play\"."
},
{
'title':"I received the disc after marking it as 'Not Received'",
'text':"To change the status, please click the 'Change Status' button above to send a request to change the state to \"Received in good condition\"."
},
{
'title':"I marked this disc as received, but I meant to mark 'with cover art'.",
'text':"To change the status, please click the 'Change Status' button above to send a request to change the state to \"Received in good condition with front booklet cover art\"."
},
{
'title':"I received this disc, but it is a burned copy",
'text':"Please click the 'Change Status' button above to send a request to change the state to \"Received, but the CD is not an original\"."
}
]
}
}
};



ArtistPage=Class.create();
ArtistPage.wrongArtistName=null;
ArtistPage.prototype={
initialize:function(){
this.pageId='Artist';
this.skelClass='artistPage';
this.isMy=false;
this.initArtistPage();

ArtistPage.g=this;
},


initArtistPage:function(){
this.initPage({theme:'greenTheme',pageId:this.pageId,
skelClass:this.skelClass});
this.artist=null;
},




onLoad:function(pathParts){
this.initFromPath(pathParts);
this.loadArtistData();

mojo.listeners.add(
api.MicroWallet.EVT_BUYSONG_CHANGE,
this.onBuySongEvent.lbind(this));
},

initFromPath:function(pathParts){
this.artist=pathParts[1].lspacesForUnderbars(false);
this.baseQ='artist: "'+this.artist.lescapeQuotes()+'" context:artistPage ';

this.songsQ=this.baseQ+' -type:Other filter:+full';
this.songsSortKey='Listens7';
this.songsSortDir='Desc';
this.albumsQ=this.baseQ+' -type:Compilation -type:Other filter:+fullordl';
this.albumsSortKey='Year';
this.albumsSortDir='Desc';
this.compilationsQ=this.baseQ+' type:Compilation filter:+fullordl';
this.compilationsSortKey='Year';
this.compilationsSortDir='Desc';
this.mySongsQ=this.baseQ;
this.mySongsSortKey='UserListens';
this.mySongsSortDir='Desc';
this.influencersQ=this.baseQ+' filter:+full';
this.listenersQ=this.baseQ+' filter:+full';
this.playlistsQ=this.baseQ+' filter:+full';
this.fullCatalogQ=this.baseQ;
this.fullCatalogSortKey='Year';
this.fullCatalogSortDir='Desc';
},


initWidgets:function(){
this.grid=new widgets.AlbumList({
layout:'list',
trackingId:'artistPageAlbums',
clickTrackingId:'albums',
renderTargetId:'artistAlbums',
noAlbumsTemplate:lt.Artist.noDigitalAlbums,
toggleId:'albumsViewToggle',
hideArtist:this.akas.length<=1,
isArtistAlbums:true,
hideGenre:true});
this.compilationsGrid=new widgets.AlbumList({
layout:'list',
trackingId:'artistPageCompilations',
clickTrackingId:'compilations',
renderTargetId:'artistCompilations',
toggleId:'compilationsViewToggle',
noAlbumsTemplate:lt.Artist.noDigitalAlbums,
moreType:'compilations'});
},

hideDisambiguation:function(){
$D('disambiguation',false);
},

getPageTitle:function(){
return this.artist;
},

setPageMetaInfo:function(){
var songList="";
this.songs.list.slice(0,Math.min(3,this.songs.list.length)).leach(function(song){
songList+=song.title+", ";
});
MyMusic.g.setDocumentMetaInfo(
"Listen free to "+this.artist+" ("+songList
+"and more). Full-length songs, albums, playlists, downloads, and more."
);
},

loadArtistData:function(){
var self=this;

api.ArtistPage.getData({
artistName:this.artist,
songsQ:this.songsQ,
songsSortKey:this.songsSortKey,
songsSortDir:this.songsSortDir,
songsCount:5,
albumsQ:this.albumsQ,
albumsSortKey:this.albumsSortKey,
albumsSortDir:this.albumsSortDir,
albumsHistos:'Label',
albumsCount:12,
compilationsQ:this.compilationsQ,
compilationsSortKey:this.compilationsSortKey,
compilationsSortDir:this.compilationsSortDir,
compilationsCount:12,
influencersQ:this.influencersQ,
influencersCount:5,
listenersQ:this.listenersQ,
listenersCount:5,
playlistsQ:this.playlistsQ,
playlistsCount:5,
msgToken:lala.params.msgToken
},
function(res){
if(res.data.info){


self.info=res.data.info;
self.wiki=mojo.evalJson(res.data.wiki);
self.songs=res.data.songs;
self.showDigitalAlbums=true;
self.digitalAlbums=res.data.digitalAlbums;
self.digitalAlbums.list.ltruncate(12);
self.recosFromLabels=res.data.recosFromLabels;
self.digitalCompilations=res.data.digitalCompilations;
self.digitalCompilations.list.ltruncate(12);
self.labels=res.data.labels;
self.recos=res.data.recos;
self.recoData=res.data.recoData;
self.influencers=res.data.influencers;
self.listeners=res.data.listeners;
self.playlists=res.data.playlists;
self.disambiguation=res.data.disambiguation;
self.akas=res.data.akas;

if(mojo.LALA_CRAWLER){
self.setPageMetaInfo();
}

self.initWidgets();
self.renderPage();
}else{
lala.Track.clientPage('invalidArtist');
frontend.go.Search(self.artist);
}
});
},

renderPage:function(){
this.renderSkeleton();
this.renderRecoLanding();
this.renderInfo();
this.renderSongs();
this.renderAlbums();
this.renderCompilations();
this.renderRecos();
this.renderInfluencers();
this.renderListeners();
this.renderLabels();
this.renderPlaylists();
this.renderPromoSpot();
},

renderSongs:function(){
$TC(lt.Artist.topSongsSection,'artistSongs');

mojo.input.onEnterKey('artistTopSongsSearchInput',this.onSongSearch.lbind(this));

this.songsTabs=mojo.newtabs.create({
id:'songsTabs',
divTabsId:'songsTabContainer',
divTabsContentId:'artistTopSongsContainer'});
if(this.info.isLicensedForStreaming){
this.songsTabs.add({
id:'artistSongsTab',
title:"Songs <span class='headingCount' id='songsCount'>("
+mojo.util.formatNumber(this.songs.total)
+")</span>",
onClick:function(tab){
if(tab.isActive)return;
ArtistPage.g.onSongsTabClick(this);
}
});
}
this.songsTabs.add({
id:'mySongsTab',
classes:'lhidden',
title:"My songs <span class='headingCount' id='mySongsCount'></span>",
onClick:function(tab){
if(tab.isActive)return;
ArtistPage.g.onSongsTabClick(this);
}
});

if(this.songs.total>0){
this.songsTabs.activate('artistSongsTab');
}

if(lala.user){
this.getMySongs();
}
},

getMySongs:function(){
var self=this;
api.Q.searchCollectionSongs({
count:5,
sortKey:this.mySongsSortKey,
sortDir:this.mySongsSortDir,
Q:this.mySongsQ
},function(res){
self.mySongs=res.data.songs;
self.renderMySongsTab();
});
},

renderMySongsTab:function(){
if(this.mySongs.total==0&&!this.info.isLicensedForStreaming){
if($('playArtistButton')){
$D('playArtistButton',false);
}
}else if(this.mySongs.total>0){
mojo.css.show('mySongsTab');
$S('mySongsCount','('+mojo.util.formatNumber(this.mySongs.total)+')');




if(lala.params.my||!this.info.isLicensedForStreaming){
this.songsTabs.activate('mySongsTab');
}
}
},

renderSkeleton:function(){
this.twoColLayout=new widgets.core.TwoColumn();

var t=$T(lt.Artist.skeleton);
if(this.disambiguation.total>1){

this.disambiguation.list.lremoveIf("lalaId",this.info.lalaId);
var oneOther=this.disambiguation.list.length==1;
var disamb=t.getTokenBlock('DisambiguationBlock')
.replaceToken('isOrAre',oneOther?'is':'are')
.replaceToken('s',oneOther?'':'s')
.replaceToken('count',this.disambiguation.list.length)
.replaceToken('a',oneOther?'a ':'');
var daArtistBlock=disamb.getTokenBlock('DisambArtistBlock');
this.disambiguation.list.leach(function(artist,index){
daArtistBlock.replaceTokensWithBean('artist',artist)
.replaceToken('extension',artist.extension?' ('+artist.extension.lescapeQuotes()+')':'')
.replaceToken('dash',index==0?'':'-')
.next();
});
}else{
t.removeTokenBlock('DisambiguationBlock');
}
t.replaceToken('twoColLayout',this.twoColLayout.render());
this.renderIntoContentRegion(t);


$TC(lt.Artist.col1,this.twoColLayout.col1);

var col2=$T(lt.Artist.col2,this.twoColLayout.col2);
if(!this.info.isLicensedForStreaming){
col2.replaceToken('hideEmbedPlaylist','none');
}
col2.compose();

new ActionButtons({
renderTargetId:'actionButtons',
onShout:this.onShout.lbind(this),
onShare:this.onShare.lbind(this),
onEmbed:this.onEmbedArtist.lbind(this),
onGetUrl:this.onGetArtistUrl.lbind(this),
disableSharing:!this.info.isLicensedForStreaming,
itemId:this.info.lalaId,
type:'artist'
}).render();
},

renderRecoLanding:function(){
if(!this.recoData)return;
var recoData=this.recoData;
recoData.displayNameUI=recoData.user.nickName?recoData.user.nickName:'Your friend';
recoData.text=recoData.text.replace('\n','<br>');
var t=$T(lt.Artist.shareLanding,'shareLanding');
if(!recoData.user.userToken){
t.getTokenBlock('FromFriend').removeTokenBlock('MemberImage');
t.removeTokenBlock('FromFriend');
}else{
t.getTokenBlock('FromFriend')
.getTokenBlock('MemberImage')
.replaceTokensWithBean('user',recoData.user);
t.removeTokenBlock('NotFromFriend');
}
t.replaceTokensWithBean('msg',recoData);
if(lala.user){
t.removeTokenBlock('LoggedOut');
}else{
t.replaceToken('shareArtistLandingRightText',
$TC(lt.Artist.shareLandingRightTextAnon));
}
t.compose();

$D('shareLanding');
},


hideShareLanding:function(){
$D('shareLanding',false);
},

onShout:function(){
widgets.core.ShoutDialog.open(this.info,'artist');
lala.Track.clientPageInteraction('shareActionsBar.shout');
},

onShare:function(){
if(frontend.requiresSignin({trackingId:'shareArtist'}))return;
widgets.Share.dialogShareWidget=new widgets.Share({
shareObj:this.info,
shareType:'artist'
});
widgets.Share.openRecoDialog(this.info,'artist');
lala.Track.clientPageInteraction('shareActionsBar.share');
},

onGetArtistUrl:function(){
api.Tiny.forArtist(this.info.lalaId,ActionButtons.popupUrlDialog);
lala.Track.clientPageInteraction('shareActionsBar.url');
},

onEmbedArtist:function(){
var artistName=this.artist;

var params={
type:'artist',
title:'Artist',
vars:{artistName:artistName},
shareTitle:"Listen to top songs from "+artistName+".",
shareLink:"/artist/"+encodeURIComponent(artistName),
footerText:artistName
};
widgets.core.WidgetEmbed.open(params);
lala.Track.clientPageInteraction('shareActionsBar.embed');
},

renderInfo:function(){
this.renderLargeImg();
this.renderWiki();
if(!this.info.isLicensedForStreaming&&!this.info.isLicensedForDownload){
$T(lt.Artist.unlicensed,'specialDigitalMsg')
.replaceToken('allAlbumsLink',frontend.link.NewAPage('fullcatalog'))
.compose();
}
},

renderLargeImg:function(){
var tokens={
largeImgPath:this.info.imgBasePath
?frontend.img.Artist(this.info.imgBasePath,'large')
:'pages/MyMusic/Artist/images/default-large.jpg',
sourceHref:'javascript:void 0',
sourceText:'',
artistName:this.artist.lescapeQuotesForHref()
};
if(this.info.imgSource){
tokens.sourceHref=this.info.imgSource;
tokens.sourceText='Image based on '
+(this.info.imgTitle?'<i>'+this.info.imgTitle+'</i> ':'a photo ')
+(this.info.imgAuthor?'by '+this.info.imgAuthor+' ':'')
+(this.info.isImageCreativeCommons
?'licensed under Creative Commons Attribution-ShareAlike'
:'licensed from '+this.info.imgSource);
tokens.sourceLinkTitle=''
+(this.info.imgTitle?'"'+this.info.imgTitle+'" ':'Photo ')
+(this.info.imgAuthor?'by '+this.info.imgAuthor+' ':'source');

}

var t=$T(lt.Artist.largeImg,'artistLargeImage')
.replaceTokensWithMap(tokens);
if(!this.info.isImageCreativeCommons){
t.replaceTokenBlock('SourceBlock',"<span style='color:#AAAAAA;'>"+tokens.sourceText+"</span>");
}
t.compose();
},

renderWiki:function(){
if(this.wiki&&!this.wiki.summary){
this.wiki=null;
}

var t=$T(lt.Artist.wiki,'artistWiki');


var artistDisplayName=this.info.artist;
if(this.info.extension){
artistDisplayName+=' <span class="lextension">('+this.info.extension+')</span>';
}
t.replaceToken('artistDisplayName',artistDisplayName);


if(ArtistPage.wrongArtistName!=null){
t.replaceToken('query',ArtistPage.wrongArtistName);
ArtistPage.wrongArtistName=null;
}else{
t.removeTokenBlock('WrongArtistLink');
}


if(this.akas.length>1){

this.akas.lremove(this.info.artist);
var akaItemBlock=t.getTokenBlock('AkaBlock').getTokenBlock('AkaItemBlock');
this.akas.leach(function(aka,index){
akaItemBlock.replaceToken('comma',index==0?'':', ')
.replaceToken('aka',aka)
.next();
});
}else{
t.removeTokenBlock('AkaBlock');
}

t.replaceToken('currentRank',mojo.util.addCommasToNumber(this.info.listens7Rank));
t.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:this.info.listensTrend,
what:'artist',
size:'med'
}));
t.replaceToken('lastWeek',mojo.util.addCommasToNumber(this.info.listensRank));
t.replaceToken('recentListens',mojo.util.addCommasToNumber(this.info.listens7));

if(this.wiki&&this.wiki.summary){
var summary=this.wiki.summary
.replace(/<!--.*?-->/ig,'')
.replace(/<ref.*?<\/ref>/ig,'')
.replace(/<\/SUP><\/P>\n\n<P>/ig,'</SUP>')
.replace(/<SUP.*?<\/SUP>/ig,'')
.replace(/[(];\s/ig,'(')
.replace(/\W{2}cite[^}]*\W{2}/ig,'')
.replace(/<p>[|].*?<\/p>/gi,'')
.replace(/<p>[}].*?<\/p>/gi,'')
.replace(/[(], /gi,'(');
summary=mojo.util.htmlToText(summary).replace(/[\[]\d+[\]]/g,'');
var shortSummary=summary.ltruncate(250,true);
t.replaceToken('wikiURL',this.wiki.wikiURL)
.replaceToken('artist',this.info.artist)
.replaceToken('shortSummary',summary.ltruncate(250,true))
.replaceToken('fullSummary',summary.ltruncate(1000,true));
}else{
t.replaceToken('hideWiki','none');
}
t.compose();
},

onSongSearch:function(){
var self=this;
var searchKeywords=$F('artistTopSongsSearchInput');
if(searchKeywords.lisEmpty()){
this.onClearSearch();
return;
}

this.searchResults={
keywords:searchKeywords,
moreLink:frontend.link.NewAPage(this.isMy?'mysongs':'songs',{keywords:searchKeywords})
};

var params={
count:5,
sortKey:'Relevance',
sortDir:'Desc'
};

if(!this.isMy){
params.Q=searchKeywords+' '+this.songsQ+' rank:song ';
api.Q.searchSongs(
params,
function(res){
mojo.css.show('artistSearchClearLink');
self.searchResults.songs=res.data.songs;
self.renderTopSongs();
});
}else{
params.Q=searchKeywords+' '+this.mySongsQ+' rank:song ';
api.Q.searchCollectionSongs(
params,
function(res){
mojo.css.show('artistSearchClearLink');
self.searchResults.songs=res.data.songs;
self.renderMySongs();
});
}
lala.Track.clientPageInteraction('search.'+(this.isMy?'mySongs':'topSongs'));
},

onClearSearch:function(){
this._clearSearchFields();

if(!this.isMy){
this.renderTopSongs();
}else{
this.renderMySongs();
}
},

_clearSearchFields:function(){
this.searchResults=null;
mojo.css.hide('artistSearchClearLink');
$('artistTopSongsSearchInput').value='';
},

shouldHideArtists:function(songs){
if(songs.total<=0)return true;
for(var i=0;i<songs.list.length;i++){
if(songs.list[i].artistList.indexOf("::")!=-1){
return false;
}
}
return true;
},

renderTopSongs:function(){
this.isMy=false;

var moreLink=this.searchResults?this.searchResults.moreLink
:frontend.link.NewAPage('songs');
var songs=!this.searchResults?this.songs:this.searchResults.songs;
var hideArtist=this.shouldHideArtists(songs);
var songList=
new widgets.SongList({
renderTargetId:'artistTopSongsContainer',
evenMoreLink:moreLink,
trackingId:'topSongs',
hideArtist:this.akas.length<=1&&hideArtist,
showListens:'count',
whichListen:'listens7',
showRatings:true,
hideZeroRating:true,
srcInfo:this.getSourceInfo(),
emptyText:!this.searchResults
?$TC(lt.Artist.noSongs)
:$T(lt.Artist.noSongsSearch)
.replaceToken('keywords',this.searchResults.keywords)
.compose()
});
songList.render(songs);
},

renderMySongs:function(){
this.isMy=true;

var moreLink=this.searchResults?this.searchResults.moreLink
:frontend.link.NewAPage('mysongs');
var songs=!this.searchResults?this.mySongs:this.searchResults.songs;
var hideArtist=this.shouldHideArtists(songs);
var songList=
new widgets.SongList({
renderTargetId:'artistTopSongsContainer',
evenMoreLink:moreLink,
trackingId:'mySongs',
hideArtist:hideArtist,
showListens:'count',
whichListen:'listens',
showRatings:true,
hideZeroRating:true,
showMyRatings:true,
srcInfo:this.getSourceInfo(),
emptyText:!this.searchResults
?$TC(lt.Artist.noSongs)
:$T(lt.Artist.noSongsSearch)
.replaceToken('keywords',this.searchResults.keywords)
.compose()
});
songList.render(songs);
lala.Track.clientPageInteraction('showMySongs');
},

renderAlbums:function(){
var self=this;
if(!this.info.isLicensedForStreaming&&!this.info.isLicensedForDownload)return;
if(!this.showDigitalAlbums&&!this.allAlbums){

api.Q.searchAlbums(
{Q:this.fullCatalogQ,
sortKey:this.fullCatalogSortKey,
sortDir:this.fullCatalogSortDir,
count:12},
function(res){
mojo.assert(res.data.albums,"invalid all albums response");
if(res.data.albums){
self.allAlbums=res.data.albums;
self.renderAlbums();
}
});
return;
}

var theAlbums=this.showDigitalAlbums
?this.digitalAlbums:this.allAlbums;
$T(lt.Artist.albumsSection,'artistAlbumsSection')
.replaceToken('count','('+mojo.util.formatNumber(theAlbums.total)+')')
.replaceToken('checked',this.showDigitalAlbums?'':'checked="yes"')
.compose();
this.grid.evenMoreLink=this.showDigitalAlbums
?frontend.link.NewAPage('albums'):frontend.link.NewAPage('fullcatalog');
this.grid.render(theAlbums);
},

renderCompilations:function(){
if(this.digitalCompilations.list.length==0)return;

$T(lt.Artist.compilationsSection,'artistCompilationsSection')
.replaceToken('count','('+mojo.util.formatNumber(this.digitalCompilations.total)+')')
.compose();
this.compilationsGrid.evenMoreLink=frontend.link.NewAPage('compilations');
this.compilationsGrid.render(this.digitalCompilations);
},

renderRecos:function(){
if(this.recos.length==0){
lala.Track.clientPage('mixUnavailable.zeroRecos');
return;
}

$TC(lt.Artist.recosWrapper,'artistRecos');
new widgets.ArtistList({
renderTargetId:'recosContent',
clickTrackingId:'similar',
title:$TC(lt.Artist.recosTitle),
layout:'listWithImages',
subtitle:"",
showExpandLink:true,
displayCount:10}).render(this.recos);

if(this.info.isMix){
lala.Track.clientPage('mixAvailable');
$T(lt.MixOnArtistBrowse.content,'putMixHere')
.replaceToken('text','music by these artists')
.replaceToken('onMix','ArtistPage.g.onMix()')
.compose();
}else{
lala.Track.clientPage('mixUnavailable');
}
},

renderInfluencers:function(){
if(this.influencers.length<=0)return;

new widgets.Influencers({
renderTargetId:'artistInfluencers',
clickTrackingId:'topInfluencers',
evenMoreLink:frontend.link.NewAPage('influencers'),
context:'artist'
}).render(this.influencers);
},

renderListeners:function(){
if(this.listeners.length<=0)return;

new widgets.TopListeners({
renderTargetId:'artistListeners',
clickTrackingId:'topListeners',
evenMoreLink:frontend.link.NewAPage('listeners'),
subtitle:'Listeners who listen to this artist the most'
}).render(this.listeners);
},

renderLabels:function(){
if(this.labels.length==0)return;

new widgets.LabelList({
renderTargetId:'artistLabel',
clickTrackingId:'labels',
title:'Artist Labels'}).render(this.labels,
this.recosFromLabels);
},

renderPromoSpot:function(){
var promo=ArtistPromos.g.byArtist(this.artist);
if(!promo||promo.cid=='KingsOfLeon')return;

if(promo.cid=='RhettMiller'){
$T(lt.Artist.rhettPromoSpot,'artistPromoSpot')
.replaceTokensWithBean('spot',promo)
.compose();
}else{
$T(lt.Artist.promoSpot,'artistPromoSpot')
.replaceTokensWithBean('spot',promo)
.compose();
}
},

renderPlaylists:function(){
if(this.playlists.total==0)return;

var w=new widgets.PlaylistList({
renderTargetId:'artistPlaylists',
clickTrackingId:'topPlaylists',
moreLink:frontend.link.NewAPage('playlists'),
trackingId:'artistPlaylists'
});
w.renderPod('Top playlists',this.playlists);
},

onSongsTabClick:function(tab){
this._clearSearchFields();

var pageParams={};
for(var t in this.songsTabs.all){
this.songsTabs.all[t].isActive=false;
}
if(tab.id=='artistSongsTab'){
this.songsTabs.all.artistSongsTab.isActive=true;
$('artistTopSongsSearchInput').value='Search songs';
this.renderTopSongs();
delete pageParams.my;
}else{
this.songsTabs.all.mySongsTab.isActive=true;
$('artistTopSongsSearchInput').value='Search my songs';
this.renderMySongs();
pageParams.my=true;
}
mojo.input.clearOnClick('artistTopSongsSearchInput');
if(this.songs.total>0||this.mySongs.total>0){
$D('artistSongs');
}
MyMusic.g.history.push(new PageTurnEvent(null,pageParams));
},

onBuySongEvent:function(evt){
var self=this;
evt.songs.leach(function(song){


var matches=self.songs.list.lfindIf('linkSongLalaId',song.linkSongLalaId);
if(matches.length>0){



var songObj=mojo.util.clone(matches[0]);
Object.extend(songObj,song);
self.mySongs.list.linsertAt(songObj,0);
self.mySongs.total+=1;
$('mySongsCount').innerHTML='('+self.mySongs.total+')';
mojo.css.show('mySongsTab');
}
});
},

onToggleAlbumGrid:function(){
this.showDigitalAlbums=!this.showDigitalAlbums;
if(!lala.user||!lala.user.isTradingEnabled){
lala.Track.clientPageInteraction('showFullDiscography');
}
this.renderAlbums();
},

getArtistQ:function(){
return'Artist: "'+this.artist.lescapeQuotes()+'" ';
},

getSourceInfo:function(){
return{lalaId:this.info.lalaId};
},

onPlayArtist:function(isQueue){
if(lala.user){
if(!this.isMy){
var params={
Q:this.getArtistQ()+'filter:+full',
sortKey:this.songsSortKey,
sortDir:this.songsSortDir,
whichQBag:'artist'
};
var sTitle=this.artist+" - Top Songs";
if(isQueue){
Player.g.queueSongsWithQuery(this.info.lalaId,params,sTitle,'artistPage');
}else{
Player.g.playSongsWithQuery(this.info.lalaId,params,sTitle,'artistPage');
}
}else if(this.mySongs.total>0){
var queryParams={
keywords:this.mySongsQ,
sortKey:this.mySongsSortKey,
sortDir:this.mySongsSortDir,
skip:0
};
var sourceTitle=this.artist+" - My Songs";
if(isQueue){
Player.g.queuePlaylist('songs',queryParams,sourceTitle);
}else{
Player.g.playPlaylist('songs',queryParams,sourceTitle);
}
}
}else{
if(isQueue){
Player.g.requireSigninForAnonUser('these songs');
}else{
var songs=!this.searchResults?this.songs:this.searchResults.songs;
if(songs.total>0){
Player.g.playTrackWithoutQueue(songs.list[0]);
}else{
Player.g.requireSigninForAnonUser('these songs');
}
}
}
},

onMix:function(){
if(frontend.requiresSignin())return;
new MixDrawer({
type:'artist',
artistName:this.artist,
displayValue:this.artist}).open();
},



openArtistIdDialog:function(){
var artistIdDialog=new MojoDialog({
id:'artistIdDialog',
title:''
});

artistIdDialog.open($T(lt.Artist.ArtistId)
.replaceToken('artistId',this.info.lalaId)
.compose());
}
};
Object.extend(ArtistPage.prototype,Page.prototype,true);
MyMusic.addPage('artist',function(){return new ArtistPage();});

ArtistAPage=Class.create();
ArtistAPage.prototype={
initialize:function(){
this.initPage({
authLevel:0,
pageId:'ArtistAPage',
skelClass:'artistAPage'
});
},

onLoad:function(pathParts){
this.initFromPath(pathParts);

var albumsTab={id:'albums',title:'Albums',
sort:['newest','oldest','mostListens'],
defaultSortOrder:{key:this.albumsSortKey,dir:this.albumsSortDir},
histos:['Genre','Subgenre','AlbumType']};
var compilationsTab={id:'compilations',title:'Compilations',
sort:['newest','oldest','mostListens'],
defaultSortOrder:{key:this.compilationsSortKey,dir:this.compilationsSortDir},
histos:['Genre','Subgenre']};
var songsTab={id:'songs',title:'Songs',
sort:['mostListens','newest','oldest','topRated'],
defaultSortOrder:{key:this.songsSortKey,dir:this.songsSortDir},
histos:['Genre','Subgenre']};
var mySongsTab={id:'mysongs',title:'My songs',
sort:['myListens','myNewest','myOldest','myTopRated'],
defaultSortOrder:{key:this.mySongsSortKey,dir:this.mySongsSortDir},
histos:['Genre','Subgenre']};
var fullCatalogTab={id:'fullcatalog',title:'All albums',
sort:['newest','oldest','mostListens'],
defaultSortOrder:{key:this.fullCatalogSortKey,dir:this.fullCatalogSortDir},
histos:['Genre','Subgenre','AlbumType']};

var influencersTab={id:'influencers',title:'Influencers',disableSearch:true};
var listenersTab={id:'listeners',title:'Listeners',disableSearch:true};
var playlistsTab={id:'playlists',title:'Playlists',disableSearch:true};

var tabs;
switch(pathParts.llast()){
case'compilations':
tabs=[compilationsTab];
break;
case'fullcatalog':
tabs=[fullCatalogTab];
break;
case'mysongs':
tabs=[albumsTab,songsTab,mySongsTab];
break;
case'influencers':
case'listeners':
case'playlists':
tabs=[influencersTab,listenersTab,playlistsTab];
break;
default:
tabs=[albumsTab,songsTab,mySongsTab];
}

this.renderAPage({
title:this.artist,
titleLink:frontend.link.Artist(this.artist),
pathParts:pathParts,
tabs:tabs});
},

onLoadAPageSongsTab:function(){
this.aPageLoadAndRenderSongs(
this.songsQ,{showRatings:true,
hideZeroRating:true,
showListens:'count',
whichListen:'listens7'});
},

onLoadAPageMysongsTab:function(){
var self=this;
var params=this.getAPageQueryParams(this.mySongsQ,'song');
api.Q.searchCollectionSongs(
params,
function(res){
self.renderAPageSongsTab(
res,
res.data.songs,
res.data.histos,
{showRatings:true,
showMyRatings:true,
hideZeroRating:true,
showListens:'count',
whichListen:'listens'});
});
},

onLoadAPageAlbumsTab:function(){
this.aPageLoadAndRenderAlbums(
this.albumsQ,
{showListens:'count',
whichListen:'listens7',
showNum:true});
},

onLoadAPageCompilationsTab:function(){
this.aPageLoadAndRenderAlbums(
this.compilationsQ,
{showListens:'count',whichListen:'listens7'});
},

onLoadAPageFullcatalogTab:function(){
this.aPageLoadAndRenderAlbums(
this.fullCatalogQ,
{showListens:'count',whichListen:'listens7'});
},

onLoadAPageInfluencersTab:function(){
this.aPageLoadAndRenderInfluencers(
this.influencersQ,
{layout:'influential',context:'artist'});
},

onLoadAPageListenersTab:function(){
this.aPageLoadAndRenderListeners(
this.listenersQ,
{layout:'artistListen',context:{artist:this.artist}});
},

onLoadAPagePlaylistsTab:function(){
this.aPageLoadAndRenderPlaylists(this.playlistsQ,{});
}
};
Object.extend(ArtistAPage.prototype,NewAPage.prototype,true);
Object.extend(ArtistAPage.prototype,ArtistPage.prototype,true);
MyMusic.addPageRegex('artist',/artist.*\/more\/.*/,function(){return new ArtistAPage();});

ArtistBioPage=Class.create();
ArtistBioPage.prototype={
initialize:function(){
this.initPage({theme:'greenTheme',pageId:'ArtistBio',
skelClass:'artistBioPage'});
this.artist=null;
},

onLoad:function(pathParts){
this.artist=pathParts[1].lspacesForUnderbars(false);
this.renderIntoContentRegion(
$T(g_artistBioViewTemplate)
.replaceToken("artist",this.artist));

api.Catalog.getArtistWiki(
this.artist,
this.renderWiki.lbind(this));
},

getPageTitle:function(){
return"Artist Bio: "+this.artist.lspacesForUnderbars();
},

renderWiki:function(res){
this.wiki=res.data;
if(!this.wiki){
mojo.setContent('theArtistBio',
'Sorry, we encountered an error while trying to load this artists biography.<br><a class="" #link:ContactSupport()>Contact support</a> if this problem persists.'.compose());
return;
}

var artistImageBasePath=this.wiki.imgBasePath;
var hideArtistImage=artistImageBasePath?'':'none';
var content=this.wiki.content
.replace(/<A/gi,'<A target="_blank"')
.replace(/<ref.*?<\/ref>/ig,'')
.replace(/<p>__TOC__<\/p>/gi,'')
.replace(/<p>[|].*?<\/p>/gi,'')
.replace(/<p>[}].*?<\/p>/gi,'')
.replace(/[(], /gi,'(');

content=content.split(/<H2>\s*Discography/)[0];
content=content.split(/<H1>\s*Notes/)[0];
$T(g_artistBioMainDiv,'theArtistBio')
.replaceToken('wikiURL',this.wiki.wikiURL)
.replaceToken('artistImageBasePath',artistImageBasePath)
.replaceToken('hideArtistImage',hideArtistImage)
.replaceToken('content',content)
.replaceToken('artist',this.artist.lspacesForUnderbars())
.compose();
}
};
Object.extend(ArtistBioPage.prototype,Page.prototype,true);
MyMusic.addPageRegex('artist',/artist\/.*\/bio$/,
function(){return new ArtistBioPage();});

ArtistPromos=Class.create();
ArtistPromos.prototype={
initialize:function(){




var rhettJune12Timestamp=1244876400*1000;
var rhettJune9Timestamp=1244530800*1000;

this.promosByArtist={
'kings of leon':{
cid:'KingsOfLeon',
creatorToken:'18388@64085',
artistName:'Kings of Leon',
playlistToken:'18388P35137',
albumId:'504684633539804885',
img:'kol_promo.gif',
comments:[
"From Fight Club",
"From Friday Night Lights",
"From Rules Of Attraction",
"From Romeo & Juliet",
"From Silence Of The Lambs",
"From The Royal Tenenbaums",
"From American Psycho",
"From Virgin Suicides",
"From Pretty In Pink",
"From Wayne's World",
"From Reservoir Dogs",
"From Beetlejuice",
"From Garden State",
"From The Royal Tenenbaums",
"From Marie Antoinette",
"From Vanilla Sky",
"From Vanilla Sky"
],
twitterText:'Listening to Kings of Leon\'s favorite movie tracks on Lala'
},
'rhett miller':{
cid:'RhettMiller',
creatorToken:'29946@65708',
artistName:'Rhett Miller',
playlistToken:'29946P36465',
albumId:'504684633538309390',
albumIdDeluxe:'504684633538309432',
albumIdShowOnPlaylistPage:
new Date().getTime()>=rhettJune9Timestamp
?'504684633538309390':'432627039263871666',
img:'kol_promo.gif',
comments:[

"Do you like great big American Rock and Roll?",

"Do you like Telecasters?  French?",

"It's hard for me to pick a favorite PB song, but this ode to Solomon's wisdom will do.  Buy Joe Pernice's novel when it comes out in August!",

"One night, Jon Brion, Evan Dando and yours truly decided that this song was almost perfect.  The only way it could have been better is if the misheard lyric (\"The only thing that's real are the kids who [kill] themselves...\") was the real lyric.",

"\"Wear your hair long/ baby can't go wrong\" indeed!",

"\"Double pneumonia in a single room.\"  I've been creating variations on this lyric for 20 years.",

"I didn't really hear the words to this the first few hundred listens.  Then I did.  Wow.",

"Jon Brion and I sometimes console each other with Alex Chilton's great quote, \"All my songs sound like <span style='font-style: normal'>hits to me</span>.\"",

"This was XTC's alter-ego, goof band.  How come I like them better than XTC?",

"His new album <span style='font-style: normal'>Constellation</span> is his masterwork, but <span style='font-style: normal'>Snowing In My Heart</span> is the one that made me realize he'd arrived as a producer.  Since then I've only made records with him."
],
twitterText:'Listening to Rhett Miller\'s favorite tracks on Lala'
}
};

this.promosByPlaylist={};
this.promosByUser={};
this.promosByAlbum={};

for(var key in this.promosByArtist){
var promo=this.promosByArtist[key];
this.promosByPlaylist[promo.playlistToken]=promo;
this.promosByAlbum[promo.albumId]=promo;
this.promosByUser[promo.creatorToken]=promo;
}

ArtistPromos.g=this;
},

byUser:function(token){
return this.promosByUser[token];
},

byArtist:function(artistName){
artistName=artistName.toLowerCase();
return this.promosByArtist[artistName];
},

byPlaylist:function(token){
return this.promosByPlaylist[token];
},

byAlbum:function(albumId){
return this.promosByAlbum[albumId];
}
};
ArtistPromos.g=new ArtistPromos();




TradingTransitionPage=Class.create();
TradingTransitionPage.prototype={
initialize:function(){
this.initPage({title:'Trading Transition',authLevel:1,
tradingOnly:true,
skelClass:'tradingTransition'});

TradingTransitionPage.g=this;
},

onLoad:function(){
this.renderIntoContentRegion($T(lt.TradingTranstion.skel));
},

getPageTitle:function(){
return'Trading Transition';
}
};
Object.extend(TradingTransitionPage.prototype,Page.prototype,true);
MyMusic.addPage('tradingtransition',function(){return new TradingTransitionPage();});



BrowsePageBase=Class.create();
BrowsePageBase.prototype={
initPageBase:function(pageId,title,cls){
this.pageLabel=title;
this.CAROUSEL_THUMB_HEIGHT=135;
this.topSortOrder=this.getTopSortOrder();
this.initPage({
pageTitle:title,
authLevel:0,pageId:pageId,
skelClass:cls+' browseBasePage'});
},

onLoadBase:function(pathParts){


this.initStateFromPath(pathParts);
this.loadPage();
},

initStateFromPath:function(pathParts){
this._parsePath(pathParts);
},

renderPageBase:function(title,breadCrumbTitle){
if(!breadCrumbTitle)breadCrumbTitle=title;
this._renderSkeleton(title,breadCrumbTitle);


if(!this.isTopLevel){
this._setBreadCrumb(this.pageId);
}


this._renderGenreSelectors(this.pageId+'Genre');

this._renderSidewaysNav(this.layout.col1);

$TC(lt[this.pageId].col1,this.layout.col2);
},

getBaseQ:function(){
var Q='';
if(this.label){
Q+='label: "'+this.label.lescapeForLeah()+'" ';
}else{
if(this.genre){
Q+='genre: "'+this.genre.lescapeForLeah()+'" ';
}
if(this.subGenre){
Q+='subgenre: "'+this.subGenre.lescapeForLeah()+'"';
}
}
Q+=' filter:+full ';
return Q;
},


getTopBaseQ:function(){
return this.getBaseQ()+' top:'+this.topSortOrder.key;
},

getTopSortOrder:function(){
return{key:'Listens7',dir:'Desc'};
},

getNewReleasesQ:function(bucket){
if(!bucket){

var bucketSize=this.getNewReleaseBucketSize();
bucket=bucketSize=='week'
?'weeksAll'
:bucketSize=='all'?'year':'monthsAll';
}

var filter;
switch(bucket){
case'thisWeek':filter='released-week:0';break;
case'lastWeek':filter='released-week:1';break;
case'twoWeeksAgo':filter='released-week:2';break;
case'weeksAll':filter='released-week:1..4';break;
case'thisMonth':filter='released-week:0..3';break;
case'lastMonth':filter='released-week:4..7';break;
case'twoMonthsAgo':filter='released-week:8..11';break;
case'monthsAll':filter='released-week:1..12';break;
case'year':filter='released-week:0..51';break;
default:mojo.log.error('unsupported new release bucket: '+bucket);
}
return this.getBaseQ()+filter+' ';
},

getNewReleasesFirstTabBucketQ:function(){
var bucketSize=this.getNewReleaseBucketSize();
var size;

if(bucketSize=='all')size='year';
else if(bucketSize=='week')size='thisWeek';
else size='thisMonth';

var Q=this.getNewReleasesQ(size);
return Q;
},

getNewReleasesFirstTabBucketSize:function(){
var bucketSize=this.getNewReleaseBucketSize();

var size;
if(bucketSize=='all')size='year';
else if(bucketSize=='week')size='thisWeek';
else size='thisMonth';

return size;
},


getNewReleaseBucketSize:function(){
if(this.subGenre||this.label)return'all';

var size='';
switch(this.genre){
case'Alternative':
case'Electronic':
case'Hip-Hop':
case'Rock':
case'Pop':
case'Jazz':
size='week';
break;
case'Blues':
case'Comedy':
case'Children':
case'Easy Listening':
case'Country':
case'Folk':
case'Classical':
case'Holiday Music':
case'New Age':
case'Metal':
case'Latin':
case'Praise & Worship':
case'Punk':
case'Soul':
case'Reggae':
case'Soundtrack':
case'Spoken Word':
case'R&B':
case'World Music':
size='month';
break;
case'Oldies':
size='all';
break;
default:
size='week';
break;
}
return size;
},

getBestsellersQ:function(bucket){
var filter;
switch(bucket){
case'webAll':filter='web-album-price:1..';break;
case'webUnder75':filter='web-album-price:1..74';break;
case'mp3Under6':filter='mp3-album-price:1..599';break;
case'mp3Under7':filter='mp3-album-price:600..699';break;
case'mp3Under8':filter='mp3-album-price:700..799';break;
case'mp3All':filter='mp3-album-price:1..';break;
case'webSong':filter='web-song-price:1..10';break;
case'mp3Song':filter='mp3-song-price:1..';break;
}
var Q=this.getBaseQ()+filter+' filter:-multidisc top:';
if(bucket.lcontains('mp3')){
Q+='Buys';
}else{
Q+='WebAdds';
}
return Q;
},

renderPaginator:function(widgetDivId,res,list){
this.paginator=new widgets.core.Paginator(
widgetDivId+'Pager','lite',widgetDivId+'PagerBottom','big',null,null,true);
this.paginator.recordBackEvents=true;
this.paginator.renderTwo(res,list);
},

renderEmptyPage:function(divId,title){
$T(lt.BrowsePageBase.emptyPage,divId)
.replaceToken('title',title)
.compose();

var id=this._getContextTrackingId('emptyPage');
lala.Track.clientPage(id);
},

_renderSiblingSelectors:function(subgenres,linkToPage){
var isSubGenreSelected=this.genre&&this.subGenre;
this.genreSiblingSelector=new widgets.core.GenreSelectorPopup({
genreList:DataModel.g.getAllGenres(),
parentGenre:null,
selectedGenre:this.genre,
linkToPage:linkToPage
});
if(isSubGenreSelected){
this.subgenreSiblingSelector=new widgets.core.GenreSelectorPopup({
genreList:subgenres,
parentGenre:this.genre,
selectedGenre:this.subGenre,
linkToPage:linkToPage
});
}
},

_renderChildrenSelector:function(genresOrSubgenres,linkToPage){
var genres=genresOrSubgenres;
if(genres&&genres.length>0){
var favGenres=this.isTopLevel?DataModel.g.getFavoriteGenres():genres.slice(0,4);
new widgets.core.GenreSelectorPopup({
renderTargetId:'genrePicker',
genreList:genres,
topGenres:favGenres,
selectedGenre:this.genre,
parentGenre:this.genre,
linkToPage:linkToPage
}).render();
}
},

_renderGenreSelectors:function(linkToPage){
var self=this;
if(this.label)return;
var isGenreSelected=this.genre&&!this.subGenre;

var genres=DataModel.g.getAllGenres();

if(this.isTopLevel){
this._renderChildrenSelector(genres,linkToPage);
}else{
api.SearchUtils.getSubgenres(this.genre,function(res){
var subgenres=res.data;
self._renderSiblingSelectors(subgenres,linkToPage);
if(isGenreSelected)self._renderChildrenSelector(subgenres,linkToPage);
});
}
},

_renderSkeleton:function(title,breadCrumbTitle){
var t=$T(lt.BrowsePageBase.skeleton);

var linkToPage=this.pageId;
t.removeTokenBlock('CrumbLabelBlock',!this.label);
t.removeTokenBlock('CrumbGenreSelectorBlock',this.label||this.isTopLevel);
t.removeTokenBlock('CrumbGenreTextBlock',this.label||this.isTopLevel||this.subGenre);
t.removeTokenBlock('CrumbGenreLinkBlock',this.label||this.isTopLevel||!this.subGenre);
t.removeTokenBlock('')
t.removeTokenBlock('CrumbSubGenreBlock',this.label||this.isTopLevel||!this.subGenre);
t.removeTokenBlock('CrumbTitleBlock',this.isTopLevel);
t.replaceToken('crumbTitle',breadCrumbTitle);
t.replaceToken('linkToPage',linkToPage);
t.replaceToken('label',this.label);
t.replaceToken('genre',this.genre);
t.replaceToken('subGenre',this.subGenre);
t.replaceToken('titleLink',frontend.link[linkToPage]());
t.replaceToken('labelLink',this.label?frontend.link[linkToPage+'Label'](this.label):null);
t.replaceToken('genreLink',this.genre?frontend.link[linkToPage+'Genre'](this.genre,this.subGenre?this.subGenre.lescapeQuotes():null):null);
t.replaceToken('titleContent',this.getTitleText(title,linkToPage));
this.renderIntoContentRegion(t);

this.layout=new widgets.core.TwoColumn({renderTargetId:'content',id:'browseNewTwoCol'});
this.layout.render();
},

getTitleText:function(title,linkToPage,enableLinks){
var t=$T(this.pageId=='NewReleases'||this.pageId=='NewReleasesAPage'
?lt.BrowsePageBase.newReleasesPageTitle
:lt.BrowsePageBase.pageTitle);
this._replaceTitleTokens(t,linkToPage,title,enableLinks);
return t.compose();
},

getAPageTitleText:function(title,linkToPage){
return this.getTitleText(title,linkToPage,true);
},

_replaceTitleTokens:function(t,linkToPage,title,enableLinks){
var disabledLink='href="javascript: void 0"';

t.replaceToken('title',title);
t.replaceToken('label',this.label);
t.replaceToken('titleGenre',this.subGenre?this.subGenre:this.genre);

t.replaceToken('disabled',!enableLinks?'disabled':'');
t.replaceToken('titleLink',enableLinks?frontend.link[linkToPage]():disabledLink);
t.replaceToken('labelLink',enableLinks&&this.label?frontend.link[linkToPage+'Label'](this.label):disabledLink);
t.replaceToken('genreLink',enableLinks&&this.genre?frontend.link[linkToPage+'Genre'](this.genre,this.subGenre?this.subGenre.lescapeQuotes():null):disabledLink);

t.removeTokenBlock('TitleGenreBlock',this.label);
if(this.pageId=='NewReleases'||this.pageId=='NewReleasesAPage')t.removeTokenBlock('InBlock',this.isTopLevel||(this.pageId=='Browse'||this.pageId=='BrowseAPage'));
t.removeTokenBlock('TitleLabelBlock',!this.label);
},






_parsePath:function(pathParts){

this.genre=null;
this.subGenre=null;
this.label=null;

if(pathParts.length>2&&pathParts[1]=='label'){
this.label=pathParts[2].lspacesForUnderbars();
}else if(pathParts.length>2&&pathParts[1]=='genre'){
this.genre=pathParts[2].lspacesForUnderbars();
if(pathParts.length>3&&pathParts[3]!='more'){
this.subGenre=pathParts[3].lspacesForUnderbars();
}
}


this.isTopLevel=!this.genre&&!this.subGenre&&!this.label;
},

_renderSidewaysNav:function(divId){
var t=$T(lt.BrowsePageBase.sidewaysNav,divId)
.replaceToken('selected'+this.pageId,'selected')
.replaceToken('bestsellersLink',this.getLinkFor('Bestsellers'))
.replaceToken('browseLink',this.getLinkFor('Browse'))
.replaceToken('newReleaseLink',this.getLinkFor('NewReleases'))
.replaceToken('playlistsLink',this.getLinkFor('Playlists'))
.replaceToken('influencersLink',this.getLinkFor('Influencers'))
.replaceToken('listenersLink',this.getLinkFor('Listeners'))
.replaceToken('hotDealsLink',frontend.link.Content('HotDeals','SidewaysNav.HotDeals'));
t.keepTokenBlock('HotDealsBlock',this.isTopLevel);
t.compose();
},

getLinkFor:function(linkToPage){
var trackingId='SidewaysNav.'+linkToPage;
if(this.isTopLevel){
return frontend.link[linkToPage](trackingId);
}else if(this.label){
return frontend.link[linkToPage+'Label'](this.label,trackingId);
}else{
return frontend.link[linkToPage+'Genre'](this.genre,this.subGenre,trackingId);
}
},

getPageViewId:function(){
return this._getContextTrackingId(this.pageId);
},

_getContextTrackingId:function(id){
if(this.label){
id+='.Label';
}else{
if(!this.isTopLevel){
if(this.subGenre){
id+='.SubGenre.'+this.genre+'.'+this.subGenre;
}else{
id+='.Genre.'+this.genre;
}
}else{
id+='.TopLevel';
}
}
return id;
},










_setBreadCrumb:function(linkFuncName,lastTitle){
MyMusic.g.setDocumentTitle(this._getDynamicPageTitle());
},

_getDynamicPageTitle:function(){
var title=this.pageTitle;
if(this.isTopLevel)return title;
else if(this.label)return title+=' - '+this.label;
else if(this.subGenre)return title+=' - '+this.subGenre;
else if(this.genre)return title+=' - '+this.genre;
else return title;
}
};

BrowsePage=Class.create();
BrowsePage.prototype={
initialize:function(){
this.initPageBase('Browse','Browse','browsePage');
this.initCommon();

BrowsePage.g=this;
},

initCommon:function(){
},

onLoad:function(pathParts){
this.onLoadBase(pathParts);
},

loadPage:function(){
this.songSortKey=lala.params.songSortKey||'Listens7';
this.songSortDir=lala.params.songSortDir||'Desc';
this.artistSortKey='Rank';
this.artistSortDir='Asc';

var self=this;
var bucketSize=this.getNewReleasesFirstTabBucketSize();

api.BrowsePage.browse({
Q:this.getTopBaseQ(),
sortKey:this.topSortOrder.key,
sortDir:this.topSortOrder.dir,
count:25,
songQ:this.getTopBaseQ(),
songSortKey:this.songSortKey,
songSortDir:this.songSortDir,
artistSortKey:this.artistSortKey,
artistSortDir:this.artistSortDir,
newReleaseQ:this.getNewReleasesFirstTabBucketQ(),
newReleaseSortKey:bucketSize!='year'?'Release':'Listens7',
newReleaseSortDir:'Desc',
newReleaseCount:12,
risingArtistQ:this.getTopBaseQ(),
risingArtistSortKey:'Trend',
risingArtistSortDir:'Asc',
risingArtistCount:10
},
function(res){
self.labels=res.data.labels.values;
self.artists=res.data.artists;
self.risingArtists=res.data.risingArtists;
self.albums=res.data.albums;
self.playlists=res.data.playlists;
self.songs=res.data.songs;
self.newReleases=res.data.newReleases;

self.influencers=res.data.influencers;
self.listeners=res.data.listeners;

self.renderPage();
});
},

renderPage:function(){
var title=this.isTopLevel?'Lala\'s Top Music':'';
this.renderPageBase(title,'Top Music');
if(this.songs.total==0){
this.renderEmptyPage('browseContent','songs');
return;
}

this.twoColLayout=new widgets.core.TwoColumn({
renderTargetId:'browseContent'
});
this.twoColLayout.render();


$T(lt.Browse.middleCol,this.twoColLayout.col1)
.removeTokenBlock('FFMacBlock',!(mojo.FF&&mojo.MAC&&this.newReleases.total<3))
.compose();
$TC(lt.Browse.rightCol,this.twoColLayout.col2);

this._renderPromos();
this._renderMix();
this._renderArtists();
this._renderAlbums();
this._renderPlaylists();
this._renderSongsTabs();
this._renderListeners();
this._renderInfluencers();
this._renderLabels();

if(mojo.LALA_CRAWLER){
this.setPageMetaInfo(this.artists.list);
}
},

_renderAlbums:function(){

if(this.newReleases.total>=3){
this.albumsCarousel=new widgets.core.Carousel({
resizeContainerId:$(this.twoColLayout.col1).parentNode,
contents:[{
list:this.newReleases.list,
title:'New releases',
moreLink:{
url:this.getLinkFor('NewReleases'),
title:'See all new releases &gt;'
},
trackingId:'browse.albumCarousel',
pageIndex:lala.params.albumsPageIndex
}],
isExpanded:lala.params.albumsIsExpanded=='true',
renderTargetId:'browseAlbumCarousel',
pageTemplate:lt.Browse.carouselAlbumPage,
onStateChange:this.onStateChange.lbind(this),
thumbHeight:125
});
this.albumsCarousel.render();
}


new widgets.AlbumListSimple({
renderTargetId:'browseAlbums',
title:'Top albums',
clickTrackingId:'topAlbums',
displayCount:5,
evenMoreLink:frontend.link.NewAPage('albums')
}).render(this.albums);
},

_renderPlaylists:function(){
if(this.playlists.total==0)return;

var w=new widgets.PlaylistList({
renderTargetId:'browsePlaylists',
clickTrackingId:'topPlaylists',
moreLink:this.getLinkFor('Playlists'),
trackingId:'browsePlaylists',
useLargeIcon:false
});
w.renderPod('Top playlists',this.playlists);
},

onStateChange:function(){

if(!this.albumsCarousel&&!this.artistsCarousel)return;

var params={};
if(this.artistsCarousel&&this.artistsCarousel.mojoCarousel){
Object.extend(params,
{artistsPageIndex:this.artistsCarousel.mojoCarousel.selectedIndex,
artistsIsExpanded:this.artistsCarousel.mojoCarousel.isExpanded});
}

if(this.albumsCarousel&&this.albumsCarousel.mojoCarousel){
Object.extend(params,
{albumsPageIndex:this.albumsCarousel.mojoCarousel.selectedIndex,
albumsIsExpanded:this.albumsCarousel.mojoCarousel.isExpanded});
}

MyMusic.g.history.pushInPageEvent(params);
},

_renderPromos:function(){
if(!this.isTopLevel)return;

this.promoWidget=new PromoWidget({
renderTargetId:'browsePromos',
blobId:'Home'
});
this.promoWidget.loadAndRender();
},

_renderMix:function(){
var what=null;
if(this.label)what=this.label;
else if(this.subGenre)what=this.subGenre;
else if(this.genre)what=this.genre;
if(!what)return;


if(this.artists.total<=5)return;

$T(lt.MixOnArtistBrowse.content,'browseMix')
.replaceToken('text',what+' music')
.replaceToken('onMix','BrowsePage.g.onMix(\''+what+'\')')
.compose();
},

onMix:function(what){
if(frontend.requiresSignin())return;
new MixDrawer({
type:'Q',
displayValue:what,
Q:this.getTopBaseQ()}).open();
},

_renderArtists:function(){
if(this.artists.total>=5){
new widgets.core.ShadowBox({
renderTargetId:'browseArtists',
content:$TC(lt.Browse.artistBox)
}).render();


if(this.artists.total>0){
new widgets.ArtistList({
renderTargetId:'topArtists',
clickTrackingId:'topArtists',
title:'Top artists',
displayCount:10,
evenMoreLink:frontend.link.NewAPage('artists'),
evenMoreLinkLabel:'top artists'
}).render(this.artists);
}


if(this.risingArtists.total>0){
new widgets.ArtistList({
renderTargetId:'risingArtists',
clickTrackingId:'risingArtists',
title:'Fastest rising artists',
displayCount:10,
evenMoreLink:frontend.link.NewAPage('artists',{sort:'risers'}),
evenMoreLinkLabel:'rising artists'
}).render(this.risingArtists);
}else{
$TC(lt.Browse.risersNotAvailable,'risingArtists');
}
}
},

_renderSongsTabs:function(){
$TC(lt.Browse.topSongs,'browseSongs');

this.songTabs=mojo.newtabs.create({
divTabsId:'songListTabs',
divTabsContentId:'browseTopSongs',
trackingId:'songList'
});

this.songTabs.onTabClick=this.onSongsTabClick.lbind(this);
this.songTabs.add({id:'topSongs',title:'Top songs'});
this.songTabs.add({id:'fastestMovers',title:'Fastest movers'});
this.songTabs.activate(
this.songSortKey=='Trend'?'fastestMovers':'topSongs');
},

onSongsTabClick:function(activeTab,isClick){
$TC(lt.Browse.topSongsQueueLink,'browseTopSongsQueueLink');
if(activeTab.id=='topSongs'){
if(isClick)this.songSortKey='Listens7';
this.songSortDir='Desc';

$TC(lt.Browse.topSongsSortControls,'songListSortControls');

mojo.form.selectOption('songListSortSelect',this.songSortKey);
}else if(activeTab.id=='fastestMovers'){
this.songSortKey='Trend';
if(!lala.params.songSortDir){
this.songSortDir='Asc';
}
var upDown=$T(lt.Browse.fastestMoversSortControls,'songListSortControls');
if(this.songSortDir=='Desc')upDown.replaceToken('downChecked','checked');
else upDown.replaceToken('upChecked','checked');
upDown.compose();
}

$S('browseTopSongs','');
if(isClick){
MyMusic.g.history.pushInPageEvent(this._getSortBackState());
this._loadAndRenderSongList();
}else{
this._renderSongList();
}
},

_loadAndRenderSongList:function(){
var self=this;
api.Q.searchSongs({
Q:this.getTopBaseQ(),
sortKey:this.songSortKey,
sortDir:this.songSortDir,
count:25
},function(res){
self.songs=res.data.songs;
self._renderSongList();
})
},

_renderSongList:function(){
$S('songListSongCount',this.songs.list.length);

var aPageParams={
skip:24,
sort:this._getAPageSongSort()
}

this.songlist=new widgets.SongList({
renderTargetId:this.songTabs.all[this.songTabs.active.id].contentId,
trackingId:'songList',
clickTrackingId:'songList',
customFrameClass:'lclearTopBorder',
showListens:'count',
whichListen:'listens7',
evenMoreLink:frontend.link.NewAPage('songs',aPageParams),
showRatings:true,
hideZeroRating:true,
hideRankInfo:this.songSortKey=='Trend',
showTrendInfo:this.songSortKey=='Trend'
});
this.songlist.render(this.songs,null,25);
},

_getAPageSongSort:function(){
switch(this.songSortKey){
case'Trend':
return(this.songSortDir=='Asc')?'risers':'fallers';
break;
case'Listens7':
return'mostListens';
break;
case'Rating':
return'topRated';
break;
default:
return'';
}
},

onChangeSongSortDir:function(dir){
this.songSortDir=dir;
$('songListSort'+dir).checked=true;
MyMusic.g.history.pushInPageEvent(this._getSortBackState());
this._loadAndRenderSongList();

lala.Track.clientPageInteraction(
this.songTabs.trackingId+'.changeSortDir.'+this.songSortDir);
},

_getSortBackState:function(){
return{songSortKey:this.songSortKey,songSortDir:this.songSortDir};
},

onChangeSongSortKey:function(){
this.songSortKey=$F('songListSortSelect');
MyMusic.g.history.pushInPageEvent(this._getSortBackState());
this._loadAndRenderSongList();

lala.Track.clientPageInteraction(
this.songTabs.trackingId+'.changeSortKey.'+this.songSortKey);
},

_renderLabels:function(){
if(this.label||this.labels.length==0)return;

new widgets.LabelList({
renderTargetId:'browseLabels',
title:'Popular labels',
clickTrackingId:'topLabels',
subtitle:'Find songs by record label',
hideTitles:true,
labelCount:20
}).render(this.labels);
},

_renderListeners:function(){
if(this.listeners.total>0){
new widgets.TopListeners({
renderTargetId:'browseListeners',
clickTrackingId:'topListeners',
evenMoreLink:this.getLinkFor('Listeners'),
subtitle:'Top listeners in the last 7 days'
}).render(this.listeners);
}
},

_renderInfluencers:function(){
if(this.influencers.total>0){
new widgets.Influencers({
renderTargetId:'browseInfluencers',
clickTrackingId:'topInfluencers',
evenMoreLink:this.getLinkFor('Influencers'),
context:this.genre?(this.subGenre?'subgenre':'genre'):null
}).render(this.influencers);
}
},

setPageMetaInfo:function(topArtists){
var artistList="";
topArtists.leachFrom(
0,3,function(artist){
artistList+=artist.artist+", ";
});
if(this.label){
MyMusic.g.setDocumentMetaInfo(
"Listen to songs from artists on the record label "+this.label
+", including songs from "+artistList
+(topArtists.length>3?"and more.":"so come check it out.")
);
}else if(this.isGenreAll){
MyMusic.g.setDocumentMetaInfo(
"Listen to songs from all of the top artists, including "+artistList
+(topArtists.length>3?"and more.":"so come check it out.")
);
}else{
MyMusic.g.setDocumentMetaInfo(
"Listen to all your favorite "+(this.subGenre?this.subGenre:this.genre)
+" music, including songs from "+artistList
+(topArtists.length>3?"and more.":"so come check it out.")
);
}
},

onPlayAllSongs:function(){
if(lala.user){
var songPlayIds=this.songs.list.lpluck('songLalaId');
Player.g.playCustomBag(songPlayIds,this._getDynamicPageTitle(),'');
}else if(this.songs.total>0){
Player.g.playTrackWithoutQueue(this.songs.list[0]);
}else{
Player.g.requireSigninForAnonUser('these songs');
}

lala.Track.clientPageInteraction(
this.songTabs.trackingId+'.playAll');
},

onQueueAllSongs:function(elem){
var songPlayIds=this.songs.list.lpluck('songLalaId');
Player.g.queueCustomBag(songPlayIds,this._getDynamicPageTitle(),'');
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);

lala.Track.clientPageInteraction(
this.songTabs.trackingId+'.queueAll');
}
};
Object.extend(BrowsePage.prototype,Page.prototype,true);
Object.extend(BrowsePage.prototype,BrowsePageBase.prototype,true);
MyMusic.addPage('browse',function(){return new BrowsePage();});

BrowseAPage=Class.create();
BrowseAPage.prototype={
initialize:function(){
this.initPage({
pageTitle:'Lala\'s Top Music',
authLevel:0,
pageId:'BrowseAPage',
skelClass:'browseAPage'
});
this.initCommon();
},

onLoad:function(pathParts){
this.initStateFromPath(pathParts);
this.topSortOrder=this.getTopSortOrder();

var linkToPage='Browse';
this._setBreadCrumb(linkToPage,'All');
var pageTitle=
this.getAPageTitleText(this.isTopLevel?'Lala\'s Top Music':'',linkToPage);
this.renderAPage({
title:pageTitle,
pathParts:pathParts,
tabs:[
{id:'artists',title:'Artists',
sort:['rank','risers','fallers'],
defaultSortOrder:{key:'Rank',dir:'Asc'},
histos:['Genre','Subgenre']},
{id:'albums',title:'Albums',
sort:['mostListens','risers','fallers','newest','oldest'],
defaultSortOrder:this.topSortOrder,
histos:['Genre','Subgenre','AlbumType']},
{id:'songs',title:'Songs',
sort:['mostListens','risers','fallers','newest','oldest','topRated'],
defaultSortOrder:this.topSortOrder,
histos:['Genre','Subgenre']}
]});
},

onLoadAPageSongsTab:function(){
this.aPageLoadAndRenderSongs(
this.getTopBaseQ(),{showRatings:true,
hideZeroRating:true,
showListens:'count',
whichListen:'listens7'});
},

onLoadAPageAlbumsTab:function(){
this.aPageLoadAndRenderAlbums(
this.getTopBaseQ(),
{showListens:'count',layout:'list',showNum:true});
},

onLoadAPageArtistsTab:function(){
this.aPageLoadAndRenderArtists(
this.getTopBaseQ(),
{showListens:'listens7',layout:'list'});
}
};
Object.extend(BrowseAPage.prototype,NewAPage.prototype,true);
Object.extend(BrowseAPage.prototype,BrowsePage.prototype,true);
MyMusic.addPageRegex('browse',/browse.*\/more\/.*/,function(){return new BrowseAPage();});

NewReleasesPage=Class.create();
NewReleasesPage.prototype={
initialize:function(){
this.initPageBase('NewReleases','New Releases','newReleasesPage');
NewReleasesPage.g=this;
},

initCommon:function(){
this.sortKey='Release';
this.sortDir='Desc';
this.count=32;
this.popularSortKey='Listens7';
this.popularSortDir='Desc';
this.headingTitle=this.genre?'New':'New Releases';
},

onLoad:function(pathParts){
this.onLoadBase(pathParts);
},

loadPage:function(){
var self=this;
this.initCommon();

api.BrowsePage.getNewReleases(
{count:this.count,
sortKey:this.sortKey,
sortDir:this.sortDir,
smallQ:this.getNewReleasesFirstTabBucketQ(),
bigQ:this.getNewReleasesQ(),
bigCount:10,
bigSortKey:this.popularSortKey,
bigSortDir:this.popularSortDir
},
function(res){

self.smallBucket=res.data.smallBucket;
self.bigBucket=res.data.bigBucket;
self.renderPage();
});
},

renderPage:function(){
this.renderPageBase(this.headingTitle,'New Releases');

if(this.bigBucket.total==0){
this.renderEmptyPage('mainCarousel','new releases');
return;
}

this.renderCarousel();
this.renderBigBucket('monthReleases',this.bigBucket,'Recent & popular releases');
},

renderCarousel:function(){
var weekOrMonth=this.getNewReleaseBucketSize();
if(weekOrMonth=='all')return;

var pageTemplate=lt.NewReleases.carouselThumb;
var trackingId='newreleases.carousel';
var weekOrMonthCap=weekOrMonth.ltoFirstUpperCase();
var contents=[{tabTitle:'This '+weekOrMonth,
list:this.smallBucket.list,
trackingId:trackingId+'.this'+weekOrMonthCap,
moreLink:{url:frontend.link.NewAPage('this'+weekOrMonthCap),
title:'More from this '+weekOrMonth}},
{tabTitle:'Last '+weekOrMonth,
getList:this.loadBucket('last'+weekOrMonthCap),
trackingId:trackingId+'.last'+weekOrMonthCap,
moreLink:{url:frontend.link.NewAPage('last'+weekOrMonthCap),
title:'More from last '+weekOrMonth}},
{tabTitle:'2 '+weekOrMonth+'s ago',
getList:this.loadBucket('two'+weekOrMonthCap+'sAgo'),
trackingId:trackingId+'.two'+weekOrMonthCap+'sAgo',
moreLink:{url:frontend.link.NewAPage('two'+weekOrMonthCap),
title:'More from 2 '+weekOrMonth+'s ago'}}];
var tabIndex=lala.params.tabIndex||0;
contents[tabIndex].pageIndex=lala.params.pageIndex;
this.carousel=new widgets.core.Carousel(
{renderTargetId:'mainCarousel',
hasTabs:true,
pageTemplate:pageTemplate,
thumbHeight:this.CAROUSEL_THUMB_HEIGHT,
tabIndex:tabIndex,
isExpanded:lala.params.isExpanded=='true',
onStateChange:this.onStateChange.lbind(this),
numRows:2,
numCols:4,
resizeContainerId:$(this.layout.col2).parentNode,
itemRenderFunction:function(itemTemplate,item,trackingId){
var t=$T(pageTemplate);
t.dateFormatString='%un/%ud/%uY';
itemTemplate.replaceToken('itemContent',
t.replaceTokensWithBean('item',item)
.replaceToken('type',item.type=='Album'?'':'('+item.type+')')
.replaceToken('mp3Only',
frontend.isDiscMP3Only(item)?'true':'false')
.replaceToken('clickTrackingId',trackingId)
.compose());
},
contents:contents
});
this.carousel.render();
},

onStateChange:function(){
if(!this.carousel.mojoCarousel)return;
var params={tabIndex:this.carousel.tabIndex,
pageIndex:this.carousel.mojoCarousel.selectedIndex,
isExpanded:this.carousel.mojoCarousel.isExpanded};
MyMusic.g.history.pushInPageEvent(params);
},

renderBigBucket:function(divId,discs,title){
if(discs.total==0){
this.renderEmptyPage('mainCarousel','new releases');
return;
}

var widgetDivId=divId+'Widget';
$T(lt.NewReleases.albumBucket,divId)
.replaceToken('title',title)
.replaceToken('widgetDivId',widgetDivId)
.compose();

var config=this.getAlbumListConfig(widgetDivId,frontend.link.NewAPage('popular'));
new widgets.AlbumList(config).render(discs);
},

loadBucket:function(key){
var self=this;
return function(callback){
api.BrowsePage.getNewReleaseBucket(
{Q:self.getNewReleasesQ(key),
count:self.count,
sortKey:self.sortKey,
sortDir:self.sortDir
},
function(res){
callback(res.data.bucket.list);
});
}
},

getAlbumListConfig:function(divId,moreLink){
return{
layout:'list',
renderTargetId:divId,
toggleId:'albumsViewToggle',
dateFormat:'%un/%ud/%uY',
showNum:true,
evenMoreLink:moreLink,
useReleaseDate:true};
}
};
Object.extend(NewReleasesPage.prototype,Page.prototype,true);
Object.extend(NewReleasesPage.prototype,BrowsePageBase.prototype,false);
MyMusic.addPage('newreleases',function(){return new NewReleasesPage();});

NewReleasesAPage=Class.create();
NewReleasesAPage.prototype={
initialize:function(){
this.initPage({
pageTitle:'New releases',
authLevel:0,
pageId:'NewReleasesAPage',
skelClass:'newReleasesAPage'
});
},

onLoad:function(pathParts){
this.initCommon();
this.initStateFromPath(pathParts);

var linkToPage='NewReleases';
this._setBreadCrumb(linkToPage,'All');

var pageTitle=this.getAPageTitleText(this.headingTitle,linkToPage);
var sortOptions=['releaseDate','mostListens'];
var defSortOrder={key:this.sortKey,dir:this.sortDir};
var histos=['Genre','Subgenre','AlbumType'];

var popularTab={id:'popular',title:'Recent & Popular',
sort:['mostListens'],
defaultSortOrder:{key:this.popularSortKey,dir:this.popularSortDir},
histos:histos
};

var byWeekBuckets=[
{id:'thisWeek',title:'This week',
sort:sortOptions,defaultSortOrder:defSortOrder,histos:histos
},
{id:'lastWeek',title:'Last week',
sort:sortOptions,defaultSortOrder:defSortOrder,histos:histos
},
{id:'twoWeek',title:'2 weeks ago',
sort:sortOptions,defaultSortOrder:defSortOrder,histos:histos
},
popularTab
];
var byMonthBuckets=[
{id:'thisMonth',title:'This month',
sort:sortOptions,defaultSortOrder:defSortOrder,histos:histos
},
{id:'lastMonth',title:'Last month',
sort:sortOptions,defaultSortOrder:defSortOrder,histos:histos
},
{id:'twoMonth',title:'2 months ago',
sort:sortOptions,defaultSortOrder:defSortOrder,histos:histos
},
popularTab
];
var allBucket=[
popularTab
];

var bucket=this.getNewReleaseBucketSize();
this.renderAPage({
title:pageTitle,
pathParts:pathParts,
tabs:bucket=='all'?allBucket
:bucket=='week'?byWeekBuckets:byMonthBuckets
});
},

onLoadAPageThisWeekTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ('thisWeek'),this.getAlbumListConfig());
},

onLoadAPageLastWeekTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ('lastWeek'),this.getAlbumListConfig());
},

onLoadAPageTwoWeekTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ('twoWeeksAgo'),this.getAlbumListConfig());
},

onLoadAPageThisMonthTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ('thisMonth'),this.getAlbumListConfig());
},

onLoadAPageLastMonthTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ('lastMonth'),this.getAlbumListConfig());
},

onLoadAPageTwoMonthTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ('twoMonthsAgo'),this.getAlbumListConfig());
},

onLoadAPagePopularTab:function(){
this.aPageLoadAndRenderAlbums(
this.getNewReleasesQ(),this.getAlbumListConfig());
}
};
Object.extend(NewReleasesAPage.prototype,NewReleasesPage.prototype,true);
Object.extend(NewReleasesAPage.prototype,NewAPage.prototype,true);
MyMusic.addPageRegex('newreleases',/newreleases.*\/more\/.*/,function(){return new NewReleasesAPage();});


BestsellersPage=Class.create();
BestsellersPage.prototype={
initialize:function(){
this.initPageBase('Bestsellers','Bestsellers','bestsellersPage');
this.albumPriceListener_Init(this.onAlbumPriceUpdated.lbind(this));
this.albumCache={};

BestsellersPage.g=this;
},

onLoad:function(pathParts){
this.onLoadBase(pathParts);
},

initCommon:function(){
this.webSortKey='WebAdds';
this.mp3SortKey='Buys';
this.sortDir='Desc';
this.webBucketCount=32;
this.mp3BucketCount=32;
},

loadPage:function(){
var self=this;
this.initCommon();

api.BrowsePage.getBestsellers(
{webBucketQ:this.getBestsellersQ('webAll'),
webBucketCount:this.webBucketCount,
mp3BucketQ:this.getBestsellersQ('mp3All'),
mp3BucketCount:this.mp3BucketCount,
mp3SongQ:this.getBestsellersQ('mp3Song'),
webSongQ:this.getBestsellersQ('webSong'),
songCount:10,
webSortKey:this.webSortKey,
mp3SortKey:this.mp3SortKey,
sortDir:this.sortDir
},
function(res){

self.webAlbums=res.data.webAlbums;
self.mp3Albums=res.data.mp3Albums;
self.mp3Songs=res.data.mp3Songs;
self.webSongs=res.data.webSongs;

self.addToCache(self.webAlbums.list);
self.addToCache(self.mp3Albums.list);

self.renderPage();
});
},

addToCache:function(discs){
var self=this;
discs.leach(function(d){
self.albumCache[d.id]=d;
});
},

renderPage:function(){
this.renderPageBase('Bestsellers');

this.renderWebCarousel();
this.renderMP3Carousel();
this.renderSongs(
'webSongBucket',this.webSongs,
'Top selling web songs','websong');
this.renderSongs(
'mp3SongBucket',this.mp3Songs,
'Top selling MP3s','mp3');
},

renderMP3Carousel:function(){
var self=this;
if(this.subGenre)return;

var trackingId='bestsellers.mp3Carousel';
var contents=[
{tabTitle:'Bestsellers',
trackingId:trackingId+'.all',
moreLink:{url:frontend.link.NewAPage('mp3All'),
title:'More MP3 albums'},
list:this.mp3Albums.list},
{tabTitle:'Under $6',
trackingId:trackingId+'.underSix',
getList:this.loadBucket('mp3Under6'),
moreLink:{url:frontend.link.NewAPage('mp3Under6'),
title:'More under $6'}},
{tabTitle:'Under $7',
trackingId:trackingId+'.underSeven',
getList:this.loadBucket('mp3Under7'),
moreLink:{url:frontend.link.NewAPage('mp3Under7'),
title:'More under $7'}},
{tabTitle:'Under $8',
trackingId:trackingId+'.underEight',
getList:this.loadBucket('mp3Under8'),
moreLink:{url:frontend.link.NewAPage('mp3Under8'),
title:'More under $8'}}
];
var tabIndex=lala.params.mp3TabIndex||0;
contents[tabIndex].pageIndex=lala.params.mp3PageIndex;
this.mp3Carousel=new widgets.core.Carousel(
{renderTargetId:'mp3Carousel',
onStateChange:this.onStateChange.lbind(this),
pageTemplate:lt.Bestsellers.carouselThumb,
thumbHeight:this.CAROUSEL_THUMB_HEIGHT,
resizeContainerId:$(this.layout.col2).parentNode,
isExpanded:lala.params.mp3IsExpanded=='true',
tabIndex:tabIndex,
hasTabs:true,
numCols:4,
numRows:2,
itemRenderFunction:function(itemTemplate,item,trackingId){
self.renderCarouselItem(itemTemplate,item,trackingId,'Mp3');
},
title:'MP3 albums',
contents:contents});
this.mp3Carousel.render();
},

onStateChange:function(){

if(!this.mp3Carousel&&!this.webCarousel)return;

var params={};
if(this.webCarousel&&this.webCarousel.mojoCarousel){
Object.extend(params,
{webTabIndex:this.webCarousel.tabIndex,
webPageIndex:this.webCarousel.mojoCarousel.selectedIndex,
webIsExpanded:this.webCarousel.mojoCarousel.isExpanded});
}

if(this.mp3Carousel&&this.mp3Carousel.mojoCarousel){
Object.extend(params,
{mp3TabIndex:this.mp3Carousel.tabIndex,
mp3PageIndex:this.mp3Carousel.mojoCarousel.selectedIndex,
mp3IsExpanded:this.mp3Carousel.mojoCarousel.isExpanded});
}

MyMusic.g.history.pushInPageEvent(params);
},

loadBucket:function(key){
var self=this;
return function(callback){
var isMp3=key.lstartsWith("mp3");
api.BrowsePage.getBestsellerBucket(
{Q:self.getBestsellersQ(key),
count:isMp3?self.mp3BucketCount:self.webBucketCount,
sortKey:isMp3?self.mp3SortKey:self.webSortKey,
sortDir:self.sortDir
},
function(res){
var discs=res.data.bucket.list;
callback(discs);
self.addToCache(discs);
});
}
},

isOnSubgenreBlacklist:function(){
if(!this.subGenre)return;

var bool=false;
switch(this.genre+'_'+this.subGenre){
case'Easy Listening_Ballroom':
case'Easy Listening_Composer Songbook':
case'Soul_Stax':
case'Soundtrack_Karaoke':
case'Spoken Word_Interview':
bool=true;
break;
default:
bool=false;
break;
}
return bool;
},

renderWebCarousel:function(){
var self=this;
if(this.isOnSubgenreBlacklist()){
$S('webCarousel','');
return;
}

var trackingId='bestsellers.webCarousel';
var contents=[];
contents.push({moreLink:{url:frontend.link.NewAPage('webAll'),
title:'More web albums'},
trackingId:trackingId+'.all',
list:this.webAlbums.list,
tabTitle:'Bestsellers'});
if(!this.subGenre){
contents.push({getList:this.loadBucket('webUnder75'),
moreLink:{url:frontend.link.NewAPage('webUnder75'),
title:'More under 75&cent;'},
trackingId:trackingId+'.under75',
tabTitle:'Under 75&cent;'});
}
var tabIndex=lala.params.webTabIndex||0;
contents[tabIndex].pageIndex=lala.params.webPageIndex;
this.webCarousel=new widgets.core.Carousel(
{contents:contents,
hasTabs:true,
renderTargetId:'webCarousel',
isExpanded:lala.params.webIsExpanded=='true',
onStateChange:this.onStateChange.lbind(this),
tabIndex:tabIndex,
title:'Web albums',
numCols:4,
numRows:2,
pageTemplate:lt.Bestsellers.carouselThumb,
thumbHeight:this.CAROUSEL_THUMB_HEIGHT,
resizeContainerId:$(this.layout.col2).parentNode,
itemRenderFunction:function(itemTemplate,item,trackingId){
self.renderCarouselItem(itemTemplate,item,trackingId,'Web');
}});
this.webCarousel.render();
},

renderCarouselItem:function(itemTemplate,item,trackingId,albumType){
var thumb=$T(lt.Bestsellers.carouselThumb);
var price=0;
if(albumType=='Web'){
if(item.addMissingTracksCount==0){
thumb.removeTokenBlock('PriceBlock');
}else{
thumb.removeTokenBlock('CheckBlock');
price=StoreUtil.getRealWebPrice(item);
}
}else{
if(item.downloadMissingTracksCount==0){
thumb.removeTokenBlock('PriceBlock');
}else{
thumb.removeTokenBlock('CheckBlock');
price=StoreUtil.getRealDownloadPrice(item);
}
}


if(!item.isFreeMp3&&item.downloadMissingTracksCount>0
&&item.downloadMissingTracksPriceInCents==0){
item.isFreeMp3=true;
}
price=(albumType!='Web'&&item.isFreeMp3)?'Free'
:'$'+mojo.util.formatPrice(price);
itemTemplate.replaceToken('itemContent',
thumb
.replaceTokensWithBean('item',item)
.replaceToken('genre',this.isTopLevel?item.genre+' - ':'')
.replaceToken('albumType',albumType)
.replaceToken('price',price)
.replaceToken('mp3Only',
frontend.isDiscMP3Only(item)?'true':'false')
.replaceToken('clickTrackingId',trackingId)
.compose());
},

renderSongs:function(divId,songs,title,buyMode){
if(songs.total==0)return;

var widgetDivId=divId+'Widget';
$T(lt.Bestsellers.songBucket,divId)
.replaceToken('title',title)
.replaceToken('widgetDivId',widgetDivId)
.compose();


var topOffset;
if(mojo.IE6){
topOffset=0;
}else if(mojo.CHROME){
topOffset=-1;
}else if(mojo.MAC&&mojo.FF){
topOffset=-4;
}else if(mojo.IE){
topOffset=-2;
}else{
topOffset=-3;
}

var aPagePath=buyMode=='websong'?'webSong':'mp3Song';
new widgets.SongList({
renderTargetId:widgetDivId,
layout:'simple',
hideDuration:true,
hideNum:true,
hideAlbum:true,
showListens:false,
showPrice:true,
showBuyActions:true,
buyMode:buyMode,
evenMoreLink:frontend.link.NewAPage(aPagePath),
evenMoreText:buyMode=='websong'?'web songs':'MP3 songs',
customFrameClass:'slBestSellers',
hideAddedTransient:true,
offsets:{top:topOffset}
}).render(songs);
},

onBuyWebAlbum:function(discId){
var album=this.albumCache[discId];
widgets.store.openBuyWebAlbumDialog(album,mojo.emptyFunction);
},

onBuyMp3Album:function(discId){
var album=this.albumCache[discId];
widgets.store.openBuyAlbumDownloadDialog(album,mojo.emptyFunction);
},

onAlbumPriceUpdated:function(disc){
var discId=disc.id;
var webPriceArea=$('carousel_Web_'+discId+'_priceArea');
if(webPriceArea){
if(disc.addMissingTracksCount==0){
$S(webPriceArea,$TC(lt.Bestsellers.miniCheck));
}else{
var webPrice=StoreUtil.getRealWebPrice(disc);
$S('carousel_Web_'+discId+'_price','$'+mojo.util.formatPrice(webPrice));
}
}

var mp3PriceArea=$('carousel_Mp3_'+discId+'_priceArea');
if(mp3PriceArea){
if(disc.downloadMissingTracksCount<=0){
$S(mp3PriceArea,$TC(lt.Bestsellers.miniCheck));
}else{
var mp3Price=StoreUtil.getRealDownloadPrice(disc);
mp3Price=disc.isFreeMp3?'Free'
:'$'+mojo.util.formatPrice(mp3Price);
$S('carousel_Mp3_'+discId+'_price',mp3Price);
}
}
},

albumPriceListener_GetAlbumById:function(discId){
return this.albumCache[discId];
}
};
Object.extend(BestsellersPage.prototype,Page.prototype,true);
Object.extend(BestsellersPage.prototype,BrowsePageBase.prototype,true);
Object.extend(BestsellersPage.prototype,AlbumPriceListener,true);
MyMusic.addPage('bestsellers',function(){return new BestsellersPage();});


BestsellersAPage=Class.create();
BestsellersAPage.prototype={
initialize:function(){
this.initPage({
pageTitle:'Bestsellers',
authLevel:0,
pageId:'BestsellersAPage',
skelClass:'bestsellersPage'
});
},

onLoad:function(pathParts){
this.initCommon();
this.initStateFromPath(pathParts);

var linkToPage='Bestsellers';
this._setBreadCrumb(linkToPage,'All');


var webSortOptions=['webBestsellers','mostListens'];
var mp3SortOptions=['mp3Bestsellers','mostListens'];
var songWebSortOptions=['webBestsellers','mostListens','topRated'];
var songMp3SortOptions=['mp3Bestsellers','mostListens','topRated'];
var webSortOrder={key:this.webSortKey,dir:this.sortDir};
var mp3SortOrder={key:this.mp3SortKey,dir:this.sortDir};
var histos=['Genre','Subgenre','AlbumType'];

var webBuckets=[
{id:'webAll',title:'All',
sort:webSortOptions,defaultSortOrder:webSortOrder,histos:histos},
{id:'webUnder75',title:'Under 75&cent;',
sort:webSortOptions,defaultSortOrder:webSortOrder,histos:histos}
];

var mp3Buckets=[
{id:'mp3All',title:'All',
sort:mp3SortOptions,defaultSortOrder:mp3SortOrder,histos:histos},
{id:'mp3Under6',title:'Under $6',
sort:mp3SortOptions,defaultSortOrder:mp3SortOrder,histos:histos},
{id:'mp3Under7',title:'Under $7',
sort:mp3SortOptions,defaultSortOrder:mp3SortOrder,histos:histos},
{id:'mp3Under8',title:'Under $8',
sort:mp3SortOptions,defaultSortOrder:mp3SortOrder,histos:histos}
];

var songBuckets=[
{id:'webSong',title:'Web songs',
sort:songWebSortOptions,defaultSortOrder:webSortOrder,histos:histos},
{id:'mp3Song',title:'MP3 songs',
sort:songMp3SortOptions,defaultSortOrder:mp3SortOrder,histos:histos}
];

var lastPath=pathParts.llast();
var isSong=lastPath=='webSong'||lastPath=='mp3Song';
var isMp3Albums=!isSong&&lastPath.lstartsWith('mp3');

var title='Bestselling ';
if(isSong)title+='songs';
else if(isMp3Albums)title+='MP3 albums';
else title+='web albums';
var pageTitle=this.getAPageTitleText(title,linkToPage);

this.renderAPage({
title:pageTitle,
pathParts:pathParts,
tabs:isSong?songBuckets
:isMp3Albums?mp3Buckets:webBuckets
});
},

onLoadAPageWebAllTab:function(){
this.aPageLoadAndRenderAlbums(
this.getBestsellersQ('webAll'),this._getAlbumListConfig(true));
},

onLoadAPageWebUnder75Tab:function(){
this.aPageLoadAndRenderAlbums(
this.getBestsellersQ('webUnder75'),this._getAlbumListConfig(true));
},

onLoadAPageMp3Under6Tab:function(){
this.aPageLoadAndRenderAlbums(
this.getBestsellersQ('mp3Under6'),this._getAlbumListConfig(false));
},

onLoadAPageMp3Under7Tab:function(){
this.aPageLoadAndRenderAlbums(
this.getBestsellersQ('mp3Under7'),this._getAlbumListConfig(false));
},

onLoadAPageMp3Under8Tab:function(){
this.aPageLoadAndRenderAlbums(
this.getBestsellersQ('mp3Under8'),this._getAlbumListConfig(false));
},

onLoadAPageMp3AllTab:function(){
this.aPageLoadAndRenderAlbums(
this.getBestsellersQ('mp3All'),this._getAlbumListConfig(false));
},

onLoadAPageWebSongTab:function(){
this.aPageLoadAndRenderSongs(
this.getBestsellersQ('webSong'),this._getSongListConfig(true));
},

onLoadAPageMp3SongTab:function(){
this.aPageLoadAndRenderSongs(
this.getBestsellersQ('mp3Song'),this._getSongListConfig(false));
},

_getAlbumListConfig:function(isWeb){
return{
layout:'list',
showWebPrice:isWeb,
showMp3Price:!isWeb,
showNum:true};
},

_getSongListConfig:function(isWeb){
return{
showRatings:true,
hideZeroRating:true,
buyMode:isWeb?'web':'mp3',
showPrice:true,
showListens:'count',
whichListen:'listens7',
hideActions:true,
showBuyActions:true
};
}
};
Object.extend(BestsellersAPage.prototype,BestsellersPage.prototype,true);
Object.extend(BestsellersAPage.prototype,NewAPage.prototype,true);
MyMusic.addPageRegex('bestsellers',/bestsellers.*\/more\/.*/,function(){return new BestsellersAPage();});



PlaylistsPage=Class.create();
PlaylistsPage.prototype={
initialize:function(){
this.initPageBase('Playlists','Playlists','playlistsPage');
PlaylistsPage.g=this;
},

onLoad:function(pathParts){
this.onLoadBase(pathParts);
},

loadPage:function(){
var self=this;
api.Q.searchPlaylists(
{Q:this.getTopBaseQ(),
count:20,
skip:lala.params.skip?parseInt(lala.params.skip):0
},
function(res){
self.playlists=res.data.playlists;
self.renderPage(res);
});
},

renderPage:function(res){
this.renderPageBase(this.isTopLevel?'Top Playlists':'Playlists');
if(this.playlists.total==0){
this.renderEmptyPage('playlistsBucket','playlists');
return;
}
this.renderPlaylists('playlistsBucket',this.playlists,'Popular playlists',res);
},

renderPlaylists:function(divId,playlists,title,res){
if(playlists.total==0)return;

var widgetDivId=divId+'Widget';
$T(lt.Playlists.playlistBucket,divId)
.replaceToken('title',title)
.replaceToken('widgetDivId',widgetDivId)
.compose();

var w=new widgets.PlaylistList({
renderTargetId:widgetDivId,
layout:'wide'
});
w.render(playlists);
this.renderPaginator(widgetDivId,res,playlists);
}
};
Object.extend(PlaylistsPage.prototype,Page.prototype,true);
Object.extend(PlaylistsPage.prototype,BrowsePageBase.prototype,true);
MyMusic.addPage('playlists',function(){return new PlaylistsPage();});

InfluencersPage=Class.create();
InfluencersPage.prototype={
initialize:function(){
this.initPageBase('Influencers','Influencers','influencersPage');
InfluencersPage.g=this;
},

onLoad:function(pathParts){
this.onLoadBase(pathParts);
},

loadPage:function(){
var self=this;

api.BrowsePage.getInfluencers(
{Q:this.getTopBaseQ(),
count:20,
skip:lala.params.skip?parseInt(lala.params.skip):0,
sortKey:'Listens7',
sortDir:'Desc'
},
function(res){
self.influencers=res.data;
self.renderPage(res);
});
},

renderPage:function(res){
this.renderPageBase(this.isTopLevel?'Top Influencers':'Influencers');
if(this.influencers.total==0){
this.renderEmptyPage('influencerBucket','influencers');
return;
}
this.renderInfluencers('influencerBucket',this.influencers,'Top influencers',res);
},

renderInfluencers:function(divId,influencers,title,res){
if(influencers.total==0)return;

var widgetDivId=divId+'Widget';
$T(lt.Influencers.influencerBucket,divId)
.replaceToken('title',title)
.replaceToken('widgetDivId',widgetDivId)
.compose();

var w=new InfluencerListWidget({
layout:'influential',
renderTargetId:widgetDivId,
context:this.isTopLevel?null:this.subGenre?'subgenre':'genre'
});
w.render(influencers);
this.renderPaginator(widgetDivId,res,influencers);
}
};
Object.extend(InfluencersPage.prototype,Page.prototype,true);
Object.extend(InfluencersPage.prototype,BrowsePageBase.prototype,true);
MyMusic.addPage('influencers',function(){return new InfluencersPage();});

ListenersPage=Class.create();
ListenersPage.prototype={
initialize:function(){
this.initPageBase('Listeners','Listeners','listenersPage');
ListenersPage.g=this;
},

onLoad:function(pathParts){
this.onLoadBase(pathParts);
},

loadPage:function(){
var self=this;

api.BrowsePage.getListeners(
{Q:this.getTopBaseQ(),
count:20,
skip:lala.params.skip?parseInt(lala.params.skip):0,
sortKey:this.topSortOrder.key,
sortDir:this.topSortOrder.dir
},
function(res){
self.listeners=res.data;
self.renderPage(res);
});
},

renderPage:function(res){
this.renderPageBase(this.isTopLevel?'Top Listeners':'Listeners');
if(this.listeners.total==0){
this.renderEmptyPage('listenerBucket','listeners');
return;
}
this.renderListeners('listenerBucket',this.listeners,'Top listeners',res);
},

renderListeners:function(divId,listeners,title,res){
if(listeners.total==0)return;

var widgetDivId=divId+'Widget';
$T(lt.Listeners.listenerBucket,divId)
.replaceToken('title',title)
.replaceToken('widgetDivId',widgetDivId)
.compose();

var w=new InfluencerListWidget({
layout:'artistListen',
renderTargetId:widgetDivId,
context:{title:this.subGenre||this.genre||'songs'}
});
w.render(listeners);
this.renderPaginator(widgetDivId,res,listeners);
}
};
Object.extend(ListenersPage.prototype,Page.prototype,true);
Object.extend(ListenersPage.prototype,BrowsePageBase.prototype,true);
MyMusic.addPage('listeners',function(){return new ListenersPage();});




ForumsPage=Class.create();
ForumsPage.prototype={
initialize:function(pageId,isViewThread,specialType){
this.initPage({pageTitle:'Forums',
authLevel:1,
theme:'blackTheme',
pageId:pageId,
skelClass:pageId.toLowerCase()+'Page'});
this.pageId=pageId;
this.isViewThread=isViewThread;
this.specialType=specialType||false;
this.categoriesDivId=null;

ForumsPage.g=this;
},

onLoad:function(pathParts){
if(lala.isTradingEnabled&&!lala.user.isInternal){
if(!lala.isBetaEnabled){
this.renderIntoContentRegion($T(lt.Forums.na));
var elem=$('activeCategoryDesc');
if(elem){
$D(elem,true);
}
return;
}else if(this.pageId=='Feedback'&&!this.specialType){
MyMusic.g.gotoPageViaClick(null,'betafeedback',null,true);
return;
}
}

this.renderSkeleton();

var type;
var categories;
var subtype;
var threadId;
this.categoriesDivId=this.twoColLayout.col2;

var lastPart=pathParts.llast();
var openPost=false;
if(lala.params.openPost=='true'){
openPost=true;
}

if(this.isViewThread){
threadId=lastPart;
}

if(lala.isTradingEnabled&&(this.pageId=='Forums')){
type='Forum';
subtype='MusicMixer';
categories=ForumsPage.categories.TRADER;
}else if(this.pageId=='Feedback'){
categories=ForumsPage.categories.BETA_NEW_SCHOOL;
if(this.specialType&&this.specialType=='betafeedback'){
type='Feedback';
subtype=categories.Beta.subtype;
}else{
type='Feedback';
subtype=categories.Feedback.subtype;
}
if(!lala.isBetaEnabled){
this.categoriesDivId=null;
}
}else if(this.pageId=='MusicMixer'){
type='Forum';
subtype='MusicMixer';
categories=ForumsPage.categories.TRADER;
}else if(this.pageId=='Bugs'){
type='Forum';
subtype='Bugs';
categories=ForumsPage.categories.TRADER;
}


this.forum=widgets.Forum.create('forumblog',type,
this.twoColLayout.col1,'',
categories);
var self=this;
this.forum.onrenderdone=function(skippedSome){

if(self.pageId=='Feedback'&&openPost&&!skippedSome){
widgets.Forum.all.forumblog.toggleAddEntry(true);
}
}
this.forum.subtype=subtype;
this.forum.loadAndRender(threadId);
this.forum.renderCategories(this.categoriesDivId);

return true;
},

isTradingOnly:function(){
return this.pageId=='Forums'
||this.pageId=='MusicMixer'||this.pageId=='Bugs';
},

setSearchMode:function(){

},

renderSkeleton:function(){
this.twoColLayout=new widgets.core.TwoColumn();

var t=$T(lt.Forums.skeleton)
.replaceToken('twoColLayout',this.twoColLayout.render())
.compose();
this.renderIntoContentRegion(t);
}
};
Object.extend(ForumsPage.prototype,Page.prototype,true);
MyMusic.addPage('trade/forums',function(){return new ForumsPage('Forums');});
MyMusic.addPage('trade/forums/thread',function(){return new ForumsPage('Forums',true);});
MyMusic.addPage('trade/forums/musicmixer',function(){return new ForumsPage('MusicMixer');});
MyMusic.addPage('trade/forums/bugs',function(){return new ForumsPage('Bugs');});
MyMusic.addPage('feedback',function(){return new ForumsPage('Feedback');});
MyMusic.addPageRegex('feedback',/feedback\/.*/,function(){return new ForumsPage('Feedback',true);});
MyMusic.addPage('betafeedback',function(){return new ForumsPage('Feedback',null,'betafeedback');});
MyMusic.addPageRegex('betafeedback',/betafeedback\/.*/,function(){return new ForumsPage('Feedback',true,'betafeedback');});
MyMusic.addPage('traderfeedback',function(){return new ForumsPage('Feedback',null,'traderfeedback');});
MyMusic.addPageRegex('traderfeedback',/traderfeedback\/.*/,function(){return new ForumsPage('Feedback',true,'traderfeedback');});
MyMusic.addPage('insiderforum',function(){return new ForumsPage('Feedback',null,'insider');});
MyMusic.addPageRegex('insiderforum',/insiderforum\/.*/,function(){return new ForumsPage('Feedback',true,'insider');});

ForumsPage.categories={
BETA_NEW_SCHOOL:{
Feedback:{
'displayName':'General Feedback',
'type':'Feedback',
'subtype':'NewSchool',
'canSearch':true,
'isBeta':true,
'showCommunityPolicy':true,
'description':"<div>Thanks for using Lala!  Please post here if you have general feedback or comments for us about the site or service.  If you have a bug to report or a specific problem that needs attention, please <a class=\"lcallactionlink\" #link:ContactSupport()>contact support</a>.</div>"
},
Beta:{
'displayName':'Beta Feedback',
'type':'Feedback',
'subtype':'Beta',
'canSearch':true,
'isBeta':true,
'showCommunityPolicy':true,
'description':"<div>Thank you for participating in the Beta program!  Please share your thoughts on the features that are currently in beta testing. What do you like and what would you change?</div>"
}
},
BETA_OLD_SCHOOL:{
Feedback:{
'displayName':'Feedback Board',
'type':'Feedback',
'subtype':'OldSchool',
'canSearch':true,
'isBeta':true,
'showCommunityPolicy':true,
'description':"<div>Thanks for using Lala!  Please post here if you have general feedback or comments for us about the site or service.  If you have a bug to report or a specific problem that needs attention, please <a class=\"lcallactionlink\" #link:ContactSupport()>contact support</a>.</div>"
}
},
INSIDER:{
Feedback:{
'displayName':'Insider Forum',
'type':'Feedback',
'subtype':'Insider',
'canSearch':true,
'isBeta':true,
'showCommunityPolicy':true,
'description':"<div>Thanks for trying the Lala site as an insider.  Post your feedback and ideas here. If you have a bug to report or a specific problem that needs attention, please <a class=\"lcallactionlink\" #link:ContactSupport()>contact support</a>.</div>"
}
},
TRADER:{
MusicMixer:{
'displayName':'Music Mixer',
'type':'Forum',
'subtype':'MusicMixer',
'canSearch':true,
'showCommunityPolicy':true,
'description':"<div>Post your trading, music, and lala.com questions here. Let's see recommendations, concert reviews, why your favorite band should rule the world, questions about how trading on lala.com works or even your experience with trading music. New to lala.com? Have general questions?  You can post it all right here.</div>"
},
Bugs:{
'displayName':'Bugs',
'type':'Forum',
'subtype':'Bugs',
'canSearch':true,
'showCommunityPolicy':true,
'description':"Post here to discuss site-related bugs or quirks. Individual problems, catalog omissions or inaccuracies, and trade-related issues should be reported via the support form as we cannot guarantee a response to posts to this category."
},
FAQ:{
'displayName':'FAQ',
'type':'FAQ',
'subtype':null,
'canUserReadBit':'isInternal',
'canSearch':false,
'hideCount':true,
'description':"This is the internal FAQ list for editing when needed.  It will not be displayed publicly."
},
Help:{
'displayName':'Help',
'type':'Help',
'subtype':null,
'canUserReadBit':'isInternal',
'canSearch':true,
'hideCount':true,
'description':"This is the internal Help list for editing when needed.  It will not be displayed publicly.",
'customFields':['Title:S','Body:L']
},
Moderator:{
'displayName':'Moderators',
'type':'PrivateForum',
'subtype':'Moderator',
'hideCount':true,
'canSearch':true,
'canUserReadBit':'isForumModerator',
'description':"Moderators forum."
},
RandomVille:{
'displayName':'RiskyVille',
'type':'Forum',
'subtype':'RandomVille',
'isLast':true,
'canSearch':false,
'canUserReadBit':'isForumModerator',
'description':"This category may contain Adult &quot;R&quot; rated content but still needs to follow the Community Policy guidelines.  The content posted here will not show up as part of the Active Posts."
},
InternalOnly:{
'displayName':'EMPLOYEES ONLY',
'type':'InternalOnly',
'subtype':null,
'canSearch':false,
'hideCount':true,
'canUserWriteBit':'isInternal',
'canUserReadBit':'isInternal',
'description':"Discussion for employees only."
}
}
};





widgets.Forum={};
widgets.Forum.all={};

widgets.Forum.PAGE_SIZE=20;
widgets.Forum.ACTIVE_STYLE='selectedLink';




widgets.Forum.create=function(id,type,divId,title,categoryConfig){
mojo.assert(id,"forum widget requires an id to be specified");

widget=new ForumWidget(id,type,divId,title,categoryConfig);
widgets.Forum.all[id]=widget;

return widget;
};





ForumWidget=function(id,type,divId,title,categoryConfig){
this.req=null;
this.id=id;
this.contentId='forumBodyDiv'+this.id;
this.divId=divId;
this.initSkeleton=true;

this.categoryConfig=categoryConfig;
this.categoriesPod=null;


this.onusercancreatethread=null;


this.defaultType=type;
this.displayCommentsInPage=true;
this.clipText=0;
this.count=widgets.Forum.PAGE_SIZE;
this.paging=true;
this.displayHeading=true;
this.type=this.defaultType;
this.subtype=null;
this.title=title;
this.src=null;
this.dst=null;
this.threadCreateSrc=null;
this.threadCreateDst=null;
this.onrenderdone=mojo.emptyFunction;
this.paginatorId="forumsPaginatorTop";

this.entryAddId='forumAddEntryContainer'+this.id;
this.entrySubjectId='forumEntrySubject'+this.id;
this.entryTextId='memberTextArea'+this.id;
this.linkShowMineId='forumShowMineLink'+this.id;
this.linkCommunityPolicyId='forumCommunityPolicyLink'+this.id;
this.linkCreateEntryId='forumCreateEntryLink'+this.id;
};

ForumWidget.READ_ONLY="You have restricted access and are only allowed to read forum posts.";




ForumWidget.prototype={
loadAndRender:function(threadId){
var self=this;
var onresponse=function(res){


if((res.data.total>0&&threadId)||!(threadId)){

self.render();
}else{

self.loadAndRender();
}
};

if(threadId){
this.subject=threadId;
}
this.load(onresponse);
},

load:function(onresponse){
var self=this;
var onRes=function(res){
self.res=res;
if(onresponse)onresponse(res);
};
api.Messaging.getThreads({
src:this.src,
dst:this.dst,
type:this.type,
subtype:this.subtype,
subject:this.subject,
count:15,
onResponse:onRes});
},

setSearchMode:function(){
var self=this;
var type=this.type=='Forum'?this.subtype:
this.type=='PrivateForum'?'Moderator':this.type;
var sbox=HeaderSearchBox.g;
var fconfig=this.categoryConfig[type];
if(!fconfig.canSearch){
sbox.setMode('lala');
return;
}

sbox.setCustomMode(
new HeaderSearchBoxMode({
displayName:'Search '+fconfig.displayName,
clearIconEnabled:true,
onSearch:function(text){
self.runSearch(text);
}}));
},





runSearch:function(keywords){


this.unselectCategoryUI();

this.subject=keywords;
this.loadAndRender();
},

toggleAddEntry:function(forceOpen){
if(frontend.requiresSignin())return;
if(lala.user&&lala.user.isForumReadOnly){
lala.showAck(ForumWidget.READ_ONLY);
return;
}

var addDiv=$(this.entryAddId);
var config=this.getCategoryConfig();

if(addDiv.style.display!='none'){
if(!forceOpen){
mojo.css.display(addDiv,false);
$(this.linkCreateEntryId).innerHTML=(config.isBeta&&(config.subtype!='Insider'))
?'Post Feedback':'Create post';
}
}else{
$(this.linkCreateEntryId).innerHTML='Close form';

if(config.customFields){
mojo.css.displayToggle(['customAddEntryFields','addEntryMemberTextDiv']);
var t=this.renderCustomFields('addCustomField',null,true);

mojo.setContent('customAddEntryFields',t.compose());
}else{
mojo.css.displayToggle(['addEntryMemberTextDiv','customAddEntryFields']);
}
mojo.css.display(addDiv,true);
this.onOpenLinksTextArea('memberTextEntryTable_addEntry','create');
mojo.focus(this.entrySubjectId);
}
},

submitAddEntry:function(text){
if(lala.user&&lala.user.isForumReadOnly){

lala.showAck(ForumWidget.READ_ONLY);
return;
}
var me=this;
var sub=$F(this.entrySubjectId);
if(mojo.isEmpty(sub))return;

if(mojo.isEmpty(text))text=' ';

var config=this.getCategoryConfig();
if(config.customFields){
text=api.Messaging.joinFieldsFromText(config,'addCustomField');
}

var onresponse=function(res){
$(me.entrySubjectId).value='';

me.toggleAddEntry();
me.loadAndRender();
};

var theSrc=
this.threadCreateSrc?this.threadCreateSrc:lala.user.userToken;

var dosubmit=function(){
var atype=me.type;
var asubtype=me.subtype;
if(me.isCategoryType()){
atype=me.subtype;
asubtype=null;
}
api.Messaging.createThread({
src:theSrc,
dst:me.threadCreateDst,
generateLinks:true,
type:atype,
subtype:asubtype,
text:text,
subject:sub,
onResponse:onresponse});
};
dosubmit();
},

isShowingViewingUserThreads:function(){
return(lala.user&&this.src==lala.user.userToken);
},




toggleShowOnlyMine:function(){
if(frontend.requiresSignin())return;

if(this.src)this.src=null;
else this.src=lala.user.userToken;
mojo.setContent(
this.linkShowMineId,
this.isShowingViewingUserThreads()?strings.Forum.showAll:strings.Forum.showMine);

this.loadAndRender();
},

openAddComment:function(threadToken){
if(frontend.requiresSignin())return;
if(lala.user&&lala.user.isForumReadOnly){
lala.showAck(ForumWidget.READ_ONLY);
return;
}
this.onOpenLinksTextArea('memberTextEntryTable_addComment_'+threadToken,'reply',{threadToken:threadToken});
},

submitAddComment:function(text,context,linksTextArea){
if(frontend.requiresSignin())return;
if(mojo.isEmpty(text))return;
if(lala.user&&lala.user.isForumReadOnly){

lala.showAck(ForumWidget.READ_ONLY);
return;
}

var me=this;
var onresponse=function(res){
if(res.data.isLocked){
alert("This post has been closed to new comments");
me.loadAndRender();
}else{
linksTextArea.onClose();
me.getComments(context.threadToken);
}
};

api.Messaging.addReply({threadToken:context.threadToken,generateLinks:true,text:text,onResponse:onresponse});
},

getComments:function(threadToken,toggle,shouldScroll){
var div=$('forumEntryCommentsContainer'+threadToken);
if(toggle&&div.style.display!='none'){
mojo.css.display(div,false);
mojo.css.display('forumEntryBar'+threadToken,false);
mojo.css.display('collapseThread'+threadToken,false);
if(shouldScroll){
mojo.geometry.scrollIntoView('forumEntryDiv'+threadToken,document.body.parentNode,-100);
}
return;
}

var me=this;
var thread=this.res.data.threadsByToken[threadToken];

var onresponse=function(res){
thread.replies=res.data.list;
thread.repliesByToken={};
if(res.data.total>0){
for(var i=0;i<thread.replies.length;++i){
var msg=thread.replies[i];
thread.repliesByToken[msg.msgToken]=msg;
}
}
me.renderComments(threadToken);
};
api.Messaging.getReplies({threadToken:threadToken,onResponse:onresponse});
},

deleteComment:function(threadToken,msgToken){
if(frontend.requiresSignin())return;
if(!confirm(strings.Forum.deleteComment))return;

var me=this;
var onresponse=function(res){
me.getComments(threadToken);
};
api.Messaging.deleteReply({msgToken:msgToken,onResponse:onresponse});
},

deleteThread:function(threadToken){
if(frontend.requiresSignin())return;
if(!confirm(strings.Forum.deletePost))return;

var me=this;
var onresponse=function(res){
me.loadAndRender();
};
api.Messaging.deleteThread({threadToken:threadToken,onResponse:onresponse});
},

moveThread:function(threadToken){
var select=$('subtypeSelect'+threadToken);
var subtype=select.options[select.selectedIndex];
if(subtype.value=='')
return;
this.moderateThread(threadToken,subtype.value);
},

moderateThread:function(threadToken,subtype){
if(frontend.requiresSignin())return;
var me=this;
var onresponse=function(res){
if(res.data)me.loadAndRender();
}
if(!confirm("Do you want to move this thread to "+subtype+"? ")){
return;
}
api.Messaging.moderateThread({threadToken:threadToken,
subtype:subtype,
onResponse:onresponse});
},

stickThread:function(threadToken){
if(frontend.requiresSignin())return;
var me=this;
var onresponse=function(res){
if(res.data)me.loadAndRender();
}
var entry=this.res.data.threadsByToken[threadToken];
if(!confirm(entry.isSticky?
"Are you sure you want to unstick this thread?":
"Are you sure you want to make this thread sticky?")){
return;
}
api.Messaging.stickThread({threadToken:threadToken,
onoff:entry.isSticky?'false':'true',
onResponse:onresponse});
},

lockThread:function(threadToken){
if(frontend.requiresSignin())return;
var me=this;
var onresponse=function(res){
if(res.data)me.loadAndRender();
}
var entry=this.res.data.threadsByToken[threadToken];
if(!confirm(entry.isLocked?
"Are you sure you want to unlock this thread?":
"Are you sure you want to lock this thread?")){
return;
}
api.Messaging.lockThread({threadToken:threadToken,
onoff:entry.isLocked?'false':'true',
onResponse:onresponse});
},

onOpenLinksTextArea:function(boxId,type,context){
if(frontend.requiresSignin())return;

var onSubmit=null;
var onClose=null;
var onEmptySubmit=null;
context=context||{};
switch(type){
case'create':
onSubmit=this.submitAddEntry.lbind(this);
onClose=this.toggleAddEntry.lbind(this);
break;
case'reply':
onSubmit=this.submitAddComment.lbind(this);
break;
case'editThread':
onSubmit=this.updateThread.lbind(this);
onClose=this.cancelEditThread.lbind(this);
break;
case'editComment':
onSubmit=this.updateComment.lbind(this);
onClose=this.cancelEditComment.lbind(this);
onEmptySubmit=this.updateComment.lbind(this);
break;
}

new widgets.LinksTextArea(
{renderTargetId:boxId,
onSubmitCallback:onSubmit,
onCloseCallback:onClose,
onEmptySubmitCallback:onEmptySubmit,
context:context})
.open(context.defaultText);
},

renderCustomFields:function(fieldPrefix,entry,removeSubjectField){
var t=mojo.template.create(g_forumCustomEditEntryDialog);
if(removeSubjectField)t.removeTokenBlock('SubjectBlock');

var fieldBlock=t.getTokenBlock('CustomFieldBlock');
var fields=entry?api.Messaging.parseFieldsFromText(entry,true):{};
this.getCategoryConfig().customFields.leach(function(str){
var split=str.split(':');
var id=split[0];
var size='Long';
if(split.length==2){
size=split[1]=='L'?'Long':'Short';
}

fieldBlock.replaceToken('customFieldId',id);
fieldBlock.replaceToken('customFieldVal',fields[id]);
fieldBlock.replaceToken('Size',size);
fieldBlock.replaceToken('fieldPrefix',fieldPrefix);
fieldBlock.next();
});
return t;
},

renderEditThreadButtons:function(t,entry){
var buttonBlock=t.getTokenBlock('ButtonBlock');
buttonBlock.replaceToken("buttonId",'editEntryUpdate');
buttonBlock.replaceToken("buttonCallback",
"widgets.Forum.all."+this.id+
".updateThread('"+entry.msgToken+"');");
buttonBlock.replaceToken('buttonValue','Update');
buttonBlock.next();

buttonBlock.replaceToken("buttonCallback",
"widgets.Forum.all."+this.id+
".cancelEditThread('"+entry.msgToken+"');");
buttonBlock.replaceToken('buttonValue','Cancel');
buttonBlock.next();
},

feedAtom:function(threadToken){
var entry=this.res.data.threadsByToken[threadToken];
var feedUrl='';
return lala.gotoPage.url(feedUrl);
},

openEditThreadDialog:function(threadToken){
if(frontend.requiresSignin())return;

var t=$T(g_forumEditEntryDialog);
var entry=this.res.data.threadsByToken[threadToken];
var config=this.getCategoryConfig();
var useRegularTextArea=true;

if(config.customFields&&!entry.subject.lstartsWith('config_helpPage')){


useRegularTextArea=false;
t=this.renderCustomFields('customEditField',entry);
this.renderEditThreadButtons(t,entry);
}

t.replaceTokensWithBean('entry',entry);
t.replaceToken('wiid',this.id);
var d=new MojoDialog({
id:'editForumEntryDialog',
title:"Edit Entry"
});

if(useRegularTextArea){
d.onOpen=function(){
ForumsPage.g.forum.onOpenLinksTextArea(
'memberTextEntryTable_editEntry_'+entry.msgToken,
'editThread',
{defaultText:entry.origText,
threadToken:threadToken});
}
}
d.open(t.compose());
},

cancelEditThread:function(){
MojoDialog.close();
},

openEditCommentDialog:function(threadToken,msgToken){
if(frontend.requiresSignin())return;
var entry=this.res.data.threadsByToken[threadToken];
var comment=entry.repliesByToken[msgToken];
comment.threadToken=threadToken;
var t=$T(g_forumEditCommentDialog);
t.replaceTokensWithBean('comment',comment);
t.replaceToken('wiid',this.id);

var d=new MojoDialog({
id:'editForumCommentDialog',
title:'Edit Comment'
});
d.onOpen=function(){
ForumsPage.g.forum.onOpenLinksTextArea(
'memberTextEntryTable_editComment_'+comment.msgToken,
'editComment',
{defaultText:comment.origText,
msgToken:comment.msgToken,
threadToken:comment.threadToken});
}
d.open(t.compose());
},

cancelEditComment:function(){
MojoDialog.close();
},

updateThread:function(newText,context,linksTextArea){
var threadToken=context.threadToken;
var entry=this.res.data.threadsByToken[threadToken];
var subject=$F('editEntrySubject');
var text=null;

var config=this.getCategoryConfig();
if(!config.customFields||entry.subject.lstartsWith('config_helpPage')){
text=newText;
}else{
text=api.Messaging.joinFieldsFromText(config,'customEditField');
}

if(text==entry.origText&&subject==entry.origSubject){
this.cancelEditThread();
return;
}

if(subject==""){
lala.showAck("The subject text cannot be left blank.<br>"+
"If you would like to delete this post, "+
"close this window and click on the delete icon.");
linksTextArea.submitButton.disabled=false;
}else{
var onResponse=function(res){
entry.subject=res.data.subject;
entry.origSubject=res.data.origSubject;
entry.text=res.data.text;
entry.origText=res.data.origText;
mojo.setContent('entryText'+threadToken,entry.text);
mojo.setContent('entrySubject'+threadToken,entry.subject);
MojoDialog.close();
};
api.Messaging.updateThread({threadToken:threadToken,
subject:subject,
generateLinks:true,
text:text,
onResponse:onResponse});
}
},

updateComment:function(newText,context){
var threadToken=context.threadToken;
var msgToken=context.msgToken;
var entry=this.res.data.threadsByToken[threadToken];
var comment=entry.repliesByToken[msgToken];

if(newText==comment.origText){
this.cancelEditComment();
return;
}

if(newText==""){
lala.showAck("The comment text cannot be left blank.<br>"+
"If you would like to delete this comment, "+
"close this window and click on the delete icon.");
}else{
var onResponse=function(res){
comment.text=res.data.text;
comment.origText=res.data.origText;
mojo.setContent('commentText'+msgToken,comment.text);
MojoDialog.close();
};
api.Messaging.updateReply({msgToken:msgToken,
generateLinks:true,
text:newText,
onResponse:onResponse});
}
},

unselectCategoryUI:function(){
var oldstype=this.subtype||'';
var oldcat=$('forumCat_'+this.type+oldstype);
if(oldcat){
oldcat.className=oldcat.className.replace(widgets.Forum.ACTIVE_STYLE,'');
}
mojo.css.display(this.entryAddId,false);
$('forumEntrySubject'+this.id).value='';
},

selectCategory:function(newtype,newsubtype,noReqLoad){
if(newtype=='Feedback'){
if(newsubtype=='NewSchool'){
MyMusic.g.gotoPageViaClick(null,'feedback',null,true);
return;
}else if(newsubtype=='Beta'){
MyMusic.g.gotoPageViaClick(null,'betafeedback',null,true);
return;
}
}




if(!newtype)newtype=this.defaultType;
this.unselectCategoryUI();

if(newsubtype!=this.subtype){
mojo.setContent(this.linkShowMineId,strings.Forum.showMine);
}

this.type=newtype||null;
this.subtype=newsubtype||null;

this.src=null;
this.subject=null;
this.pageCursor=0;
if(newsubtype.toLowerCase()=='musicmixer'){
frontend.go.Forums('musicmixer');
}else if(newsubtype.toLowerCase()=='bugs'){
frontend.go.Forums('bugs');
}else{


var newcat=$('forumCat_'+newtype+newsubtype);
newcat.className+=' '+widgets.Forum.ACTIVE_STYLE;
if(!noReqLoad){
this.loadAndRender();
}
this.setSearchMode();
$(this.linkCreateEntryId).innerHTML=this.getCategoryConfig().isBeta
?'Post Feedback':'Create Post';
}
},






render:function(){

if(this.initSkeleton){
this.initSkeleton=false;
this.renderSkeleton();
}

var entries=this.res.data.list;
if(entries==null||entries.length==0){
$S('forumsPaginatorTop','');
$S('forumsPaginatorBottom','');
if(this.displayHeading){
if(!this.subject){

$S('forumDesc'+this.id,
this.getCategoryDescription(this.type,this.subtype));
$S(this.contentId,'<br>No entries.');
}else{

$S('forumDesc'+this.id,
this.getCategoryDescription(this.type,this.subtype));
$S(this.contentId,"No posts match your search criteria. "+
"<a class='lcallactionlink' href='javascript:void 0' onclick='HeaderSearchBox.g.onClearSearch()'>Click here</a>"+
" to clear your search and start over.");
}
mojo.css.display('forumDesc'+this.id,true);
}
}else{


if(this.displayHeading){

if(this.subject&&this.subject.match(/^[0-9]+H[0-9]+$/)){
var thread=this.res.data.list[0];
this.type=thread.type;
this.subtype=thread.subtype;
mojo.setContent(
'forumDesc'+this.id,
this.getCategoryDescription(thread.type,thread.subtype));
this.getComments(this.subject);

}else{
mojo.setContent(
'forumDesc'+this.id,
this.getCategoryDescription(this.type,this.subtype));
}
mojo.css.display('forumDesc'+this.id,true);
}

this.renderEntries();
}



ForumsPage.g.forum.renderCategories(ForumsPage.g.categoriesDivId);

this.renderTitleRegion();

if(!this.paginator){
this.paginator=new widgets.core.Paginator('forumsPaginatorTop',
'lite','forumsPaginatorBottom','big');
}
this.paginator.renderTwo(this.res);
this.onrenderdone(this.paginator._pagedOnce);
},

renderTitleRegion:function(){
var elem=$('forumTitle'+this.id);
if(!elem)return;

mojo.setContent(elem,this.getTitle());


var config=this.getCategoryConfig();

var isSubtype=this.subtype!=null;
if(!isSubtype)mojo.css.display(this.entryAddId,false);
mojo.css.visibility(this.linkCreateEntryId,isSubtype);
mojo.css.visibility(this.linkShowMineId,isSubtype);
mojo.css.visibility(this.linkCommunityPolicyId,
config.showCommunityPolicy&&isSubtype);




if(config.isBeta&&(config.subtype!='Insider')){
$(this.linkCreateEntryId).innerHTML='Post Feedback';
}
var canSearch=true;
if(mojo.isDefined(config.canSearch)){
canSearch=config.canSearch;
}

var canWrite=true;
if(mojo.isDefined(config.canWrite)){
canWrite=config.canWrite;
}else if(config.canUserWriteBit){


if(!lala.user||!lala.user[config.canUserWriteBit]){
canWrite=false;
}
}
mojo.css.visibility(this.linkCreateEntryId,canWrite);
mojo.css.display('forumCommunityPolicyLinkSep'+this.id,config.isBeta,'inline');
if(this.res.subject){
mojo.css.visibility(this.linkCreateEntryId,false);
mojo.css.visibility(this.linkShowMineId,false);
mojo.css.visibility(this.linkCommunityPolicyId,false);
}


if(this.onusercancreatethread){
var show=this.onusercancreatethread(this.subtype);
if(mojo.isDefined(show)){
mojo.css.visibility(this.linkCreateEntryId,show);
}
}
},

renderEntries:function(){
var entries=this.res.data.threads;
var t=mojo.template.create(g_forumBody,this.contentId);
var et=mojo.template.create(g_forumEntry);
et.dateFormatString="%m/%d/%Y %l:%M %P";

for(var i=0;i<entries.length;i++){
var entry=entries[i];
if(lala.user&&lala.user.isInternal&&entry.params){
var mr=et.getTokenBlock('ModeratorRow');
var moderatorToken="";
var moderatorName="";

if(entry.params.moderatorToken){
moderatorToken=entry.params.moderatorToken;
moderatorName=entry.params.moderator;
}else{
moderatorToken=entry.params.moderator;
moderatorName="moderator";
}
mr.replaceToken('moderatorRowText',
$TC("Moved from "+entry.params.origSubtype+
" by <a class='moderatorLink' "+frontend.link.Member(moderatorToken)+
">"+moderatorName+"</a>"));
}else{
et.removeTokenBlock('ModeratorRow');
}
et.keepTokenBlock('NotWebkit',!mojo.WEBKIT);
et.replaceToken('nonPreview','');
et.replaceToken('inPage','');
et.replaceToken('nickNameClassName',frontend.getMemberClassName(entry.src));
et.replaceToken('subtype',this.subtype);
et.replaceTokensWithBean('entry',entry);
if(this.clipText!=0){
var origText=entry.origText;
var len=origText.length;
origText=origText.clip(this.clipText,'');
origText=origText.lescapeHTML(true);
origText=origText.replace(/\[\[([^\]]*?)$/,'');
origText=api.Messaging.replacelalalinks(origText);
if(len>=this.clipText)entry.text=origText+'...';
}
et.replaceToken('entryText',entry.text);
if(i==0)et.replaceToken('firstEntry','firstEntry');
et.replaceToken("bubbleVisibility",entry.count>0?'':'hidden');
et.removeTokenBlock(entry.isLocked?"NotLocked":"Locked");
et.replaceToken('wiid',this.id);
if(entries.length<=1&&this.type!="Feedback"){
et.replaceToken('displayCategory',
this.getCategoryDisplayName(entry.type,
entry.subtype));
entry.subtype=entry.subtype?entry.subtype:'';
et.replaceToken('categoryHref','href="javascript:widgets.Forum.all.'+
this.id+'.selectCategory(\''+
entry.type+'\', \''+
entry.subtype+'\');"');
}
et.replaceTokensWithBean('user',entry.src);


var permalink;
var permalinkTooltip='Click here for permalink';

switch(entry.type){
case'InternalOnly':
case'FAQ':
case'Forum':
case'PrivateForum':
case'WhatsNew':
permalink=frontend.link.ForumThread(entry.msgToken);
break;
case'Feedback':
permalink=frontend.link.FeedbackThread(entry.msgToken);
break;
default:
permalink='href="javascript: void 0;"';
permalinkTooltip='';
};
et.replaceToken('permalink',permalink);
et.replaceToken('permalinkTooltip',permalinkTooltip);
et.replaceToken('canDelete',entry.canDelete?'':'none');
et.replaceToken('canEdit',entry.canEdit?'':'none');



var subtypes=[];
for(var k=0;k<entry.canModerate.length;k++){
var subtype=entry.canModerate[k];
if(subtype!=entry.subtype&&this.categoryConfig[subtype])
subtypes.push(subtype);
}
if(subtypes.length>0){
et.replaceToken('canModerate','');
var etb=et.getTokenBlock('TargetSubtypeBlock');
for(var si=0;si<subtypes.length;si++){
etb.replaceToken('subtype',subtypes[si]);
etb.next();
}
}else{
et.replaceToken('canModerate','none');
et.removeTokenBlock('TargetSubtypeBlock');
}
if(mojo.isDefined(entry.params)&&this.subtype=="RandomVille"){
et.replaceToken('subtypeDestination',
"Move back to "+
this.categoryConfig[entry.params.origSubtype].displayName);
}else if(this.categoryConfig.RandomVille){
et.replaceToken('subtypeDestination',"Move to "+
this.categoryConfig["RandomVille"].displayName);
}
et.replaceToken('moveMoveback',entry.isModerated?'moveback':'move');

et.replaceToken('canStick',entry.canStick?'':'none');
et.replaceToken('stickyPost',entry.isSticky?'stickyPost':'');
et.replaceToken('stickyTime',entry.isSticky?'lhidden':'');


et.replaceToken('canLock',entry.canLock?'':'none');
et.replaceToken('lockedPost',entry.isLocked?'lockedPost':'');

et.next();
}
t.replaceToken('forumEntries',et.compose());

t.replaceToken('forumRssHref','href="javascript:void 0;"');
t.compose();
},

renderComments:function(threadToken){
var thread=this.res.data.threadsByToken[threadToken];


mojo.setContent('forumEntryCommentsCount'+threadToken,
thread.replies.length+' comments');

if(thread.replies.length>0){
thread.lastModTime=thread.replies[thread.replies.length-1].lastModTime.lformat("%m/%d/%Y %l:%M %P");
mojo.setContent('lastModTimeTop'+threadToken,thread.lastModTime);
$('lastModTimeTop'+threadToken).title=
thread.replies[thread.replies.length-1].src.nickName;
mojo.css.removeClass('updatedTime'+threadToken,'lhidden');
mojo.css.display('collapseThread'+threadToken,true,'inline');
}


var div='forumEntryCommentsContainer'+thread.msgToken;
if(thread.replies.length<=0){
mojo.css.display(div,false);
mojo.css.display($('forumEntryBar'+threadToken),false);
return;
}

var t=mojo.template.create(g_forumComment,div);
t.setEmptyTokenText("&nbsp;");
t.dateFormatString="%m/%d/%Y %l:%M %P";

mojo.css.display(div,true);
mojo.css.display($('forumEntryBar'+threadToken),true);
for(var i=0;i<thread.replies.length;i++){
var reply=thread.replies[i];
t.replaceToken('nickNameClassName',frontend.getMemberClassName(reply.src));
t.replaceTokensWithBean('comment',reply);
t.replaceTokensWithBean('thread',thread);
t.replaceToken('wiid',this.id);
t.replaceToken('oddEven',i%2==0?'commentBlockEven'
:'commentBlockOdd');
t.replaceToken('canDelete',(!thread.isLocked&&reply.canDelete)?'':'none');
t.replaceToken('canEdit',(!thread.isLocked&&reply.canEdit)?'':'none');
t.next();
}
t.compose();


thread.count=thread.replies.length;
},

renderSkeleton:function(){
if(!$(this.divId))return;

var t=mojo.template.create(g_forumSkeleton,this.divId);
if(!this.displayHeading)t.removeTokenBlock('HeadingBlock');

t.replaceToken('title',this.getTitle());
t.replaceToken('wiid',this.id);
t.compose();
},

renderCreateButtons:function(t){
var buttonBlock=t.getTokenBlock('ButtonBlock');
buttonBlock.replaceToken("buttonCallback","widgets.Forum.all."+this.id+
".submitAddEntry(this);");
buttonBlock.replaceToken('buttonValue','Post Entry');
buttonBlock.next();
buttonBlock.replaceToken("buttonCallback","widgets.Forum.all."+this.id+
".toggleAddEntry();");
buttonBlock.replaceToken('buttonValue','Cancel');
buttonBlock.next();
},





renderCategories:function(divId){
if(!divId)return;

var ct=$T(g_forumCategoriesPodTemplate,divId);
for(var key in this.categoryConfig){
var catConfig=this.categoryConfig[key];


if(catConfig.canUserReadBit){


if(!lala.user||!lala.user[catConfig.canUserReadBit]){
continue;
}
}


ct.replaceTokensWithBean('category',catConfig);
ct.replaceToken('wiid',this.id);


if(catConfig.isLast){
ct.replaceToken('lastLink','podSideLastLink');
}


if(this.type==catConfig.type&&
this.subtype==catConfig.subtype&&
!(this.req&&this.res.subject)){
ct.replaceToken('isActive',widgets.Forum.ACTIVE_STYLE);
}


ct.replaceToken('hideCount','hidden');



ct.next();
}
ct.compose();
},

updateCategoriesCount:function(incr){
var catConfig=this.categoryConfig[this.subtype];
if(catConfig){
if(incr)catConfig.count++;
else catConfig.count--;
mojo.setContent('forumCatCount_'+this.type+this.subtype,
'('+catConfig.count+')');
}
},

isCategoryType:function(){
var cat=this.categoryConfig[this.subtype];
return cat&&cat.isType;
},





getCategoryConfig:function(){
var key=this.subtype?this.subtype:this.type;
var config=this.categoryConfig[key];
if(!config){
config=this.categoryConfig[this.type];
}

return config;
},

getCategoryConfigWith:function(t,st){
var key=st?st:t;
var config=this.categoryConfig[key];
if(!config){
config=this.categoryConfig[t];
}

return config;
},

getCategoryDisplayName:function(t,st){
var config=this.getCategoryConfigWith(t,st);
return config.displayName;
},

getCategoryDescription:function(t,st){
var key=st?st:t;

var desc=this.getCategoryConfigWith(t,st).description;



if(this.res.subject!=null&&!this.res.subject.match(/^[0-9]+H[0-9]+$/)){
var catName=this.getCategoryDisplayName(this.type,this.subtype);
desc=$T(g_searchResultsDesc)
.replaceToken('count',this.res.total)
.replaceToken('term',this.res.subject)
.replaceToken('precontext',key=='None'?'across':'in')
.replaceToken('context',key=='None'?'all categories':catName)
.compose();
}
return desc.compose();
},

getTitle:function(){
var dtitle=this.title;
dtitle=this.getCategoryDisplayName(this.type,this.subtype);



if(this.res.subject&&this.res.subject.match(/^[0-9]+H[0-9]+$/)){
var thread=this.res.data.threads[0];
dtitle=this.getCategoryDisplayName(thread.type,thread.subtype);
}else
if(this.res.subject!=null){
dtitle='Search Results';
}

return dtitle?dtitle:'&nbsp;';
}
};

strings.Forum={
deleteComment:'Are you sure you want to delete this comment',
deletePost:'Are you sure you want to delete this post and all of its comments',
showMine:'View my contributions',
communityPolicy:'Community policy',
showAll:'Show all',
pod_categories:'Forum Categories'
};




widgets.LinksTextArea=Class.create();
widgets.LinksTextArea.all={};

widgets.LinksTextArea.prototype={
initialize:function(params){
if(!params)params={};

this._wiid='ltaw_'+mojo.idGenerator++;
this._wInstance='widgets.LinksTextArea.all.'+this._wiid;
this._template=lt.LinksTextArea.main;
this._renderTargetId=params.renderTargetId;
this._context=params.context;
this.onSubmitCallback=params.onSubmitCallback;
this.onCloseCallback=params.onCloseCallback;
this.onEmptySubmitCallback=params.onEmptySubmitCallback;

widgets.LinksTextArea.all[this._wiid]=this;
},

open:function(text){
if($(this._wiid)&&mojo.css.isDisplayed(this._wiid)){
this.close();
return;
}

$T(this._template,this._renderTargetId)
.replaceToken('wInstance',this._wInstance)
.replaceToken('wiid',this._wiid)
.replaceToken('defaultText',text)
.compose();
mojo.css.display(this._wiid,true);
mojo.focus(this._wiid+'_TextArea');
},

close:function(){


if(!$(this._wiid))return;

mojo.css.display(this._wiid,false);
},

onOpenInsertLinkDiv:function(type){
var tn=null
switch(type){
case'url':
tn=lt.LinksTextArea.insertUrl;
break;
case'image':
tn=lt.LinksTextArea.insertImage;
break;
case'emoticon':
tn=lt.LinksTextArea.insertEmoticon;
break;
default:
mojo.log.error('unsupport insert link type: '+type);
}

$T(tn,this._wiid+'_InsertDivContent')
.replaceToken('wInstance',this._wInstance)
.replaceToken('inputSize',mojo.SAFARI?27:30)
.compose();
mojo.css.display(this._wiid+'_InsertDiv',true);
},

onInsertUrl:function(){
var href=$F('urlLinkHref');
var text=$F('urlLinkText');
if(href.lisEmpty()||text.lisEmpty())return;

mojo.util.insertAtCursor(
this._wiid+'_TextArea',
'[['+'url'+'::'+href+'::'+text+']]');
this.onCloseInsert();
},

onInsertImage:function(){
var href=$F('imageLinkHref');
var height=$F('imageLinkHeight');
if(href.lisEmpty())return;
if(!parseInt(height)){
mojo.util.insertAtCursor(
this._wiid+'_TextArea',
'[['+'image'+'::'+href+']]');
}else{
mojo.util.insertAtCursor(
this._wiid+'_TextArea',
'[['+'image'+'::'+href+'::'+parseInt(height)+']]');
}
this.onCloseInsert();
},

onInsertEmoticon:function(which){
if(which=='smiley'){
zeFace=':)';
}else if(which=='wink'){
zeFace=';)';
}else if(which=='frown'){
zeFace=':(';
}else{
mojo.log.error('unsupported smily: '+which);
}
mojo.util.insertAtCursor(
this._wiid+'_TextArea',
zeFace);
this.onCloseInsert();
},

onCloseInsert:function(){
mojo.css.display(this._wiid+'_InsertDiv',false);
},

onSubmit:function(btn){
btn.disabled=true;


this.submitButton=btn;

var text=$F(this._wiid+'_TextArea');
if(text.lisEmpty()){
if(this.onEmptySubmitCallback){
this.onEmptySubmitCallback(text,this._context,this);
}
btn.disabled=false;
return;
}

this.onSubmitCallback(text,this._context,this);
},

onClose:function(){
if(this.onCloseCallback){
this.onCloseCallback();
}else{
this.close();
}
}
};






InstallLalaMover=Class.create();
InstallLalaMover.prototype={
initialize:function(isDownloadContext){
this.isDownloadContext=isDownloadContext;
this.isWin=mojo.WIN;
this.initPage({pageTitle:'Lala Music Mover - Bring your music online, play it anywhere',
pageTitleManual:true,
theme:'blueTheme',pageId:(this.isDownloadContext?'MusicMoverDownloader':'MusicMoverUploader'),
skelClass:'installLalaMover'});
this.customContentId=null;
InstallLalaMover.g=this;
},

onLoad:function(){
if(mojo.LALA_CRAWLER){
this.setPageMetaInfo();
}

var t=$T(lt.InstallLalaMover.skeleton)
.replaceToken('context',this.isDownloadContext?'Download':'Upload');
this.renderIntoContentRegion(t);

if(this.isDownloadContext){
$TC(lt.InstallLalaMover.downloadContextHeader,'lalaMoverHeader');
$TC(lt.InstallLalaMover.downloadContextGraphic,'lalaMoverGraphic');
$TC(lt.InstallLalaMover.downloadContextInfo,'lalaMoverInfo');
$TC(lt.InstallLalaMover.downloadContextFooter,'lalaMoverFooter');
}else{
$TC(lt.InstallLalaMover.uploadContextHeader,'lalaMoverHeader');
$TC(lt.InstallLalaMover.uploadContextGraphic,'lalaMoverGraphic');
$TC(lt.InstallLalaMover.uploadContextInfo,'lalaMoverInfo');
$TC(lt.InstallLalaMover.uploadContextFooter,'lalaMoverFooter');
}

this.customContentId='lalaMoverDownload';
this.renderCustomContent();
},

setPageMetaInfo:function(){
MyMusic.g.setDocumentMetaInfo(
"Quickly match the songs on your computer to Lala's licensed "+
"catalog. Songs you already have and playlists you've "+
"created are instantly added to your Lala collection for free."
);
},

renderCustomContent:function(){
var t=mojo.template.create(lt.InstallLalaMover.lalaMoverDownload,this.customContentId);
var platform;
var versionId;
var platformRequirements;

if(this.isWin){
platform="Windows";
versionId=g_pageData["mover_win_version"];
t.replaceToken('otherPlatform','Mac');
platformRequirements='Internet Explorer 6.0 / Firefox 2.0 and Windows XP or later';
}else{
platform="Mac";
versionId=g_pageData["mover_mac_version"];
t.replaceToken('otherPlatform','Windows');
platformRequirements='Safari 3.0 / Firefox 2.0 and OS X v10.4 or later';
}
t.replaceToken('platform',platform);
t.replaceToken('versionId',versionId);
t.replaceToken('platformRequirements',platformRequirements);
t.replaceToken('lalaMoverUrl',LalaMover.getDownloadUrl(this.isWin,this.isDownloadContext));

if(this.isDownloadContext){
t.removeTokenBlock('UploadTipBlock');
}else{
t.removeTokenBlock('DownloadTipBlock');
}

t.compose();
},

onSwitch:function(){
this.isWin=!this.isWin;
this.renderCustomContent();
},

onDownload:function(){
if(frontend.requiresSignin())return;
lala.Track.click('downloadMover');
lala.Track.flushCounters();
window.location=LalaMover.getDownloadUrl(this.isWin,this.isDownloadContext);
}
};
Object.extend(InstallLalaMover.prototype,Page.prototype,true);
MyMusic.addPage('musicmover/downloader',function(){return new InstallLalaMover(true);});
MyMusic.addPage('musicmover/uploader',function(){return new InstallLalaMover(false);});






HomePage=Class.create();
HomePage.prototype={
initialize:function(){
this.initPage({pageTitle:'Home',theme:'blueTheme',pageId:'Home',
skelClass:'homePage'});
this.downloadUploader=false;
this.promoTrackingId='widget.PersonalPromo.NewReleases';
this.isBetaTest=false;



if(mojo.DEV_FLAG
&&(lala.user.userToken=='50486@47'
||lala.user.userToken=='62995@1765')){
this.clearNotifications=false;
}

HomePage.g=this;
},

onLoad:function(){
var self=this;
if(this.processSignupLanding())return;

this.renderSkeleton();
api.HomePage.getRightColumnData(this.renderRightCol.lbind(this));

this.renderNewToRelease();

mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
$T(self.getUserPic(),'profilePicContent').compose(true);
});
},

processSignupLanding:function(){
var signupContext=Cookies.getFromSignupContext();
var signupState=null;

if(signupContext==null)return false;

if(signupContext.lcontains('::')){
signupState=signupContext.replace(/^.*::/,'');
}

lala.Track.click('signupContext.from.'+signupContext);
if(signupContext=='buyGiftCardEmail'){
frontend.go.EmailGiftCard();
return true;
}else if(signupContext=='buyGiftCardPrint'){
frontend.go.PrintGiftCard();
return true;
}else if(signupContext=='fbConnectLinked'){
frontend.go.FinderFriends(null,{isFbSignup:true});
return true;
}

this._signupLandingContext=signupContext;
this._signupLandingState=signupState;

return false;
},

renderSkeleton:function(){
this.layout=new widgets.core.TwoColumn();

var t=$T(lt.Home.skeleton)
.replaceToken('twoCol',this.layout.render());
this.renderIntoContentRegion(t);

var welcome=$T(MyMusic.g.hasSongs
?lt.Home.returningUserWelcomeMsg
:lt.Home.newUserWelcomeMsg)
.replaceToken('nickName',lala.user.nickName.lescapeHTML())
.compose();

$T(lt.Home.col1,this.layout.col1)
.replaceToken('profilePic',this.getUserPic())
.replaceToken('welcomeMsg',welcome)
.replaceToken('userToken',lala.user.userToken)
.replaceToken('displayNone',DataModel.g.getUserPreference("hideHomeSearch",false)?'':'lnone')
.removeTokenBlock(MyMusic.g.hasUserImage?'ChangeImageBlock':'')
.replaceToken('numSongs',
(MyMusic.g.loginSongCount<100000
?mojo.util.formatNumber(MyMusic.g.loginSongCount)
:mojo.util.formatBigNumber(MyMusic.g.loginSongCount)))
.compose();
$TC(lt.Home.col2,this.layout.col2);
},

renderRightCol:function(res){
if(res.data.surveyData){
this.renderSurveyDialog(res.data.surveyData);
}else{
this.renderGiftCardDialog(res.data.alertsData.giftCards);
}

this.renderPromo();
this.renderAlerts(res.data.alertsData.alerts);
this.renderPeople(res.data.peopleData);
this.renderBecauseOfYou(res.data.influencerData);
this.renderSiteDownMessage(res.data.siteDownMsg);

this.renderMainCol(res);
},

renderMainCol:function(res){
this.renderSearch();

if(!this.isBetaTest){
this.renderPersonalPromos(res.data.personalPromoDiscs);
}else{
this.renderBetaTest();
}

this.feed=new widgets.Feed({renderTargetId:'feedSC',isPrivate:true});
this.feed.loadAndRender();

this.showCustomSignupLandingDialog();
},

renderBetaTest:function(){
this.renderBetaTestNewReleasesBox();
this.renderBetaTestBestSellingSongsBox();
this.renderBetaTestBestSellingAlbumsBox();
},

renderBetaTestNewReleasesBox:function(){
var self=this;
var page=new NewReleasesPage();
page.initCommon();
page.genre=DataModel.g.getFavoriteGenres(true)[0];

api.Q.searchAlbums(
{Q:page.getNewReleasesFirstTabBucketQ(),
sortKey:page.popularSortKey,
sortDir:page.popularSortDir,
count:9
},
function(res){
$T(lt.Home.betaTestNewReleaseSection,'betaTestNewReleaseSection')
.replaceToken('genre',page.genre)
.replaceToken('genreTrim',page.genre.ltruncate(20))
.replaceToken('trackingLink','newReleaseBox.seeAll')
.compose();

var box=new widgets.core.ShadowBox({
renderTargetId:'betaTestNewReleaseAlbums'
});
box.render();

var config={};
config.renderTargetId=box.contentId;
config.customFrameClass='lclearTopBorder';
config.layout='grid';
config.clickTrackingId='newReleaseBox.item';

var w=new widgets.AlbumList(config);
w.render(res.data.albums);
});
},

renderBetaTestBestSellingSongsBox:function(){
var self=this;
var page=new BestsellersPage();
page.initCommon();
page.genre=DataModel.g.getFavoriteGenres(true)[0];

api.Q.searchSongs(
{Q:page.getBestsellersQ('mp3Song'),
sortKey:page.mp3SortKey,
sortDir:'Desc',
count:5
},
function(res){
$T(lt.Home.betaTestBestSellingSongsSection,'betaTestBestSellingSongsSection')
.replaceToken('genre',page.genre)
.replaceToken('genreTrim',page.genre.ltruncate(4))
.replaceToken('trackingLink','bestSellingBox.songs.seeAll')
.compose();

new widgets.SongList({
renderTargetId:'betaTestBestSellingSongs',
trackingId:'bestSellingBox.songs',
layout:'simple',
hideDuration:true,
hideNum:true,
hideAlbum:true,
showListens:false,
showPrice:true,
showBuyActions:true,
buyMode:'mp3',
hideAddedTransient:true
}).render(res.data.songs);
});
},

renderBetaTestBestSellingAlbumsBox:function(){
var self=this;
var page=new BestsellersPage();
page.initCommon();
page.genre=DataModel.g.getFavoriteGenres(true)[0];

api.Q.searchAlbums(
{Q:page.getBestsellersQ('mp3All'),
sortKey:page.mp3SortKey,
sortDir:'Desc',
count:5
},
function(res){
$T(lt.Home.betaTestBestSellingAlbumsSection,'betaTestBestSellingAlbumsSection')
.replaceToken('genre',page.genre)
.replaceToken('genreTrim',page.genre.ltruncate(4))
.replaceToken('trackingLink','bestSellingBox.albums.seeAll')
.compose();

new widgets.AlbumList({
renderTargetId:'betaTestBestSellingAlbums',
clickTrackingId:'bestSellingBox.albums',
layout:'listNarrow'
}).render(res.data.albums);
});
},

renderSiteDownMessage:function(blobJson){
if(!blobJson)return;

var blob=mojo.evalJson(blobJson);
if(blob.message){
var message=blob.message;
var version=blob.version;
if(!DataModel.g.getUserPreference('hideSiteDown_'+version,false)){
$T(lt.Home.siteDownTime,'newToReleaseSC')
.replaceToken('msg',message)
.replaceToken('version',version)
.compose();
$D('newToReleaseSC',true);
}
}
},

onDismissSiteDownAlert:function(version){
DataModel.g.setUserPreference('hideSiteDown_'+version,true);
$D('newToReleaseSC',false);
},

getSearchGenres:function(){
var defaultGenres=[
"Hip-Hop",
"Rock",
"R&B",
"Pop",
"Country",
"Alternative",
"Latin",
"Electronic"
];
var favGenres=DataModel.g.getFavoriteGenres(true);
var genres=null;
if(favGenres.lisEmpty()){
genres=defaultGenres.sort();
}else{
genres=favGenres.lclone();
var numToGet=defaultGenres.length-favGenres.length;
var g=null;
var count=0;
for(var i=0;i<defaultGenres.length;i++){
g=defaultGenres[i];
if(!favGenres.lcontains(g)){
genres.push(g);
count++;
if(count==numToGet)break;
}
}
}
return genres;
},

renderSearch:function(){
$T(lt.Home.search,'searchSC')
.replaceToken('displayNone',
DataModel.g.getUserPreference("hideHomeSearch",false)?'lnone':'')
.compose();
new widgets.ChunkySearchBox({
id:'chunkySearchBox',
renderTargetId:'searchWidgetArea',
trackingId:'SearchBox'
}).render();
},

onCloseSearch:function(){
lala.Track.clientPageInteraction('Searchbox.close');
$D('searchArea',false);
$D('profileLinkSearchbox',true,'inline');
DataModel.g.setUserPreference("hideHomeSearch",true);
},

onShowSearch:function(){
$D('searchArea');
$D('profileLinkSearchbox',false);
DataModel.g.setUserPreference("hideHomeSearch",false);
},

renderPersonalPromos:function(personalPromoDiscs){
if(personalPromoDiscs.length<=0)return;

this.personalPromoDiscs=personalPromoDiscs;

var random=this.personalPromoDiscs.lrandomIndex();
var firstDisc=this.personalPromoDiscs.lremoveAt(random);
this.personalPromoDiscs.linsertAt(firstDisc,0);
this.currentPersonalPromoIndex=0;
$D('personalPromos',true);
$TC(lt.Home.personalPromos,'personalPromos');
this.renderPersonalPromoDisc();
},

renderNextPersonalPromo:function(){
this.currentPersonalPromoIndex++;
if(this.currentPersonalPromoIndex>=this.personalPromoDiscs.length){
this.currentPersonalPromoIndex=0;
}
this.renderPersonalPromoDisc();
lala.Track.clientPageInteraction(this.promoTrackingId+'.next');
},

renderPrevPersonalPromo:function(){
this.currentPersonalPromoIndex--;
if(this.currentPersonalPromoIndex<0){
this.currentPersonalPromoIndex=this.personalPromoDiscs.length-1;
}
this.renderPersonalPromoDisc();
lala.Track.clientPageInteraction(this.promoTrackingId+'.prev');
},

renderPersonalPromoDisc:function(){
var disc=this.personalPromoDiscs[this.currentPersonalPromoIndex]
var promoDisc=$T(lt.Home.personalPromoDisc);
promoDisc.replaceToken('clickTrackingId',this.promoTrackingId);

if(this.personalPromoDiscs.length<=1){
promoDisc.replaceToken('controlsClass','lnone');
}else{
promoDisc.replaceToken('total',this.personalPromoDiscs.length);
promoDisc.replaceToken('currIndex',this.currentPersonalPromoIndex+1);
}

promoDisc.getTokenBlock('ReleaseDateBlock').dateFormatString='%B %ud, %Y';
promoDisc.replaceTokensWithBean('disc',disc)
.replaceToken('mp3Only',frontend.isDiscMP3Only(disc));
if(disc.genre){
promoDisc.removeTokenBlock('EmptyGenreBlock');
}else{
promoDisc.removeTokenBlock('GenreBlock');
}
if(disc.isPromoPriceSet){
promoDisc.removeTokenBlock('ReleaseDateBlock');
}else{
promoDisc.removeTokenBlock('LimitedTimeBlock');
}

if(!disc.isLicensedForStreaming&&!disc.isLicensedForDownload){
promoDisc.removeTokenBlock('BuyBlock');
}else{
var buyingInfo=promoDisc.getTokenBlock('BuyBlock');


if(disc.isLicensedForStreaming){
if(disc.addMissingTracksCount>0){
var addPrice=StoreUtil.getRealWebPrice(disc);


if(disc.addMissingTracksPriceInCents<=0){
addPrice=disc.webAlbumPriceInCents;
}
buyingInfo.replaceToken('webPrice','$'+mojo.util.formatPrice(addPrice));
}else{
buyingInfo.replaceToken('webPrice',$TC(lt.Home.miniCheck));
}
}else{
buyingInfo.removeTokenBlock('WebPriceBlock');
}


if(disc.isLicensedForDownload){
if(disc.downloadMissingTracksCount>0){
var dlPrice=StoreUtil.getRealDownloadPrice(disc);


if(disc.downloadMissingTracksPriceInCents<=0){
dlPrice=disc.downloadAlbumPriceInCents;
}

buyingInfo.replaceToken('mp3Price','$'+mojo.util.formatPrice(dlPrice));
}else{
buyingInfo.replaceToken('mp3Price',$TC(lt.Home.miniCheck));
}
}else{
buyingInfo.removeTokenBlock('Mp3PriceBlock');
}
}
new widgets.core.ShadowBox({
renderTargetId:'personalPromosCarousel',
content:promoDisc.compose()
}).render();
lala.Track.clientPage(this.promoTrackingId+'.viewed');
},

renderPromo:function(){
this.promoWidget=new PromoWidget({
renderTargetId:'promoSC',
blobId:'Home'
});
this.promoWidget.loadAndRender();
},

renderNewToRelease:function(){
if(!lala.user.isNewToRelease)return;


var endDate=new Date(2009,6,30);
if(new Date().getTime()>=endDate.getTime()){
this.onDismissNewToRelease(true);
return;
}
$TC(lt.Home.newToRelease,'newToReleaseSC');
$D('newToReleaseSC',true);

lala.Track.click('homePage.newToReleaseBanner.viewed');
},

onDismissNewToRelease:function(isAuto){
var name=isAuto?'autoClosed':'closed';
lala.Track.click('homePage.newToReleaseBanner.'+name);
api.User.clearIsNewToRelease(
function(){
var elem=$('newToReleaseSC');
if(elem)$D(elem,false);
lala.user.isNewToRelease=false;
});
},

showCustomSignupLandingDialog:function(){
var self=this;
var context=this._signupLandingContext;
if(context&&context.match(/inviteGiftCard::\d+/)){
var cardValue=context.match(/inviteGiftCard::(\d+)/)[1];
var d=new MojoDialog({
title:'Welcome to Lala!',
id:'inviteGiftCard'
});
d.open($T(lt.Home.newUserInviteGiftCard)
.replaceToken('giftCardValue','$'+mojo.util.formatPrice(cardValue))
.compose());
}else if(context=='claimCode'){
widgets.core.GiftCards.openClaimWindow();
}else if(context=='fbConnectLinked'){
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
if(!self.facebookLinkedDialogShown){
LalaFBConnect.openFacebookLinkedDialog();
}
self.facebookLinkedDialogShown=true;
});
}
},

getUserPic:function(){
var html=$T(lt.Home.profilePicture)
.replaceTokensWithBean('user',lala.user)
.replaceToken('userToken',lala.user.userToken)
.replaceToken('facebookImgUrl',LalaFBConnect.getImgUrl());
return html.compose();
},

renderPeople:function(peopleData){
$TC(lt.Home.peoplePod,'peopleSC');
new widgets.core.People({
clickTrackingId:'homePage.people',
renderTargetParentId:'recentlyFollowing'
}).render(peopleData.recentlyFollowing,peopleData.recentlyFollowedBy);
},

renderBecauseOfYou:function(influencerData){
if(!influencerData||influencerData.events.length==0)return;

$TC(lt.Home.becauseOfYouPod,'becauseOfYouSC');
new widgets.core.BecauseOfYou({
renderTargetParentId:'becauseOfYou',
clickTrackingId:'homePage.becauseOfYou',
profileUserScore:influencerData.score
}).render(influencerData.events);
},




renderAlerts:function(alerts){
var html=[];


for(var i=0;i<alerts.length;i++){
var alert=alerts[i];
var s=alert.count>1?'s':'';
var t=null;

if(lala.isTradingTransition){
switch(alert){
case'CreditCardInvalid':
t=$T(lt.Home.alerts_CreditCardInvalid);
break;
case'CreditCardExpiring':
t=$T(lt.Home.alerts_CreditCardExpiring);
break;
case'DownloadUploader':
this.downloadUploader=true;
break;
case'TradeSuspended':
case'OnVacation':
case'ShipReceiveThrottle':
case'ShipThrottle':
case'ReceiveThrottle':

break;
case'InvalidEmailAddress':
t=$T(lt.Home.alerts_InvalidEmailAddress);
break;
default:
mojo.log.error('unknown alert type: '+alert);
continue;
}
}else{
switch(alert){
case'CreditCardInvalid':
t=$T(lt.Home.alerts_CreditCardInvalid);
break;
case'CreditCardExpiring':
t=$T(lt.Home.alerts_CreditCardExpiring);
break;
case'DownloadUploader':
this.downloadUploader=true;
break;
case'TradeSuspended':
t=$T(lt.Home.alerts_TradeSuspended);
break;
case'OnVacation':
t=$T(lt.Home.alerts_Vacating);
break;
case'ShipReceiveThrottle':
t=$T(lt.Home.alerts_ShipReceiveThrottle);
break;
case'ShipThrottle':
t=$T(lt.Home.alerts_ShipThrottle);
break;
case'ReceiveThrottle':
t=$T(lt.Home.alerts_ReceiveThrottle);
break;
case'InvalidEmailAddress':
t=$T(lt.Home.alerts_InvalidEmailAddress);
break;
default:
mojo.log.error('unknown alert type: '+alert);
continue;
}
}

if(t){
t.replaceToken('s',s);
html.push(t.compose());
}
}
if(mojo.IE6&&!mojo.cookie.get('hideBrowserUpgradePrompt')){
html.push($TC(lt.Home.alerts_UpgradeBrowser));
lala.Track.clientPage('widget.Alerts.upgradeBrowser');
}
if(html.length>0){
$T(lt.Home.alerts,'alertsSC')
.replaceToken('content',html.join(''))
.compose();
}
},

renderSurveyDialog:function(blob){
var data=mojo.evalJson(blob);
var d=new MojoDialog({
title:data.title,
id:'takeSurvey'
});
d.onCancel=function(){
lala.Track.clientPageInteraction('widget.Survey.'+data.id+'.cancel');
};
if(!data.confirmText)data.confirmText='Take the survey';
if(!data.cancelText)data.cancelText='No thanks';
d.open($T(lt.NewForYou.takeSurveyDialog)
.replaceTokensWithBean('data',data)
.replaceToken('id',lala.user.userToken.replace(/[@]/,'_'))
.compose()
);
lala.Track.clientPage('widget.Survey.'+data.id+'.viewed');
},

renderGiftCardDialog:function(giftCards){
this.giftCards=giftCards;
if(!this.giftCards||this.giftCards.length<1)return;
var gc=this.giftCards.llast();
var d=new MojoDialog({
title:gc.giftCard.giverName+' purchased a gift for you!',
id:'giftCardReceived'
});
d.open($T(lt.NewForYou.giftCardReceivedDialog)
.replaceTokensWithBean('giftCard',gc.giftCard)
.removeTokenBlock('NoteBlock',!gc.giftCard.note)
.replaceToken('lalaId',gc.lalaId)
.replaceToken('giftCardValue','$'+mojo.util.formatPrice(gc.giftCard.valueInCents))
.replaceToken('theme',gc.giftCard.theme.toLowerCase())
.compose());
},

onAcceptGiftCardViaDialog:function(giftLalaId){
var self=this;
api.Gifts.acceptGift(giftLalaId,function(res){
api.MicroWallet.updateWallet({balance:res.data.walletBalanceInCents});

var gift=self.giftCards.lfindIf('lalaId',giftLalaId)[0];
var ackD=new MojoDialog({
title:'Gift card added',
id:'giftCardAdded'
});
ackD.onClose=function(){
if(self.giftCards.length>0){
window.setTimeout(function(){
self.renderGiftCardDialog(self.giftCards);
},20)
}
};
var commentBox=widgets.core.GiftCards.getCommentBox({
messageLalaId:gift.giftCard.messageLalaId,
onCancel:MojoDialog.close
});
ackD.open($T(lt.NewForYou.giftCardClaimed)
.replaceToken('value',mojo.util.formatPrice(gift.giftCard.valueInCents))
.replaceToken('total',mojo.util.formatPrice(res.data.walletBalanceInCents))
.replaceToken('token',gift.token)
.replaceToken('postComments',commentBox.render())
.compose());
commentBox.onCommentClick();
mojo.css.show('giftCardClaimed_'+gift.token);


self.giftCards.lremoveIf('lalaId',gift.lalaId);

DataModel.g.decrementPendingCount('Gift');
});
},

onInviteFriends:function(){
var w=new widgets.EmailForm({
type:'invite',
defaultMsg:"Hey, have you tried Lala yet?  It rocks - I'm listening to loads of music, and loving it.",
cancelButton:'Cancel',
sendButton:'Invite',
ackTmpl:lt.Home.inviteFriendsAck,
shouldFocus:true
});

w.onCancel=function(){widgets.core.LightDialog.hide()};
widgets.core.LightDialog.show({
title:'Invite your friends to Lala',
msg:w.render()
});

$('lalaLightDialog').style.position=mojo.FF?"fixed":"absolute";

w.focusEmailField();
},

onHideUpgradeBrowser:function(){
mojo.cookie.set('hideBrowserUpgradePrompt',true,30);
$D('upgradeBrowserAlert',false);
lala.Track.clientPageInteraction('widget.Alerts.upgradeBrowser');
}
};
Object.extend(HomePage.prototype,Page.prototype,true);

MyMusic.addPage('home',function(){
return MyMusic.g.getHomePage();
});




BookmarksPage=Class.create();
BookmarksPage.prototype={
initialize:function(params){
this.initPage({
skelClass:'bookmarksPage',
pageId:'Bookmarks',
authLevel:1
});
BookmarksPage.g=this;
},


onLoad:function(pathParts){
var self=this;

var t=$T(lt.Bookmarks.pageSkel);
this.renderIntoContentRegion(t);

var twoCol=new widgets.core.TwoColumn({
renderTargetId:'bookmarksTabsContent'
});
twoCol.render();

$TC(lt.Bookmarks.listSkel,twoCol.col1);

this.tabs=mojo.newtabs.create({
id:'bookmarks',
divTabsId:'bookmarksTabsArea',
divTabsContentId:'bookmarkList'
});

this.tabs.onTabClick=function(tab){
self['loadAndRender'+tab.id]();
};




this.tabs.add({
id:'All',
title:'All <span id="allCount" class="count">&nbsp;&nbsp;&nbsp;</span>',
path:frontend.path.Bookmarks()
});

this.tabs.add({
id:'Artists',
title:'Artists <span class="count" id="artistCount">&nbsp;&nbsp;&nbsp;</span>',
path:frontend.path.Bookmarks('artists')
});

this.tabs.add({
id:'Albums',
title:'Albums <span class="count" id="albumCount">&nbsp;&nbsp;&nbsp;</span>',
path:frontend.path.Bookmarks('albums')
});

this.tabs.add({
id:'Songs',
title:'Songs <span id="songCount" class="count">&nbsp;&nbsp;&nbsp;</span>',
path:frontend.path.Bookmarks('songs')
});

this.tabs.add({
id:'Playlists',
title:'Playlists <span class="count" id="playlistCount">&nbsp;&nbsp;&nbsp;</span>',
path:frontend.path.Bookmarks('playlists')
});

var activeTab='All';
if(pathParts.length>1)activeTab=pathParts[1].ltoFirstUpperCase();
this.tabs.activate(activeTab);

mojo.listeners.add(api.Bookmarks.DELETED,this.reload.lbind(this));
},

updateCounts:function(counts){
var total=0;
var types=['Album','Artist','Song','Playlist'];
types.leach(function(type){
var num=0;
var count=counts.lfindObject('type',type);
if(count)num=count.count;
$S(type.ltoFirstLowerCase()+'Count','('+num+')');
total+=num;
});
$S('allCount','('+total+')');
},

renderPagers:function(res,pagedList){
this.pager=new widgets.core.Paginator(
'bookmarksPagerTop','lite',
'bookmarksPagerBottom','big');
this.pager.recordBackEvents=true;
this.pager.recordBackEventsKeepPath=true;
this.pager.renderTwo(res,pagedList);
},

renderList:function(res,renderFunction){
this.updateCounts(res.data.counts);
$(this.tabs.divTabsContentId).className=this.tabs.active.id.ltoFirstLowerCase();

var pagedList=res.data.result;
if(pagedList.total>0){
$D('listControls',true);
pagedList.list.leach(function(bm){


if(!bm.bookmarkItem){
bm.bookmarkItem={};
}
bm.bookmarkItem.clientBookmarkInfo={
id:bm.id,
timestamp:bm.timestamp,
type:bm.type
};
});
renderFunction(pagedList.list.lpluck('bookmarkItem'),res.req.params.skip);
this.renderPagers(res,pagedList);
}else{
$TC(lt.Bookmarks.emptyBookmarks,this.tabs.divTabsContentId);
$D('listControls',false);
$D('bookmarksPagerBottom',false);
}
},

onChangeSortDir:function(){
this.reload();
},

getSortDir:function(){
return $F('bookmarksSort');
},

reload:function(){
this.tabs.activate(this.tabs.active.id);
},

loadAndRenderAll:function(){
var self=this;
api.Bookmarks.getBookmarks(this.getSortDir(),function(res){
self.renderList(res,self.renderWidgets.lbind(self));
},
null,
this.getSkipParam());
},

getSkipParam:function(){
return mojo.isDefined(lala.params.skip)?parseInt(lala.params.skip):0;
},

loadAndRenderPlaylists:function(){
var self=this;
api.Bookmarks.getPlaylistBookmarks(this.getSortDir(),function(res){
self.renderList(res,self.renderWidgets.lbind(self));
},
null,
this.getSkipParam());
},

loadAndRenderArtists:function(){
var self=this;
api.Bookmarks.getArtistBookmarks(this.getSortDir(),function(res){
self.renderList(res,self.renderWidgets.lbind(self));
},
null,
this.getSkipParam());
},

loadAndRenderAlbums:function(){
var self=this;
api.Bookmarks.getAlbumBookmarks(this.getSortDir(),function(res){
self.renderList(res,self.renderWidgets.lbind(self));
},
null,
this.getSkipParam());
},

loadAndRenderSongs:function(){
var self=this;
api.Bookmarks.getSongBookmarks(this.getSortDir(),function(res){
self.renderList(res,self.renderWidgets.lbind(self));
},
null,
this.getSkipParam());
},

renderWidgets:function(bookmarks,skip){
var html=[];
bookmarks.leach(function(bookmark,index,isLast){
html.push($T(lt.Bookmarks.dateAndRemove)
.replaceToken('bookmarkDate',new Date(parseInt(bookmark.clientBookmarkInfo.timestamp)))
.replaceToken('bookmarkId',bookmark.clientBookmarkInfo.id)
.compose());
if(bookmark.clientBookmarkInfo.type=='Artist'){
var artistList=new widgets.ArtistList({
imageSize:'small',
layout:'list',
startNum:index+skip
});
html.push(artistList.getRowsHtml([bookmark],isLast));
}else if(bookmark.clientBookmarkInfo.type=='Song'){
var songList=new widgets.SongList({
showListens:'count',
whichListen:'listens7',
showRatings:true,
hideZeroRating:true,
startNum:index+skip
});
html.push(songList.render([bookmark],null,null,isLast));
}else if(bookmark.clientBookmarkInfo.type=='Playlist'){
var playlistList=new widgets.PlaylistList({
layout:'wide',
startNum:index+skip
});
html.push(playlistList.getHtml([bookmark],isLast));
}else if(bookmark.clientBookmarkInfo.type=='Album'){
var albumList=new widgets.AlbumList({
layout:'list',
showNum:true,
startNum:index+skip
});
html.push(albumList.getHtml([bookmark],null,isLast));
}
});

$S(this.tabs.divTabsContentId,html.join(''));
}
};
Object.extend(BookmarksPage.prototype,Page.prototype,true);
MyMusic.addPage('bookmarks',function(){
return new BookmarksPage();
});



SignupLandingPage=Class.create();
SignupLandingPage.prototype={
initSignupLandingPage:function(params){
var self=this;
this.initPage({
pageTitle:params.pageTitle,
pageId:params.pageId,
showOnlyNoAuthAck:params.showOnlyNoAuthAck||false,
onlyNoAuth:true,
skelClass:'signupLanding '+params.skelClass,
isSignupPage:true,
hideNavCol:true
});

this.signInUpMode='signup';
this.signupTitle=params.signupTitle;
this.signinWidget=new SignInOrUp();
this.signinWidget.backgroundColor="rgb(238,238,238)";


this.signinWidget.onSignedUpCallback=
function(){self.onSignedInOrUpCallback(true);};
this.signinWidget.onSignedInCallback=
function(){self.onSignedInOrUpCallback(false);};
},

onLoad:function(){
SignupLandingPage.g=this;

this.renderIntoContentRegion($T(lt.SignupLandingPage.skeleton));
this.twoCol=new widgets.core.TwoColumn({renderTargetId:'twoCol'});
this.twoCol.render();

Header.g.hideLinks();



DataModel.g.isUsIpAddress(this.onLandingPageLoad.lbind(this));
},

onUnload:function(){
Header.g.showLinks();
},


onLandingPageLoad:function(){
},


onSignedInOrUpCallback:function(isSignup){
},


renderCol2:function(isFacebook){
$T(lt.SignupLandingPage.col2,this.twoCol.col2)
.removeTokenBlock("FacebookBlock",isFacebook||!lala.showFacebookConnect)
.compose();

this.signUpBox=new widgets.core.RoundedBox({
renderTargetId:'signUp'
}).render();


this.onSwitchToSignup(isFacebook);
},

onSwitchToSignup:function(isFacebook){
this.signInUpMode='signup';
this.signinWidget.open({
title:$T(lt.SignupLandingPage.signinBoxTitle)
.replaceToken('title',this.signupTitle||'Create your FREE Lala account')
.replaceToken('isFacebook',!!isFacebook)
.compose(),
dontClobberMyTitle:true,
renderTargetId:this.signUpBox.contentId,
isFacebook:isFacebook
});
this.signinWidget.setupSignupEventHandlers();
},

onSwitchToSignin:function(isFacebook){
if(this.showOnlyNoAuthAck){
lala.showAck("Sorry, this promotion is only available for new users.");
}

this.signInUpMode='signin';
this.signinWidget.open({
signinText:$T(lt.SignupLandingPage.signupBoxTitle)
.replaceToken('isFacebook',!!isFacebook)
.compose(),
renderTargetId:this.signUpBox.contentId,
showSignIn:true,
isFacebook:isFacebook
});
},

goToLoggedInHome:function(){
if(!mojo.SAFARI&&!mojo.CHROME){
lala.gotoPage.id('MyMusic');
}else{


window.location=lala.URL.HomeRedirect;
}
},

onFBClick:function(){
mojo.listeners.add(
LalaFBConnect.LISTENER_NOW_CONNECTED,
this.onFacebookConnected.lbind(this));
LalaFBConnect.onFBConnectClick('signuplanding');
},

onFacebookConnected:function(){
var self=this;
api.FacebookConnect.signinWithFacebook(function(res){
if(!res.data){
self.renderFacebookSignup();
}else{
LalaFBConnect.openFacebookSigningInDialog();
window.setTimeout(function(){
var userToken=res.data;
SignInOrUp.onSignInSuccessViaIFrame(userToken);
},1000);
}
});
},

renderFacebookSignup:function(){
this.renderCol2(true);
}

};
Object.extend(SignupLandingPage.prototype,Page.prototype,true);

AddSongLandingPage=Class.create();
AddSongLandingPage.prototype={
initialize:function(songId){
var fc=mojo.cookie.get('fc');
this.songId=songId;
this.isFromCmj=fc&&fc.lcontains('.cmj');

this.initSignupLandingPage({
pageTitle:this.isFromCmj?'CMJ':'Add song to your collection',
pageId:'AddSongLanding',
skelClass:'addSongLanding'});
},

onLandingPageLoad:function(){
var self=this;
api.Player.getTrackInfo(
this.songId,
function(res){
self.song=res.data;
self.renderPageData();
});
},

renderPageData:function(){

$T(lt.AddSongLanding.col1,this.twoCol.col1)
.replaceToken('where',this.isFromCmj?'CMJ':'the Web')
.compose();


var songBox=new widgets.core.RoundedBox({
renderTargetId:'song',
mode:'tinyBorder'
});
songBox.render();
var w=new widgets.SongList({
renderTargetId:songBox.contentId,
hideActions:true,
hideNum:true,
showBuyActions:false,
showQueueAction:false,
showAlbumImg:true,
artRight:true
});
w.render([this.song]);

this.renderCol2();
this.signinWidget.setSignUpFreeWebSong(this.songId);
},

onSignedInOrUpCallback:function(){
var self=this;
if(this.signInUpMode=='signin'){
api.Store.smartPurchaseWebSong(this.songId,function(res){
if(res.data){
MyMusic.g.reloadToRecentlyAdded();
}else{
lala.gotoPage.url(frontend.url.Song(self.songId));
}
});
}else{
MyMusic.g.reloadToRecentlyAdded();
}
}
};
Object.extend(AddSongLandingPage.prototype,SignupLandingPage.prototype,true);
MyMusic.addPageRegex(
'addsongpartner',
/addsongpartner\/[^\/]+\/-?\d+$/,
function(pathParts){
return new AddSongLandingPage(pathParts[2]);
});
MyMusic.addPageRegex(
'addsonglanding',
/addsonglanding\/\d+$/,
function(pathParts){
return new AddSongLandingPage(pathParts[1]);
});

WidgetSignupLandingPage=Class.create();
WidgetSignupLandingPage.prototype={
initialize:function(){
this.initSignupLandingPage({
pageTitle:'Let the music play',
pageId:'WidgetSignupLanding',
skelClass:'widgetSignupLanding',
signupTitle:'Create your free Lala account'
});
},

onLandingPageLoad:function(){
this.renderPageData();
},

renderPageData:function(){
$T(lt.WidgetSignupLandingPage.col1,this.twoCol.col1)
.compose();
this.renderCol2();
},

onSignedInOrUpCallback:function(){
this.goToLoggedInHome();
}
}
Object.extend(WidgetSignupLandingPage.prototype,SignupLandingPage.prototype,true);
MyMusic.addPage(['widgetsignuplanding','widgetsignup'],function(){return new WidgetSignupLandingPage();});

FollowLandingPage=Class.create();
FollowLandingPage.prototype={
initialize:function(userToken){
var fc=mojo.cookie.get('fc');
this.userToken=userToken;

this.initSignupLandingPage({
pageTitle:'Follow member',
pageId:'FollowLanding',
skelClass:'followLanding'
});
},

onLandingPageLoad:function(){
var self=this;
api.User.getLeahInfo(
this.userToken,
function(res){
self.user=res.data.user;
self.genreList=res.data.user.genreList;
self.artistList=res.data.user.artistList;
self.renderPageData();
});
},

renderPageData:function(){

var t=$T(lt.FollowLanding.col1,this.twoCol.col1);
t.replaceTokensWithBean('user',this.user);

var genres=[];
if(this.genreList){
genres=this.genreList.split('::');
}

var artists=[];
if(this.artistList){
artists=this.artistList.split('::');
}

if(genres.lisEmpty()&&artists.lisEmpty()){
t.removeTokenBlock('HistosBlock');
}else{
var iter;
var hblock=t.getTokenBlock('HistosBlock');
if(genres.length>0){
iter=hblock.getTokenBlock('GenresBlock').getTokenBlock('GenreIterBlock');
genres.leach(function(genre){
iter.replaceToken('genre',genre);
iter.next();
});
}else{
hblock.removeTokenBlock('GenresBlock');
}

if(artists.length>0){
iter=hblock.getTokenBlock('ArtistsBlock').getTokenBlock('ArtistIterBlock');
artists.leach(function(artist){
iter.replaceToken('artist',artist);
iter.next();
});
}else{
hblock.removeTokenBlock('ArtistsBlock');
}
}
t.compose();

this.renderCol2();
},

onSignedInOrUpCallback:function(){
var self=this;
api.Friends.follow(
this.userToken,
'INFLUENCER',
function(){
lala.gotoPage.url(frontend.url.Member(self.userToken));
},
'landingPage');
}
};
Object.extend(FollowLandingPage.prototype,SignupLandingPage.prototype,true);
MyMusic.addPageRegex(
'followlanding',
/followlanding\/.*$/,
function(pathParts){
return new FollowLandingPage(pathParts[1]);
});


FreePlaylistLandingPage=Class.create();
FreePlaylistLandingPage.prototype={
POP_MATTERS_TOKEN:'46901P39643',
OUTSIDE_LANDS_TOKEN:'22000P44178',
HOJO_TOKEN:'11983P36799',
initialize:function(playlistToken){
this.playlistToken=playlistToken;

this.initSignupLandingPage({
pageTitle:'Get this playlist for free',
pageId:'FreePlaylistLanding',
skelClass:'freePlaylistLanding',
showOnlyNoAuthAck:true
});
},

onLandingPageLoad:function(){
var self=this;
api.Playlists.getPlaylistForLanding({id:this.playlistToken},function(res){
if(res.data.playlist){
self.playlist=res.data.playlist;
self.tracks=res.data.tracks;
self.hasImage=res.data.hasImage;
}
self.renderPageData();
});
},



getOnlyNoAuthRedirectPage:function(){
return new MemberPlaylistPage();
},

renderPageData:function(){
var t=$T(lt.FreePlaylistLanding.col1,this.twoCol.col1);

if(this.playlist){
var hoverOffsets={};
if(mojo.FF){
if(mojo.MAC){
hoverOffsets.top=-4;
hoverOffsets.left=-1;
}else{
hoverOffsets.top=-3;
}
}else if(mojo.SAFARI&&mojo.MAC){
hoverOffsets.top=-1;
}
var songList=
new widgets.SongList({
layout:'simple',
trackingId:'freePlaylist',
clickTrackingId:'freePlaylist',
showListens:false,
hideAlbum:true,
showAlbumImg:true,
artRight:true,
offsets:hoverOffsets
});

var duration=0;
this.tracks.list.leach(function(track){
duration+=track.duration;
});

var extraText="We have over 8 million songs. Add the "
+this.playlist.numTracks+" songs below for free!";
if(this.playlistToken==this.POP_MATTERS_TOKEN){
extraText="Sign up now to get this popmatters playlist for "
+"free and be entered to win some Michael "
+"Jackson MP3 albums.";
}else if(this.playlistToken==this.OUTSIDE_LANDS_TOKEN){
t.replaceTokenBlock('HeaderBlock',
'<img src="'+lala.Servlet.UserImage
+'?path=outsidelands.freeplaylist"/>');
}else if(this.playlistToken==this.HOJO_TOKEN){
t.replaceTokenBlock('HeaderBlock',
'<img src="'+lala.Servlet.UserImage
+'?path=freeplaylist.'+this.HOJO_TOKEN+'"/>');
}else if(this.playlistToken==this.HOJO_TOKEN_10){
t.replaceTokenBlock('HeaderBlock',
'<img src="'+lala.Servlet.UserImage
+'?path=freeplaylist.'+this.HOJO_TOKEN_10+'"/>');
}else if(this.hasImage){
t.replaceTokenBlock('HeaderBlock',
'<img src="'+lala.Servlet.UserImage
+'?path=PlaylistLanding.'+this.playlistToken+'"/>');
}

t.replaceTokensWithBean('playlist',this.playlist)
.replaceToken('duration',mojo.util.secondsToTime(duration,true))
.replaceToken('playlistTracks',songList.render(this.tracks))
.replaceToken('extraText',extraText);
t.getTokenBlock('PlaylistExists')
.replaceTokensWithBean('user',this.playlist.user);
if(!this.playlist.isFreeOnSignup){
t.removeTokenBlock('IsFreeOnSignup');
}
}else{
t.removeTokenBlock('PlaylistExists');
t.removeTokenBlock('IsFreeOnSignup');
}
t.compose();


this.renderCol2();

if(this.playlist&&this.playlist.isFreeOnSignup){
this.signinWidget.setSignUpFreePlaylistToken(this.playlistToken);
}
},

onSignedInOrUpCallback:function(isSignup){
if(isSignup){

lala.gotoPage.url(frontend.url.Collection());
}else{
lala.gotoPage.url(frontend.url.MemberPlaylist(this.playlistToken));
}
}
};
Object.extend(FreePlaylistLandingPage.prototype,SignupLandingPage.prototype,true);
MyMusic.addPageRegex(
'freeplaylist',
/freeplaylist\/.*$/,
function(pathParts){
return new FreePlaylistLandingPage(pathParts[1]);
});


CreditsPromoLandingPage=Class.create();
CreditsPromoLandingPage.prototype={
initialize:function(promoCode){
this.promoCode=promoCode;

if(this.promoCode=='FSCXC')this.freeCount=25;
else if(this.promoCode=='BSAXC')this.freeCount=50;
else if(this.promoCode=='AS8XC')this.freeCount=75;
else if(this.promoCode=='8X9BA')this.freeCount=100;
else this.freeCount=50;

this.initSignupLandingPage({
pageTitle:'Sign up to get your credits',
pageId:'LandingCreditsPromo',
skelClass:'creditsPromoLanding',
signupTitle:'Create an account to get your '+this.freeCount+' free songs',
showOnlyNoAuthAck:true
});
},

onLandingPageLoad:function(){
this.renderPageData();
},

renderPageData:function(){
$T(lt.CreditsPromoLandingPage.col1,this.twoCol.col1)
.replaceToken('freeCount',this.freeCount)
.compose();

this.renderCol2();
this.signinWidget.setSignUpPromoCode(this.promoCode);
},

onSignedInOrUpCallback:function(){
this.goToLoggedInHome();
}
};
Object.extend(CreditsPromoLandingPage.prototype,SignupLandingPage.prototype,true);
MyMusic.addPageRegex(
'creditspromo',
/creditspromo\/.*$/,
function(pathParts){
return new CreditsPromoLandingPage(pathParts[1]);
});


GiftCardPromoLandingPage=Class.create();
GiftCardPromoLandingPage.prototype={
initialize:function(){
this.initSignupLandingPage({
pageTitle:'Sign up to redeem your gift card',
pageId:'LandingGiftCardPromo',
skelClass:'giftCardPromoLanding',
signupTitle:'Create an account to redeem your gift card',
showOnlyNoAuthAck:true
});
},

onLandingPageLoad:function(){
this.renderPageData();
},

renderPageData:function(){
$T(lt.GiftCardPromoLandingPage.col1,this.twoCol.col1)
.compose();
this.renderCol2();
},

onSignedInOrUpCallback:function(){

Cookies.setFromSignupContext('claimCode');
this.goToLoggedInHome();
}
};
Object.extend(GiftCardPromoLandingPage.prototype,SignupLandingPage.prototype,true);
MyMusic.addPageRegex(
'giftcardpromo',
/giftcardpromo.*$/,
function(pathParts){
return new GiftCardPromoLandingPage();
});




InviteFriend=Class.create();
InviteFriend.prototype={
initialize:function(){
this.initPage({pageTitle:'Invite friends to Lala',authLevel:1,
theme:'purpleTheme',pageId:'InviteFriend',
skelClass:'inviteFriendPage'});
InviteFriend.g=this;


this.first=null;
this.msgToken=null;

this.domains=['gmail.com','aol.com','yahoo.com','hotmail.com'];
},






onLoad:function(pathParts){

this.first=pathParts[1];
if(pathParts[2]){
this.msgToken=pathParts[2];
}

this.renderMain();
},

renderFindFriends:function(isFirst){

},

















renderMain:function(){
$TC(lt.InviteFriend.main,'mainInviteSection');

mojo.event.onEnterKey('emailPassword',this.onSubmitGetAddressBook.lbind(this),false,false);
$('emailUsername').focus();

var split=lala.user.email.split('@');
var user=split[0];
var domain=split[1];
domain.toLowerCase();

if(this.domains.lcontains(domain)){
$('emailUsername').value=user;
$('webmailServices').value=domain.substring(0,domain.length-4);
$('emailPassword').focus();
}
},

onSubmitGetAddressBook:function(){
mojo.css.show('submitFindFriendsImg');
var service=$F('webmailServices');
var username=$F('emailUsername');
var password=$F('emailPassword');

if(mojo.isEmpty(username)){
$('webmailError').innerHTML='Username required';
return;
}else if(mojo.isEmpty(password)){
$('webmailError').innerHTML='Password required';
return;
}

if(username.lcontains('@')){
var newInfo=username.split('@');
var domain=newInfo[1].toLowerCase();
if(this.domains.lcontains(domain)){
username=newInfo[0];
service=domain.substring(0,domain.length-4);
}else{
$('webmailError').innerHTML='Please chooose a valid webmail service';
return;
}
}

this._disableFields();
mojo.css.display('webmailError',false);

var self=this;
api.Friends.getContacts(service,username,password,
function(res){
if(res.data){
self.retrieveContactData();
}else{
$('webmailError').innerHTML='Incorrect username or password';
mojo.css.display('webmailError',true);
self._enableFields();
}
mojo.css.hide('submitFindFriendsImg');
});
},

retrieveContactData:function(){
var self=this;
api.Friends.getContactData(
function(res){
res.data=mojo.evalJson(res.data);
self._enableFields();

if(res.data.members==null&&res.data.emails==null){
$('webmailError').innerHTML='Incorrect username or password';
mojo.css.display('webmailError',true);
}else if(res.data.members.length==0&&res.data.emails.length==0){
$('webmailError').innerHTML='No contacts found, or all your contacts are already your friends.';
mojo.css.display('webmailError',true);
}else{
self.res=res;
self.renderFoundMembers(res.data.members);
}
});
},

_enableFields:function(){
$('findFriends').disabled=false;
$('emailUsername').disabled=false;
$('emailPassword').disabled=false;
$('webmailServices').disabled=false;
},

_disableFields:function(){
$('findFriends').disabled=true;
$('emailUsername').disabled=true;
$('emailPassword').disabled=true;
$('webmailServices').disabled=true;
},

renderFoundMembers:function(members){
if(!(members&&members.length>0)){
this.renderNonMemberContacts();
}
else{
$T(lt.InviteFriend.FriendsFoundList,'mainInviteSection')
.replaceToken('count',members.length)
.replaceToken('s',(members.length>1?'s':''))
.compose();
this.addFriendWidget=new widgets.FriendList({
trackingId:'finderFlow',
renderTargetId:'friendsToAddList',
checkbox:true});
this.addFriendWidget.render(members,'No members found');
if(members.length<5){
mojo.css.removeClass('friendsToAddList','fullHeight');
mojo.geometry.setBounds('friendsToAddList',{height:members.length*70+10});
}else{
mojo.css.addClass('friendsToAddList','fullHeight');
}
}
},

onSelectAllFoundMembers:function(){
this.addFriendWidget.selectOrDeselectAll($F('selectAllFriendsInWidget'));
},

addFoundMembers:function(){
var membersToAdd=this.addFriendWidget.getSelectedUserTokens();
if(membersToAdd.length>0){
api.Friends.addBatch(membersToAdd,function(res){
var s=(membersToAdd.length>=2)?'s':'';
widgets.core.LightDialog.show(
{title:membersToAdd.length+' friend'+s+' requested',
msg:'Once they confirm, you\'ll become friends on '
+'Lala and be able to see '
+'what they\'re listening to.'})
});
}
this.renderNonMemberContacts();
},

renderNonMemberContacts:function(){
var nonMembers=this.res.data.emails;
if(nonMembers.length>0){
var t=$T(lt.InviteFriend.inviteFriendsList,'mainInviteSection');

t.replaceToken('count',nonMembers.length);
t.replaceToken('s',nonMembers.length>1?'s':'');

var row=t.getTokenBlock('TableRow');
for(var i=0;i<nonMembers.length;i++){
row.replaceToken('email',nonMembers[i]);
row.replaceToken('rowNumber',i);
row.replaceToken('oddOrEven',(i%2)?'odd':'even');
row.next();
}
t.compose();
if(nonMembers.length<14){
mojo.css.removeClass('nonMemberFriendsList','fullHeight');
mojo.geometry.setBounds('nonMemberFriendsList',{height:nonMembers.length*25+2});
}else{
mojo.css.addClass('nonMemberFriendsList','fullHeight');
}
}
else{
this.renderMain();
}

},

onSelectAllNonMemberEmails:function(){
var b=$('selectUnselectAll').checked;
var el;
for(var i=0;(el=$('checkbox_'+i));i++){
el.checked=b;
}
},

onSubmitSelectedEmails:function(){
var emails=[];
var el;

for(var i=0;(el=$('checkbox_'+i));i++){
var em=$('email_'+i).innerHTML;
if(!mojo.isEmpty(em)&&el.checked){
emails.push(em);
}
}
var emailFormWidget=new widgets.EmailForm({
type:'invite',
defaultMsg:"Hey, have you tried Lala yet?  It rocks - I'm listening to loads of music, and loving it.",
sendButton:'Send Invites',
ackTmpl:lt.Home.inviteFriendsAck,
renderTargetId:'mainInviteSection'
});
emailFormWidget.onCancel=InviteFriend.g.renderMain.lbind(this);
emailFormWidget.onSend=function(){
MyMusic.g.gotoPage('friends');
}.lbind(this);

emailFormWidget.render();
emailFormWidget.setEmailAddresses(emails);
}
};
Object.extend(InviteFriend.prototype,Page.prototype,true);
MyMusic.addPage(['people/invite','people/find'],function(){return new InviteFriend();});




BlurbsPage=Class.create();
BlurbsPage.prototype={
initialize:function(userToken){
this.initPage({pageTitle:'Blurbs',
pageId:'Blurbs',
skelClass:'blurbsPage',
authLevel:userToken==null?1:0});

this.userToken=userToken;


BlurbsPage.g=this;
},

onLoad:function(){
var self=this;


if(this.userToken){


this.isFromProfilePage=true;
this.userNickName=lala.user?lala.user.nickName:null;
}else{

this.userToken=lala.user.userToken;
this.userNickName=lala.user.nickName
}

if(lala.user&&(this.userToken==lala.user.userToken)){
this.render();
}else{


api.User.getBasicInfo(
this.userToken,
function(res){
self.userNickName=res.data.user.nickName;
self.render(res.data.userEx.isCurrentUserBlockedBy);
});

}
},

render:function(isCurrentUserBlockedBy){
var twoCol=new widgets.core.TwoColumn();
this.renderIntoContentRegion($T(twoCol.render()));

new widgets.Blurbs(
{renderTargetId:twoCol.col1,
paging:true,
showCreate:!isCurrentUserBlockedBy,
title:this.isFromProfilePage?this.userNickName+"'s blurbs":'Blurbs',
userToken:this.userToken}).loadAndRender();

$TC(lt.BlurbsPage.col2,twoCol.col2);
}

};
Object.extend(BlurbsPage.prototype,Page.prototype,true);
MyMusic.addPage('blurbs',function(){return new BlurbsPage();});
MyMusic.addPageRegex('blurbs',/blurbs\/.*/,
function(pathParts){return new BlurbsPage(pathParts[1]);});



DownloadsPage=Class.create();
DownloadsPage.prototype={
initialize:function(){
this.initPage({pageTitle:'Downloads',authLevel:1,
theme:'blueTheme',pageId:'Downloads'});
DownloadsPage.g=this;
this.hasDownloader=null;
this.moverDownloadEnabled=false;
this.isWin=false;
},

onLoad:function(pathParts){
var tabId=pathParts.length>1?pathParts[1]:'new';
this.hasDownloader=LalaMover.isInstalled();
this.moverDownloadEnabled=LalaMover.isDownloadEnabled();
this.isWin=mojo.WIN;
var t=$T(lt.Downloads.skeleton);
this.renderIntoContentRegion(t);

var twoCol=new widgets.core.TwoColumn(
{renderTargetId:'downloadsPage'});
twoCol.render();

$TC(lt.Downloads.col1,twoCol.col1);
$TC(lt.Downloads.col2,twoCol.col2);
var rb=new widgets.core.RoundedBox({
renderTargetId:'downloadsLalaMover'
}).render();
if(this.hasDownloader){
if(this.moverDownloadEnabled){
$TC(lt.Downloads.moverInstalled,rb.contentId);
$TC(lt.Downloads.moverInstalledBottom,rb.bottomContentId);
}else{
$TC(lt.Downloads.moverDisabled,rb.contentId);
}
}else{
$TC(lt.Downloads.lalaMover,rb.contentId);
$T(lt.Downloads.lalaMoverBottom,rb.bottomContentId)
.replaceToken('lalaMoverUrl',LalaMover.getDownloadUrl(this.isWin,true))
.compose();

this.renderDownloadButton();
}
if(this.hasDownloader){
$TC(lt.Downloads.trouble,'downloadsTrouble');
}


var tabs=mojo.newtabs.create({
id:'downloadsTabs',
divTabsId:'downloadsTabsContainer',
divTabsContentId:'downloadsTabsContent'});

tabs.add({id:'new',
title:'To be downloaded',
path:frontend.path.NewDownloads()});
tabs.add({id:'old',
title:'Already downloaded',
path:frontend.path.OldDownloads()});
var self=this;
tabs.onTabClick=function(tab){
self['render'+tab.id.ltoFirstUpperCase()+'Content'](tab.contentId);

}
tabs.activate(tabId);
},

renderNewContent:function(renderTargetId){
$T(lt.Downloads.main,renderTargetId)
.compose();
var self=this;
api.Playlists.getSongs({id:'mp3sForDownload'},
function(res){
self.renderTracks(res,false);
},{sortKey:'AddedTimestamp',sortDir:'Desc'},20);
},

renderOldContent:function(renderTargetId){
$T(lt.Downloads.main,renderTargetId)
.compose();
var self=this;
api.Playlists.getSongs({id:'downloadedMp3s'},
function(res){
self.renderTracks(res,true);
},{sortKey:'AddedTimestamp',sortDir:'Desc'},20);
},

renderTracks:function(res,isOld){
var pagedList=res.data.tracks;
this.songs=pagedList.list;
this.skip=pagedList.skip;

if(!isOld)DataModel.g.setPendingCount('Download',pagedList.total);
if(this.songs.length==0){
if(isOld){
$TC(lt.Downloads.emptyOldMsg,'downloadsMsg');
}else{
$TC(lt.Downloads.emptyNewMsg,'downloadsMsg');
}
if(!this.hasDownloader)$D('downloadsLalaMover');
return;
}else{
if(isOld){
$T(lt.Downloads.oldMsg,'downloadsMsg')
.removeTokenBlock(this.hasDownloader
?'NotInstalled':'MoverInstalled')
.compose();
}else{
var t=$T(lt.Downloads.newMsg,'downloadsMsg');
if(this.hasDownloader){
t.removeTokenBlock('LalaMoverBlock');
}
t.compose();
}
}

var t=$T(lt.Downloads.songList,'downloadsTracks');
t.replaceToken('showDownloadButton',isOld?'none':'');
var songBlock=t.getTokenBlock('SongBlock');
for(var i=0;i<this.songs.length;i++){
var song=this.songs[i];
songBlock.replaceToken('num',this.skip+i+1);
songBlock.replaceToken('time',
widgets.SongList.renderDuration(song,null,true));
songBlock.replaceToken('title',song.title
?song.title.lescapeHTML():'Currently unavailable');
songBlock.replaceToken('purchaseDate',new Date(parseFloat(song.timestamp)).lformat('%n/%e/%Y'))
songBlock.replaceToken('index',i);
songBlock.replaceTokensWithBean('song',song);
songBlock.next();
}
t.compose();
new widgets.core.Paginator('downloadsPaginator_bottom','big',
'downloadsPaginator_top','lite')
.renderTwo(res,pagedList);

if(isOld){
if(this.hasDownloader){
$D('downloadsLalaMover',false);
}else{
$D('downloadsLalaMover');
}
}else{
$D('downloadsLalaMover');
}

},


onDownload:function(index,elem){
var song=this.songs[index];
api.Player.getDownloadUrls(
song.syncToken,
function(res){
lala.Track.click('downloads.viaWeb');
widgets.core.DownloadDialog.g.showInstructions(
res.data[0].url,
{onDownloadFinished:function(){
$S('downloadCellSpan_'+index,
$TC(lt.Downloads.downloadFinished));
}});
});
},


onDownloadAll:function(){
$('downloadAllButton').disabled=true;
api.Playlists.getSongs(
{id:'mp3sForDownload'},
function(res){
var pagedList=res.data.tracks;
if(pagedList.list.length==0)return;
api.Player.getDownloadUrls(pagedList.list.lpluck('syncToken'),
function(res){
lala.Track.click('downloads.viaPluginAll');
res.data.leach(function(obj,index){
pagedList.list[index].syncUrl=obj.url;
});
LalaMover.downloadSongs(pagedList.list);
},'POST');
},{sortKey:'AddedTimestamp',sortDir:'Desc'},1000);
},

onDownloadMusicMover:function(){
if(frontend.requiresSignin())return;
lala.Track.click('downloadMover');
lala.Track.flushCounters();

window.location=LalaMover.getDownloadUrl(this.isWin,true);
},

onPlaySong:function(index){
var pagePath=MyMusic.g.getPagePath();
var song=this.songs[index];
Player.g.playSong(song,'downloads');
},

onPlayButtonHover:function(index,size,button,evt){
var song=this.songs[index];
var offsets={};
if(mojo.MAC&&mojo.FF3){
offsets.top=-1;
}else if(mojo.FF2){
offsets.top=-2;
}else if(mojo.FF3){
offsets.top=-3;
}else if(mojo.IE7){
offsets.top=-2;
}else if(mojo.SAFARI){
offsets.top=-3;
}else if(mojo.CHROME){
offsets.top=-1;
}
widgets.core.PlayButtonHover.open(size,song,button,evt,offsets,null,'Downloads');
},

renderDownloadButton:function(){
var t=mojo.template.create(lt.Downloads.lalaMoverDownload,'lalaMoverDownload');
var platform;
var versionId;
var platformRequirements;

if(this.isWin){
platform="Windows";
versionId=g_pageData["mover_win_version"];
t.replaceToken('otherPlatform','Mac');
platformRequirements='Internet Explorer 6.0 / Firefox 2.0 and Windows XP or later';
}else{
platform="Mac";
versionId=g_pageData["mover_mac_version"];
t.replaceToken('otherPlatform','Windows');
platformRequirements='Safari 3.0 / Firefox 2.0 and OS X v10.4 or later';
}
t.replaceToken('platform',platform);
t.replaceToken('versionId',versionId);
t.replaceToken('platformRequirements',platformRequirements);
t.replaceToken('lalaMoverUrl',frontend.url.MusicMoverDownloader());
t.compose();
},

onSwitch:function(){
this.isWin=!this.isWin;
this.renderDownloadButton();
}
};
Object.extend(DownloadsPage.prototype,Page.prototype,true);
MyMusic.addPage('downloads',function(){return new DownloadsPage();});




SxswPage=Class.create();
SxswPage.prototype={
initialize:function(){
this.initPage({
pageId:'Sxsw',
skelClass:'sxswPage',
pageTitle:'SXSW 2009'
});

SxswPage.g=this;
},

onLoad:function(){
var self=this;
this.renderPage();
api.Sxsw.getCol1Data(
function(res){
self.paste=res.data.paste;
self.filter=res.data.filter;
self.grid=res.data.grid;
self.renderCol1();
});
api.Sxsw.getCol2Data(
function(res){
self.lalaPlaylist=res.data.lalaPlaylist.A;
self.lalaTracks=res.data.lalaPlaylist.B;
self.spinPlaylist=res.data.spinPlaylist.A;
self.spinTracks=res.data.spinPlaylist.B;
self.gvbPlaylist=res.data.gvbPlaylist.A;
self.gvbTracks=res.data.gvbPlaylist.B;

self.renderCol2();
});

},

renderPage:function(){
this.renderIntoContentRegion($T(lt.Sxsw.skel));
this.twoCol=new widgets.core.TwoColumn({renderTargetId:'sxswTwoCol'});
this.twoCol.render();
},

renderCol1:function(){
$TC(lt.Sxsw.col1,this.twoCol.col1);
this.renderPaste();
this.renderFilter();
this.renderGrid();
},

renderCol2:function(){
$TC(lt.Sxsw.col2,this.twoCol.col2);
this.renderGreenBox();


this.playlist5Packs={
'spin':{
playlist:this.spinPlaylist,
creator:'SPIN Magazine',
tracks:this.spinTracks,
title:'SPIN Magazine\'s<br>5 SXSW picks',
imgPath:'partner_spin',
link:'http://www.spin.com/articles/get-5-mp3s-spin-approved-sxsw-bands-two-bucks',
linkText:'Learn more at spin.com'
},
'lala':{
playlist:this.lalaPlaylist,
creator:'Lala',
tracks:this.lalaTracks,
title:'Lala\'s<br>5 SXSW picks',
imgPath:'lalachiclet_48'
},
'gvb':{
playlist:this.gvbPlaylist,
creator:'Gorilla vs. Bear',
tracks:this.gvbTracks,
title:'Gorilla vs. Bear\'s<br>5 SXSW picks',
imgPath:'partner_gorillavsbear',
link:'http://www.gorillavsbear.net',
linkText:'www.gorillavsbear.net'
}
}
this.render5Packs();
},

renderPaste:function(){
var pageTemplate=lt.Sxsw.carouselThumb;
var w=new widgets.core.Carousel({
resizeContainerId:$(this.twoCol.col1).parentNode,
contents:[{
title:$TC(lt.Sxsw.pasteTitle),
trackingId:'sxsw.pasteCarousel',
list:this.paste
}],
numCols:4,
renderTargetId:'pasteCarousel',
pageTemplate:pageTemplate,
itemRenderFunction:function(itemTemplate,item,trackingId){
itemTemplate.replaceToken(
'itemContent',
$T(pageTemplate)
.replaceTokensWithBean('item',item)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('mp3Price',mojo.util.formatPrice(item.downloadAlbumPriceInCents))
.replaceToken('webPrice',mojo.util.formatPrice(item.webAlbumPriceInCents))
.removeTokenBlock('WebPriceBlock',item.webAlbumPriceInCents<=0)
.removeTokenBlock('MP3PriceBlock',item.downloadAlbumPriceInCents<=0)
.compose());
},
thumbHeight:135});
w.render();
},

renderFilter:function(){
var pageTemplate=lt.Sxsw.carouselThumb;
var w=new widgets.core.Carousel({
resizeContainerId:$(this.twoCol.col1).parentNode,
contents:[{
title:$TC(lt.Sxsw.filterTitle),
trackingId:'sxsw.filterCarousel',
list:this.filter
}],
numCols:4,
renderTargetId:'filterCarousel',
pageTemplate:pageTemplate,
itemRenderFunction:function(itemTemplate,item,trackingId){
itemTemplate.replaceToken(
'itemContent',
$T(pageTemplate)
.replaceTokensWithBean('item',item)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('mp3Price',mojo.util.formatPrice(item.downloadAlbumPriceInCents))
.replaceToken('webPrice',mojo.util.formatPrice(item.webAlbumPriceInCents))
.removeTokenBlock('WebPriceBlock',item.webAlbumPriceInCents<=0)
.removeTokenBlock('MP3PriceBlock',item.downloadAlbumPriceInCents<=0)
.compose());
},
thumbHeight:135});
w.render();
},

renderGrid:function(){
$TC(lt.Sxsw.grid,'sxswGrid');
new widgets.AlbumList({
renderTargetId:'gridContent',
showPriceField:true,
hideYear:true
}).render(this.grid);
},

renderGreenBox:function(){
$TC(lt.Sxsw.greenBox,'greenBox');
},

render5Packs:function(){
for(var id in this.playlist5Packs){
var data=this.playlist5Packs[id];
this.render5PackPlaylist(
id,data.playlist,
data.tracks,data.title,data.imgPath,data.link,data.linkText);
}
this.renderAll5PackPurchaseBoxes();
},

render5PackPlaylist:function(id,playlist,tracks,title,imgPath,link,linkText){

var topOffset;
if(mojo.IE6){
topOffset=0;
}else if(mojo.CHROME){
topOffset=-1;
}else if(mojo.MAC&&mojo.FF){
topOffset=-4;
}else if(mojo.IE){
topOffset=-2;
}else{
topOffset=-3;
}

if(mojo.DEV_FLAG&&tracks.total>5){
tracks.total=5;
tracks.list.length=5;
}

$T(lt.Sxsw.playlist,id)
.replaceToken('id',id)
.replaceToken('title',title)
.replaceToken('image',imgPath)
.replaceToken('link',link)
.replaceToken('linkText',linkText)
.removeTokenBlock('LinkBlock',link==null)
.compose();

new widgets.SongList({
renderTargetId:'songList'+id,
layout:'simple',
hideDuration:true,
hideNum:true,
hideAlbum:true,
showListens:false,
showPrice:false,
showBuyActions:false,
hideAddedTransient:true,
offsets:{top:topOffset}
}).render(tracks.list.slice(0,5));
},



renderAll5PackPurchaseBoxes:function(){
var self=this;
for(var id in this.playlist5Packs){
var config=this.playlist5Packs[id];
var playlist=config.playlist;
var tracks=config.tracks;



if(!playlist.purchaseUtil){

playlist.nickName=config.creator;
playlist.purchaseUtil=
new PurchasePlaylistTracksUtil(
playlist,tracks,
function(){self.renderAll5PackPurchaseBoxes()});
}

var undownloadedCount=playlist.purchaseUtil.unDownloadedTracksCount;
var downloadedCount=playlist.purchaseUtil.totalDownloadableTracks-undownloadedCount;
var priceDisplay=playlist.purchaseUtil.unDownloadedTracksPrice;
var buyCountDisplay=undownloadedCount;
var buyButtonCountDisplay=undownloadedCount==5?'all 5':undownloadedCount;

if(undownloadedCount==0){


buyCountDisplay=5;
priceDisplay=200;
buyButtonCountDisplay='all 5';
}

$T(lt.Sxsw.playlistPurchaseBox,'buyBox_'+id)
.replaceToken('id',id)
.replaceToken('buyCount',buyCountDisplay)
.replaceToken('haveCount',downloadedCount)
.keepTokenBlock('HaveAllBlock',undownloadedCount==0)
.keepTokenBlock('HaveSomeBlock',undownloadedCount>0&&undownloadedCount<5)
.replaceToken('buttonDisable',undownloadedCount==0?'lbuttonDisabled':'')
.replaceToken('buttonDisableClick',undownloadedCount==0?'return false':'')
.replaceToken('buyButtonCount',buyButtonCountDisplay)
.replaceToken('price',mojo.util.formatPrice(priceDisplay))
.compose();
}
},

onPurchase5Pack:function(id){
lala.Track.clientPageInteraction('5PackPurchase');

var playlist=this.playlist5Packs[id].playlist;
widgets.store.openBuyDownloadPlaylistDialog(playlist);
}
};
Object.extend(SxswPage.prototype,Page.prototype,true);
MyMusic.addPage('sxsw',function(){return new SxswPage();});




GiftsRecosPage=Class.create();
GiftsRecosPage.prototype={
initialize:function(){
this.initPage({pageTitle:'Gifts and Recommendations',
authLevel:1,
pageId:'GiftsRecos',
skelClass:'giftsRecosPage'});
GiftsRecosPage.g=this;
this.commentWidgets=[];
this.messagesByToken={};
this.pageCount=10;
this.tabs=null;
this.newItems={};
},

onLoad:function(pathParts){
this.pathParts=pathParts;
var twoCol=new widgets.core.TwoColumn();
this.renderIntoContentRegion($T(twoCol.render()));

$TC(lt.GiftsRecos.col1,twoCol.col1);
this.twoCol=twoCol;
this.renderPage();

this.addSongWidgetListener_Init();
},

renderPage:function(){
this.tabs=mojo.newtabs.create({
id:'giftsRecosTabs',
divTabsId:'giftsRecosTabsContainer',
divTabsContentId:'giftsRecosTabsContent'});
this.tabs.add({id:'gifts',
title:"Gifts",
path:frontend.path.Gifts()});
this.tabs.add({id:'recos',
title:"Recommendations",
path:frontend.path.Recos()});
var self=this;
this.tabs.onTabClick=function(tab){
self['render'+tab.id.ltoFirstUpperCase()+'Content'](tab.contentId);
};
this.tabs.activate(this.pathParts.length>0?this.pathParts[0]:'gifts');
},

renderGiftsContent:function(renderTargetId){
$TC(lt.GiftsRecos.giftsMain,renderTargetId);
var tabs=mojo.newtabs.create({
divTabsId:'giftsTabs',
divTabsContentId:'giftsTabsContent',
usePipedTabs:true
});
tabs.add({
id:'giftsReceived',
title:"Received",
path:frontend.path.GiftsReceived()
});
tabs.add({
id:'giftsSent',
title:"Sent",
path:frontend.path.GiftsSent()
});
var self=this;
tabs.onTabClick=function(tab){
self['render'+tab.id.ltoFirstUpperCase()+'Content'](tab.contentId);
};
tabs.activate(this.pathParts.length>1?'gifts'+this.pathParts[1].ltoFirstUpperCase():'giftsReceived');
$TC(lt.GiftsRecos.giftsCol2,this.twoCol.col2);
},

renderRecosContent:function(renderTargetId){
$TC(lt.GiftsRecos.recosMain,renderTargetId);
var tabs=mojo.newtabs.create(
{divTabsId:'recosTabs',
divTabsContentId:'recosTabsContent',
usePipedTabs:true});
tabs.add({id:'recosReceived',
title:"Received",
path:frontend.path.RecosReceived()});
tabs.add({id:'recosSent',
title:"Sent",
path:frontend.path.RecosSent()});
var self=this;
tabs.onTabClick=function(tab){
self['render'+tab.id.ltoFirstUpperCase()+'Content'](tab.contentId);
};
tabs.activate(this.pathParts.length>1?'recos'+this.pathParts[1].ltoFirstUpperCase():'recosReceived');
$TC(lt.GiftsRecos.recosCol2,this.twoCol.col2);
},

renderRecosSentContent:function(renderTargetId){
var self=this;
api.Shares.getSentShares(
function(res){
self.newItems={};
res.data.recos.list.leach(function(share){
self.messagesByToken[share.token]=share;
share.comments.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
});
self.renderList(renderTargetId,res,false,true);
},
this.pageCount);
},

renderRecosReceivedContent:function(renderTargetId){
var self=this;
api.Shares.getShares(
function(res){
self.newItems={};
res.data.newRecos.leach(function(i){
self.newItems[i]=true;
});
res.data.recos.list.leach(function(share){
self.messagesByToken[share.token]=share;
share.comments.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
});
self.renderList(renderTargetId,res,true,true);
DataModel.g.setPendingCount('Reco',0);
},
this.pageCount);
},

renderGiftsSentContent:function(renderTargetId){
var self=this;
api.Gifts.getSentGifts(
function(res){
self.newItems={};
res.data.gifts.list.leach(function(gift){
self.messagesByToken[gift.token]=gift;
gift.comments.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
});
self.renderList(renderTargetId,res,false);
},
this.pageCount);
},

renderGiftsReceivedContent:function(renderTargetId){
var self=this;
api.Gifts.getGifts(
function(res){
self.newItems={};
res.data.newGifts.leach(function(i){
self.newItems[i]=true;
});
res.data.gifts.list.leach(function(gift){
self.messagesByToken[gift.token]=gift;
gift.comments.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
});
DataModel.g.setPendingCount('Gift',0);
self.renderList(renderTargetId,res,true);
});
},

renderList:function(renderTargetId,res,isReceived,isReco){
var isSent=!isReceived;
var pagedList;
if(isReco){
pagedList=res.data.recos;
this.recos=pagedList.list;
}else{
pagedList=res.data.gifts;
this.gifts=pagedList.list;
}

var stuff=isReco?this.recos:this.gifts;
var label=isReco?'reco':'gift';

if(stuff.length==0){
var tmplName=label+(isReceived?'EmptyReceivedMsg':'EmptySentMsg');
$TC(lt.GiftsRecos[tmplName],renderTargetId);
}else{
$T(lt.GiftsRecos.tabsContent,renderTargetId)
.replaceToken('what',isReco?'recos':'gifts')
.compose();
var t=$T(lt.Core.post,'tabsContent_'+label+'s');
var self=this;
stuff.leach(function(item,i){
var postContent=$T(lt.GiftsRecos.postContent)
.replaceToken('index',i);

if(item.type&&item.type=='GiftCard'){
postContent=self.getGiftCard(item,isSent,i,postContent);
}else if(item.track){
postContent=self.getSong(item,isReco,isSent,i,label,postContent);
}else if(item.disc){
postContent=self.getAlbum(item,isSent,postContent);
}else if(item.artist){
postContent=self.getArtist(item,postContent);
}else if(item.playlist){
postContent=self.getPlaylist(item,postContent);
}else{
mojo.log.error("Unknown share item type: "+item.type,item);
}


var targetId=label+'CommentsPod_'+i;
var onSubmitName='onSubmit'+label.ltoFirstUpperCase()+'Comment';
var w=new CommentWideWidget({
renderTargetId:targetId,
onSubmit:function(comment){self[onSubmitName](i,comment);},
onEditComment:function(msgToken){
self.onEditComment(msgToken);
},
onDeleteComment:function(msgToken){
self.onDeleteComment(i,msgToken);
}
});
var isUpdated=item.comments.total>0;
postContent.replaceToken('noteSection',w.renderMessage(item,!isUpdated));


var date=isUpdated
?'Updated: '+item.comments.list[item.comments.total-1].lastModTime.lgetDaysAgoLabel('Today',false,false,widgets.core.postFormat)
:new Date(parseFloat(item.timestamp)).lgetDaysAgoLabel('Today',false,false,widgets.core.postFormat);
if(!item.user)item.user={};
t.replaceTokensWithBean('user',item.user)
.replaceToken('clickTrackingId',label+'Page')
.replaceToken('date',date)
.replaceToken('msgToken',item.token)
.replaceToken('postTitle',self.getTitle(item,isReco,isSent,label,i))
.replaceToken('postContent',postContent.compose())
.replaceToken('commentsPod',w.getHtml(item.comments.total,item.comments.list))
.replaceToken('commentsPodId',label+'CommentsPod_'+i)
.replaceToken('isNewPost',self.newItems[item.lalaId]?'inline':'none')
.next();
self.commentWidgets[i]=w;
});
t.compose();
}
new widgets.core.Paginator(label+'sPaginator_bottom','big',
label+'sPaginator_top','lite')
.renderTwo(res,pagedList);
},

getTitle:function(item,isReco,isSent,label,index){
var postTitle=$T(lt.GiftsRecos.postTitle);

if(isReco){
postTitle.removeTokenBlock('StatusBlock');
}else{
var status='';
if(item.giftCard){
if(item.giftCard.isClaimed){
status='claimed';
}else{
status='pending';
}
}else{
if(isSent&&item.status!='pending'){
status='received';
}else{
status=item.status;
}
}
postTitle.replaceToken('giftStatus',status);
}

if(!item.user.userToken){
var anonName='';
if(item.giftCard&&item.giftCard.receiverType=='PRINT'){
anonName=item.giftCard.receiverName;
}else if(item.giftCard&&item.giftCard.receiverType=='EMAIL'){
anonName=$T(lt.GiftsRecos.emailGiftCardTitle)
.replaceToken('receiverName',item.giftCard.receiverName)
.replaceToken('receiverEmail',item.giftCard.receiverEmail)
.compose();
}else{
anonName=$T(lt.GiftsRecos.anonTitle)
.replaceToken('what',label.ltoFirstUpperCase())
.compose();
}
postTitle.replaceTokenBlock('NameBlock',anonName);
}

return postTitle.replaceToken('toFrom',isSent?'To':'From')
.replaceToken('giftOrReco',label)
.replaceTokensWithBean('item',item)
.replaceToken('index',index)
.compose();
},


getSong:function(item,isReco,isSent,index,label,skel){
var icon=$T(lt.GiftsRecos.songIcon)
.replaceToken('giftOrReco',label.ltoFirstUpperCase())
.replaceToken('playIconType',item.track.playType=='NotPlayable'?'dim':'full')
.replaceToken('playable',item.track.playType!='NotPlayable')
.replaceToken('title',item.track.playType=='NotPlayable'
?"This track is currently not licensed for listening on Lala"
:'Play this song')
.replaceToken('index',index)
.compose();

var title=item.track.title?item.track.title.lescapeHTML()
:'Currently unavailable';
var content=$T(lt.GiftsRecos.songContent)
.replaceTokensWithBean('item',item)
.replaceToken('title',title)
.removeTokenBlock(isReco?'GiftBlock':'RecoBlock');

if(!isReco&&!isSent&&item.status=='pending'){
var actions=$T(lt.GiftsRecos.giftActions)
.replaceToken('index',index)
.replaceToken('songId',item.track.linkSongLalaId);

if(item.track.isDigied){
actions.removeTokenBlock('AcceptBlock');
}else{
actions.removeTokenBlock('YouOwnBlock');
}

skel.replaceToken('actions',actions.compose());
}else{
skel.removeTokenBlock('ActionsBlock');
}

return skel.replaceToken('content',content.compose())
.replaceToken('icon',icon)
.replaceToken('iconClass','playIcon');
},


getAlbum:function(item,isSent,skel){
var icon=$T(lt.GiftsRecos.albumRecoIcon)
.replaceTokensWithBean('item',item)
.compose();

var content=$T(lt.GiftsRecos.albumReco)
.replaceTokensWithBean('item',item)
.compose();

return skel.replaceToken('content',content)
.replaceToken('iconClass','albumCover')
.replaceToken('icon',icon)
.removeTokenBlock('ActionsBlock');
},


getArtist:function(item,skel){
var artist=item.artist;
var content=new widgets.ArtistList({
clickTrackingId:'artistReco',
msgToken:item.token,
hideNumber:true
}).getRowsHtml([artist]);

return skel.replaceToken('content',content)
.replaceToken('iconClass','lnone')
.replaceToken('icon','')
.removeTokenBlock('ActionsBlock');
},


getPlaylist:function(item,skel){
var playlist=item.playlist;
var content=new widgets.PlaylistList({
clickTrackingId:'playlistReco',
trackingId:'playlistReco',
layout:'wide',
hideNumber:true,
hideArtist:true,
hideMember:true,
useLargeIcon:true,
msgToken:item.token
}).getHtml([playlist]);


return skel.replaceToken('content',content)
.replaceToken('iconClass','lnone')
.replaceToken('icon','')
.removeTokenBlock('ActionsBlock');
},

getGiftCard:function(item,isSent,index,skel){
var giftCard=item.giftCard;
var isEmail=giftCard.receiverType=='EMAIL';
var isPrint=giftCard.receiverType=='PRINT';

var content=$T(lt.GiftsRecos.giftCardContent)
.replaceToken('value',mojo.util.formatPrice(giftCard.valueInCents));

if(!giftCard.isClaimed){
if(isEmail||isPrint){
content.replaceToken('code',giftCard.code);
}
if(isPrint){

skel.replaceToken('actions',$T(lt.GiftsRecos.printGiftCardAction)
.replaceToken('index',index)
.compose());
}else if(!isSent){
skel.replaceToken('actions',$T(lt.GiftsRecos.acceptGiftCardAction)
.replaceToken('index',index)
.compose());
}
}

if(giftCard.isClaimed||!(isEmail||isPrint)){
content.removeTokenBlock('ClaimCodeBlock');
}

var type='';
if(isEmail){
type='to email';
}else if(isPrint){
type='printed';
}else{
type='to member';
}
content.replaceToken('type',type);

return skel.replaceToken('content',content.compose())
.replaceToken('icon',$TC(lt.GiftsRecos.giftCardIcon))
.replaceToken('iconClass','giftCardImg')
.replaceToken('tableClass','giftCardContent');
},

onPlayGift:function(index){
var song=this.gifts[index].track;
Player.g.playSong(song,'gift');
},

onPlayReco:function(index){
var song=this.recos[index].track;
Player.g.playSong(song,'reco');
},

onGiftPlayButtonHover:function(index,button,evt){
var song=this.gifts[index].track;
var acceptLink=null;
if(this.gifts[index].status=='pending'){
acceptLink=$T(lt.GiftsRecos.acceptGiftHoverLink)
.replaceToken('onAccept','GiftsRecosPage.g.onAcceptSongGift('+index+')')
.compose();
}
this._openPlayButtonHover(song,button,evt,acceptLink);
},

onRecoPlayButtonHover:function(index,button,evt){
var song=this.recos[index].track;
this._openPlayButtonHover(song,button,evt);
},

_openPlayButtonHover:function(song,button,evt,customLink){
var offsets={};
if(mojo.FF2){
offsets.top=-2;
}else if(mojo.FF3){
offsets.top=-2;
}else if(mojo.WEBKIT){
offsets.top=1;
}
widgets.core.PlayButtonHover.open('large',song,button,evt,offsets,customLink,'Giftshares');
},

onSubmitRecoComment:function(index,comment){
var reco=this.recos[index];
var self=this;
api.Shares.addComment({
shareToken:reco.token,
generateLinks:true,
text:comment
},
function(){
api.Shares.getComments(
reco.token,
function(res){
res.data.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
var w=self.commentWidgets[index];
$S('recoCommentsPod_'+index,w.getHtml(res.data.total,res.data.list));

w.displayComments();
});
});
},

onSubmitGiftComment:function(index,comment){
var gift=this.gifts[index];
var self=this;
api.Gifts.addComment({
giftToken:gift.giftToken,
generateLinks:true,
text:comment
},
function(){
api.Gifts.getComments(
gift.giftToken,
function(res){
res.data.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
var w=self.commentWidgets[index];
$S('giftCommentsPod_'+index,w.getHtml(res.data.total,res.data.list));

w.displayComments();
});
});
},

onPrintGiftCard:function(index){
var gift=this.gifts[index];
widgets.core.GiftCards.openPrintWindow(gift.giftCard.lalaId);
},

onAcceptGiftCard:function(index){
var gift=this.gifts[index];
var self=this;

api.Gifts.acceptGift(gift.lalaId,function(){
api.MicroWallet.updateWallet({
balance:(gift.giftCard.valueInCents+api.MicroWallet.balance)
});
var d=new MojoDialog({
id:'giftClaimDialog',
title:'Gift card added'
});
d.open($T(lt.Core.claimCodeDialogSuccess)
.replaceToken('amountAdded',mojo.util.formatPrice(gift.giftCard.valueInCents))
.replaceToken('totalAmount',mojo.util.formatPrice(api.MicroWallet.balance))
.compose());
self.updateStatus(GiftsRecosPage.CLAIMED,index);
self.commentWidgets[index].displaySubmitComment();
});
},

onAcceptSongGift:function(index){
widgets.core.PlayButtonHover.close();

var gift=this.gifts[index];
gift.status='in process';
var self=this;
api.Gifts.acceptGift(gift.lalaId,function(res){
mojo.listeners.notify(api.MicroWallet.EVT_BUYSONG_CHANGE,
{songs:res.data.result});
gift.status='received';
self.updateStatus(GiftsRecosPage.ACCEPTED,index);
self.commentWidgets[index].displaySubmitComment();
});
},

onExchangeGift:function(index){
var gift=this.gifts[index];
var self=this;
api.Gifts.exchangeGift(gift.lalaId,function(res){
self.updateStatus(GiftsRecosPage.EXCHANGED,index);
if(!DataModel.g.getUserPreference('exchangeGiftDialogSeen',false)){
var d=new MojoDialog({
title:'Gift exchange',
id:'exchangeGiftDialog'});
d.open($TC(lt.GiftsRecos.exchangeGiftDialog));
DataModel.g.setUserPreference('exchangeGiftDialogSeen',true);
}
});
},

updateStatus:function(newStatus,index){
$S('giftActions_'+index,'');
$S('status_'+index,newStatus);
this.gifts[index].status=newStatus;
},

onEditComment:function(msgToken){
var content=$T(lt.GiftsRecos.editComment)
.replaceToken('commentText',this.messagesByToken[msgToken].origText)
.replaceToken('msgToken',msgToken)
.compose();

new MojoDialog({
title:"Edit comment",
id:"editCommentDialog"})
.open(content);
},

onDeleteComment:function(index,msgToken){
if(confirm("Delete this comment?")){
var self=this;
api.Messaging.deleteReply({msgToken:msgToken,onResponse:function(res){
delete self.messagesByToken[msgToken];
self.commentWidgets[index].deleteComment(msgToken);
}});
}
},

submitEditComment:function(msgToken){
var self=this;
var newText=$F('editCommentTextArea');
if(newText==this.messagesByToken[msgToken].origText){
MojoDialog.close();
return;
}
api.Messaging.updateReply({
msgToken:msgToken,
text:newText,
generateLinks:true,
onResponse:function(res){
self.messagesByToken[msgToken]=res.data;
$S('commentText_'+msgToken,res.data.text);
MojoDialog.close();
}
});
},


addSongWidgetListener_GetSongByLinkLalaId:function(linkSongLalaId){

var songArray=this[this.tabs.active.id];
var song=songArray.lfindObjectWithSubKey('track','linkSongLalaId',linkSongLalaId);
if(song)song=song.track;

return song;
},

addSongWidgetListener_SongAddedCallback:function(song){
if(this.gifts){
var songGifts=this.gifts.lfindIfWithSubKey('track','linkSongLalaId',song.linkSongLalaId);

songGifts.leach(function(gift,index){
if(gift.status==GiftsRecosPage.PENDING){
var acceptButton=$('acceptButton_'+index+'_'+gift.track.linkSongLalaId);
if(acceptButton){
$S(acceptButton,
'<span class="youOwn">You own this</span>');
}
}
});
}
}
};
GiftsRecosPage.PENDING='pending';
GiftsRecosPage.ACCEPTED='accepted';
GiftsRecosPage.EXCHANGED='exchanged';
GiftsRecosPage.CLAIMED='claimed';

Object.extend(GiftsRecosPage.prototype,Page.prototype,true);
Object.extend(GiftsRecosPage.prototype,AddSongWidgetListener,true);
MyMusic.addPage('gifts',function(){return new GiftsRecosPage();});
MyMusic.addPage('recos',function(){return new GiftsRecosPage();});







ShoppingCartPage=Class.create();
ShoppingCartPage.prototype={
initialize:function(){
this.initPage({authLevel:2,
pageTitle:'Shopping Cart',pageId:'ShoppingCart',
skelClass:'shoppingCartView'});
ShoppingCartPage.g=this;
},

onLoad:function(){
var t=$T(lt.ShoppingCart.main);
this.renderIntoContentRegion(t);
api.Store.getShoppingCart(this.cartDataIsReady.lbind(this));
},

cartDataIsReady:function(res){
var cart=res.data;
this.render(cart);
},

onUpdateDone:function(){
var elem=$('shoppingCartCount');
if(elem)elem.innerHTML=api.Store.cart.count;
var s=$('s');
if(s)s.innerHTML=api.Store.cart.count==1?'':'s';
},

render:function(cart){
var self=this;
this.cart=cart;
if(!this.cart||this.cart.items.length==0){
$TC(lt.ShoppingCart.cartEmpty,'cartContent');
return;
}
var t=$T(lt.ShoppingCart.cart,'cartContent')
.replaceToken('cartCount',api.Store.cart.count)
.replaceToken('s',api.Store.cart.count==1?'':'s');
this.cart.taxTotal=this.cart.taxTotal.toFixed(2);
this.cart.shippingTotal=this.cart.shippingTotal.toFixed(2);
var totalCount=this._getTotalItems();
t.replaceTokensWithBean('cart',this.cart);
t.replaceToken('cartCount',totalCount);

this.renderItems(t);
t.compose();

this.cart.items.leach(function(item){
mojo.event.onEnterKey('cartitem'+item.token,
self.onUpdate.lbind(self));
});
},

onSubmit:function(){
widgets.store.openBuyCartDialog(function(){
$TC(lt.ShoppingCart.ack,'cartContent');
});
},

_getTotalItems:function(){
var total=0;
for(var i=0;i<this.cart.items.length;i++){
var item=this.cart.items[i];

total+=item.quantity;
}
return total;
},

renderItems:function(t){
var row=t.getTokenBlock('ItemBlock');

for(var i=0;i<this.cart.items.length;i++){
if(i==this.cart.items.length-1){
row.replaceToken('lastOne','lastOne');
}
var item=this.cart.items[i];
row.replaceTokensWithBean('item',item);
var desc=$T(lt.ShoppingCart.item);
desc.replaceToken('price',item.price);

if(item.type=='PhysicalDiscGroup'){
var groupItem;
for(var k=0;k<item.items.length;k++){
groupItem=item.items[k];
if(groupItem.type=='WebAlbum'){
desc.replaceTokensWithBean('album',groupItem);
desc.replaceToken('albumId',groupItem.discid);
}else if(groupItem.type=='PhysicalDisc'){
if(groupItem.nbdisc>1){
desc.replaceToken('nbdisc',groupItem.nbdisc+' ');
desc.replaceToken('set',' set');
}
}
}
desc.replaceToken('freeWebAlbum',' + FREE Web album');
}else if(item.type=='PhysicalDisc'){
if(item.nbdisc>1){
desc.replaceToken('nbdisc',item.nbdisc+' ');
desc.replaceToken('set',' set');
}else{
desc.removeTokenBlock('ExtraBlock');
}
desc.replaceTokensWithBean('album',item);
desc.replaceToken('albumId',item.id);
}else{
mojo.log.error('unsupported type: '+item.type);
}
row.replaceToken('itemDescription',desc.compose());

row.next();
}
},



onDelete:function(token){
var self=this;
var onDelete=function(res){
self.onUpdateResponseNormal(
{data:{cart:res.data,failedTokens:[]}});
};
api.Store.deleteFromCart(token,onDelete);
},


onUpdate:function(onResponse){
if(!onResponse)onResponse=this.onUpdateResponseNormal.lbind(this);

var self=this;

var changeItems=[];
var changeQuantities=[];
for(var i=0;i<this.cart.items.length;i++){
var item=this.cart.items[i];
if(item.type=='Coupon'){
continue;
}


var field=$('cartitem'+item.token).value;
if(field==''){
return false;
}
var quantity=parseInt($F('cartitem'+item.token));
if(!(quantity>=0)){
alert('Please enter a valid quantity');
return false;
}
if(item.quantity!=quantity){
if(quantity==0){
this.onDelete(item.id);
}else{
changeItems.push(item.token);
changeQuantities.push(quantity);
}
}
}

if(changeItems.length>0){
api.Store.updateCart(changeItems,changeQuantities,onResponse);
}else{
onResponse();
}
},

onUpdateResponseNormal:function(res){
if(res){
this.render(res.data.cart);
res.data.failedTokens.leach(function(token){
mojo.css.show('limitQuant_'+token);
});
}
if(this.onUpdateDone)this.onUpdateDone();
}




};
Object.extend(ShoppingCartPage.prototype,Page.prototype,true);
MyMusic.addPage('shoppingcart',function(){return new ShoppingCartPage();});



AlbumPage=Class.create();
AlbumPage.prototype={
initialize:function(params){
this.pageId='Album';
this.skelClass='albumPage';
this.initAlbumPage();

this.discId=params.discId||null;
this.autoPlay=mojo.isDefined(params.autoPlay)?params.autoPlay:false;
this.songId=params.songId||null;

this.album=null;
this.group=null;
this.versions=null;
this.versionMenu=null;
this.isRecoLanding=false;
this.discs=[];

this._songLists=[];
this.albumNavigator={};

this.slider=null;
this.recos=null;
this.recentSongListens=null;

this.albumPriceListener_Init(this.renderBuyDigitalSection.lbind(this));
mojo.listeners.add(api.MicroWallet.EVT_BUY_MP3_ALBUM,this.onAlbumPurchased.lbind(this));

AlbumPage.g=this;
},


initAlbumPage:function(){
this.initPage({theme:'greenTheme',pageId:this.pageId,
skelClass:this.skelClass});
},

onAlbumPurchased:function(album){
$DC('albumPagePlay','play_icon_30_large');
$AC('albumPagePlay','play_icon_full_large');
},

albumPriceListener_GetAlbumById:function(discId){
if(this.album.id==discId)return this.album;
else return null;
},

onLoad:function(){
var self=this;

var params={
discLalaId:this.discId,
msgToken:lala.params.msgToken,
songLalaId:this.songId
};
api.AlbumPage.getData(
params,
function(res){
if(!res.data||!res.data.albumInfo
||res.data.albumInfo.discs.length==0){
self.renderIntoContentRegion($T(lt.Album.invalid));
return;
}
var albumInfo=res.data.albumInfo;

self.group=albumInfo;
self.discs=albumInfo.discs;
self.album=self.discs[0];
self.versions=albumInfo.versions;
self.slider=res.data.slider;
self.recos=res.data.recos;
self.recentSongListens=res.data.recentSongListens;
self.influencers=res.data.influencers;
self.topListeners=res.data.topListeners;






if(self.album.nbdisc>1){
self.album.clientAllTracks=[];
self.discs.leach(function(disc){
disc.discDuration=0;
for(var i=0;i<disc.tracks.length;i++){
var aTrack=disc.tracks[i];
self.album.clientAllTracks.ladd(aTrack);
if(aTrack.duration){
disc.discDuration+=aTrack.duration;
}
}
});
}else{
self.album.clientAllTracks=self.album.tracks;
self.album.discDuration=self.album.albumDuration;
}

self.isRecoLanding=res.data.recoData||res.data.recoSong;



var freeTrack=self._hasAvailableFreeTrack();
if(!self.isRecoLanding
&&!self.album.isFreeMp3&&freeTrack){
self.isRecoLanding=true;
res.data.recoData={user:{},track:freeTrack};
}
self.renderPage();

if(res.data.recoData){
if(res.data.recoData.track){
self.renderRecoSongLanding(res.data.recoData);
}else if(res.data.recoData.disc){
self.renderRecoAlbumLanding(res.data.recoData);
}
}else if(res.data.recoSong&&!self.album.isFreeMp3){

self.renderRecoSongLanding({user:{},
track:res.data.recoSong});
}

if(lala.params.purchase){
self.autoOpenPurchaseDialog();
}
});
},

onUnload:function(){


Cookies.removePurchasePartnerId();
},






autoOpenPurchaseDialog:function(){
var self=this;
if(!this.songId){

if(lala.params.purchase=='web'){
if($('buyWebAlbumButton'))this.onPurchaseWebAlbum();
}else{
if($('buyMp3AlbumButton'))this.onPurchaseDownloadAlbum();
}
}else{

this._songLists.leachBreak(function(sl){
return sl.openSongDownloadDialog(self.songId);
});
}
},

renderPage:function(){
this.renderSkeleton();
this.renderDiscSkeletons();
this.renderAlbumDetails();
this.renderTrendInfo();
this.renderTracks();
this.renderBuyDigitalSection();
this.renderNavigator();
this.renderInfluencers();
this.renderListeners();
this.renderRecos();
this.renderReviews();
},

renderSkeleton:function(){
this.setDocumentInfo();
this.mainTwoColLayout=new widgets.core.TwoColumn();
this.albumInfoTwoColLayout=new widgets.core.TwoColumn();

var t=$T(lt.Album.mainSkeleton)
.replaceToken('mainTwoColLayout',
this.mainTwoColLayout.render())
.replaceToken('albumInfoTwoColLayout',
this.albumInfoTwoColLayout.render())
.replaceTokensWithBean('album',this.album)
.keepTokenBlock('InternalBlock',lala.user&&lala.user.isInternal);

this.renderIntoContentRegion(t);

$TC(lt.Album.mainCol1,this.mainTwoColLayout.col1);
$TC(lt.Album.mainCol2,this.mainTwoColLayout.col2);
},

setDocumentInfo:function(){
if(this.album.artist){
MyMusic.g.setDocumentTitle(this.album.title+" by "+this.album.artist);
if(mojo.LALA_CRAWLER){
var tracks=this.album.tracks.lclone();
tracks.sort(function sortNumber(a,b){
return b.listens7-a.listens7;
});
var topSongText="";
tracks.slice(0,Math.min(3,tracks.length)).leach(function(track){
topSongText+=track.title+", ";
});
MyMusic.g.setDocumentMetaInfo(
"Listen for free to "+this.album.artist+" - play the full album, "+this.album.title
+". Songs include "+topSongText+(tracks.length>3?"and more.":"so come check it out.")
);
}
}else{
MyMusic.g.setDocumentTitle(this.album.title);
if(mojo.LALA_CRAWLER){
MyMusic.g.setDocumentMetaInfo(
"Listen for free - play the full album, "+this.album.title
+", along with other full-length albums, songs, playlists, and more."
);
}
}
},

onMediaPlayerClick:function(){
widgets.Share.onOpenPartnerLinkDialog(this.album,'album');
},

onEmbedAlbum:function(){
var params={
type:'album',
title:"Album",
vars:{albumId:this.album.id},
shareTitle:"Listen to "+this.album.title+" - "+this.album.artist+" ("+this.album.tracks.length+" tracks) for free.",
shareLink:"/album/"+this.album.id,
footerText:this.album.title+" - "+this.album.artist
};
widgets.core.WidgetEmbed.open(params);

lala.Track.clientPageInteraction('shareActionsBar.embed');
},

onTitleClick:function(){

if(!(lala.user&&lala.user.isInternal))return;

mojo.css.toggleDisplay('bonusDiscInfo');
},

onShowAlbumArt:function(evt){
var win=window.open("","lalaAlbumArt","resizable=1,width=700,height=700");
win.document.open("text/html","replace");
win.document.write(
$T(lt.Album.albumArtPopup)
.replaceTokensWithBean("album",this.album)
.compose());
win.document.close();
win.focus();
},

onShout:function(){
widgets.core.ShoutDialog.open(this.album,'album');
lala.Track.clientPageInteraction('shareActionsBar.shout');
},

onGetAlbumUrl:function(){
api.Tiny.forAlbum(this.album.id,ActionButtons.popupUrlDialog);
lala.Track.clientPageInteraction('shareActionsBar.url');
},

renderBuyDigitalSection:function(){

$TC(lt.Album.albumInfoCol2,this.albumInfoTwoColLayout.col2);

new ActionButtons({
renderTargetId:'actionButtons',
onShout:this.onShout.lbind(this),
onShare:this.onShareAlbum.lbind(this),
onEmbed:this.onEmbedAlbum.lbind(this),
onGetUrl:this.onGetAlbumUrl.lbind(this),
disableSharing:!this.album.isLicensedForStreaming,
itemId:this.album.id,
type:'album'
}).render();

var db='';
var roundedBoxClass='';


if(!this.album.isFreeMp3&&frontend.hasOnlyFreeTracksOnAlbum(this.discs)){
this.album.isFreeMp3=true;
}

if(this.album.isFreeMp3&&this.album.downloadMissingTracksCount>0){
db=$T(lt.Album.digitalBuyFreeMp3)
.replaceToken('loggedInOrOut',lala.user?'loggedIn':'loggedOut')
.keepTokenBlock('LoggedOutUserBlock',!lala.user);
roundedBoxClass='freeMp3';
}else{
db=$T(lt.Album.digitalBuy);

if(!this.album.isLicensedForStreaming
||(this.album.addMissingTracksCount>0&&this.album.addMissingTracksPriceInCents<=0)){

db.replaceTokenBlock('WebAlbumBlock',$TC(lt.Album.noWebMessage));
}else if(this.album.addMissingTracksCount==0){

var alreadyHasWebMessage=
$T(lt.Album.alreadyHasWebMessage)
.removeTokenBlock('RegularPriceBlock',this.album.isFreeMp3)
.replaceToken('regularWebPrice',mojo.util.formatPrice(this.album.webAlbumPriceInCents))
.compose();
db.replaceToken('webPrice',widgets.SongList.IN_ICON)
.replaceToken('webText',alreadyHasWebMessage)
.replaceToken('webCellStyle','vertical-align: middle;');
}else{


var hasSomeSongs=this.album.albumStreamableTrackCount!=this.album.addMissingTracksCount;
var oneTrackLeft=this.album.addMissingTracksCount==1;
var oneTotal=this.album.trackCount==1;
var pluralText='s';
var allText='all';
if(oneTotal){
pluralText='';
allText='the'
}


var actualPrice=StoreUtil.getRealWebPrice(this.album);
var goodDeal=this.album.addMissingTracksPriceInCents!=actualPrice;
var discount=this.album.addMissingTracksPriceInCents-this.album.webAlbumPriceInCents;

var message='';
if(goodDeal&&hasSomeSongs){
message=$T(lt.Album.buyWebAlbumGoodDealSomeSongs)
.replaceToken('savings',mojo.util.formatPrice(discount))
.replaceToken('an',oneTrackLeft?'an':'')
.replaceToken('s',oneTrackLeft?'':'s')
.replaceToken('fullPrice',mojo.util.formatPrice(this.album.addMissingTracksPriceInCents))
.removeTokenBlock('SpecialBlock',!this.album.isPromoPriceSet)
.compose();
}else if(goodDeal){
message=$T(lt.Album.buyWebAlbumGoodDealNoSongs)
.replaceToken('savings',mojo.util.formatPrice(discount))
.replaceToken('unAddedTracksCount',this.album.addMissingTracksCount)
.replaceToken('s',pluralText)
.removeTokenBlock('SpecialBlock',!this.album.isPromoPriceSet)
.compose();
}else if(hasSomeSongs){
message=$T(lt.Album.buyWebAlbumNoDealSomeSongs)
.replaceToken('s',oneTrackLeft?'':'s')
.replaceToken('remainingTracks',this.album.addMissingTracksCount)
.replaceToken('fullPrice',mojo.util.formatPrice(this.album.webAlbumPriceInCents))
.compose();
}else{
message=$T(lt.Album.buyWebAlbumNoDealNoSongs)
.replaceToken('s',pluralText)
.replaceToken('totalWebAlbumTracks',oneTotal?'':this.album.albumStreamableTrackCount)
.replaceToken('allOrThe',oneTotal?'the':'all')
.compose();
}
db.replaceToken('webPrice',
'$'+mojo.util.formatPrice(actualPrice.toFixed(2)));

var webButtonText=
hasSomeSongs?'Buy '+this.album.addMissingTracksCount+' web song'+(oneTrackLeft?'':'s')
:'Buy web album';


var webText=$T(lt.Album.buyWebAlbum)
.replaceToken('webButtonText',webButtonText)
.replaceToken('buyWebText',message)
.compose();
db.replaceToken('webText',webText);
}

if(this.album.isLicensedForDownload
&&!(this.album.downloadMissingTracksCount>0&&this.album.downloadMissingTracksPriceInCents<=0)){

var regularMp3Price=this.album.downloadAlbumPriceInCents==0?
this.album.downloadMissingTracksPriceInCents:this.album.downloadAlbumPriceInCents;
if(this.album.isAllTracksDownloadPurchased||this.album.downloadMissingTracksCount==0){

var alreadyHasMP3Message=$T(lt.Album.alreadyHasMP3Message)
.removeTokenBlock('RegularPriceBlock',this.album.isFreeMp3)
.replaceToken('regularMP3Price',mojo.util.formatPrice(regularMp3Price))
.compose();
db.replaceToken('downloadPrice',widgets.SongList.IN_ICON)
.replaceToken('downloadText',alreadyHasMP3Message)
.replaceToken('dlCellStyle','vertical-align: middle');
}else{
var actualPrice=StoreUtil.getRealDownloadPrice(this.album);
var goodMP3Deal=actualPrice!=this.album.downloadMissingTracksPriceInCents;
var discount=this.album.downloadMissingTracksPriceInCents-this.album.downloadAlbumPriceInCents;

var oneMp3Left=this.album.downloadMissingTracksCount==1;
var oneMp3Total=this.album.albumDownloadableTrackCount==1;
var pluralText=oneMp3Total?'':'s';
var allOrThe=oneMp3Total?'the':'all';

var hasSomeMp3s=this.album.downloadMissingTracksCount!=this.album.albumDownloadableTrackCount;
var hasAlbumOnly=this._hasAlbumOnlyTracks();

var message='';
if(hasAlbumOnly){
message=$T(lt.Album.buyMP3AlbumAlbumOnly)
.removeTokenBlock('IndividualSongsBlock',this._isAllAlbumOnlyTracks())
.compose();
}else if(goodMP3Deal&&hasSomeMp3s){
message=$T(lt.Album.buyMP3AlbumGoodDealSomeSongs)
.replaceToken('savings',mojo.util.formatPrice(discount))
.replaceToken('an',oneMp3Left?'an':'')
.replaceToken('s',oneMp3Left?'':'s')
.replaceToken('fullPrice',mojo.util.formatPrice(this.album.downloadMissingTracksPriceInCents))
.removeTokenBlock('SpecialBlock',!this.album.isPromoPriceSet)
.compose();
}else if(goodMP3Deal){
message=$T(lt.Album.buyMP3AlbumGoodDealNoSongs)
.replaceToken('savings',mojo.util.formatPrice(discount))
.replaceToken('unDownloadedTracksCount',this.album.downloadMissingTracksCount)
.replaceToken('s',pluralText)
.removeTokenBlock('SpecialBlock',!this.album.isPromoPriceSet)
.compose();
}else if(hasSomeMp3s){
message=$T(lt.Album.buyMP3AlbumNoDealSomeSongs)
.replaceToken('s',oneMp3Left?'':'s')
.replaceToken('fullPrice',mojo.util.formatPrice(regularMp3Price))
.compose();
}else{
message=$T(lt.Album.buyMP3AlbumNoDealNoSongs)
.replaceToken('totalDownloadableTracks',
oneMp3Total?'':this.album.albumDownloadableTrackCount)
.replaceToken('s',pluralText)
.replaceToken('allOrThe',allOrThe)
.compose();
}

db.replaceToken(
'downloadPrice',
'$'+mojo.util.formatPrice(actualPrice));

var mp3ButtonText=(hasSomeMp3s&&!hasAlbumOnly)
?'Buy '+this.album.downloadMissingTracksCount+' MP3 file'
+(this.album.downloadMissingTracksCount==1?'':'s')
:'Buy MP3 album';

var dlText=$T(lt.Album.buyDownloadAlbum)
.replaceToken('buyMP3Text',message)
.replaceToken('mp3ButtonText',mp3ButtonText)
.compose();
db.replaceToken('downloadText',dlText);
}
}else{

db.replaceTokenBlock('DownloadBlock',$TC(lt.Album.noDLMessage));
}

if(!this.group.isCDForSale){
db.replaceTokenBlock('BuyCDBlock',$TC(lt.Album.noCDMessage));
}else{
var cdText=$T(lt.Album.buyCDAlbum);
var price='';
if(this.group.minCDPriceInCents==this.group.maxCDPriceInCents){
price='$'+mojo.util.formatPrice(this.group.minCDPriceInCents);
}else{
price='from $'+mojo.util.formatPrice(this.group.minCDPriceInCents);
}
cdText.replaceToken('price',price)
.replaceTokensWithBean('album',this.album)
.replaceToken('albumId',this.album.isLicensedForStreaming?this.album.id:'')
.replaceToken('numSongs',this.album.addMissingTracksCount)
.replaceToken('s',this.album.addMissingTracksCount==1?'':'s');
if(!this.album.isLicensedForStreaming){
cdText.replaceTokenBlock('WebSongsAvailable',
$TC(lt.Album.noWebSongsAvailable));
}
db.replaceToken('cdText',cdText.compose());
}
}

db.keepTokenBlock('GoogleExclusiveBlock',this.album.isGoogleExclusive);

var roundedBox=new widgets.core.RoundedBox({
renderTargetId:'digitalBuy',
backgroundColor:'#CBF3F6',
mode:'blue',
extraClass:roundedBoxClass
});
roundedBox.render();
$S(roundedBox.contentId,db.compose());
},

_hasAlbumOnlyTracks:function(){
for(var i=0;i<this.discs.length;i++){
for(var j=0;j<this.discs[i].tracks.length;j++){
if(this.discs[i].tracks[j].isDownloadAlbumOnly)return true;
}
}
return false;
},

_isAllAlbumOnlyTracks:function(){
var hasTracks=false;
for(var i=0;i<this.discs.length;i++){
for(var j=0;j<this.discs[i].tracks.length;j++){
hasTracks=true;
if(!this.discs[i].tracks[j].isDownloadAlbumOnly)return false;
}
}
return hasTracks;
},

_hasAvailableFreeTrack:function(){
for(var i=0;i<this.discs.length;i++){
if(this.discs[i].tracks){
for(var j=0;j<this.discs[i].tracks.length;j++){
var track=this.discs[i].tracks[j];
if(frontend.canPurchaseDownload(track)&&track.isFreeMp3)return track;
}
}
}
return false;
},

renderDiscSkeletons:function(){
var self=this;
var t=$T(lt.Album.discList,'albumDiscs');
this.discs.leach(function(disc,index){
var isPlayable=
disc.isLicensedForStreaming||disc.isAllTracksDigied;
t.replaceToken('index',index);

if(!isPlayable){
t.removeTokenBlock('PlayDiscBlock');
}else{
t.replaceToken(
'discDuration',
'Length: '+
mojo.util.secondsToTime(disc.discDuration,true));
}

if(self.discs.length>1){
var title=isPlayable?'Play ':'';
t.replaceToken('discTitle',title+'Disc '+(index+1));
}else if(!isPlayable){

t.removeTokenBlock('PlayDiscBlock');
t.replaceToken('discTitle','&nbsp;');
}else{

t.replaceToken('discTitle','Play album');
}
t.next();
});
t.compose();
},

renderTracks:function(){
var self=this;

this.discs.leach(function(disc,index){
var songSourceInfo=self.getSourceInfo(disc);
var songList=new widgets.SongList({
renderTargetId:'albumSongList_'+index,
hideAlbum:true,
isAlbum:true,
srcInfo:songSourceInfo,
showListens:'count',
whichListen:'listens7',
showRatings:true,
hideZeroRating:true});
songList.emptyText=lt.Album.emptySongs;
songList.render(disc.tracks);
self._songLists.push(songList);
});

if(this.autoPlay){
var playTrack=this.album.tracks.lfindIf('id',this.songId);
window.setTimeout(function(){
Player.g.playSong(playTrack[0],'songAutoPlay');
},1000);
}
},

renderRecoSongLanding:function(recoData){
var isFreeMp3=recoData.track.isFreeMp3;
var w=new widgets.SongList({
hideActions:true,
hideNum:true,
trackingId:'recoSongList',
showBuyActions:true,
showQueueAction:true,
showListens:false,
layout:'simple',
offsets:{top:(mojo.FF||mojo.IE67?-3:-1)},
buyMode:isFreeMp3?'mp3':'',
customBuyFreeMp3Text:'Download Free MP3'
});

recoData.displayNameUI=recoData.user.nickName?recoData.user.nickName:'Your friend';

var t=$T(lt.Album.shareSongLanding,'shareLanding');
if(!recoData.user.userToken){
t.getTokenBlock('FromFriend').removeTokenBlock('MemberImage');
t.getTokenBlock('FromFriend').removeTokenBlock('NoteBlock');
t.removeTokenBlock('FromFriend');
if(isFreeMp3){
t.removeTokenBlock('GenericCopyBlock');
}else{
t.removeTokenBlock('FreeCopyBlock');
}
}else{
t.getTokenBlock('FromFriend')
.getTokenBlock('MemberImage')
.replaceTokensWithBean('user',recoData.user);
t.getTokenBlock('FromFriend')
.removeTokenBlock('FreeStickerBlock',!recoData.track.isFreeMp3);
t.removeTokenBlock('FreeCopyBlock');
t.removeTokenBlock('NotFromFriend');
t.removeTokenBlock('GenericCopyBlock');
if(recoData.text){
recoData.text=recoData.text.replace('\n','<br>');
}else{
t.getTokenBlock('FromFriend').removeTokenBlock('NoteBlock');
}
}
t.replaceTokensWithBean('msg',recoData);
t.replaceToken('songList',w.render([recoData.track]));
if(isFreeMp3){
t.replaceToken('shareSongLandingRightText','&nbsp;');
}else{
t.replaceToken('shareSongLandingRightText',lala.user
?$TC(lt.Album.shareSongLandingRightText)
:$TC(lt.Album.shareSongLandingRightTextAnon));
}
t.compose();

if(isFreeMp3)$AC('shareLanding','freeSong');
$D('shareLanding');
},

renderRecoAlbumLanding:function(recoData){
recoData.displayNameUI=recoData.user.nickName?recoData.user.nickName:'Your friend';
recoData.text=recoData.text.replace('\n','<br>');
var t=$T(lt.Album.shareAlbumLanding,'shareLanding');
if(!recoData.user.userToken){
t.getTokenBlock('FromFriend').removeTokenBlock('MemberImage');
t.removeTokenBlock('FromFriend');
}else{
t.getTokenBlock('FromFriend')
.getTokenBlock('MemberImage')
.replaceTokensWithBean('user',recoData.user);
t.removeTokenBlock('NotFromFriend');
}
t.replaceTokensWithBean('msg',recoData);
if(lala.user){
t.removeTokenBlock('LoggedOut');
}else{
t.replaceToken('shareAlbumLandingRightText',
$TC(lt.Album.shareAlbumLandingRightTextAnon));
}
t.compose();

$D('shareLanding');
},

hideShareLanding:function(){
$D('shareLanding',false);
},

onPurchaseWebAlbum:function(){
var self=this;
widgets.store.openBuyWebAlbumDialog(this.album);
},

onPurchaseDownloadAlbum:function(){
widgets.store.openBuyAlbumDownloadDialog(this.album,mojo.emptyFunction);
},

onTradeAlbum:function(id,listId,ancElem){
widgets.AlbumList.tradeAlbum(id,listId,ancElem);
},

renderTrendInfo:function(){
if(this.album.listens7Rank>5000){
$S('trendInfoTable','');
return;
}
$T(lt.Album.trendInfoTable,"trendInfoTable")
.replaceToken('currentRank',mojo.util.addCommasToNumber(this.album.listens7Rank))
.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:this.album.listensTrend,
what:'album',
size:'med'
}))
.replaceToken('lastWeek',mojo.util.addCommasToNumber(this.album.listensRank))
.replaceToken('recentListens',mojo.util.addCommasToNumber(this.album.listens7))
.compose();
},

renderAlbumDetails:function(){
if(this.album.releaseDate){
var release=new Date(this.album.releaseDate);
if(release.getUTCFullYear()==this.album.year){
this.album.displayYear=release;
}else{
this.album.displayYear=this.album.year;
}
}else{
this.album.displayYear=this.album.year;
}
var t=$T(lt.Album.details,this.albumInfoTwoColLayout.col1);
t.replaceToken('clickTrackingId','');
t.keepTokenBlock('MediaPlayerBlock',lala.isMediaPlayerPartner);
t.dateFormatString="%un/%ud/%uY";
t.replaceTokensWithBean('album',this.album);

if(this.album.isDigital){
t.replaceToken('coverWidth','240');
t.replaceToken('coverSize','albumXLarge');
}else{
t.replaceToken('coverWidth','170');
t.replaceToken('coverSize','albumLarge');
}
t.keepTokenBlock('SpecialPriceBlock',this.album.isPromoPriceSet&&!this.album.isFreeMp3);
var hasFreeTracks=false;
this.discs.leach(function(disc){
if(disc.tracks){
disc.tracks.leach(function(track){
if(track.isFreeMp3)hasFreeTracks=true;
});
}
});
t.keepTokenBlock('FreeMp3Block',this.album.isFreeMp3
||(hasFreeTracks&&!this.isRecoLanding));

t.replaceToken('hasType',this.album.type=='Album'?'lnone':'');
t.replaceToken('hasGenre',this.album.genre?'':'lnone');
t.replaceToken('hasSubgenre',this.album.subgenre?'':'lnone');
t.replaceToken('hasLabel',this.album.label?'':'lnone');
t.replaceToken('hasYear',this.album.year?'':'lnone');
t.replaceToken('hasUPC',this.album.upc?'':'lnone');

t.replaceToken('s',this.album.albumTrackCount==1?'':'s');
if(this.album.nbdisc>1){
t.replaceToken('discCount',', '+this.album.nbdisc+' discs');
}

if(this.album.isOffensiveContent){
t.replaceToken('versionType','Explicit');
}else{
t.replaceToken('isOffensive','lnone');
t.replaceToken('versionTypeClass','lnone');
}
if(this.album.albumDuration){
t.replaceToken(
'duration',
mojo.util.secondsToTime(this.album.albumDuration,true));
}else{
t.replaceToken('duration','Unknown');
}

if(this.versions.length>1){
if(this.album.isOffensiveContent)t.replaceToken('versionSeparator','|');
}else{
t.replaceToken('versionMenuClass','lnone');
}

if(this.versions.length>1&&!this.album.isOffensiveContent){
t.replaceToken('explicit','notExplicit');
}
if(this.versions.length>1||this.album.isOffensiveContent){
t.replaceToken('formatLine',
$T(lt.Album.formatLine)
.replaceToken('formatType',
this.album.isDigital?'Digital':'Compact Disc')
.compose());
}else{
t.replaceToken('formatLine',
$T(lt.Album.bareFormatLine)
.replaceToken('formatType',
this.album.isDigital?'Digital':'Compact Disc')
.compose());
}

t.keepTokenBlock('BillboardBlock',this.album.billboardChartPosition);

if(lala.isTradingTransition||!lala.isTradingEnabled){
t.removeTokenBlock('TradingBlock');
}else{
if(this.versions&&this.versions.length>0
&&this.album.groupId!=this.discId
&&!this.album.isDigital){
t.getTokenBlock('TradingBlock').replaceToken('streamableVersion',this.album.groupId);
}else{
t.getTokenBlock('TradingBlock').removeTokenBlock('StreamableBlock');
}

if(this.group.isCDForTrade){
t.getTokenBlock('TradingBlock').removeTokenBlock('NotTradableBlock');
}else{
t.getTokenBlock('TradingBlock').removeTokenBlock('TradableBlock');
}
}

if(this.album.isLicensedForStreaming
||this.album.isDigied||this.album.samples){
t.getTokenBlock('PlayButtonBlock')
.replaceToken('playType',
this.album.isLicensedForStreaming||this.album.isDigied
?'play_icon_full_large'
:'play_icon_30_large');
}else{
t.removeTokenBlock('PlayButtonBlock');
}

t.compose();
},

openVersionMenu:function(evt){
if(!this.versionMenu){
this.versionMenu=new widgets.core.versionMenu(
{elemId:'versionMenuLink',
selectedAlbum:this.album,
versions:this.versions})
}
this.versionMenu.open(evt);
},

renderInfluencers:function(){
if(this.influencers.total<=0)return;

new widgets.Influencers({
renderTargetId:'albumInfluencers',
clickTrackingId:'topInfluencers',
evenMoreLink:frontend.link.NewAPage('influencers'),
context:'album'
}).render(this.influencers);
},

renderListeners:function(){
if(this.topListeners.total<=0)return;

new widgets.TopListeners({
renderTargetId:'albumListeners',
clickTrackingId:'topListeners',
evenMoreLink:frontend.link.NewAPage('listeners'),
subtitle:'Listeners who listen to this album the most'
}).render(this.topListeners);
},

renderRecos:function(){
if(this.recos.list.length<=0)return;
var w=new widgets.AlbumList({
layout:'listNarrow',
renderTargetId:'albumRecosContent'
});
w.render(this.recos);
$D('albumRecos');
},

renderNavigator:function(){
if(!this.album.artist){
return;
}




if(this.album.type=='Compilation'||this.album.type=='Other'){
return;
}

if(!this.slider||!this.slider.list||this.slider.list.length<=0){
return;
}

this.albumNavigator=new widgets.AlbumNavigator({
artist:this.album.artist,
renderTargetId:'albumNavigator',
clickTrackingId:'navigator',
title:'Albums by this artist'
});
this.albumNavigator.albums=this.slider.list;
if(this.albumNavigator.albums.length<=0)return;
this.albumNavigator.total=this.albumNavigator.albums.length;
this.albumNavigator.center(this.album.id);
$D('albumNavigator',true);
},

renderReviews:function(){
$TC(lt.Album.reviews,'albumReviews');
var w=new widgets.Review({renderDivId:'albumReviewsContent',
album:this.album,
paging:true});
w.loadAndRender();
},

getSourceInfo:function(disc){
return{lalaId:disc.id};
},

onPlayDisc:function(discIndex){
var disc=this.discs[discIndex];
Player.g.playDisc(disc,'albumPageDisc');
},

onPlayAlbum:function(){
var disc=this.discs[0];
Player.g.playAlbum(disc,'albumPage');
},

onQueueDisc:function(elem,discNum){
var done=false;
var disc=this.discs[discNum];
Player.g.queueDisc(disc,function(){
if(!done){
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);
done=true;
}},'albumSongList');
},

onShareAlbum:function(){
if(frontend.requiresSignin({trackingId:'shareAlbum'}))return;
widgets.Share.dialogShareWidget=new widgets.Share({
shareObj:this.album,
shareType:'album'
});
widgets.Share.openRecoDialog(this.album,'album');
lala.Track.clientPageInteraction('shareActionsBar.share');
}
};
Object.extend(AlbumPage.prototype,Page.prototype,true);
Object.extend(AlbumPage.prototype,AlbumPriceListener,true);


MyMusic.addPageRegex('album',/album\/-?\d+/,
function(pathParts){return new AlbumPage({discId:pathParts[1]});},
{hasAPage:true});
MyMusic.addPageRegex('song',/song\/-?\d+/,
function(pathParts){
return new AlbumPage({songId:pathParts[1],autoPlay:false});
});

AlbumAPage=Class.create();
AlbumAPage.prototype={
initialize:function(params){
this.initPage({
authLevel:0,
pageId:'ArtistAPage',
skelClass:'artistAPage'
});
this.discId=params.discId;
if(!this.discId){
this.songId=params.songId;
}
},

onLoad:function(pathParts){
var self=this;

var Q=this.discId?'discId: '+this.discId:'songId: '+this.songId;
api.Q.searchAlbums(
{Q:Q,sortKey:'Title',sortDir:'Desc',count:1},
function(res){
self.onLoadContinue(res,pathParts);
});
},

onLoadContinue:function(res,pathParts){
this.album=res.data.albums.list[0];
this.discId=this.album.id;
this.baseQ='discId: '+this.discId;

this.renderAPage({
title:this.album.title,
titleLink:frontend.link.Album(this.discId,this.album.title,null,this.album.artist),
pathParts:pathParts,
tabs:[{id:'influencers',title:'Influencers',disableSearch:true},
{id:'listeners',title:'Listeners',disableSearch:true}]
});
},

onLoadAPageInfluencersTab:function(){
this.aPageLoadAndRenderInfluencers(
this.baseQ,{layout:'influential',context:'album'});
},

onLoadAPageListenersTab:function(){
this.aPageLoadAndRenderListeners(
this.baseQ,{layout:'artistListen',context:{album:this.album}});
}
};
Object.extend(AlbumAPage.prototype,NewAPage.prototype,true);
Object.extend(AlbumAPage.prototype,AlbumPage.prototype,true);
MyMusic.addPageRegex('album',/album.*\/more\/.*/,function(pathParts){return new AlbumAPage({discId:pathParts[1]});});
MyMusic.addPageRegex('song',/song.*\/more\/.*/,function(pathParts){return new AlbumAPage({songId:pathParts[1]});});

widgets.AlbumNavigator=Class.create();
widgets.AlbumNavigator.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.title=params.title;
this.skip=0;
this.total=0;
this.noneOlder=false;
this.noneNewer=false;
this.clickTrackingId=params.clickTrackingId||'albumNavigatorWidget';
this.artist=params.artist;
this.albums=[];
this.indexOfMainAlbum=-1;
this.wiid='albumNavigator_'+mojo.idGenerator++;

widgets.AlbumNavigator.g=this;
},

center:function(discId){

var skip=0;
var length=this.albums.length;
for(;skip<length;skip++){
if(this.albums[skip].id==discId){
break;
}
}
this.indexOfMainAlbum=skip;
if(skip<Math.floor(length/2)){
this.noneOlder=true;
}else if(skip>Math.ceil(length/2)-1){
this.noneNewer=true;
}
this.render(Math.max(0,skip-1));
},

render:function(skip){
if(this.albums.length==0)return;
var t=$T(lt.AlbumNavigatorWidget.main,this.renderTargetId);
t.replaceToken('title',this.title.lescapeQuotes());
t.replaceToken('albumCount',this.total);
t.replaceToken('artistAlbums',frontend.link.ArtistAPage(AlbumPage.g.album.artist,'albums'));
t.replaceToken('wiid',this.wiid);
t.replaceToken('clickTrackingId',this.clickTrackingId);

if(this.albums.length==1){
t.replaceTokenBlock('PicsBlock','<td class="noContentText">This artist has only one album.</td>');
t.removeTokenBlock('AlbumTitleBlock');
t.removeTokenBlock('NavigationBlock');
t.compose();
return;
}

if((this.albums.length-skip)<3||skip==0){
if(this.indexOfMainAlbum==0&&!this.albums[0].noOlder){
this.albums=[{noOlder:true}].laddAll(this.albums);
}else if(this.indexOfMainAlbum==(this.albums.length-1)){
this.albums.push({noNewer:true});
}
}
if(!mojo.isDefined(this.total)){
this.total=this.albums.total;
}else{
this.total=this.albums.length;
}
var imgIter=t.getTokenBlock('PicsBlock');
var j=0;
for(var i=skip;i<this.albums.length&&j<3;i++){
var album=this.albums[i];
if(!album.year||album.year==""){
album.yearui="&nbsp;";
}else{
album.yearui=album.year;
}

if(album.noOlder){
imgIter.replaceTokenBlock('AlbumExists',
$T(lt.AlbumNavigatorWidget.noText)
.replaceToken('what','older')
.compose());
}else if(album.noNewer){
imgIter.replaceTokenBlock('AlbumExists',
$T(lt.AlbumNavigatorWidget.noText)
.replaceToken('what','newer')
.compose());
}else{
imgIter.replaceTokensWithBean('album',album);
imgIter.replaceToken('index',j);
}
imgIter.replaceToken('origIndex',i);
imgIter.next();
j++;
}

if(skip<=0){
t.replaceToken('olderNavButton','disabledNavButton');
}else{
t.replaceToken('olderNavButton','navButton');
}
if(skip>=(this.total-3)){
t.replaceToken('newerNavButton','disabledNavButton');
}else{
t.replaceToken('newerNavButton','navButton');
}
t.compose();
this.skip=skip;
},

onOlderClick:function(){
var self=this;
this.skip-=1;
if(this.skip<0){
this.skip=0;
}else{
if(this.skip==0&&!this.noneOlder){
var beforeCount=10;
api.AlbumPage.getMoreSliderAlbums(
{
artistName:this.artist,
discId:this.albums[0].id,
beforeCount:beforeCount,
afterCount:0
},
function(res){
if(res.data.list.length<beforeCount){
self.noneOlder=true;
}
var discId=self.albums[0].id;
var set=[];
var newSkip=0;
for(var i=0;i<res.data.list.length;i++){
var album=res.data.list[i];
if(album.id!=discId){
set.push(album);
newSkip++;
}
}
self.albums=set.laddAll(self.albums);
self.total=self.albums.length;
self.skip+=newSkip;
self.render(self.skip);
}
);
}else{
this.render(this.skip);
}
}
lala.Track.clientPageInteraction('navigator.older');
},

onNewerClick:function(){
var self=this;
this.skip+=1;
if(this.skip>(this.total-3)){
this.skip=this.total-3;
}else{
if((this.skip==this.total-3)
&&!this.noneNewer){
var afterCount=10;
api.AlbumPage.getMoreSliderAlbums(
{
artistName:this.artist,
discId:this.albums.llast().id,
beforeCount:0,
afterCount:afterCount
},
function(res){
if(res.data.list.length<afterCount){
self.noneNewer=true;
}
var discId=self.albums.llast().id;
for(var i=0;i<res.data.list.length;i++){
var album=res.data.list[i];
if(album.id!=discId){
self.albums.push(album);
}
}
self.total=self.albums.length;
self.render(self.skip);
}
);
}else{
this.render(this.skip);
}
}
lala.Track.clientPageInteraction('navigator.newer');
},

onMouseOver:function(index,elemIndex){
var album=this.albums[index];
var titleElem='albumTitle_'+elemIndex;
$S(titleElem,album.title.lescapeHTML());
$D(titleElem,true);
},

onMouseOut:function(index,elemIndex){
var album=this.albums[index];
var titleElem='albumTitle_'+elemIndex;
$S(titleElem,'');
$D(titleElem,false);
}
};



PromoPreviewPage=Class.create();
PromoPreviewPage.prototype={
initialize:function(pathParts){
this.initPage({pageId:'Promo Widget Preview',
skelClass:'contentPage'});
this.blobId=pathParts[0];
this.promoId=pathParts[1];

PromoPreviewPage.g=this;
},

onLoad:function(){
var self=this;
if(!lala.user||(lala.user&&!lala.user.isInternal)){
this.renderIntoContentRegion('Login to view');
return;
}
$TC("<div id='promoSC' style='width:300px;'></div>",'scrollableViewDiv')
new PromoWidget({
renderTargetId:'promoSC',
clickTrackingId:'homePage.promo',
blobId:this.blobId
}).loadAndRender(this.promoId,true);
}
};
Object.extend(PromoPreviewPage.prototype,Page.prototype,true);
MyMusic.addPage('promopreview',function(pathParts){return new PromoPreviewPage(pathParts.slice(1));});



FooterPage=Class.create();
FooterPage.prototype={
initFooterPage:function(params){
this.initPage({
pageId:params.pageId,
pageTitle:params.pageTitle,
skelClass:'footerPage '+params.skelClass});

this.pageClass=params.skelClass;
this.pageSubtitle=params.pageSubtitle||'';
this.disableBlogLook=params.disableBlogLook;
this.disableEscapeWhiteSpace=params.disableEscapeWhiteSpace;
this.hideQuotesPod=params.hideQuotesPod;
this.permaLinksEnabled=params.permaLinksEnabled;
this.configId=params.configId;
this.mainDivId='footerPageMessages';
this.topicId=params.topicId;
},

onLoad:function(){
this.loadMessages();
},

loadMessages:function(){
var self=this;
api.Content.getHelpConfig(
this.configId,
function(res){
if(!res.data||res.data.categories.length==0){
self.renderSkeleton();
$(self.mainDivId).innerHTML='Sorry, this page is currently unavailable.';
return;
}
self.renderMessages(res.data.categories[0].topics);
},
this.disableEscapeWhiteSpace);
},

renderMessages:function(topics){
var self=this;

this.renderSkeleton();


if(this.permaLinksEnabled&&this.topicId){
var matchedTopics=topics.lfindIf('id',this.topicId);
if(matchedTopics.length>0)topics=matchedTopics;
}

var msgsDiv=$(this.mainDivId);
var outerTwoCol=new widgets.core.TwoColumn({classes:'outerTwoCol'});
mojo.dom.parseHTMLFragment(outerTwoCol.render(),msgsDiv);


topics.leach(function(topic,index,isLast){
var topicLayout=new widgets.core.TwoColumn({classes:'leftSide'});
mojo.dom.parseHTMLFragment(topicLayout.render(),outerTwoCol.col1);

var t;
t=$T(lt.FooterPage.post,topicLayout.col1)
.replaceToken('time',new Date(parseFloat(topic.time)).lformat('%B %e, %Y'))
.replaceToken('hideBlogLook',self.disableBlogLook?'lnone':'')
.compose();
t=$T(lt.FooterPage.entry,topicLayout.col2)
.replaceToken('text',topic.text)
.replaceToken('hideBlogLook',self.disableBlogLook?'lnone':'')
.replaceToken('time',new Date(parseFloat(topic.time)).lformat('%l:%M %p'))
.replaceToken('subject',topic.subject)
.removeTokenBlock('PermaLinkBlock',!self.permaLinksEnabled)
.removeTokenBlock('NonPermaLinkBlock',self.permaLinksEnabled)
.replaceToken('id',topic.id)
.replaceToken('lastEntry',isLast?'lastEntry':'')
.replaceToken('authorToken',topic.author.userToken)
.replaceToken('authorName',topic.author.displayName)
.compose();
});


var cols=new widgets.core.TwoColumn({classes:'leftSide'});
mojo.dom.parseHTMLFragment(cols.render(),outerTwoCol.col1);
this.onDoneLoadingCallback(cols.col2);


if(!this.hideQuotesPod)$TC(lt.FooterPage.quotes,outerTwoCol.col2);
},

renderSkeleton:function(){
var t=$T(lt.FooterPage.skeleton)
.replaceToken('title',this.pageTitle)
.replaceToken('subtitle',this.pageSubtitle);
t.keepTokenBlock('BetaBlock',lala.isBetaEnabled);

this.renderIntoContentRegion(t);


var navLink=$(this.pageClass+'Link');
if(navLink){
navLink.className+=' active';
}else{


}
},

onDoneLoadingCallback:function(id){
}
};
Object.extend(FooterPage.prototype,Page.prototype,true);

BlogPage=Class.create();
BlogPage.prototype={
initialize:function(params){
if(!params)params={};
this.initFooterPage({pageId:'Blog',
pageTitle:'Blog',
permaLinksEnabled:true,
hideQuotesPod:true,
pageSubtitle:"What's cooking at Lala? "+$TC(lt.BlogPage.rss),
skelClass:'blogPage',
configId:'BlogPage',
topicId:params.topicId});
}
};
Object.extend(BlogPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('blog',function(){return new BlogPage({})});
MyMusic.addPageRegex('blog',/blog\/[0-9]+/,
function(pathParts){
return new BlogPage({topicId:pathParts[1]});
});

BetaBlogPage=Class.create();
BetaBlogPage.prototype={
initialize:function(params){
if(!params)params={};
this.initFooterPage({pageId:'BetaBlog',
pageTitle:'Beta Features',
permaLinksEnabled:true,
pageSubtitle:'New stuff to try - tell us what you think.',
skelClass:'betaBlogPage',
configId:'BetaBlogPage',
topicId:params.topicId});
}
};
Object.extend(BetaBlogPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('betablog',function(){return new BetaBlogPage({})});
MyMusic.addPageRegex('betablog',/betablog\/[0-9]+/,
function(pathParts){
return new BetaBlogPage({topicId:pathParts[1]});
});

PressPage=Class.create();
PressPage.prototype={
initialize:function(){
this.initFooterPage({pageId:'Press',
pageTitle:'Press Release',
pageSubtitle:"Read all about it.",
skelClass:'pressPage',
configId:'PressPage'});
}
};
Object.extend(PressPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('press',function(){return new PressPage()});

PressQuotesPage=Class.create();
PressQuotesPage.prototype={
initialize:function(){
this.initFooterPage({pageId:'PressQuotes',
pageTitle:'Press Quotes',
pageSubtitle:"Read all about it.",
disableBlogLook:true,
skelClass:'pressQuotesPage',
configId:'PressQuotesPage',
disableEscapeWhiteSpace:true,
hideQuotesPod:true});
}
};
Object.extend(PressQuotesPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('pressquotes',function(){return new PressQuotesPage()});

TermsOfServicePage=Class.create();
TermsOfServicePage.prototype={
initialize:function(){
this.initFooterPage({pageId:'TermsOfService',
pageTitle:'Terms of service',
pageSubtitle:"The rules.",
disableEscapeWhiteSpace:true,
skelClass:'termsOfServicePage',
configId:'TermsOfServicePage',
hideQuotesPod:true});
}
};
Object.extend(TermsOfServicePage.prototype,FooterPage.prototype,true);
MyMusic.addPage('termsofservice',function(){return new TermsOfServicePage()});

PrivacyPolicyPage=Class.create();
PrivacyPolicyPage.prototype={
initialize:function(){
this.initFooterPage({pageId:'PrivacyPolicy',
pageTitle:'Privacy Policy',
pageSubtitle:"It's totally personal.",
disableEscapeWhiteSpace:true,
disableBlogLook:true,
skelClass:'privacyPolicyPage',
configId:'PrivacyPolicyPage',
hideQuotesPod:true});
}
};
Object.extend(PrivacyPolicyPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('privacypolicy',function(){return new PrivacyPolicyPage()});

JobsPage=Class.create();
JobsPage.prototype={
initialize:function(){
this.initFooterPage({
pageId:'Jobs',
pageTitle:'Jobs',
pageSubtitle:"We're always on the lookout.",
disableEscapeWhiteSpace:true,
disableBlogLook:true,
skelClass:'jobsPage',
configId:'JobsPage'});
}
};
Object.extend(JobsPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('jobs',function(){return new JobsPage()});

ContactInfoPage=Class.create();
ContactInfoPage.prototype={
initialize:function(){
this.initFooterPage({
pageId:'ContactInfo',
pageTitle:'Contact info',
pageSubtitle:"Touching base.",
skelClass:'contactInfoPage'});
},


onLoad:function(){
this.renderSkeleton();

var t=$T(lt.ContactInfoPage.main,this.mainDivId);
t.compose();
}
};
Object.extend(ContactInfoPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('contactinfo',function(){return new ContactInfoPage()});

HowItWorksPage=Class.create();
HowItWorksPage.prototype={
initialize:function(){
this.initFooterPage({
pageId:'HowItWorks',
pageTitle:'How it works',
pageSubtitle:"It really is this simple",
skelClass:'howItWorksPage'});
},


onLoad:function(){
this.renderSkeleton();
var msgsDiv=$(this.mainDivId);
var outerTwoCol=new widgets.core.TwoColumn({classes:'outerTwoCol'});
mojo.dom.parseHTMLFragment(outerTwoCol.render(),msgsDiv);

$T(lt.HowItWorksPage.main,outerTwoCol.col1)
.replaceToken('notLoggedIn',lala.user?"hidden":"visible")
.compose();


$TC(lt.FooterPage.quotes,outerTwoCol.col2);
}
};
Object.extend(HowItWorksPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('howitworks',function(){return new HowItWorksPage()});

AboutPage=Class.create();
AboutPage.prototype={
initialize:function(){
this.initFooterPage({
pageId:'About',
pageTitle:'About us',
disableBlogLook:true,
disableEscapeWhiteSpace:true,
pageSubtitle:"What's it all about?",
skelClass:'aboutPage',
configId:'AboutPage'});
},

onDoneLoadingCallback:function(id){

var callback=function(res){
var employees=res.data;
var t=$T(lt.AboutPage.team,id);
var iter=t.getTokenBlock('TeamPicBlock');
employees.leach(function(u){
iter.replaceTokensWithBean('user',u);
iter.next();
})
t.compose();
};
api.User.getEmployees(callback);
}
};
Object.extend(AboutPage.prototype,FooterPage.prototype,true);
MyMusic.addPage(['about','aboutus'],function(){return new AboutPage()});

TradingPolicyPage=Class.create();
TradingPolicyPage.prototype={
initialize:function(){
this.initFooterPage({pageId:'TradingPolicy',
pageTitle:'Trading Policy',
pageSubtitle:"The trading rules.",
disableEscapeWhiteSpace:true,
disableBlogLook:true,
hideQuotesPod:true,
skelClass:'tradingPolicyPage',
configId:'TradingPolicyPage'});
},

onDoneLoadingCallback:function(id){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
}
}
};
Object.extend(TradingPolicyPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('tradingpolicy',function(){return new TradingPolicyPage()});

CommunityPolicyPage=Class.create();
CommunityPolicyPage.prototype={
initialize:function(){
this.initFooterPage({
pageId:'CommunityPolicy',
pageTitle:'Community Policy',
pageSubtitle:"The community rules.",
hideQuotesPod:true,
disableEscapeWhiteSpace:true,
disableBlogLook:true,
skelClass:'communityPolicyPage',
configId:'CommunityPolicyPage'});
}
};
Object.extend(CommunityPolicyPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('communitypolicy',function(){return new CommunityPolicyPage()});

ArtistInfoPage=Class.create();
ArtistInfoPage.prototype={
initialize:function(){
this.initFooterPage({pageId:'ArtistInfo',
pageTitle:'Artist Information',
pageSubtitle:"So you're an artist.",
hideQuotesPod:true,
disableEscapeWhiteSpace:true,
disableBlogLook:true,
skelClass:'artistInfoPage',
configId:'ArtistInfoPage'});
}
};
Object.extend(ArtistInfoPage.prototype,FooterPage.prototype,true);
MyMusic.addPage('artistinfo',function(){return new ArtistInfoPage()});





ContentPage=Class.create();
ContentPage.prototype={
initialize:function(blobId){
this.initPage({pageId:blobId,
skelClass:'contentPage'});
this.blobId=blobId;
this.subtype='CustomPages';
ContentPage.g=this;
},

onLoad:function(){
var self=this;

api.Content.getClientBlob(this.subtype,this.blobId,function(res){
if(res.data==null){
self.renderEmpty();
self.setDocumentTitle(self.blobId);
return;
}
self.struct=mojo.evalJson(res.data);
self.setDocumentTitle(self.struct.title);
self.renderIntoContentRegion('<div id="contentPageContent"></div>');
new CustomPageWidget({
struct:self.struct,
pageId:self.blobId,
renderTargetId:'contentPageContent'
}).render();
},true);
},

renderEmpty:function(){
this.renderIntoContentRegion('This page no longer exists');
}




};
Object.extend(ContentPage.prototype,Page.prototype,true);
MyMusic.addPage('content',function(pathParts){return new ContentPage(pathParts[1]);});



TradePage=Class.create();
TradePage.prototype={
initialize:function(){
this.initPage({title:'Trade',authLevel:1,
theme:'grayTheme',tradingOnly:true,
skelClass:'tradeView'});

this.pageData=null;
this.extraPath=null;
this.listPage=null;
TradePage.g=this;
},

onLoad:function(pathParts){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

this.pageId=pathParts.llast();

var self=this;

var t=$T(g_trade_ViewTemplate);
this.renderIntoContentRegion(t);
this.tabs=mojo.newtabs.create({id:'trade',
divTabsId:'tradeTabs',
divTabsContentId:'tradeTabsContent'});
this.tabs.onTabClick=this.onTabClick.lbind(this);
this.tabs.add({
id:'wantlistTab',
title:'Want list',
path:frontend.path.WantList()});
this.tabs.add({
id:'havelistTab',
title:'Have list',
path:frontend.path.HaveList()});
this.tabs.add({
id:'messagesTab',
title:'Trading Messages',
path:frontend.path.TradeMessages()});
this.tabs.add({
id:'historyTab',
title:'Trading History',
path:frontend.path.TradeHistory()});


api.Trading.getTradePageData(function(res){
self.pageData=res.data;
lala.user.requestedCount=self.pageData.requestedCount;
self.renderTabContent(pathParts);
});
},

getPageTitle:function(){
return'Trade';
},

refreshPageTitle:function(titleText){
MyMusic.g.setDocumentTitle('Trade > '+titleText);
$S('tradePageTitle',titleText);
},

refreshPageSubTitle:function(subTitleText){
$S('tradePageSubTitle',subTitleText);
},

getPageId:function(){
return'Trade'+this.pageId.ltoFirstUpperCase();
},

renderTabContent:function(pathParts){
if(pathParts.length>2){
this.extraPath=pathParts[2];
}
this.tabs.activate(pathParts.length>0
?pathParts[1]+'Tab':'wantlistTab');
},

onUnload:function(){
},

onTabClick:function(tab,isClick){
if(isClick){
this.extraPath=null;
}
if(tab.id=='wantlistTab'||tab.id=='havelistTab'){
var title=tab.id=='wantlistTab'?'Want list':'Have list';
this.refreshPageTitle(title);

var sbox=HeaderSearchBox.g;
sbox.setCustomMode(
new HeaderSearchBoxMode({
displayName:'Search '+title,
clearIconEnabled:true,
onSearch:function(text){
TradePage.g.onTradeSearch(text);
}}));
}else{
sbox.setMode('lala');
}
this['render'+tab.id.ltoFirstUpperCase()](tab);
},

setSearchMode:function(){

},

renderWantlistTab:function(tab){
this.listPage=new ListPage({listid:'wantlist',
title:'Want list',
extraPath:this.extraPath,
renderTargetId:tab.contentId});
var p={};
this.listPage.onload(p);
},

renderHavelistTab:function(tab){
this.listPage=new ListPage({listid:'havelist',
title:'Have list',
extraPath:this.extraPath,
renderTargetId:tab.contentId});
var p={};
this.listPage.onload(p);
},

renderMessagesTab:function(tab){
var lp=new TradingMessagesPage({renderTargetId:tab.contentId,
extraPath:this.extraPath});
var p={};
lp.onload(p);
},

renderHistoryTab:function(tab){
var lp=new TradingHistoryPage({renderTargetId:tab.contentId,
extraPath:this.extraPath});
var p={};
lp.onload(p);
},

onTradeSearch:function(query){
this.listPage._handleListSearch(query);
}
};
Object.extend(TradePage.prototype,Page.prototype,true);
MyMusic.addPage('trade',function(){return new TradePage();});

ListPage=Class.create();
ListPage.all={};
ListPage.prototype={

initialize:function(params){
if(arguments.length==0)return;

this.skews=TradePage.g.pageData.skews;
this.lastOrder=TradePage.g.pageData.lastOrder;
this.openOrderEnvsForm=TradePage.g.pageData.openOrderEnvsForm;

this._reqOpen=false;
this._listid=params.listid;
this._isHave=this._listid=='havelist';
this._isWant=this._listid=='wantlist';
this._allTabId=this._listid;
this._filterTabId=(this._isHave)
?this._listid+'requested'
:this._listid+'incoming';
this.ENV_MORE_DIV=this._listid+'envMessageDivMore';
this.PAGE_SIZE=20;
this.mojoTicket=mojo.baggage.check(this);
this.renderTargetId=params.renderTargetId;
this.extraPath=params.extraPath;
this.searchTerm=null;
this.req={};
this._isInPageSearch=false;
this._discsById=null;

ListPage.g=this;
},

onload:function(params){
$T(g_tradeTabRegionTemplate,this.renderTargetId)
.replaceToken('listid',this._listid)
.compose();

var total=this._isHave
?lala.user.haveListCount:lala.user.wantListCount;
var filterCount=this._isHave
?lala.user.requestedCount:lala.user.willReceiveCount;


this.tabs=mojo.newtabs.create({id:this._listid,
divTabsId:this._listid+'Tabs',
divTabsContentId:this._listid+'TabsContent'});
this.tabs.onTabClick=this.ontabclick.lbind(this);

if(this._isHave){
var title='CDs I Have ';
this.tabs.add({
id:this._allTabId,
title:title+'<span id="'+this._allTabId+'Count">('+total+')</span>',
path:'/trade/'+this._listid});
title='CDs Requested ';
this.tabs.add({
id:this._filterTabId,
title:title+'<span id="'+this._filterTabId+'Count">('+filterCount+')</span>',
path:'/trade/'+this._listid+'/requested'});
}else{
var title='CDs I Want ';
this.tabs.add({
id:this._allTabId,
title:title+'<span id="'+this._allTabId+'Count">('+total+')</span>',
path:'/trade/'+this._listid});
title='CDs Coming ';
this.tabs.add({
id:this._filterTabId,
title:title+'<span id="'+this._filterTabId+'Count">('+filterCount+')</span>',
path:'/trade/'+this._listid+'/incoming'});
}





mojo.listeners.add(api.Trading.EVT_LIST_CHANGE);

var openTabId=this._listid;
openTabId+=this.extraPath?this.extraPath:'';
this.tabs.activate(openTabId);
},

updateCounts:function(isFilter,total){
if(isFilter){
$S(this._filterTabId+'Count','('+total+')');
}else{
$S(this._allTabId+'Count','('+total+')');
}
},





_renderTab:function(res){

var isHave=this._isHave;
var isFilterTab=(this.tabs.active.id==this._filterTabId);



if(res.data.discs.list.length==0&&!this._isInPageSearch){
this._renderPageTitle();

var tmpl='';
if(!isFilterTab){
tmpl=eval('g_'+this._listid+'Empty');
}else{
tmpl=eval('g_'+this._listid+
(lala.user.canShip?'FilterEmpty'
:'FilterThrottled'));
}

var template=$T(tmpl)
.replaceToken('listid',this.tabs.active.id)
.replaceToken('listTicket',this.mojoTicket);
var envBlock=template.getTokenBlock('EnvMessage');
if(envBlock){
envBlock.replaceToken('envDivMsg',$T(g_needEnvMsg)
.replaceToken('listTicket',this.mojoTicket)
.compose());
}
mojo.setContent(this.tabs.active.contentId,template.compose());
}else{

if(res.__isClear)res.__isClear=false;
var containerId=this.tabs.active.contentId;



if(isHave&&isFilterTab){
lala.user.canShipCount=res.data.discs.total;
mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
}

var t=$T(g_tabContent,containerId);
t.replaceToken('listid',this.tabs.active.id);
t.replaceToken('listTicket',this.mojoTicket);
t.replaceToken('pagingContent',this._renderPagingRegion(res));


if(this._isInPageSearch){
t.removeTokenBlock('EnvMessage');
var sb=t.getTokenBlock('SearchBlurb');
var matchesT=$T(g_searchBlurb);
matchesT.replaceToken('count',res.data.discs.total);
matchesT.replaceToken('s',res.data.discs.total>1?'s':'');
matchesT.replaceToken('term',this.searchTerm);
matchesT.replaceToken('listid',isHave?'Have':'Want');
matchesT.replaceToken('listTicket',this.mojoTicket);
sb.replaceToken('searchBlurbContent',matchesT.compose());
}else{

t.removeTokenBlock('SearchBlurb');
if(isHave){
var hlr=t.getTokenBlock('HaveListRequestedCheckBox');
if(isFilterTab){
hlr.replaceToken('requestedVisibility','visible');
hlr.replaceToken('requestedChecked',res.req.params.filterType=='shippable'?'checked="checked"':'');
}else{
hlr.replaceToken('requestedVisibility','hidden');
}
var em=t.getTokenBlock('EnvMessage');
var x=$T(g_needEnvMsg);
x.replaceToken('listTicket',this.mojoTicket);
em.replaceToken('envDivMsg',x.compose());
}else{
t.removeTokenBlock('EnvMessage');
t.removeTokenBlock('HaveListRequestedCheckBox');
}
}
t.compose();
var paginator=new widgets.core.Paginator(this.tabs.active.id+'PaginatorTop',
'lite',this.tabs.active.id+'PaginatorBottom','big');
paginator.renderTwo(res,res.data.discs);

if(!this._isInPageSearch&&isHave&&isFilterTab&&this.openOrderEnvsForm){
this.requestMoreSupplies();
}
}
this._setSortOrder(res.req.params.sortKey,res.req.params.sortDir);
this.req=res.req;
},

_renderPageTitle:function(){
var isHave=this._isHave;
var isWant=this._isWant;
var isFilterTab=(this.tabs.active.id==this._filterTabId);

var pageTitleText='';
var tradePageSubTitle='';
if(isHave){
if(isFilterTab){
pageTitleText='Requested CDs';
tradePageSubTitle='You have <span id="subTitle_requestedCount">'
+lala.user.requestedCount
+'</span> CD'
+(lala.user.requestedCount==1?'':'s')
+' requested, <span id="subTitle_canShipCount">'
+lala.user.canShipCount
+'</span> you are willing to ship';
}else{
pageTitleText='Have list';
tradePageSubTitle='You have <span id="subTitle_haveListCount">'
+lala.user.haveListCount
+'</span> CD'
+(lala.user.haveListCount==1?'':'s');
}
}else{
if(isFilterTab){
pageTitleText='Incoming CDs';
tradePageSubTitle='You will receive <span id="subTitle_willReceiveCount">'
+lala.user.willReceiveCount
+'</span> CD'
+(lala.user.willReceiveCount==1?'':'s');
}else{
pageTitleText='Want list';
tradePageSubTitle='You want <span id="subTitle_wantListCount">'
+mojo.util.addCommasToNumber(lala.user.wantListCount)
+'</span> CD'
+(lala.user.wantListCount==1?'':'s');
}
}

TradePage.g.refreshPageTitle(pageTitleText);
TradePage.g.refreshPageSubTitle(tradePageSubTitle);
},

_renderPagingRegion:function(res){
this._renderPageTitle();

var isHave=this._isHave;
var isWant=this._isWant;
var isFilterTab=(this.tabs.active.id==this._filterTabId);

var t=$T(g_pagingContainerTemplate);
this._renderColumns(t,isHave);

var keyHash={
havelist:'HaveList',
wantlist:'WantList'
}
t.replaceToken('shipCol',strings[keyHash[this._listid]].ship_col);
t.replaceToken('listid',this._listid);
t.replaceToken('sortKey',(this._listid=='want')
?'WantListTimestamp':'HaveListTimestamp');
t.replaceToken('activeId',this.tabs.active.id);
if(isFilterTab){
t.replaceToken("colHeaderClass","columnHeader-inactive");
t.replaceToken("onclick","");
}else{
t.replaceToken("colHeaderClass","columnHeader");
t.replaceToken("onclick","onclick=");
if(!this._currentSortOrder){
this._currentSortOrder='timestamp';
this.req.params.sortDir='Desc';
}
var selectedToken
=this._currentSortOrder.indexOf('Timestamp')!=-1
?'timestampselected'
:this._currentSortOrder+'selected';
t.replaceToken(selectedToken,'-selected');

var arrowToken
=this._currentSortOrder.indexOf('Timestamp')!=-1
?'timestampArrowDir'
:this._currentSortOrder+'ArrowDir';
t.replaceToken(arrowToken,this.req.params.sortDir=='Asc'?'sortedColAsc':'sortedColDec');
}
if(this._isFilteredWantList()){
t.replaceToken('delCol','none');
}
t.replaceToken('albumWidth',(mojo.IE||mojo.SAFARI)?45:35);
t.replaceToken('ampWidth',(mojo.IE||mojo.SAFARI)?18:10);
t.replaceToken('listTicket',this.mojoTicket);

if(res.data.discs.list.length!=0){
this._discsById={};
var row=t.getTokenBlock('RowBlock');
row.dateFormatString="%n/%d/%y";
row.setEmptyTokenText('&nbsp;');
var baseNumber=res.req.params.skip*res.req.params.count;
for(var i=0;i<res.data.discs.list.length;i++){
var disc=res.data.discs.list[i];
this._discsById[disc.id]=disc;

var style=!disc.artist?'visibility:hidden':'';
row.replaceToken('number',i+baseNumber+1);
disc._date=new Date(parseInt(disc.timestamp));
row.replaceTokensWithBean('disc',disc);
this._renderColumns(row,isHave);
this._renderActions(row,disc);
if(isHave){
row.replaceToken('HLarttooltip',
this._getHLArtTooltip(disc));
}else if(isWant){
row.replaceToken('WLarttooltip',
this._getWLArtTooltip(disc));
row.replaceToken('disabled',disc.shipDate?'disabled':'');
row.replaceToken('checked',disc.isArtRequired?'checked':'');
}
row.replaceToken('listTicket',this.mojoTicket);
row.next();
}
}else{
t.removeTokenBlock("RowBlock");
}


return t.compose();

},

_getHLArtTooltip:function(disc){
return strings.HaveList['art_icon_'+
disc.coverArtStatus.toLowerCase()+'_tooltip'];
},

_getWLArtTooltip:function(disc){
return disc.isArtRequired?
strings.WantList['art_icon_artrequired_tooltip']:
strings.WantList['art_icon_unknown_tooltip'];
},

_renderColumns:function(t,isHave){
if(isHave){
t.replaceToken('buyCol','none');
t.replaceToken('displayWLCoverArt','none');
}else{
if(this._isFilteredWantList()){
t.replaceToken('buyCol','none');
t.replaceToken('delCol','none');
t.replaceToken('displayWLCoverArt','none');
}
t.replaceToken('keepCol','none');
t.replaceToken('displayHLCoverArt','none');
}
},

requestMoreSupplies:function(){
if(this._reqOpen){
this.closeMoreSupplies();
return;
}
this._reqOpen=true;

var x=$T(g_needEnvMsgOpen);
x.replaceToken('listTicket',this.mojoTicket);
mojo.setContent(this.tabs.active.id+'envMessageDivMsg',x.compose());

var divId=this.tabs.active.id+'envMessageDivMore';
mojo.css.display(divId,true);



var t=null;
if(this.skews.length==0){
if(this.lastOrder){
t=$T(g_orderDenied,divId);
t.dateFormatString="%n/%d/%y";
t.replaceTokensWithBean('order',this.lastOrder);
}else{
t=$T(g_orderDeniedNoHistory,divId);
}
}else{

t=$T(g_orderForm,divId);
var l=t.getTokenBlock('OptionBlock');
for(var i=0;i<this.skews.length;i++){
l.replaceTokensWithBean('skew',this.skews[i]);
if(this.skews[i].casesCount<=0)
l.removeTokenBlock('haveCasesBlock');
l.replaceToken('index',i);
l.next();
}
var promptText=this.generateSuppliesText();
t.replaceToken('listTicket',this.mojoTicket);
t.replaceToken('promptText',promptText);
};
t.compose();

mojo.animate.open(divId,null);
},


closeMoreSupplies:function(){
if(!this._reqOpen)return;
this._reqOpen=false;

mojo.setContent(this.tabs.active.id+'envMessageDivMsg',
$T(g_needEnvMsg)
.replaceToken('listTicket',this.mojoTicket)
.compose()
);

var divId=this.tabs.active.id+'envMessageDivMore';
var hide=function(){
mojo.css.display(divId,false);
};
mojo.animate.close(divId,hide);
},

submitSuppliesRequest:function(btn){
var self=this;
var closeMoreSupplies=this.closeMoreSupplies.lbind(this);
var fn=function(res){
self.skews=res.data.skews;
mojo.setContent(self.tabs.active.id+'envMessageDivMore',
strings.HaveList.supplies_coming);
window.setTimeout(closeMoreSupplies,4000);
};

var sel=$('skewSelect');
var selIndex=parseInt(sel.options[sel.selectedIndex].value);
var selectedSkew=this.skews[selIndex];

var dosubmit=function(){
api.Trading.orderShippingSupplies(selectedSkew.envCount,
selectedSkew.casesCount,
fn);
};
lala.updateSubmitButton(btn,dosubmit);
},


generateSuppliesText:function(){
var s=this.skews;
var ret=[""];
if(s.length>0){
var canHaveCases=false;
var canHaveEnvelopes=false;
for(var i=0;i<s.length;i++){
if(s[i].casesCount>0){
canHaveCases=true;
}
if(s[i].envCount>0){
canHaveEnvelopes=true;
}
}

ret.push("Select the number of");
ret.push((canHaveEnvelopes?" envelopes ":" "));
ret.push((canHaveCases?(canHaveEnvelopes?"and cardboard sleeves ":"cardboard sleeves "):" "));
ret.push("you would like to receive.");
}
return ret.join('');
},

_setSortOrder:function(sortOrder,sortDir){
this._currentSortOrder=sortOrder;
},


_renderActions:function(row,disc){
var isHave=this._isHave;
var isWant=this._isWant;
var status='&nbsp;';


var templ=null;
if(isHave&&disc.isShippable){
templ=g_shipItAction;
}else if(disc.shipDate){
templ=g_wantListShippedOnAction;
}

if(templ){
var t=$T(templ);
t.replaceTokensWithBean('disc',disc);
if(isHave&&disc.isShippable&&!disc.isTradeable){

t.replaceToken('disableShipIt','disabled');
}

if(disc.shipDate){

row.replaceToken('hideDelete','hidden');
}
status=t.compose();
}
row.replaceToken('status',status);


if(!isHave&&!disc.shipDate&&disc.price>0){
var button=$T(g_buyNowAction);
button.replaceTokensWithBean('disc',disc);
row.replaceToken('buy',button.compose());
}

if(isHave){
var button=$T(disc.isTradeable?g_tradeable:g_nottradeable);
button.replaceTokensWithBean('disc',disc);
button.replaceToken('listTicket',this.mojoTicket);
row.replaceToken('keep',button.compose());
}else if(isWant){
row.replaceToken('WLartFlag',disc.isArtRequired?'red':'empty');
}
},

onAddAlbumToCart:function(id,ancElem){
api.Store.addToCart(id,function(res){
ancElem.innerHTML='added to cart';
ancElem.href='javascript:void 0'
ancElem.onclick=function(){
frontend.go.ShoppingCart();
return false;
};
});
},





ontabclick:function(tab){
this._getList();
},




_getList:function(){
var isFilterTab=(this.tabs.active.id==this._filterTabId);
if(this.searchTerm){
this._isInPageSearch=true;
}
this.req.params={userToken:lala.user.userToken,
listId:this._listid,
count:this.PAGE_SIZE,
skip:0,
sortKey:(this._listid=='want')
?"WantListTimestamp":"HaveListTimestamp",
sortDir:'Desc',
filter:isFilterTab,
filterType:'shippable',
listQ:this.searchTerm};
this.loadAndRenderList();
},


_isFilteredWantList:function(){
return!this._isHave&&(this.tabs.active.id==this._filterTabId);
},

_handleListSearch:function(query){
if(query.lisEmpty()){
this._clearListSearch();
}else{
this.searchTerm=query;
var openTabId=this._listid;
this.tabs.activate(openTabId);
}
},

_clearListSearch:function(){
this.searchTerm=null;
this._isInPageSearch=false;
var openTabId=this._listid;
this.tabs.activate(openTabId);
},




setNextHaveListCoverArtStatus:function(id,timestamp){
var img=$('coverArt'+id);
var disc=this._discsById[id];
var currStatus=disc.coverArtStatus;
var onresponse=function(res){
img.className='coverArt'+res.data.coverArtStatus;
disc.coverArtStatus=res.data.coverArtStatus;

var anc=img.parentNode;
if(anc)anc.title=this._getHLArtTooltip(disc);
if(disc.isShippable!=res.data.isShippable){



if(this.tabs.active.id==this._filterTabId){
this._getList();
return;
}

if(!res.data.isShippable){
mojo.setContent('actions'+id,'&nbsp;');
lala.user.canShipCount--;
}else{
var t=$T(g_shipItAction);
t.replaceTokensWithBean('disc',disc);
t.replaceToken('disableShipIt',disc.isTradeable?'':'disabled');
mojo.setContent('actions'+id,t.compose());
lala.user.canShipCount++;
}
}
disc.isShippable=res.data.isShippable;
mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
}.lbind(this);

api.Trading.setNextHaveListCoverArtStatus(id,timestamp,currStatus,onresponse);
},

toggleWantListCoverArtPref:function(id,timestamp){
var checkbox=$('WLcoverArt'+id);
var disc=this._discsById[id];
var onresponse=function(res){
checkbox.checked=res.data.isArtRequired?'checked':'';
disc.isArtRequired=res.data.isArtRequired;
checkbox.title=this._getWLArtTooltip(disc);
}.lbind(this);

api.Trading.toggleWantListCoverArtStatus(id,timestamp,onresponse);
},

deleteIt:function(id){
var disc=this._discsById[id];
var me=this;
var onresponse=function(){
me.loadAndRenderList();
}
api.Trading.deleteFromList(disc,this._listid,onresponse);
},

setTradeable:function(id,timestamp,isTradeable){
var disc=this._discsById[id];
var me=this;
var onresponse=function(serverDisc){
disc.isTradeable=isTradeable;
disc.isShippable=serverDisc.shippable;



if(me.tabs.active.id==me._filterTabId){
me.loadAndRenderList();
return;
}


var button=$T(disc.isTradeable?g_tradeable:g_nottradeable);
button.replaceTokensWithBean('disc',disc);
button.replaceToken('listTicket',me.mojoTicket);
mojo.setContent('keep'+id,button.compose());
if(!disc.isShippable){
mojo.setContent('actions'+id,'&nbsp;');
}else{
var t=$T(g_shipItAction);
t.replaceTokensWithBean('disc',disc);
t.replaceToken('disableShipIt',disc.isTradeable?'':'disabled');
mojo.setContent('actions'+id,t.compose());
}

}
api.Trading.setTradeableCD(id,timestamp,disc,isTradeable,onresponse);
},

toggleShippableFilter:function(){
if(this.req.params.filterType=='shippable'){
this.req.params.filterType=null;
}else{
this.req.params.filterType='shippable';
}
this.loadAndRenderList();

},

loadAndRenderList:function(){
var renderTabCb=this._renderTab.lbind(this);
api.Trading.getList(this.req.params,renderTabCb);
},

changeSortOrder:function(event,colEl,sortOrder){
var currS=this._currentSortOrder;

var params={userToken:lala.user.userToken,
listId:this._listid,
filter:false,
count:this.PAGE_SIZE
};



if(currS==sortOrder){
this.req.params.sortDir=this.req.params.sortDir=='Desc'?'Asc':'Desc';
}else{
this.req.params.sortKey=sortOrder;
this.req.params.sortDir='Desc';
}
this.loadAndRenderList();

if(this._currentSortOrder!=null){
var colH=$(this._currentSortOrder+"-header");
if(colH!=null){
colH.className=colH.className.replace("-selected",
"");
}
}

this._setSortOrder(sortOrder,params.sortDir);



frontend.track.pageEvent(this._listid+"/"+this.tabs.active.id+"/sort/"+sortOrder);
}




};





TradingHistoryPage=Class.create();
TradingHistoryPage.all={};
TradingHistoryPage.prototype={
initialize:function(params){
this.initPage({authLevel:1,
theme:'grayTheme',
title:'Trade > History',
pageId:'TradeHistory',
skelClass:'tradeHistoryView'});
this.extraPath=params;
},

PAGE_SIZE:20,
showAlerts:true,





getPageTitle:function(){
return'Trade > History';
},

onLoad:function(params,isBack){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

var subTitle='You have traded '
+'<span id="subTitle_tradedCount">'
+lala.user.tradedCount
+'</span> CD'
+(lala.user.tradedCount==1?'':'s');
var t=$T(lt.TradingHistory.main)
.replaceToken('subTitle',subTitle);
this.renderIntoContentRegion(t);
this.tabs=mojo.newtabs.create({id:'history',
divTabsId:'historyTabs',
divTabsContentId:'historyTabsContent'});

this.tabs.onTabClick=this.ontabclick.lbind(this);
this.tabs.add({
id:'shipped',
title:'Shipped CDs ('+lala.user.shippedCount+')',
path:'/trade/history/shipped'});
this.tabs.add({
id:'received',
title:'Received CDs ('+lala.user.receivedCount+')',
path:'/trade/history/received'});
this.tabs.activate(this.extraPath?this.extraPath:'shipped');

this.messageCenter=new TradeMessageCenter(lala.user.userToken);

},





ontabclick:function(tab){
api.Trading.getTransactions({count:this.PAGE_SIZE,
type:tab.id},
this._renderTab.lbind(this));
},

_renderTab:function(res){
var isShippedTab=res.req.params.type=='shipped';


this.renderHelpContent(res.req.params.type);

var t=$T(lt.TradingHistory.tabContent,
this.tabs.active.contentId);
if(res.data.list.length>0){
t.replaceToken('type',res.req.params.type);
t.replaceToken('shipUserCol',strings.TradingHistory['col_'+res.req.params.type]);


var row=t.getTokenBlock('RowBlock');
row.setEmptyTokenText('&nbsp;');
var pendingT=$T(lt.TradingHistory.statusPending);
var receivedT=
isShippedTab?$T(lt.TradingHistory.shipStatusReceived)
:$T(lt.TradingHistory.receiveStatusReceived);

for(var i=0;i<res.data.list.length;i++){
var disc=res.data.list[i];
if(disc.nbdisc>1){
disc.title+=' (Disc '+disc.discno+'/'+disc.nbdisc+')';
}
row.replaceTokensWithBean('disc',disc);
row.replaceToken('mcticket',this.messageCenter.mojoTicket);
var isTransUserVisible=false;
if(disc.isActivated){
isTransUserVisible=
isShippedTab?disc.waiter.isVisibleTrader
:disc.owner.isVisibleTrader;
}

var userCol=null;
if(disc.isActivated&&
lala.user.isVisibleTrader&&isTransUserVisible){
userCol=$T(lt.TradingHistory.userColLink);
userCol.replaceToken('nickNameClassName',frontend.getMemberClassName(isShippedTab?disc.waiter:disc.owner));
userCol.replaceToken('userToken',
(isShippedTab?disc.waiter:disc.owner).userToken);
userCol.replaceToken('transUserName',
isShippedTab?disc.waiter.nickName
:disc.owner.nickName);
var token=isShippedTab?disc.waiter.userToken
:disc.owner.userToken;
}else{
userCol=$T(lt.TradingHistory.undisclosedUserColLink);
userCol.replaceToken('text',strings.TradingHistory.invisible);
}

row.replaceToken('userCol',userCol.compose());
row.replaceToken('displayIfActive',"block");



row.replaceToken('tabId',res.req.params.type);
var receiveHelpURL="";
if(isShippedTab&&disc.receiveDate){


row.replaceToken('helpIcon','none');
}
if(!isShippedTab&&!disc.receiveDate){


row.replaceToken('helpIcon','none');
}
if(isShippedTab){
receiveHelpURL=frontend.link.ShippingHelp(disc.transToken);
}else{
receiveHelpURL=frontend.link.ReceivingHelp(disc.transToken);
}

row.replaceToken('receiveHelpURL',receiveHelpURL);


var style=!disc.artist?'visibility:hidden':'';
this._renderStatus(isShippedTab,row,
disc,pendingT,receivedT);
row.next();
}
t.compose();
var paginator=new widgets.core.Paginator(res.req.params.type+'PaginatorTop','lite',
res.req.params.type+'PaginatorBottom','big');
paginator.renderTwo(res);
}else{
mojo.setContent(this.tabs.active.contentId,
isShippedTab?lt.TradingHistory.emptyshipped:lt.TradingHistory.emptyreceived);
}

mojo.css.show(this.tabs.active.contentId);
},

_renderStatus:function(isShippedTab,row,disc,pendingT,receivedT){
var status=null;
var t=null;
if(!disc.receiveDate){
t=pendingT;




if(isShippedTab){
if(!disc.isActivated){
t=$T(lt.TradingHistory.statusPendingNeedsActivate);
}
t.replaceToken('transtoken',disc.transToken);
}else{
t=$T(lt.TradingHistory.receivedStatus);
t.replaceToken('transtoken',disc.transToken);
}
status=t.compose();
}else{
if(isShippedTab){



status=lt.TradingHistory.shipStatusReceived;
if(strings.conditions.isCancelled(disc.condition)){
status=strings.conditions.text.Void;
row.replaceToken('statusClass','notgoodcond');
}
}else{
t=receivedT;
var txt=strings.conditions.text[disc.condition];
if(!strings.conditions.isGood(disc.condition)){
row.replaceToken('statusClass','notgoodcond');
}

t.replaceToken('condition',txt);
status=t.compose();
}
}
row.replaceToken('status',status);
},

renderHelpContent:function(tabName){
var configName='TradingHistory_'+((tabName=='shipped')?'shipped':'received');
api.Content.getHelpConfig(configName,function(res){
if(!res.data||DataModel.g.getUserPreference('hide'+configName)){
$D('basicsDivContainer',false);
return;
}
$T(lt.TradingHistory.hideBasics,'hideBasicsDiv')
.replaceToken('configName',configName)
.compose();
widgets.Help.renderBullets(res.data.categories[0].topics,2,'basicsDiv');
$S('basicsDivTitle','Trading Basics');
$D('basicsDivContainer',true,(mojo.IE)?'block':'table-cell');
});
}
};
Object.extend(TradingHistoryPage.prototype,Page.prototype,true);
MyMusic.addPage('trade/history',function(){return new TradingHistoryPage("shipped");});
MyMusic.addPage('trade/history/shipped',function(){return new TradingHistoryPage("shipped");});
MyMusic.addPage('trade/history/received',function(){return new TradingHistoryPage("received");});





TradingMessagesPage=Class.create();
TradingMessagesPage.all={};
TradingMessagesPage.prototype={
initialize:function(params){
this.initPage({authLevel:1,theme:'grayTheme',
title:'Trade > Messages',
pageId:'TradeMessages',
skelClass:'tradeMessagesView'});
this.extraPath=params;
},

PAGE_SIZE:12,
showAlerts:true,





getPageTitle:function(){
return'Trade > Messages';
},

onLoad:function(){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

var t=$T(g_messageCenterTabRegionTemplate);
this.renderIntoContentRegion(t);

var self=this;
api.Trading.getTradePageData(function(res){
self.pageData=res.data;
lala.user.requestedCount=self.pageData.requestedCount;

var w=new TradeMessageCenter(lala.user.userToken,
res.data.rtransCount,
res.data.stransCount,
res.data.privateMessageCount);

w.extraPath=self.extraPath;
self.messageCenter=w;
self.messageCenter.renderTabs();
});

}
};
Object.extend(TradingMessagesPage.prototype,Page.prototype,true);
MyMusic.addPage('trade/messages',function(){return new TradingMessagesPage("inbox");});
MyMusic.addPage('trade/messages/inbox',function(){return new TradingMessagesPage("inbox");});
MyMusic.addPage('trade/messages/shipreminders',function(){return new TradingMessagesPage("shipreminders");});
MyMusic.addPage('trade/messages/confirmreceive',function(){return new TradingMessagesPage("confirmreceive");});



var ShipItPage=Class.create();
ShipItPage.prototype={
initialize:function(){
this.initPage({authLevel:1,
theme:'grayTheme',
skelClass:'shipItView',
pageId:'ShipItPage'});
this.discId=null;
ShipItPage.g=this;
},

onLoad:function(pathParts){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

var discId=pathParts[2];
api.Trading.getShipItPageData(discId,function(res){
if(!res.data){
this._album=null;
this.renderWideColumn();
return;
}
this._album=res.data.album;

if(res.data.friend){
this._tokenFriendShip=lala.params.ft;
if(res.data.friendDisc.isArtRequired){
this._album.isShippableWithCoverArt=true;
this._album.isShippableWithoutCoverArt=false;
}
}
this.renderWideColumn();

}.lbind(this));
},

onUnload:function(){
},

getPageTitle:function(){
return"Trade > Ship It";
},

getMainContentHeader:function(){
var t=$T(lt.ShipIt.heading);
var album=this._album;
t.replaceTokensWithBean('album',album);
if(album.nbdisc>1){
t.replaceToken('discnum','(Disc '+album.discno+'/'+album.nbdisc+')');
}
t.replaceToken('albumYear',(album.year)?"("+album.year+")":"");
if(lala.user.canShip&&album!=null&&album.isShippable){
t.replaceToken('cdRequested','block');
t.replaceToken('albumNull','none');
t.replaceToken('userCanShip','none');
t.replaceToken('defaultCase','none');
}else{
if(album===null){
t.replaceToken('cdRequested','none');
t.replaceToken('albumNull','block');
t.replaceToken('userCanShip','none');
t.replaceToken('defaultCase','none');
}else if(lala.user.canShip){
t.replaceToken('cdRequested','none');
t.replaceToken('albumNull','none');
t.replaceToken('userCanShip','block');
t.replaceToken('defaultCase','none');
}else{
t.replaceToken('cdRequested','none');
t.replaceToken('albumNull','none');
t.replaceToken('userCanShip','none');
t.replaceToken('defaultCase','block');
}
}
return t.compose();
},

renderWideColumn:function(){
var sb=[];
if(!this._album){
this.renderIntoContentRegion($T(lt.ShipIt.shipErrorSkeleton));
return;
}
var album=this._album;
sb.push(this.getMainContentHeader());
var t=null;
if(lala.user.canShip&&album&&album.isShippable){
var suffix="";
var templateName=null;
if(album.isShippableWithCoverArt&&
album.isShippableWithoutCoverArt&&
album.coverArtStatus!="HasNoArt"){

suffix="";
templateName=lt.ShipIt.userCanShipArtOptional;
}else if(album.isShippableWithCoverArt&&
!album.isShippableWithoutCoverArt){

suffix="withCoverArt";
templateName=lt.ShipIt.userCanShipArtRequired;
}else if(album.isShippableWithoutCoverArt){

suffix="withoutCoverArt";
templateName=lt.ShipIt.userCanShipNoArt;
}
t=$T(templateName);
t.replaceTokensWithBean("album",album);
if(album.nbdisc>1){
t.replaceToken('discnum','(Disc '+album.discno+'/'+album.nbdisc+')');
}

if(g_pageData.friend){
t.replaceTokensWithBean('friend',g_pageData.friend);
t.removeTokenBlock('MemberGreetingBlock');
}else{
t.removeTokenBlock('FriendGreetingBlock');
}

t.replaceToken("coverArtStatus",suffix);
var warningKey="_ship_warning_"+suffix;

t.replaceToken("shipWarning",strings.ShipIt[warningKey]);
}else{
t=$T(lt.ShipIt.userCannotShip);


if(lala.user.canShip){
t.replaceToken('userCanShip','block');
t.replaceToken('defaultCase','none');
}else{
t.replaceToken('userCanShip','none');
t.replaceToken('defaultCase','block');
}
}
sb.push(t.compose());
this.renderIntoContentRegion($T(sb.join(' ')));
},


renderAlbumArt:function(){
var t=$T(g_albumArt);
t.replaceTokensWithBean('disc',this._album);
return t.compose();
},

setNoCoverArt:function(id,timestamp){
var onresponse=function(){
var template=$T(lt.ShipIt.ArtBitSet,'cornerBox');
template.compose();
}

api.Trading.setHaveListCoverArtStatus(id,timestamp,'HasNoArt',
onresponse);

},

commitWithArt:function(id,timestamp,button){
this._commit(id,timestamp,true,button);
},

commitNoArt:function(id,timestamp,button){
this._commit(id,timestamp,false,button);
},

_commit:function(id,timestamp,withCoverArt,button){
var self=this;
var doSubmit=function(){
var onresponse=function(transId){
if(transId!=null){
frontend.go.ShipLabel(transId);
}else{
alert(strings.ShipIt.no_more_ship);
frontend.go.HaveList();
}
};
var friendToken=self._tokenFriendShip;
api.Trading.shipCD(id,timestamp,withCoverArt,friendToken,onresponse);
};
lala.updateSubmitButton(button,doSubmit);
}
};
Object.extend(ShipItPage.prototype,Page.prototype,true);
MyMusic.addPageRegex('trade',
/trade\/shipit\/.*$/,
function(){return new ShipItPage();});





ShipLabelPage=Class.create();
ShipLabelPage.prototype={
initialize:function(){
this.initPage({authLevel:1,
theme:'grayTheme',
title:'Trade - Ship Label',
pageId:'ShipLabelPage',
skelClass:'shipLabelView'});
this.transId=null;
this._willShowAddress=false;
this._labelAddressHTML="You are currently unable to view this address";
this._isAddressVisible=false;
this._album=null;
this._transactionCompleted=null;

ShipLabelPage.g=this;
},

onLoad:function(pathParts){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

this._transId=pathParts[2];




MyMusic.g.tradeNumbersUpdater.lastUpdateTimestamp=0;
MyMusic.g.tradeNumbersUpdater.updateTradeModel();
MyMusic.g.tradeNumbersUpdater.lastUpdateTimestamp=new Date().getTime();

api.Trading.getShipLabelPageData(this._transId,function(res){
if(!res.data)return;
this._album=res.data.album;
this._transactionCompleted=res.data.transactionCompleted;

if(!this._album){
this.renderIntoContentRegion($T(lt.ShipLabel.errorSkeleton));
return;
}

this.renderWideColumn();


if(this._willShowAddress){
this.showAllActivatedContent();
this.showAddress();
}else{
this.showSerialDialog();
}
}.lbind(this));
},

onUnload:function(){
},

getPageTitle:function(){
return"Trade > Ship Label";
},

renderWideColumn:function(){
var t=$T(lt.ShipLabel.mainBody);
t.replaceTokensWithBean('album',this._album);
if(this._album.nbdisc>1){
t.replaceToken('discnum','(Disc '+this._album.discno+'/'+this._album.nbdisc+')');
}
this._willShowAddress=(this._album.isActivated);

t.replaceToken('transId',this._transId);
t.replaceToken('dpi',mojo.MAC?'72':'96');
if(this._willShowAddress){
t.replaceToken('continueLabel',"Continue");
}else{
t.replaceToken('continueLabel',"Later");
}
var warningKey="_ship_warning_";
var suffix="";
if(this._album.hasCoverArt&&this._album.hasNoCoverArt){
suffix="";
}else if(this._album.hasCoverArt){
suffix+="withCoverArt";
}else{
suffix+="withoutCoverArt";
}
t.replaceToken("coverArtStatus",suffix);
warningKey+=suffix;
t.replaceToken("shipWarning",strings.ShipLabel[warningKey]);

this.renderIntoContentRegion(t);

if(this._album.hasCoverArt){
mojo.css.display('coverArtRequiredNote',true);
}else{
mojo.css.display('noCoverArtRequiredNote',true);
}
},

renderAlbumArt:function(){
var t=$T(g_albumArt);
t.replaceTokensWithBean('disc',this._album);
return t.compose();
},

showSerialDialog:function(){
var self=this;
var onkeyup=function(event){
this.value=this.value.toUpperCase();
if(this.value.length>=3){
$('serialNo4').focus();
}
}

var d=new MojoDialog({
id:'shipDialog',
title:'Activate Your Envelope',
shouldCenter:true,
disableEscape:true
});

d.onOpen=function(){
mojo.css.show('envSpotlight');
mojo.dom.setEventListener($('serialNo3'),'onkeyup',onkeyup);
mojo.dom.setEventListener($('serialNo4'),'onkeyup',function(){
this.value=this.value.toUpperCase();
});
mojo.input.onEnterKey('serialNo4',self.submitSerialNo.lbind(self));
$("serialNoSubmit").onclick=self.submitSerialNo.lbind(self);

$('serialNo3').focus();
};

d.open($TC(lt.ShipLabel.activateDialog));
},

closeSerialDialog:function(){
MojoDialog.close();
mojo.css.hide('envSpotlight');
this.showAllActivatedContent();
},

showAllActivatedContent:function(){
mojo.css.show('shipNote');
if(lala.params.fs=='true')mojo.css.display('supply',true);
},

showAddress:function(){
var self=this;
if(!this._transactionCompleted){
var onresponse=function(res){
if(res.data.receiver){
self._receiver=res.data.receiver;
self._receiver.shippingAddress=res.data.receiverAddress;
self._isAddressVisible=true;
self._writeAddress(self._receiver,lt.ShipLabel.addrLine);
}else{
mojo.setContent("address",$TC(lt.ShipLabel.serverErrorMsg));
}
}

api.Trading.getAddress(this._transId,onresponse);
}else{
this.transCompleted();
}
},

_writeAddress:function(params,templ,noPrint){
if(params!=null){
var t=$T(templ);
if(params.firstName==''&&
params.lastName==''){
params.firstName='Current';
params.lastName='Resident';
}
t.replaceTokensWithBean("params",params);
this._labelAddressHTML=t.compose();
mojo.setContent("address",this._labelAddressHTML);
}

if(this._willShowAddress){
this.showAllActivatedContent();
}

if(!noPrint){
mojo.css.show("printLabel");
this.showButtons(true);
}else{
this.showButtons(false);
}

var code=this._album.envelopeCode;
if(mojo.isEmpty(code))code="???????";
var code3=code.substring(0,3);
var code4=code.substring(3,7);
mojo.setContent("envelopeId3",code3);
mojo.setContent("envelopeId4",code4);
},

showButtons:function(isTransactionComplete){
mojo.css.show('buttonsRow');
if(isTransactionComplete){

mojo.css.hide('incompleteButtons');
mojo.css.display('incompleteButtons',false);
}else{

mojo.css.show('incompleteButtons');
mojo.css.display('incompleteButtons',true);
}
},

submitSerialNo:function(){
var self=this;

var f3=$F("serialNo3").toUpperCase();
var f4=$F("serialNo4").toUpperCase();
if(f3.length<3||f4.length<4){
alert('Please enter the Envelope ID exactly as it appears on the front of the envelope.');
return;
}

var serialNo=f3+f4;
var onresponse=function(res){
if(res.data.reason){
switch(res.data.reason){
case"invalid":
alert("Invalid envelope ID. Make sure you didn't make a typo.");
break;
case"duplicate":
alert('This envelope ID has already been used. Please use another envelope.');
break;
case"envelope_shape":
alert('This envelope is too old. Please contact support.');
break;
default:
alert('Something went horribly wrong. Please contact support as soon as you can before someone gets hurt.');
};
mojo.focus('serialNo3');
}else{
self.closeSerialDialog();
self._album.envelopeCode=serialNo.toUpperCase();
self.showAddress();
}
}


api.Trading.setSerialNo(this._transId,serialNo,onresponse);
},

enterIdLater:function(){
var params={};
var t=$T(lt.ShipLabel.activateLaterMsg);
params.line=t.compose();
this.closeSerialDialog();
mojo.css.show('buttonsRow');
this._writeAddress(params,lt.ShipLabel.notAllowedAddrLine,true);
},

transCompleted:function(){
var params={};
var t=$T(lt.ShipLabel.mainBody_transCompleted);
params.line=t.compose();
this._writeAddress(params,lt.ShipLabel.transCompleted,true);
},

openPrint:function(style){
if(style=='pdf'){

window.open((lala.URL.BarcodePDF+'?transaction='+lala.params.transId));
}else{
window.open((lala.URL.PrintShipLabel+'?transId='+lala.params.transId),
'labelWindow','width=400,height=200');
}
},

getAddressHTML:function(){
return{address:this._labelAddressHTML,
isVisible:this._isAddressVisible,
isTransactionClosed:this._transactionCompleted};
},

activateButton:function(){
window.location=lala.URL.ShipLabel+window.location.search;
},

continuePage:function(pageId,params){
lala.gotoPage.url(lala.URL[pageId],params);
}
};
Object.extend(ShipLabelPage.prototype,Page.prototype,true);
MyMusic.addPageRegex('trade',
/trade\/shiplabel\/.*$/,
function(){return new ShipLabelPage();});






var ReceivedStatusPage=Class.create();
ReceivedStatusPage.prototype={
initialize:function(){
this.initPage({authLevel:1,theme:'grayTheme',
title:'Trade - Received Status',
pageId:'ReceivedStatusPage',
skelClass:'receivedStatusView'});

this._transId=null;
this._album=null;
ReceivedStatusPage.g=this;
},

onLoad:function(pathParts){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

this._transId=pathParts[2];

this.twoColLayout=new widgets.core.TwoColumn();
this.renderIntoContentRegion($T(this.twoColLayout.render()));

api.Trading.getReceivedStatusPageData(this._transId,function(res){
if(!res.data)return;
this._album=res.data.album;
if(!this.isValid()){
if(!this._album){
this.renderIntoContentRegion($T(g_receivedStatus_invalid));
}else{
this.renderIntoContentRegion($T(g_receivedStatus_alreadyUpdated));
}
}else{

var back=$('backButton');
if(back)back.onclick=frontend.back;

this.renderWideColumn();
}
this.renderNarrowColumn();
}.lbind(this));
},

onUnload:function(){
},

getPageTitle:function(){
return"Trade > Received Status";
},

isValid:function(){
return this._album&&
this._album.shipDate&&
(this._album.condition=='PendingReceive');
},

renderWideColumn:function(){
var t=$T(g_receivedStatus_mainBody,this.twoColLayout.col1);
t.replaceTokensWithBean('album',this._album);
widgets.core.Template.replaceTransactionCondition(t,this._album,
lala.user.isCoverArtNeutral);
t.compose();
},

renderNarrowColumn:function(){
$T(g_receivedStatus_albumArt,this.twoColLayout.col2)
.replaceTokensWithBean('album',this._album)
.compose();
api.Content.getHelpConfig('ReceivedStatus',function(res){
if(!res.data){
$D('faqDivContainer',false);
return;
}
widgets.Help.renderBullets(res.data.categories[0].topics,2,'faqDiv');
});
},

renderAlbumArt:function(){
var album=this._album;
var t=$T(g_receivedStatus_albumArt);

t.replaceTokensWithBean('album',album);
return t.compose();
},

onReceivedCD:function(cond){
var self=this;

var radios=document.getElementsByName("conditions");
var condition=mojo.form.getRadioValue(radios);
if(condition==null)mojo.log.error('invalid condition: '+cond);


var onresponse=function(res){
lala.resetSubmitButton('statusButton');



if(!res.data&&(condition==strings.conditions.NotReceived)){
alert(strings.ReceivedStatus.conditions.wait);
return;
}


var confirmation=$T(g_receivedStatus_confirmation,'confirmation');
confirmation.replaceTokensWithBean('album',self._album);

var msg=strings.ReceivedStatus.conditions[condition];
if(!msg)msg=strings.ReceivedStatus.conditions['default'];
confirmation.replaceToken('extraText',msg);
confirmation.compose();




lala.user.willReceiveCount--;
if(res.data
&&(condition=="Good"||condition=="GoodWithArt")){
lala.user.haveListCount++;
}
mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
};

var func=function(){
api.Trading.receivedCD(self._transId,
condition,onresponse);
};
lala.updateSubmitButton('statusButton',func);
}
};
Object.extend(ReceivedStatusPage.prototype,Page.prototype,true);
MyMusic.addPageRegex('trade',
/trade\/receivedstatus\/.*$/,
function(){return new ReceivedStatusPage();});

strings.HaveList={
embedBiscuit:'Embed a biscuit in your webpage',
ship_col:'Ship',
keep_col_tooltip:'Indicates if you are not interested in trading a CD',
ship_col_tooltip:'Indicates if a member is requesting your CD',
art_col_tooltip:'Indicates if you have cover art for a CD',
keep_icon_off_tooltip:'You want to trade this CD',
keep_icon_on_tooltip:'You want to keep this CD',
art_icon_hasart_tooltip:'You have cover art for this CD',
art_icon_hasnoart_tooltip:'You don\'t have cover art for this CD',
art_icon_unknown_tooltip:'You haven\'t indicated if you have cover art',
supplies_coming:'<div class="lcenter" style="margin: 20px 0px 26px 0px">Your shipping kits should arrive in 3-5 days.</div>',
supplies_failed:'<div class="lcenter" style="margin: 20px 0px 26px 0px">Sorry, we can\'t process this request at this time.  Try again later.</div>',
tab_all:'CDs I Have',
tab_filter:'CDs Requested',
no_friends:"<div style=\"padding:4px\">You don't have any Lala friends. <br><br>You can add friends by visiting their karma pages</div>"
};

strings.WantList={
ship_col:'Status',
tab_all:'CDs I Want',
tab_filter:"CDs Coming",
art_col_tooltip:'Indicates if you want cover art for a CD',
art_icon_artrequired_tooltip:'You only want this CD with cover art',
art_icon_unknown_tooltip:'You don\'t care about cover art'
};

strings.TradingHistory={
tab_all:"Shipped CDs",
tab_filter:"Received CDs",
col_shipped:'Shipped To',
col_received:'Shipped By',
empty_shipped:'shipped',
empty_received:'received',
invisible:'undisclosed'
};

strings.ShipIt={
no_more_ship:"Sorry, this CD can no longer be shipped.",
_ship_warning_withCoverArt:"Cover art required",
_ship_warning_withoutCoverArt:"Requested Without Cover Art",
canceltrade_nocoverart_heading:"Okay. No problem.",
canceltrade_nocoverart_message:"You won't be asked to ship this disc again until Lala can find someone who wants it without cover art."
};

strings.ShipLabel={
enter_later:"You need to activate your envelope to see the address.<br>"+
"Go to your \"Trades\" page to activate later.",
_ship_warning_withCoverArt:"Cover art REQUIRED*",
_ship_warning_withoutCoverArt:"Do not send cover art",
invalid_envelopeCode:"The Envelope ID is not valid.\n"+
"Please verify that you've entered it exactly as "+
"it appears on the envelope.",
duplicate_envelopeCode:"This Envelope ID has already been entered for "+
"another trade. Please use a different envelope.",
envelope_shape_envelopeCode:"This envelope type cannot be used anymore. "+
"Please order new shipping supplies."
};

strings.ReceivedStatus={
conditions:{
'Good':'We moved this CD from your Want list to your Have list.',
'GoodWithArt':'We moved this CD from your Want list to your Have list.',
'default':"We are sorry for the inconvenience. We will leave this CD on your Want list and find another Lala member with this CD.",
'wait':"CDs can take up to 14 days to arrive.  If your CD has not arrived after 14 days, select the 'Never Received' option and we will find another Lala member with this CD."
}
};

TradeMessageCenter=Class.create();
TradeMessageCenter.prototype={
initialize:function(userToken,rtransCount,stransCount,privateMessageCount){
this.id='messageCenter'+mojo.idGenerator++;
this._rtransCount=rtransCount;
this._stransCount=stransCount;
this._privateMessageCount=privateMessageCount;
this.userToken=userToken;
this.transIdHash={};
this.PAGE_SIZE=20;
this.renderCallback=null;
this.openMsgs=false;
this.showSent=false;
this.tabs=null;
this.mojoTicket=mojo.baggage.check(this);
this.backUserKey=this.id+'_userToken';
this.renderTargetId=null;
this.extraPath=null;
},

loadAndRender:function(params){
var tabId=null;
if(params.tab){
tabId=params.tab;
}else{
if(this._privateMessageCount>0){
tabId='inbox';
}else if(this._stransCount>0){
tabId='shipReminders';
}else if(this._rtransCount>0){
tabId='receivedReminders';
}else{

tabId='inbox';
}
}
this.tabs.activateTab(tabId,true,params,null);
},

renderTabs:function(){
this.tabs=mojo.newtabs.create({id:'messages',
divTabsId:'messagesTabsContainer',
divTabsContentId:'messagesTabsContent'});

this.tabs.onTabClick=this.ontabclick.lbind(this);
this.tabs.add({
id:'inbox',
title:'Inbox ('+this._privateMessageCount+')',
path:'/trade/messages/inbox'});
this.tabs.add({
id:'shipreminders',
title:'Ship Reminders ('+this._stransCount+')',
path:'/trade/messages/shipreminders'});
this.tabs.add({
id:'confirmreceive',
title:'Confirm Receive ('+this._rtransCount+')',
path:'/trade/messages/confirmreceive'});
this.tabs.activate(this.extraPath?this.extraPath:'inbox');
},

toggleShowSent:function(){
this.showSent=!this.showSent;
this.reload();
},

reload:function(){
this.ontabclick(this.tabs.active.id);
},

ontabclick:function(tab){
if(tab.id=='shipreminders'){
api.Trading.getTransactions({count:this.PAGE_SIZE,
type:'unconfirmedShipped'},
this.renderShipReminders.lbind(this)
);
}else if(tab.id=='confirmreceive'){
api.Trading.getTransactions({count:this.PAGE_SIZE,
type:'unconfirmedReceived'},
this.renderReceiveReminders.lbind(this));
}else{
api.Messaging.getThreads(
{src:this.userToken,
type:'PrivateBlurb',
count:this.PAGE_SIZE,
includeAutoHide:!!this.showSent,
onResponse:this.renderMessages.lbind(this)});
}
},

renderShipReminders:function(res){
var html=[];
this._renderReminders(res,"ship",html);
this._setRemindersContent(res,html.join(''),"ship");
},

renderReceiveReminders:function(res){
var html=[];
this._renderReminders(res,"receive",html);
this._setRemindersContent(res,html.join(''),"receive");
},

_setRemindersContent:function(res,html,prefix){
if(res.data.total==0){

mojo.setContent(this.tabs.active.contentId,
strings.MessageCenter["no_"+prefix]);
}else if(res.data.list.length==0){

mojo.setContent(this.tabs.active.contentId,
strings.MessageCenter["no_recent_"+prefix]);
}else{
mojo.setContent(this.tabs.active.contentId,html);
var paginator=new widgets.core.Paginator(
this.tabs.active.id+'PaginatorTop','lite',
this.tabs.active.id+'PaginatorBottom','big');
paginator.renderTwo(res);
}

},

_renderReminders:function(res,prefix,html){
var rendered=0;

var t=$T(g_remindersBody);
var remDiv=t.getTokenBlock('remDiv');
remDiv.replaceToken('type',this.tabs.active.id);
var row=remDiv.getTokenBlock('remRow');
row.setEmptyTokenText('&nbsp;');

if(!res.data.list){
mojo.log.error('res.data.list is null in render reminders ??');
return;
}
for(var i=0;i<res.data.list.length;i++){
var trans=res.data.list[i];
var href='';
var linkText='';
this._addToHash(trans.transToken,trans);
if(prefix=='ship'){


href=frontend.link.ShipLabel(trans.transToken);
linkText=strings.msg_center.shipped_status;
}else if(prefix=='receive'){
href=frontend.link.ReceivedStatus(trans.transToken);
linkText=strings.msg_center.received_status;
}

var isTransUserVisible=false;
if(trans.isActivated){
isTransUserVisible=
trans.isShip?trans.waiter.isVisibleTrader
:trans.owner.isVisibleTrader;
}


if(trans.isActivated&&lala.user.isVisibleTrader
&&isTransUserVisible){
row.removeTokenBlock('MissingUserToken');
row.replaceToken('transUserName',
trans.isShip?trans.waiter.nickName
:trans.owner.nickName);
var token=trans.isShip
?trans.waiter.userToken:trans.owner.userToken;
row.replaceToken('userToken',token);
row.replaceToken('nickNameClassName',frontend.getMemberClassName(trans.isShip?trans.waiter:trans.owner));
}else{
row.removeTokenBlock('HasUserToken');
row.replaceToken('transUserName',strings.TradingHistory.invisible);
row.replaceToken('userHref',"");
row.replaceToken("nickNameClassName","");
}
row.replaceToken("activateClass","llink");

if(!trans.isActivated){
if(trans.isShip){
row.replaceToken('transUserName',
strings.TradingHistory.invisible);
row.replaceToken('userHref',"");
row.replaceToken("nickNameClassName","");
row.replaceToken("activateClass","activateLink");
linkText=strings.msg_center.ship_activate_now;
}
}

row.replaceToken('statusHref',href);
row.replaceToken('statusText',linkText);

var tabId=trans.isShip?"shipped":"received";
var helpWizardURL=
trans.isShip?frontend.link.ShippingHelp(trans.transToken)
:frontend.link.ReceivingHelp(trans.transToken);
row.replaceToken('helpWizardURL',helpWizardURL);
row.replaceToken('id',trans.transToken);
row.replaceToken('tabId',tabId);

row.replaceToken('helpVis',trans.isShip?"visible":"hidden");
row.replaceToken('hoverPrefix',
strings.MessageCenter[prefix+'_reminders_hover_prefix']);
row.replaceTokensWithBean('disc',trans);
if(trans.nbdisc>1){
t.replaceToken('discnum','(Disc '+trans.discno+'/'+trans.nbdisc+')');
}

row.replaceToken('viewHref',href);
row.replaceToken('mcticket',this.mojoTicket);

row.next();
rendered++;
}
if(rendered>0){
html.push(t.compose());
}

return rendered;
},


_addToHash:function(transToken,trans){
this.transIdHash[transToken]=trans;
},

_getFromHash:function(transToken){
return transIdHash[transToken];
},

renderMessages:function(res){
var html=this.renderThreads(res);
mojo.setContent(this.tabs.active.contentId,html);

if(res.data.total>0){
var paginator=new widgets.core.Paginator(
'privateBlurbPagingTop','lite',
'privateBlurbPagingBottom','big');
paginator.renderTwo(res);
}
},

renderThreads:function(res){
this.res=res;
var html='';
var threads=res.data.threads;

var len=threads.length;
var t=$T(g_privateBlurbs);
t.replaceToken('mcticket',this.mojoTicket);
if(this.showSent)t.replaceToken('checked','checked');

if(threads.length>0){
var row=t.getTokenBlock('PMBlurbBlock');
row.dateFormatString="%b %d, %Y";
for(var i=0;i<len;++i){
var thread=threads[i];
var trans=thread.transaction;
var summary=this.getSummary(trans,thread);

row.replaceToken('openIcon',
this.openMsgs?'open':'closed');
row.replaceToken('openMessage',
this.openMsgs?'':'none');
row.replaceTokensWithBean('summary',summary);
row.replaceTokensWithBean('thread',thread);
row.replaceToken('canDelete',thread.canDelete?'':'none');
row.next();
}
html=t.compose();
}else{
t=$T(g_noPMMessages);
html=t.compose();
}
return html;
},

getSummary:function(trans,thread){
var summary={};
summary.subject=trans.isShip?'You are shipping':'You are receiving';
summary.from=this.getThreadFrom(thread,trans);

return summary;
},

getThreadFrom:function(thread){

var text='';
var isVisibleTrader=lala.user.isVisibleTrader;
if(isVisibleTrader&&thread.src.isVisibleTrader){
text+='<a '+frontend.link.Member(thread.src.userToken)+'" class="'+
frontend.getMemberClassName(thread.src)+'">';
text+=thread.count>0
?thread.src.nickName.substring(0,10)
:thread.src.nickName;
text+='</a>';
}else if(thread.src.userToken==lala.user.userToken){
text+='me';
}else{
text+='undisclosed';
}


if(thread.count>0){
if(thread.count>1)text+=', ... ';
else text+=', ';

if(isVisibleTrader&&thread.lastMsg.src.isVisibleTrader){
text+='<a '+frontend.link.Member(thread.lastMsg.src.userToken)+'" class="'+
frontend.getMemberClassName(thread.lastMsg.src)+'">';
text+=thread.lastMsg.src.nickName.substring(0,10);
text+='</a>';
}else if(thread.lastMsg.src.userToken==lala.user.userToken){
text+='me';
}else{
text+='undisclosed';
}

text+=' ('+(thread.count+1)+')';
}

return text;
},

toggleViewThread:function(threadToken){
var elem=$('pmthreadicon'+threadToken);
var show=(elem.innerHTML=="view");
if(show){
var thread=this.res.data.threadsByToken[threadToken];
if(thread.replies){
mojo.css.display("pmthreadreplies"+threadToken,true);
this.renderReplies(thread);
mojo.setContent(elem,'close');
}else{
var onresponse=function(res){
mojo.css.display("pmthreadreplies"+threadToken,true);
thread.replies=res.data.list;
thread.replies.linsertAt(thread,0);

this.renderReplies(thread);
mojo.setContent(elem,'close');
}.lbind(this);

api.Messaging.getReplies({threadToken:threadToken,
onResponse:onresponse});
}
}else{
mojo.setContent(elem,'view');
mojo.css.display("pmthreadreplies"+threadToken,false);
}
},

renderReplies:function(thread){
var trans=thread.transaction;
var t=$T(g_pmReplies,
'pmthreadreplies'+thread.msgToken);
var isWaiter=(trans.waiter&&lala.user&&
trans.waiter.userToken==lala.user.userToken);

t.dateFormatString="%b %d, %Y at %l:%M%p";
t.replaceToken('transShipDirection',(isWaiter)?
'They agreed to ship on':
'You agreed to ship on');
t.replaceToken('transReceiveDirection',(isWaiter)?
'You received it on':
'They received it on');
if(!trans.receiveDate){
trans.receiveDate="Not yet received";
}
t.replaceTokensWithBean('trans',trans);

var l=t.getTokenBlock('ReplyBlock');
for(var i=0;i<thread.replies.length;i++){
var msg=thread.replies[i];

l.replaceToken('nickNameClassName',frontend.getMemberClassName(msg.src).replace(/lmemberlink/,''));
l.replaceToken('msgSrc',
msg.src.isVisibleTrader
?msg.src.nickName:'undisclosed');
l.replaceToken('msgText',msg.text);
l.replaceToken('msgClass',
msg.src.userToken==lala.user.userToken?'me':'notme');
l.next();
}
t.compose();
},

addReply:function(threadToken){
var open=mojo.css.toggleDisplay('pmreplydiv'+threadToken);
if(open){
mojo.focus('pmreplytext'+threadToken);
}
},

submitAddReply:function(threadToken,btn){
var text=$F('pmreplytext'+threadToken);
text=text.ltrim();
if(mojo.isEmpty(text))return;
var me=this;
var onresponse=function(res){
lala.resetSubmitButton(btn);
$('pmreplytext'+threadToken).value="";
me.reload();
};

var doSubmit=function(){
api.Messaging.addReply({threadToken:threadToken,
text:text,
onResponse:onresponse});
}
lala.updateSubmitButton(btn,doSubmit);
},

deleteThread:function(threadToken){
if(!confirm(strings.msg_center.delete_confirm))return;

var onresponse=function(res){
mojo.table.deleteRow('messageRow_'+threadToken);
mojo.table.deleteRow('messageReplyContainer_'+threadToken);
mojo.table.deleteRow('messageAddReply_'+threadToken);
}.lbind(this);

api.Messaging.deleteThread({threadToken:threadToken,
onResponse:onresponse});
},

openSendTradeMessage:function(transToken){
var elem=$("comment"+transToken);
mojo.css.display(elem,true);
var textArea=$('text'+transToken);
textArea.focus();
},

closeSendTradeMessage:function(transToken){
var textArea=$('text'+transToken);
textArea.value="";
mojo.css.display("comment"+transToken,false);
},

postSendTradeMessage:function(transToken){
var onresponse=function(res){
$('text'+transToken).value="";
lala.resetSubmitButton('post'+transToken);
lala.resetSubmitButton('cancel'+transToken);

var commentDivId='commentDiv'+transToken;
var ackId='sendPMConfirm'+transToken;

mojo.css.display(commentDivId,false);
mojo.css.display(ackId,true);
mojo.setContent(ackId,'Message sent');
var func=function(){
mojo.css.display(ackId,false);
mojo.css.display(commentDivId,true);
mojo.css.display('comment'+transToken,false);
};
window.setTimeout(func,3000);
}

var doSubmit=function(){
var text=$F('text'+transToken);
api.Messaging.createThread({
src:lala.user.userToken,
dst:transToken,
transToken:transToken,
type:'PrivateBlurb',
text:text,
onResponse:onresponse});
}
lala.updateSubmitButton('post'+transToken,doSubmit);
lala.updateSubmitButton('cancel'+transToken,null);
}
};

strings.MessageCenter={
tab_inbox_title:"Inbox",
tab_ship_reminders_title:"Ship Reminders",
tab_receive_reminders_title:"Confirm Receive",
ship_reminders_hover_prefix:"View the shipping address for",
receive_reminders_hover_prefix:"Update the received status for",
no_ship:"<span>You have no pending ships.</span>",
no_receive:"<span>You don't have any CDs coming your way right now.  Add more CDs to your want list.</span>",
no_recent_ship:"<span>You haven't shipped any CDs recently.</span>",
no_recent_receive:"<span>You have no pending receives.  Try adding more CDs to you have list.</span>"
};

strings.msg_center={
shipped_status:'address',
received_status:'status',
ship_activate_now:'activate',
delete_confirm:'Are you sure you want to delete this trading message and all of its replies?'
};



SearchPage=Class.create();
SearchPage.prototype={
initialize:function(){
this.initPage({pageTitle:'Search',
authLevel:0,pageId:'Search',
skelClass:'searchPage'});

this.tabs=null;
this.shortcuts=[];
this.twoColLayout=null;

SearchPage.g=this;
},

onLoad:function(pathParts){
this.initFromPath(pathParts);
this.setDocumentTitle('Music Search: '+this.query);
this.loadPage(pathParts);
},

initFromPath:function(pathParts){
this.query=pathParts[1];
this.baseQ=this.query+' ';

this.albumsQ=this.baseQ+' rank:album';
this.albumsCount=10;
this.songsQ=this.baseQ+' rank:song';
this.songsCount=20;
this.artistsQ=this.baseQ;
this.artistsCount=10;
this.sortKey='Relevance';
this.sortDir='Desc';
},

setSearchMode:function(){
var queryDisplay=this.query;
if(queryDisplay){
queryDisplay=queryDisplay.replace('approx: ','');
}
HeaderSearchBox.g.setMode('lala',queryDisplay);
},

loadPage:function(pathParts){
var self=this;

api.SearchPage.runBucketedSearch(
{albumsQ:this.albumsQ,
albumsCount:this.albumsCount,
songsQ:this.songsQ,
songsCount:this.songsCount,
artistsQ:this.artistsQ,
artistsCount:this.artistsCount,
sortKey:this.sortKey,
sortDir:this.sortDir
},
function(res){
self.songs=res.data.songs;
self.albums=res.data.albums;
self.artists=res.data.artists;
self.shortcuts=res.data.shortcuts;
self.renderPage(pathParts);
});
},

renderPage:function(pathParts){
var numMatches=this.artists.total+this.albums.total+this.songs.total;


var displayQ=this.query;
var isApproxQ=displayQ.lcontains('approx:');
if(isApproxQ){
displayQ=
displayQ.replace(
'approx: ','');

}

var t=$T(lt.Search.main)
.replaceToken('query',displayQ.lescapeHTML());
this.renderIntoContentRegion(t);

if(numMatches==0){
this.renderShortcuts();
this.renderNoMatchesAcrossAllBuckets();
return;
}else if(isApproxQ){


t=$T(lt.Search.expandedMatchesHeading,'expandedMatchesHeading');
t.compose();
}

var path=frontend.path.Search(this.query);
var tabConfigs=[];


tabConfigs.push({
id:'all',
path:path,
title:mojo.util.addCommasToNumber(numMatches)+' Matches',
rogueTabOnClick:this.renderSummary.lbind(this)
});

if(this.artists.total>0){
tabConfigs.push({
id:'artists',
path:path+'/artists',
title:mojo.util.addCommasToNumber(this.artists.total)+' Artists',
sort:['relevance'],
defaultSortOrder:{key:'Relevance',dir:'Desc'},
histos:['Genre','Subgenre']
});
}
if(this.albums.total>0){
tabConfigs.push({
id:'albums',
path:path+'/albums',
title:mojo.util.addCommasToNumber(this.albums.total)+' Albums',
sort:['relevance'],
defaultSortOrder:{key:'Relevance',dir:'Desc'},
histos:['Genre','Subgenre','AlbumType']
});
}
if(this.songs.total>0){
tabConfigs.push({
id:'songs',
path:path+'/songs',
title:mojo.util.addCommasToNumber(this.songs.total)+' Songs',
sort:['relevance','topRated'],
defaultSortOrder:{key:'Relevance',dir:'Desc'},
histos:['Genre','Subgenre']
});
}

var defTabId=pathParts.length>2?pathParts[2]:'all';
this.renderAPageTabs(
{tabs:tabConfigs},
'searchTabs','searchTabContent',true,defTabId);
},


renderSummary:function(){
this.twoColLayout=new widgets.core.TwoColumn({
renderTargetId:'searchTabContent'});
this.twoColLayout.render();

$T(lt.Search.col1,this.twoColLayout.col1)
.replaceToken('title',this.uiTitle)
.compose();
$TC(lt.Search.col2,this.twoColLayout.col2);


this.renderSongsSummary(this.songs);


this.renderArtistsSummary(this.artists);
this.renderAlbumsSummary(this.albums);

this.renderShortcuts();
},

onLoadAPageSongsTab:function(){
$S('searchShortcuts','');

this.aPageLoadAndRenderSongs(
this.songsQ,{showRatings:true,
hideZeroRating:true,
showListens:'count',
whichListen:'listens7'});
},

onLoadAPageAlbumsTab:function(){
$S('searchShortcuts','');

this.aPageLoadAndRenderAlbums(
this.albumsQ,{showListens:'count',whichListen:'listens7'});
},

onLoadAPageArtistsTab:function(){
$S('searchShortcuts','');

this.aPageLoadAndRenderArtists(
this.artistsQ,{showListens:'listens7',layout:'list'});
},

renderShortcuts:function(){
var genres=[];
var subgenres=[];
var labels=[];
var pages=[];
var spellcheck=[];
this.shortcuts.leach(function(s){
switch(s.type){
case"genre":
genres.push(s);
break;
case"subgenre":
subgenres.push(s);
break;
case"label":
labels.push(s);
break;
case"page":
pages.push(s);
break;
case"spellcheck":
spellcheck.push(s);
break;
}
});
if(spellcheck.length>0){
lala.Track.click('searchPage.didYouMean');
}

var html='';
html+=this.getShortcutContent(genres,'Music genres','genres');
html+=this.getShortcutContent(subgenres,'Music sub-genres','subgenres');
html+=this.getShortcutContent(labels,'Music labels','labels');
html+=this.getShortcutContent(pages,'Lala shortcuts','pages');
html+=this.getShortcutContent(spellcheck,'Did you mean','spellcheck');

$S('searchShortcuts',html);
},

toggleShowShortcuts:function(id,elem){
var div=$(id);
if(div.__open){
$D(div,false);
div.__open=false;
$S(elem,"more <img src='images/blank.gif'>");
mojo.css.addClass(elem,'lupDownArrowLink_more');
mojo.css.removeClass(elem,'lupDownArrowLink_less');
}else{
$D(div);
div.__open=true;
$S(elem,"less <img src='images/blank.gif'>");
mojo.css.addClass(elem,'lupDownArrowLink_less');
mojo.css.removeClass(elem,'lupDownArrowLink_more');
}
},

getShortcutContent:function(stuff,title,id){
if(stuff.length==0)return'';

var moreCutoff=3;

var t=$T(lt.Search.shortcuts);
t.replaceToken('title',title);
t.replaceToken('id',id);
var r=t.getTokenBlock('ResultBlock');

var count=stuff.length>moreCutoff?moreCutoff:stuff.length;

for(var i=0;i<count;i++){
this.doShortcutTokenReplacement(stuff,r,i);

}
if(stuff.length>moreCutoff){
var x=t.getTokenBlock('MoreContent').getTokenBlock('MoreResultBlock');
for(var i=moreCutoff;i<stuff.length;i++){
this.doShortcutTokenReplacement(stuff,x,i);
}

}else{
t.removeTokenBlock('MoreLink');
t.removeTokenBlock('MoreContent');
}

return t.compose();
},

doShortcutTokenReplacement:function(stuff,tmpl,index){
var shortcut=stuff[index];
var link='';
switch(shortcut.type){
case"genre":
link=frontend.link.BrowseGenre(shortcut.data);
break;
case"subgenre":
link=frontend.link.BrowseGenre(shortcut.genre,shortcut.data);
break;
case"label":
link=frontend.link.BrowseLabel(shortcut.data);
break;
case"page":
link=frontend.link[shortcut.data]();
break;
case"spellcheck":
link=frontend.link.Artist(shortcut.data);
break;
}
tmpl.replaceToken('link',link);
tmpl.replaceTokensWithBean('shortcut',shortcut);
tmpl.replaceToken('dash',index==stuff.length-1?'':'-');
tmpl.next();
},

renderNoMatchesAcrossAllBuckets:function(){



var self=this;
lala.Track.clientPage('zeroMatches');

var isApproxSearch=this.query.lcontains('approx:');
if(!isApproxSearch){

lala.Track.clientPage('zeroMatches_runAutoExpand');
frontend.go.Search('approx: '+this.query);
}else{
lala.Track.clientPage('zeroMatches_afterAutoExpand');



$S('searchTabs','&nbsp;');
api.SearchUtils.getGenres({Q:'filter: +full'},function(res){
$T(lt.Search.noMatchesAllAround,'searchTabContent')
.replaceToken('query',self.query)
.replaceToken('queryNoApprox',self.query.replace('approx: ',''))
.compose();

var genres=res.data.values.lpluck('name');
var w=new widgets.core.RoundedBox({
renderTargetId:'genreBox'
}).render();

new widgets.core.TextColumns({
renderTargetId:w.contentId,
colItemTemplate:lt.Search.genreColItem,
numCols:4}).render(genres);
});
}
},

renderAlbumsSummary:function(pagedList){
var t=$T(lt.Search.albums,'searchAlbums');
if(pagedList.total>0){
t.replaceToken('num','('+mojo.util.addCommasToNumber(pagedList.total)+')');
}
t.compose();
if(pagedList.list.length==0){
$S('searchAlbumsContent',$T(lt.Search.noMatches)
.replaceToken('what','albums')
.compose());
return;

}

new widgets.AlbumList({
renderTargetId:'searchAlbumsContent',
layout:'listNarrow',
evenMoreLink:this.getMoreLink('albums')})
.render(pagedList);
},

renderArtistsSummary:function(artists){
var t=$T(lt.Search.artists,'searchArtists');
if(artists.total>0){
t.replaceToken('num','('+mojo.util.addCommasToNumber(artists.total)+')');
}
t.compose();
if(artists.total==0){
$S('searchArtistsContent',$T(lt.Search.noMatches)
.replaceToken('what','artists')
.compose());
return;
}

new widgets.ArtistList({
renderTargetId:'searchArtistsContent',
layout:'listWithImages',
numTextCols:1,
evenMoreLink:this.getMoreLink('artists'),
displayCount:10})
.render(artists);
},

renderSongsSummary:function(pagedList){
var t=$T(lt.Search.songs,'searchSongs');
if(pagedList.total>0){
t.replaceToken('numSongs',
'('+mojo.util.addCommasToNumber(pagedList.total)+')');
}
t.compose();
if(pagedList.list.length==0){
$S('searchSongsContent',$T(lt.Search.noMatches)
.replaceToken('what','songs')
.compose());
return;
}

this.songlist=
new widgets.SongList({
renderTargetId:'searchSongsContent',
evenMoreLink:this.getMoreLink('songs'),
showAlbumArtCol:false,
showListens:'count',
whichListen:'listens7',
showRatings:true,
hideZeroRating:true
});
this.songlist.render(pagedList);
},

getMoreLink:function(tabId){
var href=frontend.url.SearchAPage(this.query,tabId);
return'href="'+href+'" '
+'onclick="mojo.newtabs.all.aPage.onActivateViaClick(event, \''
+tabId+'\');return false"';
}
};
Object.extend(SearchPage.prototype,Page.prototype,true);
Object.extend(SearchPage.prototype,NewAPage.prototype,true);
MyMusic.addPage('search',function(){return new SearchPage();});




NonLoggedHomePageBase=Class.create();
NonLoggedHomePageBase.prototype={

init:function(version,params){
if(!params)params={};

this.version=version;
this.versionHome='homeNoAuth'+this.version;


mojo.cookie.remove('lchpfbtv');

this.initPage({
pageTitle:'Home',
pageId:'HomeNoAuth',
hideNavCol:true,
skelClass:'nonLoggedHomePage2'});

NonLoggedHomePageBase.g=this;
this.rotateQuotesDisabled=false;

this._autoComplete=null;
this.mode=params?params.mode:null;

this.quotes=[
{
text:"24 hours into it and lala is already one of my favorite websites",
byline:"- Clay from Alabama"
},
{
text:"I think this website is genius.",
byline:"- Jon in Utah"
},
{
text:"I love the concept and the site. I'll be using your services for a long time.",
byline:"- Dave in Florida"
},
{
text:"I've tested practically all of the \"next great\" digital platforms, but none have touched what lala.com has accomplished already.",
byline:"- Adam \"Doubleagame\" from Texas"
},
{
text:"This site is incredible - from the interface to the depth of controls and options.",
byline:"- Antonio from Florida"
},
{
text:"Outstanding site, wish you had thought of this a long time ago!",
byline:"- Mike in North Carolina"
},
{
text:"This is probably the most amazing site I've ever stumbled across.",
byline:"- Seetha in Texas"
}
];
},

onLoad:function(pathParts){
var self=this;
this.layout=new widgets.core.TwoColumn();
var skel=$T(lt.NonLoggedHomeB.skeleton)
.replaceToken('twoCol',this.layout.render());
this.renderIntoContentRegion(skel);
this._displayHeaderToggle();
$TC(lt.NonLoggedHomeB.col1,this.layout.col1);
$TC(lt.NonLoggedHomeB.col2,this.layout.col2);

this._autoComplete=
new widgets.SearchAutoComplete({
inputId:'searchMusic',
global:true,
offsets:{ie:2,ff:2},
divClassName:'nonLoggedHome2Acc',
scrollWithBody:true,
onRunSearch:function(text,suggestion){
self._doSearch(text,suggestion);
}});
$('searchMusic').style.color="#BBBBBB";
mojo.input.clearOnClick('searchMusic');

$T(lt.NonLoggedHomeB.signUpBox,'signUpBox')
.replaceToken('trackingId',this.versionHome)
.compose();
this.renderQuotes();
$TC(lt.NonLoggedHomeB.press,'press');
this.loadSampler();
this.loadNewReleases();

if(this.mode){
if(this.mode=='signin'){
MyMusic.g.signInRequired(true);
}else if(this.mode=='reactivate'){


}else if(this.mode=='signup'){
MyMusic.g.signInRequired();
}else if(this.mode=='fbsignup'){
var dialog=new MojoDialog({
id:'fbSignupDialog',
mode:'vertTwoTone'
});
dialog.open(
$TC(lt.NonLoggedHomeB.fbSignupLeft),
null,
true,
$TC(lt.NonLoggedHomeB.fbSignupRight));
}else if(this.mode=='resetpassword'){
var token=pathParts.length>1?pathParts[1]:null;
MyMusic.g.resetPassword(token);
}else if(this.mode=='forgotpassword'){
MyMusic.g.forgotPassword();
}else{
mojo.log.error('unknown nonloggedin home mode: '+this.mode);
}
}
},

_displayHeaderToggle:function(){
var playingInfo=Player.g.getPlayingInfo();
if(!mojo.IE6&&((playingInfo.status==null||playingInfo.status=='stopped')
&&mojo.css.isDisplayed('headerRegion'))){
this.hideHeader();
}else{
this.showHeader();
}
},

hideHeader:function(){
$D('headerRegion',false);
$('litePlayerEmbed').style.visibility='hidden';
},

showHeader:function(){
$D('headerRegion',true);
$('litePlayerEmbed').style.visibility='visible';
$('scrollableViewDiv').className=this.skelClass+'_header';
},

loadSampler:function(){
var w=new StartListeningWidget({renderTargetId:'startListeningContent',
trackingId:this.versionHome+'.sampler',
showDescription:true,
onBeforeRender:function(){
$TC(lt.NonLoggedHomeB.startListening,'startListening');
},
onRenderDone:this.renderBottomLink.lbind(this)});
w.loadAndRender();
},

renderBottomLink:function(data){
var genre=data.genre;
$T(lt.NonLoggedHomeB.bottomLink,'startListeningBottomCurveDiv')
.replaceToken('genre',genre?genre:'popular')
.replaceToken('moreLink',genre
?frontend.link.BrowseGenre(genre,null,this.versionHome+'.moreMusic')
:frontend.link.Browse(this.versionHome+'.moreMusic'))
.compose();



},

onUnload:function(){
if(this.quoteInterval){
clearInterval(this.quoteInterval);
}
if($('quoteScreen').fadeTimeout){
clearTimeout($('quoteScreen').fadeTimeout);
}
this.showHeader();
},

onSearch:function(){
var searchText=$F('searchMusic');
if(searchText==''||searchText=='Find an artist'){
return;
}
this._doSearch(searchText);
this._autoComplete.hide();
},

_doSearch:function(text,suggestion){

if(suggestion){
lala.Track.click(this.versionHome+'.searchArtistMatch');
this._gotoArtist(text);
return;
}

var skipArtistCheck=false;
if(text.lstartsWith('#')){
skipArtistCheck=true;
}


if(!skipArtistCheck){
this._runArtistCheck(text);
return;
}

this._gotoSearch(text);
},

_runArtistCheck:function(text){
var self=this;

api.AutoComplete.artistCheck(
text,
function(isArtist,noop,runValue){
if(isArtist){
self._gotoArtist(runValue,text);
lala.Track.click(self.versionHome+'.searchArtistMatch');
}else{
self._gotoSearch(text);
}
});
},

_gotoArtist:function(text,origSearchText){
ArtistPage.wrongArtistName=origSearchText||text;
frontend.go.Artist(text);
},

_gotoSearch:function(text){
frontend.go.Search(text);
lala.Track.click(this.versionHome+'.searchText');
},

renderQuotes:function(){
$TC(lt.NonLoggedHomeB.quotes,'quotes');
this.currQuote=Math.floor(Math.random()*this.quotes.length);
this.rotateQuotes(true);
this.quoteInterval=window.setInterval(this.rotateQuotes.lbind(this),8000);
},

rotateQuotes:function(firstTime){
if(firstTime){
$T(lt.NonLoggedHomeB.quoteBlock,'quoteHolder')
.replaceTokensWithBean('quote',this.quotes[this.currQuote])
.compose();
}else{
if(this.rotateQuotesDisabled)return;
var self=this;
mojo.animate.fadeIn('quoteScreen',function(){
self.currQuote++;
if(!self.quotes[self.currQuote]){
self.currQuote=0;
}
$T(lt.NonLoggedHomeB.quoteBlock,'quoteHolder')
.replaceTokensWithBean('quote',self.quotes[self.currQuote])
.compose();
mojo.animate.fadeOut('quoteScreen');
});
}
},

loadNewReleases:function(){
var self=this;
api.LoggedOutHomePage.getNewReleases(
function(res){
self.renderNewReleases(res.data.list);
});
},

renderNewReleases:function(albums){
if(albums.length<=0)return;
var t=$T(lt.NonLoggedHomeB.newReleases,'newReleases');
t.replaceToken('trackingId',this.versionHome+'.newReleases');
var r=t.getTokenBlock('AlbumBlock');
albums.leach(function(album){
r.replaceTokensWithBean('album',album);
r.next();
});
t.compose();
},


showSignUpPopup:function(evt){
var signUpPopup=$('homePageSignUpPopup');
if(!signUpPopup){
mojo.dom.parseHTMLFragment($TC(lt.NonLoggedHome.signupPopup),'scrollableViewDiv');
signUpPopup=$('homePageSignUpPopup');
var overlay=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'homePageSignUpPopup'
});
overlay.render();
$TC(lt.NonLoggedHome.signupPopupContent,overlay.contentId);
}

evt=mojo.event.create(evt);
var b=mojo.geometry.getBounds(evt.target,'scrollableViewDiv');
signUpPopup.style.left=b.left-196+'px';
signUpPopup.style.top=b.top+21+'px';
mojo.css.display(signUpPopup,true);
mojo.css.display('homePageSignUpPopupPointer',true);
},

hideSignUpPopup:function(){
mojo.css.display('homePageSignUpPopup',false);
}
};
Object.extend(NonLoggedHomePageBase.prototype,Page.prototype,true);

NonLoggedHomePageB=Class.create();
NonLoggedHomePageB.prototype={
initialize:function(params){
this.init('B',params);
}
};
Object.extend(NonLoggedHomePageB.prototype,NonLoggedHomePageBase.prototype,true);

NonLoggedHomePageA=Class.create();
NonLoggedHomePageA.prototype={
initialize:function(params){
this.init('A',params);
}
};
Object.extend(NonLoggedHomePageA.prototype,NonLoggedHomePageBase.prototype,true);

NonLoggedHomePageSiteDown=Class.create();
NonLoggedHomePageSiteDown.prototype={
initialize:function(params){
this.init('SiteDown',params);
},

onLoad:function(){
this.render();
},

render:function(){
var t=$T(lt.SiteDown.page);
this.renderIntoContentRegion(t);

$('emailNotify').focus();
},

onSubmitSiteDownEmail:function(){
var email=$F('emailNotify');
if(!email)return;

api.User.siteDownEmail(email);
$('enterEmailDiv').innerHTML="Thank you.  We'll notify you shortly.";
}
};
Object.extend(NonLoggedHomePageSiteDown.prototype,NonLoggedHomePageBase.prototype,true);


MyMusic.addPage('signup',function(){
return MyMusic.g.getHomePage({mode:'signup'});
});
MyMusic.addPage('fbsignup',function(){
return MyMusic.g.getHomePage({mode:'fbsignup'});
});
MyMusic.addPage('signin',function(){
return MyMusic.g.getHomePage({mode:'signin'});
});
MyMusic.addPage('reactivate',function(){
return MyMusic.g.getHomePage({mode:'reactivate'});
});
MyMusic.addPage('forgotpassword',function(){
return MyMusic.g.getHomePage({mode:'forgotpassword'});
});
MyMusic.addPage('resetpassword',function(){
return MyMusic.g.getHomePage({mode:'resetpassword'});
});


StartListeningWidget=Class.create();
StartListeningWidget.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.trackingId=params.trackingId;
this.onRenderDone=params.onRenderDone||mojo.emptyFunction;
this.onBeforeRender=params.onBeforeRender||mojo.emptyFunction;
this.defaultGenre=params.defaultGenre||null;

this.genres=StartListeningWidget.genres;

StartListeningWidget.g=this;
},

loadAndRender:function(){
this.onLoadGenreSampler(null,true);
},

onLoadGenreSampler:function(genre,skipClickEvent){
var self=this;
api.LoggedOutHomePage.getTopArtists(
genre,
function(res){
self.render(res.data,genre);
});

if(!skipClickEvent){
lala.Track.click(this.trackingId+'Genre');
}
},

render:function(artists,genre){
this.onBeforeRender();

this.artists=artists
.sort(function(a,b){return b.topSong.listens7-a.topSong.listens7;});
this.songs=this.artists.lpluck('topSong');

$TC(lt.StartListeningWidget.main,this.renderTargetId);
this.renderSamplerGenres(genre);

var totalDuration=null;
if(this.songs.length>0){
totalDuration=this.renderSamplerSongs();
}else{
this.renderEmptySongList(genre);
}

this.onRenderDone({genre:genre,
totalDuration:totalDuration});
},

renderSamplerGenres:function(selectedGenre){
var t=$T(lt.StartListeningWidget.genreList,'genreList');
t.replaceToken('defaultSelected',selectedGenre?'':'selected');
t.replaceToken('browseLink',frontend.url.Browse());
var b=t.getTokenBlock('GenreBlock');
this.genres.leach(function(genre){
b.replaceToken('selected',(genre==selectedGenre)?'selected':'');
b.replaceToken('genre',genre);
t.replaceToken('genreLink',frontend.url.BrowseGenre(genre));
b.next();
});
t.compose();
},

renderEmptySongList:function(genre){
$T(lt.StartListeningWidget.noSongs,'songList')
.replaceToken('genre',genre)
.compose();
},

renderSamplerSongs:function(){
var w=new widgets.SongList({
renderTargetId:'songList',
trackingId:this.trackingId,
clickTrackingId:this.trackingId,
showListens:'count',
whichListen:'listens7',
hideNum:true,
hideActions:true,
hideAlbum:true,
showQueueAction:lala.user!=null,
hideRankInfo:true,
showBuyActions:true,
showArtistImg:true,

disableAlbumImgHover:true,
artistArray:this.artists,
customFrameClass:'lclearTopBorder',
hideDuration:true,
onPlaySong:lala.user?null:this.onPlaySong.lbind(this)
});
w.render(this.songs);
return w.totalDuration;
},





onPlaySong:function(index){
if(!mojo.css.isDisplayed('headerRegion')){
NonLoggedHomePageBase.g._displayHeaderToggle();
}

var self=this;
var song=self.songs[index];

this.clearPlayInterval();
this.playInterval=setInterval(function(){
self.playIntervalCount++;
self.playSongOnPlayerLoaded(song);
},100)
lala.Track.clientPageWidgetInteraction(this.trackingId,'play');
},

clearPlayInterval:function(){
this.playIntervalCount=0;
if(this.playInterval){
clearInterval(this.playInterval);
this.playInterval=null;
}
},

playSongOnPlayerLoaded:function(song,trackingId){
if(this.playIntervalCount>50||Player.g.isPlayerReady()){
this.clearPlayInterval();
Player.g.playSong(song,trackingId);
}
}
};
StartListeningWidget.genres=[
"Alternative",
"Blues",
"Classical",
"Country",
"Electronic",
"Hip-Hop",
"Jazz",
"Latin",
"Metal",
"Pop",
"R&B",
"Rock",
"World Music"
];



ContactSupport=Class.create();
ContactSupport.prototype={
initialize:function(params){
this.initPage({pageTitle:'Contact Support',authLevel:1,
theme:'grayTheme',pageId:'ContactSupport',
skelClass:'contactSupport'});
ContactSupport.g=this;

this._itemType=null;
this._itemToken=null;
this._itemDescription=null;
this._allRadioConfigsById={};
this.selectedRadioId=null;
},

onLoad:function(path,isBack){
this.renderIntoContentRegion($T(lt.ContactSupport.skeleton)
.replaceToken('pageTitle','Contact Support'));

this.setCategories();
this.appendTradingCategory();

var self=this;
api.Content.getContactSupport(function(res){self.render(res);});

},

render:function(res){
this.res=res;

var t=$T(lt.ContactSupport.main,'supportContent')
.replaceToken('userEmail',lala.user.email);

var c=t.getTokenBlock('CategoryBlock');
var self=this;
var categories=(lala.isTradingEnabled&&lala.isTradingTransition&&lala.params&&lala.params.tt=='true')
?ContactSupport.TT_CATEGORIES
:ContactSupport.CATEGORIES;
categories.leach(function(category){


if(category.name=='Trading'&&!lala.isTradingEnabled){
return;
}

c.replaceToken('categoryName',category.name);
c.replaceToken('catClass',lala.isTradingTransition&&category.name=='Trading'?'tt':'');
var r=c.getTokenBlock('RadioBlock');
category.data.leach(function(subCategory){
r.replaceToken('label',subCategory.label)
.replaceToken('id',subCategory.id)
.next();

self._allRadioConfigsById[subCategory.id]=subCategory;
});
c.replaceToken('message',category.message?$TC(category.message):'');
c.next();
});
t.compose();


if(!mojo.isEmpty(lala.params)){
var msg='';
msg+=lala.params.chargeToken?"Charge Token: "+lala.params.chargeToken+"\n":'';
msg+=lala.params.itemToken?"Item Token: "+lala.params.itemToken+"\n":'';
msg+=lala.params.title?"Title: "+lala.params.title.lunescapeForHash()+"\n":'';
msg+=lala.params.artist?"Artist: "+lala.params.artist.lunescapeForHash()+"\n":'';
msg+=lala.params.id?"Id: "+lala.params.id+"\n":'';
if(msg){
msg+="\n";
msg+="Description of problem: ";
$('msg').value=msg;
}


if(lala.params.radioId){
$(lala.params.radioId).checked=true;
this.onRadioClick($(lala.params.radioId));
}
}
},

onRadioClick:function(elem){
var currText=this.selectedRadioId
?this._allRadioConfigsById[this.selectedRadioId].defaultText
:'';
var defaultText=this._allRadioConfigsById[elem.id].defaultText;
this.selectedRadioId=elem.id;
var msg=$('msg');
if(msg.value==''||msg.value==currText)
msg.value=defaultText||'';
},

submitForm:function(){
var radioId=mojo.form.getRadioValue(document.forms.support.fradio);
if(!radioId){
alert('Please select a category');
return;
}
var radioConfig=this._allRadioConfigsById[radioId];

var msg=$F('msg');
if(!msg){
alert('Please enter a message');
return;
}

var params={
'cmd':'general',
'note':msg,
'userAgent':mojo.USER_AGENT,
'radio':radioConfig.emailSubject
};

lala.updateSubmitButton('submitForm');
api.Email.support(
params,
function(res){
lala.showLoadingMsg(false);
mojo.setContent('formDiv',lt.ContactSupport.g_ackMsg);
});
},

setCategories:function(){
ContactSupport.CATEGORIES=[
{name:'Music',
data:[{emailSubject:'Manual Uploader',
label:'Manual Uploader',
id:'manualUploader',
defaultText:'Platform (Are you using a PC or MAC? If PC, Windows XP or Vista?): \n'+
'Browser (Safari, Firefox, Internet Explorer): \n'+
'Browser Version: \n'+
'Flash Version (See Note Below): \n'+
'Description of Problem: \n'+
'\n'+
'Note: Adobe Flash, version 10 or later is REQUIRED in order to listen to music.  You can check your Flash version by right clicking in the progress bar of the Lala player.'
},
{emailSubject:'Lala MusicMover',
label:'Music Mover',
id:'musicMover',
defaultText:'Platform (Are you using a PC or MAC? If PC, Windows XP or Vista?): \n'+
'Browser (Safari, Firefox, Internet Explorer): \n'+
'Browser Version: \n'+
'Music Mover Version: \n'+
'Are you trying to transfer .mp3, .m4a or .m4p music files?: \n'+
'Please list the specific songs you may be having trouble with if applicable: \n'+
'Description of Problem:'},
{emailSubject:'Player / Streaming',
label:'Player / Streaming Problem',
id:'playerStreaming',
defaultText:'Platform (Are you using a PC or MAC? If PC, Windows XP or Vista?): \n'+
'Browser (Safari, Firefox, Internet Explorer): \n'+
'Browser Version: \n'+
'Flash Version (See Note Below): \n'+
'Artist: \n'+
'Song: \n'+
'Album UPC: \n'+
'LALA URL (if applicable): \n'+
'What type of Internet connection do you have (DSL, Cable Satellite)? \n'+
'Does this happen on all songs or just individual ones? \n'+
'Are you listening from Home, School or Work? \n'+
'Description of Problem: \n'+
'\n'+
'Note: Adobe Flash, version 10 or later is REQUIRED in order to listen to music.  You can check your Flash version by right clicking in the progress bar of the Lala player.'
},
{emailSubject:'My Collection / Playlists',
label:'My Collection / Playlists',
id:'collectionPlaylists',
defaultText:'Playlist Name (if applicable):'},
{emailSubject:'Queue',
label:'Queue',
id:"queue"},
{emailSubject:'Search/Catalog',
label:'Search / Catalog',
id:'musicSearchCatalog',
defaultText:'In order to process Search / Catalog requests we require the following information: \n'+
'\n'+
'Title: \n'+
'Artist: \n'+
'Album UPC: \n'+
'Error Correction Info (if applicable): \n'+
'LALA URL (if applicable): \n'+
'\n'+
'To correct errors in the catalog (naming, Multi CD Sets listed incorrectly, Incorrect track data), please be specific and let us know what needs to be changed.\n'+
'\n'+
'These requests are submitted to our catalog vendor / labels for processing.  You will not receive a reply back for these requests.'}]},
{name:'Purchasing',
data:[{emailSubject:'CD Purchase Problem',
label:'CD Purchase',
id:'cdPurchase'},
{emailSubject:'MP3 Purchase',
label:'MP3 Purchase',
id:'mp3Purchase'},
{emailSubject:'Manual Download',
label:'Manual Download',
id:'manualDownload'},
{emailSubject:'Wallet Purchase',
label:'Wallet Purchase',
id:'walletPurchase'},
{emailSubject:'Web Song Purchase',
label:'Web Song Purchase',
id:'webSongPurchase'},
{emailSubject:'Gift Purchase',
label:'Gift Purchase',
id:'giftPurchase'}]},

{name:'Other',
data:[{emailSubject:'Feature Request',
label:'Feature Request',
id:'featureRequest'},
{emailSubject:'Report Abuse',
label:'Report Abuse',
id:"reportAbuse",
defaultText:'Lala URL of Member you are reporting:\n'
+'Abuse Text (copy from web page):'},
{emailSubject:'Report Bug',
label:'Report Bug',
id:'reportBug'},
{emailSubject:'Other',
label:'Other',
id:'other'}]},
{name:'Account',
data:[{emailSubject:'Billing',
label:'Billing',
id:'billing'},
{emailSubject:'Cancel Account',
label:'Cancel My Account',
id:'cancelAccount'}]}
];

ContactSupport.TT_CATEGORIES=[
{
name:'Trading',
data:[
{
emailSubject:'Have/Want List Download',
label:'Have/Want List Download Problem',
id:'listDownload'
},
{
emailSubject:'General Trading Inquiry',
label:'General Inquiry',
id:'generalInquiry'
}
],
message:"Click <a #link:TradingTransition()>here</a>"
+" for info on the trading transition, and to download your Have and Want lists."
}
];
},

appendTradingCategory:function(){
if(lala.isTradingTransition){
ContactSupport.CATEGORIES.push(ContactSupport.TT_CATEGORIES[0]);
}else{
ContactSupport.CATEGORIES.push(
{
name:'Trading',
data:[
{
emailSubject:'Duplicate',
label:'Duplicate CD',
id:'duplicateCD'
},
{
emailSubject:'Receiving',
label:'Receiving',
id:'receiving'
},
{
emailSubject:'Shipping',
label:'Shipping',
id:'shipping'
},
{
emailSubject:'Shipping Kits',
label:'Shipping Kits',
defaultText:'Please order your Shipping kits from your Have list.  '
+'If you are unable to do so, then please contact us here '
+'and let us know the issue you are having.',
id:'shippingKits'
},
{
emailSubject:'Search/Catalog',
label:'Search / Catalog',
id:'tradingSearchCatalog',
defaultText:'In order to process Search / Catalog requests we '
+'require the following information: \n'
+'\n'
+'Title: \n'
+'Artist: \n'
+'Album UPC: \n'
+'Error Correction Info (if applicable): \n'
+'LALA URL (if applicable): \n'
+'\n'
+'To correct errors in the catalog (naming, Multi CD '
+'Sets listed incorrectly, Incorrect track data), please '
+'be specific and let us know what needs to be changed.\n'
+'\n'
+'These requests are submitted to our catalog vendor / '
+'labels for processing.  You will not receive a reply '
+'back for these requests.'
}
]});
}
}
};

Object.extend(ContactSupport.prototype,Page.prototype,true);
MyMusic.addPage('contactsupport',function(){return new ContactSupport();});



AccountInfoPage=Class.create();
AccountInfoPage.prototype={
initialize:function(){
this.initPage({authLevel:2,pageTitle:'Account Info',
theme:'blueTheme',pageId:'AccountInfo',
skelClass:'accountInfoPage'})
AccountInfoPage.g=this;
this.emailConfirmDialog=null;
this.historyTab='';

this.ABOUT_ME_COUNT_MAX=512;
this.UNIQUE_FACT_COUNT_MAX=64;
},

onLoad:function(pathParts){
var self=this;
this.pathParts=pathParts;
var t=$T(lt.AccountInfo.main)
.replaceToken('walletBalance','$'+mojo.util.formatPrice(api.MicroWallet.balance));
this.renderIntoContentRegion(t);








this.tabs=mojo.newtabs.create({id:'accountInfo',
divTabsId:'accountInfoTabsContainer',
divTabsContentId:'accountInfoTabsContent'});
this.tabs.onTabClick=this.onTabClick.lbind(this);
this.tabs.add({
id:'settingsTab',
title:'Your Settings',
path:frontend.path.AccountSettings()});
this.tabs.add({
id:'purchasesTab',
title:'Your Purchases',
path:frontend.path.AccountPurchases()});


this.getAccountInfo(
function(){
var settingsOrPurchases=self.pathParts.length>1
?self.pathParts[1]:'settings';
self.tabs.activate(settingsOrPurchases+'Tab');
});

mojo.listeners.add(
api.MicroWallet.EVT_BALANCE_CHANGE,
this.updateWalletBalance.lbind(this));

if(lala.showFacebookConnect){


mojo.listeners.add(
LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
if(!LalaFBConnect.isLoggedLinkedDiff()){
if($('fillInFacebookInfo'))$D('fillInFacebookInfo',true,'inline');
if($('facebookImageToggleDiv'))$D('facebookImageToggleDiv',true);
}

});
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_LOGGED_OUT,
this.renderFacebookNotLoggedIn.lbind(this));
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
this.renderFacebookConnected.lbind(this));
mojo.listeners.add(LalaFBConnect.LISTENER_PERMISSION_CHANGED,
this.renderFacebookConnected.lbind(this));
}
},

onTabClick:function(tab){

this['render'+tab.id.ltoFirstUpperCase()](tab);
},

renderPurchasesTab:function(tab){
$TC(lt.AccountInfo.billingTabs,tab.contentId);
this.histTabs=mojo.newtabs.create({id:'billing',
divTabsId:'billingTabs',
divTabsContentId:'billingTabsContent',
usePipedTabs:true});
this.histTabs.onTabClick=this.onHistoryTabClick.lbind(this);
this.histTabs.add({
id:'purchasesContentTab',
title:'Music purchases',
path:frontend.path.BillingHistory()});
if(lala.isTradingEnabled){
this.histTabs.add({
id:'tradesTab',
title:'Trading activity',
path:frontend.path.TradePurchaseHistory()});
$D('billingTabsContainer');
}
this.histTabs.activate(this.pathParts.length>2
?this.pathParts[2]+'Tab':'purchasesContentTab');
$D('walletBalanceBox');
},

renderSettingsTab:function(tab){
$TC(lt.AccountInfo.settingsPage,tab.contentId);
this.settingsTabs=mojo.newtabs.create({id:'accountSettings',
divTabsId:'accountSettingsTabsContainer',
divTabsContentId:'accountSettingsTabsContent',
usePipedTabs:true});
this.settingsTabs.onTabClick=this.onTabClick.lbind(this);

this.settingsTabs.add({
id:'personalTab',
title:'Personal Info',
path:frontend.path.AccountSettings()});
this.settingsTabs.add({
id:'privacyTab',
title:'Privacy Settings',
path:frontend.path.PrivacySettings()});
this.settingsTabs.add({
id:'basicTab',
title:'Login Info',
path:frontend.path.LoginInfo()});
this.settingsTabs.add({
id:'billingTab',
title:'Credit Card',
path:frontend.path.BillingInfo()});
this.settingsTabs.add({
id:'shippingTab',
title:'Shipping Info',
path:frontend.path.ShippingInfo()});
this.settingsTabs.add({
id:'emailTab',
title:'Email Preferences',
path:frontend.path.EmailPreferences()});
if(lala.isTradingEnabled){
this.settingsTabs.add({
id:'tradingTab',
title:'Trading',
path:frontend.path.TradingSettings()});
}
this.settingsTabs.add({
id:'facebookTab',
title:'Facebook Connect',
path:frontend.path.FacebookConnect()});
this.settingsTabs.add({
id:'betaTab',
title:'Beta',
path:frontend.path.BetaSettings()});

this.settingsTabs.activate(this.pathParts.length>2
?this.pathParts[2]+'Tab':'personalTab');
$D('walletBalanceBox',false);
},

updateWalletBalance:function(){
$S('walletBalanceValue','$'+mojo.util.formatPrice(api.MicroWallet.balance));
},

getAccountInfo:function(onResponse){
var me=this;
api.User.getAccountInfo(function(res){
me.user=res.data;
me.user.userToken=lala.user.userToken;

if(onResponse){
onResponse();
}
});
},

renderPersonalTab:function(tab){
var self=this;
var checked='checked="checked"';
var t=$T(lt.AccountInfo.personal,tab.contentId)
.replaceTokensWithBean('user',this.user)
.replaceToken('facebookImgUrlBig',LalaFBConnect.getImgUrl(true));
switch(this.user.gender){
case"Male":
t.replaceToken('isMale',checked);
break;
case"Female":
t.replaceToken('isFemale',checked);
break;
default:
t.replaceToken('isNone',checked);
}

var charsLeft=this.UNIQUE_FACT_COUNT_MAX-(this.user.uniqueFact?this.user.uniqueFact.length:0);
t.replaceToken('aboutMeCountLeft',this.ABOUT_ME_COUNT_MAX-(this.user.aboutMe?this.user.aboutMe.length:0))
.replaceToken('aboutMeCountMax',this.ABOUT_ME_COUNT_MAX)
.replaceToken('uniqueFactCountLeft',charsLeft)
.replaceToken('s',(charsLeft==1)?'':'s')
.replaceToken('uniqueFactCountMax',this.UNIQUE_FACT_COUNT_MAX);
if(lala.user.facebookId){
if(lala.user.isUseFacebookAvatar&&lala.user.facebookImgUrlBig){
t.removeTokenBlock('NonFBBlock');
t.replaceTokenBlock('UploadLinkBlock',$TC(lt.AccountInfo.usingFBImgMsg));
t.replaceToken('displayStockPhoto','none');
t.replaceToken('fbImageWhat','Lala profile');
}else{
t.replaceToken('displayFBAvatar','none');
t.replaceToken('fbImageWhat','Facebook');
t.replaceToken('fbToggleDisplay',
lala.user.facebookImgUrlBig
&&!LalaFBConnect.isLoggedLinkedDiff()?'':'none');
}
t.replaceToken('displayFillFacebook',!LalaFBConnect.isConnected()||LalaFBConnect.isLoggedLinkedDiff()?'none':'');
}else{
t.replaceToken('displayFBAvatar','none');
t.replaceToken('displayFillFacebook','none');
t.replaceToken('fbImageWhat','Facebook');
t.replaceToken('fbToggleDisplay','none');
}
var pb=t.getTokenBlock('StockPhotoSection').getTokenBlock('StockPhotoBlock');
lala.defaultImageNames.leach(function(name){
pb.replaceToken('imageName',name);
pb.replaceToken('imageSrc',
lala.avatarUrlFs.replace('%SIZE%','original')
.replace('%USERID%',name)
.replace('%EXT%','jpg'));
pb.next();
});
t.compose();
},

toggleFacebookImage:function(showFacebook){
$S('avatarContent',
frontend.img.MemberImgTag(
this.user,
true,
lala.user.isUseFacebookAvatar?lala.user.facebookImgUrlBig:null,
null,
null,
null,
'userImage',
'Your picture')
);
$D('stockPhotoSection',!showFacebook);
$S('fbImageWhat',showFacebook?'Lala profile':'Facebook');
$S('uploadSection',showFacebook?$TC(lt.AccountInfo.usingFBImgMsg)
:$TC(lt.AccountInfo.uploadLink));
},

onUseFacebookImageToggle:function(){
var self=this;
LalaFBConnect.selectWhichPicture(
lala.user.isUseFacebookAvatar?'lala':'facebook',
function(){
var usingFacebookImage=!mojo.css.isDisplayed('stockPhotoSection');
self.toggleFacebookImage(!usingFacebookImage);
},'settings');
},

renderPrivacyTab:function(tab){
var checked='checked="checked"';
var t=$T(lt.AccountInfo.privacy,tab.contentId);

t.replaceToken(
'isSearchHidden',
this.user.isSearchHidden?checked:'')
t.replaceToken(
'isPurchaseStoryDisabled',
this.user.isPurchaseStoryDisabled?checked:'')
if(lala.isTradingEnabled){
t.replaceToken(
'isShowFullLastName',
this.user.isShowFullLastName?checked:'');
t.replaceToken(
'isVisibleTrader',
this.user.isVisibleTrader?checked:'');
t.replaceToken(
'isWantListPublic',
this.user.isWantListPublic?checked:'');
}else{
t.removeTokenBlock('TradingEnabledBlock');
}
t.compose();
},

onChangeCompletePrivacy:function(){
var checked=$F('isSearchHidden');
var dialog=new MojoDialog({title:'Privacy Change',
id:'privacyChangeDialog'});


this._isSearchHiddenWithKillFollowedBy=false;

var t=$T(lt.AccountInfo.privacyChangeDialog);
if(checked){
t.removeTokenBlock('GoingPublicBlock');
}else{
t.removeTokenBlock('GoingPrivateBlock');
}

var count=this.user.followerCount;
t.replaceToken('hideFollowBox',count==0?'lnone':'');
t.replaceToken('count',count);
t.replaceToken('s',count>1?'s':'');

dialog.onCancel=function(){
$('isSearchHidden').checked=!checked;
lala.Track.click('accountSettingsPage.privacyCancel');
};
dialog.open(t.compose());
},


onChangeCompletePrivacyDialogClose:function(){
var checked=$F('isSearchHidden');
this._isSearchHiddenWithKillFollowedBy=$F('killFollowedBy');

lala.Track.click('accountSettingsPage.privacy'+(checked?'On':'Off'));
lala.Track.click('accountSettingsPage.privacyKill'+(this._isSearchHiddenWithKillFollowedBy?'On':'Off'));
MojoDialog.close();
},

renderEmailTab:function(tab){
var checked='checked="checked"';
var t=$T(lt.AccountInfo.email,tab.contentId);

if(!lala.isTradingTransition&&lala.user.isTradingEnabled){
t.replaceToken('isCDRequestedEmail',this.user.isCDRequestedEmail?checked:'');
}else{
t.removeTokenBlock('TradingEnabled');
}

t.replaceToken('isFollowEmailEnabled',this.user.isFollowEmailEnabled?checked:'');
t.replaceToken('isBlurbEmailEnabled',this.user.isBlurbEmailEnabled?checked:'');
t.replaceToken('isMarketingEmail',this.user.isMarketingEmail?checked:'');
t.compose();
},

renderShippingTab:function(tab){
var t=$T(lt.AccountInfo.shipping,tab.contentId);
t.compose();

var self=this;
var sw=new widgets.Shipping(
{renderTargetId:'shippingInfoDiv',
onSubmitResponse:function(res){
self.showSavedMessage();
self.getAccountInfo();
},
hideCancel:true,
submitText:'Save Changes'});
sw.render(this.user);
},

renderBasicTab:function(tab){
$T(lt.AccountInfo.basic,tab.contentId)
.replaceTokensWithBean('user',lala.user)
.removeTokenBlock('UnverifiedBlock',!frontend.needsToValidateEmail())
.removeTokenBlock('VerifyBox',!frontend.needsToValidateEmail())
.compose();

var self=this;
mojo.input.onEnterKey('user_email',function(){

window.setTimeout(self.promptForEmailChangePassword.lbind(self),1);
});
mojo.input.onEnterKey('confirmnewpwd',this.updatePassword.lbind(this));
},

renderBillingTab:function(tab){
if(!this.user.billing_addr2){
this.user.billing_addr2_ui='&nbsp;';
}else{
this.user.billing_addr2_ui=this.user.billing_addr2;
}
if(this.user.card_expiration_month==-1
||this.user.card_expiration_year==-1){
this.user.card_expiration_month_ui=null;
this.user.card_expiration_year_ui=null;
}else{
this.user.card_expiration_month_ui=this.user.card_expiration_month;
this.user.card_expiration_year_ui=this.user.card_expiration_year;
}
var t=$T(lt.AccountInfo.billing,tab.contentId);
t.replaceToken('canClearPaymentMethod',lala.user.hasCreditCard?'':'none');
if(this.user.card_type=="PayPal"){
t.removeTokenBlock("CreditCardBlock")
.getTokenBlock("PayPalBlock")
.replaceToken("billing_email",this.user.billing_email);
t.compose();
}else{
t.removeTokenBlock("PayPalBlock")
.getTokenBlock("CreditCardBlock")
.setEmptyTokenText('(not set)')
.replaceTokensWithBean('user',this.user);
t.compose();
}
if(this.user.billing_addr2){






var addr2Row=$('billing_addr2_row');
if(addr2Row){
$D(addr2Row);
}
}

var rb=new widgets.core.RoundedBox({renderTargetId:'walletPlug'}).render();
$TC(lt.Core.walletPlug,rb.contentId);
},

onGotoPaymentMethod:function(){
frontend.goToPaymentMethod({isUpdate:true});
},

renderTradingTab:function(tab){
if(lala.isTradingTransition){
window.setTimeout(function(){frontend.go.TradingTransition();},1);
return;
}

if(this.user.isTradingEnabled){
$T(lt.AccountInfo.trading,tab.contentId)
.replaceToken('isVacating',this.user.isVacating?'checked="checked"':'')
.replaceToken('coverArtNeutral',this.user.coverArtPref=='Neutral'?'checked="checked"':'')
.replaceToken('coverArtRequired',this.user.coverArtPref=='Required'?'checked="checked"':'')
.compose();
}else{
$TC(lt.AccountInfo.tradingDisabled,tab.contentId);
}
},

renderFacebookTab:function(tab){
$TC(lt.AccountInfo.facebookConnect,tab.contentId);
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'fbConnect'
});
rb.render();
$S(rb.contentId,'<div id="fbConnectContent"></div>');
if(lala.showFacebookConnect){
this.renderFbConnect();
LalaFBConnect.parseDomTree();
}else{
$S('fbConnectContent',
'Facebook Connect is currently disabled. Check back later.');
}
},

renderBetaTab:function(tab){
$TC(lt.AccountInfo.beta,tab.contentId);









this.renderIsBookmarksEnabled();
this.renderBetaMusicMover();
this.renderLastFm();
if(!mojo.IE6){
this.renderKeyboardShortcuts();
this.renderFullscreenMode();
}else{
this.renderIE6Notice();
}
},

unlinkFacebook:function(){
if(!confirm('Are you sure?\n\nYour accounts will be unlinked. '
+'You\'ll no longer be able to log in to Lala using '
+'your Facebook credentials.')){
return;
}
$S('unlinkFacebookArea','Unlinking...');
LalaFBConnect.unlink();
},

onBetaCheckboxToggle:function(){
var keymap=mojo.form.getRadioValue('keymap');
if($('isBookmarksEnabledCheckbox').checked!=!!lala.user.isBookmarksEnabled
||$('keyboardShortcutsCheckbox').checked!=!!DataModel.g.getUserPreference('keyboardShortcutsMap')
||keymap!=DataModel.g.getUserPreference('keyboardShortcutsMap')
||$('fullscreenModeCheckbox').checked!=!!DataModel.g.getUserPreference('showFullscreenOption')){
this.showSaveButtons(true);
}else{
this.showSaveButtons(false);
}
},

showSaveButtons:function(shouldDisplay){
if(shouldDisplay){
$('saveButtonTop').disabled=false;
$('saveButtonBottom').disabled=false;
}else{
$('saveButtonTop').disabled=true;
$('saveButtonBottom').disabled=true;
}
},

renderIsBookmarksEnabled:function(){
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'isBookmarksEnabled'
});
rb.render();
$T(lt.AccountInfo.betaIsBookmarksEnabled,rb.contentId)
.replaceToken('checked',lala.user.isBookmarksEnabled?'checked':'')
.compose();
},

renderLastFm:function(){
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'lastFm'
});
rb.render();
var c=$T(lt.AccountInfo.betaLastFm,rb.contentId)
.replaceToken('checked',lala.user.isLastFmScrobblingEnabled?'checked':'')
.replaceToken('lastFmUserName',lala.user.lastFmUserName);
if(!mojo.IE&&!lala.user.isLastFmScrobblingEnabled){
c.replaceToken('displayLogin','lnone');
}else{
c.replaceToken('displayLogin','lblock');
if(lala.user.lastFmUserName){
c.replaceToken('lastFmUserName',lala.user.lastFmUserName);
c.replaceToken('lastFmPassword',"******");
}
}
c.compose();

mojo.input.onEnterKey('lastFmPassword',this.updateLastFmScrobblingInfo.lbind(this));
mojo.input.clearOnClick('lastFmPassword',true);
},

renderBetaMusicMover:function(){
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'musicMover'
});
rb.render();
$T(lt.AccountInfo.betaMusicMover,rb.contentId)
.replaceToken('downloadHost',lala.msiDownloadHost)
.compose();
},

renderKeyboardShortcuts:function(){
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'keyboardShortcuts'
});
rb.render();
var keymap=DataModel.g.getUserPreference('keyboardShortcutsMap');
var keymapEnabled=!!keymap;
keymap=keymapEnabled?keymap:'A';
$T(lt.AccountInfo.keyboardShortcuts,rb.contentId)
.replaceToken('checked',keymapEnabled?'checked':'')
.replaceToken('keymap_'+keymap,'checked')
.compose();
},

renderFullscreenMode:function(){
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'fullscreenMode'
});
rb.render();
$T(lt.AccountInfo.fullscreenMode,rb.contentId)
.replaceToken('checked',DataModel.g.getUserPreference('showFullscreenOption')?'checked':'')
.compose();
},

renderIE6Notice:function(){
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'ie6Notice'
});
rb.render();
$TC(lt.AccountInfo.ie6Notice,rb.contentId);
},

renderFbConnect:function(){
if(!LalaFBConnect.isInitialized()){
mojo.listeners.add(LalaFBConnect.LISTENER_INITIALIZED,this.renderFBConnectContent.lbind(this));
}else{
this.renderFBConnectContent();
}
},

renderFBConnectContent:function(){
if(LalaFBConnect.isConnected()){
this.renderFacebookConnected();
}else{
this.renderFacebookNotLoggedIn();
}
},

renderFacebookNotLoggedIn:function(){
if(!$('fbConnectContent'))return;
if(lala.user.facebookId){
this.renderFacebookLoggedOut();
}else{
this.renderFacebookNotConnected();
}
},

FACEBOOK_ACTIONS:[
{id:'PickForecast',label:'Pick a song for my forecast'},
{id:'BuyWeb',label:'Add a web song or album'},
{id:'BuyMP3',label:'Buy an MP3 song or album'},
{id:'Reco',label:'Send a song or album recommendation'},
{id:'GiftSong',label:'Gift a song'},
{id:'ReviewAlbum',label:'Review an album'},
{id:'Listening',label:'Shout a song, album, artist or playlist'}
],

renderFacebookConnected:function(){
var self=this;
if(!$('fbConnectContent'))return;
if(this.fbLinkReqSent)return;
this.fbLinkReqSent=true;
api.FacebookConnect.linkAccount('settings',function(resSuccess){
var loggedLinkedNotSame=LalaFBConnect.isLoggedLinkedDiff();
if(loggedLinkedNotSame){
LalaFBConnect.renderLoggedLinkedNotSame('fbConnectContent');
self.fbLinkReqSent=false;
}else{
var t=$T(lt.AccountInfo.fbConnected,'fbConnectContent')
.replaceToken('uid',lala.user.facebookId)
.replaceToken('fbName',lala.user.facebookName)
.replaceToken('facebookImgUrl',lala.user.facebookImgUrl)
.replaceToken('loggedInUid',LalaFBConnect.loggedInUserId);
var fa=t.getTokenBlock('FacebookAction');
self.FACEBOOK_ACTIONS.leach(function(action){
fa.replaceToken('id',action.id)
.replaceToken('label',action.label)
.replaceToken('checked',DataModel.g.getUserPreference('doFeed'+action.id,true)?'checked="checked"':'')
.next();
});
t.replaceToken('promptLoginChecked',
DataModel.g.getUserPreference('doFeedPromptLogin',true)
?'checked="checked"':'')
LalaFBConnect.hasAppPermission('offline_access',function(success){
t.keepTokenBlock('OfflineAccessTrue',success);
t.keepTokenBlock('OfflineAccessFalse',!success);
t.compose();
if(resSuccess){
LalaFBConnect.openFacebookLinkedDialog();


if(widgets.Share.facebookConnectClicked){
widgets.Share.showFacebookLinkedDialog=true;
}
}
self.fbLinkReqSent=false;
});
}


$TC(lt.AccountInfo.facebookFanBox,'facebookFanBox');
LalaFBConnect.parseDomTree();
});
},

renderFacebookNotConnected:function(){
$TC(lt.AccountInfo.fbNotConnected,'fbConnectContent');
},

renderFacebookLoggedOut:function(){
$T(lt.AccountInfo.fbConnectedNotLoggedIn,'fbConnectContent')
.replaceToken('promptLoginChecked',
DataModel.g.getUserPreference('doFeedPromptLogin',true)
?'checked="checked"':'')
.compose();
},

promptFacebookOfflineAccess:function(){
LalaFBConnect.openPermissionDialog('offline_access',null,'settings');
},

revokeOfflineAccess:function(){
LalaFBConnect.revokePermission('offline_access');
},

updateFacebookActions:function(skipActions){
var keys=[];
var values=[];
if(!skipActions){
this.FACEBOOK_ACTIONS.leach(function(action){
var id='doFeed'+action.id;
keys.push(id);
values.push($F(id));
});
}
keys.push('doFeedPromptLogin');
values.push($F('doFeedPromptLogin'));
DataModel.g.setUserPreferences(keys,values);
this.showSavedMessage();
},

updateLastFmScrobblingInfo:function(){
if($F('isLastFmScrobblingEnabled')){
if(this.validateLastFmLogin()){
api.User.setLastFMScrobblingInfo({
enableScrobbling:true,
userName:$F('lastFmUserName'),
password:$F('lastFmPassword')
},function(res){
if(res.data=="success"){
lala.showAck("Your listens will now be scrobbled to Last.fm");
}else{
lala.user.isLastFmScrobblingEnabled=false;
lala.user.lastFmUserName="";
lala.showAck("There was an error with your Last.fm username and/or password. Please try again.");
}
});
}
}else{
api.User.clearIsLastFMScrobblingInfo({},
function(){
lala.showAck("Your listens will no longer be scrobbled to Last.fm");
});
}
},

validateLastFmLogin:function(){
try{
mojo.util.validate({fieldId:'lastFmUserName',
fieldName:'Last.fm username',
type:'text',
isRequired:true});
mojo.util.validate({fieldId:'lastFmPassword',
fieldName:'Last.fm password',
type:'text',
isRequired:true});
this.hideErrorMessage('errorLastFmInfo');
return true;
}catch(e){
this.showErrorMessage('errorLastFmInfo',e.errMsg);
return false;
}
},

updatePersonalInfo:function(){
var self=this;

if(!this.validatePersonalInfo()){
return;
}
$('submitPersonalInfo').disabled=true;


















var factText=$F('uniqueFact').replace(/\s+/g,' ').replace(/"/g,"''");
var aboutMeText=$F('aboutMe').replace(/"/g,"''");


widgets.core.Util.generateLalaLinks(factText,function(newFactText){
widgets.core.Util.generateLalaLinks(aboutMeText,function(newAboutMeText){
try{

mojo.util.validate({
fieldId:'uniqueFact',
fieldName:'About you',
type:'text',
maxLength:self.UNIQUE_FACT_COUNT_MAX,
overrideTextVal:newFactText});
mojo.util.validate({
fieldId:'aboutMe',
fieldName:'About your music',
type:'text',
maxLength:self.ABOUT_ME_COUNT_MAX,
overrideTextVal:newAboutMeText});
}catch(e){
self.showErrorMessage('errorPersonalInfo',e.errMsg);
$('submitPersonalInfo').disabled=false;
return;
}

var params={
first_name:$F('first_name'),
last_name:$F('last_name'),
newNickname:$F('nickname'),
gender:mojo.form.getRadioValue('gender'),

location:$F('location'),
uniqueFact:newFactText,
aboutMe:newAboutMeText
};

api.User.updatePersonalInfo(
params,
function(res){
$('submitPersonalInfo').disabled=false;
self.showSavedMessage();
self.getAccountInfo();
});
});
});
},

validatePersonalInfo:function(){
try{
mojo.util.validate({fieldId:'first_name',
fieldName:'First name',
type:'name',
isRequired:true});
mojo.util.validate({fieldId:'last_name',
fieldName:'Last name',
type:'name',
isRequired:true});
mojo.util.validate({fieldId:'nickname',
fieldName:'Nickname',
type:'name',
isRequired:true});
this.hideErrorMessage('errorPersonalInfo');
return true;
}catch(e){
this.showErrorMessage('errorPersonalInfo',e.errMsg);
return false;
}
},

resetBirthdate:function(){
mojo.form.selectOption('month',"");
mojo.form.selectOption('day',"");
mojo.form.selectOption('year',"");
},

setupEventHandlers:function(){
var self=this;
$('cancelButton').onclick=function(){
MojoDialog.close();
}.lbind(this);

$('confirmButton').onclick=this.updateEmailAddress.lbind(this);

var self=this;




if(!mojo.IE){
mojo.input.onEnterKey('email_pwd',this.updateEmailAddress.lbind(this));
}


window.setTimeout(function(){mojo.focus('email_pwd')},1);

},

promptForEmailChangePassword:function(){
if($F('user_email')==lala.user.email){

this.showErrorMessage('errorEmail','This is already your email address');
return;
}else{
if(!this.validateEmailAddress()){
return;
}
var boxTmpl=$T(lt.AccountInfo.confirmEmailChangeBox);

this.emailConfirmDialog=new MojoDialog({
id:'confirmEmailChange',
title:'Change email'
});

this.emailConfirmDialog.onOpen=this.setupEventHandlers.lbind(this);
this.emailConfirmDialog.open(boxTmpl.compose());
}
},

updateEmailAddress:function(){
if(!this.validateEmailAddress()){
return;
}
try{
mojo.util.validate({
fieldId:'email_pwd',
fieldName:'Password',
type:'password',
isRequired:true
});
}catch(e){
this.showErrorMessage('errorEmailPassword',e.errMsg||'Incorrect password.');
return;
}

var password=$F('email_pwd');

var self=this;
var params={
new_e_mail:$F('user_email'),
pwd:password
};

if(params.new_e_mail==lala.user.email){

this.showErrorMessage('errorEmail','This is already your email address');
return;
}else{
api.User.updateEmailAddress(
params,
function(res){
if(res.data==null){
self.emailConfirmDialog.close();
var addMsg='';
if(frontend.needsToValidateEmail()){
addMsg='<br />We sent a new verification email to your new email'
if($('verifyBoxEmail'))$S('verifyBoxEmail',params.new_e_mail);
}
self.showSavedMessage(addMsg);

}else if(res.data.password){
self.showErrorMessage('errorEmailPassword',res.data.password);
}else if(res.data.email){
self.emailConfirmDialog.close();
self.showErrorMessage('errorEmail',res.data.email);
}
});
}
},

validateEmailAddress:function(){
try{
mojo.util.validate({fieldId:'user_email',
fieldName:'Email',
type:'email',
isRequired:true});
this.hideErrorMessage('errorEmail');
return true;
}catch(e){
this.showErrorMessage('errorEmail',e.errMsg||'Incorrect email or Lala password.');
return false;
}
},

updatePassword:function(){
if(!this.validPasswords()){
return;
}
var self=this;
var params={
oldpwd:$F('oldpwd'),
newpwd:$F('newpwd')
};
$('submitPassword').disabled=true;
api.User.updatePassword(
params,
function(res){
$('submitPassword').disabled=false;
if(res.data.error){
self.showErrorMessage('errorPassword',res.data.error);
}else{
$('oldpwd').value='';
$('newpwd').value='';
$('confirmnewpwd').value='';
self.showSavedMessage();
}
});
},

validPasswords:function(){
try{
mojo.util.validate({fieldId:'oldpwd',
fieldName:'Old Password',
type:'password',
isRequired:true});
mojo.util.validate({fieldId:'newpwd',
fieldName:'New Password',
type:'password',
isRequired:true});
this.hideErrorMessage('errorPassword');
return true;
}catch(e){
this.showErrorMessage('errorPassword',e.errMsg);
return false;
}
},

onChangePicture:function(){
frontend.onChangePicture('userImage');
},

onSaveBetaPrefs:function(){
var showIsBookmarksEnabled=$('isBookmarksEnabledCheckbox').checked;
var userPrefKeys=[];
var userPrefValues=[];

if(!mojo.IE6){
userPrefKeys.push('keyboardShortcutsMap');
userPrefValues.push(!$('keyboardShortcutsCheckbox').checked?false:mojo.form.getRadioValue('keymap'));

userPrefKeys.push('showFullscreenOption');
userPrefValues.push(!!$('fullscreenModeCheckbox').checked);
}else{
userPrefKeys.push('keyboardShortcutsMap');
userPrefValues.push(false);

userPrefKeys.push('showFullscreenOption');
userPrefValues.push(false);
}
api.User.setBetaFeatures({
isBookmarksEnabled:showIsBookmarksEnabled,
userPrefKeys:userPrefKeys,
userPrefValues:userPrefValues
},
function(res){
if(Player.g.isPlaying()){
if(!confirm("Page refresh required.\n"
+"\n"
+"We need to refresh the page for your changes to take effect.\n"
+"\n"
+"Refresh now? (music will be interrupted)")){
return;
}
}
lala.gotoPage.url(frontend.url.BetaSettings());
});

},

onStockImageSelect:function(imgName){
$('userImage').src=lala.avatarUrlFs
.replace('%SIZE%','original')
.replace('%USERID%',imgName)
.replace('%EXT%','jpg');
$('userImage').imageName=imgName;
$D('saveOrCancel',true);
$D('saveImageAck',false);
if(LalaFBConnect.isConnected())$D('facebookImageToggleDiv',false);
},

saveStockImage:function(){
$D('saveOrCancel',false);
api.User.setAvatar({imageName:$('userImage').imageName},function(res){
$D('saveImageAck',true);
if($('saveImageAck').timeout){
clearTimeout($('saveImageAck').timeout);
}
$('saveImageAck').timeout=window.setTimeout(function(){
if($('saveImageAck')){
$D('saveImageAck',false);
if(LalaFBConnect.isConnected())$D('facebookImageToggleDiv');
}
},2000);

lala.user.userImageExtension=res.data.userImageExtension;
lala.user.userImageType=res.data.userImageType;
lala.user.isUserImagePublished=res.data.isUserImagePublished;

$('userImage').src=frontend.img.Member(lala.user,true);
mojo.listeners.notify(api.User.EVT_PERSONAL_INFO);
});
},

cancelStockImage:function(){
$('userImage').src=frontend.img.Member(lala.user);
$D('saveOrCancel',false);
if(LalaFBConnect.isConnected())$D('facebookImageToggleDiv');
},

onActivateTrading:function(){
if(this.user.isAddressRequired){
lala.gotoPage.id('ActivateShipping');
}else if(this.user.isCreditCardRequired){
lala.gotoPage.id('ActivatePayment');
}else{
api.User.setTrading({setTrading:true},
function(res){
lala.gotoPage.id('ActivateSuccess');
});
}
},

updateEmailPrefs:function(){
var self=this;
var params={
isCDRequestedEmail:$F('isCDRequestedEmail'),
isFollowEmailEnabled:$F('isFollowEmailEnabled'),
isBlurbEmailEnabled:$F('isBlurbEmailEnabled'),
isMarketingEmail:$F('isMarketingEmail')
};
api.User.updateEmailPreferences(
params,
function(res){
self.user.isCDRequestedEmail=$F('isCDRequestedEmail');
self.user.isFollowEmailEnabled=$F('isFollowEmailEnabled');
self.user.isBlurbEmailEnabled=$F('isBlurbEmailEnabled');
self.user.isMarketingEmail=$F('isMarketingEmail');
self.showSavedMessage();
});
},

updateTrading:function(){
var self=this;
var params={
coverArtPref:$('coverArtNeutral').checked?'Neutral':'Required',
isVacating:$F('isVacating')
};
api.User.updateTradingPreferences(
params,
function(res){
self.user.coverArtPref=$('coverArtNeutral').checked?'Neutral':'Required';
self.user.isVacating=$F('isVacating');
self.showSavedMessage();
});
},

updatePrivacy:function(){
var self=this;
var params={
isSearchHidden:$F('isSearchHidden'),
removeFollowers:this._isSearchHiddenWithKillFollowedBy,
isPurchaseStoryDisabled:$F('isPurchaseStoryDisabled'),
isShowFullLastName:$F('isShowFullLastName'),
isVisibleTrader:$F('isVisibleTrader'),
isWantListPublic:$F('isWantListPublic')
};

api.User.updatePrivacyPreferences(
params,
function(res){
self.user.isSearchHidden=$F('isSearchHidden');
self.isPurchaseStoryDisabled=$F('isPurchaseStoryDisabled'),
self.user.isShowFullLastName=$F('isShowFullLastName');
self.user.isVisibleTrader=$F('isVisibleTrader');
self.user.isWantListPublic=$F('isWantListPublic');
self.showSavedMessage();
self._isSearchHiddenWithKillFollowedBy=false;
});
},

showErrorMessage:function(elem,msg){
$(elem).innerHTML=msg;
mojo.css.show(elem);
},

hideErrorMessage:function(elem){
mojo.css.hide(elem);
},

showSavedMessage:function(addition){
var msg='Your changes have been saved';
if(addition)msg+=(' '+addition);
lala.showAck(msg,{isTimedHide:true});
},






onBuyMoreCreditButton:function(){
var self=this;
widgets.core.BuyWalletDialog.open(
{onPurchaseResponse:function(){


self.tabs.all["songsTab"].loaded=false;
self.tabs.activate("songsTab");
}});
},

onClearPaymentMethod:function(){
var msg="This will remove your billing information from Lala. "
+"You will need to re-enter your info if you want to make another purchase."
+"\n\n"
+"Are you sure you want to remove your billing info?";
if(confirm(msg)){
api.User.clearCreditCard({},function(){
lala.showAck("Your billing info has been removed");
frontend.go.BillingInfo();
});
}
},

onHistoryTabClick:function(tab){
this['render'+tab.id.ltoFirstUpperCase()](tab);
},

renderTradesTab:function(tab){
$TC(lt.AccountInfo.purchasesMain,tab.contentId)

$T(lt.AccountInfo.filters,'purchaseFilters')
.replaceToken('what','Trade')
.removeTokenBlock('FiltersBlock')
.compose();
this.loadAndRenderCharges();
},

renderPurchasesContentTab:function(tab){
this.purchaseFromFilter='recent';
this.purchaseTypeFilter='all';

$TC(lt.AccountInfo.purchasesMain,tab.contentId)

$T(lt.AccountInfo.filters,'purchaseFilters')
.replaceToken('what','Purchase')
.compose();
this.loadAndRenderCharges();
},

loadAndRenderCharges:function(){
var self=this;
if(this.histTabs.active.id=='tradesTab'){
api.BillingHistory.getTradingCharges(
{count:20,
skip:0},
function(res){
self._renderBills(res,'purchaseContent',true);
});
}else{
api.BillingHistory.getStoreCharges(
{from:this.purchaseFromFilter,
type:this.purchaseTypeFilter,
count:20,
skip:0},
function(res){
self._renderBills(res,'purchaseContent');
});
}
},

_renderBills:function(res,renderDivId,displayTrades){
var charges=res.data.list;
if(charges.length==0){
mojo.setContent(renderDivId,
$T(lt.AccountInfo.g_noCharges)
.replaceToken('what',
this.histTabs.active.id=='tradesTab'
?'trade':'purchase')
.compose());
if($('purchasePaginator_bottom'))$D('purchasePaginator_bottom',false);
if($('purchasePaginator_top'))$D('purchasePaginator_top',false);
return;
}
var te=mojo.template.create(lt.AccountInfo.g_billingTable,renderDivId);
te.replaceToken('hidePurchases',displayTrades?'':'none');
var r=te.getTokenBlock('RowBlock');
r.dateFormatString="%b %e, %Y";


if(!this.chargesById)this.chargesById={};
for(var i=0;i<charges.length;i++){
var c=charges[i];
var type=c.type;

switch(type){
case'MonthlySwapCharge':
this._prepareMonthlyCharge(c);
break;
case'BuyItNowCharge':
this._prepareBuyItNowCharge(c);
break;
case'CustomerRefund':
c.title="Customer Refund";
break;
case'MonthlySwapRefund':
c.title="Monthly swap refund";
break;
case'MicroWallet':
this._prepareMicroWalletCharge(c);
break;
default:
mojo.log.error('unknown charge type: '+type);
break;
}

c.amount=parseFloat(c.amount);
c.amount=c.amount.toFixed(2);

this.chargesById[c.chargeToken]=c;
c.amountUI=c.amount;
if(c.isGiftReceived){
r.replaceToken('walletPayment','walletPayment');
r.removeTokenBlock('DollarBlock');
c.amountUI='gift';
}else if(c.isPaidWithWallet){
r.replaceToken('walletPayment','walletPayment');
c.amountUI+='<br/>(from wallet)';
}else if(c.isPaidWithCredit){
r.replaceToken('walletPayment','walletPayment');
r.removeTokenBlock('DollarBlock');
c.amountUI=c.creditsUsed+' credit'+(c.creditsUsed==1?'':'s');
}else if(c.isFacebook){
r.replaceToken('walletPayment','walletPayment');
r.removeTokenBlock('DollarBlock');
var toolTip=c.fbCredits+" Facebook Credit"+(c.fbCredits==1?'':'s');
c.amountUI='<span title="'+toolTip+'">'+c.fbCredits
+' FB credit'+(c.fbCredits==1?'':'s')+'</span>';
}else if(c.amount==0){
c.amountUI='Free';
r.replaceToken('walletPayment','walletPayment');
r.removeTokenBlock('DollarBlock');
c.isPromo=true;
}

r.replaceTokensWithBean('charge',c);
r.replaceToken('bhticket',this.mojoTicket);
r.next();
}

if(lala.user.isPaying){
te.removeTokenBlock('NotPayingBlock');
}
te.compose();
new widgets.core.Paginator('purchasePaginator_bottom',
'big',
'purchasePaginator_top',
'lite').renderTwo(res,res.data);
$D('purchasePaginator_bottom');
$D('purchasePaginator_top');
},

renderItems:function(id,chargeType){

$D('swapItems'+id);
var charge=this.chargesById[id];

var noDataTemplate=lt.AccountInfo.g_noMonthlyBillsTemplate;
var table=$T(lt.AccountInfo.g_swapItemsTable);
if(charge.timestampTitle)table.replaceToken('chargeTimestampTitle',charge.timestampTitle);
var t=table.getTokenBlock("RowsCollectionBlock");

switch(chargeType){
case'MonthlySwapCharge':
case'CustomerRefund':
case'MonthlySwapRefund':
if(charge.items.length>0&&charge.items[0].type=='ReceivingSwap'){




charge.items.length=0;
break;
}
if(charge.items!=null&&charge.items.length>0){
charge.items.sort(this._swapItemComparator.lbind(this));
}
this._renderItems(charge,charge.items,t,table);
break;
case'BuyItNowCharge':
charge.total=parseFloat(charge.amount);
charge.itemsTotal=parseFloat(charge.amount-charge.shippingTotal-charge.taxTotal);
api.Store.processShoppingCart(charge,true);
noDataTemplate=lt.AccountInfo.g_noItemsInCartTemplate;
this._renderItems(charge,charge.items,t);
if(charge.itemsTotal>0){
var tItems=[{type:'Subtotal',amount:charge.itemsTotal}];
this._renderItems(charge,tItems,t);
}
if(!charge.isPaidWithCredit&&!charge.isGiftReceived){
var tItems=[{type:'Tax',amount:charge.taxTotal}];
this._renderItems(charge,tItems,t);
}
if(charge.shippingTotal>0){
var sItems=[{type:'Shipping',amount:charge.shippingTotal}];
this._renderItems(charge,sItems,t);
}
if(charge.total>0){
var tItems=[{type:'Total',amount:charge.total}];
this._renderItems(charge,tItems,t);
}
if(charge.walletPaymentAmount){
var tItems=[{type:'WalletPayment',amount:charge.walletPaymentAmount}];
this._renderItems(charge,tItems,t,table);
}
if(charge.creditCardPaymentAmount){
var tItems=[{type:'CreditCardPayment',amount:charge.creditCardPaymentAmount}];
this._renderItems(charge,tItems,t,table);
}
break;
}

var html=table.compose();
if(charge.items.length<=0){
html=$TC(noDataTemplate);
}
$S('swapItemsDiv'+id,html);
},

handleToggleSwapItems:function(id){
var charge=this.chargesById[id];
var div=$('swapItems'+id);

var display=mojo.css.getComputedStyle(div,'display');
var showing=!(display=='none');
var summaryRow=$('summaryRow'+id);
if(!showing){
if(!charge.items){
var onresponse=function(res){
charge.creditCardAmount=res.data.creditCardAmount;
charge.creditCardNumber=res.data.creditCardNumber;
charge.creditCardType=res.data.creditCardType;
charge.address=res.data.address;
charge.items=res.data.items;
if(charge.creditCardAmount){

charge.items[charge.items.length]={
type:'CreditCardPayment',
amount:-charge.creditCardAmount
};
}
this.renderItems(id,charge.type);
$AC(summaryRow,'toggleOpen');
}.lbind(this);
api.BillingHistory.getChargeDetails(id,onresponse);
}else{

mojo.css.display(div,true);
$AC(summaryRow,'toggleOpen');
}
}else{
mojo.css.display(div,false);
$DC(summaryRow,'toggleOpen');
}
},

_dummyDate:new Date(),

_swapItemComparator:function(item1,item2){

var def=this._dummyDate.getTime();
var t1=0;var t2=0;
if(item1.type=="MonthlySwapCredit"||item1.type=='CreditCardPayment'){
t1=0;
}else{
t1=item1.transaction.shipDate.getTime();
}
if(item2.type=="MonthlySwapCredit"){
t2=def;
}else{
if(item2.transaction){
t2=item2.transaction.shipDate.getTime();
}
}

if(t1>t2)return-1;
if(t1<t2)return 1;
if(t1==t2){
if(item1.isSwapRefund)return 1;
else if(item2.isSwapRefund)return-1;
else return 0;
}
},

_prepareMonthlyCharge:function(c){
var startDate=c.startDate;
var endDate=c.endDate;

c.title=("Trades between "+
startDate.lformat('%B %d, %Y')+
" - "+endDate.lformat('%B %d, %Y'));

var sb=$T(lt.AccountInfo.g_chargeStatus);
if(c.failed){
sb.replaceToken('status',"Failed");
sb.replaceToken('statusClass',"Failed");
}else{
sb.replaceToken('status',"Processed");
sb.replaceToken('statusClass',"Confirmed");
}
c._status=sb.compose();

},

_prepareMicroWalletCharge:function(c){
var startDate=c.startDate;
var endDate=c.endDate;

c.title=(c.postedDate.lformat('%B %Y'));
},

_prepareBuyItNowCharge:function(c){
var sb=$T(lt.AccountInfo.g_chargeStatus);
var status="";
var statusClass="";

var start='Items purchased';
if(c.isGiftReceived){
if(c.isFacebook)
start='Facebook gift received';
else
start='Gift received';
}
else if(c.isGiftSent)start='Gift sent';

c.timestampTitle=c.postedDate.lformat(start+' at %l:%M%p on %B %e, %Y:');
c.title=c.summaryTitle||"Cart purchase";
if(c.summaryType=='WebSong'){
c.title="Web song";
if(c.summaryTitle&&c.summaryArtist){
c.title+=" - "+c.summaryTitle+" by "+c.summaryArtist;
}else{
c.title+=" purchase";
}
}else if(c.summaryType=='WebAlbum'||c.summaryType=='WebAlbumGroup'){
c.title="Web album - "+c.summaryTitle+" by "+c.summaryArtist;
}else if(c.summaryType=='Mp3Song'){
c.title="MP3 song";
if(c.summaryTitle&&c.summaryArtist){
c.title+=" - "+c.summaryTitle+" by "+c.summaryArtist;
}else{
c.title+=" purchase";
}
}else if(c.summaryType=='Mp3Album'||c.summaryType=='Mp3AlbumGroup'){
c.title="MP3 album - "+c.summaryTitle+" by "+c.summaryArtist;
}else if(c.summaryType=='WebPlaylistGroup'){
c.title="Web playlist - "+c.summaryTitle;
}else if(c.summaryType=='Mp3PlaylistGroup'){
c.title="MP3 playlist - "+c.summaryTitle;
}else if(c.summaryType=='PhysicalDisc'){
c.title="CD";
if(c.summaryTitle&&c.summaryArtist){
c.title+=" - "+c.summaryTitle+" by "+c.summaryArtist;
}
}else if(c.summaryType=='PhysicalDiscGroup'&&c.summaryTitle&&c.summaryArtist){
c.title="CD + Free web album";
if(c.summaryTitle&&c.summaryArtist){
c.title+=" - "+c.summaryTitle+" by "+c.summaryArtist;
}
}

if(c.isGiftSent)c.title='Gift sent - '+c.title;
if(c.isGiftReceived){
if(c.isFacebook){
c.title='Facebook gift received - '+c.title;
}else{
c.title='Gift received - '+c.title;
}
}

if(c.failed){
statusClass="Failed";
status="Failed";
}else if(!c.isAuthorized&&!c.isCaptured&&
!c.failed){

statusClass="Failed";
status="Failed";
c.failed=true;
}else if(c.isAuthorized&&!c.isCaptured&&!c.isCommitted){



statusClass="Failed";
status="Failed";
c.failed=true;
}else if(c.isShipped){
statusClass="Shipped";
status="Delivered";
}else if(c.isAuthorized){
statusClass="Pending";
status="Pending";
}
if(c.refundAmount>0){

c._refund=("(-"+c.refundAmount.toFixed(2)+
")");
status="dispute resolved";
}
sb.replaceToken('status',status);
sb.replaceToken('statusClass',statusClass);
c._status=sb.compose();
},

_setupFees:function(item,charge){
if(item._isBundleItem)return;

if(charge.isPaidWithCredit){
item.amountUI=charge.creditsUsed+' credit'
+(charge.creditsUsed==1?'':'s');
}else if(charge.amount==0&&!charge.isGiftReceived
&&!charge.isPaidWithWallet){
item.amountUI='Free';
}else{
item.amountUI=parseFloat(Math.abs(item.amount));
item.amountUI='$'+item.amountUI.toFixed(2);
}
item.swapFees=parseFloat(item.swapFees);
item.swapFees=item.swapFees.toFixed(2);
item.postageFees=parseFloat(item.postageFees);
item.postageFees=item.postageFees.toFixed(2);
},

_setupSwapBillItem:function(row,item,index,charge){
var swapCell;


if(item.amount==0){
swapCell=row.getTokenBlock("FreeCell");
row.removeTokenBlock("NormalFeesCell");
}else{
swapCell=row.getTokenBlock("NormalFeesCell");
row.removeTokenBlock("FreeCell");
}


if(item.isReceiverSwapCredit){
var cb=row.getTokenBlock('hasCreditBlock');
}else{
row.removeTokenBlock('hasCreditBlock');
}

item._displayClass="normal";
var cond="";



if(item.isSwapRefund||
(item.transaction.condition==
strings.conditions.PendingReceive)){
cond=
strings.conditions.text[item.transaction.condition];
cond+=":&nbsp;&nbsp;";
if(item.isSwapRefund)item._displayClass="refund";
else item._displayClass="pending";
}





if(item.isSwapWithCoverArt){
row.getTokenBlock("coverArtBlock");
item.coverArtFees=parseFloat(item.coverArtFees);
item.postageFees=parseFloat(item.postageFees);
item.postageFees=item.postageFees+item.coverArtFees;
item.postageFees=item.postageFees.toFixed(2);
}else{
row.removeTokenBlock("coverArtBlock");
}

item._condition=cond;







if(!charge._shDisplayed&&item.amount==0){
item._shDisplay="none";
charge._shDisplayed=false;
}else if(!charge._shDisplayed&&item.amount>0){
item._shDisplay="inline";
charge._shDisplayed=true;
}else{
item._shDisplay="none";
}




item._pfDisplay="inline";
if(index!=0&&(item.postageFees==0)&&(item.swapFees==0)){
item._pfDisplay="none";
}
swapCell.replaceTokensWithBean("item",item);

},

_renderItems:function(charge,items,t,wrapper,isPhysicalDiscGroup){
var self=this;
var renderAddress=false;

for(var i=0;i<items.length;i++){
var item=items[i];
var row=null;
var type=item.type;
var skipRowCompose=false;

this._setupFees(item,charge);
switch(type){
case'Swap':
case'PendingSwap':
case'SwapRefund':
row=$T(lt.AccountInfo.swapRowBlock);
this._setupSwapBillItem(row,item,i,charge);
break;
case'Bundle':
row=$T(lt.AccountInfo.bundlePurchaseBlock);
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
title:item.title,
id:item.bundleId,
radioId:'cdPurchase'}));
break;
case'DiscPurchase':
case'WebAlbumPurchase':
this._setItemOrderStatusString(item);
row=$T(lt.AccountInfo.discPurchaseBlock);
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
title:item.title,
artist:item.artist,
id:item.id,
radioId:'cdPurchase'}));
if(item.nbdisc>=2){
item.title=item.title.replace(/Disc (\d+\/\d+)/g,item.nbdisc+' Disc Set');
}
if(type=='WebAlbumPurchase'){
item.extraInfo='<B>(CD +iPod)</B>';
}else{
item.extraInfo='<B>(CD)</B>';
}
break;
case'PhysicalDiscGroup':
this._setItemOrderStatusString(item);
this._renderItems(charge,item.items,t,null,true);
if(!renderAddress)renderAddress=true;
skipRowCompose=true;
break;
case'PhysicalDisc':
this._setItemOrderStatusString(item);
row=$T(lt.AccountInfo.discPurchaseBlock);
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
title:item.title,
artist:item.artist,
id:item.id,
radioId:'cdPurchase'}));
if(item.nbdisc>=2){
item.title=item.title.replace(/Disc (\d+\/\d+)/g,item.nbdisc+' Disc Set');
}
item._type='CD';
if(!renderAddress)renderAddress=true;
break;
case'WebAlbum':
case'WebAlbumGroup':
case'MicroAlbumDownload':
case'Mp3Album':
case'Mp3AlbumGroup':
if(charge.isPaidWithCredit){
item.amountUI=charge.creditsUsed+' credit'
+((charge.creditsUsed==1)?'':'s');
}
this._setItemOrderStatusString(item);
row=$T(lt.AccountInfo.Mp3AlbumPurchaseBlock);
var isWeb=type=='WebAlbum'||type=='WebAlbumGroup';
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
title:item.title,
artist:item.artist,
id:item.id?item.id:item.discid,
radioId:(isWeb?'webSong':'mp3')+'Purchase'}));
item._type=isWeb?'Web album':'MP3 album';


if(item.type=='Mp3AlbumGroup'&&!item.discid){
item.discid=item.lalaId;
}
if(item.amount==0)item.amountUI='Free';
var tracksBlock=row.getTokenBlock('TracksBlock');
var d=tracksBlock.getTokenBlock('DiscBlock');
var showAlreadyCollected=false;
if(item.billItemDiscs){
if(item.billItemDiscs.length==1)d.removeTokenBlock('DiscNumBlock');
item.billItemDiscs.leach(function(itemDisc){
d.replaceToken('numOfDisc',itemDisc.disc.discno);
var tb=d.getTokenBlock('TrackBlock');
if(itemDisc.billItemTracks){
itemDisc.billItemTracks.leach(function(itemTrack,index){
tb.replaceToken('num',index+1+'.');
itemTrack.track.titleUI=itemTrack.track.title.lescapeHTML();
if(!itemTrack.isPurchased){
if(type=='Mp3Album'&&!itemTrack.track.isLicensedForDownload){
itemTrack.track.titleUI='<i>unavailable</i>';
}else if(type!='Mp3Album'&&!itemTrack.track.isLicensedForStreaming){
itemTrack.track.titleUI='<i>unavailable</i>';
}else{
tb.replaceToken('notPurchasedStar','*');
if(!showAlreadyCollected)showAlreadyCollected=true;
}
tb.replaceToken('notPurchased','notPurchased');
}
tb.replaceTokensWithBean('track',itemTrack.track);
tb.next();
});
}
d.next();
});
if(!showAlreadyCollected)tracksBlock.removeTokenBlock('AlreadyCollectedMsg');
}else{
row.removeTokenBlock('TracksBlock');
}
break;
case'WebSong':
case'Mp3Song':
case'MicroTrackPurchase':
case'MicroTrackDownload':
case'MicroTrackGift':
if(charge.isPaidWithCredit){
item.amountUI=charge.creditsUsed+' credit'
+((charge.creditsUsed==1)?'':'s');
}else if(charge.isGiftReceived){
item.amountUI='gift';
}else if(charge.isFacebook){
item.amountUI='';
}
this._setItemOrderStatusString(item,true);
row=$T(lt.AccountInfo.Mp3SongPurchaseBlock);
var radioId='';
if(item.recipientName||type=='MicroTrackGift'){
if(item.recipientToken){
item.extraInfo=' <EM>[gift to <a class="lmemberlink" '
+frontend.link.Member(item.recipientToken)
+'>'+item.recipientName+'</a>]</EM> ';
}else{

item.extraInfo=' <EM> [gift to '+item.recipientName+']</EM> ';
}
item._type='Gift song';
radioId='giftPurchase';
}else if(type=='Mp3Song'||type=='MicroTrackDownload'){
item._type='MP3 song';
radioId='mp3Purchase';
}else if(type=='WebSong'||type=='MicroTrackPurchase'){
item._type='Web song';
if(charge.isGiftReceived){
radioId='giftPurchase';
if(!charge.isFacebook){
item.extraInfo=' <EM>[gift from '+item.gifterName+']</EM>';
}
}else{
radioId='webSongPurchase';
}
}
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
title:item.title+' by '+item.artist,
id:item.lalaId,
radioId:radioId}));
break;
case'WalletWithdrawal':
row=$T(lt.AccountInfo.microPaymentBlock);
item._displayClass="tax";
item._description="Order Payment";
item.extraInfo='<B>($'+item.price.toFixed(2)+')</B>';
row.replaceToken('num',i<9?'&nbsp;'+(i+1):(i+1));
row.dateFormatString="%n/%d/%y %l:%M%P";
row.replaceToken('time',item.time);
break;
case'Subtotal':
if(charge.isPromo||charge.isFacebook)continue;
row=$T(lt.AccountInfo.monthlyRowBlock);
item._displayClass="subtotal";
item._description="Total before tax:";
break;
case'Shipping':
row=$T(lt.AccountInfo.monthlyRowBlock);
item._displayClass="shipping";
item._description="Shipping:";
break;
case'Tax':
if(charge.isPromo||charge.isFacebook)continue;
row=$T(lt.AccountInfo.monthlyRowBlock);
item._displayClass="tax";
item._description="Sales tax:";
break;
case'Total':
row=$T(lt.AccountInfo.monthlyRowBlock);
row.replaceToken('bold','lbold')
.replaceToken('hasBorder','hasBorder');
item._displayClass="total";
item._description="Order total:";
break;
case'WalletPayment':
wrapper.replaceToken('paymentMethod',
$T(lt.AccountInfo.paymentMethodBlock)
.replaceToken('content',"Payment method: "+item.amountUI+" from wallet")
.compose());
return;
break;
case'PromoPayment':
continue;
break;
case'CreditPayment':
case'GiftPayment':
case'FacebookPayment':
return;
break;
case'CreditCardPayment':
var content='';
if(charge.isFacebook){
content="Paid with "+charge.fbCredits+" Facebook credit"
+(charge.fbCredits>1?'s':'');
}else if(charge.isGoogleCheckout){
content="Paid with Google Checkout";
}else if(charge.isPaypalEc){
content="Paid with PayPal Express Checkout";
}else if(charge.failed){
content='<span style="color: #D03200">'
+'Charge failed: $'
+mojo.util.formatPrice(charge.creditCardAmount)
+" not charged to "+charge.creditCardType+" "
+charge.creditCardNumber.substr(charge.creditCardNumber.length-6)
+"<br/>Check that your "+DataModel.g.getCreditCardText()+" has not expired and has a valid address and zip code, "
+"otherwise let us know via our <a "+frontend.link.ContactSupport({radioId:'billing'})+">contact support</a> page.</span>";
}else if(charge.creditCardAmount
&&charge.creditCardType
&&charge.creditCardNumber){
content=DataModel.g.getCreditCardText().ltoFirstUpperCase()+" payment: $"
+mojo.util.formatPrice(charge.creditCardAmount)
+" charged to "+charge.creditCardType+" "
+charge.creditCardNumber.substr(charge.creditCardNumber.length-6);
}else if(charge.creditCardAmount){

content=DataModel.g.getCreditCardText().ltoFirstUpperCase()+" payment: $"
+mojo.util.formatPrice(charge.creditCardAmount);
}
wrapper.replaceToken('paymentMethod',
$T(lt.AccountInfo.paymentMethodBlock)
.replaceToken('content',content)
.compose());
return;
break;
case'EnvelopePurchase':
row=$T(lt.AccountInfo.monthlyRowBlock);
item._description="envelope purchase";
break;
case'InsertPurchase':
row=$T(lt.AccountInfo.monthlyRowBlock);
item._description="insert purchase";
break;
case'MonthlySwapCredit':
row=$T(lt.AccountInfo.monthlyRowBlock);
item._description="credit";
if(item.pending)item._displayClass="pendingCredit";
else item._displayClass="confirmedCredit";
break;
case'TShirtPurchase':
this._setItemOrderStatusString(item);
row=$T(lt.AccountInfo.tShirtPurchaseBlock);
if(item.shirtSize=='Fake'){
item._description=item.shirtDesign.title;
}else{
item._description=item.shirtDesign.title+': '+item.skew.sizeDescription;
}
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
title:'T-shirt - '+item._description,
id:item.id,
radioId:'other'}));
break;
case'StoreProduct':
this._setItemOrderStatusString(item);
row=$T(lt.AccountInfo.storeProductBlock);
var radioId='walletPurchase';
if(item.productCode.lcontains('MWALLET')){
item._orderStatus='';
}

if(item.productCode.lcontains('GCARD')){
item._type='Gift card';
item._description='';
if(item.giftCard.receiverType=='PRINT'){
item._description+='Printed<br/>';
}else if(item.giftCard.receiverEmail){
item._description+='Emailed to '+item.giftCard.receiverEmail+'<br/>';
}else if(item.giftCard.receiverType=='USER'){
item._description+='Emailed to member '+item.giftCard.receiverName+'<br/>';
}
if(item.giftCard.receiverName&&item.giftCard.receiverType!='USER'){
item._description+='To: '+item.giftCard.receiverName+'<br/>';
}
if(item.giftCard.isClaimed){
item._description+='Claimed on '+(new Date(parseFloat(item.giftCard.acceptTimestamp))).lformat('%B %e, %Y')+'<br/>';
}else if(item.giftCard.receiverType!='USER'){
item._description+='Not yet claimed<br/>';
}
if(item.giftCard.code){
item._description+='Claim code: '+item.giftCard.code;
}
radioId='giftPurchase';
}else{
item._description=item.title;
}
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
id:item.lalaId,
radioId:radioId}));
break;
case'ReceivingSwap':




continue;
break;
case'FakeViewReceipt':
row=$T(lt.AccountInfo.confirmReceiptRowBlock);
var qstr="?cartId="+charge.chargeToken;
var cartHref=frontend.go.ShoppingCart();
row.replaceToken("cartHref",cartHref);
break;
case'WebPlaylistGroup':
case'Mp3PlaylistGroup':
row=$T(lt.AccountInfo.digitalPlaylistPurchaseBlock);
item._type=type=='WebPlaylistGroup'?'Web playlist':'MP3 playlist';
if(!charge.isPaidWithCredit&&!charge.isPromo){
item.amountUI=parseFloat(Math.abs(charge.itemsTotal));
item.amountUI='$'+item.amountUI.toFixed(2);
}
var tb=row.getTokenBlock('TrackBlock');
item.items.leach(function(track,index){
tb.replaceTokensWithBean('track',track)
.replaceToken('num',index+1)
.next();
});
row.replaceToken('contactSupportLink',
frontend.link.ContactSupport({chargeToken:charge.chargeToken,
itemToken:item.token,
id:item.lalaId,
radioId:type=='WebPlaylistGroup'?'webSongPurchase':'mp3Purchase'}));
break;
default:
mojo.log.error('unknown type: '+type);
break;
}
if(item.extraInfo){
row.replaceToken('extraInfo',$TC(item.extraInfo));
}
if(!skipRowCompose)row.replaceTokensWithBean('item',item);
if(item._isBundleItem){
row.replaceToken('hideQuantity','hidden');
}
if(item&&item.transaction&&item.transaction.id){
row.replaceToken('discId',item.transaction.id);
if(item&&item.transaction&&item.transaction.nbdisc>1){
row.replaceToken('discNum','(Disc '+item.transaction.discno+'/'+item.transaction.nbdisc+')');
}else{
row.replaceToken('discNum','');
}
}else if(item&&item.discid){
row.replaceToken('discId',item.discid);
}
if(!skipRowCompose)t.replaceToken('swapItemsTableContent',row.compose());

t.next();
}
if(renderAddress&&!isPhysicalDiscGroup){
row=$T(lt.AccountInfo.addressBlock)
.replaceToken('name',charge.address.name||lala.user.fullName)
.replaceToken('addr2',charge.address.addr2?charge.address.addr2+', ':'')
.replaceTokensWithBean('addr',charge.address);
t.replaceToken('swapItemsTableContent',row.compose());
t.next();
}
},

_setItemOrderStatusString:function(item,noop){
if(noop){
item._orderStatus="";
item._orderStatusClass="";
return;
}
if(item.pending){
item._orderStatus="Pending";
item._orderStatusClass="Pending";
}

if(item.confirmed){
item._orderStatus=(item.type=='WebAlbum'
||item.type=='WebSong'
||item.type=='Mp3Album'
||item.type=='Mp3Song')?"Delivered":"Shipped";
item._orderStatusClass="Shipped";
}

if(item.partiallyShipped){
item._orderStatus="Shipped "+item.shippedQuantity+" of "+item.quantity;
item._orderStatusClass="PartiallyShipped";
}

if(item.failed){
item._orderStatus="Out of Stock";
item._orderStatusClass="Failed";
}

},

onPurchasesFilterChange:function(elem){
var value=$F(elem);
if(elem.id=='purchasesFromFilter'){
this.purchaseFromFilter=value;
}else if(elem.id=='purchasesTypeFilter'){
this.purchaseTypeFilter=value;
}
this.loadAndRenderCharges();
},

useFBForPersonalInfo:function(){
LalaFBConnect.getUserInfo(
LalaFBConnect.loggedInUserId,
['sex',
'current_location',
'about_me',
'music',
'first_name',
'last_name'],
function(result){
var info=result[0];
if(!info)return;
if(info.sex=='male'){
$('male').checked=true;
}else if(info.sex=='female'){
$('female').checked=true;
}
var location='';
if(info.current_location){
location+=info.current_location.city||'';
if(info.current_location.state&&info.current_location.city){
location+=', ';
}
location+=info.current_location.state||'';
if(info.current_location.country&&(info.current_location.city||info.current_location.state)){
location+=', ';
}
location+=info.current_location.country||'';
}
if(location)$('location').value=location;
if(info.about_me)$('uniqueFact').value=info.about_me.substring(0,64);
if(info.music)$('aboutMe').value=info.music.substring(0,512);
if(info.first_name)$('first_name').value=info.first_name;
if(info.last_name)$('last_name').value=info.last_name;
});
}

};
Object.extend(AccountInfoPage.prototype,Page.prototype,true);
MyMusic.addPage('accountinfo',function(){return new AccountInfoPage();});


VerifyEmailPage=Class.create();
VerifyEmailPage.prototype={
initialize:function(params){
this.initPage({
authLevel:1,
pageTitle:'Your email address has been verfied',
theme:'blueTheme',
pageId:'VerifyEmail',
skelClass:'verifyEmail'
});

VerifyEmailPage.g=this;
this.verifyToken=params.verifyToken;
},

onLoad:function(){

if(!this.verifyToken){
frontend.go.Home();
if(!frontend.needsToValidateEmail()){
lala.showAck('Your email address has previously been verified.');
}
return;
}


var isAlreadyValidated=!frontend.needsToValidateEmail();
var self=this;
api.User.verifyEmailAddress(this.verifyToken,function(res){
if(res.data){


if(isAlreadyValidated){
frontend.go.Home();
lala.showAck('Your email address has previously been verified.');
return;
}
lala.user=res.data;
self.renderVerified();
}else{


self.renderError();
}
});
},

onAfterLoad:function(){

lala.Track.flushCounters();
},

renderVerified:function(){
var verifiedMsg=$T(lt.VerifyEmailPage.verifiedMsg)
.replaceToken('creditsAmount',api.MicroWallet.credits)
.replaceToken('s',api.MicroWallet.credits==1?'':'s')
.removeTokenBlock('CreditsExpireBlock',frontend.hasOldCredits())
.compose();

var rb=new widgets.core.RoundedBox({
mode:'tinyBorderCCC',
backgroundColor:'white',
contentHTML:verifiedMsg,
id:'verifiedBox',
width:'85%'
});
var t=$T(lt.VerifyEmailPage.verifiedSkel)
.replaceToken('verifiedMsg',rb.getHTML())
.compose();
this.renderIntoContentRegion(t);

Header.g.headerMenus.showMenu('credits');

var menuB=$B('headerCreditCount','headerToolbar');
var padding=60;
$('greenArrow').style.left=(menuB.left-padding)+'px';
},

renderError:function(){
var errorMsg=$T(lt.VerifyEmailPage.errorMsgSkel)
.replaceToken('email',lala.user.email)
.compose();
this.renderIntoContentRegion(errorMsg);
}
};
Object.extend(VerifyEmailPage.prototype,Page.prototype,true);
MyMusic.addPage('verifyEmail',function(pathParts){
return new VerifyEmailPage({verifyToken:pathParts[1]});
});


UnsubscribePage=Class.create();
UnsubscribePage.prototype={
initialize:function(params){
this.initPage({
authLevel:0,
pageTitle:'Unsubscribe',
theme:'blueTheme',
pageId:'Unsubscribe',
skelClass:'unsubscribe'
});

UnsubscribePage.g=this;
this.token=params.token;
},

onLoad:function(){
var self=this;
api.User.unsubscribeFromEmail(this.token,function(res){
var t=$T(lt.Unsubscribe.skel);
var rb=new widgets.core.RoundedBox({
mode:'border',
backgroundColor:'#FFF',
width:'510px'
});
t.replaceToken('rbWidget',rb.getHTML());
self.renderIntoContentRegion(t);

var msg;
if(res.data){
msg=$T(lt.Unsubscribe.success,rb.contentId);
var emailName='';
switch(res.data){
case'isMarketingEmail':
emailName='New Releases';
break;
case'isBlurbEmailEnabled':
emailName='messaging';
break;
case'isFollowEmailEnabled':
emailName='member-follow';
break;
default:
emailName='these types of';
}
msg.replaceToken('emailName',emailName);
}else{
msg=$T(lt.Unsubscribe.error,rb.contentId);
}
msg.compose();
});
}
};
Object.extend(UnsubscribePage.prototype,Page.prototype,true);
MyMusic.addPage('unsubscribe',function(pathParts){
return new UnsubscribePage({token:pathParts[1]});
});


