




mojo=new Object();

mojo.DEV_FLAG=false;
mojo.idGenerator=1;
mojo.PERF=false;
mojo.emptyFunction=function(){};

mojo.USER_AGENT=navigator.userAgent.toLowerCase();
mojo.IE=mojo.USER_AGENT.indexOf('msie')!=-1;
mojo.IE6=mojo.USER_AGENT.indexOf('msie 6.')!=-1;
if(mojo.USER_AGENT.indexOf('msie 7.')!=-1){
mojo.IE6=false;
mojo.IE7=true;
}
if(mojo.USER_AGENT.indexOf('msie 8.')!=-1){
mojo.IE6=false;
mojo.IE7=false;
mojo.IE8=true;
}
mojo.IE67=mojo.IE6||mojo.IE7;
mojo.CHROME=mojo.USER_AGENT.indexOf('chrome')!=-1;
mojo.SAFARI=mojo.USER_AGENT.indexOf('safari')!=-1
&&mojo.USER_AGENT.indexOf('chrome')==-1;
mojo.SAFARI2=mojo.USER_AGENT.indexOf('safari')!=-1
&&mojo.USER_AGENT.indexOf('version/3')==-1
&&mojo.USER_AGENT.indexOf('chrome')==-1;
mojo.SAFARI3=mojo.USER_AGENT.indexOf('safari')!=-1
&&mojo.USER_AGENT.indexOf('version/3')!=-1;
mojo.WEBKIT=mojo.USER_AGENT.indexOf('webkit')!=-1;
mojo.FF=!mojo.IE&&!mojo.SAFARI&&!mojo.CHROME;
mojo.FF3=mojo.FF&&mojo.USER_AGENT.indexOf('firefox/3.')!=-1;
mojo.LALA_CRAWLER=mojo.USER_AGENT.indexOf('lala-rendered')!=-1;
mojo.TRUE_FF=mojo.USER_AGENT.indexOf('firefox')!=-1;
mojo.FF2=mojo.FF&&mojo.TRUE_FF&&!mojo.FF3;
mojo.MAC=mojo.USER_AGENT.indexOf('macintosh')!=-1;
mojo.WIN=(mojo.USER_AGENT.indexOf('windows')!=-1||
mojo.USER_AGENT.indexOf('winnt')!=-1||
mojo.USER_AGENT.indexOf('win98')!=-1||
mojo.USER_AGENT.indexOf('win95')!=-1);
mojo.WIN_VERSION=0;
mojo.XP_OR_OLDER=false;
if(mojo.WIN&&mojo.USER_AGENT.match(/windows nt (\d\.\d)/)){
mojo.WIN_VERSION=parseFloat(RegExp.$1);
mojo.XP_OR_OLDER=mojo.WIN_VERSION<6;
}

mojo.getBrowser=function(){
var browser='other';
if(mojo.IE6)browser='ie6';
else if(mojo.IE7)browser='ie7';
else if(mojo.IE8)browser='ie8';
else if(mojo.CHROME)browser='chrome';
else if(mojo.SAFARI)browser='safari';
else if(mojo.FF)browser='firefox';
return browser;
};

mojo.assert=function(cond,msg){
if(!cond){
mojo.log.error('assert: '+msg);
throw msg;
}
};

mojo.impossible=function(msg){
mojo.assert(false,msg||"impossible");
};





Class={
create:function(baseClass){
var ctor=function(){
if(this.initialize)this.initialize.apply(this,arguments);
};
if(baseClass){
ctor.prototype=new baseClass();
ctor.prototype.constructor=ctor;
}
return ctor;
}
};

Object.extend=function(dst,src,dontOverwrite){
if(!src)return dst;

for(key in src){
if(dontOverwrite&&dst[key])continue;
dst[key]=src[key];
}
return dst;
};

mojo.Extensions={
Function:{
lbind:function(me){
if(!me)mojo.log.error('missing required "this" argument');

var fn=this;
return function(){
return fn.apply(me,arguments);
}
}
},

String:{
lappend:function(str){
return this+' '+str;
},

compose:function(optionalId){
var t=mojo.template.create(this,optionalId);
return t.compose();
},

lcontains:function(str){
return this.indexOf(str)!=-1;
},

ldecodeSlashes:function(){
var foo=this;
foo=foo.replace(/%2F/gi,'/');
return foo;
},

lendsWith:function(str){
var index=this.lastIndexOf(str);
if(index==-1)return false;

return index==(this.length-str.length);
},





lequalizeFromHash:function(){


try{
var foo=encodeURI(decodeURIComponent(this));
}catch(err){

var foo=encodeURI(unescape(this));
}
foo=foo.replace(/&/g,'%26');
return foo;
},






lescape:function(){
return window.escape(this).replace(/\//g,"%252F");
},



lescapeForHash:function(withSlashes){
var foo=this;




foo=foo.replace(/\%/g,'%25');

foo=encodeURI(decodeURI(foo));
if(withSlashes){
foo=foo.replace(/\//g,'%2F');
foo=foo.replace(/\%2f/gi,"%252F");
}
foo=foo.replace(/&/g,'%26');
foo=foo.replace(/#/g,'%23');
foo=foo.replace(/\?/g,'%3F');

return foo;
},



lescapeForPlugin:function(){
return this.replace(/[\\.\s]+$/,'');
},

lescapeForLeah:function(){
return this.replace(/\"/g,'\\\"');
},


lescapeHTML:function(includeWhiteSpace){
var s=this;
s=s.replace(/\&/g,'&amp;');
s=s.replace(/\xA0/g,'&nbsp;');
s=s.replace(/\>/g,'&gt;');
s=s.replace(/\</g,'&lt;');
s=s.replace(/\"/g,'&quot;');

if(includeWhiteSpace){
s=s.replace(/\r\n/g,'<br>');
s=s.replace(/\n/g,'<br>');
s=s.replace(/  /g,' &nbsp;');
s=s.replace(/&nbsp; /g,'&nbsp;&nbsp;');
}

return s;
},

lescapeHTMLAttrQuotes:function(){
var s=this;
s=s.replace(/'/g,"&#39;");
s=s.replace(/"/g,"&#34;");
return s;
},

lescapePath:function(){
return encodeURIComponent(this.replace(/( |\/|%|\?)+/g,'_'));
},

lescapeQuotes:function(includeSlash){
var s=this;
if(!s)return'';



if(includeSlash){

s=s.replace(/\n/g,' ');
s=s.replace(/\r/g,' ');
}
s=s.replace(/(")/g,'\\$1');
s=s.replace(/(')/g,'\\$1');

return s;
},

lescapeQuotesForHref:function(){
return this.lescapeQuotes().replace(/"/g,"&quot;");
},

lescapeRegExp:function(){
var s=this;
var specials=['/','.','*','+','?','|','(',')','[',']','{','}','\\'];
var sRE=new RegExp('(\\'+specials.join('|\\')+')','g');
return s.replace(sRE,'\\$1');
},

lescapeWhiteSpace:function(useP){
var s=this;
var white=useP?'<p>':'<br>';
s=s.replace(/\r\n/g,white);
s=s.replace(/\n/g,white);
s=s.replace(/  /g,' &nbsp;');
s=s.replace(/&nbsp; /g,'&nbsp;&nbsp;');

return s;
},

lisEmpty:function(){
return this.length==0;
},

lremove:function(str){
return this.replace(str,'');
},

lspacesForUnderbars:function(includePlus){
var s=this;
s=s.replace(/_/g,' ');
if(includePlus){
s=s.replace(/\+/g,' ');
}
return s;
},

lstartsWith:function(str){
return this.indexOf(str)==0;
},

lstartsWithVowel:function(){
return this.match(/^[aeiou]/i)!=null;
},

lstripTags:function(){
return this.replace(/<\/?[^>]+>/gi,'');
},

ltoCamelCase:function(){
var arr=[];
this.ltrim().split(/\W+/).leach(function(word){
arr.push(word.toLowerCase().ltoFirstUpperCase());
});
return arr.join('').ltoFirstLowerCase();
},

lfromCamelCase:function(){
return this.replace(/([A-Z])/g,' $1').ltrim();
},

ltoFirstUpperCase:function(){
return this.substring(0,1).toUpperCase()+this.substring(1);
},

ltoFirstLowerCase:function(){
return this.substring(0,1).toLowerCase()+this.substring(1);
},

ltrim:function(){
var str=this.replace(/^\s+/,'');

return str.replace(/\s+$/,'');
},

ltruncate:function(max,onWordBoundary){
var sep='...';

var retval=this.substring(0,this.length);
if(this.length>max){
if(onWordBoundary){
retval=this.substring(0,max);
retval=retval.substring(0,retval.lastIndexOf(" "))+sep;
}else{
retval=this.substring(0,max)+sep;
}
}
return retval;
},


lunderbarsForSpaces:function(){
var s=this;
s=s.replace(/%20/g,"_");
s=s.replace(/ /g,"_");
return s;
},

lunescape:function(){
return window.unescape(this).replace(/%2F/g,"/");
},

lunescapeForHash:function(){
var foo=decodeURIComponent(this);
foo=foo.replace(/%2F/gi,'/');
foo=foo.replace(/%26/g,'&');
return foo;
},

lunescapeHTML:function(){
var div=document.createElement('div');
div.innerHTML=this.lstripTags();
return div.childNodes[0]?div.childNodes[0].nodeValue:'';
}

},

Array:{

ladd:function(obj){
this[this.length]=obj;
return this;
},

laddAll:function(arr){
for(var i=0;i<arr.length;i++){
this.push(arr[i]);
}
return this;
},

lall:function(f){
for(var i=0;i<this.length;i++){
var x=f(this[i]);
if(!x)
return x;
}
return true;
},

lclone:function(){
var newArr=[];
for(var i=0;i<this.length;++i){
newArr[i]=this[i];
}
return newArr;
},

lcontains:function(obj){
for(var i=0;i<this.length;i++){
if(this[i]==obj)return true;
}
return false;
},

lcontainsAttr:function(key,val){
for(var i=0;i<this.length;i++){
if(this[i][key]==val)return true;
}
return false;
},

leach:function(iterator){
var len=this.length;
for(var i=0;i<len;i++)
iterator(this[i],i,i==(len-1));
},

leachFrom:function(fromIndex,stopCount,iterator){
var len=this.length;
var max=len;
if(mojo.isDefined(stopCount)){
max=Math.min(stopCount,len);
}
for(var i=fromIndex;i<max;i++){
iterator(this[i],i,i==(max-1));
}
},

leachBreak:function(iterator){
for(var i=0;i<this.length;i++)
if(iterator(this[i],i))return true;
return false;
},

lfill:function(arr,index){
if(arr==null)return this;

for(var i=0;i<arr.length;++i){
if(!mojo.isDefined(index)){
this.push(arr[i]);
}else{
this.linsertAt(arr[i],index++);
}
}
return this;
},

lfindIf:function(key,val,isNot,retOnlyFirst){
var arr=[];
for(var i=0;i<this.length;i++){
var currVal=this[i][key];
if(isNot){
if(mojo.isDefined(currVal)&&currVal!=val){
arr.push(this[i]);
}
}else{




if(currVal==val||(!currVal&&(val==false))){
arr.push(this[i]);
}
}
}

if(!retOnlyFirst){
return arr;
}else{
return arr.length>=1?arr[0]:null;
}
},

lfindIfSparse:function(key,val,isNot,retOnlyFirst){
var arr=[];
for(var i=0;i<this.length;i++){
if(this[i]==null)continue;
var currVal=this[i][key];
if(isNot){
if(mojo.isDefined(currVal)&&currVal!=val){
arr.push(this[i]);
}
}else{




if(currVal==val||(!currVal&&(val==false))){
arr.push(this[i]);
}
}
}

if(!retOnlyFirst){
return arr;
}else{
return arr.length>=1?arr[0]:null;
}
},

lfindIfWithSubKey:function(key,subKey,val){
var arr=[];
for(var i=0;i<this.length;i++){
if(this[i][key]){
var currVal=this[i][key][subKey];

if(currVal==val||(!currVal&&(val==false))){
arr.push(this[i]);
}
}
}

return arr;
},

lfindIfNot:function(key,val){
return this.lfindIf(key,val,true);
},

lfindIndexIf:function(key,val){
for(var i=0;i<this.length;i++){
var currVal=this[i][key];




if(currVal==val||(!currVal&&(val==false))){
return i;
}
}

return-1;
},

lfindObject:function(key,val,subKey){
for(var i=0;i<this.length;i++){
var currVal=this[i][key];
if(!subKey){
if(currVal==val){
break;
}
}else if(currVal){

currVal=currVal[subKey];
if(currVal==val){
break;
}
}
}
return this[i];
},

lfindObjectWithSubKey:function(key,subKey,val){
return this.lfindObject(key,val,subKey);
},

lfirst:function(){
return this[0];
},

lgrep:function(f){
var l=[];
for(var i=0;i<this.length;i++){
var x=f(this[i]);
if(x)l.push(this[i]);
}
return l;
},

linsertAt:function(anObject,anIndex){
this.splice(anIndex,0,anObject);
},

linvoke:function(fnName,arg1,arg2,arg3){
this.linvokeBreak(fnName,arg1,arg2,arg3);
},

linvokeBreak:function(fnName,arg1,arg2,arg3){
var retval=null;
for(var i=0;i<this.length;i++){
var item=this[i];
if(item[fnName]){
retval=item[fnName](arg1,arg2,arg3);
if(retval)break;
}
};
return retval;
},

lisEmpty:function(){
return this.length==0;
},

llast:function(){
return this[this.length-1];
},

lmap:function(f){
var l=[];
for(var i=0;i<this.length;i++)
l.push(f(this[i]));
return l;
},

lmapReturn:function(f,startVal){
var retval=startVal;
for(var i=0;i<this.length;i++)
retval=f(this[i],retval);
return retval;
},

lpluck:function(key,defVal){
var hasDef=mojo.isDefined(defVal);
var arr=[];
for(var i=0;i<this.length;i++){
var val=this[i][key];
if(val!=null){
arr.push(val);
}else if(hasDef){
arr.push(defVal);
}
}
return arr;
},

lrandomIndex:function(){
if(this.length<1){
return null;
}
var randNum=Math.random();
return Math.floor(randNum*this.length);
},

lremove:function(obj){
for(var i=this.length-1;i>=0;i--){
if(this[i]==obj){
return this.lremoveAt(i);
}
}
},

lremoveAt:function(idx){
var obj=this.splice(idx,1);
return obj[0];
},

lremoveIf:function(key,val,state){
var obj=null;
if(!state)state={};
state.removedCount=0;
for(var i=this.length-1;i>=0;i--){
if(this[i][key]==val){
obj=this[i];
this.lremoveAt(i);
state.removedCount++;
}
}

return obj;
},

lsortNumeric:function(){
this.sort(function(a,b){return a-b;});
return this;
},

ltruncate:function(count,clone){
if(this.length<=count)return this;
if(clone){
this.slice(0,count);
return this;
}else{
this.length=count;
return this;
}
}
},

Date:{






















lformat:function(aFormat){
if(!aFormat)aFormat="%b %d";

var date=this;
var v=aFormat;
v=v.replace(/%H/g,date._getHours(true,true));
v=v.replace(/%I/g,date._getHours(true));
v=v.replace(/%k/g,date._getHours(false,true));
v=v.replace(/%l/g,date._getHours(false));
v=v.replace(/%M/g,date._getMinutes());
v=v.replace(/%p/g,date._getAmPm(false));
v=v.replace(/%P/g,date._getAmPm(true));
v=v.replace(/%S/g,date._getSeconds());
v=v.replace(/%a/g,date._getShortDayName());
v=v.replace(/%ua/g,date._getUTCShortDayName());
v=v.replace(/%A/g,date._getDayName());
v=v.replace(/%b/g,date._getShortMonthName());
v=v.replace(/%ub/g,date._getUTCShortMonthName());
v=v.replace(/%B/g,date._getMonthName());
v=v.replace(/%d/g,date._getDate(true));
v=v.replace(/%ud/g,date._getUTCDate(true));
v=v.replace(/%e/g,date._getDate(false));
v=v.replace(/%m/g,date._getMonth(true));
v=v.replace(/%n/g,date._getMonth(false));
v=v.replace(/%un/g,date._getUTCMonth(false));
v=v.replace(/%y/g,date._yearString());
v=v.replace(/%Y/g,date.getFullYear());
v=v.replace(/%uY/g,date.getUTCFullYear());
v=v.replace(/%%/g,'%');

return v;
},

lgetUTCWeekOfYear:function(){
var onejan=new Date(this.getFullYear(),0,1);
return Math.ceil((((this-onejan)/86400000)+onejan.getDay())/7);
},


lgetDaysAgoLabel:function(todayLabel,daysOnly,shortMonth,customFormat){
var rightNow=new Date();
var todaysDate=this._getCurrentDate();

if(!todayLabel)todayLabel='Today';

var thisWeek=new Date();

thisWeek.setDate(todaysDate.getDate()-5);

var dayLabel='';
if(this._isToday()){
if(daysOnly){
dayLabel=todayLabel?todayLabel:'Today';
}else{
var secondsAgo=Math.ceil(rightNow.getTime()/1000)-Math.ceil(this.getTime()/1000);
if(secondsAgo<1){
dayLabel="right now";
}else if(secondsAgo<60){
if(secondsAgo==1){
dayLabel="1 second ago";
}else{
dayLabel=secondsAgo+" seconds ago";
}
}else if(secondsAgo<3600){
var minutesAgo=Math.ceil(secondsAgo/60);
if(minutesAgo==1){
dayLabel="1 minute ago";
}else{
dayLabel=minutesAgo+" minutes ago";
}
}else if(secondsAgo<(3600*12)){
var hoursAgo=Math.ceil(secondsAgo/3600);
if(hoursAgo==1){
dayLabel="1 hour ago";
}else{
dayLabel=hoursAgo+" hours ago";
}
}else{
dayLabel=todayLabel;
}
}
}else if(this._isYesterday()){
dayLabel='Yesterday';
}else if(this>=thisWeek){
var daysAgo=rightNow.getDate()-this.getDate();
if(daysAgo<0)daysAgo+=Date.DAYS_PER_MONTH[this.getMonth()];
dayLabel=daysAgo+' days ago';
}else{
if(customFormat){
dayLabel=this.lformat(customFormat);
}else if(shortMonth){
if(this._isThisYear()){
dayLabel=this.lformat('%b %e');
}else{
dayLabel=this.lformat('%b %e, %Y');
}
}else{
if(this._isThisYear()){
dayLabel=this.lformat('%B %e');
}else{
dayLabel=this.lformat('%B %e, %Y');
}
}
}

return dayLabel;
},



lgetDaysAgoLabelSimple:function(){
var todaysDate=this._getCurrentDate();
var dayLabel='';

var thisWeek=new Date();
thisWeek.setDate(todaysDate.getDate()-4);


var includeTime=true;
if(this._isToday(todaysDate)){
dayLabel='Today';
}else if(this._isYesterday(todaysDate)){
dayLabel='Yesterday';
}else if(this>=thisWeek){
dayLabel=this.lformat('%b %e');
}else{
includeTime=false;
if(this._isThisYear()){
dayLabel=this.lformat('%b %e');
}else{
dayLabel=this.lformat('%b %e, %Y');
}
}
var fmt=dayLabel;
if(includeTime){
fmt+=' at %l:%M %p';
}
return this.lformat(fmt);
},





_getCurrentDate:function(){
var todaysDate=new Date();
todaysDate.setHours(0,0,0,0);

return todaysDate;
},







_isThisYear:function(todaysDateUtil){
if(!todaysDateUtil)todaysDateUtil=this._getCurrentDate();
return this.getYear()==todaysDateUtil.getYear();
},







_isToday:function(todaysDateUtil){
if(!todaysDateUtil)todaysDateUtil=this._getCurrentDate();

return this.getDate()==todaysDateUtil.getDate()
&&this.getMonth()==todaysDateUtil.getMonth()
&&this.getYear()==todaysDateUtil.getYear();
},




isSameDay:function(otherDate){
return this.getDate()==otherDate.getDate()
&&this.getMonth()==otherDate.getMonth()
&&this.getYear()==otherDate.getYear();
},







_isYesterday:function(todaysDateUtil){
if(!todaysDateUtil)todaysDateUtil=this._getCurrentDate();


if(this.getMonth()==todaysDateUtil.getMonth()
&&todaysDateUtil.getDate()-this.getDate()==1
&&this.getYear()==todaysDateUtil.getYear()){
return true;
}


return todaysDateUtil.getDate()-this.getDate()==Date.DAYS_PER_MONTH[this.getMonth()];

},

_toStringSimple:function(){
return this.lformat("%l:%m %p, %b %d %y");
},

_yearString:function(){
var myVal=this.getFullYear()%100;
return Date._pad(myVal,true);
},

_getMonth:function(pad){
var myVal=this.getMonth()+1;
return Date._pad(myVal,pad);
},

_getUTCMonth:function(pad){
var myVal=this.getUTCMonth()+1;
return Date._pad(myVal,pad);
},

_getMonthName:function(){
return Date.MONTHS[this.getMonth()];
},

_getShortMonthName:function(){
return Date.ABBR_MONTHS[this.getMonth()];
},

_getUTCShortMonthName:function(){
return Date.ABBR_MONTHS[this.getUTCMonth()];
},

_getDate:function(pad){
var myVal=this.getDate();
return Date._pad(myVal,pad);
},

_getUTCDate:function(pad){
var myVal=this.getUTCDate();
return Date._pad(myVal,pad);
},

_getDayName:function(){
return Date.DAYS[this.getDay()];
},

_getShortDayName:function(){
return Date.ABBR_DAYS[this.getDay()];
},

_getUTCShortDayName:function(){
return Date.ABBR_DAYS[this.getUTCDay()];
},

_getAmPm:function(isUpper){
var myHour=this.getHours();
return(myHour<12)?(isUpper?'AM':'am')
:(isUpper?'PM':'pm');
},

_getHours:function(pad,isMilitary){
var myVal=this.getHours();
if(!isMilitary){
myVal%=12;
if(myVal==0)myVal=12;
}
return Date._pad(myVal,pad);
},

_getMinutes:function(){
var myVal=this.getMinutes();
return Date._pad(myVal,true);
},

_getSeconds:function(){
var myVal=this.getSeconds();
return Date._pad(myVal,true);
}
}
};

Object.extend(Function.prototype,mojo.Extensions.Function);
Object.extend(String.prototype,mojo.Extensions.String);
Object.extend(Array.prototype,mojo.Extensions.Array);
Object.extend(Date.prototype,mojo.Extensions.Date);

Date.MONTHS=[
'January','February','March','April',
'May','June','July','August',
'September','October','November','December'
];

Date.ABBR_MONTHS=[
'Jan','Feb','Mar','Apr',
'May','Jun','Jul','Aug',
'Sep','Oct','Nov','Dec'
];

Date.DAYS=[
'Sunday','Monday','Tuesday','Wednesday',
'Thursday','Friday','Saturday'
];

Date.ABBR_DAYS=['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];


Date._pad=function(num,doPad){
return doPad&&(num<10)?'0'+num:num;
}

Date.DAYS_PER_MONTH={
0:31,
1:29,
2:31,
3:30,
4:31,
5:30,
6:31,
7:31,
8:30,
9:31,
10:30,
11:31
};

Date.isValidDayOfMonth=function(mm,dd){
var max=this.DAYS_PER_MONTH[mm];
return dd>0&&dd<=max;
};









$=function(idOrElem){
return mojo.elem(idOrElem);
};


$F=function(idOrElem,skipTrim){
return mojo.form.getValue(idOrElem,skipTrim);
};


$B=function(idOrElem,relToElem){
return mojo.geometry.getBounds(idOrElem,relToElem);
};


$T=function(tmpl,divId){
return mojo.template.create(tmpl,divId);
};


$TC=function(tmpl,divId){
return mojo.template.create(tmpl,divId).compose();
};


$S=function(idOrElem,content){
return mojo.setContent(idOrElem,content);
};


$D=function(idOrElem,shouldDisplay,type){
if(!mojo.isDefined(shouldDisplay)){
shouldDisplay=true;
}
return mojo.css.display(idOrElem,shouldDisplay,type);
};


$AC=function(idOrElem,cls){
var elem=$(idOrElem);
elem.className=elem.className.lappend(cls);
};


$DC=function(idOrElem,cls){
var elem=$(idOrElem);
elem.className=elem.className.lremove(cls);
};

mojo.elem=function(idOrElem){
return typeof(idOrElem)=='string'?document.getElementById(idOrElem)
:idOrElem;
};

mojo.isDefined=function(a){
return(typeof(a)!='undefined'&&a!=null);
};
mojo.isUndefined=function(a){
return(typeof(a)=='undefined');
};

mojo.isArray=function(a){
return mojo.isInstance(a,Array);
};
mojo.isDate=function(a){
return mojo.isInstance(a,Date);
};

mojo.isString=function(a){
return(typeof(a)=='string');
};
mojo.isBoolean=function(a){
return(typeof(a)=='boolean');
};
mojo.isObject=function(a){
return(typeof(a)=='object');
};
mojo.isFunction=function(a){
return(typeof(a)=='function');
};
mojo.isInstance=function(a,aClass){
return(a&&a.constructor&&(a.constructor===aClass));
};
mojo.isTemplate=function(t){
return mojo.isInstance(t,MojoTemplate);
};




mojo.focus=function(id){
var el=$(id);
if(el&&el.focus)el.focus();
};

mojo.evalJson=function(str,evalErrorObj){
if(!mojo.isDefined(str))str='null';
var jsRes=null;
var jsResAsText="mojo._tmpResponse = "+str.ltrim()+";";
try{
window.eval(jsResAsText);
jsRes=mojo._tmpResponse;
mojo._tmpResponse=null;
}catch(e){
mojo.log.error('evalJson failed: '+e);
if(evalErrorObj){



evalErrorObj.failed=true;
}
}

return jsRes;
};




mojo.setContent=function(idOrElem,html,show){

var elem=$(idOrElem);
if(elem){
elem.innerHTML=html;
}else{
mojo.log.error('mojo.setContent called with an invalid id: '+idOrElem);
}
if(show)
mojo.css.show(elem);
};

mojo.isEmpty=function(strOrObj){
if(strOrObj==null)return true;
if(mojo.isString(strOrObj)){
return strOrObj=='';
}
if(mojo.isArray(strOrObj))return strOrObj.lisEmpty();
if(mojo.isObject(strOrObj)){
for(var i in strOrObj){
return false;
}
return true;
}else{
return false;
}
};

mojo.util={
isEmpty:function(obj){
return mojo.isEmpty(obj);
},

keys:function(obj){
var arr=[];
for(var k in obj)arr.push(k);

return arr;
},

values:function(obj){
var arr=[];
for(var k in obj)arr.push(obj[k]);
return arr;
},


clone:function(src){
return Object.extend({},src);
},

cloneDeep:function(src){
if(src==null){
return null;
}else if(mojo.isArray(src)){
var newArr=[];
for(var i=0;i<src.length;++i){
newArr[i]=mojo.util.cloneDeep(src[i]);
}
return newArr;
}else if(mojo.isObject(src)){
var o={};
for(var key in src){
o[key]=mojo.util.cloneDeep(src[key]);
}
return o;
}else{

return src;
}
},

randomZeroOrOne:function(){
var randNum=Math.random();
return Math.floor(randNum*2);
},

addCommasToNumber:function(num){
return num.toString().replace(/\d(?=(?:\d\d\d)+(?!\d))/g,"$&,");
},

formatNumber:function(num){
return this.addCommasToNumber(num);
},

formatBigNumber:function(num,threshold){
if(!mojo.isDefined(threshold))threshold=11000;
if(num>=0&&num<threshold){
return this.addCommasToNumber(num);
}else{
var n=new Number(num);
var formattedNum='';
if(num>=1000000){
formattedNum=n.toFixed(6).toString().slice(0,2);
formattedNum+='m';
}else if(num>=100000){
formattedNum=n.toFixed(5).toString().slice(0,3);
formattedNum+='k';
}else{
formattedNum=n.toFixed(4).toString().slice(0,2);
formattedNum+='k';
}
return formattedNum;
}
},

button:function(btnId){
return{
enable:function(){
var input=$(btnId);
input.disabled=false;
input.className=input.className.replace('disabledButton','');
},

disable:function(){
var input=$(btnId);
input.disabled=true;
input.className+=' disabledButton';
}
}
},

buttonAnchor:function(btnId,cancelBtnId){
return{
enable:function(){
var input=$(btnId);
input.onclick=input.__origOnClick;
input.__origOnClick=null;
input.className=input.className.replace('disabledAnchorButton','');
if(cancelBtnId){
input=$(cancelBtnId);
input.onclick=input.__origOnClick;
input.__origOnClick=null;
input.className=input.className.replace('disabledAnchorButton','');
}
},

disable:function(){
var input=$(btnId);
input.__origOnClick=input.onclick;
input.onclick=null;
input.className+=' disabledAnchorButton';

if(cancelBtnId){
input=$(cancelBtnId);
input.__origOnClick=input.onclick;
input.onclick=null;
input.className+=' disabledAnchorButton';
}
}
}
},


formatPrice:function(priceInCents){
return(priceInCents/100).toFixed(2);
},
formatPriceDouble:function(priceInDouble){
return this.formatPrice(priceInDouble*100);
},

secondsToTime:function(seconds,noPad){
var pad=noPad?'':'0';
var time="";
var days=Math.floor(seconds/86400);
days=(days<10)?pad+days:days;
seconds=(days>0)?seconds-(days*86400):seconds;
var hours=Math.floor(seconds/3600);
if(hours>0){
hours=(hours<10)?pad+hours:hours;
seconds=(hours>0)?seconds-(hours*3600):seconds;
hours+=":";
}else{
hours="";
}
var mins=Math.floor(seconds/60);
if(parseInt(hours)>0){
mins=(mins<10)?'0'+mins:mins;
}else{
mins=(mins<10)?pad+mins:mins;
}
seconds=(mins>0)?seconds-(mins*60):seconds;
seconds=(seconds<10)?'0'+seconds:seconds;
time+=hours+mins+":"+seconds;
return time;
},

getNumDigits:function(number){
if(number/10<1){
return 1;
}else if(number/100<1){
return 2;
}else if(number/1000<1){
return 3;
}else{
return 4;
}
},










validate:function(p){
var val=p.overrideValue||$F(p.fieldId);
var hasDefault=p.origValue!=null;

if(hasDefault&&val==p.origValue){
val='';
}

if(p.isRequired&&val.lisEmpty()){
p.errMsg=p.fieldName+' is required';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}

if(!val){
return;
}

switch(p.type){
case'address':
if(val.length<1){
p.errMsg='Address too short';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'city':
if(val.length<1){
p.errMsg='City name required';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'creditcardMonth':
var date=new Date();
if(parseInt(val)<date.getMonth()+1){
p.errMsg='Month is in the past';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'creditcardYear':
var date=new Date();
if(parseInt(val)<date.getFullYear()){
p.errMsg='Year is in the past';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'creditcard':
var digits=mojo.util.cleanCreditCard(val);
if(digits.length<15){
p.errMsg='Credit card number is invalid';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}

var nCheck=0;
var nDigit=0;
var bEven=false;
var valid=false;

for(var n=digits.length-1;n>=0;n--){
var cDigit=digits.charAt(n);
nDigit=parseInt(cDigit,10);
if(bEven){
if((nDigit*=2)>9){
nDigit-=9;
}
}
nCheck+=nDigit;
bEven=!bEven;
}
valid=(nCheck%10)==0;
if(!valid){
p.errMsg='Credit card number is invalid';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}

break;
case'email':

var emailRegEx=/^[a-zA-Z0-9]([a-zA-Z0-9_\.\-+]*[a-zA-Z0-9_])*\@([a-zA-Z0-9](([a-zA-Z0-9\-])*[a-zA-Z0-9])*\.)+[a-zA-Z0-9]{2,4}$/;
if(!val.match(emailRegEx)){
p.errMsg='Invalid email address';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'name':
if(val.match(/[^-. '0-9A-Za-z_]/)){
p.errMsg=p.fieldName+' contains invalid characters.'
+'\n\nLetters, numbers, spaces and the '
+'characters . - \' are valid.';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'password':
if(val.length<6){
p.errMsg=p.fieldName
+' must be a minimum of 6 characters';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
if($('confirm'+p.fieldId)){

var cval=$F('confirm'+p.fieldId);
if(val!=cval){
p.errMsg='Your passwords don\'t match';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
}
break;
case'state':
if(val.index<1){
p.errMsg='Please choose your state';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'zip':
var digits=val.replace(/[^0-9]/g,"");
if(digits.length<5){
p.errMsg='Zip code invalid';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'text':
var textVal=val;
if(p.overrideTextVal){
textVal=p.overrideTextVal;
}
if(textVal.length>p.maxLength){
p.errMsg='Too many characters';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
case'price':
var price=parseFloat(val);
if(price){
price=(price+'').replace(/[^0-9.]/g,'');
}
if(p.overrideTextVal){
price=p.overrideTextVal;
}
if(!price||price<0){
p.errMsg='Invalid price. Use format: 1.23';
mojo.util.highlightErrorField(p.fieldId);
throw p;
}
break;
};

mojo.util.resetErrorField(p.fieldId);
},

highlightErrorField:function(id){
$(id).style.backgroundColor="#FFCCCC";
mojo.focus(id);
},

resetErrorField:function(id){
$(id).style.backgroundColor="";
},

cleanCreditCard:function(ccNum){
return ccNum.replace(/[^0-9]/g,"");
},

insertAtCursor:function(idOrElem,insertText){
var elem=$(idOrElem);

if(document.selection){
elem.focus();
sel=document.selection.createRange();
sel.text=insertText;
}

else if(elem.selectionStart||elem.selectionStart=='0'){
var startPos=elem.selectionStart;
var endPos=elem.selectionEnd;
var cursorPos=endPos;
elem.value=elem.value.substring(0,startPos)
+insertText
+elem.value.substring(endPos,elem.value.length);
cursorPos=startPos+insertText.length;
elem.selectionStart=cursorPos;
elem.selectionEnd=cursorPos;
}else{
elem.value+=insertText;
}
},

htmlToText:function(htmlString){
var tmpNode=document.createElement('DIV');
tmpNode.innerHTML=htmlString;
if(mojo.SAFARI){
tmpNode.style.position='absolute';
tmpNode.style.width='200px';
tmpNode.style.top='-5000px';
tmpNode.style.left='-5000px';
tmpNode.id='tmpNode'+mojo.idGenerator++;
document.body.appendChild(tmpNode);
var idToGrab=tmpNode.id;
return $(idToGrab).innerText;
}else{

return tmpNode.innerText?tmpNode.innerText:tmpNode.textContent;
}
},




isWindowAccessible:function(win){
try{
return((typeof(win.name)=='string')&&
(typeof(win.document)!='undefined')&&!win.closed);
}catch(e){

}
return false;
},

hideSelects:function(){
var selects=document.getElementsByTagName('SELECT');
for(var i=0;i<selects.length;i++){
if(!selects[i].className.match('selectWhitelist')){
mojo.css.hide(selects[i]);
}
};
},

showSelects:function(){
var selects=document.getElementsByTagName('SELECT');
for(var i=0;i<selects.length;i++){
mojo.css.show(selects[i]);
};
}
};

mojo.css={
hide:function(idOrElem,andClear,failSafe){
var e=$(idOrElem);
if(e){
e.style.visibility='hidden';
if(andClear){
e.innerHTML='';
}
}else if(!failSafe){


mojo.log.error('missing hide elem: '+idOrElem);
}
},

show:function(idOrElem){
var e=$(idOrElem);
if(!e)mojo.log.error('missing '+idOrElem);
e.style.visibility='visible';
},

setOpacity:function(id,opacity){
var s=$(id).style;
s.opacity=opacity/1;
s.MozOpacity=opacity/1;
s.KhtmlOpacity=opacity/1;
s.filter="alpha(opacity="+(opacity*100)+")";

},

display:function(idOrElem,display,type){
if(!type||(type=='table-cell'&&mojo.IE67))type='block';
var elem=$(idOrElem);
if(!elem){
mojo.log.error('missing elem: '+idOrElem);
}
if(!mojo.IE67&&elem.tagName=='TR')type='table-row';
if(mojo.IE67&&elem.tagName=='TR'){
if(elem.cells){

for(var i=0;i<elem.cells.length;i++){
var node=elem.cells[i];
if(node.tagName=='TD'){
node.style.display=display
?'block':'none';
}
}
}
}
$(idOrElem).style.display=display?type:'none';
},

replaceClass:function(id,oldClass,newClass){
var elem=$(id);
elem.className=elem.className.replace(oldClass,newClass);
},

toggleDisplay:function(idOrElem,type){
var e=$(idOrElem);
var display=mojo.css.getComputedStyle(e,'display');
mojo.css.display(e,display=='none',type);
return e.style.display!='none';
},

containsClass:function(idOrElem,className){
return mojo.css.getClasses(idOrElem).lcontains(className);
},

getClasses:function(idOrElem){
var e=$(idOrElem);
return e.className.split(/\s+/);
},

getComputedStyle:function(idOrElem,styleProp,asInt){
var elem=$(idOrElem);

var y=null;
if(elem!=null){
if(elem.currentStyle){
y=elem.currentStyle[styleProp];
}else if(window.getComputedStyle){
var cstyle=document.defaultView.getComputedStyle(elem,null);
y=cstyle.getPropertyValue(styleProp);
}else{
y=elem.style[styleProp];
}
}

if(y==null)return null
else return asInt?parseInt(y):y;
},

testComputedStyle:function(idOrElem,styleProp,val){
return mojo.css.getComputedStyle(idOrElem,styleProp)==val;
},

visibility:function(idOrElem,show){
if(show)mojo.css.show(idOrElem)
else mojo.css.hide(idOrElem);
},

isDisplayed:function(e){
return $(e)&&mojo.css.getComputedStyle(e,'display')!='none';
},

isVisible:function(e){
return mojo.css.getComputedStyle(e,'visibility')!='hidden';
},

displayToggle:function(arr,type){
if(!type)type='block';
for(var i=0;i<arr.length;i++){
var e=arr[i];
var elem=$(e);
mojo.assert(elem,'missing elem in displayToggle: '+e);
elem.style.display=i==0?type:'none';
}
},

addClass:function(idOrElem,className){
var e=$(idOrElem);
e.className+=' '+className;
},

removeClass:function(idOrElem,className){
var e=$(idOrElem);
e.className=e.className.split(/\s+/).lgrep(function(val){
if(val!=className)return true;
}).join(' ');
}
};

mojo.dom={
setEventListener:function(elm,evt,listener){
elm=$(elm);
var ticket=mojo.baggage.check(listener);
elm[evt]=mojo.dom._createClaimTicketClosure(ticket);
},

addEventListener:function(source,eventName,listener){
source=$(source);
var nm=eventName.replace(/on/,"");
if(mojo.IE)source.attachEvent(eventName,listener);
else source.addEventListener(nm,listener,false);
},

removeEventListener:function(source,eventName,listener){
source=$(source);
var nm=eventName.replace(/on/,"");
if(mojo.IE)source.detachEvent(eventName,listener);
else source.removeEventListener(nm,listener,false);
},

scrollToBottom:function(elem){
var e=$(elem);
e.scrollTop=e.scrollHeight;
},

createDiv:function(id,className,styles,appendTo){
var div=mojo.dom.createElement('DIV',className,styles);
div.id=id;

if(appendTo){
appendTo=$(appendTo);
appendTo.appendChild(div);
}
return div;
},

createElement:function(tagName,className,styles){
var elem=document.createElement(tagName);
if(className)elem.className=className;
if(styles){
for(var key in styles){
elem.style[key]=styles[key];
}
}
document.body.appendChild(elem);
return elem;
},





getPrevSibling:function(elem){
var prev=elem.previousSibling;
while(prev.nodeType==3){
prev=prev.previousSibling;
}

return prev;
},

removeElement:function(elemOrId){
var elem=$(elemOrId);
elem.parentNode.removeChild(elem);
},

parseHTMLFragment:function(htmlStr,appendTo){
if(!mojo._dummyDiv){
mojo._dummyDiv=mojo.dom.createElement(
'DIV','htmlFragmentDiv',{'display':'none'});
}
mojo.setContent(mojo._dummyDiv,htmlStr.ltrim());
var elem=mojo._dummyDiv.firstChild;
if(elem.tagName=='TABLE'){
elem=elem.rows[0];
}

if(appendTo){
appendTo=$(appendTo);
appendTo.appendChild(elem);
}
return elem;
},

forceHTMLFragment:function(elemId,htmlStr){
var elem=$(elemId);
if(!elem){
elem=mojo.dom.parseHTMLFragment(htmlStr,document.body);
}
return elem;
},

_createClaimTicketClosure:function(ticket){
return function(evt){
var listener=mojo.baggage.claim(ticket);
var retval=true;
if(this)retval=listener.apply(this,[evt]);
else retval=listener(evt);
return retval;
};
},

getAncestorByTagName:function(elem,tagName){
var matchedElem=null;
var currElem=elem;
while(currElem){
if(currElem.tagName==tagName){
matchedElem=currElem;
break;
}
currElem=currElem.parentNode;
}
return matchedElem;
},

cloneElement:function(elem,className){
var div=$(elem);
var bounds=mojo.geometry.getBounds(div);

var clone=div.cloneNode(true);
clone.className=className;

mojo.geometry.setBounds(clone,{top:bounds.top,
left:bounds.left,
width:bounds.width,
height:bounds.height});

document.body.appendChild(clone);
return clone;
},


previousObject:function(idOrElem){
var p=$(idOrElem);
do p=p.previousSibling;
while(p&&p.nodeType!=1);
return p;
},

nextObject:function(idOrElem){
var n=$(idOrElem);
do n=n.nextSibling;
while(n&&n.nodeType!=1);
return n;
},





getElementsByClassName:function(className,tag,elm){
if(document.getElementsByClassName){
getElementsByClassName=function(className,tag,elm){
elm=elm||document;
var elements=elm.getElementsByClassName(className),
nodeName=(tag)?new RegExp("\\b"+tag+"\\b","i"):null,
returnElements=[],
current;
for(var i=0,il=elements.length;i<il;i+=1){
current=elements[i];
if(!nodeName||nodeName.test(current.nodeName)){
returnElements.push(current);
}
}
return returnElements;
};
}
else if(document.evaluate){
getElementsByClassName=function(className,tag,elm){
tag=tag||"*";
elm=elm||document;
var classes=className.split(" "),
classesToCheck="",
xhtmlNamespace="http://www.w3.org/1999/xhtml",
namespaceResolver=(document.documentElement.namespaceURI===xhtmlNamespace)?xhtmlNamespace:null,
returnElements=[],
elements,
node;
for(var j=0,jl=classes.length;j<jl;j+=1){
classesToCheck+="[contains(concat(' ', @class, ' '), ' "+classes[j]+" ')]";
}
try{
elements=document.evaluate(".//"+tag+classesToCheck,elm,namespaceResolver,0,null);
}
catch(e){
elements=document.evaluate(".//"+tag+classesToCheck,elm,null,0,null);
}
while((node=elements.iterateNext())){
returnElements.push(node);
}
return returnElements;
};
}
else{
getElementsByClassName=function(className,tag,elm){
tag=tag||"*";
elm=elm||document;
var classes=className.split(" "),
classesToCheck=[],
elements=(tag==="*"&&elm.all)?elm.all:elm.getElementsByTagName(tag),
current,
returnElements=[],
match;
for(var k=0,kl=classes.length;k<kl;k+=1){
classesToCheck.push(new RegExp("(^|\\s)"+classes[k]+"(\\s|$)"));
}
for(var l=0,ll=elements.length;l<ll;l+=1){
current=elements[l];
match=false;
for(var m=0,ml=classesToCheck.length;m<ml;m+=1){
match=classesToCheck[m].test(current.className);
if(!match){
break;
}
}
if(match){
returnElements.push(current);
}
}
return returnElements;
};
}
return getElementsByClassName(className,tag,elm);
}
};

mojo.form={








getValue:function(element,skipTrim){
var val=null;
var elem=$(element);
if(elem!=null){
var tagName=elem.tagName;
if(tagName=="TEXTAREA"||tagName=="INPUT"){
if(tagName=="INPUT"&&elem.type=="checkbox"){
val=elem.checked;
}else{
val=elem.value;
}
}else if(tagName=="SELECT"){
var i=elem.selectedIndex;
if(i>=0)val=elem.options[elem.selectedIndex].value;
}else{
mojo.log.error('unsupported element type for getValue: '
+tagName);
}

if(val!=null&&!skipTrim&&typeof(val)=='string'){
val=val.ltrim();
}
}

return val;
},

getSelectedOption:function(sel){
var elem=$(sel);
return elem.options[elem.selectedIndex];
},

selectOption:function(sel,val){
var select=$(sel);
var index=-1;
for(var i=0;i<select.options.length;i++){
var o=select.options[i];
if(o.value==val){
index=i;
o.selected=true;
break;
}
}

select.selectedIndex=index;
},

getRadioValue:function(rads){
var els=rads;
if(mojo.isString(rads))els=document.getElementsByName(rads);
var val=null;
for(i=0;i<els.length;i++){
if(els[i].checked){
val=els[i].value;
}
}
return val;
},

getFieldValue:function(fld){
return $(fld).value.ltrim();
}
};

mojo.listeners={
_pageList:{},
_globalList:{},

addGlobal:function(eventKey,listener){
mojo.listeners._add(eventKey,listener,true);
},

add:function(eventKey,listener){
mojo.listeners._add(eventKey,listener,false);
},

_add:function(eventKey,listener,isGlobal){

var list=isGlobal?mojo.listeners._globalList[eventKey]
:mojo.listeners._pageList[eventKey];
if(!list){
list=[];
if(isGlobal){
mojo.listeners._globalList[eventKey]=list;
}else{
mojo.listeners._pageList[eventKey]=list;
}
}
list.push(listener);
},

notify:function(eventKey,eventInfo){
this._sendNotification(mojo.listeners._pageList[eventKey],
eventInfo,eventKey);
this._sendNotification(mojo.listeners._globalList[eventKey],
eventInfo,eventKey);
},

_sendNotification:function(list,eventInfo,eventKey){
if(!list)return;


for(var i=0;i<list.length;i++){

if(list[i])list[i](eventInfo);




}
},

removePageListeners:function(){
mojo.listeners._pageList={};
}
};




mojo.url={







parseQueryString:function(str){
var params={};

str=str.replace(/.*\?/,'');
if(str.indexOf('=')>0){

var pairs=str.split('&');
for(var i=0;i<pairs.length;i++){
var aPair=pairs[i];
var idx=aPair.indexOf('=');
if(idx>0){

var key=aPair.substring(0,idx);
var val=aPair.substring(idx+1);
val=(val!=null
&&val!='')?decodeURIComponent(val):null;
params[key]=val;
}
}
}

return params;
},







buildQueryString:function(params,url){
var str='';

for(var key in params){
var val=params[key];
if(val==null||(mojo.isString(val)&&(val=='')))continue;
if(mojo.isArray(val)){
if(val.length==0)continue;
val=val.join(',');

}

str+='&'+key+'='+encodeURIComponent(val);
}
if(str!='')str=str.replace(/^&/,'');

if(url){
if(str!='')url+=(url.indexOf('?')==-1)?'?':'&';
str=url+str;
}
return str;
},

getHash:function(unescapeSlash,stripParams){





var str=window.location.hash.replace(/^[\/\#]/,'');

str=str.lequalizeFromHash(false);


if(unescapeSlash){
str=str.replace(/%2F/g,'/');
}
if(stripParams){
str=str.replace(/:.*$/,'');
}
return str;
},

setHash:function(val){
if(val=='')val='#';
window.location.hash=val;
},

escape:function(str){
str=encodeURIComponent(str);
return str.replace('%20','+');
}
};




mojo.baggage={
_bagsLocal:{},
_bagsGlobal:{},

check:function(obj){
var id=mojo.idGenerator++;

mojo.baggage._bagsGlobal[id]=obj;
return id;
},

checkLocal:function(obj){
var id=mojo.idGenerator++;
mojo.baggage._bagsLocal[id]=obj;
return id;
},

checkGlobal:function(obj){
var id=mojo.idGenerator++;
mojo.baggage._bagsGlobal[id]=obj;
return id;
},

claim:function(id,remove){
var bag=mojo.baggage._bagsGlobal[id];

if(remove)mojo.baggage.removeGlobal(id);
return bag;
},

claimLocal:function(id,remove){
var bag=mojo.baggage._bagsLocal[id];
if(remove)mojo.baggage.remove(id);
return bag;
},

claimGlobal:function(id,remove){
var bag=mojo.baggage._bagsGlobal[id];
if(remove)mojo.baggage.removeGlobal(id);
return bag;
},

remove:function(id){

delete mojo.baggage._bagsGlobal[id];
},

removeGlobal:function(id){
delete mojo.baggage._bagsGlobal[id];
},

removePageBaggage:function(){
mojo.baggage._bagsLocal={};
}
};






mojo.template={
_cache:{},
dateFormatString:"%n/%d/%y",
linkEvalPrefix:null,













create:function(str,destId){
if(!str){
str.foo=null;
}

if(destId==null)destId='';
var key=str;
var t=mojo.template._cache[key];
if(t==null){
t=new MojoTemplate(str,destId);
mojo.template._cache[str]=t;
}

var clonedT=t._clone();
clonedT._destId=destId;

return clonedT;
}
};

MojoTemplate=Class.create();
MojoTemplate._TOKEN_REGEX=
'@([a-zA-Z0-9_\.\\[\\]]+)@|<!-- @\\/?([a-zA-Z0-9_\.]+)@ -->|#(?:link|img|url|tooltip|help):([^\\)]+\\));?';
MojoTemplate._DIRECTIVE_EMBED_REGEX='#embed:([a-zA-Z0-9_.]+)';
MojoTemplate.prototype={
initialize:function(str,destId){
this._chunks=new Array();
this._nextIterations=new Array();
this._destId=destId;
this._emptyTokenText='';
this._tokens=new Object();
this._links=new Object();
this._blocks=new Object();
this._beans=new Object();

this._allBeanTokens=new Object();
this._overrideContent=null;


this._parent=null;
this._root=this;
this._name='__root';


if(str!=null)this._parse(str);
},

_clone:function(){
var t=new MojoTemplate();
t._chunks=this._chunks;
t._blocks=this._blocks;
t._tokens=this._tokens;
t._links=this._links;
t._destId=this._destId;
t._beans=this._beans;
t._allBeanTokens=this._allBeanTokens;
t._overrideContent=null;
this._reset();
return t;
},

setEmptyTokenText:function(value){
this._emptyTokenText=value;
return this;
},

setContent:function(html){
this._overrideContent=html;
return this;
},

containsToken:function(name){
return(typeof(this._tokens[name])!='undefined');
},





replaceToken:function(name,value){
if(typeof(value)=='boolean')value=value+'';
else{

try{
if(typeof(value)=='number')value=value+'';
}catch(e){
value=value+'';
}
}
this._tokens[name]=value;

return this;
},

removeToken:function(name){
this.replaceToken(name,null);

return this;
},

getTokenValue:function(nm){
var val=this._tokens[nm];
if(val==null&&this._parent)val=this._parent.getTokenValue(nm);
return val;
},

getDateFormat:function(){
var dfmt=this.dateFormatString;
if(dfmt==null&&this._parent)dfmt=this._parent.getDateFormat();
return dfmt;
},





replaceTokenBlock:function(name,value){
var b=this._blocks[name];
if(!b)return;

if(value===null)b._removed=true;
else b._value=value;

return this;
},

removeTokenBlock:function(name,cond){
if(arguments.length==2){

if(cond){
this.replaceTokenBlock(name,null);
}
}else{

this.replaceTokenBlock(name,null);
}
return this;
},

keepTokenBlock:function(name,keepIfCondTrue){

if(!keepIfCondTrue){
this.replaceTokenBlock(name,null);
}
return this;
},

getTokenBlock:function(name){
var retval=null;
var b=this._blocks[name];
if(b)retval=this._blocks[name];

return retval;
},

containsTokenBlock:function(name){
return this.getTokenBlock(name)!=null;
},





replaceTokensWithMap:function(map){
for(var key in map)this.replaceToken(key,map[key]);

return this;
},





replaceTokensWithBean:function(name,bean){
if(bean==null){
mojo.log.error('replaceTokensWithBean: called without a bean: '+name);
return this;
}

if(this.containsToken(name)){
var ticket=mojo.baggage.checkLocal(bean);
this.replaceToken(name,"mojo.baggage.claimLocal('"+ticket+"')");
}



var tokens=this._root._allBeanTokens[name];


if(!tokens){

return this;
}

var evalMap={};
evalMap[name]=bean;

for(var tok in tokens){
var val=null;
var escHtml=false;
var escJs=false;
var escJsHref=false;
var origTok=tok;
try{
if(tok.match(/\.toHtml$/)){
tok=tok.replace(/\.toHtml$/,'');
escHtml=true;
}else if(tok.match(/\.toJs$/)){
tok=tok.replace(/\.toJs$/,'');
escJs=true;
}else if(tok.match(/\.toJsHref$/)){
tok=tok.replace(/\.toJsHref$/,'');
escJsHref=true;
}
val=eval('evalMap.'+tok);
}catch(e){}
if(mojo.isDefined(val)){
if(escHtml){
val=val.lescapeHTML();
}else if(escJs){
val=val.lescapeQuotes();
}else if(escJsHref){
val=val.lescapeQuotesForHref();
}
this.replaceToken(origTok,val);
}
}

return this;
},






compose:function(){
var html='';

if(this._overrideContent){
html=this._overrideContent;
this._overrideContent=null;
}else if(this._nextIterations.length>0){

html=this._nextIterations.join('');
this._reset();
}else{
html=this._composeToString();
}

if(this._destId){
mojo.setContent(this._destId,html);
}

return html;
},

composeIntoDom:function(parent){
var html=this.compose();
return mojo.dom.parseHTMLFragment(html,parent);
},

next:function(appendText,beforeText){
var htm=this._composeToString(true);
if(mojo.isDefined(beforeText))this._nextIterations.push(beforeText);
this._nextIterations.push(htm);
if(mojo.isDefined(appendText))this._nextIterations.push(appendText);
return htm;
},

addNextHtmlChunk:function(htm){
this._nextIterations.push(htm);
},

_composeToString:function(skipNextIterReset){
var htmlArr=new Array(this._chunks.length);
for(var i=0;i<this._chunks.length;i++){
var currStr=null;
var chunk=this._chunks[i];
if(chunk.isToken){
currStr=this._tokens[chunk.name];
if(currStr==null&&this._parent){

currStr=this.getTokenValue(chunk.name);
}


if(currStr instanceof Date){
if(currStr.getTime()!=0){
var fm=this.getDateFormat();
if(!fm)fm=mojo.template.dateFormatString;
currStr=currStr.lformat(fm);
}else{
currStr="";
}
}


if(mojo.isEmpty(currStr)){


if(mojo.template.onUnreplacedToken){
currStr=mojo.template.onUnreplacedToken(chunk.name);
}
if(mojo.isEmpty(currStr)){
currStr=this._emptyTokenText;
}
}
}else if(chunk.isBlock){
currStr=chunk._value;

if(this._blocks[chunk._name]._removed)currStr='';
else if(currStr==null){
currStr=chunk.compose();
}
}else if(chunk.isLink){
var evalVal='';
var prefix=chunk.evalPrefix;
var evalStr=prefix+chunk.value;
if(chunk.tokenParams){
for(var ti=0;ti<chunk.tokenParams.length;ti++){
var tokenName=chunk.tokenParams[ti];
var tokenVal=this.getTokenValue(tokenName);
evalStr=
evalStr.replace(
'@'+tokenName+'@',
tokenVal?tokenVal.lescapeQuotes(true):'');
}
}
try{
evalVal=eval(evalStr);
}catch(e){
mojo.log.error("eval error for token link: "+evalStr,e);
mojo.log.obj(chunk);
}
if(!evalVal)evalVal='';
currStr=evalVal;
}else{

currStr=chunk;
}
htmlArr.push(currStr);
}
this._reset(skipNextIterReset);
return htmlArr.join('');
},

_reset:function(skipNextIterReset){
for(var t in this._tokens)this._tokens[t]=null;
for(var nm in this._blocks){
var b=this._blocks[nm];
b._value=null;
b._removed=false;
b._nextIterations=[];
for(var t in b._tokens)b._tokens[t]=null;
for(var t in b._blocks){
var nb=b._blocks[t];
nb._value=null;
nb._removed=false;
nb._nextIterations=[];
}
}
if(!skipNextIterReset)this._nextIterations=new Array();
this._overrideContent=null;
},

_parse:function(str){



var result=0;
var regex=new RegExp(MojoTemplate._DIRECTIVE_EMBED_REGEX);
var buffer=[];
var workingStr=str;

while((result=regex.exec(workingStr))!=null){
buffer.push(workingStr.substring(0,result.index));
var directive=result[0];
var templName=result[1];
var val;
try{
val=eval(templName);
buffer.push(val);
}catch(e){
mojo.log.error('cant find template: '+templName);
}
workingStr=workingStr.substring(result.index+directive.length);
}

buffer.push(workingStr);
str=buffer.join('');

result=0;
regex=new RegExp(MojoTemplate._TOKEN_REGEX);
var templateStack=new Array();
templateStack.push(this);

while((result=regex.exec(str))!=null){
var parent=templateStack[templateStack.length-1];
var cmdType=result[0];

parent._chunks.push(str.substring(0,result.index));
if(cmdType.indexOf('@')==0||cmdType.indexOf('#')==0){

if(cmdType.indexOf('@')==0){

var nm=result[1];
parent._chunks[parent._chunks.length]=
{'isToken':true,'name':nm};
this._parseToken(nm,parent);
}else{

var value=result[3];



var evalPrefix=null;
if(cmdType.match(/^#link/))evalPrefix=mojo.template.linkEvalPrefix+'link.';
else if(cmdType.match(/^#img/)){
evalPrefix=mojo.template.linkEvalPrefix+'img.';
}
else if(cmdType.match(/^#url/))evalPrefix=mojo.template.linkEvalPrefix+'url.';
else if(cmdType.match(/^#tooltip/))evalPrefix='widgets.core.Tooltip.';
else if(cmdType.match(/^#help/))evalPrefix='widgets.core.HelpBubble.';
else mojo.log.error('unsupport template command: '+cmdType);

var linkData={
isLink:true,
evalPrefix:evalPrefix,
value:value,
tokenParams:null};
parent._chunks[parent._chunks.length]=linkData;
parent._links[value]=null;
var matches=value.match(/@[\w\.]+@/g);
if(matches&&matches.length>0){
for(var ii=0;ii<matches.length;ii++){
var tokenParam=matches[ii];
var tokenParamName=
tokenParam.substring(1,tokenParam.length-1);
matches[ii]=tokenParamName;
this._parseToken(tokenParamName,parent);
}
linkData.tokenParams=matches;

}
}
}else if(cmdType.lstartsWith('<!--')){

if(!(cmdType.indexOf('<!-- @\/')==0)){

var block=new MojoTemplate();
block.isBlock=true;
block._name=result[2];
block._parent=parent;
block._root=this;
parent._chunks[parent._chunks.length]=block;
parent._blocks[block._name]=block;
templateStack.push(block);
}else{

templateStack.length--;
}
}else{
mojo.log.error("unsupport template syntax/cmd: "+cmdType);
}
str=str.substring(result.index+cmdType.length);
}
this._chunks.push(str);
},

_parseToken:function(nm,parent){
parent._tokens[nm]=null;

if(nm.match(/^([a-zA-Z0-9_]+)\./)){

var beanName=RegExp.$1;
var beanTokens=parent._beans[beanName];
if(!beanTokens){
beanTokens={};
parent._beans[beanName]=beanTokens;
}
beanTokens[nm]=nm;



beanTokens=this._allBeanTokens[beanName];
if(!beanTokens){
beanTokens={};
this._allBeanTokens[beanName]=beanTokens;
}
beanTokens[nm]=nm;
}
}
};

MojoHttpClient=Class.create();
MojoHttpClient.pageCounter=1;
MojoHttpClient.onSignIn=null;
MojoHttpClient.prototype={
initialize:function(singleReq){
this._singleReq=singleReq;
this._pendingRequest=null;
this.onResponse=null;
this.onBeforeSend=null;
},



sendOldRequest:function(url,params,onResponse,method,context){
if(!params)params={};
params.json=true;
this.sendRequest({url:url,params:params,onResponse:onResponse,
method:method,context:context,isNew:false});

},












sendRequest:function(req){
if(!req.url){
mojo.log.error('dude, I need a URL in order to send this request');
return;
}


if(this._singleReq&&this._pendingRequest)this.cancelRequest();

req.params=req.params||{};
req.isNew=mojo.isDefined(req.isNew)?req.isNew:true;
req.origUrl=req.url;

req.method=req.method||'GET';
if(lala.user&&lala.user.isUseHttpPost){
req.method='POST';
}

if(req.isGlobal||req.params.isGlobal){


req.isGlobal=true;
}

req.pageCounter=MojoHttpClient.pageCounter;

if(this.onBeforeSend){
this.onBeforeSend(req.params,req);
}

if(req.ssl
&&(window.location.protocol=='http:')
&&lala.app.isPublicWebApp){

this._sendViaIframe(req);
}else{
this._send(req);
}
},

_send:function(req){
var postBody=null;
var urlEncodedParams=mojo.url.buildQueryString(req.params);
var xmlReq=
mojo.IE?new ActiveXObject("Microsoft.XMLHTTP"):
new XMLHttpRequest();
var url=req.url;

if(req.method=='POST'){
postBody=urlEncodedParams;
}else{
if(url.indexOf('?')==-1)url+='?';
else url+='&';
url+=urlEncodedParams;
}
req.debugUrl=url;


var bag={req:req,me:this,xmlReq:xmlReq,startTime:new Date().getTime()};
var ticket=mojo.baggage.check(bag);
xmlReq.onreadystatechange=
MojoHttpClient._createResponseClosure(ticket);


if(this._singleReq)this._pendingRequest=xmlReq;




if(!url.lstartsWith('http')&&mojo.http.actionBaseUrl){
url=mojo.http.actionBaseUrl+url;
}

xmlReq.open(req.method,url,true);
if(req.method=='POST'){
xmlReq.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
}
xmlReq.send(postBody);
},

_sendViaIframe:function(req){
var bag={'req':req,'me':this,startTime:new Date().getTime()};
var ticket=mojo.baggage.check(bag);

var hiddenInputs=[];

req.params.isIframe=req.isIframe=true;
req.params.ticket=ticket;
for(var p in req.params){
var val=req.params[p];
if(val==null||(mojo.isString(val)===''))continue;
hiddenInputs.push('<input type="hidden" name="'
+p+'" value="'+val+'" />');
}


if(!req.url.lstartsWith('http')){
req.url=mojo.http.sslActionBaseUrl+req.url;
}
var form=$('pipeFrameForm');
form.innerHTML=hiddenInputs.join('');
form.action=req.url;
form.submit();
},

cancelRequest:function(){
if(!this._singleReq)return;

if(this._pendingRequest)this._pendingRequest.abort();
this._pendingRequest=null;
},

scriptTag:function(url){
var script=document.createElement('script');
script.src=url;
script.type="text/javascript";

document.getElementsByTagName('head')[0].appendChild(script);
}
};

MojoHttpClient._createResponseClosure=function(ticket){
return function(){

if(typeof(MojoHttpClient)=='undefined')return;

MojoHttpClient._processResponse(ticket);
};
};

MojoHttpClient._processResponse=function(ticket){
var b=mojo.baggage.claim(ticket);

if(b.me._singleReq&&b.me._pendingRequest==null)return;
if(b.xmlReq.readyState!=4)return;


if(b.me._singleReq)b.me._pendingRequest=null;
if(mojo.PERF&&b.startTime){
b.endTime=new Date().getTime();
mojo.log.info(b.req.origUrl+': '+(b.endTime-b.startTime)+' ms');
}




b.me.onResponse(b.req,b.xmlReq);
mojo.baggage.remove(ticket);
};

MojoHttpClient.onIframeResponse=function(ticket,dataAsStr){
if(MojoHttpClient.onSignIn){
MojoHttpClient.onSignIn(dataAsStr);
MojoHttpClient.onSignIn=null;
}
var b=mojo.baggage.claim(ticket);

if(b){
b.me.onResponse(b.req,dataAsStr);
}
mojo.baggage.remove(ticket);



$S('pipeFrameForm','');
};

mojo.http=new MojoHttpClient();
mojo.httpSingle=new MojoHttpClient(true);


mojo.geometry={



getFancyBounds:function(elem){
var newLeft=0;
var newTop=0;
var results;

elem=$(elem);
var parent=elem.parentNode;
var offsetChild=elem;
var offsetParent=elem.offsetParent;
var css=mojo.css.getComputedStyle;
var fixed=css(elem,"position")=="fixed";


if(elem.getBoundingClientRect){
var box=elem.getBoundingClientRect();


newLeft+=box.left+Math.max(document.documentElement.scrollLeft,document.body.scrollLeft);
newTop+=box.top+Math.max(document.documentElement.scrollTop,document.body.scrollTop);


newLeft+=-document.documentElement.clientLeft;
newTop+=-document.documentElement.clientTop;
}else{
newLeft+=elem.offsetLeft;
newTop+=elem.offsetTop;
while(offsetParent){
newLeft+=offsetParent.offsetLeft;
newTop+=offsetParent.offsetTop;


if(mojo.FF&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||mojo.SAFARI){
newLeft+=parseInt(mojo.css.getComputedStyle(offsetParent,'borderLeftWidth'))||0;
newTop+=parseInt(mojo.css.getComputedStyle(offsetParent,'borderTopWidth'))||0;
}

if(!fixed&&css(offsetParent,'position')=='fixed'){
fixed=true;
}


offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;

offsetParent=offsetParent.offsetParent;
}


while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){

if(!/^inline|table.*$/i.test(css(parent,"display"))){
newLeft-=parent.scrollLeft;
newTop-=parent.scrollTop;
}


if(mojo.FF&&css(parent,"overflow")!="visible"){
newLeft+=parseInt(mojo.css.getComputedStyle(parent,'borderLeftWidth'))||0;
newTop+=parseInt(mojo.css.getComputedStyle(parent,'borderTopWidth'))||0;
}


parent=parent.parentNode;
}


if(mojo.FF&&css(offsetChild,"position")!="absolute"){
newLeft-=document.body.offsetLeft;
newTop-=document.body.offsetTop;
}


if(fixed){
newLeft+=Math.max(document.documentElement.scrollLeft,document.body.scrollLeft);
newTop+=Math.max(document.documentElement.scrollTop,document.body.scrollTop);
}
}


results={top:(newTop),left:(newLeft)};
return results;
},










getBounds:function(idOrElem,relToContainer,doScrollTop){
var elem=$(idOrElem);
if(!elem)return;

relToContainer=relToContainer?$(relToContainer):null;

var b={};
b.top=0;
b.left=0;
b.width=elem.offsetWidth;
b.height=elem.offsetHeight;




if(mojo.SAFARI&&elem.tagName=='TR'){
var len=elem.cells.length;
var width=0;
var height=0;
for(var i=0;i<len;++i){
var cell=elem.cells[i];
width+=cell.offsetWidth;
if(height<cell.offsetHeight){
height=cell.offsetHeight;
}
}
b.width=width;
b.height=height;

if(elem.offsetParent.tagName=='TABLE'){
elem._rowIndex=0;
var t=elem.offsetParent;

for(var i=0;i<t.rows.length;++i){
if(t.rows[i]==elem){
elem._rowIndex=i;
break;
}
}





if(elem._rowIndex>0&&elem.offsetTop==0){
b.top+=elem._rowIndex*b.height;
}
}
}

if(!relToContainer){
relToContainer=
document.getElementsByTagName('HTML')[0];
}

var currElem=elem;

while(currElem&&currElem!=relToContainer){

if(currElem.scrollLeft>0){
b.left=b.left-currElem.scrollLeft;
}
b.left+=currElem.offsetLeft;
b.top+=currElem.offsetTop;

if(!(currElem=currElem.offsetParent)){
break;
}
}

var cElem=elem;
if(doScrollTop){
while(cElem&&cElem!=relToContainer){
b.top-=cElem.scrollTop;
cElem=cElem.parentNode;
}
}

b.bottom=b.top+b.height;
b.right=b.left+b.width;
return b;
},







setBounds:function(idOrElem,boundsMap){
var elem=$(idOrElem);
for(var key in boundsMap){
elem.style[key]=parseInt(boundsMap[key])+'px';
}
},




getVisibleBounds:function(){
var _html=document.getElementsByTagName('HTML')[0];
var b={};
b.left=_html.scrollLeft;
b.top=_html.scrollTop;
b.width=_html.clientWidth;
b.height=(mojo.SAFARI)?window.innerHeight:_html.clientHeight;
b.right=b.left+b.width;
b.bottom=b.top+b.height;

return b;
},

getViewportBounds:function(){
var bounds={};
if(mojo.IE){

bounds.width=document.documentElement.clientWidth;
bounds.height=document.documentElement.clientHeight;



}else{
bounds.width=window.innerWidth;
bounds.height=window.innerHeight;
}
return bounds;
},

getScrollY:function(){
var scrOfY=0;
if(typeof(window.pageYOffset)=='number'){

scrOfY=window.pageYOffset;
}else if(document.body&&document.body.scrollTop){

scrOfY=document.body.scrollTop;
}else if(document.documentElement
&&document.documentElement.scrollTop){

scrOfY=document.documentElement.scrollTop;
}
return scrOfY;
},

centerInVisibleArea:function(idOrElem,offsets){
var HEADER_HEIGHT=95;
var HEADER_BOTTOM=mojo.geometry.getScrollY()+HEADER_HEIGHT;

if(!offsets)offsets={};
var elem=$(idOrElem);
var eb=mojo.geometry.getBounds(elem);

var vb=mojo.geometry.getVisibleBounds();
var t=Math.max(0,((vb.height-eb.height)/3));
var l=Math.max(0,((vb.width-eb.width)/2));

if(!mojo.FF)t+=mojo.geometry.getScrollY();

if(t<HEADER_HEIGHT){
t=HEADER_HEIGHT+5;
}



var screenBottom=vb.height+mojo.geometry.getScrollY();

if(t+eb.height>screenBottom){
t=HEADER_BOTTOM;
}

t+=offsets.top||0;
l+=offsets.left||0;

var bounds={top:t,left:l};


mojo.geometry.setBounds(elem,bounds);
return bounds;
},

scrollIntoView:function(elemOrId,scrollingContainer,slop,snap){
slop=(slop!=null)?slop:-24;
scrollingContainer=!scrollingContainer?document.body:$(scrollingContainer);
var elemPos=mojo.geometry.getBounds(elemOrId,scrollingContainer);
if(elemPos!=null){
var currTop=scrollingContainer.scrollTop;
var topMax=elemPos.top+slop;
if(snap){
scrollingContainer.scrollTop=topMax;
}else{
var topDir=topMax>currTop?'down':'up';
var t=null;
var fn=function(){
if(topDir=='up'&&currTop>topMax){
currTop=currTop-((currTop-topMax)*0.25);
}else if(topDir=='down'&&currTop<topMax){
currTop=currTop+((topMax-currTop)*0.25);
}
if(Math.abs(topMax-currTop)<=2){
clearInterval(t);
scrollingContainer.scrollTop=topMax;
}else{
scrollingContainer.scrollTop=Math.abs(currTop);
}
};
t=window.setInterval(fn,10);
}
}
},

getScrollTop:function(){
return Math.max(document.documentElement.scrollTop,document.body.scrollTop);
}
};

mojo.drawer={
_openInstance:null,

create:function(params){
return new MojoDrawer(params);
}
};

MojoDrawer=Class.create();
MojoDrawer.prototype={
FP_VERT:10,
FP_HORIZ:7,
ANIMATE_INTERVAL:mojo.FF?25:32,

initialize:function(params){
this.html=params.html;
this.id=params.id;
this.targetId=params.targetId;
this.targetHasBorder=mojo.isDefined(params.targetHasBorder)
?params.targetHasBorder:true;

this.direction=params.direction||'bottom';
this.delay=params.delay||2;
this.disableAutoClose=params.disableAutoClose;

this._isOpen=false;

this.onOpen=mojo.emptyFunction;
this.onClose=mojo.emptyFunction;
this.onBeforeClose=mojo.emptyFunction;

this.viewportDivId='drawerViewportDiv_'+this.id;
this.containerDivId='drawerContainerDiv_'+this.id;

if(!$(this.viewportDivId)){
mojo.dom.parseHTMLFragment('<div class="drawerViewportDiv" id="'
+this.viewportDivId+'"></div>',document.body);
this._viewportDiv=$(this.viewportDivId);
mojo.dom.parseHTMLFragment('<div class="drawerContainerDiv" id="'
+this.containerDivId+'"></div>',this._viewportDiv);
this._containerDiv=$(this.containerDivId);
}else{
this._viewportDiv=$(this.viewportDivId);
this._containerDiv=$(this.containerDivId);
}
mojo.setContent(this.containerDivId,this.html);
},


open:function(){
clearInterval(this.closeInterval);
this._isOpen=true;
this._positionAndSize();
mojo.css.show(this._viewportDiv);
mojo.css.show(this._containerDiv);
this._animateOpen();
mojo.drawer._openInstance=this;
},

_animateOpen:function(){
clearInterval(this.closeInterval);
var currStart=null;
switch(this.direction){
case'bottom':
currStart=mojo.css.getComputedStyle(this._containerDiv,
'top',true);
break;
case'right':
currStart=mojo.css.getComputedStyle(this._containerDiv,
'left',true);
break;
}

var self=this;
var f=function(){
switch(self.direction){
case'bottom':
currStart+=self.FP_VERT;
break;
case'right':
currStart+=self.FP_HORIZ;
break;
}
if(currStart>0){
switch(self.direction){
case'bottom':
mojo.geometry.setBounds(self._containerDiv,
{top:0});
break;
case'right':
mojo.geometry.setBounds(self._containerDiv,
{left:0});
break;
}
clearInterval(c);
self.onOpen();
if(!self.disableAutoClose){
var x=function(){
self.close();
};
self.closeInterval=
window.setInterval(x,self.delay*1000);
}
}else{

switch(self.direction){
case'bottom':
mojo.geometry.setBounds(self._containerDiv,
{top:currStart});
break;
case'right':
mojo.geometry.setBounds(self._containerDiv,
{left:currStart});
break;
}
}
};
var c=window.setInterval(f,this.ANIMATE_INTERVAL);
},

close:function(){
if(this._isOpen){
this.onBeforeClose();
this._animateClose();
this._isOpen=false;
this.onClose();
}
mojo.drawer._openInstance=null;
},

_animateClose:function(){
var currStart=null;
switch(this.direction){
case'bottom':
currStart=mojo.css.getComputedStyle(this._containerDiv,
'top',true);
break;
case'right':
currStart=mojo.css.getComputedStyle(this._containerDiv,
'left',true);
break;
}
var self=this;
var f=function(){
switch(self.direction){
case'bottom':
currStart-=self.FP_VERT;
break;
case'right':
currStart-=self.FP_HORIZ;
break;
}
var stop=null;
switch(self.direction){
case'bottom':
stop=parseInt('-'+self.height);
break;
case'right':
stop=parseInt('-'+self.width)
break;
}

if(currStart<stop){
switch(self.direction){
case'bottom':
mojo.geometry.setBounds(self._containerDiv,
{top:stop});
break;
case'right':
mojo.geometry.setBounds(self._containerDiv,
{left:stop});
break;
}
clearInterval(c);
clearInterval(self.closeInterval);
mojo.css.hide(self.viewportDivId);
}else{
switch(self.direction){
case'bottom':
mojo.geometry.setBounds(self._containerDiv,
{top:currStart});
break;
case'right':
mojo.geometry.setBounds(self._containerDiv,
{left:currStart});
break;
}
}
}
var c=window.setInterval(f,this.ANIMATE_INTERVAL);
},

isOpen:function(){
return this._isOpen;
},

resizeToBounds:function(){
var divBounds=$B(this.id);
this.height=divBounds.height;

mojo.geometry.setBounds(this._viewportDiv,{height:this.height});
mojo.geometry.setBounds(this._containerDiv,{height:this.height});
},

_positionAndSize:function(){
var divBounds=$B(this.id);
this.height=divBounds.height;
this.width=divBounds.width;

var posBelowElem=this.targetId;
var b=mojo.geometry.getBounds(posBelowElem);

mojo.geometry.setBounds(this._viewportDiv,{width:this.width,
height:this.height});
mojo.geometry.setBounds(this._containerDiv,{width:this.width,
height:this.height});
switch(this.direction){
case'bottom':
mojo.geometry.setBounds(this._viewportDiv,
{top:b.top+b.height
+(this.targetHasBorder?1:0),
left:b.left});
mojo.geometry.setBounds(this._containerDiv,
{top:0-this.height,
left:0});
break;
case'right':
mojo.geometry.setBounds(this._viewportDiv,
{top:b.top,
left:b.left+b.width
+(this.targetHasBorder?1:0)});
mojo.geometry.setBounds(this._containerDiv,
{top:0,
left:0-this.width});
break;
}
}
};












var CONSOLE_LOG_OBJECT='mojo.log';
mojo.log={
WHITE_LIST:{
'50486@47':true,
'12645@3':true,
'463@10':true,
'49430@48583':true,
'62995@1765':true,
'63634@19773':true,
'62531@19869':true,
'54466@20573':true,
'31602@19941':true,
'20958@20890':true,
'8667@9':true,
'42306@5':true,
'40167@5':true,
'33202@20566':true,
'27405@2615':true,
'48486@6495':true,
'23590@3':true,
'15135@1':true,
'4357@6':true,
'41165@18764':true,
'34437@79054':true
},

obj:function(extraObj){
mojo.log.info('',extraObj);
},

info:function(msg,extraObj){
mojo.log.error(msg,extraObj,true);
},

error:function(msg,extraObj,isInfo){
if(mojo.log.isDisabled())return;

if(msg==null)msg='null';

var actionsHtml=
"<a style='color: white; position: absolute; top: -1px; "+
"right: 25px;'"+
" href='javascript:mojo.log.clearPanel()'>clear</a>"+
"<a style='color: white; position: absolute; top: -1px; "+
"right: 5px;'"+
" href='javascript:mojo.log.closePanel()'>x</a>";

if(!mojo.log._errorDiv){
var div=document.createElement("DIV");
div.id='errPanel';
mojo.log._errorDiv=document.body.appendChild(div);





















div.innerHTML=actionsHtml;
}else{
if(mojo.log._errorDiv.innerHTML==""){
mojo.log._errorDiv.innerHTML=actionsHtml;
}
mojo.css.display(mojo.log._errorDiv,true);
}

var color=isInfo?'white':'red';
var html='<div style="color:'+color+'">&gt; '+msg;
if(mojo.isDefined(extraObj)){
if(extraObj){
if(mojo.isObject(extraObj)||mojo.isArray(extraObj)){
html+='<br>';
for(var j in extraObj){
if(typeof(extraObj[j])=='function')continue;
html+='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+j+
': '+extraObj[j]+'<br>';
}
}else{
html+=extraObj+'<br>';
}
}else{
html+=extraObj+'<br>';
}
}

mojo.dom.parseHTMLFragment(html+'</div>',mojo.log._errorDiv);
},

closePanel:function(){
mojo.css.display(mojo.log._errorDiv,false);
mojo.log._errorDiv.innerHTML="";
},

clearPanel:function(){
mojo.log._errorDiv.innerHTML=
"<a style='color: white; position: absolute; top: -1px; "+
"right: 25px;'"+
" href='javascript:mojo.log.clearPanel()'>clear</a>"+
"<a style='color: white; position: absolute; top: -1px; "+
"right: 5px;'"+
" href='javascript:mojo.log.closePanel()'>x</a>";
},

isDisabled:function(){
if(mojo.DEV_FLAG)return false;
if(mojo.PERF)return false;


return!((typeof(lala)!='undefined')
&&lala.user
&&mojo.log.WHITE_LIST[lala.user.userToken]);
},

_reset:function(){
mojo.log._messages=[];
mojo.log._size=0;
}
};
mojo.log._reset();

mojo.flash={
getVersion:function(){
var version=[-1,-1];

if(navigator.plugins&&typeof navigator.plugins["Shockwave Flash"]=="object"){
var _d=navigator.plugins["Shockwave Flash"].description;
if(typeof _d!="undefined"){
_d=_d.replace(/^.*\s+(\S+\s+\S+$)/,"$1");
var _m=parseInt(_d.replace(/^(.*)\..*$/,"$1"),10);
var _r=/r/.test(_d)?parseInt(_d.replace(/^.*r(.*)$/,"$1"),10):0;
version=[_m,_r];
}

}else if(window.ActiveXObject){

try{
var _a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");

}catch(e){
try{
_a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
version=[6,0];
_a.AllowScriptAccess="always";

}catch(ee){
if(version[0]==6){return;}
}
try{
_a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
}catch(eee){

}

}

if(typeof _a=="object"){
_d=_a.GetVariable("$version");
if(typeof _d!="undefined"){
_d=_d.replace(/^\S+\s+(.*)$/,"$1").split(",");
version=[parseInt(_d[0],10),parseInt(_d[2],10)];
}
}
}

return version;
}
}

mojo.input={
onEnterKey:function(elemOrId,handler,andFocus,andSelect){
mojo.event.onEnterKey(elemOrId,handler);
if(andFocus)$(elemOrId).focus();
if(andSelect)$(elemOrId).select();
},

clearOnClick:function(field,dontResetOnBlur,changeType){
var fld=$(field);
if(!fld)return;

fld.__origValue=fld.value;
fld.__origColor=fld.style.color;
if(changeType)fld.__origType=fld.type;

if(!dontResetOnBlur)mojo.input._attachOnBlur(fld);

fld.__cleared=false;
fld.hasUserText=mojo.input.hasUserText;
mojo.input._attachOnFocus(fld,changeType);
},


hasUserText:function(){
return this.__cleared;
},

limit:function(evt,field,maxlength){
var evt=(evt)?evt:window.event;
if(field.value.length>=maxlength){
if(evt.keyCode!=8
&&evt.keyCode!=37
&&evt.keyCode!=38
&&evt.keyCode!=39
&&evt.keyCode!=40
&&evt.keyCode!=46){
if(typeof(evt.preventDefault)=='function')evt.preventDefault();
if(mojo.IE)evt.returnValue=false;
return false;
}
}
},

limitCount:function(elem,field,maxlength,pluralElem){
var rem=maxlength-field.value.length;
if(rem<=0)rem=0;
$S(elem,rem);
if(pluralElem)$S(pluralElem,rem==1?'':'s');
},

_changeType:function(elem,newType,focus){
var newElem=null;
elem.onblur=null;

if(!mojo.IE){
newElem=document.createElement('input');
newElem.type=newType;
}else{
newElem=document.createElement('span');
$S(newElem,'<input type="'+newType+'" name="'+elem.name+'">');
newElem=newElem.firstChild;
}
var attrs=['name','id','className','size','tabIndex','accessKey',
'__origType','__origValue','value','__cleared','__origColor'];

for(var i=0;i<attrs.length-1;i++){

if(elem[attrs[i]])newElem[attrs[i]]=elem[attrs[i]];
}

if(!focus)mojo.input._attachOnFocus(newElem,elem.type);
mojo.input._attachOnBlur(newElem);

elem.parentNode.replaceChild(newElem,elem);
if(focus){
window.setTimeout(function(){newElem.focus();},10);
}
return newElem;
},

_attachOnBlur:function(elem){
var onBlur=function(){
var el=this;
window.setTimeout(function(){

if(el.value.replace(/\s+/gi,'')!='')return;
try{
if(el.__origType)el=mojo.input._changeType(el,el.__origType);
el.style.color=el.__origColor;
el.value=el.__origValue;
el.__cleared=false;
}catch(e){}
},2);
};
mojo.dom.setEventListener(elem,'onblur',onBlur);
},

_attachOnFocus:function(elem,changeType){
var fn=function(){
var el=this;
if(el.__cleared)return;
try{
el.value='';
if(changeType)el=mojo.input._changeType(el,changeType,el);
el.style.color='black';
}catch(e){}
el.__cleared=true;
if(mojo.MAC)mojo.focus(el);
};
mojo.dom.setEventListener(elem,'onclick',fn);
mojo.dom.setEventListener(elem,'onfocus',fn);
}
};






mojo.cookie={








set:function(name,value,days,domain){
var expires='';
if(days){
var date=new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
expires="; expires="+date.toGMTString();
}
var cookieDomain='';
if(domain){
cookieDomain="; domain="+domain;
}
document.cookie=name+"="+value+expires+cookieDomain+"; path=/";










},

getAll:function(){
var cookies={};
var ca=document.cookie.split(';');
for(var i=0;i<ca.length;i++){
var c=ca[i];
c=c.ltrim();
var eq=c.indexOf('=');
var name=c.substring(0,eq);
var val=c.substring(eq+1);
if(name)cookies[name]=val;
}

return cookies;




},

get:function(key,defVal){
var cookies=mojo.cookie.getAll();
var val=cookies[key];
if(!val&&mojo.isDefined(defVal)){
val=defVal;
}

return val;
},

contains:function(key,killIt){
var exists=mojo.cookie.get(key,null)!=null;
if(exists&&killIt){
mojo.cookie.remove(key);
}

return exists;
},

remove:function(name){
mojo.cookie.set(name,"",-1);
},










_set:function(name,value,type){
mojo.assert(type=="session"||type=="persistent",
"invalid cookie type: "+type);
var ec=mojo.cookie.get(type,"");
var cookies=mojo.cookie._unpack(ec);
if(value!=null){
cookies[name]=value;
}else{
delete cookies[name];
}
var expires="";
var date=new Date();
if(type=="persistent"){
date.setTime(date.getTime()+(365*24*60*60*1000));
expires="; expires="+date.toGMTString();
}
var packed=mojo.cookie._pack(cookies);
if(!packed){
date.setTime(date.getTime()+(-1*24*60*60*1000));
expires="; expires="+date.toGMTString();
document.cookie=type+"="+expires+"; path=/";
}
document.cookie=type+"="+packed+expires+"; path=/";
},






_pack:function(obj){
var pairs=[];
for(var nvp in obj){
pairs.push(nvp+"="+obj[nvp]);
}
return encodeURIComponent(pairs.join(";"));
},







_unpack:function(str){
if(!str)return{};
var dC=decodeURIComponent(str);
var cookies={};
dC.split(";").leach(function(nvp){
var eq=nvp.indexOf('=');
var n=nvp.substring(0,eq);
cookies[n]=nvp.substring(eq+1);
});
return cookies;
}
};




mojo.table={
insertRow:function(tableIdOrElem,rowHtml,refRow){
var table=$(tableIdOrElem);
var tbody=table.tBodies[0];
if(!tbody)mojo.impossible('insertRow failed, no tbody');

var row=mojo.dom.parseHTMLFragment('<table>'+rowHtml+'</table>');


if(mojo.IE){
if(refRow)tbody.insertBefore(row,refRow);
else tbody.insertBefore(row);
}else{
tbody.insertBefore(row,refRow);
}
return row;
},

deleteRowsFrom:function(tableIdOrElem,index){
var table=$(tableIdOrElem);
for(var i=table.rows.length-1;i>=index;i--){
table.deleteRow(i);
}
},

deleteRow:function(rowId){
var row=$(rowId);
row.parentNode.removeChild(row);
},

getRowCount:function(tableIdOrElem){
var table=$(tableIdOrElem);
return table.rows.length;
}
};




mojo.event={
create:function(evt){
return new MojoEvent(evt);
},

isShiftKey:function(browserEvent){
browserEvent=browserEvent||window.event;
return browserEvent.shiftKey;
},
isCtrlKey:function(browserEvent){
browserEvent=browserEvent||window.event;
return browserEvent.ctrlKey||(mojo.MAC&&browserEvent.metaKey);
},






onMouseOver:function(target,overHandler,outHandler){
var t=$(target);
if((t==null)||t.onmouseover)return;

t.__isInPopup=false;
var fn=function(evt){



if(t.__isInPopup)return;



t.__isInPopup=true;


if(mojo.isFunction(overHandler))overHandler(evt);
else eval(overHandler);




var bonover=function(event){
var evt=mojo.event.create(event);
var currTarget=evt.target;


var stillIn=false;
while(currTarget!=null){
if(currTarget==t){
stillIn=true;
break;
}
currTarget=currTarget.parentNode;
}

if(!stillIn){

if(mojo.isFunction(outHandler))outHandler(evt);
else eval(outHandler);

document.body.onmouseover=null;
t.__isInPopup=false;
}
}
mojo.dom.setEventListener(document.body,'onmouseover',bonover);
};
mojo.dom.setEventListener(t,'onmouseover',fn);
},



onMouseOut:function(target,outHandler,trigger){
var t=$(target);
if((t==null)||t.onmouseover)return;

var bonover=function(event){
var evt=mojo.event.create(event);
var currTarget=evt.target;
if(currTarget==trigger||
currTarget.parentNode==trigger){

return;
}


var stillIn=false;
while(currTarget!=null){
if(currTarget==t){
stillIn=true;
break;
}
currTarget=currTarget.parentNode;
}

if(!stillIn){

outHandler(event);
document.body.onmouseover=null;
}
}
mojo.dom.setEventListener(document.body,'onmouseover',bonover);
},














is_child_of:function(parent,child){
if(child!=null){



try{
while(child.parentNode){
if((child=child.parentNode)==parent){
return true;
}
}
}
catch(e){
return false;
}
}
return false;
},


fixOnMouseOver:function(element,event,fcn,theThis){
event=event||window.event;
var current_mouse_target=null;
if(event.fromElement){
current_mouse_target=event.fromElement;
}else if(event.relatedTarget){
current_mouse_target=event.relatedTarget;
}
if(!mojo.event.is_child_of(element,current_mouse_target)&&element!=current_mouse_target){
var args=[];
for(var i=0;i<arguments.length;i++){
if(i!=3&&i!=2)args.push(arguments[i]);
}
fcn.apply(theThis,args);
}
},
fixOnMouseOut:function(element,event,fcn,theThis){
event=event||window.event;
var current_mouse_target=null;
if(event.toElement){
current_mouse_target=event.toElement;
}else if(event.relatedTarget){
current_mouse_target=event.relatedTarget;
}
if(!mojo.event.is_child_of(element,current_mouse_target)&&element!=current_mouse_target){
var args=[];
for(var i=0;i<arguments.length;i++){
if(i!=3&&i!=2)args.push(arguments[i]);
}
fcn.apply(theThis,args);
}
},

onKey:function(keyCode,elemOrId,handler,eventType){
var elem=$(elemOrId);
var fn=null;
if(handler){
fn=function(event){
var evt=event?event:window.event;
if(evt.keyCode==keyCode||evt.charCode==keyCode){
handler();
}
}
}
if(fn!=null){
mojo.dom.setEventListener(elem,eventType?eventType:'onkeypress',fn);
}else{
elem.onkeypress=null;
}
},






onEnterKey:function(elemOrId,handler){
mojo.event.onKey(13,elemOrId,handler);
},





onEscapeKey:function(elemOrId,handler){
mojo.event.onKey(27,elemOrId,handler,'onkeyup');
}
};

MojoEvent=Class.create();
MojoEvent.prototype={
initialize:function(evt){
evt=evt?evt:window.event;
this.raw=evt;
if(evt==null)return;

this.target=evt.target?evt.target:evt.srcElement;

if(this.target.nodeType==3){
this.target=this.target.parentNode;
}
this.keyCode=evt.keyCode;
this.charCode=evt.charCode;


this.screenX=evt.screenX;
this.screenY=evt.screenY;

this.posX=(mojo.IE)?evt.x:evt.layerX;
this.posY=(mojo.IE)?evt.y:evt.layerY;

this.ctrlKey=evt.ctrlKey||(mojo.MAC&&evt.metaKey);
this.shiftKey=evt.shiftKey;
this.altKey=evt.altKey;

var b=document.body;
var pe=b.parentElement;

if(mojo.IE){
this.pageX=evt.clientX+b.scrollLeft-b.clientLeft;
this.pageY=evt.clientY+b.scrollTop-b.clientTop;

if(pe&&pe.clientLeft){
this.pageX+=pe.scrollLeft-pe.clientLeft;
this.pageY+=pe.scrollTop-pe.clientTop;
}
}else{
this.pageX=evt.pageX;
this.pageY=evt.pageY;
}
},

stopPropagation:function(){
if(!mojo.IE)this.raw.stopPropagation();
else this.raw.cancelBubble=true;
}
};

mojo.autocomplete={








create:function(params){
if(!params.offsets)params.offsets={};
return new MojoAutoCompleteWidget(params);
},

hide:function(){
if(mojo.autocomplete.visibleAutocomplete){
mojo.autocomplete.visibleAutocomplete.hide();
}
}
};
mojo.autocomplete.all={};

MojoAutoCompleteWidget=Class.create();
MojoAutoCompleteWidget.prototype={
initialize:function(params){
this.disabled=false;

var accId='acc_'+params.inputId;

if(!$(accId)){
this._div=
mojo.dom.parseHTMLFragment(
'<div class="'+(params.divClassName||'acc')+'" id="'+accId+'"></div>',
params.parentElement||document.body);
}else{
this._div=$(accId);
}


this._input=$(params.inputId);
this._buttonID=params.buttonId;
this.onFakeSubmit=params.onFakeSubmit||mojo.emptyFunction;

this._selRowClassName=params.selRowClassName||'selectedRow';
this._selRow=null;
this._selRowIndex=null;

this.onaction=mojo.emptyFunction;
this.onfill=mojo.emptyFunction;
this.ontab=mojo.emptyFunction;
this.onkeyupCallback=mojo.emptyFunction;

this._suggestions=[];

this._userText=null;

this.offsets=params.offsets;
this.scrollWithBody=!!params.scrollWithBody;


this.attachWidgetToElem(params.inputId);
this.lastVal=null;
this.showAll=params.showAll;
this.widthOffset=params.widthOffset;
},

attachWidgetToElem:function(inputID){
this._input=null;
this._input=$(inputID);
var me=this;
var hideFn=function(){me.hide();}
mojo.dom.setEventListener(this._input,'onkeyup',
function(e){return me.onkeyup(e);});
mojo.dom.setEventListener(this._input,'onkeydown',
function(e){return me.onkeydown(e);});
mojo.dom.setEventListener(this._input,'onkeypress',
function(e){return me.onkeypress(e);});



mojo.dom.setEventListener(this._input,'onblur',
function(e){window.setTimeout(hideFn,200);});


var overfn=function(evt){
if(me._selRow){
me._selRow.className=me._selRow.__className;
me._selRow=null;
me._selRowIndex=null;
}
}
mojo.dom.setEventListener(this._div,'onmouseover',overfn);

mojo.dom.addEventListener(window,'onresize',function(){me.hide();});

if(this._buttonID){
$(this._buttonID).onclick=function(){me._submit();};
}
mojo.autocomplete.all[inputID]=this;
},

value:function(){
return this._input.value;
},

hide:function(){
if(this._div.style.visibility=='hidden')return;

document.onscroll=null;
mojo.css.hide(this._div);
mojo.css.display(this._div,false);
this.clear();

if(mojo.autocomplete.visibleAutocomplete==this){
mojo.autocomplete.visibleAutocomplete=null;
}
mojo.util.showSelects();
},

setDisabled:function(isDisabled){
this.disabled=isDisabled;
this._lastNoMatchTerm=null;
},

show:function(){
this._positionAndSizeWidget();
mojo.css.show(this._div);
mojo.css.display(this._div,true);
mojo.autocomplete.visibleAutocomplete=this;

var self=this;
var fn=function(evt){self.hide()};
mojo.dom.addEventListener(mojo.IE?window:document,'onscroll',fn);
if(mojo.IE6)mojo.util.hideSelects();
},

fill:function(sTerm,matchCount,html,suggestions){
this._suggestions=suggestions;
this.clear(true);
if(matchCount<=0){
this.hide();
if(matchCount==0){
this._lastNoMatchTerm=sTerm;
}



}else{
this._div.innerHTML=html;
this.show();
}
},

clear:function(skipInnerHTML){
this._selRow=null;
this._selRowIndex=null;
if(!skipInnerHTML)this._div.innerHTML='';
},

select:function(dir){
if(this._selRow){

this._selRow.className=this._selRow.__className;
if(dir=='up'){
this._selRow=this.getPreviousSibling(this._selRow);
this._selRowIndex--;
}else{
this._selRow=this.getNextSibling(this._selRow);
this._selRowIndex++;
}
}else{

if(dir=='down'){
this._selRow=this.getFirstChild(this._div);
this._selRowIndex=0;
}else{
this._selRow=this.getLastChild(this._div);
this._selRowIndex=this._suggestions.length-1;
}
}

if(this._selRow){
var row=this._selRow;
row.__className=row.className;
row.className=this._selRowClassName;
var suggestion=this._suggestions[this._selRowIndex];
this._input.value=suggestion.isFake?this._userText:suggestion.value;
}else{


this._input.value=this._userText;
}
},

getFirstChild:function(div){
var firstChild=div.firstChild;
while(firstChild&&firstChild.tagName!="A"){
firstChild=firstChild.nextSibling;
}
return firstChild;
},

getLastChild:function(div){
var lastChild=div.lastChild;
while(lastChild&&lastChild.tagName!="A"){
lastChild=lastChild.nextSibling;
}
return lastChild;
},

getNextSibling:function(row){
var nextRow=row.nextSibling;
while(nextRow&&nextRow.tagName!="A"){
nextRow=nextRow.nextSibling;
}
return nextRow;
},

getPreviousSibling:function(row){
var prevRow=row.previousSibling;
while(prevRow&&prevRow.tagName!="A"){
prevRow=prevRow.previousSibling;
}
return prevRow;
},

getSelectedIndex:function(){
var index=-1;
var n=this._div.childNodes;
var l=n.length;
var count=0;
for(var i=0;i<l;i++){
var node=n[i];
if(node.tagName=='A'){
if(node==this._selRow){
index=count;
break;
}
count++;
}
}
return index;
},

onkeydown:function(evt){
if(this.disabled)return true;


var evt=mojo.event.create(evt);

if(evt.keyCode==9&&this._selRow){
this.ontab((this._selRow)?this.getSelectedIndex():-1);
return false;
}

if(mojo.SAFARI2&&evt.keyCode==13){
this._submitOnReturn();
}
},

onkeypress:function(evt){
if(this.disabled)return true;
},

onkeyup:function(evt){
var retval=false;
var evt=mojo.event.create(evt);
var val=this._input.value;

if(this.disabled&&evt.keyCode!=13)return false;



if(mojo.pulldown&&mojo.pulldown._openInstance){
mojo.pulldown._openInstance.close();
}


if(evt.keyCode==27){
this.hide();
this._input.value=this._userText;
evt.stopPropagation();
}else if(evt.keyCode==13){
this._submitOnReturn();
}else if(evt.keyCode==38){
this.select('up');
}else if(evt.keyCode==40){
this.select('down');
}else{
this._userText=this._input.value;

if(!this._lastNoMatchTerm||
val.indexOf(this._lastNoMatchTerm)!=0){

if(this.lastVal==val)return

this.onfill(val);
this.lastVal=val;
retval=true;
}else{

this.hide();
}
}
this.onkeyupCallback(evt);
return retval;
},

_submitOnReturn:function(){
var suggestion=this._suggestions[this._selRowIndex];
if(suggestion&&suggestion.isFake){
this.onFakeSubmit(this._selRowIndex);
}else{
this._submit(this._selRow?this.getSelectedIndex():-1);
}
},

_submit:function(index){
if(!mojo.isDefined(index))index=-1;

this.onaction(index,this._suggestions);
this.hide();
},

_positionAndSizeWidget:function(){
var div=this._div;
var inputElem=this._input;
var ib=mojo.geometry.getBounds(inputElem);

var newTop=ib.top+ib.height;
var newLeft=ib.left;


if(!this.scrollWithBody&&!mojo.IE6){
newTop+=mojo.geometry.getScrollTop();
}

var newWidth=mojo.IE67?ib.width:(ib.width-2);
if(this.showAll){
newWidth*=2;
div.style.overflow='auto';
div.style.height='250px';
}
if(this.widthOffset){
newWidth+=this.widthOffset;
}

if(this.offsets.top)newTop+=this.offsets.top;
if(this.offsets.left)newLeft+=this.offsets.left;
mojo.geometry.setBounds(div,
{top:newTop,left:newLeft,width:newWidth});
}
};
mojo.autocomplete.visibleAutocomplete=null;


mojo.animate={
FP:10,
INTERVAL:mojo.FF?25
:mojo.WEBKIT?15:32,

open:function(idOrElem,callback,framePercentage){
if(framePercentage){mojo.animate.FP=framePercentage;}
var elem=$(idOrElem);

mojo.css.hide(elem);



if(mojo.FF2){
elem._position=elem.style.position;
elem.style.position="absolute";
}

mojo.css.display(elem,true);
var currStyleHeight=$B(elem).height;
if(!elem.__origHeight){
elem.__origHeight=
currStyleHeight?currStyleHeight:elem.offsetHeight;
}
var heightStop=elem.__origHeight;
var currHeight=elem.__initHeight?elem.__initHeight:1;
mojo.geometry.setBounds(elem,{height:currHeight});
if(elem.style.overflow!='auto')elem.style.overflow='hidden';


if(mojo.FF2){
elem.style.position=elem._position;
elem._position=void 0;
}
if(!elem.__initHeight)mojo.css.show(elem);
var f=function(){
currHeight+=mojo.animate.FP;

if(currHeight<=heightStop){
mojo.geometry.setBounds(elem,{height:currHeight});
}else{
mojo.geometry.setBounds(elem,{height:elem.__origHeight});
clearInterval(c);
if(callback)callback();
}
}
var c=window.setInterval(f,mojo.animate.INTERVAL);
},

close:function(idOrElem,callback){
var elem=$(idOrElem);
var currHeight=elem.__origHeight?elem.__origHeight-1:mojo.css.getComputedStyle(elem,"height",true)-1;
var stopHeight=elem.__initHeight?elem.__initHeight:2;

var c=window.setInterval(function(){
currHeight=currHeight-mojo.animate.FP;
if(currHeight>stopHeight){
mojo.geometry.setBounds(elem,{height:currHeight});
}else{
clearInterval(c);
mojo.css.hide(elem);
if(callback)callback();
}
},mojo.animate.INTERVAL);
},



fade:function(elemOrId,dir,callback,interval,opacityStep){
if(!interval)interval=mojo.animate.INTERVAL;
if(!opacityStep)opacityStep=(mojo.IE)?0.05:0.03;
var elem=$(elemOrId);

if(elem.fadeTimeout){
clearInterval(elem.fadeTimeout);
}
elem.style.zoom=1;
if(!dir)dir='in';
var orginalOpacity=
parseFloat(mojo.css.getComputedStyle(elem,'opacity'));
var fadeIn=function(){
var op=parseFloat(mojo.css.getComputedStyle(elem,'opacity'));
if(op<1){
var elemOp=
(op>1-opacityStep)?1:(op+parseFloat(opacityStep));
mojo.css.setOpacity(elem,elemOp);
}else{
clearInterval(elem.fadeTimeout);
if(callback)callback();
}
};
var fadeOut=function(){
var op=parseFloat(mojo.css.getComputedStyle(elem,'opacity'));
if(op>0){
var elemOp=(op<opacityStep)?0:(op-parseFloat(opacityStep));
mojo.css.setOpacity(elem,elemOp);
}else{
clearInterval(elem.fadeTimeout);

mojo.css.hide(elem);
mojo.css.setOpacity(elem,1);


if(mojo.IE)mojo.css.setOpacity(elem,orginalOpacity);
if(callback)callback();
}
};
if(dir=='in'){
mojo.css.setOpacity(elem,0);
elem.style.visibility="visible";
elem.fadeDir='in';
elem.fadeTimeout=window.setInterval(fadeIn,interval);
}else if(dir=='out'){
mojo.css.setOpacity(elem,orginalOpacity);
mojo.css.show(elem);
elem.fadeDir='out';
elem.fadeTimeout=window.setInterval(fadeOut,interval);
}
},

fadeIn:function(elemOrId,callback){
mojo.animate.fade(elemOrId,'in',callback);
},

fadeOut:function(elemOrId,callback){
mojo.animate.fade(elemOrId,'out',callback);
},

cancelFade:function(elemOrId){
var elem=$(elemOrId);
if(elem&&elem.fadeTimeout){
clearInterval(elem.fadeTimeout);
mojo.css.setOpacity(elem,(elem.fadeDir=='in')?0:1);
}
}
};

mojo.pulldown={
_openInstance:null,



















create:function(p){
return new MojoPulldownWidget(p);
},

hide:function(){
if(mojo.pulldown._openInstance){
mojo.pulldown._openInstance.close();
}
},

all:{}
};

MojoPulldownWidget=Class.create();
MojoPulldownWidget.prototype={
initialize:function(p){
if(!$(p.id)){
this._div=
mojo.dom.parseHTMLFragment(
'<div class="lpulldown" id="'+p.id+'"></div>',
p.parentElement||document.body);
}else{
this._div=$(p.id);
}

if(p.divContent){
this._div.innerHTML=p.divContent;
}

this.onBeforeOpen=mojo.emptyFunction;
this.onClose=mojo.emptyFunction;
this.disableOnClick=p.disableOnClick;
this.animate=mojo.isDefined(p.animate)?p.animate:true;
this.isTargetInHeader=p.isTargetInHeader;

if(p.target){
this.setTarget(p);
}






mojo.css.display(this._div,false);

if(this._target)this._reset();


mojo.pulldown.all[p.id]=this;
},

isVisible:function(){
return this._div.style.visibility=='visible';
},

getContainer:function(){
return this._div;
},

getTarget:function(){
return this._target;
},

setTarget:function(p){
this._target=$(p.target);
this._openBelowTarget=$(p.openBelowTarget);
this._relHackId=p.relHackId;

this._reset();
},

open:function(offsets,outsideScroll,inHeader){
if(offsets){
this.offsets=offsets;
}


MojoDialog.close();
var self=this;
if(mojo.pulldown._openInstance){
mojo.pulldown._openInstance.close();
if(this.disableOnClick&&mojo.pulldown._openInstance==this){
return;
}
}
if(this.onBeforeOpen(this._div))return;

if(mojo.popup)mojo.popup.close();

this._positionAndSize(outsideScroll,inHeader);
if(this.animate){
mojo.animate.open(this._div);
}else{
mojo.css.display(this._div,true);
mojo.css.show(this._div);
}


if(mojo.IE6)mojo.util.hideSelects();

mojo.dom.setEventListener(document.body,'onclick',function(evt){
self.close();
});
mojo.dom.addEventListener(mojo.IE?window:document,'onscroll',function(evt){
self.close();
});
mojo.pulldown._openInstance=this;

widgets.core.LightDialog.hide();
},

close:function(){
mojo.css.hide(this._div);
mojo.css.display(this._div,false);




if(mojo.IE6
&&(!$('modalDialogContainer')
||($('modalDialogContainer')
&&$('modalDialogContainer').style
&&$('modalDialogContainer').style.visibility!='visible'))){
mojo.util.showSelects();
}

document.body.onclick=null;
document.onscroll=null;
mojo.pulldown._openInstance=null;
this.onClose();
},

_reset:function(){

if(!this.disableOnClick){
var self=this;
var fn=function(evt){
evt=mojo.event.create(evt);
if(self.isVisible()){
self.close();
}else{
self.open();
}
evt.stopPropagation();
return false;
}
mojo.dom.setEventListener(this._target,'onclick',fn);
}
this._positionAndSize();
},

_positionAndSize:function(outsideScroll,inHeader){
if(mojo.IE67&&this._relHackId){
$(this._relHackId).style.position='static';
}

var posBelowElem=this._openBelowTarget||this._target;
var b=$B(posBelowElem);

var newTop=b.top+b.height;
if(!mojo.IE6&&(this.isTargetInHeader||inHeader)){
newTop+=mojo.geometry.getScrollY();
}
var newLeft=b.left+1;
if(this.offsets){
var scrollTop=0;
if(this.offsets.scrollId&&!outsideScroll){

scrollTop=$(this.offsets.scrollId).scrollTop;
}
newTop-=scrollTop;
if(this.offsets.top)newTop+=this.offsets.top;
if(this.offsets.left)newLeft+=this.offsets.left;




if(this.offsets.checkBottom){
mojo.css.display(this._div,true);

var pulldownHeight=$B(this._div).height;

var containerHeight=this.offsets.container
?$B(this.offsets.container).height
:mojo.geometry.getViewportBounds().height;

var pulldownBottom=newTop+pulldownHeight;



var scroller=this.offsets.scrollContainer
?$(this.offsets.scrollContainer)
:null;
var outsideScrollerView=scroller&&
(pulldownBottom>$B(scroller).height+scroller.scrollTop);


var outsideContainerBounds=pulldownBottom>containerHeight;

if(outsideScrollerView||outsideContainerBounds){
newTop=b.top-pulldownHeight-scrollTop;
if(this.offsets.checkBottomTop)newTop+=this.offsets.checkBottomTop;
}

mojo.css.display(this._div,false);
}

mojo.geometry.setBounds(this._div,{top:newTop,left:newLeft});

if(mojo.IE67&&this._relHackId){
$(this._relHackId).style.position='relative';
}
}
}
};

mojo.popup={
onInit:function(){},
onOpen:function(div,state){},
onClose:function(div,state){},
onPosition:function(div,state){},
_openPopup:function(){},

init:false,
_openTimer:null,
_closeTimer:null,
_updateTimer:null,
_target:null,
_openTarget:null,


enteredTarget:function(evt,popupDiv,state){

if(!mojo.popup.init)return;
if(!state)return;

var p=$(popupDiv);
if(!p)p=mojo.popup.onInit();

var event=mojo.event.create(evt);
var target=event.target;
if(target==mojo.popup._openTarget
&&mojo.popup._openPopupDiv){


window.setTimeout(function(){
mojo.popup.clearAllTimers();
},20);

return;
}

mojo.popup._target=target;
target.b=mojo.geometry.getBounds(target);





if(mojo.popup._openPopupDiv){

var update=function(){




mojo.popup._clearTimer('_closeTimer');
mojo.popup.close();
mojo.popup._openPopup=mojo.popup._makeOpenPopupClosure(p,state,target);
mojo.popup.onFill(p,state);
};
mojo.popup._updateTimer=window.setTimeout(update,300);
}else{


mojo.popup._openTimer=null;
mojo.popup._closeTimer=null;
mojo.popup._updateTimer=null;
mojo.popup._openPopupDiv=null;
mojo.popup._isInPopup=false;



mojo.popup._openPopup=mojo.popup._makeOpenPopupClosure(p,state,target);
mojo.popup._openTimer=window.setTimeout(function(){mojo.popup.onFill(p,state)},700);
}
},

_makeOpenPopupClosure:function(p,state,target){
return function(){


mojo.popup.onPosition(p,state,target);
mojo.popup._openPopupDiv=p;

var fn=function(){
if(mojo.IE6)mojo.util.hideSelects();
mojo.css.display(p,true);
}

if(mojo.IE67)fn();
else window.setTimeout(fn,10);

mojo.event.onMouseOver(p,mojo.popup._enteredPopup,
mojo.popup._leavingPopup);
mojo.popup._openTimer=null;
mojo.popup.onOpen(p,state);

mojo.popup._openTarget=target;
};
},

openPopup:function(){
mojo.popup._openPopup();
},

leavingTarget:function(evt,popupDiv){
if(!mojo.popup.init)return;
var p=$(popupDiv);
var event=mojo.event.create(evt);
var t=mojo.popup._target;



mojo.popup._clearTimer('_openTimer');
if(mojo.popup._updateTimer){
mojo.popup._clearTimer('_updateTimer');
return;
}




if(mojo.popup._openPopupDiv){

if(event.pageX>t.b.left&&event.pageX<(t.b.left+t.b.width)&&
event.pageY>t.b.top&&event.pageY<(t.b.top+t.b.height)){
return;
}
var closePopup=function(){
mojo.popup.close();
mojo.popup._closeTimer=null;
}
mojo.popup._closeTimer=window.setTimeout(closePopup,700);
}else{
mojo.popup.close();
}
},

close:function(){

if(mojo.popup._openPopupDiv){
mojo.css.display(mojo.popup._openPopupDiv,false);
mojo.popup._openPopupDiv.innerHTML='';
mojo.popup.onClose(mojo.popup._openPopupDiv);
if(mojo.IE6)mojo.util.showSelects();
}
mojo.popup.clearAllTimers();
mojo.popup._openPopupDiv=null;
mojo.popup._openPopup=function(){};
},

_enteredPopup:function(evt){
if(!mojo.popup.init)return;
mojo.popup._clearTimer('_closeTimer');
},

_leavingPopup:function(event){
if(!mojo.popup._openPopupDiv)return;
if(!mojo.popup.init)return;
var closePopup=function(){
mojo.popup.close();
mojo.popup._closeTimer=null;
}
mojo.popup._closeTimer=window.setTimeout(closePopup,700);
},

_clearTimer:function(nm){

if(mojo.popup[nm])window.clearTimeout(mojo.popup[nm]);
mojo.popup[nm]=null;
},

clearAllTimers:function(){
mojo.popup._clearTimer('_openTimer');
mojo.popup._clearTimer('_updateTimer');
mojo.popup._clearTimer('_closeTimer');
}
};

mojo.graphics={
fixPNGs:function(divId,tag){
mojo.graphics.fnLoadPngs(divId,tag);
},

fnLoadPngs:function(divId,tag){
var elem=$(divId);

if(mojo.IE6&&elem){

var tagName=(tag)?tag.toUpperCase():"DIV";
var nodes=elem.parentNode.getElementsByTagName(tagName);
var obj=null;
for(var i=0;i<nodes.length;i++){
obj=nodes[i];
if(obj.currentStyle.backgroundImage.match(/\.png/i)!=null){
mojo.graphics.fnFixPng(obj);
obj.attachEvent("onpropertychange",
mojo.graphics.fnPropertyChanged);
}
}
}
},

fnPropertyChanged:function(){
if(window.event.propertyName=="style.backgroundImage"){
var el=window.event.srcElement;
if(!el.currentStyle.backgroundImage.match(/blank\.gif/i)){
var bg=el.currentStyle.backgroundImage;
el.filters.item(0).src=bg.substring(5,bg.length-2);
el.style.backgroundImage="url(static/images/blank.gif)";
}
}
},

fnFixPng:function(obj){
var bg=obj.currentStyle.backgroundImage;
var src=bg.substring(5,bg.length-2);
obj.style.filter=
"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"
+src+"', sizingMethod='scale')";
obj.style.backgroundImage="url(images/blank.gif)";
}
};



mojo.drag={
SLOP:20,
RESIZE_X:false,
RESIZE_Y:false,
ELEM_OFFSET_X:5,
ELEM_OFFSET_Y:5,
















start:function(event){
if(mojo.drag.isDragging)return;


mojo.drag.state.startEvent=mojo.event.create(event);
mojo.drag.state.startEvent.bodyScrollHeight=
document.body.scrollHeight;
mojo.drag.state.currentEvent=mojo.drag.state.startEvent;

mojo.drag._setListeners();
},







addTarget:function(elem,scrollingContainer){
var target=new Object();
target.element=elem;
target.bounds=mojo.geometry.getBounds(elem);


if(scrollingContainer!=null){
target.bounds.top-=scrollingContainer.scrollTop;
}

mojo.drag._dropTargets.push(target);
},

stop:function(){
mojo.drag._reset();
mojo.drag._clearListeners();
},





onmousemove:function(event){
var evt=mojo.event.create(event);
var state=mojo.drag.state;
state.currentEvent=evt;



mojo.drag._setTargetInfo();


state.dx=state.currentEvent.screenX-state.startEvent.screenX;
state.dy=state.currentEvent.screenY
-state.startEvent.screenY-state.scrollDy;
if(!mojo.drag.isDragging){


if((Math.abs(state.dx)>=mojo.drag.SLOP)||
(Math.abs(state.dy)>=mojo.drag.SLOP)){
if(mojo.drag.onstart(mojo.drag.state)){
mojo.drag.stop();
return;
}
mojo.drag.isDragging=true;

var defaultStartPosition=
mojo.geometry.getBounds(mojo.drag.dragElem);
state.dragElemInitialBounds=defaultStartPosition;
var position=
mojo.drag.onsetstartposition(
state,
defaultStartPosition);
state.startPosition=position||defaultStartPosition;
if(!mojo.drag._isResize()){
mojo.drag._positionDraggableElement(state,true);
}else{
mojo.drag._resizeDraggableElement(state,true);
}
var dragElement=mojo.drag.dragElem;
if(dragElement!=null)mojo.css.show(dragElement);
}
}else{

if(!mojo.drag._isResize()){
mojo.drag._positionDraggableElement(mojo.drag.state);
mojo.drag.onmove(mojo.drag.state);
}else{
mojo.drag._resizeDraggableElement(mojo.drag.state);
}


if(state.target!=null){
if(state._lastTarget==null){
mojo.drag.ontargetover(state.target,state);
}else if(state._lastTarget===state.target){
mojo.drag.ontargetmove(state.target,state);
}else{
mojo.drag.ontargetout(state._lastTarget,state);
mojo.drag.ontargetover(state.target,state);
}
state._lastTarget=state.target;
}else if(state._lastTarget!=null){
mojo.drag.ontargetout(state._lastTarget,state);
state._lastTarget=null;
}
}
},

onmouseup:function(event){
var retval=null;
var evt=mojo.event.create(event);
var state=mojo.drag.state;
state.currentEvent=evt;

var dragElement=mojo.drag.dragElem;
if(dragElement!=null)mojo.css.hide(dragElement);

if(state.target!=null){
mojo.drag.ontargetout(state.target,state);
mojo.drag.ontargetdrop(state.target,state);
}


if(mojo.drag.isDragging){
mojo.drag.onstop(state);
}else{
retval=mojo.drag.onclick(mojo.drag.state,evt);
}

mojo.drag.onfinish();
mojo.drag.stop();

if(retval!=null)return retval;
},

abort:function(){
var dragElement=mojo.drag.dragElem;
if(dragElement!=null)mojo.css.hide(dragElement);
mojo.drag.onfinish();

if(mojo.drag.isDragging){
mojo.drag.stop();
}
},





_reset:function(){
mojo.drag.dragElem=null;
mojo.drag.isDragging=false;

mojo.drag.onstart=mojo.emptyFunction;
mojo.drag.onsetstartposition=mojo.emptyFunction;
mojo.drag.onmove=mojo.emptyFunction;
mojo.drag.onclick=mojo.emptyFunction;
mojo.drag.onstop=mojo.emptyFunction;
mojo.drag.onfinish=mojo.emptyFunction;
mojo.drag.ontargetover=mojo.emptyFunction;
mojo.drag.ontargetmove=mojo.emptyFunction;
mojo.drag.ontargetout=mojo.emptyFunction;
mojo.drag.ontargetdrop=mojo.emptyFunction;
mojo.drag.slop=mojo.drag.SLOP;

mojo.drag.state=new Object();
mojo.drag.state.scrollDy=0;
mojo.drag._dropTargets=new Array();
},

_isResize:function(){
return(mojo.drag.RESIZE_X||mojo.drag.RESIZE_Y);
},

_setListeners:function(){

var doc=document.body.parentNode;
doc.onmouseup=mojo.drag.onmouseup;
doc.onmousemove=mojo.drag.onmousemove;


if(mojo.IE){
doc.ondragstart=function(){return false;};
doc.onselectstart=function(){return false;};
}else{
doc.onmousedown=function(){return false;};
}
doc.__origOnKeyDown=doc.onkeydown;
doc.onkeydown=function(evt){
var event=mojo.event.create(evt);
if(event.keyCode==27){
mojo.drag.abort();
}
}
},

_clearListeners:function(){
var doc=document.body.parentNode;
doc.onmouseup=null;
doc.onmousemove=null;

if(mojo.IE){
doc.ondragstart=null;
doc.onselectstart=null;
}else{
doc.onmousedown=null;
}

doc.onkeydown=doc.__origOnKeyDown;
},

_setTargetInfo:function(){
if(mojo.drag._dropTargets.length==0)return;

var state=mojo.drag.state;
state.target=null;
var cx=state.currentEvent.pageX;
var cy=state.currentEvent.pageY;


for(var i=0;i<mojo.drag._dropTargets.length;i++){
var myTarget=mojo.drag._dropTargets[i];
var b=myTarget.bounds;
var myTop=b.top;
var myLeft=b.left;
if((cx>=myLeft)&&(cx<(myLeft+b.width))&&
(cy>=myTop)&&(cy<(myTop+b.height))){
state.target=myTarget.element;
state.targetX=cx-myLeft;
state.targetY=cy-myTop;
state.targetBounds=b;
break;
}
}
},

_positionDraggableElement:function(state,initial){
if(mojo.drag.dragElem==null)return;

if(initial){
mojo.geometry.setBounds(
mojo.drag.dragElem,
{top:state.startPosition.top,
left:state.startPosition.left})
return;
}

var b=state.dragElemInitialBounds;


var scrollMoveAmount=5;
var bodyST=document.body.scrollTop;
var bodySH=document.body.scrollHeight;
var pageY=state.currentEvent.pageY;
var bodyCH=document.body.clientHeight;
var startBodySH=state.startEvent.bodyScrollHeight;
var startPos=state.startPosition;

var newTop=0;
var newLeft=0;
if(bodyST>0&&(pageY<=(bodyST+10))){

document.body.scrollTop=bodyST-scrollMoveAmount;
state.scrollDy+=scrollMoveAmount;
newTop=bodyST;
}else if((bodyST+bodyCH<bodySH)&&
(pageY>=(bodyST+bodyCH-10))
&&pageY<=startBodySH){

state.scrollDy-=scrollMoveAmount;
document.body.scrollTop=bodyST+scrollMoveAmount;
newTop=startPos.top+state.dy;
}else{

newTop=startPos.top+state.dy;
}
newLeft=startPos.left+state.dx;


var wslop=mojo.IE67?22:0;
var maxBodyWidth=document.body.offsetWidth-b.width-wslop;
if(newLeft<0){
newLeft=0;
}else if(newLeft>(maxBodyWidth)){
newLeft=maxBodyWidth;
}
mojo.geometry.setBounds(mojo.drag.dragElem,{left:newLeft});

var maxBodyHeight=parseInt(document.body.scrollHeight)-b.height;
if(newTop<0){
newTop=0;
}else if(newTop>(maxBodyHeight)){
newTop=maxBodyHeight;
}
mojo.geometry.setBounds(mojo.drag.dragElem,{top:newTop});
},

_resizeDraggableElement:function(state,initial){
if(mojo.drag.dragElem==null)return;

if(initial){
var b=state.dragElemInitialBounds;
var w=parseInt(mojo.drag.dragElem.style.width);
if(!isNaN(w)){
state.initialWidth=w;
}else{
state.initialWidth=b.width;
}

var h=parseInt(mojo.drag.dragElem.style.height);
if(!isNaN(h)){
state.initialHeight=h;
}else{
state.initialHeight=b.height;
}
}

if(mojo.drag.RESIZE_X){
mojo.geometry.setBounds(
mojo.drag.dragElem,
{width:state.initialWidth+state.dx});
}
if(mojo.drag.RESIZE_Y){
mojo.geometry.setBounds(
mojo.drag.dragElem,
{height:state.initialHeight+state.dy});
}
}
};
mojo.drag._reset();

mojo.tree={









create:function(containerID,branchTemplate,leafTemplate,
childrenTemplate,id){
var tree=new MojoTreeWidget(containerID,branchTemplate,leafTemplate,
childrenTemplate,id);
if(id)mojo.tree[id]=tree;

return tree;
}
};


MojoTreeWidget=Class.create();

MojoTreeWidget.ROOT_ID='roottreenode';
MojoTreeWidget.EXPANDED_CLASS='expandedTreeNode';
MojoTreeWidget.COLLAPSED_CLASS='collapsedTreeNode';
MojoTreeWidget.SELECTED_CLASS='selectedTreeNode';

MojoTreeWidget.prototype={
initialize:function(containerID,branchTemplate,
leafTemplate,childrenTemplate,id){
this.id=id;
this.container=$(containerID);
this.branchTemplate=branchTemplate;
this.leafTemplate=leafTemplate;
this.childrenTemplate=childrenTemplate;
if(!this.childrenTemplate){
this.childrenTemplate=
'<div style="display:none;margin-left:21px"></div>';
}

this.all={};
this.root=new MojoTreeNode(MojoTreeWidget.ROOT_ID,true,null,this);
this.root.isExpanded=true;
this.instanceString='javascript:mojo.tree.'+this.id;

this.selectedNode=null;
this.onNodeSelect=mojo.emptyFunction;
this.onBranchNodeClick=mojo.emptyFunction;
this.onNodeUnselect=mojo.emptyFunction;
},

clearSelection:function(){
if(this.selectedNode){
$DC(this.selectedNode.div,MojoTreeWidget.SELECTED_CLASS);
this.onNodeUnselect(this.selectedNode,false);
}
this.selectedNode=null;
},

onClick:function(nodeId,userClick,context){
if(!mojo.isDefined(userClick))userClick=true;

var node=this.all[nodeId];
if(node.isBranch){
var dropClick=this.onBranchNodeClick(node,userClick,context);
if(!dropClick&&!node.isNotCollapsable){
node.toggleChildren();
}
}else{
if(this.selectedNode){
$DC(this.selectedNode.div,MojoTreeWidget.SELECTED_CLASS);
this.onNodeUnselect(this.selectedNode,userClick,context);
}
this.selectedNode=node;
$AC(this.selectedNode.div,MojoTreeWidget.SELECTED_CLASS);
this.onNodeSelect(node,userClick,context);
}
}
};


MojoTreeNode=Class.create();
MojoTreeNode.prototype={
initialize:function(id,isBranch,parent,tree){
this.id=id;
this.isBranch=isBranch;
this.isExpanded=false;
this.parent=parent;
this.tree=tree;
this.div=null;
},

addNode:function(isBranch,tokens,customTemplate,context,tooltips,click){
var me=this;


var nodeId=tokens.id;
if(!nodeId)nodeId='treenode'+mojo.idGenerator++;
tokens.id=nodeId;


var node=new MojoTreeNode(nodeId,isBranch,this,this.tree);


tokens.mojoNodeClickHandler=
this.tree.instanceString+".onClick('"+nodeId+"');";


node.div=this._renderNode(isBranch,tokens,customTemplate,tooltips,click);
node.div.__nodeId=nodeId;
var parentDiv=
this.id==MojoTreeWidget.ROOT_ID?this.tree.container
:this.div.nextSibling;
parentDiv.appendChild(node.div);


if(node.isBranch){





node.div.className+=' '+MojoTreeWidget.COLLAPSED_CLASS;
var containerDiv=
mojo.dom.parseHTMLFragment(this.tree.childrenTemplate);
node.div.parentNode.insertBefore(containerDiv,
node.div.nextSibling);
}


this.tree.all[nodeId]=node;
this.tree.all[nodeId.toLowerCase()]=node;
node.context=context;
return node;
},

remove:function(){

var selectNextNode=null;
if(this.tree.selectedNode===this){
this.tree.selectedNode=null;




var prevSibling=this.div.previousSibling;
var firstLeaf=null;
for(var nodeId in this.tree.all){
var node=this.tree.all[nodeId];
if(node.div==prevSibling){
selectNextNode=node;
break;
}
if(!firstLeaf&&!node.isBranch){
firstLeaf=node;
}
}
if(!selectNextNode)selectNextNode=firstLeaf;
}




delete this.tree.all[this.id];
delete this.tree.all[this.id.toLowerCase()];


if(this.isBranch){

var aDiv=this.div.nextSibling;
this.div.parentNode.removeChild(aDiv);
}

this.div.parentNode.removeChild(this.div);

if(selectNextNode)selectNextNode.select({isFromDeleteNode:true});
},

select:function(context){
this.tree.onClick(this.id,false,context);
if(this.parent){
this.parent.expand();
}
},

expand:function(){
if(!this.isBranch)return;
if(this.isExpanded)return;

this.toggleChildren();
},

toggleChildren:function(){
if(!this.isBranch)return;

var childrenDiv=this.div.nextSibling;
if(!this.isExpanded){
mojo.css.display(childrenDiv,true);
this.div.className=this.div.className.replace(
MojoTreeWidget.COLLAPSED_CLASS,'')+' '+
MojoTreeWidget.EXPANDED_CLASS;
}else{
mojo.css.display(childrenDiv,false);
this.div.className=this.div.className.replace(
MojoTreeWidget.EXPANDED_CLASS,'')+' '+
MojoTreeWidget.COLLAPSED_CLASS;
}
this.isExpanded=!this.isExpanded;
},




_renderNode:function(isBranch,tokens,customTemplate,tooltips,click){
var tmpl=customTemplate;
if(!customTemplate){
tmpl=isBranch?this.tree.branchTemplate:this.tree.leafTemplate;
}

var t=mojo.template.create(tmpl);
t.replaceTokensWithMap(tokens);
if(!isBranch||(isBranch&&!tokens.displayCheck)){
t.replaceToken('tooltipHovers',tooltips);
t.replaceToken('click',click);
}
return mojo.dom.parseHTMLFragment(t.compose());
}
};

mojo.newtabs={
create:function(params){
var tabs=new MojoNewTabs(params);
mojo.newtabs.all[tabs.wiid]=tabs;
return tabs;
}
};
mojo.newtabs.all={};

MojoNewTabs=Class.create();
MojoNewTabs.onGlobalBeforeTabClick=mojo.emptyFunction;
MojoNewTabs.prototype={
initialize:function(params){

this.divTabsId=params.divTabsId;
this.divTabsContentId=params.divTabsContentId;
this.wiid=params.id||('newTabs_'+mojo.idGenerator++);


this.activeClass=params.activeClass||'activeNewTab';
this.tabTemplate=params.usePipedTabs?g_newPipedTabTemplate:g_newTabTemplate;
this.tabContentTemplate=
params.tabContentTemplate||g_newTabContentTemplate;


this.onTabClick=mojo.emptyFunction;

this.all={};
this.active=null;
this.isCached=params.isCached;
this.trackingId=params.trackingId||'widget.Tabs';
},

add:function(params){
var tab={
id:params.id,
contentId:null,
loaded:false,
params:params||{}
};

var onclick=null;
var classes=params.classes||'';

if(mojo.newtabs.onAddTab){
mojo.newtabs.onAddTab(tab,params);
}
if(!params.href)params.href='javascript: void 0;'
onclick=
'return mojo.newtabs.all.'
+this.wiid+'.onActivateViaClick(event, \''+params.id+'\');'

var t=$T(this.tabTemplate);
t.replaceTokensWithMap(params);
t.replaceToken('onclick',onclick);
t.replaceToken('classes',classes);
if(!mojo.isEmpty(this.all)){
t.replaceToken('sep','|');
}else{
t.replaceToken('hideFirstSep','none');
}
t.composeIntoDom($(this.divTabsId));

if(this.isCached){
t=$T(this.tabContentTemplate);
t.replaceTokensWithMap(params);
t.replaceToken('content',params.content||'Loading ...');
var contentElem=t.composeIntoDom($(this.divTabsContentId));
tab.contentId=contentElem.id;
}else{




tab.contentId=this.divTabsContentId;
}

this.all[params.id]=tab;
return tab;
},

onActivateViaClick:function(evt,tabId){
if(mojo.event.isShiftKey(evt))return true;

this.onActivate(tabId);
return false;
},

onActivate:function(tabId){
if(mojo.newtabs.onBeforeActivate){
mojo.newtabs.onBeforeActivate(this.all[tabId]);
}

this.activate(tabId,true);


var tab=this.all[tabId];
if(mojo.newtabs.onActivate){
mojo.newtabs.onActivate(tab);
}
},

activate:function(tabId,isClick){
if(this.active){
$DC(this.active.id,this.activeClass);
mojo.css.display(this.active.contentId,false);
}

this.active=this.all[tabId];
if(this.active==null){
this.active=mojo.util.values(this.all)[0];
}

$AC(this.active.id,this.activeClass);
mojo.css.display(this.active.contentId,true);

if(isClick){

MojoNewTabs.onGlobalBeforeTabClick(this.trackingId,tabId);
}
this.onTabClick(this.active,isClick);
if(this.active.params.onClick){
this.active.params.onClick(this.active,isClick);
}

this.active.loaded=true;
},

deActivate:function(){
if(this.active){
$DC(this.active.id,this.activeClass);
}
},




getActive:function(){
if(!this.active)return null;
return this.active.id;
}
};

mojo.tabs={
create:function(containerID,tabTemplate,id,
tabRegionContainerID,tabRegionTemplate){
var w=new MojoTabWidget(containerID,tabTemplate,
tabRegionContainerID,tabRegionTemplate,id);
if(id){
mojo.tabs[id]=w;
mojo.tabs.all[id]=w;
}
return w;
}
};
mojo.tabs.all={};

MojoTabWidget=Class.create();
MojoTabWidget.prototype={
initialize:function(containerID,tabTemplate,
tabRegionContainerID,tabRegionTemplate,id){
if(tabRegionTemplate){
var t=tabRegionTemplate;
this._tabRegionTemplate=mojo.template.create(t);
if(id)this._tabRegionTemplate.replaceToken('wiid',id);
this._tabRegionContainerID=
tabRegionContainerID?tabRegionContainerID:'mojoTabContainer';
mojo.setContent(this._tabRegionContainerID,
this._tabRegionTemplate.compose());
}
this._container=$(containerID);

this._tabTemplate=mojo.template.create(tabTemplate);

this.activeTab=null;
this.activeClass='on';
this.inactiveClass='off';
this.firstTabClass='first';
this.myTabs=null;
this._tabsOrder=null;
this.ontabclick=function(tab){};
},

addTab:function(id,tokens){
var tab={'id':id,'widget':this};
tokens.id=id;


if(this.myTabs==null)tokens.isFirst=this.firstTabClass;
this._tabTemplate.replaceTokensWithMap(tokens);
var html=this._tabTemplate.compose();

if(tokens.prependHtml){
this._container.appendChild(mojo.dom.parseHTMLFragment('<div>'+tokens.prependHtml+'</div>'));
}

var div=mojo.dom.parseHTMLFragment(html);
this._container.appendChild(div);

if(tokens.appendHtml){
this._container.appendChild(mojo.dom.parseHTMLFragment('<div>'+tokens.appendHtml+'</div>'));
}


var a=div.getElementsByTagName('A')[0];
var ticket=mojo.baggage.check(this);
a.href="javascript:mojo.baggage.claim("+ticket+
").activateTab('"+id+"');";
tab.a=a;
tab.div=div;
mojo.css.removeClass(a,this.activeClass);
mojo.css.addClass(a,this.inactiveClass);

if(this.myTabs==null)this.myTabs={};
this.myTabs[id]=tab;
if(this._tabsOrder==null)this._tabsOrder=[];
this._tabsOrder.push(tab);

return tab;
},

getNumberOfTabs:function(){
return(this._tabsOrder?this._tabsOrder.length:0);
},

removeTab:function(id){
var tab=this.myTabs[id];
if(tab!=null){

delete this.myTabs[id];
var i=0;
for(i=0;i<this._tabsOrder.length;++i){
if(this._tabsOrder[i]==tab){
break;
}
}
this._tabsOrder.splice(i,1);

var elem=$(id+"Tab");
if(elem!=null){
elem.parentNode.removeChild(elem);
}

var newTab=this._tabsOrder[i];
if(newTab==null&&this._tabsOrder.length>0){
newTab=this._tabsOrder[0];
}
if(newTab!=null)this.activateTab(newTab.id);
}
},

setTabTitle:function(id,newTitle){
var tabElem=$(id+"Tab");
if(tabElem){
tabElem.innerHTML=newTitle;
}
},

getFirstTab:function(){
if(this._tabsOrder&&this._tabsOrder.length>0){
return this._tabsOrder[0];
}
return null;
},

activateTab:function(id,ctx,nocallback,force){
var newTab=this.myTabs[id];
if(!force&&this.activeTab==newTab)return;

this.prevActiveTab=this.activeTab;

if(this.activeTab!=null){
mojo.css.removeClass(this.activeTab.a,this.activeClass);
mojo.css.addClass(this.activeTab.a,this.inactiveClass);
}


this.activeTab=newTab;
mojo.css.removeClass(newTab.a,this.inactiveClass);
mojo.css.addClass(newTab.a,this.activeClass);
if(!nocallback)this.ontabclick(newTab,ctx);
}
};

mojo.widget={};
mojo.widget.inplaceEdit={
EDITABLE_HOVER:
"onmouseover=\"if (mojo.widget.inplaceEdit.isOpen) return; "+
"this.__oldColor = this.style.backgroundColor; "+
"this.style.backgroundColor = '#efefef'; \" "+
"onmouseout=\"this.style.backgroundColor= this.__oldColor; \"",
EDITABLE_CLASS:"mojoEditable",






open:function(theEvent){
var evt=mojo.event.create(theEvent);
var src=evt.target;
mojo.widget.inplaceEdit.src=src;
if(!mojo.css.containsClass(src,'mojoEditable'))return;

if(!$('mojoInplaceEdit')){
var html=
'<div id="mojoInplaceEdit">'
+'<input type="text" id="mojoInplaceEditField" />'
+'</div>';
mojo.dom.parseHTMLFragment(html,document.body);
}


var currVal=src.innerHTML.ltrim();
if(currVal=='&nbsp;')currVal='';
currVal=currVal.lunescapeHTML();
mojo.widget.inplaceEdit.currVal=currVal;


if(this.onOpen(src,currVal))return;

var div=$('mojoInplaceEdit');
var field=$('mojoInplaceEditField');
var srcBounds=mojo.geometry.getBounds(src);


this.isOpen=true;
this.openElement=src;

mojo.geometry.setBounds(div,{height:srcBounds.height,
width:srcBounds.width-4,
top:srcBounds.top,
left:srcBounds.left+2});
field.value=currVal;

mojo.css.display(div,true);
field.select();
field.focus();

mojo.dom.setEventListener(
field,
'onkeypress',
function(event){
var evt=event?event:window.event;
if(evt.keyCode==13){
var newVal=$F('mojoInplaceEditField');
if(currVal!=newVal){

mojo.widget.inplaceEdit.onSubmit(
src,currVal,newVal);
}else{
mojo.widget.inplaceEdit.close();
}
}else if(evt.keyCode==27){
mojo.widget.inplaceEdit.close();
}
});

if(this.afterOpen)this.afterOpen(src,currVal);
},

onKeyPress:function(event){
var evt=event?event:window.event;

if(evt.keyCode==13){
var newVal=$F('mojoInplaceEditField');
if(mojo.widget.inplaceEdit.currVal!=newVal){

mojo.widget.inplaceEdit.onSubmit(
mojo.widget.inplaceEdit.src,mojo.widget.inplaceEdit.currVal,newVal);
}else{
mojo.widget.inplaceEdit.close();
}
}else if(evt.keyCode==27){
mojo.widget.inplaceEdit.close();
}
},

close:function(isRerender){
this.isOpen=false;
this.openElement=null;

mojo.css.display('mojoInplaceEdit',false);
if(this.onClose)this.onClose();
}
};










MojoDialog=Class.create();
MojoDialog.all={};
MojoDialog._resizeListenerAdded=false;
MojoDialog.DIV_SHIELD_ID='mojoDialogDivShield';
MojoDialog._openInstance=null;
MojoDialog.onBeforeOpen=mojo.emptyFunction;
MojoDialog.close=function(isCancel,closeId){
if(MojoDialog._openInstance){
if(MojoDialog._openInstance.preventCloseId){
if(MojoDialog._openInstance.preventCloseId!=closeId)return;
}
if(isCancel){
MojoDialog._openInstance.onCancel();
}
MojoDialog._openInstance.close();
}
};

MojoDialog.prototype={
initialize:function(params){
this.wiid=params.id||'dialog_'+mojo.idGenerator++;
this.title=params.title||'';
this.disableEscape=params.disableEscape||false;
this.offsets=params.offsets||{};
this.bounds=params.bounds;
this.mode=params.mode||'dropShadow';
this.hideClose=params.hideClose;
this.closeOnScroll=params.closeOnScroll;
this.contextualElemId=params.contextualElemId||null;
this._isModal=mojo.isDefined(params.isModal)?params.isModal:true;
this.shouldCenter=mojo.isDefined(params.shouldCenter)?params.shouldCenter:true;
this.preventCloseId=params.preventCloseId;
this.dialogContainerId='modalDialogContainer';
this.useFixed=mojo.FF;
this.box=null;
this.backgroundColor=params.backgroundColor;

if(this.contextualElemId){
this._isModal=false;
}

if(!$(this.dialogContainerId)){
mojo.dom.parseHTMLFragment('<div id="'
+this.dialogContainerId+'" onclick="mojo.event.create(event).stopPropagation();"></div>',document.body);
}

if(!$(MojoDialog.DIV_SHIELD_ID)){
mojo.dom.parseHTMLFragment(
'<div class="modalShield" id="'
+MojoDialog.DIV_SHIELD_ID+'"></div>',document.body);
}

var self=this;
if(!MojoDialog._resizeListenerAdded){
mojo.dom.addEventListener(window,'onresize',function(){
if(MojoDialog._openInstance
&&MojoDialog._openInstance._isModal){
self.showModalShield(true);
}
});
MojoDialog._resizeListenerAdded=true;
}

if(this.closeOnScroll){
mojo.dom.addEventListener(mojo.IE?window:document,'onscroll',MojoDialog.close);
}else{
mojo.dom.removeEventListener(mojo.IE?window:document,'onscroll',MojoDialog.close);
}

this.isOpen=false;

this.onOpen=mojo.emptyFunction;
this.onClose=mojo.emptyFunction;
this.onCancel=mojo.emptyFunction;

MojoDialog.all[this.wiid]=this;
},

open:function(content,title,replaceContent,rightOrBottomContent,skipBeforeOpen){
MojoDialog.close();
mojo.pulldown.hide();


if(!skipBeforeOpen)MojoDialog.onBeforeOpen();

if(title)this.title=title;

if(!this.isOpen||replaceContent){
if(this._isModal){
this.showModalShield(true);
}

mojo.css.hide(this.dialogContainerId);
mojo.css.display(this.dialogContainerId,true);
$S(this.dialogContainerId,'<div id="'+this.wiid+'"></div>');

this._renderDialog(content,rightOrBottomContent);

if(this.contextualElemId){
this.bounds=this._getContextualElemBounds();






var fn=function(evt){
if(!mojo.dialogDragFinished){
MojoDialog.close();
document.body.onclick=null;
}
mojo.dialogDragFinished=false;
};
mojo.dom.setEventListener(document.body,'onclick',fn);
}

this._positionDialog();
}
MojoDialog._openInstance=this;

var self=this;
if(!this.disableEscape){
var escapeFn=function(){
if(MojoDialog._openInstance){
self.close();
self.onCancel();
}
};
var targ=mojo.IE?document.body:window;
mojo.event.onEscapeKey(targ,escapeFn);
}

var d=this.getDraggableElem();
var cb=function(event){
self.makeDraggable(event);
}
if(d){
d.onmousedown=cb;
d.style.cursor='move';
}


if(mojo.IE6)mojo.util.hideSelects();



var offsets=this.onOpen();
if(offsets){
var currBounds=$B(this.dialogContainerId);
var newBounds={
left:offsets.left?currBounds.left+offsets.left:currBounds.left,
top:offsets.top?currBounds.top+offsets.top:currBounds.top
}
mojo.geometry.setBounds(this.dialogContainerId,newBounds);
}
},

_renderDialog:function(content,rightOrBottomContent){
var params={
mode:this.mode,
renderTargetId:this.wiid,
backgroundColor:this.backgroundColor
};
if(this.mode=='vertTwoTone'){
params.leftBGColor='#FFFFFF';
params.rightBGColor='#F1F1F1';
}

var titleArea=$T(g_genericDialogTitle)
.removeTokenBlock('CloseButton',this.hideClose)
.replaceToken('title',this.title)
.replaceToken('wiid',this.wiid)
.replaceToken('closeId',this.preventCloseId)
.compose();

if(this.mode=='dropShadowBox'){
new widgets.core.DropShadowBoxWidget({renderTargetId:this.wiid})
.render(titleArea+content);
}else{
this.box=new widgets.core.RoundedBox(params).render();
var renderId=this.box.contentId;

if(this.mode=='horizTwoTone'){
content=titleArea+content;
renderId=this.box.topContentId;
$S(this.box.bottomContentId,rightOrBottomContent);
}else if(this.mode=='vertTwoTone'){
rightOrBottomContent=titleArea+rightOrBottomContent;
renderId=this.box.leftContentId;
$S(this.box.rightContentId,rightOrBottomContent);
}else{
content=titleArea+content;
}
$T(g_genericDialogTemplate,renderId)
.replaceToken('content',content)
.replaceToken('wiid',this.wiid)
.compose();
}
},

_getContextualElemBounds:function(){
var FIXED_WIDTH=970;
var HEADER_HEIGHT=95;
var targetBounds=mojo.geometry.getBounds(this.contextualElemId);
var newTop=targetBounds.top+targetBounds.height;

var newLeft=targetBounds.left-20;

var contentBounds=$B(this.dialogContainerId);
var viewBounds=mojo.geometry.getViewportBounds();
var scrollTop=mojo.geometry.getScrollY();

var contentBottom=newTop+contentBounds.height;
var screenBottom=scrollTop+viewBounds.height;



if(contentBottom>screenBottom){
newTop-=contentBounds.height+targetBounds.height;
this.nearBottomOfPage=true;
}else{
this.nearBottomOfPage=false;
}
if(newTop<20)newTop=HEADER_HEIGHT+scrollTop;
if(!this.fixedScrollingContainerId){


if(mojo.FF)newTop-=scrollTop;
}else{

if(!mojo.FF&&!mojo.IE6)newTop+=scrollTop;
}



var gutterWidth=viewBounds.width-FIXED_WIDTH;
if(gutterWidth<=0)gutterWidth=0;
else gutterWidth=gutterWidth/2;


if(newLeft-gutterWidth<=0){
newLeft=gutterWidth+10;
}

var contentRight=newLeft+contentBounds.width;
var fixedContentRight=viewBounds.width-gutterWidth;
if(fixedContentRight<contentRight){
newLeft=fixedContentRight-contentBounds.width-10;
}

if(this.fixedScrollingContainerId){


newTop-=$(this.fixedScrollingContainerId).scrollTop;
}
var st=mojo.FF?0:scrollTop;
if(newTop<(HEADER_HEIGHT+st)){
newTop=HEADER_HEIGHT+st;
}

return{top:newTop,left:newLeft};
},

_positionDialog:function(){

mojo.css.display(this.dialogContainerId,true);
$(this.dialogContainerId).style.position=this.useFixed
?"fixed":"absolute";
if(this.bounds){
if(!this.nearBottomOfPage){
if(this.bounds.top&&this.offsets.top)this.bounds.top+=this.offsets.top;
if(this.bounds.left&&this.offsets.left)this.bounds.left+=this.offsets.left;
}
mojo.geometry.setBounds(this.dialogContainerId,this.bounds);
}else if(this.shouldCenter){
mojo.geometry.centerInVisibleArea(this.dialogContainerId,this.offsets);
}
mojo.css.show(this.dialogContainerId);
this.isOpen=true;
},

setLeftContent:function(html){
$S(this.box.leftContentId,html);
},

setRightContent:function(html){
$S(this.box.rightContentId,html);
},

close:function(){


if(mojo.autocomplete.visibleAutocomplete){
mojo.autocomplete.visibleAutocomplete.hide();
return;
}
if(this.isOpen){
if(this._isModal){
this.showModalShield(false);
}
var dialogContainer=$(this.dialogContainerId);
mojo.css.display(dialogContainer,false);
$S(dialogContainer,"");
this.isOpen=false;


if(mojo.IE6)mojo.util.showSelects();

this.onClose();
}
MojoDialog._openInstance=null;
},

getDraggableElem:function(){
return $('dialogTitle');
},

makeDraggable:function(evt,xdir,ydir){
var me=this;
this.setOldDragState();

var titleId=this.dialogContainerId;
mojo.drag.onstart=function(){

mojo.drag.dragElem=$(titleId);

mojo.drag.RESIZE_X=(xdir)?true:false;
mojo.drag.RESIZE_Y=(ydir)?true:false;

};
mojo.drag.onmouseup=function(event){
mojo.drag.stop(event);

me.restoreOldDragState();
mojo.dialogDragFinished=true;
};
mojo.drag.onstop=function(event){
mojo.dialogDragFinished=false;
}

mojo.drag.start(evt);
},

setOldDragState:function(){
var o=this.oldDragState={};

o.onstart=mojo.drag.onstart;
o.onmouseup=mojo.drag.onmouseup;
o.useConstOffset=mojo.drag.useConstOffset;
o.offsetX=mojo.drag.ELEM_OFFSET_X;
o.offsetY=mojo.drag.ELEM_OFFSET_Y;
},

restoreOldDragState:function(){
var o=this.oldDragState;
mojo.drag.onstart=o.onstart;
mojo.drag.onmouseup=o.onmouseup;
mojo.drag.useConstOffset=o.useConstOffset;
mojo.drag.ELEM_OFFSET_X=o.offsetX;
mojo.drag.ELEM_OFFSET_Y=o.offsetY;
},

showModalShield:function(show,divShield){
if(divShield==null)divShield=$(MojoDialog.DIV_SHIELD_ID);
if(mojo.IE6){
mojo.geometry.setBounds(
divShield,
{height:parseInt(document.body.scrollHeight)});
}else if(mojo.IE){
mojo.geometry.setBounds(
divShield,
{height:document.body.scrollHeight});
}else if(mojo.FF){
mojo.geometry.setBounds(
divShield,
{height:window.scrollMaxY+window.innerHeight});
}else if(mojo.WEBKIT){
mojo.geometry.setBounds(
divShield,
{top:mojo.geometry.getScrollY()});
}
mojo.css.display(divShield,show);
mojo.css.show(divShield);
}
};

mojo.carousel={
all:{},
_openInstance:null,

create:function(params){
var w=new MojoCarousel(params);
mojo.carousel.all[w.wiid]=w;
return w;
}
};

MojoCarousel=Class.create();
MojoCarousel.prototype={
initialize:function(params){
this.html=params.html;
this.wiid=params.id||('carousel_'+mojo.idGenerator++);
this.renderTargetId=params.renderTargetId;

this.viewPortDivId='carouselViewportDiv_'+this.wiid;
this.containerDivId='carouselContainerDiv_'+this.wiid;
this.controlsDivId=params.controlsDivId||'carouselControlsDiv_'+this.wiid;
this.list=params.list;
this.numCols=params.numCols;
this.numRows=params.numRows;
this.parentDivId=params.parentDivId;
this.trackingId=params.trackingId;
this.ie6HackDivId=params.ie6HackDivId;
this.onStateChange=params.onStateChange;

var t=$T(lt.Carousel.main,this.renderTargetId)
.replaceTokensWithMap({viewPortDivId:this.viewPortDivId,
controlsDivId:this.controlsDivId,
containerDivId:this.containerDivId});
t.compose();

this.pages=[];
this.speedFactor=1;
this.firstPageCopyDiv=null;
this.FP_VERT=(mojo.FF&&this.numRows>=2)?25:20;
this.ANIMATE_INTERVAL=(mojo.FF&&this.numRows>=2)?10:mojo.FF?25:32;
this._isActivated=false;

this.isExpanded=false;
},

onPagingCallback:function(){
lala.Track.click(this.trackingId+'Paging');
},







addPage:function(params,func){
var self=this;
var page={
render:function(){
var t=$T(lt.Carousel.item);
var done=0;
var itemRow=t.getTokenBlock('RowBlock');
for(var j=0;j<params.numRows;j++){
var itemIter=itemRow.getTokenBlock('ItemBlock');
for(var k=0;k<params.numCols;k++){
if(done>=params.items.length){
itemIter.replaceToken('itemContent','&nbsp;')
}else{
var item=params.items[j*params.numCols+k];
func(itemIter,item,self.trackingId);
}
itemIter.replaceToken('height',params.thumbHeight);
itemIter.next();
done++;
}
itemRow.next();
}
var pageDiv;
if(self.pages.length==0){
pageDiv=t.composeIntoDom(self.containerDivId);
}else{
pageDiv=mojo.dom.parseHTMLFragment(t.compose());
self.firstPageCopyDiv.parentNode.insertBefore(
pageDiv,self.firstPageCopyDiv);
}
return pageDiv;
}
};
page.render();
if(this.pages.length==0){


this.firstPageCopyDiv=page.render();

}
this.pages.push(page);
},

activate:function(doExpand,pageIndex){
if(!pageIndex)pageIndex=0;
this.selectedIndex=parseInt(pageIndex);
this.doSizing(pageIndex);

if(this.pages.length>1){

mojo.geometry.setBounds(this.controlsDivId,
{height:$B(this.parentDivId).height});
var t=$T(lt.Carousel.controls,this.controlsDivId)
.replaceToken('wiid',this.wiid);
var pb=t.getTokenBlock('PageBlock');
for(var i=0;i<this.pages.length;i++){
pb.replaceToken('selected',this.selectedIndex==i?'selected':'')
pb.replaceToken('index',i)
pb.next();
}
t.compose();
}
this._isActivated=true;
if(doExpand)this.onExpand();
if(this.selectedIndex!=0)this.selectPage(this.selectedIndex,true,true);
},

doSizing:function(pageIndex){

this.itemHeight=$B(this.firstPageCopyDiv).height;
mojo.geometry.setBounds(this.containerDivId,{top:-1*this.itemHeight*pageIndex});
mojo.geometry.setBounds(this.viewPortDivId,{height:this.itemHeight});
if(mojo.WEBKIT){
this.itemWidth=$B(this.firstPageCopyDiv).width;
mojo.geometry.setBounds(this.viewPortDivId,{width:this.itemWidth});
}

},

isActivated:function(){
return this._isActivated;
},

selectPage:function(index,skipSameCheck,skipScroll){
if(this.animateInterval){
clearInterval(this.animateInterval);
this.animateInterval=null;
}
var from=this.selectedIndex;
var to=index;
if(!skipSameCheck&&from==to)return;
this.updateIndex(to);
var isUp=from-to>0;
this.speedFactor=from==to?1:Math.abs(from-to);
if(!skipScroll)this.doScroll(isUp,from,to);
this.onPagingCallback();
},

onPageClick:function(index){
this.selectPage(index);
this.onStateChange();
},

onDirClick:function(isUp){
if(this.animateInterval){
if(this.speedFactor<4){
this.speedFactor++;
}
clearInterval(this.animateInterval);
this.animateInterval=null;
}
var from=this.selectedIndex;
var to=this.selectedIndex+(isUp?-1:1);
this.updateIndex(to);


if(to<0){
from=this.pages.length;
to=this.selectedIndex;
}
this.doScroll(isUp,from,to);
this.onPagingCallback();
this.onStateChange();
},

doScroll:function(isUp,from,to){
var self=this;
var start=(isUp?-1:1)*from*this.itemHeight;
var end=(isUp?-1:1)*to*this.itemHeight;
var currPos=(isUp?1:-1)*mojo.css.getComputedStyle(
this.containerDivId,
'top',
true);
var cursor=currPos<end?currPos:start;
var f=function(){
if(mojo.FF){
mojo.geometry.setBounds(self.containerDivId,
{top:(isUp?1:-1)*end});
clearInterval(self.animateInterval);
self.animateInterval=null;
self.speedFactor=1;
}else{
cursor+=self.speedFactor*self.FP_VERT;
if(cursor<end){
mojo.geometry.setBounds(self.containerDivId,
{top:(isUp?1:-1)*cursor});
}else{
mojo.geometry.setBounds(self.containerDivId,
{top:(isUp?1:-1)*end});
clearInterval(self.animateInterval);
self.animateInterval=null;
self.speedFactor=1;
}
}
};
this.animateInterval=window.setInterval(f,this.ANIMATE_INTERVAL);
},

onUpClick:function(skipCheck){
this.onDirClick(true);
},

onDownClick:function(skipCheck){
this.onDirClick(false);
},

updateIndex:function(newIndex){
if(newIndex==this.pages.length){
newIndex=0;
}else if(newIndex<0){
newIndex=this.pages.length-1;
}
$DC('carouselPageControl_'
+this.wiid
+'_'
+this.selectedIndex,'selected');
$AC('carouselPageControl_'
+this.wiid
+'_'
+newIndex,'selected');
this.selectedIndex=newIndex;
},

onExpand:function(){
this.itemHeight=$B(this.firstPageCopyDiv).height;
var controlsHeight=$B(this.parentDivId).height;
if(!this.isExpanded){

this.enableControlButtons(false);

mojo.geometry.setBounds(this.renderTargetId+"_controls",{height:controlsHeight});
mojo.geometry.setBounds(this.containerDivId,{top:0});
mojo.geometry.setBounds(this.viewPortDivId,{height:this.pages.length*this.itemHeight});
this.isExpanded=true;
}else{
this.enableControlButtons(true);
mojo.geometry.setBounds(this.containerDivId,{top:-1*this.itemHeight*this.selectedIndex});
mojo.geometry.setBounds(this.viewPortDivId,{height:this.itemHeight});
this.isExpanded=false;
}

this.fixIE6ShadowAndMoreLink();
this.onStateChange();
},

fixIE6ShadowAndMoreLink:function(){
if(!mojo.IE6)return;
mojo.geometry.setBounds(
this.renderTargetId+'_shadow',
{top:$B(this.ie6HackDivId).height});
if($(this.renderTargetId+'_moreDiv')){
mojo.geometry.setBounds(
this.renderTargetId+'_moreDiv',
{top:$B(this.ie6HackDivId).height-11});
}
},

enableControlButtons:function(bool){
if(bool){
$DC(this.wiid+'_upButton','dimUp');
$AC(this.wiid+'_upButton','up');
$DC(this.wiid+'_downButton','dimDown');
$AC(this.wiid+'_downButton','down');
$DC(this.wiid+'_expandButton','collapse');
$AC(this.wiid+'_expandButton','expand');
for(var i=0;i<this.pages.length;i++){
$DC($('carouselPageControl_'+this.wiid+'_'+i),'disabled');
}
}else{
$AC(this.wiid+'_upButton','dimUp');
$DC(this.wiid+'_upButton','up');
$AC(this.wiid+'_downButton','dimDown');
$DC(this.wiid+'_downButton','down');
$AC(this.wiid+'_expandButton','collapse');
$DC(this.wiid+'_expandButton','expand');
for(var i=0;i<this.pages.length;i++){
$AC($('carouselPageControl_'+this.wiid+'_'+i),'disabled');
}
}
}

};

mojo.history={
onBack:mojo.emptyFunction,

_init:false,
_state:null,
_frameUrl:null,

init:function(frameUrl,defState){
mojo.history._init=true;
mojo.history._frameUrl=frameUrl;

var appearsToBeReload=false;
try{
var url=frames.historyFrame.location.href;
if(url.indexOf("about:blank")==-1){
appearsToBeReload=true;
}
}catch(e){}


if(!appearsToBeReload)mojo.history._incrHistory();

return mojo.history._state;
},

push:function(state){
if(!mojo.history._init)return;

if(state){

mojo.history._state=state;
mojo.history._incrHistory();
}
},

_incrHistory:function(){

if(mojo.history._backPending)return;

var iframe=frames.historyFrame;
if(iframe){
iframe.location.href="about:blank";
iframe.location.href="javascript:parent.mojo.history._getFrameLoaderHtml()";
}
},

_getFrameLoaderHtml:function(){
return"<html><head><script>"
+"location.replace('"+mojo.history._frameUrl+"');"
+"</"+"script></head></html>'";
},

_iframeLoaded:function(historyState){

if(historyState==null)return null;

if(mojo.history._init){
mojo.history._backPending=true;
mojo.history.onBack(historyState);
mojo.history._backPending=false;
}else{

mojo.history._state=historyState;
}
}
};

mojo.test={
Dates:function(){
var now=new Date();
var dates={
sec1:new Date(now.getTime()-1*1000),
sec2:new Date(now.getTime()-2*1000),
sec4:new Date(now.getTime()-4*1000),
sec8:new Date(now.getTime()-8*1000),
sec16:new Date(now.getTime()-16*1000),
sec32:new Date(now.getTime()-32*1000),

min1:new Date(now.getTime()-1*60*1000),
min2:new Date(now.getTime()-2*60*1000),
min4:new Date(now.getTime()-4*60*1000),
min8:new Date(now.getTime()-8*60*1000),
min16:new Date(now.getTime()-16*60*1000),
min32:new Date(now.getTime()-32*60*1000),

hour1:new Date(now.getTime()-1*60*60*1000),
hour2:new Date(now.getTime()-2*60*60*1000),
hour4:new Date(now.getTime()-4*60*60*1000),
hour8:new Date(now.getTime()-8*60*60*1000),
hour10:new Date(now.getTime()-10*60*60*1000),
hour12:new Date(now.getTime()-12*60*60*1000),
hour16:new Date(now.getTime()-16*60*60*1000),
hour18:new Date(now.getTime()-18*60*60*1000),
hour20:new Date(now.getTime()-20*60*60*1000),
hour22:new Date(now.getTime()-22*60*60*1000),
hour32:new Date(now.getTime()-32*60*60*1000),

day1:new Date(now.getTime()-1*24*60*60*1000),
day2:new Date(now.getTime()-2*24*60*60*1000),
day4:new Date(now.getTime()-4*24*60*60*1000),
day8:new Date(now.getTime()-8*24*60*60*1000),
day16:new Date(now.getTime()-16*24*60*60*1000),

day31:new Date(now.getTime()-31*24*60*60*1000),
day32:new Date(now.getTime()-32*24*60*60*1000),
day33:new Date(now.getTime()-33*24*60*60*1000),
day64:new Date(now.getTime()-64*24*60*60*1000),
day128:new Date(now.getTime()-128*24*60*60*1000),
day256:new Date(now.getTime()-256*24*60*60*1000),
day364:new Date(now.getTime()-364*24*60*60*1000),
day365:new Date(now.getTime()-365*24*60*60*1000),
day366:new Date(now.getTime()-366*24*60*60*1000),
day367:new Date(now.getTime()-367*24*60*60*1000),
day368:new Date(now.getTime()-368*24*60*60*1000),
day512:new Date(now.getTime()-512*24*60*60*1000)
};

var html="<table>";
html+="<tr>"
+"<td style='color:white'>now</td>"
+"<td style='color:white'> &nbsp; </td>"
+"<td style='color:white'>"+now+"</td>"
+"</tr>";
var arr=mojo.util.keys(dates);
arr.leach(function(dateKey){
html+="<tr>"
+"<td style='color:white'>"+dates[dateKey].lgetDaysAgoLabel()+" &nbsp; &nbsp; </td>"
+"<td style='color:white'>"+dateKey+" &nbsp; &nbsp; </td>"
+"<td style='color:white'>"+dates[dateKey]+"</td>"
+"</tr>";
});
html+="</table>";
mojo.log.info(html);
}
};

mojo.serialize={



































toJavaScript:function(aThing){
return this._encodeThing(aThing);
},

_encodeThing:function(aThing){
var myType=typeof(aThing);

switch(myType){
case'string':
return this._onencodestring(aThing);
case'number':
return this._onencodenumber(aThing);
case'boolean':
return this._onencodeboolean(aThing);
case'object':
if(aThing==null){
return'null';
}else if(mojo.isDate(aThing)){
return this._onencodedate(aThing);
}else if(mojo.isArray(aThing)){
return this._onencodearray(aThing);
}else{
return this._onencodeobject(aThing);
}
case'function':
mojo.impossible("Can't encode functions");
break;
case'undefined':
mojo.impossible('Undefined type encountered during encoding');
return'void 0';
case'unknown':
mojo.impossible("Can't encode unknown values");
break;
}
mojo.impossible('Encountered unexpected value type: "'+myType+'"');
},

_onencodeobject:function(aVal){
var s='{';
var sep='';

for(var myKey in aVal){
var myValue=this._encodeThing(aVal[myKey]);
s+=sep+this._quoteKey(myKey)+':'+myValue;
sep=',\n';
}
s+='}';

return s;
},

_onencodearray:function(aVal){
var s='[';
var sep='';

for(var i=0;i<aVal.length;i++){
var myValue=this._encodeThing(aVal[i]);
s+=sep+myValue;
sep=',\n';
}
s+=']';

return s;
},

_onencodedate:function(aVal){
return'new Date(\''+aVal.toGMTString()+'\')';
},

_onencodestring:function(aVal){
var myVal=aVal.replace(/'/g,'\\\'');
myVal=myVal.replace(/\n/g,'\\n');
return'\''+myVal+'\'';
},

_onencodenumber:function(aVal){
return aVal.toString();
},

_onencodeboolean:function(aVal){
return aVal?'true':'false';
},

_quoteKey:function(aKey){
aKey=aKey.replace(/\'/g,'\\\'');
return'\''+aKey+'\'';
}
};

mojo.md5={













_hexcase:0,
_b64pad:"",
_chrsz:8,





hex_md5:function(s){return this.binl2hex(this.core_md5(this.str2binl(s),s.length*this._chrsz));},
b64_md5:function(s){return this.binl2b64(this.core_md5(this.str2binl(s),s.length*this._chrsz));},
str_md5:function(s){return this.binl2str(this.core_md5(this.str2binl(s),s.length*this._chrsz));},
hex_hmac_md5:function(key,data){return this.binl2hex(this.core_hmac_md5(key,data));},
b64_hmac_md5:function(key,data){return this.binl2b64(this.core_hmac_md5(key,data));},
str_hmac_md5:function(key,data){return this.binl2str(this.core_hmac_md5(key,data));},




md5_vm_test:function()
{
return this.hex_md5("abc")=="900150983cd24fb0d6963f7d28e17f72";
},




core_md5:function(x,len)
{

x[len>>5]|=0x80<<((len)%32);
x[(((len+64)>>>9)<<4)+14]=len;

var a=1732584193;
var b=-271733879;
var c=-1732584194;
var d=271733878;

for(var i=0;i<x.length;i+=16)
{
var olda=a;
var oldb=b;
var oldc=c;
var oldd=d;

a=this.md5_ff(a,b,c,d,x[i+0],7,-680876936);
d=this.md5_ff(d,a,b,c,x[i+1],12,-389564586);
c=this.md5_ff(c,d,a,b,x[i+2],17,606105819);
b=this.md5_ff(b,c,d,a,x[i+3],22,-1044525330);
a=this.md5_ff(a,b,c,d,x[i+4],7,-176418897);
d=this.md5_ff(d,a,b,c,x[i+5],12,1200080426);
c=this.md5_ff(c,d,a,b,x[i+6],17,-1473231341);
b=this.md5_ff(b,c,d,a,x[i+7],22,-45705983);
a=this.md5_ff(a,b,c,d,x[i+8],7,1770035416);
d=this.md5_ff(d,a,b,c,x[i+9],12,-1958414417);
c=this.md5_ff(c,d,a,b,x[i+10],17,-42063);
b=this.md5_ff(b,c,d,a,x[i+11],22,-1990404162);
a=this.md5_ff(a,b,c,d,x[i+12],7,1804603682);
d=this.md5_ff(d,a,b,c,x[i+13],12,-40341101);
c=this.md5_ff(c,d,a,b,x[i+14],17,-1502002290);
b=this.md5_ff(b,c,d,a,x[i+15],22,1236535329);

a=this.md5_gg(a,b,c,d,x[i+1],5,-165796510);
d=this.md5_gg(d,a,b,c,x[i+6],9,-1069501632);
c=this.md5_gg(c,d,a,b,x[i+11],14,643717713);
b=this.md5_gg(b,c,d,a,x[i+0],20,-373897302);
a=this.md5_gg(a,b,c,d,x[i+5],5,-701558691);
d=this.md5_gg(d,a,b,c,x[i+10],9,38016083);
c=this.md5_gg(c,d,a,b,x[i+15],14,-660478335);
b=this.md5_gg(b,c,d,a,x[i+4],20,-405537848);
a=this.md5_gg(a,b,c,d,x[i+9],5,568446438);
d=this.md5_gg(d,a,b,c,x[i+14],9,-1019803690);
c=this.md5_gg(c,d,a,b,x[i+3],14,-187363961);
b=this.md5_gg(b,c,d,a,x[i+8],20,1163531501);
a=this.md5_gg(a,b,c,d,x[i+13],5,-1444681467);
d=this.md5_gg(d,a,b,c,x[i+2],9,-51403784);
c=this.md5_gg(c,d,a,b,x[i+7],14,1735328473);
b=this.md5_gg(b,c,d,a,x[i+12],20,-1926607734);

a=this.md5_hh(a,b,c,d,x[i+5],4,-378558);
d=this.md5_hh(d,a,b,c,x[i+8],11,-2022574463);
c=this.md5_hh(c,d,a,b,x[i+11],16,1839030562);
b=this.md5_hh(b,c,d,a,x[i+14],23,-35309556);
a=this.md5_hh(a,b,c,d,x[i+1],4,-1530992060);
d=this.md5_hh(d,a,b,c,x[i+4],11,1272893353);
c=this.md5_hh(c,d,a,b,x[i+7],16,-155497632);
b=this.md5_hh(b,c,d,a,x[i+10],23,-1094730640);
a=this.md5_hh(a,b,c,d,x[i+13],4,681279174);
d=this.md5_hh(d,a,b,c,x[i+0],11,-358537222);
c=this.md5_hh(c,d,a,b,x[i+3],16,-722521979);
b=this.md5_hh(b,c,d,a,x[i+6],23,76029189);
a=this.md5_hh(a,b,c,d,x[i+9],4,-640364487);
d=this.md5_hh(d,a,b,c,x[i+12],11,-421815835);
c=this.md5_hh(c,d,a,b,x[i+15],16,530742520);
b=this.md5_hh(b,c,d,a,x[i+2],23,-995338651);

a=this.md5_ii(a,b,c,d,x[i+0],6,-198630844);
d=this.md5_ii(d,a,b,c,x[i+7],10,1126891415);
c=this.md5_ii(c,d,a,b,x[i+14],15,-1416354905);
b=this.md5_ii(b,c,d,a,x[i+5],21,-57434055);
a=this.md5_ii(a,b,c,d,x[i+12],6,1700485571);
d=this.md5_ii(d,a,b,c,x[i+3],10,-1894986606);
c=this.md5_ii(c,d,a,b,x[i+10],15,-1051523);
b=this.md5_ii(b,c,d,a,x[i+1],21,-2054922799);
a=this.md5_ii(a,b,c,d,x[i+8],6,1873313359);
d=this.md5_ii(d,a,b,c,x[i+15],10,-30611744);
c=this.md5_ii(c,d,a,b,x[i+6],15,-1560198380);
b=this.md5_ii(b,c,d,a,x[i+13],21,1309151649);
a=this.md5_ii(a,b,c,d,x[i+4],6,-145523070);
d=this.md5_ii(d,a,b,c,x[i+11],10,-1120210379);
c=this.md5_ii(c,d,a,b,x[i+2],15,718787259);
b=this.md5_ii(b,c,d,a,x[i+9],21,-343485551);

a=this.safe_add(a,olda);
b=this.safe_add(b,oldb);
c=this.safe_add(c,oldc);
d=this.safe_add(d,oldd);
}
return Array(a,b,c,d);

},




md5_cmn:function(q,a,b,x,s,t)
{
return this.safe_add(this.bit_rol(this.safe_add(this.safe_add(a,q),this.safe_add(x,t)),s),b);
},
md5_ff:function(a,b,c,d,x,s,t)
{
return this.md5_cmn((b&c)|((~b)&d),a,b,x,s,t);
},
md5_gg:function(a,b,c,d,x,s,t)
{
return this.md5_cmn((b&d)|(c&(~d)),a,b,x,s,t);
},
md5_hh:function(a,b,c,d,x,s,t)
{
return this.md5_cmn(b^c^d,a,b,x,s,t);
},
md5_ii:function(a,b,c,d,x,s,t)
{
return this.md5_cmn(c^(b|(~d)),a,b,x,s,t);
},




core_hmac_md5:function(key,data)
{
var bkey=this.str2binl(key);
if(bkey.length>16)bkey=this.core_md5(bkey,key.length*this._chrsz);

var ipad=Array(16),opad=Array(16);
for(var i=0;i<16;i++)
{
ipad[i]=bkey[i]^0x36363636;
opad[i]=bkey[i]^0x5C5C5C5C;
}

var hash=this.core_md5(ipad.concat(this.str2binl(data)),512+data.length*this._chrsz);
return this.core_md5(opad.concat(hash),512+128);
},





safe_add:function(x,y)
{
var lsw=(x&0xFFFF)+(y&0xFFFF);
var msw=(x>>16)+(y>>16)+(lsw>>16);
return(msw<<16)|(lsw&0xFFFF);
},




bit_rol:function(num,cnt)
{
return(num<<cnt)|(num>>>(32-cnt));
},





str2binl:function(str)
{
var bin=Array();
var mask=(1<<this._chrsz)-1;
for(var i=0;i<str.length*this._chrsz;i+=this._chrsz)
bin[i>>5]|=(str.charCodeAt(i/this._chrsz)&mask)<<(i%32);
return bin;
},




binl2str:function(bin)
{
var str="";
var mask=(1<<this._chrsz)-1;
for(var i=0;i<bin.length*32;i+=this._chrsz)
str+=String.fromCharCode((bin[i>>5]>>>(i%32))&mask);
return str;
},




binl2hex:function(binarray)
{
var hex_tab=this._hexcase?"0123456789ABCDEF":"0123456789abcdef";
var str="";
for(var i=0;i<binarray.length*4;i++)
{
str+=hex_tab.charAt((binarray[i>>2]>>((i%4)*8+4))&0xF)+
hex_tab.charAt((binarray[i>>2]>>((i%4)*8))&0xF);
}
return str;
},




binl2b64:function(binarray)
{
var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str="";
for(var i=0;i<binarray.length*4;i+=3)
{
var triplet=(((binarray[i>>2]>>8*(i%4))&0xFF)<<16)
|(((binarray[i+1>>2]>>8*((i+1)%4))&0xFF)<<8)
|((binarray[i+2>>2]>>8*((i+2)%4))&0xFF);
for(var j=0;j<4;j++)
{
if(i*8+j*6>binarray.length*32)str+=this._b64pad;
else str+=tab.charAt((triplet>>6*(3-j))&0x3F);
}
}
return str;
}
}




api={};
widgets={};
widgets.core={};
lt={};

strings={
error_msg:"Whoops, it looks like Lala has hit a technical glitch. Please try again."
};








var lala={
COLLECT:'&nbsp;Add&nbsp;',
COLLECT_NO_SPACE:'Add',
onloadListeners:[],
Config:{},
page:{},
link:{},
img:{},
go:{},
app:null,
pageId:null,
signInOrUpResponse:null,
_showDebugBlob:false,






registerApplication:function(app){
if(!app.onload)mojo.log.error("onload handler required on app obj");
lala.app=app;
if(!lala.app.getPageId){
lala.app.getPageId=function(){return null;};
}
if(!lala.app.getPrevPageId){
lala.app.getPrevPageId=function(){return null;};
}
},





registerPage:function(page){
lala.page=page;
},





onload:function(){

if(mojo.MAC)document.body.className+=" MAC";
if(mojo.FF&&mojo.MAC)document.body.className+=" MAC_FF";
if(mojo.SAFARI)document.body.className+=" SAFARI";
if(mojo.SAFARI3)document.body.className+=" SAFARI3";
if(mojo.WEBKIT)document.body.className+=" WEBKIT";
if(mojo.FF)document.body.className+=" FF";
if(mojo.FF2)document.body.className+=" FF2";
if((mojo.MAC||mojo.SAFARI)&&!mojo.CHROME)document.body.className+=" APPLE";
if(mojo.IE)document.body.className+=" IE";
if(mojo.IE6)document.body.className+=" IE6";
if(mojo.IE7)document.body.className+=" IE7";
if(mojo.IE67)document.body.className+=" IE67";
if(mojo.IE8)document.body.className+=" IE8";
if(mojo.CHROME)document.body.className+=" CHROME";

lala._createRegistryUrls();
lala.params=mojo.url.parseQueryString(window.location.search);

mojo.template.dateFormatString="%b %d";
mojo.template.onUnreplacedToken=lala._onUnreplacedToken;
mojo.http.onResponse
=mojo.httpSingle.onResponse=lala.onSendRequestResponse;
mojo.http.onBeforeSend=function(params){
if(!params.partnerId)params.partnerId='lala';
};
mojo.http.actionBaseUrl=lala.actionBaseURL;
mojo.http.sslActionBaseUrl=lala.sslActionBaseURL;


if(lala.params._perf=='true')lala._showDebugBlob=true;

lala.showLoadingMsg(true);
lala.app.onLoad();
if(lala.page.onLoad){
lala.page.onLoad(lala.params);
}
lala.onloadListeners.leach(function(listener){listener.onPageLoad()});
lala.showLoadingMsg(false);
lala.isWidgetPartner=lala.user&&lala.user.widgetPartnerId&&(lala.user.widgetPartnerId!='memberAffiliate.null');
lala.isMediaPlayerPartner=lala.user&&lala.user.isMediaPlayerPartner;
},

makeSameProtocolUrl:function(fullUrl){
if(lala.isSslEnabled&&window.location.protocol.lcontains('https')){
fullUrl=fullUrl.replace('http://','https://');
if(mojo.DEV_FLAG){
fullUrl=fullUrl.replace(':8080','');
}
}
return fullUrl;
},

addOnLoadListener:function(listener){
lala.onloadListeners.push(listener);
},












showAck:function(msg,params){
if(!params)params={};

var id='lalaAckPane';
var ackPane=$(id);
if(!ackPane){
mojo.dom.parseHTMLFragment(
'<div id="'+id+'"><div id="lalaAckMsg">'+msg+'</div></div>',
document.body);
ackPane=$(id);
}else{
$S('lalaAckMsg',msg);
}
clearTimeout(ackPane.fadeTimeout);

ackPane._name=params.name||null;

$D(ackPane);
mojo.css.show(ackPane);

mojo.css.setOpacity(ackPane,0.8);
ackPane.isOpen=true;


if(mojo.IE6){
mojo.geometry.setBounds(
'lalaAckPane',
{top:document.documentElement.scrollTop+120});
}


$('lalaAckPane').onclick=lala.hideAck;

if(params.isTimedHide){
ackPane.fadeTimeout=window.setTimeout("lala.fadeOutAck()",params.hideDelay||2500);
}else if(!params.isManualHide){



ackPane.fadeTimeout=window.setTimeout("document.body.onmousemove = lala.fadeOutAck;",1500);
}
},

hideAck:function(name){
var ackPane=$('lalaAckPane');
if(!ackPane)return;


if(name&&typeof(name)!='string')name=null;



if(name&&(!ackPane._name||(ackPane._name&&ackPane._name!=name)))return;

$D(ackPane,false);
clearTimeout(ackPane.fadeTimeout);
ackPane.isOpen=false;
ackPane.onclick=null;
},

fadeOutAck:function(){
var ackPane=$('lalaAckPane');
if(ackPane&&ackPane.isOpen){
mojo.animate.fadeOut(ackPane,function(){
ackPane.isOpen=false;
document.body.onmousemove=null;
});
}
},

showLoadingMsg:function(show){
var div=$('loadingMsg');
if(!div)return;

if(show){
mojo.css.show(div);
}else{
mojo.css.hide(div);
}
},

showFatalError:function(statusCode,skipMsg,customMsg,
apiUrl,reloadOnError,res){
lala.showLoadingMsg(false);

if(!skipMsg&&reloadOnError){
if(!strings.error_msg){
strings.error_msg=
"Looks like its raining, you might need an umbrella, ella ella ella ... (internal error, try again)";
}
var msg=customMsg||strings.error_msg;
if(res&&res.data&&res.data.purchaseFailure){
msg='Sorry, your purchase did not complete at this time. ';

var errCode=res.data.purchaseFailure.reasonCode;
switch(errCode){
case-1:
case 150:
case 151:
msg+='Please try again later as this is usually a temporary problem.';
break;
case 200:
msg+='The Payment Processor has rejected this request due to an '+'Address Verification Error.  Please check your Billing Address '+'and make sure your street address and zip code are correct.  '+'If you receive this error multiple times you will need to '+'contact your bank to make determine why they are rejecting '+'the address check.  These checks are being made to prevent '+'fraudulent use of your card.';
break;
case 201:
msg+='The bank has declined this purchase.  You will need to contact them to determine the cause and then resubmit your purchase with Lala.';
break;
case 202:
msg+='Please check your Credit Card expiration date.';
break;
case 203:
msg+='The bank has declined this purchase.  You will need to contact them to determine the cause and then resubmit your purchase with Lala.';
break;
case 207:
msg+='This may be a temporary communication problem.  Please try again later or Contact Support with this error code.';
break;
case 231:
msg+='This purchase has been declined.  Please check your credit card number to make sure it is valid along with the expiration date.';
break;
case 233:
msg+='The bank has declined this purchase.  You will need to contact them to determine the cause and then resubmit your purchase with Lala.';
break;
case 10001:
msg+='Internal error. Please contact support with this error code.';
break;
case 10201:
msg+='The Billing Agreement was Cancelled.  Please Contact Support with this Error Code.';
break;
case 10207:
msg+='Please Contact Support with this Error Code.';
break;
case 10415:
msg+='Purchase Transaction already submitted.  Please Contact Support with this Error Code.';
break;
case 10415:
msg+='Please check that your account is valid and funded appropriately.';
break;
case 11451:
msg+='Please Contact Support with this Error Code.';
break;
default:
msg='Please contact support with this Error Code';
break;
}
msg+='\nError Code '+errCode+'';
}
alert(msg);
}


var os='unknownOperatingSystem';
if(mojo.WIN)os='windows';
else if(mojo.MAC)os='mac';

var statusCodeStr=mojo.isDefined(statusCode)?statusCode:'unknown';
var pageId=lala.app.getPageId();

lala.Track.client('errors.'+statusCodeStr+'.'+mojo.getBrowser());
lala.Track.client('errorsByPage.'+pageId);
lala.Track.flushCountersUsingBeacon();
},

gotoPage:{
id:function(id,params){
lala.gotoPage.url(lala.URL[id],params);
},




url:function(rurl,params,isNewWindow,target){
lala.showLoadingMsg(true);




var url=rurl;
if(!url.match(/^http[s]?/)&&window.location.protocol=="https:"){
url='http://'+window.location.hostname;
if(lala.reqPort!=80){
url+=':'+lala.reqPort;
}
url+=rurl;
}

if(params){
url=mojo.url.buildQueryString(params,url);
}

if(isNewWindow){
window.open(url,target?target:null);
}else{


if(mojo.IE){
window.setTimeout('window.location.href = "'+url+'"',1);
}else{
window.location.href=url;
}
}
}
},





_pendingReqs:0,
sendRequest:function(req){
lala._pendingReqs++;
if(lala._pendingReqs>=1){
lala.showLoadingMsg(true);
}

if(!req.url.lstartsWith('/api/')){
req.url='/api/'+req.url+'/v'+(lala.buildVersion||'0');
}
if(req.ssl&&lala.isSslEnabled){
req.url=lala.sslActionBaseURL+req.url;
}
mojo.http.sendRequest(req);
},










onSendRequestResponse:function(req,xmlRes){
if(req.isNew){
lala._pendingReqs--;
if(lala._pendingReqs<=0){
lala._pendingReqs=0;
lala.showLoadingMsg(false);
}
}

if(req.isGlobal){

}else if(req.pageCounter!=MojoHttpClient.pageCounter){

return;
}

var ok=true;
var data=null;

if(!req.isIframe){
var status=null;
try{
status=xmlRes.status;
}catch(e){return;}

if(status=='0')return;
if(status!='200'){
ok=false;
if(!req.suppressFatalErrors){
var text='['+xmlRes.status+']: ';
text+=xmlRes.responseText;
text=text.replace(/\\r\\n\\t/g,'<br>');
text=text.replace(/\\n\\t/g,'<br>');

mojo.log.error('http request failed ['+req.debugUrl+'] '+text);



var serverErrorInfo=mojo.evalJson(xmlRes.responseText,{});
lala.showFatalError(
xmlRes.status,null,req.customErrorMsg,
req.url,req.reloadOnError,serverErrorInfo);
if(req.reloadOnError){
document.location.reload();
}
return;
}
}
}


if(!req.isIframe&&ok){
var evalErrorObj={};
var jsRes=mojo.evalJson(xmlRes.responseText,evalErrorObj);
if(jsRes==null){

ok=false;
data=null;
if(!req.isRawResponse){
var evalStatus=evalErrorObj.failed?'evalFailed':null;
mojo.log.error('http request failed ('+req.debugUrl+'):\n');
if(evalErrorObj.failed){
var logMsg=
'['+evalStatus+','
+mojo.USER_AGENT+','+req.debugUrl
+',user='+(lala.user?lala.user.userToken:'anon')
+']: responseBody['+status+']: ###'
+xmlRes.responseText+'###';
lala.Track.logServerMessage('INFO','JsEvalError',logMsg);
mojo.log.error('JsEvalError: '+logMsg.lescapeHTML());
}
lala.showFatalError('JsEvalError_'+status,null,null,req.url);
return;
}
}else if(jsRes.redirect||(jsRes.data&&jsRes.data.redirect)){
var url=jsRes.redirect||jsRes.data.redirect;


if(lala.app.onHttpRedirect){
jsRes.redirect=lala.app.onHttpRedirect(url,req);



if(jsRes.redirect==null){
return;
}
}else{
jsRes.redirect=url;
}
window.location=jsRes.redirect;
return;
}else if(req.isRawResponse){
ok=true;
data=jsRes;
}else{

ok=jsRes.ok;
data=jsRes.data;


if(!mojo.DEV_FLAG&&lala.app.isPublicWebApp&&!req.skipVersionDetection){
var isOlderVersion=false;
if(lala.buildVersion!=jsRes.buildVersion){




var clientVersion=lala.buildVersion.replace('-','.').split('.');
var serverVersion=jsRes.buildVersion.replace('-','.').split('.');
var serverLen=serverVersion.length;
for(var i=0;i<clientVersion.length;i++){
var clientNum=parseInt(clientVersion[i]);
var serverNum=i<=serverLen?parseInt(serverVersion[i]):999999;
if(clientNum<serverNum){
isOlderVersion=true;
break;
}
}
}


if(isOlderVersion&&!lala.__isReloading){
mojo.log.error('reloading page, new version detected');
if(lala.user&&lala.user.isInternal){
lala.showAck('Internal user: reloading page, new version detected');
}
window.location.reload();
lala.__isReloading=true;
}
}

if(lala.app.isPublicWebApp&&lala.user
&&jsRes.piggy&&jsRes.piggy.userToken
&&(lala.user.userToken!=jsRes.piggy.userToken)){
alert('Looks like another Lala account has logged in '+
'from this computer ...');
window.location.reload();
lala.__isReloading=true;
return;
}


if(jsRes.piggy&&lala.app.onPiggyBackData){
lala.app.onPiggyBackData(jsRes.piggy);
}
}
}else if(req.isIframe){
data=mojo.evalJson(xmlRes);
if(data=='InternalError'){
mojo.log.error('http iframe request failed ('+req.debugUrl+'):\n');
lala.showFatalError(null,null,null,req.url);
return;
}

}

if(req.isNew){
if(lala._showDebugBlob&&jsRes&&jsRes.debugBlob){
mojo.log.info(req.debugUrl+':<br>'
+jsRes.debugBlob.lescapeHTML(true));
}
if(req.onResponse){
req.onResponse({data:data,ok:ok,req:req});
}
}else{
req.onResponse(data,ok,req.context);
}
},

Track:{
events:[],


appPrefix:'unknown.',

pageView:function(pageId){
lala.Track._trackClientEvent(
lala.Track.appPrefix+'client.pageViews.'+pageId);

var shortId=pageId;
if(pageId.lcontains('.')){
shortId=pageId.substring(0,pageId.indexOf('.'));
}
lala.Track._trackClientEvent(
lala.Track.appPrefix+'client.byPage.'+shortId+'.views');

var prevPageId=lala.app.getPrevPageId();
lala.Track._trackClientEvent(
lala.Track.appPrefix+'client.byPage.'+shortId+'.fromPage.'+prevPageId);
},

click:function(actionType){
lala.Track._trackClientEvent(lala.Track.appPrefix+'click.'+actionType);
},

client:function(counter){
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.'+counter);
},

rawCounter:function(counter){
lala.Track._trackClientEvent(counter);
},

clientPage:function(counter){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.'+counter);
},

clientPageWidget:function(widgetId,counter){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.'+widgetId+'.'+counter);
},

clientPageNav:function(counter){
if(!counter)counter='unknown';
var counterPath
=lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.navigation.'+counter;
lala.Track._trackClientEvent(counterPath);
lala.Track._lastNavCounterPath=counterPath;
},

clientPageWidgetNav:function(widgetId,counter){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.navigation.'+widgetId+'.'+counter);
},

clientPageGlobalNav:function(counter){
if(!counter)counter='unknown';
var counterPath
=lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.navigationoff.'+counter;
lala.Track._trackClientEvent(counterPath);
lala.Track._lastNavCounterPath=counterPath;
},

clientPageInteraction:function(counter){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.interaction.'+counter);
},

clientPageWidgetInteraction:function(widgetId,counter){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.interaction.'+widgetId+'.'+counter);
},

clientPagePurchase:function(counter,isCredit){
if(!counter)counter='unknown';
var pageId=lala.app.getPageId();
var prevPageId=lala.app.getPrevPageId();
var type=(isCredit?'credit':'paid')+'.'+counter;

var counterPath
=lala.Track.appPrefix+'client.byPage.'
+pageId+'.purchase.'+type
+'.from.'+(prevPageId||'unknown');
lala.Track._trackClientEvent(counterPath);

if(prevPageId){

if(!(lala.Track._lastNavCounterPath
&&lala.Track._lastNavCounterPath.lcontains('navigationoff'))){

var leadPath
=lala.Track.appPrefix+'client.byPage.'
+prevPageId+'.purchaseLead.'+type+'.'+pageId;
lala.Track._trackClientEvent(leadPath);

if(lala.Track._lastNavCounterPath){

var widgetPath=lala.Track._lastNavCounterPath.replace(
'navigation',
'purchaseLeadByWidget.'+(isCredit?'credit':'paid'));
lala.Track._trackClientEvent(widgetPath);
}
}
}
},

clientPagePlay:function(counter,isBag){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.play'+(!isBag?'Song':'Bag')+'.'+counter);
},

clientPageQueue:function(counter,isBag){
if(!counter)counter='unknown';
lala.Track._trackClientEvent(lala.Track.appPrefix+'client.byPage.'
+lala.app.getPageId()+'.queue'+(!isBag?'Song':'Bag')+'.'+counter);
},

ui:function(actionType){
lala.Track._trackClientEvent(lala.Track.appPrefix+'ui.'+actionType);
},

counter:function(counter,subCounters){
lala.Track._trackClientEvent(lala.Track.appPrefix+counter);

if(subCounters){
var subName=counter;
var subs=subCounters.split('.');
subs.leach(function(subCounter){
subName+='.'+subCounter;
lala.Track._trackClientEvent(lala.Track.appPrefix+subName);
});
}
},

addCounters:function(counters,forceFlush,prefix,suffix){
var self=this;
if(counters.length<=0)return;
if(!prefix)prefix='';
if(!suffix)suffix='';

counters.leach(function(counter){
var counterPath=lala.Track.appPrefix+prefix+counter+suffix;
self._preprocessCounter(counterPath);
});
if(forceFlush){
lala.Track.flushCounters();
}
},



flushCounters:function(checkCount){
if(checkCount&&lala.Track.events.length==0)return;

api.User.flushCounters();
},




flushCountersUsingBeacon:function(){
if(lala.Track.events.length==0)return;

var countersStr=lala.Track.getQueuedEventsString(true,true);


var id='trackClientEventBeacon';
var img=$(id);
if(!img){
mojo.dom.parseHTMLFragment(
'<img id="'+id
+'" src="images/blank.gif" class="offscreen" />',
document.body);
img=$(id);
}


var actionUrl=
lala.makeSameProtocolUrl('http://'+lala.host+'/trackingevent');
img.src=actionUrl+'?counterIds='
+countersStr+'&ck='+new Date().getTime();
},

_trackClientEvent:function(counterPath){
this._preprocessCounter(counterPath);
},

_preprocessCounter:function(counterPath){
lala.Track.events.ladd(counterPath);
},

_getFullUrl:function(fullUrl){
if(lala.isSslEnabled&&window.location.protocol.lcontains('https')){
fullUrl=fullUrl.replace('http://','https://');
}
return fullUrl;
},

getQueuedEventsString:function(andClear,noMarker){
var str=lala.Track.events.join(',');
if(andClear){
lala.Track.events=[];
}
return str;
},


logServerMessage:function(level,category,msg){
if(!level)level='INFO';

var id='logClientEventBeacon';
var img=$(id);
if(!img){
mojo.dom.parseHTMLFragment(
'<img id="'+id
+'" src="images/blank.gif" class="offscreen" />',
document.body);
img=$(id);
}


var actionUrl=
lala.makeSameProtocolUrl('http://'+lala.host+'/loggingevent');
img.src=actionUrl+'?level='+level+'&category='
+escape(category)+'&msg='+escape(msg)
+'&ck='+new Date().getTime();
}
},





updateSubmitButton:function(button,doSubmit,async){
button=$(button);
if(button.__origColor==null)button.__origColor=button.style.color;
button.style.color='#cccccc';
lala.showLoadingMsg(true);





if(async){
var f=function(){
button.disabled=true;
}
button._disableTimeout=window.setTimeout(f,1);
if(doSubmit!=null)window.setTimeout(doSubmit,200);
}else{
button.disabled=true;
if(doSubmit)doSubmit();
}
},

resetSubmitButton:function(button,ignoreLoadingMsg){
if(!ignoreLoadingMsg){
lala.showLoadingMsg(false);
}
button=$(button);
if(button.disabled){
if(button._disableTimeout!=null){
window.clearTimeout(button._disableTimeout);
button._disableTimeout=null;
}
button.style.color=button.__origColor;
button.disabled=false;
}
},








_createRegistryUrls:function(){
lala.URL={};
lala.API={};

if(!lala.Config.actionRegistry)return;

function buildURL(path,ssl){
var url=[];
if(mojo.DEV_FLAG&&ssl&&!lala.isSslEnabled)ssl=false;
if(ssl){
var reqHost=lala.reqHostName;
url.push("https://");
url.push(reqHost);
url.push(lala.Config.dispatcherPath);
url.push("/");
url.push(path);
}else{




if(window.location.protocol=="https:"&&path.match(/^api/)){
url.push("https://");
}else{
url.push("http://");
}
url.push(lala.reqHostName);


if(!(lala.reqPort==443&&path.match(/^api/))
&&lala.httpPort!=80&&lala.httpPort>0){
url.push(":"+lala.httpPort);
}
url.push(lala.Config.dispatcherPath);
url.push("/");
url.push(path);
}

return url.join('');
}

for(key in lala.Config.actionRegistry.apis){
var a=lala.Config.actionRegistry.apis[key];
if(a==null)a={};
if(!a.path){
a.path='oldapi/'+key.toLowerCase();
}
lala.API[key]=buildURL(a.path,a.ssl);
}

for(key in lala.Config.actionRegistry.urls){
var a=lala.Config.actionRegistry.urls[key];
if(a==null)a={};
if(!mojo.isDefined(a.path)){
a.path=key.toLowerCase();
}
lala.URL[key]=buildURL(a.path,a.ssl);
}
},




_onUnreplacedToken:function(token){
var val=null;
if((token.indexOf('lala.Servlet')!=-1)
||(token.indexOf('lala.URL')!=-1)
||(token.indexOf('lala.API')!=-1)
||(token.indexOf('lala.COLLECT')!=-1)
||(token.indexOf('lala.host')!=-1)
||(token.indexOf('lala.user.userToken')!=-1)
||(token.indexOf('lala.staticBaseURL')!=-1)
||(token.indexOf('lala.actionBaseURL')!=-1)
||(token.indexOf('lala.adminWidgetUrl')!=-1)
||(token.indexOf('lala.frontendUrl')!=-1)
||(token.indexOf('lala.flashWidgetBaseURL')!=-1)
||(token.indexOf('g_pageData')!=-1)
||(token.indexOf('strings.')!=-1)){
val=eval(token);
}

return val;
}
};






lala.showLoadingMsg=function(show){
var div=$('loadingMsg');
if(!div)return;

if(show){
mojo.css.setOpacity(div,0.8);
mojo.css.show(div);
}else{
mojo.css.hide(div);
}
};






var frontend={};
frontend.isLimitedSiteDown=false;
frontend.isPublicWebApp=true;
frontend.FLUSH_COUNTERS_INTERVAL=150*1000;
frontend._onLoadListeners=[];
frontend.addOnLoadListener=function(listener){
frontend._onLoadListeners.push(listener);
};

frontend.onLoad=function(){
if(typeof(Header)=='undefined')return;

if(window.location.protocol=='https:'){


lala.Servlet.CoverArt=lala.Servlet.SSLCoverArt;
lala.Servlet.UserImage=lala.Servlet.SSLUserImage;
}

mojo.http.onBeforeSend=function(params){

if(!params.partnerId)params.partnerId='lala';
params.counterIds=lala.Track.getQueuedEventsString(true);
};
mojo.template.linkEvalPrefix='frontend.';
lala.Track.appPrefix='f.';


if(!lala.URL.MyMusic){
lala.showFatalError("jscache",true);
lala.showAck("We've encountered an error when loading the site. Please refresh your browser.",{isManualHide:true});
}
lala.URL.MyMusic=lala.URL.MyMusic.replace(/\/$/,'');

frontend.url.init();
Header.g.onLoad();

Object.extend(
api.Messaging,
{
replaceLalaLinks:function(msgText){
return widgets.core.Util.replaceLalaLinks(msgText);
},
getMemberHref:function(userToken){
return frontend.link.Member(userToken);
},
getMemberImageUrl:function(user){
var img=frontend.img.Member(user);
return img;
}
});

for(var i=0;i<frontend._onLoadListeners.length;i++){
frontend._onLoadListeners[i]();
}

MojoDialog.onBeforeOpen=function(){
lala.hideAck();
widgets.core.LightDialog.hide();
if(typeof(PlayerDrawer)!='undefined'){
if(!PlayerDrawer.g.isOpen('mix')){


PlayerDrawer.g.close();
}
}
};
window.setInterval(frontend.flushAnyQueuedCounters,frontend.FLUSH_COUNTERS_INTERVAL);
};

frontend.onHttpRedirect=function(serverRedirectUrl){
return frontend.buildURLWithReturnParams(null,serverRedirectUrl);
};

frontend.getPageId=function(){
if(typeof(MyMusic)=='undefined')return lala.pageId;
else return MyMusic.g.getPageId();
};

frontend.getPrevPageId=function(){
var page=(typeof(MyMusic)!='undefined')?MyMusic.g.prevPage:null;
return page?page.pageId:'None';
};

frontend.flushAnyQueuedCounters=function(){



if(typeof(frontend)=='undefined')return;
if(lala.Track.events.length==0)return;


lala.Track.flushCounters();
};

frontend.goToPaymentMethod=function(params,type){
if(!params)params={};
var url=frontend.buildURLWithReturnParams(params,frontend.url.PaymentMethod(type));
lala.gotoPage.url(url);
};





frontend.jumpArtistCheck=function(artistName){
api.AutoComplete.artistCheck(
artistName,
function(isArtist,noop,autoRunValue){
if(isArtist){
frontend.go.ArtistViaAutoCompleteMatch(artistName);
}else{
frontend.go.Search(artistName);
}
});
};

frontend.isSongAddable=function(song){
return!song.isDigied&&song.isLicensedForStreaming;
};

frontend.escapeQ=function(Q){
if(Q)Q=Q.replace(/\"/g,'\\\"');
return Q;
};





frontend.requiresSignin=function(trackingId){
if(lala.user)return false;

lala.gotoPage.id('SignUp');
return true;
};

frontend.back=function(){
var numBack=1;
if(lala.params!=null&&lala.params.backpop!=null){
numBack=parseInt(lala.params.backpop);
if(isNaN(numBack))numBack=1;
}

history.go(numBack*-1);
};





frontend.scrollToPageTop=function(){
if(mojo.IE67){
document.getElementsByTagName("HTML")[0].scrollTop=0;
}else{
try{
mojo.focus('topOfThePage');
$('topOfThePage').blur();
}catch(e){

}
}
};




frontend.buyWebSong=function(song,onResponse,
fromTrackingContext,playlistToken,
onBeforePurchase,
addlEvtData){
if(!onResponse)onResponse=mojo.emptyFunction;


if(frontend.requiresSignin({trackingId:'addWebSong'}))return;


var makeWebSongPurchase=function(){
var useCredit=api.MicroWallet.credits>0;
api.Store.purchaseSongs(
song,
'Web',
{method:useCredit?'Credit':'Wallet'},
onResponse,
playlistToken,
onBeforePurchase,
addlEvtData);
};

var cantBuy=api.MicroWallet.balance<song.addPrice
&&api.MicroWallet.credits==0;


if(cantBuy){
widgets.core.BuyWalletDialog.open({
song:song,
songOnBuyResponse:function(){
onResponse(song);
},
playlistToken:playlistToken,
fromTrackingContext:fromTrackingContext,
onBeforePurchase:onBeforePurchase,
addlEvtData:addlEvtData
});
return;
}

if((!DataModel.g.getUserPreference('dontShowWebSongMessage',false)&&!cantBuy)){
var title="You're adding a web song...";
var content=[];
content.push($TC(lt.CoreFrontend.firstAdd));

if(api.MicroWallet.credits>0){
var creditMsg=$T(lt.CoreFrontend.creditMsg)
.replaceToken('credits',api.MicroWallet.credits)
.replaceToken('s',api.MicroWallet.credits==1?'':'s')
.replaceToken('creditsAfter',api.MicroWallet.credits-1)
.replaceToken('afterS',(api.MicroWallet.credits-1)==1?'':'s')
.replaceToken('addPrice',mojo.util.formatPrice(song.addPrice))
.removeTokenBlock('Mp3Block',!frontend.canPurchaseDownload(song))
.compose();
content.push(creditMsg);
}else if(api.MicroWallet.balance>=song.addPrice){
var balanceMsg=$T(lt.CoreFrontend.balanceMsg)
.replaceToken('balance',
mojo.util.formatPrice(api.MicroWallet.balance))
.replaceToken('afterBalance',
mojo.util.formatPrice(api.MicroWallet.balance-song.addPrice))
.replaceToken('addPrice',mojo.util.formatPrice(song.addPrice))
.removeTokenBlock('Mp3Block',!frontend.canPurchaseDownload(song))
.compose();
content.push(balanceMsg);
}

title=$T(lt.CoreFrontend.dialogLogoTitle)
.replaceToken('title',title)
.compose();
content.linsertAt(title,0);
content.push($TC(lt.CoreFrontend.addButtons));

var dialog=new MojoDialog({id:'firstAdd'});
dialog.open(content.join(''));


$('addDialogButton').onclick=function(){
$('addDialogButton').disabled=true;
DataModel.g.setUserPreference('dontShowWebSongMessage',true);
makeWebSongPurchase();
new MojoDialog({id:'firstAddAck'}).open($TC(lt.CoreFrontend.firstAddAck));

};
}else{
makeWebSongPurchase();
}
};

frontend.showMusicInterruptDialog=function(onOk,isFreeDownload){
var title=$T(lt.CoreFrontend.dialogAlertTitle)
.replaceToken('title','A gentle warning: Silence ahead.')
.compose();

var interruptMessage=isFreeDownload
?$TC(lt.CoreFrontend.musicInterruptFree)
:$TC(lt.CoreFrontend.musicInterrupt);
new MojoDialog({
title:title,
id:'interruptDialog'
}).open(interruptMessage);

mojo.dom.setEventListener($('interruptOkButton'),'onclick',onOk);
},

frontend.getMemberClassName=function(leahUser){
if(!leahUser||!leahUser.isEmployee){
return'lmemberlink';
}

return'lemployeelink';
};

frontend.isDownloadAlbumDiscounted=function(actualPrice){
return actualPrice==749||actualPrice==799;
};


frontend.hasDownload=function(song){
return song.isUploaded||song.isDownloadPurchased;
};

frontend.hasOnlyFreeTracksOnAlbum=function(discs){
var availableFreeTracks=[];
discs.leach(function(disc){
if(disc.tracks){
disc.tracks.leach(function(track){
if(track.isFreeMp3&&!frontend.hasDownload(track)){
availableFreeTracks.push(track);
}
});
}
});
return availableFreeTracks.length>0
&&discs[0].downloadMissingTracksPriceInCents<=0
&&availableFreeTracks.length==discs[0].downloadMissingTracksCount;
};


frontend.canPurchaseDownload=function(song){
return!song.isUploaded&&song.isLicensedForDownload
&&!song.isDownloadPurchased&&!song.isDownloadAlbumOnly;
};
frontend.isDiscMP3Only=function(disc){
return disc.isLicensedForDownload
&&!disc.isLicensedForStreaming
&&!disc.isAllTracksDigied;
};

frontend.hasInviteCredits=function(){
return lala.user&&lala.user.hasInviteCredit;
};

frontend.needsToValidateEmail=function(){
return lala.user&&lala.user.isEmailValidationRequired
&&!lala.user.isEmailValidated;
};

frontend.onResendVerifyEmail=function(btn){
var alreadyVerifiedMsg='You\'ve already verfied your email address. Enjoy the music!';
if(frontend.needsToValidateEmail()){
api.User.resendVerifyEmail(function(res){
MojoDialog.close();
if(!res.data){
if(btn)mojo.css.display(btn,false);
lala.showAck(alreadyVerifiedMsg);
}else{
if(btn)$S(btn,'<i>We sent you another verification email</i>');
else lala.showAck('We sent you another verification email');
}
});
}else{
if(btn)mojo.css.display(btn,false);
lala.showAck(alreadyVerifiedMsg);
}
};

frontend.creditsExpired=function(){
if(!lala.user||lala.user.creditExpiration==0)return false;

var now=new Date();
return now>=frontend.getCreditExpireDate();
};

frontend.creditsAboutToExpire=function(){
if(!lala.user||lala.user.creditExpiration==0)return false;

var fiveDays=(1000*60*60*24)*5;
var now=new Date();

return((frontend.getCreditExpireDate()-now)<=fiveDays)
&&!frontend.creditsExpired();
};


frontend.getCreditExpireDate=function(){
var expireDate=new Date();
expireDate.setTime(parseInt(lala.user.creditExpiration));
return expireDate;
};


frontend.hasOldCredits=function(){
return lala.user.creditExpiration==0&&api.MicroWallet.credits>0;
};

frontend.checkExpiration=function(){

if(frontend.creditsExpired()&&api.MicroWallet.credits>0){
api.MicroWallet.updateWallet({
credits:0
});
}
};




frontend.buildURLWithReturnParams=function(params,baseUrl){
if(!params)params={};

params.path=window.location.pathname;
params.hash=window.location.hash;

return mojo.url.buildQueryString(params,baseUrl);
};

frontend.recordVisitorCounters=function(){
this._recordUniqueVisitorCounters();
this._recordUniqueUserCounters();
lala.Track.flushCounters(true);
};

frontend._recordUniqueVisitorCounters=function(){
var cookie=Cookies.getVisitorCookie();
var newCookie=
this._recordUniqueCounters(cookie,'stats.uniqueVisits.');
if(newCookie){
Cookies.setVisitorCookie(newCookie);
}
};

frontend._recordUniqueUserCounters=function(){
if(!lala.user)return;

var cookie=Cookies.getMemberVisitorCookie();
var newCookie=
this._recordUniqueCounters(cookie,'stats.uniqueMemberVisits.');
if(newCookie){
Cookies.setMemberVisitorCookie(newCookie);
}
};


frontend._recordUniqueCounters=function(cookie,counterPrefix){
var counters=[];
var updateCookie=false;
var currTime=new Date();
var lastTime=null;
var newCookie=null;
var cookieMap={};

if(cookie!=null){
var bits=cookie.split('__');
for(var i=0;i<bits.length;i++){
var bit=bits[i];
var parts=bit.split('_');
var bitKey=parts[0];
var timestamp=parseFloat(parts[1]);


cookieMap[bitKey]=timestamp;
if(bitKey=='b1'){
lastTime=new Date();
lastTime.setTime(timestamp);
}
}
}

if(cookie==null||!lastTime){

counters.push('hourly');
counters.push('daily');
counters.push('weekly');
counters.push('monthly');
updateCookie=true;

}else{

if(currTime.getUTCMonth()
!=lastTime.getUTCMonth()){

counters.push("hourly");
counters.push("daily");
counters.push("weekly");
counters.push("monthly");
updateCookie=true;

}else if(currTime.lgetUTCWeekOfYear()
!=lastTime.lgetUTCWeekOfYear()){

counters.push("hourly");
counters.push("daily");
counters.push("weekly");
updateCookie=true;

}else if(currTime.getUTCDate()
!=lastTime.getUTCDate()){

counters.push("hourly");
counters.push("daily");
updateCookie=true;

}else if(currTime.getUTCHours()
!=lastTime.getUTCHours()){

counters.push("hourly");
updateCookie=true;
}
}


if(updateCookie){
cookieMap.b1=currTime.getTime();
newCookie='';
for(var k in cookieMap){
newCookie+=k+'_'+cookieMap[k]+'__';
}
newCookie=newCookie.replace(/__$/,'');
}

lala.Track.addCounters(counters,null,counterPrefix,'.lala');
return newCookie;
};






frontend.extractReturnURL=function(){
var path=lala.params.path;
if(path&&!path.lstartsWith('/')){
path='/'+path;
}
if(!path){
path='/';
}
var port='';

if(lala.reqPort==443&&lala.httpPort!=80&&lala.httpPort>0){
port+=":"+lala.httpPort;
}
var url='http://'+lala.host+port+path;
if(lala.params.hash){
url+=lala.params.hash;
}

return url;
};

frontend.onChangePicture=function(idorelem){
widgets.ImageUpload.g.open(function(){
api.User.getUserImageInfo(function(res){
lala.user.userImageExtension=res.data.userImageExtension;
lala.user.userImageType=res.data.userImageType;
lala.user.isUserImagePublished=res.data.isUserImagePublished;

$(idorelem).src=frontend.img.Member(lala.user,true);
mojo.listeners.notify(api.User.EVT_PERSONAL_INFO);
});
});
};

frontend.FlashEmbed={













compose:function(params,renderTargetId){
var html=frontend.FlashEmbed.getHTML(params);
mojo.setContent(renderTargetId,html);
return html;
},

getHTML:function(params){
var template=mojo.SAFARI
?g_flashEmbedSafariTemplate:g_flashEmbedTemplate;
var t=mojo.template.create(template);

if(!params.id){
params.id='frontend_flash_'+mojo.idGenerator++;
}

t.replaceTokensWithBean('params',params);


if(!params.flashVars){
params.flashVars={};
}
if(!params.bgcolor){
params.bgcolor="#FFFFFF";
}
if(!params.wmode){
params.wmode="window";
}
if(params.widgetId){
params.flashVars.widgetId=params.widgetId;
}
if(mojo.DEV_FLAG){
params.flashVars.isDebug=true;
}
params.flashVars.host=params.hostOverride||lala.host;

t.replaceToken('flashVars',mojo.url.buildQueryString(params.flashVars));
var html=t.compose();
return html;
},

getSWF:function(id){
return mojo.IE?window[id+'IE']:document.getElementById(id);
}
};

frontend.track={
_doActualTracking:function(path){
if(mojo.DEV_FLAG){

}else{
if(lala.user
&&(lala.user.userToken=="12645@3"
||lala.user.userToekn=="50486@47")){
urchinTracker(path);
}
}
},

pageView:function(pageId){
this._doActualTracking("/"+pageId);
},

pageEvent:function(eventPath){
this._doActualTracking("/"+lala.pageId.toLowerCase()+"/"+eventPath);
},

event:function(eventId){
this._doActualTracking("/event/"+eventId);
}
};

frontend.detectFFPlugin=function(myMime){
var has=false;
if(navigator.plugins&&navigator.plugins.length>0){
var numPlugins=navigator.plugins.length;

myMime=myMime.toLowerCase();

var i=0;
for(i=0;i<numPlugins;i++){
if(has){
break;
}
var plugin=navigator.plugins[i];
var numTypes=plugin.length;
for(j=0;j<numTypes;j++){
var mimetype=plugin[j];
if(mimetype){
if(mimetype.type.toLowerCase()==myMime){
has=true;
break;
}
}
}
}
}
return has;
};

frontend.addGiftComment=function(giftToken,fid,onResponse){
var comment=$F(fid);
if(comment==api.Gifts.DEFAULT_COMMENT||comment.ltrim()=='')return;
api.Gifts.addComment({
giftToken:giftToken,
text:comment},
onResponse);
};


Cookies={




getPurchasePartnerId:function(defVal){
return mojo.cookie.get('ppid',defVal||null);
},

isPurchasePartnerBillboard:function(){

var val=mojo.cookie.get('ppid',null);
if(val){
return val.match(/billboard/i)||val.match(/34788@73477/i);
}else{
return false;
}
},

isPurchasePartnerGoogle:function(){

var val=mojo.cookie.get('ppid',null);
if(val){
return val.match(/google/i)||val.match(/50516@74389/i);
}else{
return false;
}
},

removePurchasePartnerId:function(){
mojo.cookie.remove('ppid');
},




getVisitorCookie:function(){
return mojo.cookie.get('_llvtc');
},

setVisitorCookie:function(val){
return mojo.cookie.set('_llvtc',val,365);
},

getMemberVisitorCookie:function(){
return mojo.cookie.get('_llmtc');
},

setMemberVisitorCookie:function(val){
return mojo.cookie.set('_llmtc',val,365);
},





getHomePageVersion:function(){
return null;
},




setHomePageVersion:function(homePageVersion){
},

setFromSignupContext:function(context){
if(!context)context='default';

mojo.cookie.set('_lcFromSignup',context);
},





getFromSignupContext:function(){
var name='_lcFromSignup';
var val=mojo.cookie.get(name);


mojo.cookie.remove(name)
return val;
},




setPopForecastDialog:function(){
mojo.cookie.set('popForecastDialog',true);
},

getPopForecastDialog:function(andRemove){
var val=mojo.cookie.get('popForecastDialog',false);
if(andRemove){
mojo.cookie.remove('popForecastDialog');
}
return val;
},

setFromBuyGiftCard:function(cardType){
mojo.cookie.set('fromBuyGiftCard',cardType);
},

getFromBuyGiftCard:function(){
var val=mojo.cookie.get('fromBuyGiftCard','');
mojo.cookie.remove('fromBuyGiftCard');
return val;
}
};

frontend.escapeInPageParams=function(params){
var str='';
var isFirst=true;
for(var k in params){
if(mojo.isDefined(params[k])&&params[k]!=null){
if(isFirst){

str+='::';
isFirst=false;
}else{
str+=':';
}

str+=k+'='+(params[k]+'').replace(/&/,'%26');
}
}

return str;
};

frontend.getMinHeightStyle=function(){
var viewport=mojo.geometry.getViewportBounds();
return parseInt(viewport.height
-110
-107
-20
-23)
+'px';
};

frontend.setContentAreaMinHeight=function(){
$('scrollableViewDiv').style[mojo.IE6?'height':'minHeight']=frontend.getMinHeightStyle();
};
lala.registerApplication(frontend);

strings.conditions={
PendingReceive:'PendingReceive',
Good:'Good',
GoodWithArt:'GoodWithArt',
OtherBad:'OtherBad',
Ripped:'Ripped',
NotReceived:'NotReceived',
Broken:'Broken',
WrongCD:'WrongCD',
Void:'Void',
ShipperError:'ShipperError',
VoidShip:'VoidShip',
VoidReceive:'VoidReceive',
Unplayable:'Unplayable',
text:{
PendingReceive:'in transit',
Good:'received',
GoodWithArt:'received',
OtherBad:'bad condition',
Ripped:'burned',
NotReceived:'not received',
Broken:'broken',
WrongCD:'wrong',
Void:'cancelled',
ShipperError:'cancelled',
VoidShip:'cancelled',
VoidReceive:'cancelled',
Unplayable:'unplayable'
},
isGood:function(c){
return c==strings.conditions.Good||c==strings.conditions.GoodWithArt;
},
isCancelled:function(c){
return c==strings.conditions.Void
||c==strings.conditions.ShipperError
||c==strings.conditions.VoidShip
||c==strings.conditions.VoidReceive;
}
};




frontend.link={
About:function(clickTrackingId){
return this._resolvePath('about',null,clickTrackingId);
},
AccountInfo:function(){
return this._resolvePath('accountinfo');
},
AccountPurchases:function(){
return this._resolvePath('accountinfo/purchases');
},
AccountSettings:function(trackingId){
return this._resolvePath('accountinfo/settings',null,trackingId);
},
PrivacySettings:function(){
return this._resolvePath('accountinfo/settings/privacy');
},
LoginInfo:function(){
return this._resolvePath('accountinfo/settings/basic');
},

Album:function(discId,title,trackingId,artist){
if(discId){
var path='album/'+discId;
if(title){

if(artist)path+='/'+artist.lescapeForHash().lunderbarsForSpaces();
path+='/'+title.lescapeForHash().lunderbarsForSpaces();
}
return this._resolvePath(path,null,trackingId);
}else if(title){
return this._resolvePath('search/'+title.lescape(),null,trackingId);
}
},
AlbumGroup:function(groupId,buyOrTrade,albumId){
var path='albumgroup/'+buyOrTrade+'/'+groupId;
if(albumId)path+='/'+albumId;
return this._resolvePath(path);
},
AlbumReco:function(discId,msgToken){
var path='album/'+discId;
if(msgToken)path+='::msgToken='+msgToken;
return this._resolvePath(path);
},

Artist:function(name,songId,trackingId){





if(arguments.length==2&&!songId){

return this._resolvePath('search/'
+name.lescapeForHash(true),
null,
trackingId);
}else{

return this._resolvePath('artist/'
+name.lescapeForHash(true).lunderbarsForSpaces(),
null,
trackingId);
}
},
ArtistReco:function(name,msgToken,trackingId){
var path='artist/'+name.lescapeForHash(true).lunderbarsForSpaces();
var params=null;
if(msgToken)params={msgToken:msgToken};
return this._resolvePath(path,params,trackingId);
},
ArtistAPage:function(artistName,tabId,clickTrackingId){
return this._resolvePath(
'artist/'+artistName.lescapeForHash(true).lunderbarsForSpaces()+'/more/'+tabId,
null,
clickTrackingId);
},

ArtistList:function(artistList,klass,tmpl,songId,trackingId,sep,extensionList){
var artists=artistList.split('::');
var extensions=null;
if(extensionList){
extensions=extensionList.split(",");
}

if(sep==null)sep=', ';
if(!tmpl)tmpl='lt.SongListWidget.artistLink';
tmpl=mojo.evalJson(tmpl);
var artistBlock=$T(tmpl);

for(var i=0;i<artists.length;i++){
var name=artists[i];
var extension=null;
if(extensions){
extension=extensions[i].ltrim();
}
artistBlock.replaceToken('class',klass);

var link='';
if(arguments.length==4&&!songId){
link=this._resolvePath(
'search/'+name.lescapeForHash(true)+(extension?' ('+extension+')':''),
null,
trackingId);
}else{
link=this._resolvePath(
'artist/'+name.lescapeForHash(true).lunderbarsForSpaces()+(extension?' ('+extension+')':''),
null,
trackingId);
}
artistBlock.replaceToken('href_and_onclick',link);
artistBlock.replaceToken('name',name.lescapeHTML());
if(i==artists.length-1){
artistBlock.replaceToken('sep','');
}else{
artistBlock.replaceToken('sep',sep);
}
artistBlock.next();
}
return artistBlock.compose();
},



ArtistViaAutoCompleteMatch:function(artist){
ArtistPage.wrongArtistName=artist;
frontend.go.Artist(artist);
},


ArtistCheck:function(name,songId){
if(arguments.length==2&&!songId){
return'href="javascript:frontend.jumpArtistCheck(\''
+name.lescapeQuotesForHref()+'\');"';
}else{

return this._resolvePath('artist/'
+name.lescapeForHash(true).lunderbarsForSpaces());
}
},
ArtistBio:function(name){
return this._resolvePath('artist/'+name.lescapeForHash(true).lunderbarsForSpaces()+'/bio');
},
BetaSettings:function(trackingId){
return this._resolvePath('accountinfo/settings/beta',null,trackingId);
},
BillingInfo:function(){
return this._resolvePath('accountinfo/settings/billing');
},
BillingHistory:function(){
return this._resolvePath('accountinfo/purchases');
},
Blog:function(topicId,clickTrackingId){
var after=topicId?'/'+topicId:'';
return this._resolvePath('blog'+after,null,clickTrackingId);
},
BetaBlog:function(topicId,clickTrackingId){
var after=topicId?'/'+topicId:'';
return this._resolvePath('betablog'+after,null,clickTrackingId);
},
Blurbs:function(userToken,trackingId){
var path=userToken?'blurbs/'+userToken:'blurbs';
return this._resolvePath(path,null,trackingId);
},
BonnarooHome:function(){
return this._resolvePath('bonnaroohome');
},
Bookmarks:function(type,trackingId){
if(type=='all')type=null;
var path='bookmarks';
if(type)path+='/'+type;
return this._resolvePath(path,null,trackingId);
},
Browse:function(trackingId){
return this._resolvePath('browse',null,trackingId);
},
Collection:function(trackingId){
return this._resolvePath('songs',null,trackingId);
},
CollectionPageSearch:function(path,keywords,ratingFrom,ratingTo){
if(!path)path='songs';
var params=null;
if(keywords||ratingTo!=null||ratingFrom!=null){
params={
keywords:keywords,
ratingFrom:ratingFrom,
ratingTo:ratingTo
};
}
return this._resolvePath(path,params);
},
CommunityPolicy:function(){
return this._resolvePath('communitypolicy');
},
ContactInfo:function(clickTrackingId){
return this._resolvePath('contactinfo',null,clickTrackingId);
},
ContactSupport:function(params,clickTrackingId){
if(!lala.user){
return'href="javascript:widgets.core.Util.openFeedbackDialog();"';
}else{
return this._resolvePath('contactsupport',params,clickTrackingId);
}
},
Content:function(pageId,clickTrackingId){
return this._resolvePath('content/'+pageId,null,clickTrackingId);
},
Downloads:function(trackingId){
return this._resolvePath('downloads',null,trackingId);
},
EmailGiftCard:function(userToken,clickTrackingId){
if(userToken){
return this._resolvePath('giftcards/email/'+userToken,null,clickTrackingId);
}else{
return this._resolvePath('giftcards/email',null,clickTrackingId);
}
},
EmailPreferences:function(){
return this._resolvePath('accountinfo/settings/email');
},
Everyone:function(){
return this._resolvePath('people/everyone');
},
FacebookConnect:function(){
return this._resolvePath('accountinfo/settings/facebook');
},
Feedback:function(openPost,trackingId){
if(!lala.user){
return'href="javascript:widgets.core.Util.openFeedbackDialog();"';
}else{
var suffix=openPost?'::openPost=true':'';
return this._resolvePath('feedback'+suffix,null,trackingId);
}
},
FeedbackForm:function(){
return'href="javascript:widgets.core.Util.openFeedbackDialog();"';
},
FeedbackThread:function(threadToken){
return this._resolvePath(MyMusic.g.getPagePath().match(/^([^\/]*)/)[0]+'/'
+threadToken);
},
BetaFeedback:function(openPost,trackingId){
if(!lala.user){
return'href="javascript:widgets.core.Util.openFeedbackDialog();"';
}else{
var suffix=openPost?'::openPost=true':'';
return this._resolvePath('betafeedback'+suffix,null,trackingId);
}
},
Finder:function(){
return this._resolvePath('people/finder');
},
FinderFriends:function(trackingId,params){
return this._resolvePath('people/finder/friends',params,trackingId);
},
FinderInvite:function(trackingId){
return this._resolvePath('people/finder/invite',null,trackingId);
},
FollowLanding:function(userToken){
return this._resolvePath('followlanding/'+userToken);
},
Following:function(clickTrackingId){
return this._resolvePath('people',null,clickTrackingId);
},
Followers:function(sortOrder,clickTrackingId){
var params=sortOrder?{sortOrder:sortOrder}:null;
return this._resolvePath('people/followers',params,clickTrackingId);
},
ForgotPassword:function(){
return this._getExternalPageHref(lala.URL.ForgotPassword);
},
Forums:function(subtype){
subtype=subtype?'/'+subtype:'';
return this._resolvePath('trade/forums'+subtype);
},
ForumThread:function(threadToken){
return this._resolvePath('trade/forums/thread/'
+threadToken);
},
FriendsSearch:function(Q){
return this._resolvePath('people/search/'+Q.lunderbarsForSpaces().lescapeForHash(true));
},
GiftCards:function(clickTrackingId){
return this._resolvePath('giftcards',null,clickTrackingId);
},
GiftCardSuccess:function(type,giftCardId){
return this._resolvePath('giftcards/congrats/'+type+'/'+giftCardId);
},
Gifts:function(trackingId){
return this._resolvePath('gifts',null,trackingId);
},
GiftsSent:function(){
return this._resolvePath('gifts/sent');
},
GiftsReceived:function(){
return this._resolvePath('gifts/received');
},
iPhone:function(){
return this._resolvePath('iphone');
},
InsiderForum:function(){
return this._resolvePath('insiderforum');
},
Invite:function(){
return this.FinderInvite();
},
MediaPlayer:function(){
return this._getExternalPageHref('/mediaplayer');
},
MusicMover:function(clickTrackingId){
return this.MusicMoverUploader(clickTrackingId);
},
MusicMoverUploader:function(clickTrackingId){
return this._resolvePath('musicmover/uploader',null,clickTrackingId);
},
MusicMoverDownloader:function(clickTrackingId){
return this._resolvePath('musicmover/downloader',null,clickTrackingId);
},
NewDownloads:function(){
return this._resolvePath('downloads/new');
},
OldDownloads:function(){
return this._resolvePath('downloads/old');
},
People:function(trackingId){
return this._resolvePath('people',null,trackingId);
},
PrintGiftCard:function(clickTrackingId){
return this._resolvePath('giftcards/print',null,clickTrackingId);
},
ShippingInfo:function(){
return this._resolvePath('accountinfo/settings/shipping');
},
TraderFeedback:function(){
return this._resolvePath('traderfeedback');
},
Widgets:function(){
return this._getExternalPageHref('/widgets');
},



BrowseGenre:function(genre,subGenre,trackingId){
var path='browse/genre/'+genre.lescape();
if(subGenre)path+='/'+subGenre.lescape();

return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},
SubGenre:function(genreAndSubgenre){

var index=genreAndSubgenre.indexOf('/');
var genre=genreAndSubgenre.substring(0,index);
var subgenre=genreAndSubgenre.substring(index+1);
return this.BrowseGenre(genre,subgenre);
},
GenreList:function(genreList,klass,sep){
var genres=genreList.split('::');
if(sep==null)sep=', ';
var tmpl=mojo.evalJson('lt.SongListWidget.genreLink');
var genreBlock=$T(tmpl);

for(var i=0;i<genres.length;i++){
var genre=genres[i];
genreBlock.replaceToken('class',klass);
var link=this.BrowseGenre(genre);
genreBlock.replaceToken('href_and_onclick',link);
genreBlock.replaceToken('genre',genre.lescapeHTML());
if(i==genres.length-1){
genreBlock.replaceToken('sep','');
}else{
genreBlock.replaceToken('sep',sep);
}
genreBlock.next();
}
return genreBlock.compose();
},
GenreSearch:function(Q,genre,subGenre){
var path='search/genre/'+genre.lescape();
if(subGenre){
path+='/'+subGenre.lescape();
}
path+='/'+Q.lescape();
return this._resolvePath(path);
},
HaveList:function(){
return this._resolvePath('trade/havelist');
},
HaveListRequested:function(){
return this._resolvePath('trade/havelist/requested');
},
Help:function(categoryName,topicId,clickTrackingId){
var after=categoryName?'/'+categoryName.lescapeForHash(true):'';
after+=categoryName&&topicId?'/'+topicId:'';
return this._resolvePath('help'+after,null,clickTrackingId);
},
Home:function(clickTrackingId){
return this._resolvePath('home',null,clickTrackingId);
},
HowItWorks:function(clickTrackingId){
return this._resolvePath('howitworks',null,clickTrackingId);
},
InviteFriends:function(){
return this._resolvePath('people/finder/invite');
},
Jobs:function(clickTrackingId){
return this._resolvePath('jobs',null,clickTrackingId);
},
BrowseLabel:function(label,trackingId){
return this._resolvePath(
'browse/label/'+label.lescapeForHash(true),
null,
trackingId);
},
LabelSearch:function(Q,label){
var path='search/label/'+label.lescape();
path+='/'+Q.lescape();
return this._resolvePath(path);
},
Member:function(userToken,trackingId){
return this._resolvePath('member/'+userToken,null,trackingId);
},
MemberCollection:function(token){
return this._resolvePath('member/'+token+'/collection');
},
MemberFriends:function(token,tab){
if(!tab)tab='following';
return this._resolvePath('member/'+token+'/people/'+tab);
},
MemberHaves:function(token){
return this._resolvePath('member/'+token+'/havelist');
},
MemberWants:function(token){
return this._resolvePath('member/'+token+'/wantlist');
},
MemberGifts:function(token){
return this._resolvePath('member/'+token+'/giftlist');
},
MemberSearch:function(Q){
return this._resolvePath('membersearch/'+Q.lunderbarsForSpaces().lescapeForHash(true));
},
Mp3Upload:function(){
return this._getExternalPageHref(lala.URL.Mp3Upload);
},
GiftCardPrint:function(giftCardId){
return this._getExternalPageHref(lala.URL.GiftCardPrint+"?token="+giftCardId);
},

NewReleases:function(trackingId){
return this._resolvePath('newreleases',null,trackingId);
},
NewReleasesGenre:function(genre,subgenre,trackingId){
var path='newreleases/genre/'+genre.lescape();
if(subgenre){
path+='/'+subgenre.lescape();
}
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},
NewReleasesSubGenre:function(genreAndSubgenre){
var index=genreAndSubgenre.indexOf('/');
var genre=genreAndSubgenre.substring(0,index);
var subgenre=genreAndSubgenre.substring(index+1);
return this.NewReleasesGenre(genre,subgenre);
},
NewReleasesLabel:function(label,trackingId){
var path='newreleases/label/'+label.lescape();
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},

Bestsellers:function(trackingId){
return this._resolvePath('bestsellers',null,trackingId);
},
BestsellersGenre:function(genre,subgenre,trackingId){
var path='bestsellers/genre/'+genre.lescape();
if(subgenre){
path+='/'+subgenre.lescape();
}
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},
BestsellersLabel:function(label,trackingId){
var path='bestsellers/label/'+label.lescape();
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},

Playlists:function(trackingId){
return this._resolvePath('playlists',null,trackingId);
},
PlaylistsGenre:function(genre,subgenre,trackingId){
var path='playlists/genre/'+genre.lescape();
if(subgenre){
path+='/'+subgenre.lescape();
}
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},
PlaylistsLabel:function(label,trackingId){
var path='playlists/label/'+label.lescape();
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},

Influencers:function(trackingId){
return this._resolvePath('influencers',null,trackingId);
},
InfluencersGenre:function(genre,subgenre,trackingId){
var path='influencers/genre/'+genre.lescape();
if(subgenre){
path+='/'+subgenre.lescape();
}
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},
InfluencersLabel:function(label,trackingId){
var path='influencers/label/'+label.lescape();
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},

Listeners:function(trackingId){
return this._resolvePath('listeners',null,trackingId);
},
ListenersGenre:function(genre,subgenre,trackingId){
var path='listeners/genre/'+genre.lescape();
if(subgenre){
path+='/'+subgenre.lescape();
}
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},
ListenersLabel:function(label,trackingId){
var path='listeners/label/'+label.lescape();
return this._resolvePath(path.lunderbarsForSpaces(),null,trackingId);
},

PaymentMethod:function(type){
var url;
if(type){
url=lala.sslActionBaseURL+'/purchase/'+type;
}else{
url=lala.URL.PaymentMethod;
}
return this._getExternalPageHref(url);
},
Playlist:function(token,autoPlay,clickTrackingId){
var path='playlist/'+token;
if(autoPlay){
path+=':auto';
}
return this._resolvePath(path,null,clickTrackingId);
},
MemberPlaylist:function(token,clickTrackingId,title,msgToken){
var path='memberplaylist/'+token;
if(title){
path+='/'+title.lescapeForHash().lunderbarsForSpaces();
}
var params=null;
if(msgToken)params={msgToken:msgToken};
return this._resolvePath(path,params,clickTrackingId);
},
NewAPage:function(tabId,params,trackingId,basePathOverride){
var basePath=basePathOverride||MyMusic.g.getPagePath(true);
basePath=basePath.replace(/^[\/]/,'');
return this._resolvePath(basePath+'/more/'+tabId,params,trackingId);
},
PlaylistSource:function(sourcePath){
return this._resolvePath(sourcePath);
},
LockerPlaylist:function(playlistId,trackingId){
var path=playlistId;
return this._resolvePath(path,null,trackingId);
},

PlaySong:function(songId,trackingId){
var url=' href="javascript:void 0"';
if(trackingId){
url+=' onclick="frontend._playSongLink(\''+songId+'\',\''+trackingId+'\');"';
}else{
url+=' onclick="frontend._playSongLink(\''+songId+'\');"';
}
return url;
},
PluginCommand:function(){
return this._getExternalPageHref(lala.URL.PluginCommand);
},
Press:function(clickTrackingId){
return this._resolvePath('press',null,clickTrackingId);
},
PressQuotes:function(clickTrackingId){
return this._resolvePath('pressquotes',null,clickTrackingId);
},
PrivacyPolicy:function(clickTrackingId){
return this._resolvePath('privacypolicy',null,clickTrackingId);
},
ReceivedStatus:function(transToken){
return this._resolvePath('trade/receivedstatus/'
+transToken);
},
RecentlyAdded:function(clickTrackingId){
return this._resolvePath('recentlyAdded',null,clickTrackingId);
},
RecentlyListened:function(clickTrackingId){
return this._resolvePath('recentlyListened',null,clickTrackingId);
},
RecentlyUploaded:function(clickTrackingId){
return this._resolvePath('recentlyUploaded',null,clickTrackingId);
},
ReceivingHelp:function(transToken){
return this._resolvePath('helpwizard/received/'
+transToken);
},
Recos:function(trackingId){
return this._resolvePath('recos',null,trackingId);
},
RecosSent:function(){
return this._resolvePath('recos/sent');
},
RecosReceived:function(){
return this._resolvePath('recos/received');
},
RssFriendFeed:function(userToken,rssFeedToken){
return'href="'+lala.actionBaseURL+'/rss/'+userToken+'_'+rssFeedToken+'/friendfeed"';
},
RssLalaBlog:function(){
return'href="'+lala.actionBaseURL+'/rss/lalablog"';
},
RssRecentListens:function(userToken){
return'href="'+lala.actionBaseURL+'/rss/'+userToken+'/recentlistens"';
},
Search:function(query){
return this._resolvePath('search/'+query.lescapeForHash(true));
},
SearchAPage:function(query,tab){
return this._resolvePath('search/'+query.lescapeForHash(true)+'/'+tab);
},
SignIn:function(isFacebook){
return this._resolvePath('signin',null,null,{isFacebook:isFacebook});
},
SSignIn:function(){
return this._getExternalPageHref(lala.URL.SSignIn);
},
SignUp:function(){
return this._resolvePath('signup');
},
SSignUp:function(){
return this._getExternalPageHref(lala.URL.SSignUp);
},
SignOut:function(){
return this._getExternalPageHref(lala.URL.SignOut);
},
ShipIt:function(discId){
return this._resolvePath('trade/shipit/'+discId);
},
ShipLabel:function(transToken){
return this._resolvePath('trade/shiplabel/'+transToken);
},
ShippingHelp:function(transToken){
return this._resolvePath('helpwizard/shipped/'+transToken);
},
ShoppingCart:function(){
return this._resolvePath('shoppingcart');
},

Song:function(songId,trackingId,title,artist,fc){
var path='song/'+songId;
if(title){

if(artist)path+='/'+artist.lescapeForHash().lunderbarsForSpaces();
path+='/'+title.lescapeForHash().lunderbarsForSpaces();
}


if(fc){
path+='?fc='+fc;
}
return this._resolvePath(path,null,trackingId);
},
SongReco:function(songId,msgToken){
var path='song/'+songId;
if(msgToken)path+='::msgToken='+msgToken;
return this._resolvePath(path);
},
StorePolicy:function(){
return this._resolvePath('storepolicy');
},
StoreReturn:function(){
return this._resolvePath('storereturn');
},
SXSW:function(clickTrackingId){
return this._resolvePath('sxsw',null,clickTrackingId);
},
Trade:function(){
return this._resolvePath('trade/havelist');
},
TradeHistory:function(){
return this._resolvePath('trade/history');
},
TradePurchaseHistory:function(){
return this._resolvePath('accountinfo/purchases/trades');
},
TradeMessages:function(){
return this._resolvePath('trade/messages');
},
TradingSettings:function(){
return this._resolvePath('accountinfo/settings/trading');
},
WantList:function(){
return this._resolvePath('trade/wantlist');
},
WantListIncoming:function(){
return this._resolvePath('trade/wantlist/incoming');
},
TradingTransition:function(){
return this._resolvePath('tradingtransition');
},
TermsOfService:function(clickTrackingId){
return this._resolvePath('termsofservice',null,clickTrackingId);
},
TradingPolicy:function(){
return this._resolvePath('tradingpolicy');
},
ArtistInfo:function(clickTrackingId){
return this._resolvePath('artistinfo',null,clickTrackingId);
},


_resolvePath:function(path,params,trackingId,extraParams){
if(!extraParams)extraParams={};
if(!trackingId)trackingId='';
var href=null;


if(window.location.protocol=='https:'){
var port=mojo.DEV_FLAG?':'+lala.httpPort:'';
href=lala.actionBaseURL+port+'/'+path;

href=href.replace('https','http');
}else{
href=lala.actionBaseURL+'/'+path;
}
if(params&&mojo.isObject(params)){
href+=frontend.escapeInPageParams(params);
path+=frontend.escapeInPageParams(params);
}


if(this._fromLalaGo){
this._fromLalaGo=false;
if(lala.pageId=='Home'||lala.pageId=='MyMusic'){
if(!trackingId){
MyMusic.g.gotoPage(path);
}else{

MyMusic.g.gotoPageViaClick(null,path,trackingId,true);
}
}else{
lala.gotoPage.url(href);
}
return;
}


if(this._fromLalaUrl){
this._fromLalaUrl=false;
return href;
}

if(this._fromLalaPath){
this._fromLalaPath=false;
return'/'+path;
}


return this.getHrefAndOnClick(path,href,extraParams,trackingId);
},


getHrefAndOnClick:function(path,href,extraParams,trackingId){
var onclick=null;
var ret='href="'+href+'" ';




if(!mojo.LALA_CRAWLER&&(lala.pageId=='Home'||lala.pageId=='MyMusic')){
if(path!='signin'&&path!='signup'){
onclick=
'onclick="return MyMusic.g.gotoPageViaClick(event, \''
+path.lescapeQuotes()+'\',\''+trackingId+'\');" ';
}else{
var showSignIn=path!='signup';
onclick='onclick="MyMusic.g.signInRequired('+showSignIn;
if(extraParams.isFacebook){
onclick+=', null, null, null, null, null, '+true;
}
onclick+=');return false;" ';
}
}

if(onclick){
ret+=onclick;
}

return ret;
},

_getExternalPageHref:function(url){
if(this._fromLalaUrl){
this._fromLalaUrl=false;
return url;
}else if(this._fromLalaGo){
this._fromLalaGo=false;
lala.gotoPage.url(url);
}else{
return'href="'+url+'"';
}
}
};


frontend.url={
init:function(){
frontend.go.init();
frontend.path.init();

for(var k in frontend.link){
if(k.lstartsWith('_'))continue;
frontend.url[k]=this._makeClosure(k);
}
},

_makeClosure:function(k){
return function(){
frontend.link._fromLalaUrl=true;
var url=frontend.link[k].apply(frontend.link,arguments);
frontend.link._fromLalaUrl=false;
return url;
}
}
};


frontend.path={
init:function(){
for(var k in frontend.link){
if(k.lstartsWith('_'))continue;
frontend.path[k]=this._makeClosure(k);
}
},

_makeClosure:function(k){
return function(){
frontend.link._fromLalaPath=true;
var path=frontend.link[k].apply(frontend.link,arguments);
frontend.link._fromLalaPath=false;
return path;
}
}
};


frontend.go={
init:function(){
for(var k in frontend.link){
if(k.lstartsWith('_'))continue;
frontend.go[k]=this._makeClosure(k);
}
},

_makeClosure:function(k){
return function(){
frontend.link._fromLalaGo=true;
frontend.link[k].apply(frontend.link,arguments);
frontend.link._fromLalaGo=false;
}
}
};

frontend.img={
Album:function(albumId,size){


if(!albumId)albumId='72339069014638592';
if(!size)size='s';
switch(size){
case'albumXXLarge':size='xl';break;
case'albumXLarge':size='l';break;
case'albumLarge':size='m';break;
case'medium':size='s';break;
case'small':size='xs';break;
}
return lala.Servlet.CoverArt+'/'+albumId+'/'+size;
},

Artist:function(imgPath,size){
if(!imgPath){
var name=null;
switch(size){
case'large':name='artist-placeholder-200x150.jpg';break;
case'medium':name='artist-placeholder-96x72.jpg';break;
case'small':name='artist-placeholder-60x45.jpg';break;
}
return lala.Servlet.ArtistImage+'/default-images/'+name;
}

var dir='thumb-small';
switch(size){
case'large':dir='large';break;
case'medium':dir='thumb-large';break;
case'small':dir='thumb-small';break;
}
return lala.Servlet.ArtistImage+'/'+dir+imgPath;
},

ArtistLink:function(artist,size){
var height;
var width;
switch(size){
case'large':width='600px';height='200px';break;
case'medium':width='96px';height='72px';break;
case'small':width='60px';height='45px';break;
}
t=$T(lt.ArtistImage.imageWithLink)
.replaceToken('artistName',artist.artist)
.replaceToken('imgBasePath',artist.imgBasePath)
.replaceToken('height',height)
.replaceToken('width',width)
.replaceToken('size',size);
return t.compose();
},

Member:function(userStrOrObj,forceRefresh,facebookImgUrl,sizeStr){

var user=typeof(userStrOrObj)=='string'?eval(userStrOrObj):userStrOrObj;
var url;
if(facebookImgUrl){
url=facebookImgUrl;
if(facebookImgUrl.indexOf("silhouette")==-1){
url+='&lala=true';
}
}else{


var imgUrl=(user.isUserImagePublished||user.userImageType!='Upload')
?lala.avatarUrlFs
:lala.avatarUrlDb;
url=imgUrl
.replace('%USERTOKEN%',user.userToken)
.replace('%USERID%',user.userImageType!='Upload'
?user.userImageType:user.idHex)
.replace('%SIZE%',sizeStr||'original')
.replace('%EXT%',user.userImageExtension);
if(forceRefresh&&url.match(/[?]/)){
url+='&ck='+new Date().getTime();
}
}
return url;
},

MemberImgTag:function(userStrOrObj,
forceRefresh,
facebookImgUrl,
style,
size,
cls,
id,
alt,
renderTargetId,
preserveRatio){

var user=typeof(userStrOrObj)=='string'?eval(userStrOrObj):userStrOrObj;
if(forceRefresh){
if(typeof(forceRefresh)!='boolean'){
forceRefresh=forceRefresh=='true';
}
}else{
forceRefresh=false;
}

var t=$T(lt.MemberImage.imgTag,renderTargetId)
.replaceTokensWithBean('user',user)
.replaceToken('userToken',user.userToken)
.replaceToken('forceRefresh',forceRefresh)
.replaceToken('width',size?'width:'+size+'px;':'')
.replaceToken('sizeStr',size?size+'x'+size:'')
.replaceToken('class',cls)
.replaceToken('id',id)
.replaceToken('alt',alt)
.replaceToken('style',style);

if(!preserveRatio){
t.replaceToken('height',size?'height:'+size+'px;':'');
}
if(lala.showFacebookConnect&&facebookImgUrl){
t.replaceToken('facebookImgUrl',facebookImgUrl);
}


return t.compose();
},

MemberLink:function(userStrOrObj,
size,
clickTrackingId,
suppressHover,
extraClass,
renderTargetId,
forceRefresh){
var user=typeof(userStrOrObj)=='string'?eval(userStrOrObj):userStrOrObj;
if(!user)
user={};






if(!user.userToken||user.userToken=='')return'';
if(user.isOnline){
if(typeof(user.isOnline)!='boolean'){
user.isOnline=user.isOnline=='true';
}
if(lala.user&&lala.user.userToken==user.userToken){
user.isOnline=false;
}
}else{
user.isOnline=false;
}
if(user.isCurrentUserFollowing){
if(typeof(user.isCurrentUserFollowing)!='boolean'){
user.isCurrentUserFollowing=user.isCurrentUserFollowing=='true';
}
if(lala.user&&lala.user.userToken==user.userToken){
user.isCurrentUserFollowing=false;
}
}else{
user.isCurrentUserFollowing=false;
}
if(forceRefresh){
if(typeof(forceRefresh)!='boolean'){
forceRefresh=forceRefresh=='true';
}
}else{
forceRefresh=false;
}


var idNum=mojo.idGenerator++;

var t;
if(suppressHover){
t=$T(lt.MemberImage.imageWithLinkNoHover,renderTargetId);
}else{
t=$T(lt.MemberImage.imageWithLink,renderTargetId);
t.replaceToken('arrowTop',(size-4)+'px');
t.replaceToken('arrowLeft',(size-10)+'px');
t.replaceToken('hoverTriggerId','memberHoverTrigger_'+idNum);
}

t.replaceTokensWithBean('user',user)
.replaceToken('userToken',user.userToken)
.replaceToken('forceRefresh',forceRefresh)
.replaceToken('nickName',user.nickName)
.replaceToken('width',size?'width:'+size+'px;':'')
.replaceToken('height',size?'height:'+size+'px;':'')
.replaceToken('sizeStr',size?size+'x'+size:'')
.replaceToken('aSize',size+4)
.replaceToken('clickTrackingId',clickTrackingId)
.replaceToken('isCurrentUserFollowing',user.isCurrentUserFollowing)
.replaceToken('isOnline',user.isOnline);

if(extraClass){
t.replaceToken('extraClass',extraClass);
}
if(user.isCurrentUserFollowing){
t.replaceToken('following','lmemberpicfollowing');
}

if(user.isOnline){
t.replaceToken('onlineTop','2px');
t.replaceToken('onlineLeft',(size-2)+'px');
}else{
t.removeTokenBlock('OnlineBlock');
}

if(lala.showFacebookConnect&&user.facebookImgUrl){


if(mojo.isBoolean(user.isUseFacebookAvatar)&&!user.isUseFacebookAvatar){

}else{
t.replaceToken('facebookImgUrl',user.facebookImgUrl);
}
}

return t.compose();
},

AlbumLink:function(albumId,size,klass,mp3Only,clickTrackingId,suppressHover,
showSpecialTag,discTitle,discArtist,showMp3Sticker){
mp3Only=(mp3Only=='true'||mp3Only===true);


var origAlbumId=albumId;

if(!albumId)albumId='72339069014638592';
var albumTriggerId='albumTriggerId_'+mojo.idGenerator++;

var pixels='';
if(!size)size='small';

var imgClass='';
switch(size){
case'albumXXLarge':size='xl';pixels='550px';break;
case'albumXLarge':size='l';pixels='240px';break;
case'albumLarge':size='m';pixels='170px';imgClass='largeAlbumPic';break;
case'medium':size='s';pixels='80px';imgClass='mediumAlbumPic';break;
case'small':size='xs';pixels='60px';imgClass='smallAlbumPic';break;
case'tiny':size='xxs';pixels='40px';break;
case'supertiny':size='xxxs';pixels='30px';break;
}
var serverSize=size;
if(serverSize=='xxs'||serverSize=='xxxs')serverSize='xs';
var imgSrc=lala.Servlet.CoverArt+'/'+albumId+'/'+serverSize;

var t=suppressHover?$T(lt.AlbumImage.albumLinkNoHover):$T(lt.AlbumImage.albumLink);
t.replaceToken('imgSrc',imgSrc)
.replaceToken('size',pixels)
.replaceToken('sizeName',size)
.replaceToken('discTitle',discTitle)
.replaceToken('discArtist',discArtist)
.replaceToken('class',klass)
.keepTokenBlock('LinkBlock',!!origAlbumId)
.replaceToken('clickTrackingId',clickTrackingId)
.replaceToken('albumTriggerId',albumTriggerId)
.replaceToken('albumId',albumId)
.replaceToken('imgClass',imgClass);

if(mp3Only){
t.replaceToken('mp3Only','mp3Only');
}else{
t.removeTokenBlock('MP3OnlyBlock');
}
t.keepTokenBlock('SpecialPriceBlock',showSpecialTag);
t.keepTokenBlock('FreeMp3Block',showMp3Sticker);

return t.compose();
}
};

frontend._playSongLink=function(songId,fromTrackingId){
api.Player.getTrackInfo(songId,function(res){
if(res.ok&&res.data){
Player.g.playSong(res.data,fromTrackingId);
}
});
};




widgets.SearchAutoComplete=Class.create();
widgets.SearchAutoComplete.all={};

widgets.SearchAutoComplete.prototype={
initialize:function(params){
this.initializeSearch(params);
},

initializeSearch:function(params){
var self=this;
mojo.assert($(params.inputId),'invalid ac id: '+params.inputId);


this.artistOnly=mojo.isDefined(params.artistOnly)?params.artistOnly
:true;
this.autoRedirect=params.autoRedirect||false;
this.filter=params.filter||null;
this.global=params.global;
this.onRunSearch=params.onRunSearch;
this.appendQ=null;
this.onFillDelegate=null;
this.data=null;

this._id=params.inputId;
this._wiid=this._id;
this.templ=params.template||lt.SearchAutoComplete.row;
this.showAll=params.showAll;
this.showMix=params.showMix;
this.maxSuggestions=params.maxSuggestions;
this._ac=mojo.autocomplete.create(params);



this._ac.onaction=function(index,suggestions){
var val=$F(self._id);
var suggestion=null;
if(index!=-1){

suggestion=suggestions[index];
}
self._runSearch(val,suggestion);
};


this._ac.onfill=this._fetchMatches.lbind(this);
this._ac.onkeyupCallback=params.onkeyup||mojo.emptyFunction;

widgets.SearchAutoComplete.all[this._id]=this;
},

disable:function(shouldDisable){
this._ac.setDisabled(shouldDisable);
},

customizeQ:function(append){
this.appendQ=append;
},

_fetchMatches:function(sTerm){
var self=this;
if(!this.bodyListener){
mojo.dom.setEventListener(document.body,'onclick',function(evt){
self.hide();
});
this.bodyListener=true;
}
if(this.onFillDelegate){
this.onFillDelegate(sTerm,this.showAll);
return;
}

if(sTerm.lstartsWith('#'))return;

api.AutoComplete.getMatches(sTerm,
this.filter,
function(res){
self.data=res.data;
self.fillMatches(res.data,sTerm);
},
this.global,
this.appendQ);
},

fillMatches:function(data,sTerm){
var self=this;
var te=mojo.template.create(this.templ);
var html='';
this.suggestions=[];
if(data&&data.length>0){
if(this.showMix){
html+=$TC(lt.SearchAutoComplete.artistsTitle);
}

var maxSuggestionsToShow=this.maxSuggestions<=data.length?this.maxSuggestions:data.length;
var findTerm=sTerm.replace(/\[/g,'');
var pttn=new RegExp("\\b("+findTerm.lescapeRegExp()+")",'ig');
for(var j=0;j<maxSuggestionsToShow;j++){
var value=data[j].value;

var displayValue=value.replace(pttn,'<span class="emphasize">$1</span>');
te.replaceToken('value',displayValue);
te.replaceToken('wiid',this._wiid);
te.replaceToken('index',j);
te.next();
this.suggestions.push({
value:value
});
}
html+=te.compose();

if(this.showMix){
var t=$T(lt.SearchAutoComplete.mix);
var r=t.getTokenBlock('RowBlock');
var maxMixes=6;
var numMixes=0;
if(data.lcontainsAttr('ismix',true)){
data.leach(function(d,index){
if(!d.ismix||numMixes>=maxMixes)return;
var value=d.value;
var displayValue=value.replace(pttn,'<span class="emphasize">$1</span>');
r.replaceToken('artist',displayValue);
r.replaceToken('id',self._id)
.replaceToken('index',maxSuggestionsToShow+numMixes);
r.next();
self.suggestions.push({
value:value,
isFake:true
});
numMixes++;
});
html+=t.compose();
this._ac.onFakeSubmit=this.onMixSubmit.lbind(this);
}

}
}





this._ac.fill(sTerm,data?data.length:-1,html,this.suggestions);
},








_runSearch:function(userEnteredText,suggestion){

if(suggestion)$(this._id).value=suggestion.value;

var text=suggestion?suggestion.value:userEnteredText;
this.onRunSearch(text,suggestion);
this.hide();
},

hide:function(){
this._ac.hide();
},

onMixSubmit:function(index){
this.hide();
var artist=this.suggestions[index].value;
new MixDrawer({
displayValue:artist,
type:'artist',
artistName:artist
}).open();
}
};

widgets.ChunkySearchBox=Class.create();
widgets.ChunkySearchBox.prototype={
initialize:function(params){
if(!params)params={};
this.wiid=params.id||'chunkySearchBox_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.hideMix=params.hideMix;
this.trackingId=params.trackingId||'widget.ChunkySearchBox';

this.SEARCH_TEXT_DEFAULT='Enter artist name, album, or song';
widgets.ChunkySearchBox.all[this.wiid]=this;
},

render:function(){
var self=this;
var genres=DataModel.g.getDefaultGenres();

var t=$T(lt.ChunkySearchBox.search,this.renderTargetId)
.replaceToken('wiid',this.wiid)
.replaceToken('searchText',this.SEARCH_TEXT_DEFAULT);

gb=t.getTokenBlock('GenreBlock');
genres.leach(function(genre){
gb.replaceToken('genre',genre);
gb.replaceToken('trackingId',this.trackingId+'.genre');
gb.next();
});
t.compose();

this._autoComplete=new widgets.SearchAutoComplete({
inputId:this.wiid+'_search',
showMix:!this.hideMix,
maxSuggestions:6,
global:true,
offsets:{ie:2,ff:2},
divClassName:'chunkyAcc',
scrollWithBody:true,
onRunSearch:function(text,suggestion){
self._doSearch(text,suggestion);
}});
mojo.input.clearOnClick(this.wiid+'_search');

this.genreSelector=new widgets.core.GenreSelectorPopup();
},

onSearch:function(){
var searchText=$F(this.wiid+'_search');
if(searchText==''||searchText==this.SEARCH_TEXT_DEFAULT){
return;
}
this._doSearch(searchText);
this._autoComplete.hide();
},

_doSearch:function(text,suggestion){
lala.Track.clientPageNav(this.trackingId+'.search');


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){
ArtistPage.wrongArtistName=origSearchText||text;
frontend.go.Artist(text);
},

_gotoSearch:function(text){
frontend.go.Search(text);
}
};
widgets.ChunkySearchBox.all={};



widgets.Review=Class.create();
widgets.Review.all={};

widgets.Review.prototype={
initialize:function(params){

this.ALBUM_REVIEW_PREVIEW_LENGTH=200;
this.MEMBER_REVIEW_PREVIEW_LENGTH=80;
this.MAX_CHAR_COUNT=1500;

this._wiid=params.wiid||'reviewWidget_'+mojo.idGenerator++;
this._wInstance='widgets.Review.all.'+this._wiid;
this.album=params.album;
this.src=params.src;
if(this.album){
this.dst=this.album.groupId||this.album.id;
this.discId=this.album.id;
}else{
this.dst=null;
this.discId=null;
}
this.clipTextLength=this.album?this.ALBUM_REVIEW_PREVIEW_LENGTH:
this.MEMBER_REVIEW_PREVIEW_LENGTH;
this.isSummary=false;
this.showArtist=false;
this.templateNoData=lt.ReviewWidget.noData;
this.addEntryBoxId='reviewAddEntryBox'+this._wiid;
this.count=params.count||5;
this.renderDivId=params.renderDivId;
this.noReviewsText=params.noReviewsText||$TC(lt.ReviewWidget.noReviewsText);

this.editRatingsWidget=null;

if(params.paging){
this.paginator=new widgets.core.Paginator(
this._wiid+'_paginator_top','superLite',
this._wiid+'_paginator_bottom','superLite',false);
}

widgets.Review.all[this._wiid]=this;
},

loadAndRender:function(){
var self=this;

api.Messaging.getThreads({
src:this.src,dst:this.dst,
type:'DiscReview',count:this.count,
onResponse:this.render.lbind(this)});
},

render:function(res){
if(res)this.res=res;

this.reviews=res.data.threads;
var t=$T(lt.ReviewWidget.main,this.renderDivId);

var l=t.getTokenBlock('ReviewBlock');

t.replaceToken('wiid',this._wiid);
if(this.src){
t.removeTokenBlock('AddReviewBlock');
}
if(this.reviews.length==0){
t.replaceToken('noReviewsText',this.noReviewsText);
t.removeTokenBlock('ReviewBlock');
}else{
for(var i=0;i<this.reviews.length;i++){
var review=this.reviews[i];

if(!review.src.userToken){
l.getTokenBlock('MemberBlock').removeTokenBlock("IsActiveMember");
}else{
l.getTokenBlock('MemberBlock')
.getTokenBlock("IsActiveMember")
.replaceTokensWithBean("user",review.src);
}
var rating=0;
if(!review.params){
mojo.log.error("album review missing rating");
}else{
rating=review.params.rating;
}
l.replaceTokensWithBean('review',review);
l.replaceToken('reviewLastModTime',review.lastModTime.lgetDaysAgoLabel('Today',false,!this.src));


if(this.album){
l.replaceToken('nickNameClassName',frontend.getMemberClassName(review.src));
l.removeTokenBlock('AlbumBlock');
}else{
l.replaceToken('reviewClass','showAlbum');
l.removeTokenBlock('MemberBlock');
}

var maxLength=850;
if(review.text.length>=maxLength){
maxLength=review.text.substring(0,maxLength).lastIndexOf(' ');


var lastOpenIndex=review.text.substring(0,maxLength).lastIndexOf('[[');
if(lastOpenIndex>-1&&(lastOpenIndex>review.text.substring(0,maxLength).lastIndexOf(']]'))){
maxLength=lastOpenIndex-1;
}

l.replaceToken('reviewText',review.text.ltruncate(maxLength,true));
}else{
l.removeTokenBlock('ReadMore');
l.replaceToken("reviewText",review.text);
}

l.replaceToken("canDelete",review.canDelete?'':'none');

rating=parseFloat(rating);
rating=(rating>5)?5:rating;
var ratingClass='';
if(rating>0){
ratingClass+='star'+rating;
}
l.replaceToken('ratingClass',ratingClass);

l.replaceToken("wiid",this._wiid);
l.next(i<(this.reviews.length-1)?"<div class='lthinhr'></div>":'');
}



if(this.res.data.total>0){
t.replaceToken('count',this.res.data.total);
var arg=!this.album?this.src:this.album.id;
}else{
t.replaceToken('canViewAll','none');
}

}
t.replaceToken('maxCharCount',this.MAX_CHAR_COUNT);
t.replaceToken('charsLeft',this.MAX_CHAR_COUNT);
t.compose();

if(this.paginator){
this.paginator.renderTwo(this.res);
}

if(!this.isSummary&&lala.user&&!this.src){
this.ratingsWidget=new widgets.Ratings('st_'+this._wiid,
'ratingsContainer'+this._wiid);
}
},

setVerboseMode:function(){
this.showArtist=true;
},

toggleReadMore:function(reviewMsgToken){
$D('readMoreLink_'+reviewMsgToken,false);
var text=this.res.data.threadsByToken[reviewMsgToken].text;
$S('reviewText_'+reviewMsgToken,text);
},




addReview:function(btn){
if(frontend.requiresSignin())return;

var inputElem=$('reviewTextContainer_'+this._wiid);
var text=$F(inputElem);

if(!this.checkLength(text))return;

var rating=this.ratingsWidget.getCurrentRating();
if(mojo.isEmpty(text))return;

if(rating==-1){
alert("Please rate the album by clicking on the dots below.");
return;
}


inputElem.value="";

btn.disabled=true;

var me=this;
api.Messaging.createThread({
src:lala.user.userToken,dst:this.dst,
generateLinks:true,
type:'DiscReview',text:text,rating:rating,discId:this.discId,
onResponse:function(res){
me.reviews.linsertAt(0,res.data);
me.ratingsWidget.reset();

me.loadAndRender();

mojo.listeners.notify(
api.Messaging.EVT_REVIEW_CREATED,
{comment:text,
album:me.album,
rating:rating});
}});
},




remove:function(threadToken){
if(!confirm(strings.Reviews.remove))return;
var me=this;
api.Messaging.deleteThread({
threadToken:threadToken,
onResponse:function(res){
var tmp=[];
me.reviews.leach(function(review){
if(review.msgToken!=threadToken){
tmp.push(review);
}
});
me.reviews=tmp;
me.loadAndRender();
}});
},




openEditDialog:function(threadToken){
if(frontend.requiresSignin())return;

var review=this.res.data.threadsByToken[threadToken];
var t=mojo.template.create(lt.ReviewWidget.editDialog);
t.replaceTokensWithBean('review',review);
t.replaceToken('maxCharCount',this.MAX_CHAR_COUNT);
t.replaceToken('charsLeft',this.MAX_CHAR_COUNT-review.origText.length);
t.replaceToken('wiid',this._wiid);

var rating=review.params.rating||0;
rating=parseFloat(rating);
rating=(rating>5)?5:rating;
var ratingClass='';
if(rating>0){
ratingClass+='star'+rating;
}
t.replaceToken('ratingClass',ratingClass);

var d=new MojoDialog({
id:'editReviewDialog',
title:'Edit Review'
});

d.open(t.compose());
this.editRatingsWidget=new widgets.Ratings('stEdit',
'editRatingsContainer',true);
this.editRatingsWidget.setCurrentRating(rating);
},

cancelEdit:function(threadToken){
MojoDialog.close();
},

update:function(threadToken){
var text=$F('editReviewText');
var review=this.res.data.threadsByToken[threadToken];
var rating=this.editRatingsWidget.getCurrentRating();

if(text==review.origText&&
rating==review.params.rating){
MojoDialog.close();
return;
}


if(!this.checkLength(text))return;

$('editReviewUpdate').disabled=true;


var me=this;
api.Messaging.updateReply({
msgToken:threadToken,text:text,rating:rating,
generateLinks:true,
onResponse:function(res){
review.subject=res.data.subject;
review.text=(me.isSummary)?res.data.innerText:res.data.text;
review.origText=res.data.origText;
mojo.setContent('reviewTextContainer_'+threadToken,review.text);

review.params.rating=rating;
$('st_'+threadToken).className='rating star'+rating;

MojoDialog.close();
}});
},


toggleAddReview:function(){
if(frontend.requiresSignin())return;
if(lala.user&&lala.user.isForumReadOnly){
lala.showAck("You have restricted access and are only allowed to read reviews.");
return;
}
var addDiv=$(this.addEntryBoxId);
var reviewBox=$('reviewTextContainer_'+this._wiid);
if(addDiv&&addDiv.style.display!='none'){
var me=this;
var fn=function(){
mojo.css.display(addDiv,false);
$('reviewTextContainer_'+me._wiid).value='';
me.ratingsWidget.reset();
};
mojo.css.display(addDiv,false);
$('reviewTextContainer_'+me._wiid).value='';
me.ratingsWidget.reset();
}else if(addDiv){
mojo.css.display(addDiv,true);
reviewBox.focus();
}
},

handleAddReview:function(event,input){
event=event?event:window.event;
this.addReview(input);
},

checkLength:function(text){
if(text.length>this.MAX_CHAR_COUNT){
alert("Your review is too long. Please make it shorter.");
return false;
}else{
return true;
}

},

updateCharCount:function(field,maxlength,charCountElem){
$S(charCountElem,maxlength-field.value.length);
}
};





widgets.Ratings=Class.create();
widgets.Ratings.UNRATED=-1;
widgets.Ratings.prototype={
initialize:function(starId,containerId,isEdit){
this._starId=starId;
var starEl=$(this._starId);
mojo.assert(starEl,"No element for "+this._starId);
starEl.onmousemove=this.handleRatingMove.lbind(this);
starEl.onmouseout=this.handleRatingMouseOut.lbind(this);
starEl.onclick=this.handleRatingChange.lbind(this);

this._currReviewRating=widgets.Ratings.UNRATED;
this._containerId=containerId;
this._isEdit=isEdit||false;
},

getCurrentRating:function(){
return this._currReviewRating;
},

setCurrentRating:function(newRating){
this._currReviewRating=newRating;
},

reset:function(){
this._currReviewRating=widgets.Ratings.UNRATED;
},

handleRatingMove:function(event){
event=mojo.event.create(event);
var targetElem=$(event.target.id);
targetElem.className='rating star'+this._getNewRating(event);
},

handleRatingMouseOut:function(event){
event=mojo.event.create(event);
var targetElem=$(event.target.id);

targetElem.className=(this._currReviewRating>0)?
'rating star'+this._currReviewRating:'rating';
},

handleRatingChange:function(event){
event=mojo.event.create(event);
this._currReviewRating=this._getNewRating(event);
},

_getNewRating:function(event){
var offsetX=event.target.offsetLeft;
var posX=event.posX-offsetX;
if(mojo.IE&&this._isEdit)posX=event.posX-$B(event.target).left;
var rating=Math.ceil(posX/16);
if(rating>5)rating=5;

return rating;
}
}

strings.Reviews={
remove:'Are you sure you want to delete this review?'
};



Header=Class.create();
Header.prototype={
tradeUpdaterWin:null,

initialize:function(){
this.playlistPulldown=null;
this.resizeScrollTimer=null;
this.collectionMenuDirty=true;


this.blockAdd=true;
},

onLoad:function(){
var self=this;

var headerRegion=$('headerRegion');
if(!headerRegion)return;

$TC(lt.Header.Logo,"headerLogoContainer");

this.renderHeaderToolbar();
var logo=$('headerLogo');
logo.href=frontend.url.Home('globalNav.Header.navigation.logo');
logo.onclick=function(){
frontend.go.Home('globalNav.Header.navigation.logo');
return false;
};

mojo.listeners.addGlobal(
api.User.EVT_PERSONAL_INFO,
this.personalInfoChanged.lbind(this));

api.Store.initCart();
this.updateShoppingCart();
mojo.listeners.addGlobal(
api.Store.EVT_CART_CHANGE,
this.updateShoppingCart.lbind(this));

this._initFacebookConnectListeners();

if(typeof(MyMusic)!='undefined'){
mojo.listeners.addGlobal(
DataModel.EVT_PENDING_PLAYLIST_COUNT_CHANGE,
this.onPlaylistCountChange.lbind(this));

mojo.listeners.addGlobal(
DataModel.EVT_PENDING_DOWNLOAD_COUNT_CHANGE,
this.onDownloadCountChange.lbind(this));

mojo.listeners.addGlobal(
DataModel.EVT_PENDING_BLURB_COUNT_CHANGE,
this.onBlurbCountChange.lbind(this));

mojo.listeners.addGlobal(
DataModel.EVT_PENDING_GIFT_COUNT_CHANGE,
this.onGiftCountChange.lbind(this));

mojo.listeners.addGlobal(
DataModel.EVT_PENDING_FOLLOWER_COUNT_CHANGE,
this.onFollowerCountChange.lbind(this));

mojo.listeners.addGlobal(
DataModel.EVT_PENDING_RECO_COUNT_CHANGE,
this.onRecoCountChange.lbind(this));

mojo.listeners.addGlobal(
DataModel.EVT_PENDING_UPLOADEDSONG_COUNT_CHANGE,
this.onUploadedSongCountChange.lbind(this));

if(mojo.IE6){
mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_LOADED,
this.onPageLoaded.lbind(this));
}

mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_RESIZE,
this.onPageResizeOrScroll.lbind(this));

mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_SCROLL,
this.onPageResizeOrScroll.lbind(this));
mojo.listeners.addGlobal(
api.Trading.EVT_LIST_CHANGE,
this.onTradingCountChange.lbind(this));
}

this.updateShoppingCart();
this.checkCookies();
},

_initFacebookConnectListeners:function(){
var self=this;
if(!lala.user||!lala.showFacebookConnect)return;


var fbElem=$('fbConnectStatus');
mojo.listeners.addGlobal(LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
if(!lala.user.facebookId)return;
$D(fbElem);
if(fbElem.className.lcontains('fbGrayIcon')&&LalaFBConnect.loggedInUser.name){
$AC(fbElem,'fbIcon');
$DC(fbElem,'fbGrayIcon');
fbElem.title=LalaFBConnect.TITLE_CONNECTED+LalaFBConnect.loggedInUser.name;
self.getOrRenderMemberLink('headerMemberImageContent');
}

});
mojo.listeners.addGlobal(LalaFBConnect.LISTENER_NOW_LOGGED_OUT,
function(){
$D(fbElem);
if(fbElem.className.lcontains('fbIcon')){
$AC(fbElem,'fbGrayIcon');
$DC(fbElem,'fbIcon');
fbElem.title=LalaFBConnect.TITLE_NOT_CONNECTED;
self.getOrRenderMemberLink('headerMemberImageContent');
}
});


$('headerSignoutLink').onclick=function(){
if(LalaFBConnect.isConnected()){
LalaFBConnect.openFacebookSignoutDialog();
}else{
frontend.go.SignOut();
}
return false;
};
},

_getSongCreditSlide:function(slideNum){
if(slideNum>=2&&frontend.hasOldCredits())slideNum++;
var t=$T(lt.Header['songCreditTutorial_'+slideNum]);
if(slideNum==2){
if(frontend.creditsExpired()){
t.removeTokenBlock('NotExpiredBlock');
t.removeTokenBlock('CreditsUsedBlock');
}else if(api.MicroWallet.credits>0){
t.getTokenBlock('NotExpiredBlock').dateFormatString='%B %e, %Y';
t.replaceToken('expireDate',frontend.getCreditExpireDate());
t.removeTokenBlock('ExpiredBlock');
t.removeTokenBlock('CreditsUsedBlock');
}else{
t.removeTokenBlock('NotExpiredBlock');
t.removeTokenBlock('ExpiredBlock');
}
}
return t.compose();
},

openSongCreditTutorial:function(){
if(!this.songCreditTutorial){
this.songCreditTutorial=new TutorialWidget({
numSlides:frontend.hasOldCredits()?4:5,
title:'Using your song credits',
slideCallback:this._getSongCreditSlide.lbind(this),
name:'songCreditTutorial'
});
}
this.headerMenus.hideAllMenus();
this.songCreditTutorial.open();
},

openBuyingTutorial:function(){
if(!this.buyingTutorial){
this.buyingTutorial=new TutorialWidget({
numSlides:3,
title:'Buying music on Lala',
templateScope:lt.Header,
templateNameBase:'buyingTutorial',
name:'buyingTutorial',
height:'250px'
});
}
this.headerMenus.hideAllMenus();
this.buyingTutorial.open();
},

getOrRenderMemberLink:function(renderTargetId){
if(!lala.user)return'';
var user={
userToken:lala.user.userToken,
userImageType:lala.user.userImageType,
userImageExtension:lala.user.userImageExtension,
idHex:lala.user.idHex,
nickName:lala.user.nickName,
facebookImgUrl:lala.user.isUseFacebookAvatar?lala.user.facebookImgUrl:null,
userImageUrl:lala.user.userImageUrl
}
return frontend.img.MemberLink(
user,
20,
'globalNav.Header.navigation.memberPic',
true,
'headerProfilePic',
renderTargetId,
true);
},

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

mojo.cookie.set('test','foo',1);
if(!mojo.cookie.get('test')){
lala.showAck($TC(lt.Header.cookiesDisabled));
lala.cookiesDisabled=true;
}
mojo.cookie.remove('test');

},

renderHeaderToolbar:function(){
var t=$T(lt.Header.rightToolbar,'rightToolbar')
.removeTokenBlock('MyMusicBlock',typeof(MyMusic)=='undefined');
var trackingId='globalNav.Header.navigation.Menu';

var menu=$T(lt.Header.menu,'headerMenuControls');
menu.replaceToken('trackingId',trackingId);

if(!lala.user){
menu.removeTokenBlock('LoggedInUserBlock');
menu.getTokenBlock('NonLoggedInUserBlock')
.removeTokenBlock(mojo.IE6?'NonIE6':'IE6');
}else{
menu.removeTokenBlock('NonLoggedInUserBlock');

if(!lala.isTradingEnabled){
menu.getTokenBlock('LoggedInUserBlock')
.removeTokenBlock('TradingBlock');
menu.getTokenBlock('LoggedInUserBlock')
.removeTokenBlock('TradingTransitionBlock');
}else{
if(lala.isTradingTransition){
menu.getTokenBlock('LoggedInUserBlock')
.removeTokenBlock('TradingBlock');
}else{
menu.getTokenBlock('LoggedInUserBlock')
.removeTokenBlock('TradingTransitionBlock');
}
}
}

var currTime=new Date().getTime();
var endDate=new Date(2009,11,26);
var endDate2=new Date(2010,0,19);
menu.removeTokenBlock('HolidayBlock',currTime>=endDate.getTime());
menu.removeTokenBlock('BestBlock',currTime<endDate.getTime()
||currTime>=endDate2.getTime());

menu.compose();

this.headerMenus=new MenuGroup();

if(lala.user){
var homeMenu=new MenuPulldown({
name:'home',
hoverTarget:'headerHomeButton',
clickTarget:'headerHomeTarget',
menuId:'headerHomeMenu',
className:'headerMenuPulldown',
group:this.headerMenus,
width:'170px'
});

$T(lt.Header.HomeMenu,'headerHomeMenu')
.replaceToken('trackingId',trackingId+'.MyLala')
.replaceTokensWithBean('user',lala.user)
.removeTokenBlock('BookmarksLink',!lala.isBookmarksEnabled)
.compose();

homeMenu.onBeforeOpen=function(){
return PlayerDrawer.g.isOpen();
};

var collectionMenu=new MenuPulldown({
name:'collection',
hoverTarget:'headerCollectionButton',
clickTarget:'headerCollectionTarget',
menuId:'headerCollectionMenu',
className:'headerMenuPulldown',
group:this.headerMenus,
width:mojo.IE6?'210px':'230px'
});

var self=this;
collectionMenu.onBeforeOpen=function(){
if(PlayerDrawer.g.isOpen()){
return true;
}

if(self.collectionMenuDirty){
var cmt=$T(lt.Header.CollectionMenu,'headerCollectionMenu');
cmt.replaceToken('trackingId',trackingId+'.MyCollection')

var playlistCounts=DataModel.g.getPlaylistCounts();

var uploadedCount=playlistCounts['recentlyUploaded']||0;
var addedCount=playlistCounts['recentlyAdded']||0;
var countInfo;

if(uploadedCount>0){
countInfo=self.getAlertCountInfo(uploadedCount);
cmt.replaceToken('uploadedAlertClass',countInfo.className);
cmt.replaceToken('uploadedAlertText',countInfo.label);
}

if(addedCount>0){
countInfo=self.getAlertCountInfo(addedCount);
cmt.replaceToken('addedAlertClass',countInfo.className);
cmt.replaceToken('addedAlertText',countInfo.label);
}

var userPlaylists=DataModel.g.getRecentPlaylists()||[];
var numPlaylists=userPlaylists.length;
if(numPlaylists>0){
var renderCount=Math.min(numPlaylists,6);
cmt.replaceToken('playlists',
self._renderPlaylists(userPlaylists,renderCount,trackingId))
cmt.removeTokenBlock('NoPlaylistsBlock');
}
if(numPlaylists<=6)cmt.removeTokenBlock('ShowMoreBlock');
cmt.compose();

self.collectionMenuDirty=false;
}


var homeButton=$('headerHomeButton');
if(homeButton){
homeButton.onclick=function(event){
event=new MojoEvent(event);
if(event&&!mojo.css.containsClass(event.target,'headerNoAnchor')){
frontend.go.Home(trackingId+'.MyLala.homeMainLink');
}
return false;
}
}

var collectionButton=$('headerCollectionButton');
if(collectionButton){
collectionButton.onclick=function(event){
event=new MojoEvent(event);
if(event&&!mojo.css.containsClass(event.target,'headerNoAnchor')){
frontend.go.Collection(trackingId+'.MyCollection.collectionMainLink');
}
return false;
}
}
}

if(lala.isTradingEnabled){
if(!lala.isTradingTransition){
var tradingMenu=new MenuPulldown({
name:'trading',
hoverTarget:'headerTradingButton',
clickTarget:'headerTradingTarget',
menuId:'headerTradingMenu',
className:'headerMenuPulldown',
group:this.headerMenus
});

var requestedInfo=this.getAlertCountInfo(lala.user.canShipCount||0);
var incomingInfo=this.getAlertCountInfo(lala.user.willReceiveCount||0);

$T(lt.Header.TradingMenu,'headerTradingMenu')
.replaceToken('requestedClass',requestedInfo.className)
.replaceToken('requestedCount',requestedInfo.label)
.replaceToken('incomingClass',incomingInfo.className)
.replaceToken('incomingCount',incomingInfo.label)
.compose();

tradingMenu.onBeforeOpen=function(){
return PlayerDrawer.g.isOpen();
};

var tradingButton=$('headerTradingButton');
if(tradingButton){
tradingButton.onclick=function(event){
event=new MojoEvent(event);
if(event&&!mojo.css.containsClass(event.target,'headerNoAnchor')){

frontend.go.Trade();
}
return false;
};
}
}
}

t.replaceTokensWithBean('user',lala.user);
t.replaceToken('shortNickName',lala.user.nickName.ltruncate(20));
t.replaceToken('clickTrackingId','header.memberpic');
t.removeTokenBlock('NotLoggedInBlock');
}else{
t.removeTokenBlock('LoggedInBlock');

var signUpMenu=new MenuPulldown({
name:'signup',
hoverTarget:'headerSignUpButton',
clickTarget:'headerSignUpTarget',
menuId:'headerSignUpMenu',
className:'headerSignUpPulldown',
group:this.headerMenus,
width:'300px'
})

signUpMenu.onBeforeOpen=function(){
if(PlayerDrawer.g.isOpen()){
return true;
}

var bmt=$T(lt.Header.SignUpMenu,'headerSignUpMenu');
bmt.compose();
}

var signUpButton=$('headerSignUpButton');
if(signUpButton){
signUpButton.onclick=function(event){
event=new MojoEvent(event);
if(event&&!mojo.css.containsClass(event.target,'headerNoAnchor')){
MyMusic.g.signInRequired(null,null,'signUpMenu');
}
return false;
}
}
}

var browseMenu=new MenuPulldown({
name:'browse',
hoverTarget:'headerBrowseButton',
clickTarget:'headerBrowseTarget',
menuId:'headerBrowseMenu',
className:'headerMenuPulldown',
group:this.headerMenus,
width:'150px'
})

browseMenu.onBeforeOpen=function(){
if(PlayerDrawer.g.isOpen()){
return true;
}

var bmt=$T(lt.Header.BrowseMenu,'headerBrowseMenu');
bmt.replaceToken('trackingId',trackingId+'.Browse')

var favBlock=bmt.getTokenBlock('FavoriteGenresBlock');
var favGenres=DataModel.g.getFavoriteGenres()||[];
var i;

for(i=0;i<favGenres.length;i++){
favBlock.replaceToken('genre',favGenres[i]);
favBlock.replaceToken('href',frontend.link.BrowseGenre(favGenres[i],null,trackingId+'.Browse.favGenreLink'));
favBlock.next();
}

var allBlock=bmt.getTokenBlock('AllGenresBlock');
var allGenres=DataModel.g.getAllGenres()||[];
for(i=0;i<allGenres.length;i++){
allBlock.replaceToken('genre',allGenres[i]);
allBlock.replaceToken('href',frontend.link.BrowseGenre(allGenres[i],null,trackingId+'.Browse.allGenreLink'));
allBlock.next();
}

bmt.compose();
}

var browseButton=$('headerBrowseButton');
if(browseButton){
browseButton.onclick=function(event){
event=new MojoEvent(event);
if(event&&!mojo.css.containsClass(event.target,'headerNoAnchor')){
frontend.go.Browse(trackingId+'.Browse.browseMainLink');
}
return false;
}
}

if(typeof(MyMusic)!='undefined'){
t.replaceToken('hrefAndOnClick','href="javascript:MyMusic.g.signInRequired(null,null,\'header\');window.noop;"');
}else{
t.replaceToken('hrefAndOnClick',frontend.link.SignUp());
}
if(lala.showFacebookConnect&&lala.user){

t.replaceToken('fbConnectEnabled','fbConnectEnabled')
.replaceToken('fbTitle',LalaFBConnect.TITLE_NOT_CONNECTED)
.replaceToken('fbIconGray','fbGrayIcon');
if(!lala.user.facebookId){
t.replaceToken('fbConnectIconDisplay','lnone');
}
}else{
t.replaceToken('fbConnectIconDisplay','lnone');
}
t.replaceToken('memberLink',this.getOrRenderMemberLink());
t.compose();

var creditsMenu=new MenuPulldown({
name:'credits',
hoverTarget:'headerCreditCount',
menuId:'headerCreditMenu',
className:'headerMenuPulldown',
group:this.headerMenus,
width:'250px'
});

creditsMenu.onBeforeOpen=this._renderCreditsMenu.lbind(this);
creditsMenu.onClose=function(){
$('headerCreditCount').style.color='';
}
},

_renderCreditsMenu:function(){
if(!lala.user||PlayerDrawer.g.isOpen()){
return true;
}






var credMenu=$T(lt.Header.CreditsMenu,'headerCreditMenu');

var msg,title=null;
var dateFormat='%B %e, %Y at %l:%M %p';
frontend.checkExpiration();
if(api.MicroWallet.credits<=0){
credMenu.replaceToken('menuClass','hurryUp');
msg=$T(lt.Header.creditMenuNoneLeftMessage);
title=$T(lt.Header.creditMenuNoneLeftTitle);

if(frontend.creditsExpired()){
msg.getTokenBlock('ExpiredBlock').dateFormatString=dateFormat;
msg.replaceToken('expireTime',frontend.getCreditExpireDate());
}else{
msg.removeTokenBlock('ExpiredBlock');
}
}else{
var now=new Date().getTime();

var timeLeft=(frontend.getCreditExpireDate().getTime()-now)/1000;
var unit='second';

if(timeLeft/60>1){
timeLeft/=60;
unit='minute';
if(timeLeft/60>1){
timeLeft/=60;
unit='hour';
if(timeLeft/24>1){
timeLeft/=24;
unit='day';
}
}
}

timeLeft=Math.round(timeLeft);
if(!frontend.creditsAboutToExpire()||frontend.hasOldCredits()){
credMenu.replaceToken('menuClass','normal');
msg=$T(lt.Header.creditMenuNormalMessage);
msg.getTokenBlock('CreditsExpireBlock').dateFormatString=dateFormat;
title=$T(lt.Header.creditMenuNormalTitle);

if(frontend.hasOldCredits()){
title=$T(lt.Header.creditMenuOldCreditsTitle);
msg.removeTokenBlock('CreditsExpireBlock');
}
}else{
credMenu.replaceToken('menuClass','hurryUp');
title=$T(lt.Header.creditMenuHurryUpTitle);
msg=$T(lt.Header.creditMenuHurryUpMessage);
msg.dateFormatString=dateFormat;

}

msg.replaceToken('numTime',timeLeft)
.replaceToken('timeUnit',unit)
.replaceToken('timeUnitS',timeLeft!=1?'s':'')
.replaceToken('expireTime',frontend.getCreditExpireDate());

title.replaceToken('numTime',timeLeft)
.replaceToken('timeUnit',unit)
.replaceToken('timeUnitS',timeLeft!=1?'s':'');
}

credMenu.replaceToken('title',title.compose())
.replaceToken('message',msg.compose())
.compose();
$('headerCreditCount').style.color='#FFF';
lala.Track.client('Header.interaction.Menu.Credits.open');
},

onPlaylistPlayClick:function(playlistLalaId,evt,playlistId){
Player.g.playMemberPlaylist(playlistLalaId,'collectionMenu.playSongs',
'playlist/'+playlistId);
Header.g.closeHeaderMenu();

evt=mojo.event.create(evt);
evt.stopPropagation();
lala.Track.client('Header.interaction.Menu.MyCollection.playPlaylist');
},

onShowAllPlaylists:function(){
$D('cmShowRecentButton',true,'inline');
$D('cmShowMoreButton',false);

var playlists=DataModel.g.getPlaylists();
if(playlists.length>7)$AC('cmAllPlaylists','showAll');


$('cmAllPlaylists').style.height=$B('cmAllPlaylists').height+25+'px';
$S('cmAllPlaylists',this._renderPlaylists(playlists));

$S('cmPlaylistsTitle','Your playlists:');
lala.Track.client('Header.interaction.Menu.MyCollection.showAll');
},

onShowRecentPlaylists:function(){
$D('cmShowRecentButton',false);
$D('cmShowMoreButton',true);

$DC('cmAllPlaylists','showAll');
$('cmAllPlaylists').style.height='auto';
$S('cmAllPlaylists',this._renderPlaylists(DataModel.g.getRecentPlaylists(),6));

$S('cmPlaylistsTitle','Your recent playlists:');
lala.Track.client('Header.interaction.Menu.MyCollection.showRecent');
},

onCreatePlaylist:function(){
this.headerMenus.hideAllMenus();
MyMusic.g.openCreatePlaylistDialog(function(playlist){
frontend.go.Playlist(playlist.id);
});
},

_renderPlaylists:function(playlists,renderCount){
var trackingId='globalNav.Header.navigation.Menu';
if(!renderCount)renderCount=playlists.length;
var playlistCounts=DataModel.g.getPlaylistCounts();

var t=$T(lt.Header.CollectionMenuPlaylistItem);
var playlistBlock=t.getTokenBlock('PlaylistBlock');
for(var i=0;i<renderCount;i++){
var pl=playlists[i];
playlistBlock.replaceTokensWithBean('pl',pl);
playlistBlock.replaceToken('href',frontend.link.Playlist(pl.id,null,trackingId+'.MyCollection.myPlaylistLink'));

var count=playlistCounts[pl.id]||0;
var countInfo=this.getAlertCountInfo(count);
playlistBlock.replaceToken('alertClass',countInfo.className);
if(count>0){
playlistBlock.replaceToken('alertText',countInfo.label);
}
playlistBlock.next();
}
return t.compose();
},

onToggleAllGenres:function(){
var isExpanded=mojo.css.containsClass('bmAllGenresToggle','expanded');

if(isExpanded){
mojo.css.removeClass('bmAllGenresToggle','expanded');
mojo.css.display('bmAllGenres',false);
$('bmAllGenresIcon').className='expand';
}else{
mojo.css.addClass('bmAllGenresToggle','expanded');
mojo.css.display('bmAllGenres',true);
$('bmAllGenresIcon').className='collapse';
}
},

closeHeaderMenu:function(){
if(this.headerMenus){
this.headerMenus.hideAllMenus();
}
this.closeRecentActivity();
},

refreshHeaderMenu:function(){
if(this.headerMenus){
this.headerMenus.refreshMenu();
}
},

onTradingCountChange:function(){
var requestedElt=$('headerRequestedCount');
var incomingElt=$('headerIncomingCount');

if(requestedElt&&incomingElt){
var requestedInfo=this.getAlertCountInfo(lala.user.canShipCount);
requestedElt.className=requestedInfo.className;
this.setAlertCountText(requestedElt,requestedInfo.label);

var incomingInfo=this.getAlertCountInfo(lala.user.willReceiveCount);
incomingElt.className=incomingInfo.className;
this.setAlertCountText(incomingElt,incomingInfo.label);
}
},

onToggleRecentActivity:function(){
if(mojo.css.getComputedStyle('recentActivityContainer','display')!='block'){
this.openRecentActivity();
}else{
lala.Track.client('Header.interaction.RecentActivity.close');
this.closeRecentActivity();
}
},

openRecentActivity:function(){
var dropShadowBox=new widgets.core.DropShadowBox({
renderTargetId:'recentActivityContainer'
});
dropShadowBox.render();

$TC(lt.Header.recentActivity,dropShadowBox.getContentId());

switch(DataModel.g.getUserPreference('recentActivity','listened')){
case'listened':
this.openRecentListenActivity();
break;
case'explored':
this.openRecentExploredActivity();
break;
}

OverlayUtil.setupOverlayEventHandlers(this.closeRecentActivity.lbind(this));
},

closeRecentActivity:function(){
$D('recentActivityContainer',false);
OverlayUtil.clearOverlayEventHandlers();
},

setRecentActivityLinkStyle:function(anchor){
mojo.css.removeClass('recentlyListenedTab','active');
mojo.css.removeClass('recentlyExploredTab','active');
mojo.css.addClass(anchor,'active');
},

openRecentListenActivity:function(){
var self=this;

DataModel.g.setUserPreference('recentActivity','listened');
this.setRecentActivityLinkStyle('recentlyListenedTab');

api.Playlists.getRecentListenActivityData(function(res){
self.recentListenActivityData=res.data;
self.recentListenActivityCallback();
},16);
},

recentListenActivityCallback:function(){
lala.Track.client('Header.interaction.RecentActivity.open.Listened');

new widgets.AlbumList({
renderTargetId:'recentActivityAlbums',
clickTrackingId:'globalNav.Header.navigation.RecentActivity.Listened.Albums',
noAlbumsTemplate:$T(lt.Header.recentActivityEmptyShell)
.replaceToken('what','listened to any albums')
.replaceToken('doWhat','listen to music')
.replaceToken('whatTwo','albums of recent songs')
.replaceToken('doTwo','listen to')
.compose(),
layout:'listNarrow'
}).render(this.recentListenActivityData.albums.slice(0,8));

new widgets.ArtistList({
layout:'listWithImages',
imageSize:'medium',
containerClass:' ',
renderTargetId:'recentActivityArtists',
clickTrackingId:'globalNav.Header.navigation.RecentActivity.Listened.Artists',
emptyText:$T(lt.Header.recentActivityEmptyShell)
.replaceToken('what','listened to any artists')
.replaceToken('doWhat','listen to music')
.replaceToken('whatTwo','artists of recent songs')
.replaceToken('doTwo','listen to')
.compose()
}).render(this.recentListenActivityData.artists);

var hoverOffsets={};
if(mojo.FF2){
hoverOffsets.top=-2;
}else if(mojo.FF3){
hoverOffsets.top=-2;
if(mojo.MAC)hoverOffsets.top=-3;
}else if(mojo.IE7){
hoverOffsets.top=-3;
}else if(mojo.WEBKIT){
hoverOffsets.top=1;
}
new widgets.SongList({
renderTargetId:'recentActivityCol3',
clickTrackingId:'globalNav.Header.navigation.RecentActivity.Listened.Songs',
layout:'lite',
hideNum:true,
hideAlbum:true,
showListens:false,
emptyText:$T(lt.Header.recentActivityEmptyShell)
.replaceToken('what','listened to any songs')
.replaceToken('doWhat','listen to music')
.replaceToken('whatTwo','recent songs')
.replaceToken('doTwo','listen to')
.compose(),
offsets:hoverOffsets
}).render(this.recentListenActivityData.songs.slice(0,9));
$S('raCol3','Songs');

$D('recentActivityContainer',true);
},

openRecentExploredActivity:function(){
var self=this;

DataModel.g.setUserPreference('recentActivity','explored');
this.setRecentActivityLinkStyle('recentlyExploredTab');

api.Playlists.getRecentExploredActivityData(function(res){
self.recentExploredActivityData=res.data;
self.recentExploredActivityCallback();
},16);
},

recentExploredActivityCallback:function(){
lala.Track.client('Header.interaction.RecentActivity.open.Explored');

var albums=this.recentExploredActivityData.albums.lpluck('leahDisc');
new widgets.AlbumList({
renderTargetId:'recentActivityAlbums',
clickTrackingId:'globalNav.Header.navigation.RecentActivity.Explored.Albums',
layout:'listNarrow',
noAlbumsTemplate:$T(lt.Header.recentActivityEmptyShell)
.replaceToken('what','explored any albums')
.replaceToken('doWhat','browse pages')
.replaceToken('whatTwo','recent albums')
.replaceToken('doTwo','visit')
.compose()
}).render(albums.slice(0,8));

var artists=this.recentExploredActivityData.artists.lpluck('leahArtist');
new widgets.ArtistList({
layout:'listWithImages',
imageSize:'medium',
containerClass:' ',
clickTrackingId:'globalNav.Header.navigation.RecentActivity.Explored.Artists',
renderTargetId:'recentActivityArtists',
emptyText:$T(lt.Header.recentActivityEmptyShell)
.replaceToken('what','explored any artists')
.replaceToken('doWhat','browse pages')
.replaceToken('whatTwo','recent artists')
.replaceToken('doTwo','visit')
.compose()
}).render(artists.slice(0,16));

var users=this.recentExploredActivityData.members.lpluck('leahUser');
new widgets.UserList({
renderTargetId:'recentActivityCol3',
colCount:2,
clickTrackingId:'globalNav.Header.navigation.RecentActivity.Explored.Members',
emptyText:$T(lt.Header.recentActivityEmptyShell)
.replaceToken('what','explored any members')
.replaceToken('doWhat','browse pages')
.replaceToken('whatTwo','recent members')
.replaceToken('doTwo','visit')
.compose()
}).render(users.slice(0,10));
$S('raCol3','Members');

$D('recentActivityContainer',true);
},

clearHeaderCollectionCount:function(){
var collectionCount=$('headerCollectionCount');
if(collectionCount){
collectionCount.className='hiddenAlert';
this.setAlertCountText(collectionCount,0);
}
},

updateHeaderHomeCount:function(){
var bubble=$('headerHomeCount');
if(bubble){
var countInfo=this.getAlertCountInfo(DataModel.g.getPendingCountTotal('Home'));
bubble.className=countInfo.className;
this.setAlertCountText(bubble,countInfo.label);
}
},

updateHeaderCollectionCount:function(){
var bubble=$('headerCollectionCount');
if(bubble){
var countInfo=this.getAlertCountInfo(DataModel.g.getPendingCountTotal('Collection'));
bubble.className=countInfo.className;
this.setAlertCountText(bubble,countInfo.label);
}

},

onBubbleCountChange:function(bubbleCount,alertType){
var elem=$('headerCount_'+alertType);
if(elem){
var count=bubbleCount||0;
var countInfo=this.getAlertCountInfo(count);
elem.className=countInfo.className;
this.setAlertCountText(elem,countInfo.label);
}
this.updateHeaderHomeCount();
this.updateHeaderCollectionCount();
},

onDownloadCountChange:function(evt){
this.onBubbleCountChange(evt.count,'Download');
},

onBlurbCountChange:function(evt){
this.onBubbleCountChange(evt.count,'Blurb');
},

onGiftCountChange:function(evt){
this.onBubbleCountChange(evt.count,'Gift');
},

onFollowerCountChange:function(evt){
var anchor=$('homeMenuFollowerLink');
if(evt.count>0){
anchor.href=frontend.url.Followers('AddedTimestamp');
anchor.onclick=function(event){
MyMusic.g.gotoPageViaClick(event,frontend.path.Followers('AddedTimestamp'),'globalNav.Header.navigation.Menu.MyLala.peopleLink');
return false;
};
}else{
anchor.href=frontend.url.Following();
anchor.onclick=function(event){
MyMusic.g.gotoPageViaClick(event,frontend.path.Following(),'globalNav.Header.navigation.Menu.MyLala.peopleLink');
return false;
};
}
this.onBubbleCountChange(evt.count,'Follower');
},

onRecoCountChange:function(evt){
this.onBubbleCountChange(evt.count,'Reco');
},

onUploadedSongCountChange:function(evt){
this.onBubbleCountChange(evt.count,'UploadedSong');
},


onPlaylistCountChange:function(evt){
this.onBubbleCountChange(evt.count,evt.id);
Header.g.collectionMenuDirty=true;
},

setAlertCountText:function(elt,count){


if(mojo.FF){
elt.textContent=count;
}else{
elt.innerText=count;
}
},

getAlertCountInfo:function(count){
var info={label:count};
if(count>0){
if(count<10){
info.className='headerSkin bubbleAlert oneDigitAlert';
}else if(count<100){
info.className='headerSkin bubbleAlert twoDigitAlert';
}else if(count<1000){
info.className='headerSkin bubbleAlert threeDigitAlert';
}else{
info.className='headerSkin bubbleAlert fourDigitAlert';
info.label='999+';
}
}else{

info.className='hiddenAlert';
info.label='';
}

return info;
},

onPageLoaded:function(){
this.onPageResizeOrScroll();
},

onPageResizeOrScroll:function(){
if(this.resizeScrollTimer){
clearTimeout(this.resizeScrollTimer);
this.resizeScrollTimer=null;
}

var self=this;
this.resizeScrollTimer=setTimeout(function(){
self.doResizeOrScroll();
},40);
},

doResizeOrScroll:function(){

if(mojo.IE6){
var headerRegion=$("headerRegion");
if(headerRegion){
headerRegion.style.top=document.documentElement.scrollTop;
}
}

if(Player.g){
Player.g.updatePlayerPosition();
}
Header.g.refreshHeaderMenu();
},

personalInfoChanged:function(){
var nickName=lala.user.nickName;
$S('headerProfileLink',nickName.ltruncate(20));

var link=$('headerProfileLink');
if(link){
link.title=nickName;
}


var memberImage=$('headerMemberImage');


if(memberImage){
this.getOrRenderMemberLink('headerMemberImageContent');
}
},

updateShoppingCart:function(){
if(!$('headerRegion'))return;
var cartIcon=$('headerCartIcon');
var cartCount=$('headerCartCount');

if(!cartIcon||!cartCount)return;

var count=api.Store.cart.count;
var countInfo=this.getAlertCountInfo(count);
cartCount.className=cartIcon.className=countInfo.className;
this.setAlertCountText(cartCount,countInfo.label);
},


hideLinks:function(){
mojo.css.addClass('rightToolbar','lnone');
},


showLinks:function(){
mojo.css.removeClass('rightToolbar','lnone');
}
};
Header.g=new Header();




api.BillingHistory={
getStoreCharges:function(params,callback){
lala.sendRequest(
{url:'BillingHistory/getStoreCharges',
params:params,
onResponse:callback});
},

getTradingCharges:function(params,callback){
lala.sendRequest(
{url:'BillingHistory/getTradingCharges',
params:params,
onResponse:callback});
},

getChargeDetails:function(chargeToken,callback){
lala.sendRequest(
{url:'BillingHistory/getChargeDetails',
params:{chargeToken:chargeToken},
onResponse:callback});
}
};




api.MicroWallet={
EVT_BALANCE_CHANGE:"microBalanceChange",
EVT_BUYSONG_CHANGE:"microBuysongChange",
EVT_BUYSONG_DISC_CHANGE:"microBuysongDiscChange",
EVT_BUY_DOWNLOAD:"buyDownload",
EVT_BUY_WEB_ALBUM:"buyWebAlbum",
EVT_BUY_WEB_SONG:"buyWebSong",
EVT_BUY_MP3_ALBUM:"buyMP3Album",
EVT_BUY_MP3_SONGS:"buyMP3Songs",
EVT_BUY_MP3_PLAYLIST:"buyMP3Playlist",
EVT_GIFT_SONG:"giftSong",
balance:0,
credits:0,
walletOffers:[],
onSongsPurchased:mojo.emptyFunction,

init:function(wallet,offers){
this.balance=wallet.balance;
this.credits=wallet.credits;
offers.leach(function(offer){
offer.price=parseInt(offer.price);
});
this.walletOffers=offers;
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);
},

updateWallet:function(wallet){

if(wallet){
var oldBalance=this.balance;
var oldCredits=this.credits;

if(wallet.credits!=null){
this.credits=wallet.credits;
}else if(wallet.creditBalance!=null){
this.credits=wallet.creditBalance;
}

if(wallet.balance!=null){
this.balance=wallet.balance;
}else if(wallet.walletBalanceInCents!=null){
this.balance=wallet.walletBalanceInCents;
}

if(!lala.user.hasHadWallet&&this.balance>0)lala.user.hasHadWallet=true;

if(oldBalance!=this.balance||oldCredits!=this.credits){
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);
}
}
}
};



widgets.ImageUpload=Class.create();
widgets.ImageUpload.prototype={
open:function(onSuccess,params){
if(!params)params={};
if(!$('hiddenImageUploadFrame')){
mojo.dom.parseHTMLFragment(g_imageUploadFrameTemplate,document.body);
}

this.actionUrl=params.url||lala.URL.ImageUpload;
this.onSuccess=onSuccess;
this.dialog=new MojoDialog({
id:'imageUploadDialog',
title:params.title||"Upload Photo"
});
this.dialog.open($TC(params.uploadFormTemplate||g_imageUploadFormTemplate));
},

onUpload:function(event){
if($F('uploadInput')=='')return;

var self=this;
var evt=mojo.event.create(event);

var doSubmit=function(){
var form=$('imageUploadForm');
form.action=self.actionUrl;
form.submit();
};

lala.updateSubmitButton('uploadSubmitButton',doSubmit,true);
lala.updateSubmitButton('uploadCancelButton',null,true);
evt.stopPropagation();
},

resetUploadWidget:function(){
var input=$('uploadInput');
var newInput=document.createElement("input");
newInput.name="profile";
newInput.type="file";
newInput.size=40;
newInput.id="uploadInput";
input.parentNode.replaceChild(newInput,input);
},




onServerFinishedCallback:function(errorCode){
this._uploadFinished(errorCode);
},

_uploadFinished:function(errCode){
if(errCode==510){
alert(strings.UploadImg.error_scale);
}else if(errCode==511){
alert(strings.UploadImg.error_unsupportedMimeType);
}else if(errCode==401){
alert(strings.UploadImg.error_tooBig);
}else if(errCode!=0){
alert(strings.UploadImg.error_def);
}

lala.resetSubmitButton('uploadSubmitButton');
lala.resetSubmitButton('uploadCancelButton');

if(this.onSuccess)this.onSuccess();

if(errCode==0)this.dialog.close();
}
};
widgets.ImageUpload.g=new widgets.ImageUpload();

strings.UploadImg={
error_scale:'Something went wrong creating a thumbnail for your image.\n'
+'You can try again, but if this happens consistently, please try a smaller image.\n'
+'Note: Your image will be shrunk to fit inside 150x150.',
error_unsupportedMimeType:'The image type you uploaded is not supported.\n'
+'Please upload a JPG, GIF, or PNG file.',
error_tooBig:'That is a big image.\n'
+'Please select a image smaller than 2 MB.',
error_def:'Something went wrong receiving your image.\n'
+'Please try again.\n'
+'If this happens again please consider using a smaller image\n'
+'or contact us for additional help.'
};



api.AutoComplete={

ARTIST_CHECK_URL:'/api/AutoComplete/artistCheck',
GET_MATCHES_URL:'/api/AutoComplete/getMatches',
artistCheck:function(Q,onResponse){
var onPreProcess=function(res){
var autoRunValue=null;
var isArtist=false;
var isTag=false;

if(res.ok){
isArtist=res.data.isArtist;
isTag=res.data.isTag;
autoRunValue=res.data.autoRunValue;
}

onResponse(isArtist,isTag,autoRunValue);
};
mojo.http.sendRequest(
{url:api.AutoComplete.ARTIST_CHECK_URL+'/v'+(lala.buildVersion||'0'),
params:{Q:Q.lescapeQuotes()},
onResponse:onPreProcess,
method:'GET',
suppressErrors:true});
},

getMatches:function(Q,filter,onResponse,isGlobal,extraParams){
var params={Q:Q,filter:filter};
Object.extend(params,extraParams);

mojo.httpSingle.sendRequest({url:api.AutoComplete.GET_MATCHES_URL+'/v'+(lala.buildVersion||'0'),
params:params,
onResponse:onResponse,
method:'GET',
suppressErrors:true,
isGlobal:true});
}
};




api.Friends={
EVT_FRIENDS_CHANGED:'FRIENDS_CHANGED',
EVT_FOLLOWERS_CHANGED:'FOLLOWERS_CHANGED',
EVT_FOLLOWING_CHANGED:'FOLLOWING_CHANGED',

getFollowing:function(userToken,onResponse,count,order,sa,skip){
lala.sendRequest({
url:'Friends/getFollowing',
params:{userToken:userToken,skip:skip,
count:count||25,
sortKey:order||'LoginTimestamp',sortDir:sa?'Asc':'Desc'},
onResponse:onResponse});
},


getFollowingWithCounts:function(userToken,onResponse,count,order,sa,skip){
lala.sendRequest({
url:'Friends/getFollowingWithCounts',
params:{userToken:userToken,skip:skip,
count:count||25,
sortKey:order||'LoginTimestamp',sortDir:sa?'Asc':'Desc'},
onResponse:onResponse});
},

getFollowers:function(userToken,onResponse,count,order,sa,skip){
lala.sendRequest({
url:'Friends/getFollowers',
params:{userToken:userToken,skip:skip,
count:count||25,
sortKey:order||'LoginTimestamp',sortDir:sa?'Asc':'Desc'},
onResponse:onResponse});
},


getFollowersWithCounts:function(userToken,onResponse,count,order,sa,skip){
lala.sendRequest({
url:'Friends/getFollowersWithCounts',
params:{userToken:userToken,skip:skip,
count:count||25,
sortKey:order||'LoginTimestamp',sortDir:sa?'Asc':'Desc'},
onResponse:onResponse});
},

follow:function(userToken,friendType,onResponse,fromContext){
lala.Track.click('peopleActions.follow');
if(fromContext){
lala.Track.click('peopleActions.follow.from.'+fromContext);
}

lala.sendRequest({
url:'Friends/follow',
params:{userToken:userToken,type:friendType},
onResponse:function(res){
mojo.listeners.notify(api.Friends.EVT_FOLLOWING_CHANGED,
{amountChanged:1,user:res.data});
mojo.listeners.notify(api.Friends.EVT_FRIENDS_CHANGED);
onResponse(res);
}});
},

block:function(user,onResponse,fromContext){
lala.Track.click('peopleActions.block');
if(fromContext){
lala.Track.click('peopleActions.block.from.'+fromContext);
}

lala.sendRequest({
url:'Friends/block',
params:{userToBlock:user.userToken},
onResponse:function(res){
if(user.isCurrentUserFollowing){
mojo.listeners.notify(
api.Friends.EVT_FOLLOWING_CHANGED,
{amountChanged:-1,user:user});
}
if(user.isCurrentUserFollowedBy){
mojo.listeners.notify(
api.Friends.EVT_FOLLOWERS_CHANGED,
{amountChanged:-1,user:user});
}
mojo.listeners.notify(api.Friends.EVT_FRIENDS_CHANGED);
onResponse(res);
}
})
},

unblock:function(userToken,onResponse,fromContext){
lala.Track.click('peopleActions.unblock');
if(fromContext){
lala.Track.click('peopleActions.unblock.from.'+fromContext);
}

lala.sendRequest({
url:'Friends/unblock',
params:{userToken:userToken},
onResponse:function(res){
mojo.listeners.notify(api.Friends.EVT_FRIENDS_CHANGED);
onResponse(res);
}
});
},

followBatch:function(userTokenArray,onResponse){
lala.sendRequest({
url:'Friends/followBatch',
params:{userTokens:userTokenArray},
onResponse:function(res){
mojo.listeners.notify(
api.Friends.EVT_FOLLOWING_CHANGED,
{amountChanged:userTokenArray.length});
mojo.listeners.notify(api.Friends.EVT_FRIENDS_CHANGED);
onResponse(res);
},
method:'POST'});
},

stopFollowing:function(userToken,onResponse,fromContext){
lala.Track.click('peopleActions.stop');
if(fromContext){
lala.Track.click('peopleActions.stop.from.'+fromContext);
}

lala.sendRequest({
url:'Friends/stopFollowing',
params:{userToken:userToken},
onResponse:function(res){
mojo.listeners.notify(
api.Friends.EVT_FOLLOWING_CHANGED,
{amountChanged:-1,user:res.data});
mojo.listeners.notify(api.Friends.EVT_FRIENDS_CHANGED);
onResponse(res);
}});
},

getContacts:function(service,userName,password,onResponse){
lala.sendRequest({
url:'Friends/getContacts',
params:{service:service,
password:password,
userName:userName,
method:'POST'},
ssl:true,
onResponse:onResponse});
},

getContactData:function(onResponse){
lala.sendRequest({
url:'Friends/getContactData',
params:{},
onResponse:onResponse});
}
};



widgets.Share=Class.create();
widgets.Share.all={};
widgets.Share.REMOVE_RECIPIENT="shareWidgetRemoveRecipient";
widgets.Share.prototype={
initialize:function(params){
this.wiid=params.id||'share_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId||'';
this.shareObj=params.shareObj;
this.shareType=params.shareType;

this.MAX_RECIPIENTS=10;
this.recipients=[];
this.picker=new widgets.ShareEmailOrLalaTabs({
renderTargetId:'shareTopContent',
singleSelect:params.singleSelect,
selected:this.recipients,
maxRecipients:this.MAX_RECIPIENTS,
onSelectFriend:this.renderRecipients.lbind(this),
onTabClickExternal:this.onTabClick.lbind(this)
});

this.afterShare=mojo.emptyFunction();
widgets.Share.all[this.wiid]=this;
},

renderRecipients:function(){
var length=this.recipients.length;
if(length==0){
$S('recipientList','');
}else{
var t=$T(lt.Share.recipientList,'recipientList');
var b=t.getTokenBlock('RowBlock');
var self=this;

for(var i=length;i>0;i--){
var r=this.recipients[i-1];

b.replaceToken('value',r.displayName);
b.replaceToken('index',i-1);
b.replaceToken('wiid',self.wiid);
b.replaceToken('which',r.isMail?'mail'
:r.isFacebook?'facebook':'lala');
b.next();
}
t.compose();
}


$S('shareFriendCount',this.recipients.length);
},

removeRecipient:function(index){

var removedFriend=this.recipients.lremoveAt(index);
mojo.listeners.notify(widgets.Share.REMOVE_RECIPIENT,removedFriend);
this.renderRecipients();
},

getRecoSkeleton:function(shareType){
var msg="Hi, ";
msg+=lala.user&&lala.user.nickName?"it's "+lala.user.nickName+" -\n":"\n";
switch(shareType){
case'song':
msg+="Here's a song on Lala I think you'd enjoy!";
break;
case'album':
msg+="Here's an album on Lala I think you'd enjoy!";
break;
case'artist':
msg+="Here's an artist on Lala I think you'd enjoy!";
break;
case'playlist':
msg+="Here's a playlist on Lala I think you'd enjoy!";
break;
default:
mojo.log.error('getRecoSkeleton: unsupported reco type: '+shareType);
return;
}

var isFBConnected=LalaFBConnect.isConnected();

return $T(lt.Share.share)
.replaceToken('id',this.wiid)
.replaceToken('defaultMessage',msg)
.replaceToken('maxRecipients',this.MAX_RECIPIENTS)
.removeTokenBlock('FacebookBlock',!isFBConnected)
.compose();
},


recoThing:function(recipients,message){
var members=[];
var emails=[];
var facebookFriends=[];
if(recipients.length>this.MAX_RECIPIENTS){
lala.showAck($T(lt.Share.maxRecipientsReached)
.replaceToken('maxRecipients',this.MAX_RECIPIENTS)
.compose());
return;
}

recipients.leach(function(r){
if(r.isMail){
emails.push(r.displayName);
}else if(r.isFacebook){
facebookFriends.push(r.userToken);
}else{
members.push({userToken:r.userToken,nickName:r.nickName});
}
});

var self=this;
var lalaId;
switch(this.shareType){
case'song':
lalaId=this.shareObj.linkSongLalaId;
break;
case'album':
lalaId=this.shareObj.id;
break;
case'artist':
lalaId=this.shareObj.lalaId;
break;
case'playlist':
lalaId=this.shareObj.lalaId;
break;
default:
mojo.log.error('recoThing: unsupported reco type: '+this.shareType);
return;
}

var params={
msg:message,
members:members,
emails:emails,
facebookFriends:facebookFriends,
lalaId:lalaId,
shareType:this.shareType,
shareObj:this.shareObj,
onResponse:function(){
var fn=function(){self.afterShare();};

if(members.length<=0&&emails.length<=0){
fn();
}else{
var isPlural=members.length!=1;
$T(lt.Share.shareAck,'shareDialogButtons')
.replaceToken('s',isPlural?'s':'')
.replaceToken('haveOrHas',isPlural?'have':'has')
.compose();

window.setTimeout(fn,2000);
}
}
};

switch(this.shareType){
case'song':
api.Recos.sendSongRecoFromMember(params);
break;
case'album':
api.Recos.sendAlbumRecoFromMember(params);
break;
case'artist':
api.Recos.sendArtistRecoFromMember(params);
break;
case'playlist':
api.Recos.sendPlaylistRecoFromMember(params);
break;
default:
mojo.log.error('recoThing: unsupported reco type: '+this.shareType);

}
},

onShareSubmit:function(){
this._disable();
if($F('shareEmailAddress')!=''){
this.onAddEmail();
}
var recipients=this.recipients;
if(recipients.length<=0){
lala.showAck('Please enter a recipient',{isTimedHide:true});
this._enable();
return;
}
var msg=$F('shareSongMessage_'+this.wiid);

if(!msg){
lala.showAck('Please enter a message',{isTimedHide:true});
this._enable();
return;
}

if(msg.length>3000){
lala.showAck("Your message is too long. "
+"As my high school English teacher said, "
+"'Use fewer words to say more.'",{isTimedHide:true});
this._enable();
return;
}
this.recoThing(recipients,msg);
},

_disable:function(){
$('submit_'+this.wiid).disabled=true;
},

_enable:function(){
$('submit_'+this.wiid).disabled=false;
},

onAddEmail:function(){
var email=$F('shareEmailAddress');
if(email){

var emails=email.split(/\s*[,;]\s*/);
if((emails.length+this.recipients.length)>this.MAX_RECIPIENTS){
lala.showAck($T(lt.Share.maxRecipientsReached)
.replaceToken('maxRecipients',this.MAX_RECIPIENTS)
.compose());
return;
}
for(var i=0;i<emails.length;i++){
var e=emails[i];
if(e){
if(!this.validateEmailAddress('shareEmailAddress','errorEmail',e)){
return;
}
var obj={isMail:true,displayName:e};
if(!this.recipients.lcontainsAttr('displayName',e)){
this.recipients.push(obj);
}
}
}
$('shareEmailAddress').value='';
this.renderRecipients();
}

},

onTabClick:function(tab){
if(tab.id=='emailShareTab'){
$T(lt.Share.emailFormShare,tab.contentId)
.replaceToken('id',this.wiid)
.compose();
mojo.focus('shareEmailAddress');
mojo.input.onEnterKey('shareEmailAddress',this.onAddEmail.lbind(this));
}
},

validateEmailAddress:function(fieldId,errorId,overrideValue){
try{
mojo.util.validate({fieldId:fieldId,
overrideValue:overrideValue,
fieldName:'Email',
type:'email',
isRequired:true});
this.hideErrorMessage(errorId);
return true;
}catch(e){
this.showErrorMessage(errorId,e.errMsg||'Please enter a valid email address');
return false;
}
},

showErrorMessage:function(elem,msg){
$(elem).innerHTML=msg;
mojo.css.show(elem);
},

hideErrorMessage:function(elem){
mojo.css.hide(elem);
}
};

widgets.Share.sharePulldown=null;
widgets.Share.dialogShareWidget=null;

widgets.Share.openShoutSongDialog=function(){
var shareW=widgets.Share.getDialogShareWidget();
mojo.assert(shareW.shareType=='song',"Can only shout songs");

widgets.core.ShoutDialog.open(shareW.shareObj,shareW.shareType);
if(mojo.pulldown._openInstance){
mojo.pulldown._openInstance.close();
}

if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.shout');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.shout');
}

};

widgets.Share.openSharePulldown=function(params){
var song=params.song;
var elemId=params.elemId;
var outsideScroll=params.outsideScroll;
var relHackId=params.relHackId;
var showEmbedPlaylist=params.showEmbedPlaylist;
var onEmbedPlaylistCallback=params.onEmbedPlaylistCallback;
var onSharePlaylistCallback=params.onSharePlaylistCallback;
var inHeader=params.inHeader;
var songListWidget=params.songListWidget;
var onOpen=params.onBeforeOpen||mojo.emptyFunction;
var onClose=params.onClose||mojo.emptyFunction;


widgets.Share.song=song;
widgets.Share.songListWidget=songListWidget;
widgets.Share.onEmbedPlaylistCallback=onEmbedPlaylistCallback;
widgets.Share.onSharePlaylistCallback=onSharePlaylistCallback;

if(!widgets.Share.sharePulldown){
widgets.Share.sharePulldown=mojo.pulldown.create({
id:'songListSharePulldown',
target:elemId,
animate:false,
openBelowTarget:elemId,
disableOnClick:true
});
}

if(widgets.Share.sharePulldown.isVisible()){
widgets.Share.sharePulldown.close();
if(widgets.Share.sharePulldown.getTarget()==$(elemId))return;
}

widgets.Share.sharePulldown.setTarget({target:elemId,openBelowTarget:elemId});
widgets.Share.sharePulldown.onBeforeOpen=function(div){
var w=new widgets.core.RoundedBox({
renderTargetId:'songListSharePulldown',
mode:'dropShadow'
}).render();

var t=$T(lt.Share.shareDialog,w.contentId);


var showPartnerLinks=song&&lala.isMediaPlayerPartner;
t.keepTokenBlock('PartnerLinks',showPartnerLinks);
if(showPartnerLinks){
if(!(song.isLicensedForDownload&&!song.isDownloadAlbumOnly)){
t.replaceToken('disabledPartnerBuy','disabled');
t.replaceToken('disabledPartnerBuyClick','return false');
}
}

if(song){
t.replaceToken('discId',song.linkDiscLalaId);
t.replaceToken('songId',song.linkSongLalaId);
t.replaceToken('songPrice',song.addPrice);
t.replaceToken(
'shareURL',
encodeURIComponent(frontend.url.Song(song.linkSongLalaId).replace('#','')));

if(song.isForecast){
t.replaceTokenBlock('ForecastLink',lt.Share.inForecastLabel.compose());
}
if(!song.isLicensedForStreaming){



t.replaceToken('disabledClassWhenDigied','disabled');
t.replaceToken('disabledClickWhenDigied','return false');
t.replaceToken('disabledShoutClick','return false');
t.replaceToken('disabledShout','disabled');
}
}else{


t.replaceToken('disabledClassWhenDigied','disabled');
t.replaceToken('disabledClickWhenDigied','return false');
t.replaceToken('disabledEmbed','disabled');
t.replaceToken('disabledEmbedClick','return false');
t.replaceToken('disabledShoutClick','return false');
t.replaceToken('disabledShout','disabled');
}

if(!lala.user){
t.removeTokenBlock('RecoLink');
t.removeTokenBlock('ForecastLink');
t.removeTokenBlock('GiftLink');
t.removeTokenBlock('PlaylistLink');
}




if(!showEmbedPlaylist){
t.removeTokenBlock('PlaylistLink');
}else{

if(!onEmbedPlaylistCallback){
t.replaceToken('disabledEmbedPlaylist','disabled');
t.replaceToken('disabledEmbedPlaylistClick','return false');
}
if(!onSharePlaylistCallback){
t.replaceToken('disabledSharePlaylist','disabled');
t.replaceToken('disabledSharePlaylistClick','return false');
}
}
t.compose();

onOpen();
};

widgets.Share.sharePulldown.onClose=onClose;
widgets.Share.dialogShareWidget=null;
widgets.Share.getDialogShareWidget(song,'song');


if(relHackId)widgets.Share.sharePulldown._relHackId=relHackId;
widgets.Share.sharePulldown.open({scrollId:'scrollableViewDiv',left:-23,top:-2},outsideScroll,inHeader);
if(relHackId)widgets.Share.sharePulldown._relHackId=null;
};

widgets.Share.getDialogShareWidget=function(shareObj,shareType){

if(widgets.Share.dialogShareWidget){
if(shareObj){
widgets.Share.dialogShareWidget.shareObj=shareObj;
}
if(shareType){
widgets.Share.dialogShareWidget.shareType=shareType;
}
return widgets.Share.dialogShareWidget;
}


widgets.Share.dialogShareWidget=new widgets.Share({
shareObj:shareObj,
shareType:shareType
});

return widgets.Share.dialogShareWidget;
};

widgets.Share.onEmbedPlaylistClick=function(){
widgets.Share.onEmbedPlaylistCallback();
};

widgets.Share.onSharePlaylistClick=function(){
widgets.Share.onSharePlaylistCallback();
};


widgets.Share.openPickForecastDialog=function(){
if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.forecast');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.forecast');
}

var shareW=widgets.Share.getDialogShareWidget();
if(!shareW){
mojo.log.error('null share widget. hrm.');
}else{
if(shareW.shareType=='song'){
widgets.core.Forecast.openPickDialog(shareW.shareObj);
}
}
};




widgets.Share.openEmbedDialog=function(){
var shareW=widgets.Share.getDialogShareWidget();
mojo.assert(shareW.shareType=='song',"Only songs can be embedded via this widget");

if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.embed');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.embed');
}

var song=shareW.shareObj;
var songId=song.linkSongLalaId||song.id;
if(lala.user&&lala.user.isPartnerUploader
&&song.isUploaded&&!song.isQuasiUploaded){



songId=song.id;
}

var params={
type:'song',
title:'Song',
vars:{songLalaId:songId},
shareTitle:song.title+' - '+song.artist+' - listen now ',
footerText:song.title+" - "+song.artist
};

if(song.isLicensedForStreaming&&song.linkDiscLalaId){
params.shareLink=frontend.path.Song(song.linkSongLalaId);
}



if(mojo.IE6){
setTimeout(
function(){
widgets.core.WidgetEmbed.open(params);
},100);
}else{
widgets.core.WidgetEmbed.open(params);
}
};


widgets.Share.openRecoDialog=function(shareObj,shareType){
if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.reco'+shareType.ltoFirstUpperCase());
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.reco'+shareType.ltoFirstUpperCase());
}

var shareDialog=new MojoDialog({
id:'shareDialog',
title:'Share this '+shareType
});

var shareW=widgets.Share.getDialogShareWidget(shareObj,shareType);
shareW.renderTargetId=shareDialog.contentId;
shareW.afterShare=function(){
widgets.Share.closeShareDialog();
};

shareDialog.onOpen=function(){
shareW.picker.render();
};
shareDialog.open(shareW.getRecoSkeleton(shareType));
};




widgets.Share.openRecoDialogFromPulldown=function(params){
var shareType=params&&params.shareType;
if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.reco'+shareType.ltoFirstUpperCase());
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.reco'+shareType.ltoFirstUpperCase());
}

var shareDialog=new MojoDialog({
id:'shareDialog',
title:'Share this '+shareType
});

var shareObj;
if(shareType=='album'
&&widgets.Share.dialogShareWidget
&&widgets.Share.dialogShareWidget.shareType=='song'){
var song=widgets.Share.dialogShareWidget.shareObj;
shareObj={
artist:song.artist,
artistList:song.artistList,
id:song.discLalaId,
title:song.discTitle
};
}

var shareW=widgets.Share.getDialogShareWidget(shareObj,shareType);
shareW.renderTargetId=shareDialog.contentId;
shareW.afterShare=function(){
widgets.Share.closeShareDialog();
};

shareDialog.onOpen=function(){
shareW.picker.render();
};
shareDialog.open(shareW.getRecoSkeleton(shareType));
};

widgets.Share.openGiftSong=function(){
mojo.assert(widgets.Share.getDialogShareWidget().shareType=='song',
"Only songs can be gifted at this time");

if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.gift');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.gift');
}
widgets.Share.closeShareDialog();
widgets.store.openBuyGiftWebSongDialog(widgets.Share.getDialogShareWidget().shareObj);
};


widgets.Share.openURLDialog=function(songLalaId){
if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.url');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.url');
}

api.Tiny.forSong(songLalaId,function(songUrl){
var URLDialog=new MojoDialog({
id:'urlDialog',
title:''
});
URLDialog.open($TC(lt.Share.shareURL));

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

widgets.Share.onOpenPartnerLinkDialog=function(shareObj,shareType){
if(!shareObj){
shareObj=widgets.Share.song;
shareType='song';
}

if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.partnerLink');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.partnerLink');
}

var dialog=new MojoDialog({
id:'partnerShareDialog',
title:''
});

var t=$T(lt.Share.partnerSongUrlDialog);

var divToCopy='';
var url='';
var linkText='';
var tracking='widget.mediaplayer.'+lala.user.widgetPartnerId;
var canBuyMp3=true;

switch(shareType){
case'song':
divToCopy=$T(lt.Share.partnerSongDiv)
.replaceTokensWithBean('song',shareObj);

canBuyMp3=shareObj.isLicensedForDownload&&!shareObj.isDownloadAlbumOnly;
var songId=shareObj.isLicensedForStreaming?shareObj.linkSongLalaId:shareObj.id;
divToCopy.replaceToken('songId',songId);
url=frontend.url.Song(songId,null,shareObj.title,shareObj.artist,tracking);
url=url.replace('/song/','/landing/song/');
linkText=shareObj.title+' by '+shareObj.artist;

break;
case'album':
divToCopy=$T(lt.Share.partnerAlbumDiv)
.replaceTokensWithBean('album',shareObj);

url=frontend.url.Album(shareObj.id,shareObj.title,tracking,shareObj.artist);
url=url.replace('/album/','/landing/album/');
linkText=shareObj.trackCount+' tracks - '+shareObj.title+' by '+shareObj.artist;
canBuyMp3=shareObj.isLicensedForDownload;
break;
default:
mojo.log.error('Unknown share type for partner link dialog');
break;
}
divToCopy.replaceToken('canBuyMp3',canBuyMp3);
divToCopy.replaceTokensWithBean('p',{href:url,linkText:linkText});
t.replaceToken('divToCopy',divToCopy.compose());
dialog.open(t.compose());
};

widgets.Share.onOpenPartnerBuyDialog=function(){
if(widgets.Share.inHeader){
lala.Track.client('Player.interaction.ShareDialog.partnerBuy');
}else{
lala.Track.clientPageInteraction('widget.ShareDialog.partnerBuy');
}

var dialog=new MojoDialog({
id:'partnerShareDialog',
title:''
});

var t=$T(lt.Share.partnerSongBuyDialog);
var song=widgets.Share.song;
t.replaceTokensWithBean(
'p',
{title:song.title,artist:song.artist,fc:lala.user.widgetPartnerId,
songId:song.id});
dialog.open(t.compose());
};

widgets.Share.closeShareDialog=function(){
MojoDialog.close();
widgets.Share.facebookConnectClicked=false;
if(widgets.Share.showFacebookLinkedDialog){
LalaFBConnect.openFacebookLinkedDialog();
widgets.Share.showFacebookLinkedDialog=false;
}
};








api.Store={
EVT_CART_CHANGE:"storeCartChange",
FAILED_MSG:"Sorry, your store purchase has failed.  "+
"Please verify your billing address in your account settings or "
+"contact support through our help section.",
cart:null,
PROMO_PAYMENT:{method:'Promo'},

preparePhysicalCdPurchase:function(albumId,freeWebAlbumId,onResponse){
lala.sendRequest({
url:'Store/preparePhysicalCdPurchase',
method:'POST',
params:{albumId:albumId,freeWebAlbumId:freeWebAlbumId},
onResponse:function(res){
onResponse(res);
}});
},

purchasePhysicalCd:function(albumId,freeWebAlbumId,payment,
onResponse,shipAddressOverride){
var self=this;

var params={
albumId:albumId,
freeWebAlbumId:freeWebAlbumId,
paymentMethod:payment.method,
refillWallet:payment.refillWallet};
this._processShippingAddressOverride(params,shipAddressOverride);

lala.sendRequest({
url:'Store/purchasePhysicalCd',
method:'POST',
reloadOnError:true,
customErrorMsg:api.Store.FAILED_MSG,
params:params,
onResponse:function(res){



api.MicroWallet.balance=res.data.balance.walletBalanceInCents;
api.MicroWallet.credits=res.data.balance.creditBalance;
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);

if(freeWebAlbumId){


mojo.listeners.notify(
api.Playlists.EVT_SONG_ADDED,
{count:res.data.tracks.length,
playlistToken:'recentlyAdded'});
}

onResponse(res,res.data.tracks);
lala.Track.clientPagePurchase('physicalCD');
}});
},

purchaseMicroWallet:function(lalaId,onResponse){
var self=this;
lala.sendRequest({
url:'Store/purchaseMicroWallet',
method:'POST',
reloadOnError:true,
customErrorMsg:api.Store.FAILED_MSG,
params:{lalaId:lalaId},
onResponse:function(res){
api.MicroWallet.balance=res.data.walletBalanceInCents;
api.MicroWallet.credits=res.data.creditBalance;
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);
onResponse(res);
lala.Track.clientPagePurchase('wallet');
}});
},






smartPurchaseWebSong:function(songId,onResponse){
lala.sendRequest({
url:'Store/smartPurchaseWebSong',
method:'POST',
params:{songId:songId},
onResponse:onResponse});
},

purchaseSongs:function(clientSongOrSongs,audioType,payment,onResponse,
playlistToken,onBeforePurchase,addlEvtData){
if(onBeforePurchase)onBeforePurchase();

var clientSongs=this._getClientSongsAsArray(clientSongOrSongs);
this._sendStoreRequest(
'Store/purchaseSongs',
payment,
{songIds:clientSongs.lpluck('linkSongLalaId'),
audioType:audioType,
playToken:clientSongs[0].playToken,
playlistToken:playlistToken
},
function(res){
if(audioType=='Web'){
api.Store._purchaseWebSongResponseHandler(
res,
res.data.result,
onResponse,
payment,
playlistToken,
null,
addlEvtData);
mojo.listeners.notify(
api.MicroWallet.EVT_BUY_WEB_SONG,
{songs:clientSongs});
}else{
api.Store._purchaseMp3SongResponseHandler(
res,
res.data.result,
onResponse);
mojo.listeners.notify(
api.MicroWallet.EVT_BUY_MP3_SONGS,
{songs:clientSongs});
}
if(addlEvtData&&addlEvtData.isFromHeader){
var fromPage=addlEvtData.fromPage||'Unknown';
lala.Track.client(
'byPage.Header.purchase.'+
(payment.method=='Credit'?'credit':'paid')+
'.song.'+audioType+'.from.'+fromPage);
}else{
lala.Track.clientPagePurchase(
'song.'+audioType,
payment.method=='Credit');
}
});
},

purchaseAlbum:function(album,audioType,payment,onResponse){
this._sendStoreRequest(
'Store/purchaseAlbum',
payment,
{albumId:album.id,audioType:audioType},
function(res){
album.isAllTracksDigied=true;
album.isDigied=true;
if(audioType=='Web'){
api.Store._purchaseWebSongResponseHandler(
res,
res.data.result,
onResponse,
payment);
mojo.listeners.notify(
api.MicroWallet.EVT_BUY_WEB_ALBUM,{album:album});
}else{
api.Store._purchaseMp3SongResponseHandler(
res,
res.data.result,
onResponse);
mojo.listeners.notify(
api.MicroWallet.EVT_BUY_MP3_ALBUM,{album:album});
}
lala.Track.clientPagePurchase(
'album.'+audioType,
payment.method=='Credit');
});
},

purchasePlaylist:function(playlist,audioType,payment,onResponse){
this._sendStoreRequest(
'Store/purchasePlaylist',
payment,
{playlistId:playlist.lalaId,audioType:audioType},
function(res){
var result=res.data.result;
if(audioType=='Web'){
api.Store._purchaseWebSongResponseHandler(
res,
result.tracks,
onResponse,
payment,
null,
true);


if(result.playlist){
DataModel.g.addPlaylist(
result.playlist,result.tracksCopiedCount);
}
lala.Track.clientPagePurchase(
'webPlaylist',payment.method=='Credit');
}else{
api.Store._purchaseMp3SongResponseHandler(
res,
result.tracks,
onResponse);
if(result.playlist){
DataModel.g.addPlaylist(
result.playlist,result.tracksCopiedCount);
mojo.listeners.notify(
api.MicroWallet.EVT_BUY_MP3_PLAYLIST,
{playlist:result.playlist,
numTracks:result.tracksCopiedCount
});
}
lala.Track.clientPagePurchase(
'playlist.'+audioType,
payment.method=='Credit');
}
});
},

giftSong:function(song,audioType,payment,member,note,onResponse){
var params={};
params.songLalaId=song.linkSongLalaId;
params.note=note;
params.audioType=audioType;
if(member.userToken){
params.toUserToken=member.userToken;
}else{
params.toEmail=member.email;
params.fromName=member.senderName;
params.toName=member.name;
}

this._sendStoreRequest(
'Store/giftSong',
payment,
params,
function(res){
onResponse();
mojo.listeners.notify(
api.MicroWallet.EVT_GIFT_SONG,
{song:song,recipient:member,comment:note});
lala.Track.clientPagePurchase('gift.song.'+audioType);
});
},

giftGiftCard:function(params,payment,onResponse){
this._sendStoreRequest(
'Store/giftGiftCard',
payment,
{fromName:params.fromName,
toName:params.toName,
toEmail:params.toEmail,
toUserToken:params.toToken,
note:params.note,
giftCardId:params.giftCardId,
giftTheme:params.giftTheme
},
function(res){
onResponse(res);
lala.Track.clientPagePurchase('gift.card');
});
},


_sendStoreRequest:function(url,payment,addlParams,onResponse){
var pagePath
=typeof(MyMusic)!='undefined'?MyMusic.g.getPagePath(true)
:lala.pageId;
var params={
paymentMethod:payment.method,
refillWallet:payment.refillWallet,
pagePath:pagePath,
partnerId:Cookies.getPurchasePartnerId()
};
Object.extend(params,addlParams);

lala.sendRequest({
url:url,
method:'POST',
reloadOnError:true,
customErrorMsg:api.Store.FAILED_MSG,
params:params,
onResponse:function(res){
api.MicroWallet.balance=res.data.walletBalanceInCents;
api.MicroWallet.credits=res.data.creditBalance;
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);

onResponse(res);
}});
},

_getClientSongsAsArray:function(clientSongOrSongs){
var clientSongs;
if(mojo.isArray(clientSongOrSongs)){

clientSongs=clientSongOrSongs;
}else{

clientSongs=[clientSongOrSongs];
}
return clientSongs;
},

_purchaseWebSongResponseHandler:function(
res,purchasedSongs,onResponse,
payment,playlistToken,supressNotify,addlEvtData){
var usedCredits=payment.method=='Credit';
mojo.listeners.notify(
api.MicroWallet.EVT_BUYSONG_CHANGE,
{songs:purchasedSongs,usedCredits:usedCredits});

mojo.listeners.notify(
api.MicroWallet.EVT_BUYSONG_DISC_CHANGE,
{albumPrices:res.data.albumPrices});

var addedCountToPlaylist=purchasedSongs.length;




if(!supressNotify){
if(playlistToken){
var evt={count:addedCountToPlaylist,
playlistToken:playlistToken,
ids:[purchasedSongs.lpluck('id')]};
if(addlEvtData)Object.extend(evt,addlEvtData);
mojo.listeners.notify(
api.Playlists.EVT_SONG_ADDED,evt);
}else{
mojo.listeners.notify(
api.Playlists.EVT_SONG_ADDED,
{count:addedCountToPlaylist,playlistToken:'recentlyAdded'});
}
}
if(onResponse)onResponse(res);
},

checkAuthLevel:function(onResponse){
lala.sendRequest({
url:'Store/checkAuthLevel',
reloadOnError:true,
customErrorMsg:api.Store.FAILED_MSG,
onResponse:onResponse
});
},

_purchaseMp3SongResponseHandler:function(res,purchasedSongs,onResponse){


mojo.listeners.notify(
api.MicroWallet.EVT_BUYSONG_CHANGE,
{songs:purchasedSongs,isDownload:true});
mojo.listeners.notify(
api.MicroWallet.EVT_BUY_DOWNLOAD,
{songs:purchasedSongs});
mojo.listeners.notify(
api.MicroWallet.EVT_BUYSONG_DISC_CHANGE,
{albumPrices:res.data.albumPrices});

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

getBundleDetails:function(bundleId,onResponse){
lala.sendRequest({
url:'Store/getBundleDetails',
params:{bundleId:bundleId},
onResponse:onResponse});
},

isValidBundle:function(bundleId,onResponse){
lala.sendRequest({
url:'Store/isValidBundle',
params:{bundleId:bundleId},
onResponse:onResponse});
},




initCart:function(){
this.cart={
id:lala._cartId,
count:lala._cartCount
};
},

getShoppingCart:function(onResponse){
var res={data:null};
this.processShoppingCart(res.data);
this._processCartResponse(res.data,res,onResponse);












},

getCartForConfirmedPurchase:function(onResponse){
var self=this;
var cb=function(res){
self.processShoppingCart(res.data.cart);
mojo.listeners.notify(api.Store.EVT_CART_CHANGE);
if(onResponse)onResponse(res);
};

lala.sendRequest({url:'Store/getCartForConfirmedPurchase',
params:{defaultToCCAddress:true},
onResponse:cb});
},

confirmPurchase:function(payment,onResponse,shipAddressOverride){
var params={
defaultToCCAddress:true,
paymentMethod:payment.method,
refillWallet:payment.refillWallet
};
this._processShippingAddressOverride(params,shipAddressOverride);
var self=this;
var cb=function(res){
if(res.data!=null){
self.processShoppingCart(res.data.cart);
}
api.MicroWallet.balance=res.data.balance.walletBalanceInCents;
api.MicroWallet.credits=res.data.balance.creditBalance;
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);

api.Store.cart.id=null;
api.Store.cart.count=0;
mojo.listeners.notify(api.Store.EVT_CART_CHANGE);
if(onResponse)onResponse(res);
lala.Track.clientPagePurchase('shoppingCart');
};

lala.sendRequest({url:'Store/confirmPurchase',
method:'POST',
params:params,
onResponse:cb});
},

_processShippingAddressOverride:function(params,address){
if(!address)return;

params.addrName=address.name;
params.addrCompany=address.company;
params.addrLine1=address.addr1;
params.addrLine2=address.addr2;
params.addrCity=address.city;
params.addrState=address.state;
params.addrZip=address.zip;
},

addToCart:function(lalaId,onResponse,digitalLalaId){
if(!frontend.requiresSignin()){
var cb=function(res){

api.Store._processCartResponse(res.data,res,onResponse);
};

lala.sendRequest({url:'Store/addToCart',
method:'POST',
params:{lalaId:lalaId,
digitalLalaId:digitalLalaId},
onResponse:cb});
}
},

deleteFromCart:function(lalaId,onResponse){
var self=this;
var cb=function(res){
self.processShoppingCart(res.data.cart);
api.Store._processCartResponse(res.data,res,onResponse);
};

lala.sendRequest(
{url:'Store/deleteFromCart',
method:'POST',
params:{lalaId:lalaId},
onResponse:cb});
},

updateCart:function(itemIds,quantities,onResponse){
var self=this;
var cb=function(res){
self.processShoppingCart(res.data.cart);
api.Store._processCartResponse(res.data.cart,res,onResponse);
};

lala.sendRequest(
{url:'Store/updateCart',
method:'POST',
params:{itemIds:itemIds,
itemQuantities:quantities},
onResponse:cb});
},

clearCart:function(onResponse){
var cb=function(res){
api.Store._processCartResponse(res.data,res,onResponse);
};

lala.sendRequest({url:'Store/clearCart',
method:'POST',
onResponse:cb});
},

_processCartResponse:function(cart,res,onResponse){
if(!cart){

onResponse(res);
return;
}

api.Store.cart.id=cart.id;
var totalCount=0;
cart.items.leach(function(item){
totalCount+=item.quantity/1;
if(item.bundleId)item.id=item.bundleId;
});
api.Store.cart.count=totalCount;
mojo.listeners.notify(api.Store.EVT_CART_CHANGE);
if(onResponse)onResponse(res);
},

processShoppingCart:function(cart,skipNotifyAddSongs){
if(cart==null)return;





var origItems=cart.items;

cart.items=[];
cart.total=cart.total.toFixed(2);

if(!cart.isNewFulfillmentMechanism){
cart.shippingTotal=0;
cart.taxTotal=0;
}

var webSongTotal=0;
for(var i=0;i<origItems.length;i++){
var item=origItems[i];
if(cart.isNewFulfillmentMechanism){
if(item.type=='WalletPayment'){
cart.walletPaymentAmount=item.amount;
}else if(item.type=='CreditCardPayment'){
cart.creditCardPaymentAmount=item.amount;
}else{
item.price=parseFloat(item.price);
item.price=item.price.toFixed(2);
cart.items.push(item);
}
}else{
if(item.type=='Tax'){
cart.taxTotal+=item.amount;
}else if(item.type=='Shipping'){
cart.shippingTotal+=item.amount;
}else if(item.type=='CreditCardPayment'){
cart.creditCardPaymentAmount=item.amount;
}else{
item.price=parseFloat(item.price);
item.price=item.price.toFixed(2);
cart.items.push(item);
}
}
item.amount=parseFloat(item.amount);
item.amount=item.amount.toFixed(2);



if(item.type=='PhysicalDiscGroup'){
item.items.leach(function(physicalItem){
if(physicalItem.type=='WebAlbum'
&&physicalItem.billItemDiscs!=null){
physicalItem.billItemDiscs.leach(function(disc){
if(disc.billItemTracks!=null){
disc.billItemTracks.leach(function(track){
if(track.isPurchased)webSongTotal++;
});
}
});
}
});
}
}


if(webSongTotal>0&&!skipNotifyAddSongs){
mojo.listeners.notify(api.Playlists.EVT_SONG_ADDED,{
count:webSongTotal,
playlistToken:'recentlyAdded'
});
}

if(!cart.isNewFulfillmentMechanism){
cart.taxTotal=cart.taxTotal.toFixed(2);
cart.shippingTotal=cart.shippingTotal.toFixed(2);
}
},

changeShippingAddressForOrder:function(params,onResponse){
lala.sendRequest(
{url:'Store/changeShippingAddressForOrder',
params:params,
onResponse:onResponse,
method:'POST'});
},

setShippingRecipient:function(params,onResponse){
lala.sendRequest(
{url:'Store/setShippingRecipient',
params:params,
onResponse:onResponse,
method:'POST'});
}
};

StoreUtil={



getRealWebPrice:function(album){
var price=album.webAlbumPriceInCents;
if(album.addMissingTracksPriceInCents<price){
price=album.addMissingTracksPriceInCents;
}
return price;
},

getRetailWebPrice:function(album){
return album.webAlbumPriceInCents;
},




getRealDownloadPrice:function(album){
var price=album.downloadAlbumPriceInCents;

if(album.downloadMissingTracksPriceInCents<price||price==0){
price=album.downloadMissingTracksPriceInCents;
}
return price;
},

getRetailDownloadPrice:function(album){
return album.downloadAlbumPriceInCents;
}
};

AddSongWidgetListener={
addSongWidgetListener_Init:function(includeMp3,isGlobal){
var self=this;

var method=isGlobal?'addGlobal':'add';
mojo.listeners[method](
api.MicroWallet.EVT_BUYSONG_CHANGE,
function(evt){
self._addSongWidgetListener_VisitSongs(evt.songs,true);
});
if(includeMp3){
mojo.listeners[method](
api.MicroWallet.EVT_BUY_DOWNLOAD,
function(evt){
self._addSongWidgetListener_VisitSongs(evt.songs,false);
});
}
},

addSongWidgetListener_GetSongByLinkLalaId:function(id){
mojo.log.error('abstract method, widget needs to implement');
},

addSongWidgetListener_SongAddedCallback:function(song){

},

addSongWidgetListener_Mp3PurchasedCallback:function(song){

},

addSongWidgetListener_UpdateSongAdded:function(mySong,updatedSong){
this._addSongWidgetListener_UpdateSongPurchased(
mySong,updatedSong,true);
},

addSongWidgetListener_UpdateMp3Purchased:function(mySong,updatedSong){
this._addSongWidgetListener_UpdateSongPurchased(
mySong,updatedSong,false);
},

_addSongWidgetListener_UpdateSongPurchased:function(mySong,updatedSong,
isWebSong){
if(!mySong||(mySong==updatedSong))return;

if(isWebSong){

mySong.downloadPriceInCents-=mySong.addPrice;
if(mySong.downloadPriceInCents<0)mySong.downloadPriceInCents=0;

}else{

}
mySong.isDigied=true;
mySong.syncToken=updatedSong.syncToken;
mySong.syncType=updatedSong.syncType;
mySong.playToken=updatedSong.playToken;
mySong.playType=updatedSong.playType;
mySong.syncUrl=updatedSong.syncUrl;
mySong.canUserPurchaseDownload=updatedSong.canUserPurchaseDownload;
mySong.isUserDownloadable=updatedSong.isUserDownloadable;
mySong.isDownloadPurchased=updatedSong.isDownloadPurchased;
mySong.isRestrictedListen=false;
},

_addSongWidgetListener_VisitSongs:function(songs,isWebSong){
var self=this;




songs.leach(function(song){
var songOrSongs
=self.addSongWidgetListener_GetSongByLinkLalaId(
song.linkSongLalaId);
if(songOrSongs==null)return;

var mySongs=songOrSongs;
if(!mojo.isArray(songOrSongs)){
mySongs=[songOrSongs];
}

for(var i=0;i<mySongs.length;i++){
var mySong=mySongs[i];
var isLast=i==(mySongs.length-1);
if(isWebSong){
if(!mySong.isDigied){


self.addSongWidgetListener_UpdateSongAdded(mySong,song);
}
self.addSongWidgetListener_SongAddedCallback(mySong,isLast);
}else{
self.addSongWidgetListener_UpdateMp3Purchased(mySong,song);
self.addSongWidgetListener_Mp3PurchasedCallback(mySong,isLast);
}
}
})
}
};



AlbumPriceListener={
albumPriceListener_Init:function(onUpdated){
this.albumPriceListener_OnUpdatedAlbum=onUpdated;
mojo.listeners.add(
api.MicroWallet.EVT_BUYSONG_DISC_CHANGE,
this.albumPriceListener_onAlbumPriceUpdated.lbind(this)
);
},

albumPriceListener_onAlbumPriceUpdated:function(evt){
var self=this;
evt.albumPrices.leach(function(price){
var album=self.albumPriceListener_GetAlbumById(price.id);
if(album){
self.albumPriceListener_UpdateAlbum(album,price);
self.albumPriceListener_OnUpdatedAlbum(album);
}
});
},

albumPriceListener_GetAlbumById:function(discId){
mojo.log.error('Interface method');
},

albumPriceListener_UpdateAlbum:function(albums,price){
if(!albums||(albums.length&&albums.length==0))return;
if(!albums.isArray)albums=[albums];
for(var i=0;i<albums.length;i++){
var album=albums[i];
api.Catalog.util.processDiscWithPriceInfo(album,price,true);
}
}
};



api.SearchPage={
runBucketedSearch:function(params,onResponse){
lala.sendRequest(
{url:'SearchPage/runBucketedSearch',
params:params,
onResponse:onResponse});
}
};

api.ArtistPage={
getData:function(params,onResponse){
lala.sendRequest(
{url:'ArtistPage/getData',
params:params,
onResponse:onResponse});
}
};

api.AlbumPage={
getData:function(params,onResponse){
lala.sendRequest({
url:'AlbumPage/getData',
params:{
discLalaId:params.discLalaId,
songLalaId:params.songLalaId,
recoCount:params.recoCount,
beforeCount:params.beforeCount,
afterCount:params.afterCount,
msgToken:params.msgToken,
Q:params.Q,
listenersCount:params.listenersCount
},
onResponse:function(res){
api.Catalog.util.processDiscWithPriceInfo(
res.data.albumInfo.discs[0],
res.data.albumInfo.priceInfo);
onResponse(res);
}
});
},

getMoreSliderAlbums:function(params,onResponse){
lala.sendRequest({
url:'AlbumPage/getMoreSliderAlbums',
params:{
artistName:params.artistName,
discId:params.discId,
beforeCount:mojo.isDefined(params.beforeCount)?params.beforeCount:15,
afterCount:mojo.isDefined(params.afterCount)?params.afterCount:15
},
onResponse:onResponse
});
}
};

api.PlaylistPage={
getData:function(params,onResponse){
lala.sendRequest({
url:'PlaylistPage/getData',
params:{playlistToken:params.playlistToken,
specialAlbumId:params.specialAlbumId,
specialArtist:params.specialArtist,
skip:params.skip,
msgToken:params.msgToken},
onResponse:onResponse});
}
};

api.ProfilePage={
getData:function(forUserToken,onResponse){
lala.sendRequest({
url:'ProfilePage/getData',
params:{forUserToken:forUserToken},
onResponse:onResponse});
}
};

api.LoggedOutHomePage={
getNewReleases:function(onResponse){
lala.sendRequest({
url:'LoggedOutHomePage/getNewReleases',
onResponse:onResponse});
},

getTopArtists:function(genre,onResponse){
lala.sendRequest({
url:'LoggedOutHomePage/getTopArtists',
params:{genre:genre},
onResponse:onResponse});
}
};

api.HomePage={
getRightColumnData:function(onResponse){
lala.sendRequest({
url:'HomePage/getRightColumnData',
onResponse:onResponse});
},

getMainColumnData:function(onResponse){
lala.sendRequest({
url:'HomePage/getMainColumnData',
onResponse:onResponse});
},

getMoreRecos:function(params,onResponse){
lala.sendRequest({
url:'HomePage/getMoreRecos',
params:params,
onResponse:onResponse});
},

getVisitedAlbums:function(onResponse){
lala.sendRequest({
url:'HomePage/getVisitedDiscs',
onResponse:onResponse
});
},

getVisitedArtists:function(onResponse){
lala.sendRequest({
url:'HomePage/getVisitedArtists',
onResponse:onResponse
});
},

getVisitedUsers:function(onResponse){
lala.sendRequest({
url:'HomePage/getVisitedUsers',
onResponse:onResponse
});
}
};

api.BrowsePage={
browse:function(p,onResponse){
lala.sendRequest({url:'BrowsePage/browse',params:p,onResponse:onResponse});
},

getTopSongs:function(p,onResponse){
this._send('getTopSongs',p,onResponse);
},

getNewReleases:function(p,onResponse){
this._send('getNewReleases',p,onResponse);
},

getNewReleaseBucket:function(p,onResponse){
this._send('getNewReleaseBucket',p,onResponse);
},

getBestsellers:function(p,onResponse){
this._send('getBestsellers',p,onResponse);
},

getBestsellerBucket:function(p,onResponse){
this._send('getBestsellerBucket',p,onResponse);
},

getPlaylists:function(p,onResponse){
this._send('getPlaylists',p,onResponse);
},

getInfluencers:function(p,onResponse){
this._send('getInfluencers',p,onResponse);
},

getListeners:function(p,onResponse){
this._send('getListeners',p,onResponse);
},

_send:function(method,p,onResponse){
lala.sendRequest({
url:'BrowsePage/'+method,
params:p,
onResponse:onResponse
});
}
};

api.Stories={
getPublicFeed:function(params,onResponse){
lala.sendRequest({url:'Stories/getPublicFeed',
params:{
feedFilter:params.filterType,
userToken:params.userToken
},
onResponse:onResponse});
},

getPrivateFeed:function(params,onResponse){
lala.sendRequest({url:'Stories/getPrivateFeed',
params:{
feedFilter:params.filterType
},
onResponse:onResponse});
},

getDetails:function(storyId,onResponse){
lala.sendRequest({url:'Stories/getDetails',
params:{storyId:storyId},
onResponse:onResponse});
},

shout:function(params,onResponse){
lala.sendRequest({url:'Stories/shout',
method:'POST',
params:{
lalaId:params.lalaId,
type:params.type,
message:params.message
},
onResponse:onResponse});
}
};

api.Sxsw={
getCol1Data:function(onResponse){
lala.sendRequest({
url:'SxswPage/getCol1Data',
onResponse:onResponse
});
},

getCol2Data:function(onResponse){
lala.sendRequest({
url:'SxswPage/getCol2Data',
onResponse:onResponse
});
}
};



api.Shares={
getShares:function(onResponse,count){
var params={count:count||5,skip:0};
lala.sendRequest({
url:'Shares/getShares',
params:params,
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.recos.list);
res.data.recos.list.leach(function(share){
api.Messaging._preprocessMessages(share.comments.list);
});
onResponse(res);
}
});
},

getSentShares:function(onResponse,count){
var params={count:count||5,skip:0};
lala.sendRequest({
url:'Shares/getSentShares',
params:params,
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.recos.list);
res.data.recos.list.leach(function(share){
api.Messaging._preprocessMessages(share.comments.list);
});
onResponse(res);
}
});
},

addComment:function(params,onResponse){
var fn=function(){
api.Shares.addComment(params,onResponse);
};
if(api.Messaging.processLinksInText(
params,
fn))return;

lala.sendRequest({
url:'Shares/addComment',
params:params,
onResponse:onResponse
});
},

getComments:function(shareToken,onResponse){
lala.sendRequest({
url:'Shares/getComments',
params:{shareToken:shareToken},
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.list);
onResponse(res);
}
});
}
};



widgets.Feed=Class.create();
widgets.Feed.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.isPrivate=params.isPrivate;
this.userToken=params.userToken;
this.isProfileView=params.isProfileView;
this.stories=null;
this.storiesById={};
this.filterType='';
this.divId='stories';

if(!this.isProfileView){
this.samplerPopup=new widgets.core.InfluencerSampler();
}

this.layouts={


'Listen_Song':new widgets.Feed.MultiSongLayout({
mode:'Listen',
label:'song',
icon:{type:'listen',title:'Listen'},
layoutClass:'listenMultiSongLayout'
}),
'Rating_Song':new widgets.Feed.RatingMultiSongLayout({
mode:'Rating',
label:'song',
icon:{type:'review',title:'Rating'},
layoutClass:'ratingMultiSongLayout'
}),
'Listen_Artist':new widgets.Feed.MultiSongLayout({
mode:'ListenArtist',
label:'song',
icon:{type:'listen',title:'Listen'},
layoutClass:'listenArtistMultiSongLayout'
}),
'ForecastPick_Song':new widgets.Feed.MultiSongLayout({
mode:'Forecast',
label:'song',
icon:{type:'forecast',title:'Forecast pick'},
layoutClass:'forecastMultiSongLayout'
}),
'Purchase_WebSong':new widgets.Feed.MultiSongLayout({
mode:'Purchase',
label:'web song',
icon:{type:'buy',title:'Purchased web song'},
layoutClass:'purchaseMultiSongLayout'
}),
'Purchase_Mp3Song':new widgets.Feed.MultiSongLayout({
mode:'Purchase',
label:'MP3',
icon:{type:'buy',title:'Purchased MP3 song'},
layoutClass:'purchaseMultiSongLayout'
}),
'Share_Song':new widgets.Feed.MultiSongLayout({
mode:'Share',
label:'song',
icon:{type:'reco',title:'Song recommendation'},
layoutClass:'shareMultiSongLayout'
}),
'Info_GenreTopSong':new widgets.Feed.GenreTopSongLayout({
mode:'GenreTopSong',
label:'song',
icon:{type:'popular',title:'Popular song'},
layoutClass:'genreTopSongMultiSongLayout'
}),


'Purchase_WebAlbum':new widgets.Feed.MultiDiscLayout({
mode:'Purchase',
label:'web album',
icon:{type:'buy',title:'Purchased web album'},
layoutClass:'purchaseMultiDiscLayout'
}),
'Purchase_Mp3Album':new widgets.Feed.MultiDiscLayout({
mode:'Purchase',
label:'MP3 album',
icon:{type:'buy',title:'Purchased MP3 album'},
layoutClass:'purchaseMultiDiscLayout'
}),
'Info_NewRelease':new widgets.Feed.MultiDiscLayout({
mode:'NewRelease',
label:'new release',
icon:{type:'new',title:'New release'},
layoutClass:'newReleaseLayout'
}),
'Share_Album':new widgets.Feed.MultiDiscLayout({
mode:'Share',
label:'album',
icon:{type:'reco',title:'Album recommendation'},
layoutClass:'shareMultiDiscLayout'
}),
'Listen_Album':new widgets.Feed.MultiDiscLayout({
mode:'ListenAlbum',
label:'album',
icon:{type:'listen',title:'Listen'},
layoutClass:'listenMultiDiscLayout'
}),
'Review_Album':new widgets.Feed.MultiDiscLayout({
mode:'ReviewAlbum',
label:'album',
icon:{type:'review',title:'Review'},
layoutClass:'reviewMultiDiscLayout'
}),


'Purchase_Mp3Playlist':new widgets.Feed.MultiPlaylistLayout({
mode:'Purchase',
label:'MP3 playlist',
icon:{type:'buy',title:'Purchased MP3 playlist'},
layoutClass:'purchaseMultiPlaylistLayout'
}),
'Purchase_WebPlaylist':new widgets.Feed.MultiPlaylistLayout({
mode:'Purchase',
label:'web playlist',
icon:{type:'buy',title:'Purchased web playlist'},
layoutClass:'purchaseMultiPlaylistLayout'
}),
'Share_Playlist':new widgets.Feed.MultiPlaylistLayout({
mode:'Share',
label:'web playlist',
icon:{type:'reco',title:'Playlist recommendation'},
layoutClass:'purchaseMultiPlaylistLayout'
}),
'InfoListen_Playlist':new widgets.Feed.MultiUserPlaylistLayout({
mode:'ListenPlaylist',
label:'member',
icon:{type:'listen',title:'Listen'},
layoutClass:'listenMultiUserPlaylistLayout'
}),


'InfoListen_FollowTopSong':new widgets.Feed.MultiUserSongLayout({
mode:'FollowTopSong',
label:'member',
icon:{type:'listen',title:'Popular song'},
layoutClass:'followTopSongMultiUserSongLayout'
}),


'InfoListen_FollowTopArtist':new widgets.Feed.MultiSongMultiUserLayout({
mode:'FollowTopArtist',
label:'song',
icon:{type:'listen',title:'Popular artist'},
layoutClass:'followTopArtistMultiSongMultiUserLayout'
}),


'Shout_Song':new widgets.Feed.ShoutLayout({
mode:'Song',
label:'song',
icon:{type:'shout',title:'Shout'},
layoutClass:'shoutSongLayout'
}),
'Shout_Album':new widgets.Feed.ShoutLayout({
mode:'Album',
label:'album',
icon:{type:'shout',title:'Shout'},
layoutClass:'shoutAlbumLayout'
}),
'Shout_Artist':new widgets.Feed.ShoutLayout({
mode:'Artist',
label:'artist',
icon:{type:'shout',title:'Shout'},
layoutClass:'shoutArtistLayout'
}),
'Shout_Playlist':new widgets.Feed.ShoutLayout({
mode:'Playlist',
label:'web playlist',
icon:{type:'shout',title:'Shout'},
layoutClass:'shoutPlaylistLayout'
}),


'Share_Artist':new widgets.Feed.ArtistLayout({
mode:'Share',
label:'artist',
icon:{type:'reco',title:'Artist recommendation'},
layoutClass:'shareArtistLayout'
}),


'Follow_User':new widgets.Feed.MultiUserLayout({
mode:'Follow',
label:'member',
icon:{type:'follow',title:'Follow member'},
layoutClass:'followMultiUserLayout'
})
};

mojo.listeners.add(api.Friends.EVT_FOLLOWING_CHANGED,this.loadAndRender.lbind(this));
widgets.Feed.g=this;
},

onPlayFeedSongs:function(){
var trackingId='Feed.entireFeed';
if(this.isPrivate){
Player.g.playPrivateFeed(this.filterType,trackingId);
}else{
Player.g.playPublicFeed(this.userToken,this.filterType,trackingId);
}
},

onQueueFeedSongs:function(elem){
var onResponse=function(res){
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);
};

var trackingId='Feed.entireFeed';
if(this.isPrivate){
Player.g.queuePrivateFeed(this.filterType,trackingId,onResponse);
}else{
Player.g.queuePublicFeed(this.userToken,this.filterType,trackingId,onResponse);
}
},

onPlayFeedStory:function(storyId){
Player.g.playFeedStory(storyId,'Feed.entireStory');
},

onQueueFeedStory:function(storyId,elem){
var onResponse=function(res){
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);
};

Player.g.queueFeedStory(storyId,'Feed.entireStory',onResponse);
},

onMouseOverStory:function(elem,event,storyId){
var links=$('playFeedStoryLinks_'+storyId);
if(links)mojo.css.show(links);
},

onMouseOutStory:function(elem,event,storyId){
var links=$('playFeedStoryLinks_'+storyId);
if(links)mojo.css.hide(links);
},

onShowMyPeople:function(){
this.isPrivate=true;
this.loadAndRender(true);
lala.Track.clientPageInteraction('Feed.filterByPeople.me');
},

onShowMyActivity:function(){
this.isPrivate=false;
this.userToken=lala.user.userToken;
this.loadAndRender(true);
lala.Track.clientPageInteraction('Feed.filterByPeople.everyone');
},

loadAndRender:function(isRefresh){
var self=this;

var onResponse=function(res){
self.stories=res.data;
self.storiesById={};
if(!isRefresh){
self.renderSkeleton();
}
self.renderStories();
};

var params={filterType:this.filterType};
if(this.isPrivate){
api.Stories.getPrivateFeed(params,onResponse);
}else{
params.userToken=this.userToken;
api.Stories.getPublicFeed(params,onResponse);
}
},

renderSkeleton:function(){
var t=$T(lt.Feed.skeleton,this.renderTargetId)
.replaceToken('clickTrackingId','Feed');

this.filterSel=new widgets.core.Select({
id:'filterSel',
selectionCallback:this.onFilterView.lbind(this),
pulldownWidth:'130px',
pulldownOffsets:{left:-13}
});

this.filterSel.addOption(' ','All types',{isSelected:true,optionSelectedHtml:"All types <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('Follow','Follows',{optionSelectedHtml:"Follows <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('ForecastPick','Forecast',{optionSelectedHtml:"Forecast <img src='images/blank.gif' class='ldownArrow'>"});
if(!this.isProfileView){
this.filterSel.addOption('Info','Lala',{optionSelectedHtml:"Lala <img src='images/blank.gif' class='ldownArrow'>"});
}
this.filterSel.addOption('Listen,InfoListen','Listens',{optionSelectedHtml:"Listens <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('Shout','Posts',{optionSelectedHtml:"Posts <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('Purchase','Purchases',{optionSelectedHtml:"Purchases <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('Rating','Ratings',{optionSelectedHtml:"Ratings <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('Share','Recos',{optionSelectedHtml:"Recos <img src='images/blank.gif' class='ldownArrow'>"});
this.filterSel.addOption('Review','Reviews',{optionSelectedHtml:"Reviews <img src='images/blank.gif' class='ldownArrow'>"});
t.replaceToken('filterSel',this.filterSel.getHtml());

if(this.isProfileView){
t.removeTokenBlock('HeadingBlock');
t.removeTokenBlock('PrivatePublicBlock');
}else{
var chooseActivity=function(newId,oldId){
if(newId=='myPeople'){
widgets.Feed.g.onShowMyPeople();
}else{
widgets.Feed.g.onShowMyActivity();
}
};
this.activitySel=new widgets.core.Select({
id:'activitySel',
selectionCallback:chooseActivity,
pulldownWidth:'130px',
pulldownOffsets:{left:-13}
});
this.activitySel.addOption('myPeople',"My people",{isSelected:true,optionSelectedHtml:"My people <img src='images/blank.gif' class='ldownArrow'>"});
this.activitySel.addOption('myActivity',"Just me",{optionSelectedHtml:"Just me <img src='images/blank.gif' class='ldownArrow'>"});

var ppb=t.getTokenBlock('PrivatePublicBlock');
ppb.replaceToken('activitySel',this.activitySel.getHtml());
}
t.compose();
},

renderStories:function(){

$(this.divId).innerHTML='';

var renderedCount=0;
var tmpl=lt.Feed.feedExpandedStory;
var t=$T(tmpl,this.divId);
for(var i=0;i<this.stories.length;i++){
var story=this.stories[i];

var layout=this.layouts[story.type+'_'+story.subtype];
if(layout==null){
mojo.log.error('unsupport story type/subtype, skipping: - '+story.type+'_'+story.subtype);
continue;
}

story.clientDetails=null;
story.clientLayout=layout;

t.replaceToken('layoutClass',layout.layoutClass);
t.replaceToken('time',new Date(parseInt(story.timestamp)).lgetDaysAgoLabel(null,null,true));
t.replaceToken('storyId',story.storyId);
t.replaceToken('clickTrackingId','Feed.'+story.type+'.'+story.subtype);


if(this.isProfileView){
t.removeTokenBlock('SourceImage');
}else{
t.replaceToken('srcImageHtml',layout.getSrcImageHtml(story));
}


t.replaceTokensWithBean('icon',layout.icon);


t.replaceToken('summaryLineHtml',layout.getSummaryLineHtml(story));


t.replaceToken('summaryDataHtml',layout.getSummaryDataHtml(story));


t.replaceToken('moreDetailsHtml',layout.getMoreDetailsHtml(story));


var artist=layout.getSummaryArtist(story);
if(artist){
t.replaceTokensWithBean('artist',artist);
}else{
t.removeTokenBlock('ArtistImgBlock');
}

if(i+1>=this.stories.length){
t.removeTokenBlock('NotLastBlock');
}
t.next();


this.storiesById[story.storyId]=story;
renderedCount+=1;
}


if(renderedCount>0){
t.compose(true);
}else{

if(lala.user&&lala.user.userToken==this.userToken){
$TC(lt.Feed.emptySelf,this.divId);
}else{
$TC(lt.Feed.emptyOther,this.divId);
}
}
lala.Track.flushCounters();
},

onFilterView:function(newId,oldId){
this.filterType=newId.ltrim();
this.loadAndRender(true);
lala.Track.clientPageInteraction('Feed.filterByType.'+this.filterType);
},

onShowDetailedView:function(){
this.renderStories();
},

onOpenFeedDetails:function(storyId){
var self=this;
var story=this.storiesById[storyId];
if(!story.clientDetails){
lala.Track.clientPageInteraction('Feed.seeDetails.'+story.type+'.'+story.subtype);
api.Stories.getDetails(storyId,function(res){
story.clientDetails=res.data;
self._openFeedDetails(story,true);
});
}else{
this._openFeedDetails(story);
}
},

_openFeedDetails:function(story,loaded){
var divId='feedEntryDetails_'+story.storyId;
if(loaded){
story.clientLayout.renderDetails(story,divId);
story.clientDetails.isOpen=true;
mojo.css.addClass('moreDetailsLink_'+story.storyId,'moreDetailsLinkOpened');
}else{
var justOpened=mojo.css.toggleDisplay(divId);
if(justOpened){
mojo.css.addClass('moreDetailsLink_'+story.storyId,'moreDetailsLinkOpened');
}else{
mojo.css.removeClass('moreDetailsLink_'+story.storyId,'moreDetailsLinkOpened');
}
}
}
};


widgets.Feed.BaseLayout=Class.create();
widgets.Feed.BaseLayout.prototype={
initBase:function(params){
mojo.assert(params.icon,'icon: required for all layouts');
mojo.assert(params.layoutClass,'layoutClass: required for all layouts');

this.icon=params.icon;
this.layoutClass=params.layoutClass;
},

getSrcImageHtml:function(){
mojo.impossible('getSrcImageHtml: abstract method');
},

getSummaryLineHtml:function(story){
mojo.impossible('getSummaryLineHtml: abstract method');
},

getSummaryDataHtml:function(story){
mojo.impossible('getSummaryDataHtml: abstract method');
},

getMoreDetailsHtml:function(story){
mojo.impossible('getMoreDetailsHtml: abstract method');
},

getTrackingId:function(story){
return'Feed.'+story.type+'.'+story.subtype;
},

renderMoreDetailsHtml:function(story,showPlayQueue){
var tmpl='moreDetails';
var t=$T(lt.Feed[tmpl]).replaceToken('storyId',story.storyId);
var detailsInfo=this.getDetailsInfo(story);


if(detailsInfo&&detailsInfo.count>0){
t.replaceToken('beforeLink','and');
t.replaceToken('linkText',
detailsInfo.count+' other '+detailsInfo.label
+(detailsInfo.count>1?'s':''));
t.keepTokenBlock('PlayStoryBlock',showPlayQueue);
return t.compose();
}else{
return'';
}
},


getDetailsInfo:function(story){
return null;
},

renderDetails:function(story,divId){
mojo.impossible('renderDetails: abstract method');
},


getSummaryArtist:function(story){
return story.data.artist&&story.data.artist.imgBasePath?story.data.artist:null;
},

getDetailArtist:function(story){
return story.data.artist&&story.data.artist.imgBasePath?story.data.artist:null;
},


getSongListParams:function(){
return{};
},


getMoreSongListParams:function(){
return{};
},


renderSingleTrackSummary:function(track,hideArtist,story){
var t=$T(lt.Feed.singleTrackSummary);
var hoverOffsets={};
if(mojo.FF3&&mojo.MAC){
hoverOffsets.top=-4;
}else if(mojo.FF3){
hoverOffsets.top=-3;
}else if(mojo.IE7){
hoverOffsets.top=-2;
}else if(mojo.SAFARI){
hoverOffsets.top=-2;
}
var trackingId=this.getTrackingId(story);
var slParams={
layout:'single',
clickTrackingId:trackingId,
trackingId:trackingId,
hideActions:true,
hideArtist:hideArtist,
hideNum:true,
offsets:hoverOffsets
};
Object.extend(slParams,this.getSongListParams());
var w=new widgets.SongList(slParams);
t.replaceToken('songHtml',w.render([track]));
return t.compose();
},


renderShoutTrackSummary:function(trackInfo,story){
var track=trackInfo.track;
var t=$T(lt.Feed.shoutThingSummary);
t.replaceToken('message',trackInfo.message.lescapeHTML(true).replace(/(\S{60})/g,'$1 '));
var hoverOffsets={};
if(mojo.FF3&&mojo.MAC){
hoverOffsets.top=-4;
}else if(mojo.FF3){
hoverOffsets.top=-3;
}else if(mojo.IE7){
hoverOffsets.top=-2;
}else if(mojo.SAFARI){
hoverOffsets.top=-2;
}
var trackingId=this.getTrackingId(story);
var slParams={
layout:'single',
clickTrackingId:trackingId,
trackingId:trackingId,
hideActions:true,
hideNum:true,
offsets:hoverOffsets
};
Object.extend(slParams,this.getSongListParams());
var w=new widgets.SongList(slParams);
t.replaceToken('thingHtml',w.render([track]));
return t.compose();
},


renderAlbumSummary:function(album,story){
var t=$T(lt.Feed.albumSummary);
var trackingId=this.getTrackingId(story);
var w=new widgets.AlbumList({
layout:'feed',
trackingId:trackingId,
clickTrackingId:trackingId
});
t.replaceToken('albumHtml',w.getHtml([album]));
return t.compose();
},


renderShoutAlbumSummary:function(albumInfo,story){
var album=albumInfo.disc;
var t=$T(lt.Feed.shoutThingSummary);
t.replaceToken('message',albumInfo.message.lescapeHTML(true).replace(/(\S{60})/g,'$1 '));
t.replaceToken('thingHtml',this.renderAlbumSummary(album,story));
return t.compose();
},


renderPlaylistSummary:function(playlist,story){
var t=$T(lt.Feed.playlistSummary);
var w=new widgets.PlaylistList({
hideMember:true,
hideNumber:true,
useMediumIcon:true,
layout:'wide',
trackingId:this.getTrackingId(story)
});
t.replaceToken('playlistHtml',w.getHtml([playlist]));
var artists=playlist.artistPreviewList.split('::').slice(0,3);
t.replaceToken('s',artists.length>1?'s':'');
playlist.artistList=artists.join('::');
t.replaceTokensWithBean('playlist',playlist);

return t.compose();
},


renderShoutPlaylistSummary:function(playlistInfo,story){
var playlist=playlistInfo.playlist;
var t=$T(lt.Feed.shoutThingSummary);
t.replaceToken('message',playlistInfo.message.lescapeHTML(true).replace(/(\S{60})/g,'$1 '));
t.replaceToken('thingHtml',this.renderPlaylistSummary(playlist,story));
return t.compose();
},

renderArtistSummary:function(artist,story){
var t=$T(lt.Feed.artistShout)
.replaceTokensWithBean('artist',artist)
.replaceToken('clickTrackingId',this.getTrackingId(story));
return t.compose();
},


renderShoutArtistSummary:function(artistInfo,story){
var artist=artistInfo.artist;
var t=$T(lt.Feed.shoutThingSummary);
var trackingId=this.getTrackingId(story);
t.replaceToken('message',artistInfo.message.lescapeHTML(true).replace(/(\S{60})/g,'$1 '));
t.replaceToken('thingHtml',this.renderArtistSummary(artist,story));
return t.compose();
},


renderMemberList:function(memberList,divId,story){
var trackingId=this.getTrackingId(story);
var t=$T(lt.Feed.memberList,divId);
var r=t.getTokenBlock('MemberBlock');
memberList.leach(function(user){
r.replaceTokensWithBean('user',user)
.replaceToken('size',30)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('nickName',user.nickName);
r.next();
});
return t.compose();
},


renderMemberSrc:function(user,story){
return $T(lt.Feed.memberSrc)
.replaceToken('size',40)
.replaceToken('clickTrackingId',this.getTrackingId(story))
.replaceTokensWithBean('user',user)
.compose();
},


renderMultiMemberSrc:function(user,story){
return $T(lt.Feed.multiMemberSrc)
.replaceToken('size',40)
.replaceToken('clickTrackingId',this.getTrackingId(story))
.replaceTokensWithBean('user',user)
.compose();
},


renderLalaSrc:function(){
return $TC(lt.Feed.lalaSrc);
},


renderMoreSongs:function(songs,divId,artists,isTerse,story){
var artistHtml='';
artists.leach(function(artist){
artistHtml+=frontend.img.ArtistLink(artist,'small');
});

var hoverOffsets={};
if(mojo.FF3){
hoverOffsets.top=-3;
}else if(mojo.IE7){
hoverOffsets.top=-2;
}
var trackingId=this.getTrackingId(story);
var slParams={
layout:'feed',
hideActions:true,
showListens:!isTerse,
showDateKey:'clientStoryTime',
clickTrackingId:trackingId,
trackingId:trackingId,
offsets:hoverOffsets
};
Object.extend(slParams,this.getMoreSongListParams());
var w=new widgets.SongList(slParams);
$S(divId,artistHtml+'<div class="lclear"></div>'+w.render(songs));
},


renderMoreAlbums:function(albums,divId,story){
var trackingId=this.getTrackingId(story);
var w=new widgets.AlbumList({
renderTargetId:divId,
clickTrackingId:trackingId,
trackingId:trackingId,
layout:'feed'
});
w.render(albums);
},


renderMorePlaylists:function(playlists){
var html='';
playlists.leach(function(playlist){
var t=$T(lt.Feed.playlistSummary);
var w=new widgets.PlaylistList({
hideMember:true,
hideNumber:true,
useMediumIcon:true,
layout:'wide'
});
t.replaceToken('playlistHtml',w.getHtml([playlist]));
var artists=playlist.artistPreviewList.split('::').slice(0,3);
t.replaceToken('s',artists.length>1?'s':'');
playlist.artistList=artists.join('::');
t.replaceTokensWithBean('playlist',playlist);

html+=t.compose();
});
return html;
}
};









widgets.Feed.MultiSongLayout=Class.create();
widgets.Feed.MultiSongLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
this.showRatings=this.mode=='Rating';
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMemberSrc(story.data.user,story);
},

getSummaryLineHtml:function(story){
var track=story.data.trackInfo.track;
var user=story.data.user;


var tmpl='multiSong_'+this.mode+'_SummaryLine';
var trackingId=this.getTrackingId(story);
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
var t=$T(lt.Feed[tmpl]);
t.replaceTokensWithBean('user',user);
t.replaceTokensWithBean('track',track);
t.replaceToken('label',this.label);
t.replaceToken('clickTrackingId',trackingId);


if(this.mode=="Purchase"){
t.replaceToken('n',this.label.lstartsWithVowel()
||this.label.match(/^mp3/i)?'n':'');
}


t.replaceToken('count',story.data.extraCount+1);

return t.compose();
},

getSummaryDataHtml:function(story){
return this.renderSingleTrackSummary(story.data.trackInfo.track,true,story);
},

getMoreDetailsHtml:function(story){
return this.renderMoreDetailsHtml(story,true);
},

renderDetails:function(story,divId){
var tracks=[];
story.clientDetails.trackInfos.leach(function(trackInfo,i){
tracks[i]=trackInfo.track;
tracks[i].clientStoryTime=trackInfo.timestamp;
tracks[i].clientRating=trackInfo.rating;
});
var artistsForImages=story.clientDetails.artists;
this.renderMoreSongs(tracks,divId,artistsForImages,null,story);
}
};
Object.extend(widgets.Feed.MultiSongLayout.prototype,widgets.Feed.BaseLayout.prototype,true);

widgets.Feed.RatingMultiSongLayout=Class.create();
widgets.Feed.RatingMultiSongLayout.prototype={
getSummaryDataHtml:function(story){

story.data.trackInfo.track.clientRating=story.data.trackInfo.rating;
return this.renderSingleTrackSummary(story.data.trackInfo.track,true,story);
},

getSongListParams:function(){
return{
showRatings:true,
ratingField:'clientRating',
ratingType:RatingWidget.TYPE_USER,
ratingSize:RatingWidget.SIZE_LARGE
}
},

getMoreSongListParams:function(){
return{
showRatings:true,
ratingField:'clientRating',
ratingType:RatingWidget.TYPE_USER,
ratingSize:RatingWidget.SIZE_SMALL
}
}
};
Object.extend(widgets.Feed.RatingMultiSongLayout.prototype,widgets.Feed.MultiSongLayout.prototype,true);


widgets.Feed.GenreTopSongLayout=Class.create();
widgets.Feed.GenreTopSongLayout.prototype={
getSrcImageHtml:function(story){
return this.renderLalaSrc();
},

getSummaryDataHtml:function(story){
return this.renderSingleTrackSummary(story.data.trackInfo.track,true,story);
},

getSummaryLineHtml:function(story){
var track=story.data.trackInfo.track;
var user=story.data.user;

var tmpl='multiSong_'+this.mode+'_SummaryLine';
var trackingId=this.getTrackingId(story);
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
return $T(lt.Feed[tmpl])
.replaceTokensWithBean('user',user)
.replaceTokensWithBean('track',track)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('genre',track.genre)
.compose();
},

getMoreDetailsHtml:function(story){
return $T(lt.Feed.moreDetails)
.replaceToken('storyId',story.storyId)
.replaceToken('linkText','Also popular in '+story.data.trackInfo.track.genre)
.compose();
},

renderDetails:function(story,divId){
var tracks=[];
story.clientDetails.trackInfos.leach(function(trackInfo,i){
tracks[i]=trackInfo.track;
tracks[i].clientStoryTime=trackInfo.timestamp;
});

var trackingId=this.getTrackingId(story);
var t=$T(lt.Feed.genreTopSongDetails,divId)
.replaceToken('genre',story.data.trackInfo.track.genre)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('storyId',story.storyId);

t.removeTokenBlock('IntroBlock');
t.compose();
this.renderMoreSongs(tracks,'genreTopSongDetails_'+story.storyId,story.clientDetails.artists,true,story);
}
};
Object.extend(widgets.Feed.GenreTopSongLayout.prototype,widgets.Feed.MultiSongLayout.prototype,true);




widgets.Feed.MultiDiscLayout=Class.create();
widgets.Feed.MultiDiscLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
if(this.mode=='NewRelease'){
return this.renderLalaSrc();
}else{
return this.renderMemberSrc(story.data.user,story);
}
},

getSummaryLineHtml:function(story){
var disc=story.data.discInfo.disc;
var user=story.data.user;


var tmpl='multiDisc_'+this.mode+'_SummaryLine';
var trackingId=this.getTrackingId(story);
user.nickNameUpper=user.nickName.ltoFirstUpperCase();

return $T(lt.Feed[tmpl])
.replaceToken('label',this.label)
.replaceToken('n',this.label.lstartsWithVowel()
||this.label.match(/^mp3/i)?'n':'')
.replaceTokensWithBean('user',user)
.replaceTokensWithBean('disc',disc)
.replaceToken('clickTrackingId',trackingId)
.compose();
},

getSummaryDataHtml:function(story){
return this.renderAlbumSummary(story.data.discInfo.disc,story);
},

getMoreDetailsHtml:function(story){
return this.renderMoreDetailsHtml(story);
},

renderDetails:function(story,divId){
var discs=story.clientDetails.discInfos.lpluck('disc');
this.renderMoreAlbums(discs,divId,story);
}
};
Object.extend(widgets.Feed.MultiDiscLayout.prototype,widgets.Feed.BaseLayout.prototype,true);




widgets.Feed.MultiPlaylistLayout=Class.create();
widgets.Feed.MultiPlaylistLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMemberSrc(story.data.user,story);
},

getSummaryLineHtml:function(story){
var playlist=story.data.headPlaylistInfo.playlist;
var user=story.data.user;


var tmpl='multiPlaylist_'+this.mode+'_SummaryLine';
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
var t=$T(lt.Feed[tmpl]);
t.replaceToken('label',this.label);
t.replaceToken('n',this.label.lstartsWithVowel()
||this.label.match(/^mp3/i)?'n':'');
t.replaceTokensWithBean('user',user);
if(!lala.user||playlist.userToken!=lala.user.userToken){
t.removeTokenBlock('OfYours');
}

return t.compose();
},

getSummaryDataHtml:function(story){
return this.renderPlaylistSummary(story.data.headPlaylistInfo.playlist,story);
},

getMoreDetailsHtml:function(story){
return this.renderMoreDetailsHtml(story);
},

renderDetails:function(story,divId){
var playlists=story.clientDetails.detailPlaylistInfo.lpluck('playlist');
var html='';
var self=this;
playlists.leach(function(playlist){
html+=self.renderPlaylistSummary(playlist,story);
});
$S(divId,html);
}
};
Object.extend(widgets.Feed.MultiPlaylistLayout.prototype,widgets.Feed.BaseLayout.prototype,true);



widgets.Feed.MultiUserPlaylistLayout=Class.create();
widgets.Feed.MultiUserPlaylistLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
if(story.data.extraCount>1){
return this.renderMultiMemberSrc(story.data.user,story)
}else{
return this.renderMemberSrc(story.data.user,story);
}
},

getSummaryLineHtml:function(story){










var user=story.data.headUserInfos[0].user;
var playlist=story.data.playlistInfo.playlist;


var tmpl='multiUser_'+this.mode
+(story.data.extraCount==1
&&user.userToken==playlist.userToken?'_self':'')
+'_SummaryLine';
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
playlist.nickNameUpper=playlist.nickName.ltoFirstUpperCase();
var t=$T(lt.Feed[tmpl]);
t.replaceTokensWithBean('user',user);
t.replaceTokensWithBean('playlist',playlist);

if(story.data.extraCount==2){
t.replaceToken('extraCountText','and one other person');
}else if(story.data.extraCount>2){
t.replaceToken('extraCountText',
'and '+(story.data.extraCount-1)+' other people');
}

return t.compose();
},

getSummaryDataHtml:function(story){
return this.renderPlaylistSummary(story.data.playlistInfo.playlist,story);
},

getMoreDetailsHtml:function(story){
var html;
if(story.data.extraCount==2){
html=$T(lt.Feed.moreDetails)
.replaceToken('storyId',story.storyId)
.replaceToken('beforeLink','Show ')
.replaceToken('linkText',' both listeners')
.compose();
}else if(story.data.extraCount>2){
html=$T(lt.Feed.moreDetails)
.replaceToken('storyId',story.storyId)
.replaceToken('beforeLink','Show all ')
.replaceToken('linkText',story.data.extraCount+' listeners')
.compose();
}
return html;
},

renderDetails:function(story,divId){
var users=story.clientDetails.detailUserInfos.lpluck('user');
this.renderMemberList(users,divId,story);
}
};
Object.extend(widgets.Feed.MultiUserPlaylistLayout.prototype,widgets.Feed.BaseLayout.prototype,true);



widgets.Feed.ShareLayout=Class.create();
widgets.Feed.ShareLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMemberSrc(story.data.user,story);
},

getSummaryLineHtml:function(story){
var track=story.data.trackInfo.track;
var user=story.data.user;


var tmpl='share'+this.mode+'SummaryLine';
var trackingId=this.getTrackingId(story);
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
return $T(lt.Feed[tmpl])
.replaceToken('label',this.label)
.replaceToken('clickTrackingId',trackingId)
.replaceTokensWithBean('user',user)
.replaceTokensWithBean('track',track)
.compose();
},

getSummaryDataHtml:function(story){
return this.renderSingleTrackSummary(story.data.trackInfo.track,null,story);
},

getMoreDetailsHtml:function(story){
return this.renderMoreDetailsHtml(story);
},

renderDetails:function(story,divId){
var tracks=[];
story.clientDetails.trackInfos.leach(function(trackInfo,i){
tracks[i]=trackInfo.track;
tracks[i].clientStoryTime=trackInfo.timestamp;
});
this.renderMoreSongs(tracks,divId,story.clientDetails.artists,null,story);
}
};
Object.extend(widgets.Feed.ShareLayout.prototype,widgets.Feed.BaseLayout.prototype,true);






widgets.Feed.ShoutLayout=Class.create();
widgets.Feed.ShoutLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMemberSrc(story.data.user,story);
},

getSummaryLineHtml:function(story){
var user=story.data.user;
var tmpl='shoutSummaryLine';
var trackingId=this.getTrackingId(story);
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
return $T(lt.Feed[tmpl])
.replaceToken('clickTrackingId',trackingId)
.replaceTokensWithBean('user',user)
.compose();
},

getSummaryDataHtml:function(story){
var retVal="";
switch(this.mode){
case'Song':
retVal=this.renderShoutTrackSummary(story.data.trackInfo,story);
break;
case'Album':
retVal=this.renderShoutAlbumSummary(story.data.discInfo,story);
break;
case'Artist':
retVal=this.renderShoutArtistSummary(story.data.headArtistInfos[0],story);
break;
case'Playlist':
retVal=this.renderShoutPlaylistSummary(story.data.headPlaylistInfo,story);
break;
}
return retVal;
},

getMoreDetailsHtml:function(story){
return"";
}
};
Object.extend(widgets.Feed.ShoutLayout.prototype,widgets.Feed.BaseLayout.prototype,true);



widgets.Feed.MultiUserLayout=Class.create();
widgets.Feed.MultiUserLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMemberSrc(story.data.user,story);
},

getSummaryLineHtml:function(story){
var extraUsers=story.data.headUserInfos.lpluck('user');
var user=story.data.user;


var tmpl='multiUser_'+this.mode+'_SummaryLine';
var trackingId=this.getTrackingId(story);

var t=$T(lt.Feed[tmpl]);
t.replaceToken('label',this.label);
user.nickNameUpper=user.nickName.ltoFirstUpperCase();
t.replaceTokensWithBean('user',user);
t.replaceToken('clickTrackingId',trackingId);

var r=t.getTokenBlock('UserBlock');
var eu=extraUsers.length;
var ec=story.data.extraCount;
var others=ec==1?' other ':' others ';
extraUsers.leach(function(extraUser,i){
r.replaceTokensWithBean('extraUser',extraUser);
r.replaceToken('punctuation',(eu-i<=1&&ec>0)
?' and '+ec+others:i==(eu+ec-2)
?' and ':i==(eu+ec-1)
?'':', ');
r.next();
});
return t.compose();
},

getSummaryDataHtml:function(story){
return this.renderMemberList(story.data.headUserInfos.lpluck('user'),null,story);
},

getMoreDetailsHtml:function(story){
return this.renderMoreDetailsHtml(story);
},

renderDetails:function(story,divId){
var users=story.clientDetails.detailUserInfos.lpluck('user');
this.renderMemberList(users,divId,story);
}
};
Object.extend(widgets.Feed.MultiUserLayout.prototype,widgets.Feed.BaseLayout.prototype,true);



widgets.Feed.MultiUserSongLayout=Class.create();
widgets.Feed.MultiUserSongLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,
label:this.label};
},

getSrcImageHtml:function(story){
if(story.data.headUserInfos){
return this.renderMultiMemberSrc(story.data.headUserInfos[0].user,story)
}else{
return this.renderMemberSrc(story.data.user,story);
}
},

getSummaryLineHtml:function(story){
var track=story.data.trackInfo?story.data.trackInfo.track:null;
var extraUsers=story.data.headUserInfos?story.data.headUserInfos.lpluck('user'):[];


var tmpl='multiUserSong_'+this.mode+'_SummaryLine';
var trackingId=this.getTrackingId(story);

var t=$T(lt.Feed[tmpl]);
t.replaceTokensWithBean('track',track);
t.replaceToken('clickTrackingId',trackingId);

var r=t.getTokenBlock('UserBlock');
var eu=extraUsers.length;
var ec=story.data.extraCount;
var others=ec==1?' other ':' others ';
extraUsers.leach(function(extraUser,i){
r.replaceTokensWithBean('extraUser',extraUser);
r.replaceToken('punctuation',(eu-i<=1&&ec>0)
?' and '+ec+others:i==(eu+ec-2)
?' and ':i==(eu+ec-1)
?'':', ');
r.next();
});


t.replaceToken('count',story.data.extraCount+1);

return t.compose();
},

getSummaryDataHtml:function(story){
return this.renderSingleTrackSummary(story.data.trackInfo.track,true,story);
},

getMoreDetailsHtml:function(story){
return $T(lt.Feed.moreDetails)
.replaceToken('storyId',story.storyId)
.replaceToken('linkText','Show all '
+(story.data.extraCount+story.data.headUserInfos.length)+' people')
.compose();
},

renderDetails:function(story,divId){
var users=story.clientDetails.detailUserInfos.lpluck('user');
users=[].laddAll(story.data.headUserInfos.lpluck('user')).laddAll(users);


$S(divId,this.renderMemberList(users,null,story));
}
};
Object.extend(widgets.Feed.MultiUserSongLayout.prototype,widgets.Feed.BaseLayout.prototype,true);



widgets.Feed.MultiSongMultiUserLayout=Class.create();
widgets.Feed.MultiSongMultiUserLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:story.data.extraCount,

label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMultiMemberSrc(story.data.headUserInfos[0].user,story);
},

getSummaryLineHtml:function(story){
var track=story.data.trackInfo;
var artist=story.data.artist;
var extraUsers=story.data.headUserInfos.lpluck('user');


var tmpl='multiSongMultiUser_'+this.mode+'_SummaryLine';

var trackingId=this.getTrackingId(story);
var t=$T(lt.Feed[tmpl]);
t.replaceTokensWithBean('track',track);
t.replaceTokensWithBean('artist',artist);
t.replaceToken('clickTrackingId',trackingId);


var r=t.getTokenBlock('UserBlock');
var eu=extraUsers.length;
var ec=story.data.extraUserCount;
var others=ec==1?' other person ':' others ';
extraUsers.leach(function(extraUser,i){
r.replaceTokensWithBean('extraUser',extraUser);
r.replaceToken('punctuation',(eu-i<=1&&ec>0)
?' and '+ec+others:i==(eu+ec-2)
?' and ':i==(eu+ec-1)
?'':', ');
r.next();
});


t.replaceToken('count',story.data.extraCount+1);

return t.compose();
},

getSummaryDataHtml:function(story){
return this.renderSingleTrackSummary(story.data.trackInfo.track,null,story);
},

getMoreDetailsHtml:function(story){
return this.renderMoreDetailsHtml(story);
},

renderDetails:function(story,divId){
var tracks=[];
story.clientDetails.trackInfos.leach(function(trackInfo,i){
tracks[i]=trackInfo.track;
tracks[i].listeners=trackInfo.users;
});

var trackingId=this.getTrackingId(story);
$T(lt.Feed['multiSongMultiUser_'+this.mode+'_DetailLineMulti'],divId)
.replaceToken('storyId',story.storyId)
.replaceToken('clickTrackingId',trackingId)
.compose();

var w=new widgets.SongList({
renderTargetId:'followTopArtistDetails_'+story.storyId,
layout:'feed',
hideActions:true,
showListens:false,
listenersKey:'listeners'
});
w.render(tracks);
}
};
Object.extend(widgets.Feed.MultiSongMultiUserLayout.prototype,widgets.Feed.BaseLayout.prototype,true);


widgets.Feed.ArtistLayout=Class.create();
widgets.Feed.ArtistLayout.prototype={
initialize:function(params){
this.initBase({icon:params.icon,
layoutClass:params.layoutClass});
this.mode=params.mode;
this.label=params.label;
},

getDetailsInfo:function(story){
return{count:0,
label:this.label};
},

getSrcImageHtml:function(story){
return this.renderMemberSrc(story.data.user,story);
},

getSummaryLineHtml:function(story){
var user=story.data.user;
var artist=story.data.headArtistInfos.lpluck('artist')[0];

user.nickNameUpper=user.nickName.ltoFirstUpperCase();


var tmpl='multiArtist_'+this.mode+'_SummaryLine';
var trackingId=this.getTrackingId(story);
var t=$T(lt.Feed[tmpl]);
t.replaceTokensWithBean('user',user);
t.replaceTokensWithBean('artist',artist);
t.replaceToken('clickTrackingId',trackingId);

return t.compose();
},

getSummaryDataHtml:function(story){
var artistList=new widgets.ArtistList({
imageSize:'small',
layout:'list',
hideNumber:true
});
return artistList.getRowsHtml([story.data.headArtistInfos[0].artist],true);
},

getMoreDetailsHtml:function(story){
return"";
},

renderDetails:function(story,divId){
return"";
}
};
Object.extend(widgets.Feed.ArtistLayout.prototype,widgets.Feed.BaseLayout.prototype,true);




api.SearchUtils={
searchArtists:function(p,onResponse){
lala.sendRequest(
{url:'SearchUtils/searchArtists',
params:{
Q:p.Q,
sortKey:p.sortKey,
sortDir:p.sortDir,
count:p.count,
skip:p.skip||0
},
onResponse:onResponse});
},

searchMember:function(sc,onResponse){
lala.sendRequest(
{url:'SearchUtils/searchMember',
params:{Q:sc.Q,count:sc.count,skip:0,
sortKey:sc.sortKey,
sortDir:sc.sortDir,
friendsOnly:sc.friendsOnly},
onResponse:function(res){
onResponse(res);
}});
},

searchTraderList:function(sc,onResponse){
lala.sendRequest(
{url:'SearchUtils/searchTraderList',
params:{Q:sc.Q,
count:sc.count,
skip:0,
sortKey:sc.sortKey,
sortDir:sc.sortDir,
userToken:sc.userToken},
onResponse:onResponse});
},

getGenres:function(sc,onResponse){
lala.sendRequest(
{url:'SearchUtils/getGenres',
params:{Q:sc.Q},
onResponse:onResponse});
},

getInfluencers:function(sc,onResponse){
lala.sendRequest({
url:'SearchUtils/getInfluencers',
params:{count:sc.count,
Q:sc.Q,
includeHistos:sc.includeHistos,
excludeFriends:sc.excludeFriends,
skip:sc.skip||0,
showSimilarUsers:sc.recommended},
onResponse:onResponse
});
},

getListeners:function(sc,onResponse){
lala.sendRequest({
url:'SearchUtils/getListeners',
params:{
count:sc.count,
Q:sc.Q,
skip:sc.skip||0
},
onResponse:onResponse
});
},

getEditorialInfluencers:function(sc,onResponse){
lala.sendRequest({
url:'SearchUtils/getEditorialInfluencers',
params:{count:sc.count||6,skip:sc.skip||0},
onResponse:onResponse
});
},

getSubgenres:function(genre,onResponse){
lala.sendRequest({
url:'SearchUtils/getSubgenres',
params:{genre:genre},
onResponse:onResponse
});
},

getMixWithArtist:function(artist,onResponse){
lala.sendRequest({
url:'SearchUtils/getMixWithArtist',
params:{artistName:artist},
onResponse:onResponse});
},

getMixWithQ:function(Q,onResponse){
lala.sendRequest({
url:'SearchUtils/getMixWithQ',
params:{Q:Q},
onResponse:onResponse
});
},

getPlaylistSuggestions:function(playlistId,collectionOnly,skip,count,onResponse){
lala.sendRequest({
url:'SearchUtils/getPlaylistSuggestions',
params:{
playlistId:playlistId,
collectionOnly:collectionOnly,
skip:skip,
count:count
},
onResponse:onResponse
});
},

getArtist:function(artistName,onResponse){
lala.sendRequest({
url:'SearchUtils/getArtist',
params:{
artistName:artistName
},
onResponse:onResponse
});
}
};

api.Q={
searchSongs:function(p,onResponse){
this._send('searchSongs',p,onResponse);
},

searchAlbums:function(p,onResponse){
this._send('searchAlbums',p,onResponse);
},

searchArtists:function(p,onResponse){
this._send('searchArtists',p,onResponse);
},

searchPlaylists:function(p,onResponse){
this._send('searchPlaylists',p,onResponse);
},

searchSongsForAPage:function(p,onResponse){
this._send('searchSongsForAPage',p,onResponse);
},

searchCollectionSongs:function(p,onResponse){
this._send('searchCollectionSongs',p,onResponse);
},

searchAlbumsForAPage:function(p,onResponse){
this._send('searchAlbumsForAPage',p,onResponse);
},

searchArtistsForAPage:function(p,onResponse){
this._send('searchArtistsForAPage',p,onResponse);
},

searchCharts:function(songIdOrDiscId,onResponse){
this._send('searchCharts',{
Q:'songid: '+songIdOrDiscId
},onResponse);
},

_send:function(method,p,onResponse){
lala.sendRequest({
url:'Q/'+method,
params:{
Q:p.Q,
skip:p.skip,
count:p.count,
sortKey:p.sortKey,
sortDir:p.sortDir,
histos:p.histos
},
onResponse:onResponse
});
}
};

api.Tiny={
forSong:function(linkSongLalaId,onResponse){
this._send('forSong',{linkSongLalaId:linkSongLalaId},onResponse);
},

forAlbum:function(discId,onResponse){
this._send('forAlbum',{lalaId:discId},onResponse);
},

forArtist:function(artistId,onResponse){
this._send('forArtist',{lalaId:artistId},onResponse);
},

forPlaylist:function(playlistId,onResponse){
this._send('forPlaylist',{lalaId:playlistId},onResponse);
},

_send:function(method,p,onResponse){
lala.sendRequest({
url:'Tiny/'+method,
params:p,
onResponse:function(res){
res.data=lala.actionBaseURL.replace('www.','')+res.data;
onResponse(res.data);
}
});
}
};






var LalaFBConnect={
STATUS_CONNECTED:1,
STATUS_NOT_LOGGED_IN:2,
STATUS_NOT_AUTHORIZED:3,
LISTENER_INITIALIZED:'listenerInitialized',
LISTENER_SESSION_READY:'listenerSessionReady',
LISTENER_NOW_CONNECTED:'listenerNowConnected',
LISTENER_NOW_LOGGED_OUT:'listenerLoggedOut',
LISTENER_LINKED_USER_DIFF:'listenerLinkedUserDiff',
LISTENER_PERMISSION_CHANGED:'listenerPermissionChanged',
TITLE_NOT_CONNECTED:"Currently not logged into Facebook",
TITLE_CONNECTED:"Logged into Facebook as ",
PARTNER_ID:"fbconnect",

TEMPLATE_reviewAlbum:'@actor@ reviewed an album on Lala',
TEMPLATE_listening:'"@title@" by @artist@',
TEMPLATE_listening_artist:'@artist@',
TEMPLATE_listening_playlist:'"@title@" by @artist@',
TEMPLATE_giftSong:'@actor@ gave @recipient@ a song on Lala',
TEMPLATE_buyMP3Album:'@actor@ bought an album on Lala',
TEMPLATE_buyMP3Song:'@actor@ bought a song on Lala',
TEMPLATE_buyWebAlbum:'@actor@ added an album to @possessive@ Lala collection',
TEMPLATE_buyWebSong:'@actor@ added a song to @possessive@ Lala collection',
TEMPLATE_pickForecast:'@actor@ picked a song for @possessive@ Lala Forecast',
TEMPLATE_recoSongFacebookFriend:'@actor@ recommended a song',
TEMPLATE_recoAlbumFacebookFriend:'@actor@ recommended an album',
TEMPLATE_recoArtistFacebookFriend:'@actor@ recommended an artist',
TEMPLATE_recoPlaylistFacebookFriend:'@actor@ recommended a playlist',
TEMPLATE_recoSong:'@actor@ recommended a song to @recipients@ on Lala',
TEMPLATE_recoAlbum:'@actor@ recommended an album to @recipients@ on Lala',
TEMPLATE_recoArtist:'@actor@ recommended an artist to @recipients@ on Lala',
TEMPLATE_recoPlaylist:'@actor@ recommended a playlist to @recipients@ on Lala',
TEMPLATE_promptConnect:'"@title@" by @artist@',

config:{},

status:0,
loggedInUserId:0,
loggedInUser:{},
_init:false,
sessionReady:false,
loggedInToFacebook:false,

init:function(config){
var self=this;
if(typeof(FB_RequireFeatures)==undefined)return;

this.config=config;
FB_RequireFeatures(["XFBML"],function(){
FB.Facebook.init(self.config.apiKey,
self.config.externalFrontendExternalBase
+"/fbConnect/xd_receiver.htm"




);

self._init=true;
mojo.listeners.notify(LalaFBConnect.LISTENER_INITIALIZED);
FB.ensureInit(function(){
FB.Facebook.get_sessionState().waitUntilReady(function(){
self.sessionReady=true;
mojo.listeners.notify(LalaFBConnect.LISTENER_SESSION_READY);
LalaFBConnect.onFBSessionReady();
});
});

});

mojo.listeners.addGlobal(api.LalaForecast.EVT_FORECAST_UPDATED,this.openPickForecastDialog.lbind(this));
mojo.listeners.addGlobal(api.MicroWallet.EVT_BUY_WEB_SONG,this.openBuyWebSongDialog.lbind(this));
mojo.listeners.addGlobal(api.MicroWallet.EVT_BUY_WEB_ALBUM,this.openBuyWebAlbumDialog.lbind(this));
mojo.listeners.addGlobal(api.MicroWallet.EVT_BUY_MP3_SONGS,this.openBuyMP3SongDialog.lbind(this));
mojo.listeners.addGlobal(api.MicroWallet.EVT_BUY_MP3_ALBUM,this.openBuyMP3AlbumDialog.lbind(this));
mojo.listeners.addGlobal(api.Recos.EVT_RECO_SONG,this.openRecoSongDialog.lbind(this));
mojo.listeners.addGlobal(api.Recos.EVT_RECO_ALBUM,this.openRecoAlbumDialog.lbind(this));
mojo.listeners.addGlobal(api.Recos.EVT_RECO_ARTIST,this.openRecoArtistDialog.lbind(this));
mojo.listeners.addGlobal(api.Recos.EVT_RECO_PLAYLIST,this.openRecoPlaylistDialog.lbind(this));
mojo.listeners.addGlobal(api.MicroWallet.EVT_GIFT_SONG,this.openGiftSongDialog.lbind(this));
mojo.listeners.addGlobal(api.Messaging.EVT_REVIEW_CREATED,this.openReviewAlbumDialog.lbind(this));

mojo.listeners.addGlobal(LalaFBConnect.LISTENER_LINKED_USER_DIFF,LalaFBConnect.openFacebookLinkedDiffDialog);
mojo.listeners.addGlobal(LalaFBConnect.LISTENER_NOW_LOGGED_OUT,LalaFBConnect.openFacebookLostAuthDialog);

},

isInitialized:function(){
return this._init;
},

isSessionReady:function(){
return this.sessionReady;
},

isConnected:function(){
return LalaFBConnect.status==LalaFBConnect.STATUS_CONNECTED;
},

onFBSignInOrUp:function(signInOrUp,trackingId){
if(!trackingId)trackingId=signInOrUp;
LalaFBConnect.onFBConnectClick(trackingId,function(){
LalaFBConnect.onFacebookConnectedFromSignInOrUp(signInOrUp);
});
},

onFacebookConnectedFromSignInOrUp:function(signInOrUp){
api.FacebookConnect.signinWithFacebook(function(res){
if(!res.data.userToken){
MyMusic.g.signInRequired(
signInOrUp=='signin',
null,
null,
null,
null,
null,
true);
}else{
LalaFBConnect.openFacebookSigningInDialog(
res.data.facebookName,
res.data.facebookImgUrl);
window.setTimeout(function(){
var userToken=res.data.userToken;
SignInOrUp.onSignInSuccessViaIFrame(userToken);
},1000);
}
});
},

forceSessionRefresh:function(){
FB.ensureInit(function(){
FB.Connect.forceSessionRefresh();
});
},

onFBConnectClick:function(trackId,onResponse,suppressDialogClose,suppressDiffCheck){
if(!suppressDialogClose)MojoDialog.close();
FB.ensureInit(function(){
FB.Connect.requireSession(
function(){
LalaFBConnect.onFBSessionReady(function(){
LalaFBConnect.track('connect.'+trackId+'.success','interaction');
if(onResponse)onResponse();
},suppressDiffCheck);
},
function(){
LalaFBConnect.track('connect.'+trackId+'.cancel','interaction');
});
});

},

onFBSessionReady:function(callback,suppressDiffCheck){


LalaFBConnect.suppressDiffCheck=suppressDiffCheck;
FB.ensureInit(function(){
FB.Connect.ifUserConnected(
function(){

if(lala.user&&LalaFBConnect.isConnected())return;
LalaFBConnect.status=LalaFBConnect.STATUS_CONNECTED;
LalaFBConnect.getLoggedInUser(
function(){

if(LalaFBConnect.isLoggedLinkedDiff()
&&!LalaFBConnect.suppressDiffCheck){
mojo.listeners.notify(LalaFBConnect.LISTENER_LINKED_USER_DIFF);
}
if(callback)callback();
LalaFBConnect.suppressDiffCheck=null;
},
true);
},
function(){
});
});

},

clearLoggedInUser:function(evtInfo){
LalaFBConnect.loggedInUserId=0;
LalaFBConnect.loggedInUser={};
LalaFBConnect.status=0;
if(LalaFBConnect.loggedInToFacebook){
mojo.listeners.notify(LalaFBConnect.LISTENER_NOW_LOGGED_OUT,evtInfo);
LalaFBConnect.loggedInToFacebook=false;
}
},



getLoggedInUser:function(callback,doGetInfo,skipTrack){
FB.ensureInit(function(){
FB.Facebook.apiClient.users_getLoggedInUser(function(result,ex){
if(result==null){
LalaFBConnect.clearLoggedInUser();
if(callback)callback(false);
}else{
LalaFBConnect.loggedInUserId=result;
var fn=function(){
mojo.listeners.notify(LalaFBConnect.LISTENER_NOW_CONNECTED);
LalaFBConnect.loggedInToFacebook=true;
if(!skipTrack)LalaFBConnect.track('connected');
if(callback)callback(true);
}
if(doGetInfo){
LalaFBConnect.getUserInfo(
LalaFBConnect.loggedInUserId,
["first_name","name","last_name","pic_square_with_logo","pic_big_with_logo","sex"],
function(result){
LalaFBConnect.loggedInUser=result[0];
fn();
});
}else{
fn();
}
}
});
});
},

track:function(name,type){
lala.Track.client('FBConnect.'+(type?type+'.':'')+name);
},

getUserInfo:function(uid,fields,onResponse){
this.getUsersInfo([uid],fields,onResponse);
},

getUsersInfo:function(uids,fields,onResponse){
FB.ensureInit(function(){
FB.Facebook.apiClient.users_getInfo(
uids,
fields,
function(result,ex){
if(result){
onResponse(result);
}
});
});
},

logout:function(){
if(LalaFBConnect.isConnected()){
FB.ensureInit(function(){
FB.Connect.logout(function(){
frontend.go.SignOut();
});
});
}else{
frontend.go.SignOut();
}
},

openFeedDialog:function(id,userPref,params,message){
var self=this;
LalaFBConnect.track('postToFeedCalledBegin.'+id,'interaction');
if(!DataModel.g.getUserPreference(userPref,true))return;
if(LalaFBConnect.isLoggedLinkedDiff())return;
if(!LalaFBConnect.isConnected()
&&!(lala.user&&lala.user.facebookId
&&DataModel.g.getUserPreference('doFeedPromptLogin',true)
&&id.indexOf("buyMP3")==-1)){
return;
}
LalaFBConnect.track('postToFeedCalled.'+id,'interaction');
LalaFBConnect.forceSessionRefresh();

var feedData={};
if(params.song){
feedData=self.getSongData(params.song,id);
}else if(params.album){
feedData=self.getAlbumData(params.album,id);
}else if(params.artist){
feedData=self.getArtistData(params.artist,id);
}else if(params.playlist){
feedData=self.getPlaylistData(params.playlist,id);
}
if(params.recipient){
Object.extend(feedData,
{"recipient":params.recipient.nickName});
}else if(params.recipients){
var recipientsHtml='';
params.recipients.leach(function(recipient,index,isLast){
var thisHtml=recipient.nickName;
if(index==0){
recipientsHtml+=thisHtml;
}else if(isLast){
recipientsHtml+=(index==1?'':',')+' and '+thisHtml;
}else{
recipientsHtml+=', '+thisHtml;
}
});
Object.extend(feedData,
{"recipients":recipientsHtml});
}

FB.ensureInit(function(){
var userMessage=null;
if(message){
userMessage={value:message};
}
var hasTargetId=params.targetIds&&params.targetIds.length>0;
var attachment={name:$T(LalaFBConnect['TEMPLATE_'+(LalaFBConnect.isConnected()?id:'promptConnect')])
.replaceToken('actor',LalaFBConnect.loggedInUser.first_name)
.replaceToken('title',feedData.title)
.replaceToken('artist',feedData.artist)
.replaceToken('recipient',feedData.recipient)
.replaceToken('recipients',feedData.recipients)
.replaceToken('possessive',LalaFBConnect.loggedInUser.sex=='male'?'his':LalaFBConnect.loggedInUser.sex=='female'?'her':'their')
.compose(),
href:feedData.titleHref,
media:feedData.media,
caption:id.lcontains('listening')?null:id.toLowerCase().lcontains('artist')?feedData.artist:'"'+feedData.title+'" by '+feedData.artist,
description:params.rating?params.rating+' out of 5 stars':null};

FB.Connect.streamPublish(
message,
attachment,
[{text:'Buy on Lala',href:feedData.actionLinkUrl}],
hasTargetId?params.targetIds[0]:null,
null,
function(result){
FB.Connect.ifUserConnected(
function(){
var trackingId='postToFeed.'+id+'.';
var resultStr=''+result;
if(!result||result=='null'||(mojo.isBoolean(result)&&!result)){
trackingId+='notPosted';
}else{
trackingId+='posted';
lala.Track.logServerMessage('INFO','FBConnectPost','result: '+resultStr);

if(hasTargetId){
var sharedWhat=(params.song?'a song':
params.album?'an album':
params.artist?'an artist':
params.playlist?'a playlist':'something sweet');
FB.Facebook.apiClient.notifications_send(
params.targetIds,
"shared "+sharedWhat
+" on <a href='http://www.facebook.com/profile.php?id="
+params.targetIds[0]
+"'>your wall</a>.",
function(result){
LalaFBConnect.track('recoNotificationSent');
});
}

}
LalaFBConnect.track(trackingId,'interaction');
LalaFBConnect.openFeedDialogRecalled=false;
},
function(){



if(!LalaFBConnect.openFeedDialogRecalled){
LalaFBConnect.track('postToFeedLostAuthRecallOpenFeedDialog.'+id,'interaction');
LalaFBConnect.clearLoggedInUser({skipLostAuth:true});
LalaFBConnect.openFeedDialog(id,userPref,params,message);
LalaFBConnect.openFeedDialogRecalled=true;
}
});
},
false
);
if(!LalaFBConnect.isConnected()){
LalaFBConnect.openPromptConnectDialog();
}
});
},

openPromptConnectDialog:function(){
var userPref='hideFbPromptConnectDialog';
if(DataModel.g.getUserPreference(userPref,false))return;
var preventCloseId='fbPromptConnectDialog';
var d=new MojoDialog({title:'Prompting you to login to Facebook',
id:'fbPromptConnectDialog',
preventCloseId:preventCloseId});
d.open($TC(lt.LalaFBConnect.promptConnectDialog));
$('promptConnectOk').onclick=function(){
DataModel.g.setUserPreference(userPref,
$F('promptConnectDialogCheck'));
MojoDialog.close(null,preventCloseId);
MyMusic.g.gotoPage('accountinfo/settings/facebook');
return false;
};
$('promptConnectClose').onclick=function(){
DataModel.g.setUserPreference(userPref,
$F('promptConnectDialogCheck'));
MojoDialog.close(null,preventCloseId);
return false;
};
},

openPickForecastDialog:function(data){
if(data.type!='added')return;
this.openFeedDialog('pickForecast',
'doFeedPickForecast',
{song:data.extra},
data.comment);
},

openBuyWebSongDialog:function(data){
this.openFeedDialog('buyWebSong','doFeedBuyWeb',{song:data.songs[0]});
},

openBuyWebAlbumDialog:function(data){
this.openFeedDialog('buyWebAlbum','doFeedBuyWeb',{album:data.album});
},

openBuyMP3SongDialog:function(data){
if(data.songs&&data.songs.length!=1)return;
this.openFeedDialog('buyMP3Song','doFeedBuyMP3',{song:data.songs[0]});
},

openBuyMP3AlbumDialog:function(data){
this.openFeedDialog('buyMP3Album','doFeedBuyMP3',{album:data.album});
},

openRecoSongDialog:function(data){
if(data.targetIds.length>0||data.members&&data.members.length>0){
this.openFeedDialog(
data.targetIds.length>0?'recoSongFacebookFriend':'recoSong',
data.targetIds.length>0?null:'doFeedReco',
{song:data.song,
recipients:data.members&&data.members.length>0?data.members:null,
targetIds:data.targetIds},
data.message);
}
},

openRecoAlbumDialog:function(data){
if(data.targetIds.length>0||data.members&&data.members.length>0){
this.openFeedDialog(
data.targetIds.length>0?'recoAlbumFacebookFriend':'recoAlbum',
data.targetIds.length>0?null:'doFeedReco',
{album:data.album,
recipients:data.members&&data.members.length>0?data.members:null,
targetIds:data.targetIds},
data.message);
}
},

openRecoArtistDialog:function(data){
if(data.targetIds.length>0||data.members&&data.members.length>0){
this.openFeedDialog(
data.targetIds.length>0?'recoArtistFacebookFriend':'recoArtist',
data.targetIds.length>0?null:'doFeedReco',
{artist:data.artist,
recipients:data.members&&data.members.length>0?data.members:null,
targetIds:data.targetIds},
data.message);
}
},

openRecoPlaylistDialog:function(data){
if(data.targetIds.length>0||data.members&&data.members.length>0){
this.openFeedDialog(
data.targetIds.length>0?'recoPlaylistFacebookFriend':'recoPlaylist',
data.targetIds.length>0?null:'doFeedReco',
{playlist:data.playlist,
recipients:data.members&&data.members.length>0?data.members:null,
targetIds:data.targetIds},
data.message);
}
},

openGiftSongDialog:function(data){

if(!data.recipient.nickName)return;
this.openFeedDialog('giftSong','doFeedGiftSong',
{song:data.song,
recipient:data.recipient},
data.comment);
},

openReviewAlbumDialog:function(data){
this.openFeedDialog('reviewAlbum','doFeedReviewAlbum',
{album:data.album,
rating:data.rating},
data.comment);
},

openListeningSongDialog:function(data,userPref,message){
this.openFeedDialog('listening',userPref,{song:data.song},message);
},

openListeningAlbumDialog:function(data,userPref,message){
this.openFeedDialog('listening',userPref,{album:data.album},message);
},

openListeningArtistDialog:function(data,userPref,message){
this.openFeedDialog('listening_artist',userPref,{artist:data.artist},message);
},

openListeningPlaylistDialog:function(data,userPref,message){
this.openFeedDialog('listening_playlist',userPref,{playlist:data.playlist},message);
},

getDiscImgSrc:function(discId,size){
var src=frontend.img.Album(discId,size);
if(lala.host.indexOf('myjunk.dev')!=-1){
src=src.replace('album-images.dev-sandbox.pplala.com','album-images.b.pplala.com');
}else if(lala.host.indexOf('betaexternal')!=-1){
src=src.replace('album-images-sandbox.int.lala.com','album-images.lala.com');
}
return src;
},

getArtistImgSrc:function(imgBasePath,size){
var src=frontend.img.Artist(imgBasePath,size);
if(lala.host.indexOf('myjunk.dev')!=-1){
src=src.replace('dev-sandbox.int.lala.com','album-images.lala.com');
}else if(lala.host.indexOf('betaexternal')!=-1){
src=src.replace('album-images-sandbox.int.lala.com','album-images.lala.com');
}
return src;
},

getCommonData:function(params){
return{title:params.title,
titleHref:this.getLandingHref(params.titlePath,params.id+'.titleHref'),
artist:params.artist,
actionLinkUrl:this.getLandingHref(params.titlePath,params.id+'.actionLinkUrl'),
media:[this.getMediaData(params)]};

},

getMediaData:function(params){
var largeImgSrc;
if(params.discId){
largeImgSrc=this.getDiscImgSrc(params.discId,'albumLarge');
}else{
largeImgSrc=this.getArtistImgSrc(params.imgBasePath,'medium');
}
return{"type":"flash",
"swfsrc":params.swfSrc,
"imgsrc":largeImgSrc,
"width":params.discId?90:96,
"height":params.discId?90:72,
"expanded_width":300,
"expanded_height":params.expandedHeight};
},

getSongData:function(song,id){
var swfSrc=this.config.externalFrontendExternalBase
+'/flash/SingleSongWidget.swf?host='+lala.host
+"&autoPlay=true&partnerId="+LalaFBConnect.PARTNER_ID
+"&songLalaId="+song.linkSongLalaId
+"&fbAppId="+this.config.appId
+"&fbCanvasUrl="+this.config.canvasUrl;
return this.getCommonData(
{id:id,
title:song.title,
expandedHeight:70,
titlePath:frontend.path.Song(song.linkSongLalaId),
artist:song.artist,
discId:song.linkDiscLalaId,
swfSrc:swfSrc});
},

getAlbumData:function(album,id){
var swfSrc=this.config.externalFrontendExternalBase
+'/flash/PlaylistWidget.swf?host='+lala.host
+"&autoPlay=true&partnerId="+LalaFBConnect.PARTNER_ID
+"&albumId="+album.id;
return this.getCommonData(
{id:id,
title:album.title,
titlePath:frontend.path.Album(album.id),
artist:album.artist,
expandedHeight:245,
discId:album.id,
swfSrc:swfSrc});
},

getArtistData:function(artist,id){
var swfSrc=this.config.externalFrontendExternalBase
+'/flash/PlaylistWidget.swf?host='+lala.host
+"&autoPlay=true&partnerId="+LalaFBConnect.PARTNER_ID
+"&artistId="+artist.lalaId;
return this.getCommonData(
{id:id,
imgBasePath:artist.imgBasePath,
titlePath:frontend.path.Artist(artist.artist),
artist:artist.artist,
expandedHeight:245,
swfSrc:swfSrc});
},

getPlaylistData:function(playlist,id){
var swfSrc=this.config.externalFrontendExternalBase
+'/flash/PlaylistWidget.swf?host='+lala.host
+"&autoPlay=true&partnerId="+LalaFBConnect.PARTNER_ID
+"&playlistId="+playlist.lalaId;
return this.getCommonData(
{id:id,
discId:playlist.clientFbDiscId,
title:playlist.title,
artist:playlist.nickName,
titlePath:frontend.path.Playlist(playlist.id),
expandedHeight:245,
swfSrc:swfSrc});
},

getLandingHref:function(path,clickContext){

path=path.replace(/^\//,'');
return lala.actionBaseURL+'/landing?fc='+LalaFBConnect.PARTNER_ID+'&redirectPath='+path+'&click='+clickContext;
},


addXFBMLElement:function(elementName,renderTargetId){
FB.ensureInit(function(){
FB.XFBML.Host.addElement(new FB.XFBML[elementName]($(renderTargetId)));
});
},

addXFBMLElements:function(elems){
FB.ensureInit(function(){
var arr=[];
elems.leach(function(e){
arr.push(new FB.XFBML[e.elementName]($(e.renderTargetId)));
});
FB.XFBML.Host.addElements(arr);
});
},



hasSession:function(callback,skipTrack){
LalaFBConnect.getLoggedInUser(callback,null,skipTrack);
},

openInviteDialog:function(){
if(!this._init)return;
if(!LalaFBConnect.isConnected())return;
var dialog=new FB.UI.FBMLPopupDialog('Invite your friends to join Lala');
var href=document.location.href;
var index=href.indexOf("::");
if(index!=-1)href=href.slice(0,index);
var width=760;
var height=650;
var fbml=$T(lt.LalaFBConnect.invite)
.replaceToken('width',width)
.replaceToken('height',height)
.replaceToken('action',href+"::closeFBInviteDialog=true")
.replaceToken('inviteUrl',lala.user.inviteLink+"&isFacebookConnect=true")
.compose();
dialog.setFBMLContent(fbml);
dialog.setContentWidth(width);
dialog.setContentHeight(height);
dialog.show();
LalaFBConnect.inviteDialog=dialog;
LalaFBConnect.track('inviteOpenDialog','interaction');
},


unlink:function(onResponse){
api.FacebookConnect.unlinkAccount(lala.user.facebookId,function(res){
if(!res.data)alert('We were unable to unlink this account. Please contact support.');
if(mojo.isBoolean(res.data)&&res.data){
FB.Facebook.apiClient.revokeAuthorization(lala.user.facebookId,function(){
lala.user.facebookId=null;
LalaFBConnect.clearFacebookImgs();
lala.user.isUseFacebookAvatar=false;
LalaFBConnect.status=0;
LalaFBConnect.track('unlink','interaction');
mojo.listeners.notify(LalaFBConnect.LISTENER_NOW_LOGGED_OUT,{skipLostAuth:true});
if(onResponse)onResponse();
});
}
});

},

getFriends:function(callback){
FB.ensureInit(function(){
FB.Facebook.apiClient.friends_get(null,function(result,ex){
callback(result);
});
});
},

getFriendsForShare:function(callback){
FB.ensureInit(function(){
FB.Facebook.apiClient.fql_query(
'SELECT name, uid, pic_square_with_logo FROM user '
+'WHERE uid IN '
+'(SELECT uid2 FROM friend WHERE uid1 = '
+LalaFBConnect.loggedInUserId+')',
function(result,ex){
callback(result);
});
});
},

getFacebookId:function(){
return lala.user.facebookId||LalaFBConnect.loggedInUserId;
},


isLoggedLinkedDiff:function(){
return lala.user
&&(


(LalaFBConnect.loggedInUserId&&!lala.user.facebookId)
||
(LalaFBConnect.loggedInUserId
&&lala.user.facebookId!=LalaFBConnect.loggedInUserId)
);
},

openFacebookLinkedDialog:function(){
if(widgets.Share.facebookConnectClicked)return;
var d=new MojoDialog({
id:'fbConnectLinkedDialog',
hideClose:true
});
var content=$T(lt.CoreFrontend.fbConnectLinked)
.replaceToken('nickName',lala.user.nickName)
.replaceToken('facebookImgUrl',lala.user.facebookImgUrl);
d.open(content.compose());
LalaFBConnect.track('linkedDialog','impression');
},

openFacebookLinked2Dialog:function(){
var openDialog=function(numFriends){
var d=new MojoDialog({
id:'fbConnectLinkedDialog'
});
var content=$T(lt.CoreFrontend.fbConnectLinked2)
.replaceToken('num',numFriends<=0?'No':numFriends)
.replaceToken('yet',numFriends<=0?'yet':'')
.replaceToken('s',numFriends==1?'':'s')
.replaceToken('theyAre',numFriends==1?'it is':'they are')
.keepTokenBlock('LalaAvatar',!lala.user.isUseFacebookAvatar)
.keepTokenBlock('FBAvatar',lala.user.isUseFacebookAvatar);
if(numFriends<=0){
content.replaceTokenBlock('FoundBlock',$TC(lt.CoreFrontend.fbConnectLinkedNoFriends));
}
d.open(content.compose());
};
LalaFBConnect.getFriends(function(uids){
if(!mojo.isDefined(uids.length)){
openDialog(0);
return;
}
api.FacebookConnect.getFacebookFriends(uids,function(res){
openDialog(res.data.length);
});
});
},

openFacebookLinkedImgDialog:function(){
var d=new MojoDialog({
id:'fbConnectLinkedImgDialog',
hideClose:true
});
var content=$T(lt.CoreFrontend.fbConnectLinkedImg)
.replaceTokensWithBean('user',lala.user)
.replaceToken('fbImg',lala.user.facebookImgUrlBig);
d.open(content.compose());

},

openFacebookSignoutDialog:function(){
var d=new MojoDialog({
id:'fbConnectLinkedDialogOld',
backgroundColor:'#3B5998',
mode:'default'
});
d.open($T(lt.CoreFrontend.fbConnectSignOutDialog)
.replaceToken('uid',lala.user.facebookId)
.compose());
$('fbSignoutBoth').onclick=function(){
LalaFBConnect.track('signoutBoth','interaction');
lala.Track.flushCounters();
LalaFBConnect.logout();
return false;
};
$('fbSignoutLala').onclick=function(){
LalaFBConnect.track('signoutLala','interaction');
lala.Track.flushCounters();
return true;
};
LalaFBConnect.addXFBMLElement('ProfilePic','fbLinkedProfilePic');
},

openFacebookLinkedDiffDialog:function(){

if(lala.user&&!lala.user.facebookId)return;
var d=new MojoDialog({
id:'fbConnectLinkedDialogOld',
backgroundColor:'#3B5998',
mode:'default'
});
d.open($T(lt.CoreFrontend.fbConnectLinkedDiffDialog)
.replaceToken('uid',LalaFBConnect.loggedInUserId)
.replaceToken('nickName',lala.user.nickName)
.keepTokenBlock('LalaLinkedBlock',lala.user.facebookId)
.keepTokenBlock('LalaNotLinkedBlock',!lala.user.facebookId)
.compose());
LalaFBConnect.addXFBMLElement('ProfilePic','fbLinkedProfilePicDiff');
$('fbSignoutBoth').onclick=function(){
LalaFBConnect.logout();
return false;
};
},

openFacebookSigningInDialog:function(name,imgUrl){
var d=new MojoDialog({
id:'fbConnectLinkedDialogOld',
backgroundColor:'#3B5998',
mode:'default',
hideClose:true
});
d.open($T(lt.CoreFrontend.fbConnectSigningInDialog)
.replaceToken('name',name?' as '+name:'')
.replaceToken('imgUrl',imgUrl)
.compose());
},

openFacebookLostAuthDialog:function(info){
LalaFBConnect.forceSessionRefresh();

if(lala.user&&!lala.user.facebookId)return;
if(info&&info.skipLostAuth)return;
if(lala.user.hasFacebookInfiniteSession)return;
var d=new MojoDialog({
id:'fbConnectLinkedDialog'

});
d.open($TC(lt.CoreFrontend.fbConnectLostAuthDialog));
},

requestOfflineAccessFromLinkedDialog:function(){
LalaFBConnect.openPermissionDialog('offline_access',
LalaFBConnect.openFacebookLinkedImgDialog,"linkedDialog");
},

openPermissionDialog:function(perm,onResponse,trackingId){
var trackingKey='permission.'+perm+'.'+trackingId+'.';
FB.ensureInit(function(){
FB.Connect.showPermissionDialog(perm,function(res){
var success=res==perm;
if(success){
mojo.listeners.notify(LalaFBConnect.LISTENER_PERMISSION_CHANGED);
api.FacebookConnect.setInfiniteSessionKey(function(res){
lala.user.hasFacebookInfiniteSession=true;
if(onResponse)onResponse(success);

});
}else{
if(onResponse)onResponse(success);
}
LalaFBConnect.track(trackingKey+success,'interaction');
});
});

},

hasAppPermission:function(perm,onResponse){
FB.ensureInit(function(){
FB.Facebook.apiClient.users_hasAppPermission(perm,function(a){
if(onResponse)onResponse(a);
})
});
},

clearFacebookImgs:function(){
lala.user.facebookImgUrl=null;
lala.user.facebookImgUrlBig=null;
},

setFacebookImgs:function(square,big){
lala.user.facebookImgUrl=square;
lala.user.facebookImgUrlBig=big;
},

selectPictureFromLinkedDialog:function(which){
LalaFBConnect.selectWhichPicture(which,function(){
if(frontend.getPageId()=='Friends'){
MojoDialog.close();
}else{
LalaFBConnect.openFacebookLinked2Dialog();
}
},'linkedDialog');
},

selectWhichPicture:function(which,onResponse,trackingId){
var useFacebookAvatar=which=='facebook';
api.User.setUseFacebookAvatar(
useFacebookAvatar,
function(res){
mojo.listeners.notify(api.User.EVT_PERSONAL_INFO);
if(onResponse)onResponse();
LalaFBConnect.track('choosePicture.'+which+'.'+trackingId,'interaction');
});
},

revokePermission:function(perm,onResponse){
api.FacebookConnect.revokePermission(perm,function(res){
if(!res.data){
alert('An error occurred when attempting to revoke this '
+'permission. '
+'Please try again later.')
}
var success=mojo.isBoolean(res.data)&&res.data;
if(success){
lala.user.hasFacebookInfiniteSession=false;

LalaFBConnect.hasAppPermission(perm,function(){
mojo.listeners.notify(
LalaFBConnect.LISTENER_PERMISSION_CHANGED);
});
LalaFBConnect.track('revoke.'+perm,'interaction');
}
});
},

getImgUrl:function(isBig){
return lala.user.isUseFacebookAvatar
?lala.user['facebookImgUrl'+(isBig?'Big':'')]:'';
},

parseDomTree:function(){
FB.ensureInit(function(){
FB.XFBML.Host.parseDomTree();
});
},

renderLoggedLinkedNotSame:function(renderTargetId){
$T(lt.LalaFBConnect.fbConnectedLinkedDiff,renderTargetId)
.replaceToken('uid',lala.user.facebookId)
.replaceToken('fbName',lala.user.facebookName)
.replaceToken('facebookImgUrl',lala.user.facebookImgUrl)
.replaceToken('loggedInUid',LalaFBConnect.loggedInUserId)
.keepTokenBlock('LalaLinked',lala.user.facebookId)
.keepTokenBlock('LalaNotLinked',!lala.user.facebookId)
.replaceToken('id',renderTargetId)
.compose();
LalaFBConnect.addXFBMLElement('Name','fbNameDiff_'+renderTargetId);
LalaFBConnect.addXFBMLElement('ProfilePic','fbProfilePicDiff_'+renderTargetId);
}

};



widgets.Blurbs=Class.create();
widgets.Blurbs.all={};

widgets.Blurbs.prototype={
initialize:function(params){
if(!params)params={};
this.wiid=params.id||'blurbsWidget_'+mojo.idGenerator++;
this.userToken=params.userToken;
this.renderTargetId=params.renderTargetId;
this.title=params.title||'Blurbs';
this.paging=params.paging;
this.count=params.count||5;
this.showMore=params.showMore;
this.showCreate=params.showCreate;
this.DEFAULT_COMMENT='Write your blurb here...';
this.blurbs=[];
this.messagesByToken={};
this.newBlurbs={};

this.commentWidgets=[];
widgets.Blurbs.all[this.wiid]=this;
},

loadAndRender:function(){
var self=this;
var params={
src:this.userToken,
dst:null,
type:'Blurb',
count:this.count
}
if(lala.user&&this.userToken==lala.user.userToken){

params.onResponse=function(res){
self.blurbs=res.data.threads;
self.blurbs.leach(function(blurb){
self.messagesByToken[blurb.msgToken]=blurb;
});
res.data.newBlurbs.leach(function(i){
self.newBlurbs[i]=true;
});
self.res=res;
self.render();
DataModel.g.setPendingCount('Blurb',0);
}
api.Messaging.getBlurbs(params);
}else{
params.onResponse=function(res){
self.blurbs=res.data.threads;
self.blurbs.leach(function(blurb){
self.messagesByToken[blurb.msgToken]=blurb;
});
self.res=res;
self.render();
}
api.Messaging.getThreads(params);
}
},

render:function(){
$T(lt.BlurbsWidget.container,this.renderTargetId)
.replaceToken('wiid',this.wiid)
.replaceToken('title',this.title)
.replaceToken('defaultComment',this.DEFAULT_COMMENT)
.compose();

if(this.blurbs.length<=0){
$T(lt.BlurbsWidget.empty,this.wiid+'_mainContent')
.replaceToken('msg',(lala.user&&this.userToken==lala.user.userToken)
?'You have no blurbs':'This person has no blurbs')
.compose();
}else{
var t=$T(lt.Core.post,this.wiid+'_mainContent');
var self=this;
this.blurbs.leach(function(item,i){
var w=new CommentWideWidget({
renderTargetId:'blurbCommentsPod_'+i,
onBeforeDisplay:function(){
self.onShowComments(i);
},
onSubmit:function(comment){
self.onSubmitComment(i,comment);
},
onEditThread:function(){
self.onEditComment(item.msgToken,true)
},
onEditComment:function(msgToken){
self.onEditComment(msgToken)
},
onDeleteThread:function(){
self.onDeleteThread(item.msgToken)
},
onDeleteComment:function(msgToken){
self.onDeleteComment(i,msgToken)
}
});
var blurbTitle=$T(lt.BlurbsWidget.postTitle)
.replaceTokensWithBean('item',item);
var isUpdated=item.lastMsg!=null;
var blurbContent=$T(lt.BlurbsWidget.postContent)
.replaceToken('noteSection',w.renderMessage(item,!isUpdated));
t.replaceTokensWithBean('user',item.src)
.replaceToken('clickTrackingId','blurbsPage')
.replaceToken('date',
(isUpdated?'Updated: ':'')
+item.lastModTime.lgetDaysAgoLabel('Today',
false,
false,
widgets.core.blurbFormat))
.replaceToken('editDelete',w.renderEditDeleteThread(item))
.replaceToken('postTitle',blurbTitle.compose())
.replaceToken('msgToken',item.msgToken)
.replaceToken('wiid',self.wiid)
.replaceToken('postContent',blurbContent.compose())
.replaceToken('commentsPod',w.getHtml(item.count))
.replaceToken('commentsPodId','blurbCommentsPod_'+i)
.replaceToken('isNewPost',self.newBlurbs[item.id]?'inline':'none')
.next();
self.commentWidgets[i]=w;
});
t.compose();

if(this.paging){
new widgets.core.Paginator(this.wiid+'_blurbsPaginator_bottom','big',
this.wiid+'_blurbsPaginator_top','lite')
.renderTwo(this.res,this.res.data);
}

if(this.showMore){
$T(lt.BlurbsWidget.more,this.wiid+'_moreLink')
.replaceToken('userToken',this.userToken)
.compose();
}
}

if(this.showCreate){
$T(lt.BlurbsWidget.post,this.wiid+'_postButton')
.replaceToken('wiid',this.wiid)
.compose();
mojo.input.clearOnClick(this.wiid+"_textArea");
}

},

onSubmitComment:function(index,comment){
var blurb=this.blurbs[index];
var self=this;
api.Messaging.addReply({
src:lala.user.userToken,
threadToken:blurb.msgToken,
text:comment,
generateLinks:true,
onResponse:function(res){
self.onShowComments(index)
}});
},

onShowComments:function(index){
var self=this;
api.Messaging.getReplies({
threadToken:this.blurbs[index].msgToken,
onResponse:function(res){
var w=self.commentWidgets[index];
res.data.list.leach(function(comment){
self.messagesByToken[comment.msgToken]=comment;
});
w.render(res.data.total,res.data.list);
w.displayComments();
}});
},

onPostClick:function(){
if(frontend.requiresSignin())return;
$D(this.wiid+'_postButton',false);
$D(this.wiid+"_post");
$(this.wiid+"_textArea").focus();
},

onCloseAdd:function(){
$D(this.wiid+"_post",false);
if(this.showCreate)$D(this.wiid+'_postButton');
},

onSubmitAdd:function(){
var comment=$F(this.wiid+'_textArea');
if(comment==this.DEFAULT_COMMENT||comment.ltrim()=='')return;
var self=this;
api.Messaging.createThread({
src:lala.user.userToken,
dst:this.userToken,
generateLinks:true,
type:'Blurb',
text:comment,
onResponse:function(res){
self.blurbs.splice(0,0,res.data);
self.messagesByToken[res.data.msgToken]=res.data;
self.render();
}});

},

onDeleteThread:function(threadToken){
if(confirm("Delete this post?")){
var self=this;
api.Messaging.deleteThread({threadToken:threadToken,onResponse:function(res){
delete self.messagesByToken[threadToken];
self.blurbs.lremoveIf('msgToken',threadToken);
mojo.dom.removeElement('post_item_'+threadToken+'_'+self.wiid);
}});
}
},

onEditComment:function(msgToken,isPost){
var content=$T(lt.BlurbsWidget.editComment)
.replaceToken('commentText',this.messagesByToken[msgToken].origText)
.replaceToken('msgToken',msgToken)
.replaceToken('isThread',!!isPost)
.replaceToken('wiid',this.wiid)
.compose();

new MojoDialog({
title:!!isPost?"Edit post":"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,isThread){
var self=this;
var newText=$F('editCommentTextArea');
if(newText==this.messagesByToken[msgToken].origText){
MojoDialog.close();
return;
}
if(isThread){
api.Messaging.updateThread({
threadToken:msgToken,
text:newText,
generateLinks:true,
onResponse:function(res){
var blurb=self.blurbs.lfindIf('msgToken',msgToken);
blurb.innerText=res.data.innerText;
blurb.origText=res.data.origText;
blurb.text=res.data.text;
self.messagesByToken[msgToken]=res.data;
$S('commentText_'+msgToken,res.data.text);
MojoDialog.close();
}
});
}else{
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();
}
});
}
}
};






api.Playlists={
EVT_SONG_ADDED:"playlistSongAdded",
EVT_SONG_DELETED:"playlistSongDeleted",
EVT_PLAYLIST_DELETED:"playlistDeleted",
EVT_PLAYLIST_INFO_CHANGED:"playlistInfoUpdated",
EVT_SONGS_LOADED:"playlistSongsLoaded",

get:function(token,onResponse){
lala.sendRequest(
{url:'Playlists/get',
params:{playlistToken:token},
onResponse:onResponse});
},

getPlaylistDetails:function(playlistToken,onResponse,addlParams,count,skip){
var params={
playlistToken:playlistToken,
count:count||50,
skip:skip||0,
sortKey:'Offset',
sortDir:'Asc'
};
Object.extend(params,addlParams);

lala.sendRequest({
url:'Playlists/getPlaylistDetails',
params:params,
onResponse:onResponse});
},

getSongs:function(playlist,onResponse,addlParams,count,skip){
this._getSongs(playlist,onResponse,addlParams,count,skip,'Playlists/getSongs');
},

getPlaylistForLanding:function(playlist,onResponse,addlParams,count,skip){
this._getSongs(playlist,onResponse,addlParams,count,skip,'Playlists/getPlaylistForLanding');
},

getProfileData:function(playlist,onResponse,addlParams,count,skip){
this._getSongs(playlist,onResponse,addlParams,count,skip,'Playlists/getProfileData');
},

getProfileSongs:function(playlist,onResponse,addlParams,count,skip){
return this._getSongs(
playlist,onResponse,addlParams,
count,skip,'Playlists/getProfileSongs');
},

getProfileAlbums:function(playlist,onResponse,addlParams,count,skip){
return this._getSongs(
playlist,onResponse,addlParams,
count,skip,'Playlists/getProfileAlbums');
},

getOwnSongs:function(playlist,onResponse,addlParams,count,skip){
this._getSongs(playlist,onResponse,addlParams,count,skip,'Playlists/getOwnSongs');
},

_getSongs:function(playlist,onResponse,addlParams,
count,skip,url){
var params=
{playlistToken:playlist.sid||playlist.id,
keywords:null,
filterByArtist:null,
filterByGenre:null,
filterByAlbum:null,
includeHistos:null,
count:count||50,skip:skip||0};
Object.extend(params,addlParams);
if(!params.sortKey){
params.sortKey='Offset';
}
if(!params.sortDir){
params.sortDir='Asc';
}

var onPostProcessResponse=function(res){
onResponse(res);
mojo.listeners.notify(
api.Playlists.EVT_SONGS_LOADED,
{playlist:playlist});
};
lala.sendRequest({url:url,
params:params,
onResponse:onPostProcessResponse});
},

getSongsHisto:function(playlist,onResponse,addlParams){
var params=
{playlistToken:playlist.sid||playlist.id,
keywords:null,
sortKey:'Alpha',
sortDir:'Asc',
filterByArtist:null,
filterByGenre:null,
filterByAlbum:null};
Object.extend(params,addlParams);

lala.sendRequest({url:'Playlists/getSongsHisto',
params:params,
onResponse:onResponse});
},

getArtistHisto:function(playlist,onResponse){
lala.sendRequest({
url:'Playlists/getArtistHisto',
params:{
playlistToken:playlist.sid||playlist.id,
sortKey:'Alpha',
sortDir:'Asc',
filterByArtist:null,
filterByAlbum:null,
filterByGenre:null,
keywords:null},
onResponse:onResponse});
},


deleteSongs:function(playlist,songIndexes,songs,onResponse,queryParams){
var playlistToken=playlist.sid||playlist.id;
if(songIndexes.length==1){
var song=songs[songIndexes[0]];
if(!song)return;
var params={
playlistToken:playlistToken,
ids:[song.id],
songLalaIds:[song.songLalaId]
};
Object.extend(params,queryParams);
lala.sendRequest({
url:'Playlists/deleteSongs',
params:params,
onResponse:onResponse,
method:'POST'
})
}else{
var indexRanges=api.Playlists._makeRanges(songIndexes,'_');
var indexRangesWithIds=api.Playlists._addSongIdsToRanges(indexRanges,songs,'_');
var params={
playlistToken:playlistToken,
ranges:indexRangesWithIds};
Object.extend(params,queryParams);
lala.sendRequest({url:'Playlists/deleteSongsByRanges',
params:params,
onResponse:onResponse,
method:'POST'});
}
},

deleteAllSongs:function(playlist,queryParams,onResponse){
var params={playlistToken:playlist.sid||playlist.id};
Object.extend(params,queryParams);
lala.sendRequest({
url:'Playlists/deleteAllSongs',
params:params,
method:'POST',
onResponse:onResponse
});
},


deleteSongsById:function(playlistToken,songs,onResponse,forUserToken){
var params={
playlistToken:playlistToken,
songLalaIds:songs.lpluck('songLalaId',0).join(','),
ids:songs.lpluck('id',0).join(','),
forUserToken:forUserToken};
lala.sendRequest({url:'Playlists/deleteSongs',
params:params,
onResponse:onResponse,
method:'POST'});
onResponse();
},

playPlaylist:function(playlistToken,queryParams,sourceTitle,onResponse){
var params={
playlistToken:playlistToken,
sourceParams:mojo.url.getHash()+"||"+sourceTitle
};
Object.extend(params,queryParams);

lala.sendRequest({
url:'Playlists/playPlaylist',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
if(onResponse){
onResponse(res);
}
}});
},

queuePlaylist:function(playlistToken,queryParams,sourceTitle,onResponse){
var params={
playlistToken:playlistToken,
sourceParams:mojo.url.getHash()+"||"+sourceTitle
};
Object.extend(params,queryParams);

lala.sendRequest({
url:'Playlists/queuePlaylist',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
mojo.listeners.notify(api.Queue.EVT_QUEUE_UPDATED,res);
if(onResponse){
onResponse(res);
}
}});
},

playSongsByRanges:function(playlistToken,indexes,queryParams,onResponse){
var ranges=this._makeRanges(indexes);
var params={
playlistToken:playlistToken,
ranges:ranges,
sourceParams:mojo.url.getHash()
};
Object.extend(params,queryParams);

lala.sendRequest({
url:'Playlists/playSongsByRanges',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
if(onResponse){
onResponse(res);
}
}});
},

queueSongsByRanges:function(playlistToken,indexes,queryParams,onResponse){
var ranges=this._makeRanges(indexes);
var params={
playlistToken:playlistToken,
ranges:ranges,
sourceParams:mojo.url.getHash()
};
Object.extend(params,queryParams);

lala.sendRequest({
url:'Playlists/queueSongsByRanges',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
mojo.listeners.notify(api.Queue.EVT_QUEUE_UPDATED,res);
if(onResponse){
onResponse(res);
}
}});
},

addSongs:function(playlist,songs,onResponse,addlEvtData){
var playlistToken=playlist.sid||playlist.id;
var ids=songs.lpluck('id').join(',');
lala.sendRequest({
url:'Playlists/addSongs',
params:{playlistToken:playlistToken,
ids:ids},
onResponse:function(res){


var evt={
count:songs.length,
playlistToken:playlist.id,
ids:ids};
if(addlEvtData)Object.extend(evt,addlEvtData);

mojo.listeners.notify(api.Playlists.EVT_SONG_ADDED,evt);

if(onResponse)onResponse(res);
},
method:'POST'});
},

addSongsByRanges:function(src,dstToken,indexes,queryParams,onResponse){
var ranges=this._makeRanges(indexes);
var params={src:src.sid||src.id,dst:dstToken,ranges:ranges};
Object.extend(params,queryParams);

params.skip=0;
params.count=0;
lala.sendRequest({url:'Playlists/addSongsByRanges',params:params,
onResponse:function(res){
mojo.listeners.notify(api.Playlists.EVT_SONG_ADDED,
{count:indexes.length,playlistToken:dstToken});
if(onResponse)onResponse(res);
},method:'POST'});
},

copy:function(srcPl,dstPl,onResponse,queryParams){
var params={src:srcPl.sid||srcPl.id,dst:dstPl.sid||dstPl.id};
Object.extend(params,queryParams);
lala.sendRequest({url:'Playlists/copy',
params:params,
onResponse:function(res){
mojo.listeners.notify(
api.Playlists.EVT_SONG_ADDED,
{count:srcPl.songsTotal,
playlistToken:dstPl.id,
ids:[]});
if(onResponse)onResponse(res);
}});
},

moveSongsByRanges:function(pl,indexes,belowIndex,belowId,onResponse){
var playlistToken=pl.sid||pl.id;
lala.sendRequest({
url:'Playlists/moveSongsByRanges',
params:{playlistToken:playlistToken,
target:belowId+':'+belowIndex,
ranges:this._makeRanges(indexes)
},
onResponse:onResponse
});
},

createPlaylist:function(title,desc,onResponse){
lala.sendRequest({url:'Playlists/createPlaylist',
params:{title:title,description:desc},
onResponse:function(res){
DataModel.g.addPlaylist(res.data);
onResponse(res);
},
method:'POST'});
},

clonePlaylist:function(playlist,onResponse){
lala.sendRequest(
{url:'Playlists/clonePlaylist',
params:{playlistId:playlist.lalaId},
onResponse:function(res){
DataModel.g.addPlaylist(res.data.playlist,res.data.tracksCopiedCount);
onResponse(res);
if(onResponse)onResponse(res);
}});
},

updatePlaylistInfo:function(playlist,title,desc,onResponse){
lala.sendRequest({
url:'Playlists/updatePlaylistInfo',
params:{
playlistToken:playlist.id,
title:title,
description:desc},
method:'POST',
onResponse:function(res){
playlist.title=title;
playlist.description=desc;
playlist.lastModifiedDate=new Date();
DataModel.g.onPlaylistsUpdated();
mojo.listeners.notify(
api.Playlists.EVT_PLAYLIST_INFO_CHANGED,
{playlist:playlist});
onResponse(res);
}});
},

deletePlaylist:function(playlistToken,onResponse){
lala.sendRequest({
url:'Playlists/deletePlaylist',
params:{playlistToken:playlistToken},
onResponse:function(res){
DataModel.g.removePlaylist(playlistToken);
mojo.listeners.notify(
api.Playlists.EVT_PLAYLIST_DELETED,
{playlistToken:playlistToken});
if(onResponse)onResponse(res);
},
method:'POST'});
},

getInfo:function(playlistToken,onResponse){
lala.sendRequest({url:'Playlists/getInfo',
params:{playlistToken:playlistToken},
onResponse:onResponse});
},

setLastVisitedTimestamp:function(pl,onResponse){
lala.sendRequest({
url:'Playlists/setLastVisitedTimestamp',
params:{id:pl.sid||pl.id},
onResponse:onResponse});
},

setTrackInfo:function(pl,songIndexes,fields,queryParams,onResponse){



var playlistId=pl.sid||pl.id;
for(var field in fields){
if(fields[field]==''){
fields[field]='__set_to_empty_string__';
}
}
var indexRanges=api.Playlists._makeRanges(songIndexes.lsortNumeric());
var params={
playlistToken:playlistId,
title:fields.title,
artist:fields.artist,
discTitle:fields.discTitle,
genre:fields.genre,
trackNumber:fields.trackNumber,
ranges:indexRanges
}
Object.extend(params,queryParams);
lala.sendRequest({url:'Playlists/setTrackInfoByRanges',
params:params,
method:'POST',
onResponse:onResponse});
},


checkUserAccess:function(playlist){
return lala.user&&(lala.user.userToken==playlist.userToken);
},

getRecentTopArtists:function(onResponse,count){
lala.sendRequest({url:'Playlists/getRecentTopArtists',
onResponse:onResponse,
params:{count:count||10,skip:0}});
},

getRecentTopAlbums:function(onResponse,count){
lala.sendRequest({url:'Playlists/getRecentTopAlbums',
onResponse:onResponse,
params:{count:count||10,skip:0}});
},

getRecentTopSongs:function(onResponse,count){
lala.sendRequest({url:'Playlists/getRecentTopSongs',
onResponse:onResponse,
params:{count:count||10,skip:0}});
},

getRecentListenActivityData:function(onResponse,count){
lala.sendRequest({url:'Playlists/getRecentListenActivityData',
onResponse:onResponse,
params:{count:count||10,skip:0}});
},

getRecentExploredActivityData:function(onResponse,count){
lala.sendRequest({url:'Playlists/getRecentExploredActivityData',
onResponse:onResponse,
params:{count:count||10,skip:0}});
},

rateSong:function(song,rating,onResponse){
var params={
id:song.id,
rating:rating
};
lala.sendRequest({url:'Playlists/rateSong',
onResponse:onResponse,
params:params});
},


_makeRanges:function(indexes,sep){

var range_sep=sep||'-';
var INDEX_SEP=',';

var ranges='';

var currRangeStart=null;
var currRangeEnd=null;

indexes.leach(function(index,i,isLast){
if(currRangeStart==null){
currRangeStart=index;
currRangeEnd=index;
if(isLast)ranges+=index;
}else{

var isNextInRange=(currRangeEnd>=currRangeStart&&(currRangeEnd+1)==index);

isNextInRange=isNextInRange
||(currRangeEnd<=currRangeStart&&(currRangeEnd-1)==index);

if(isNextInRange){
currRangeEnd=index;
}


if(!isNextInRange||isLast){
var toAdd='';
if(currRangeStart==currRangeEnd){
toAdd=currRangeStart;
}else{
toAdd=currRangeStart+range_sep+currRangeEnd;
}

if(!isLast){
toAdd+=INDEX_SEP;
}else if(isLast&&!isNextInRange){
toAdd+=INDEX_SEP+index;
}
ranges+=toAdd;

currRangeStart=index;
currRangeEnd=index;
}
}
});

return ranges;
},

_addSongIdsToRanges:function(ranges,songs,sep){
var SONG_ID_SEP=':';
ranges=ranges.split(',');
var newRanges=[];
ranges.leach(function(range){
var parts=range.split('_');
var left=parts[0];
left=songs[parseInt(left)].id+SONG_ID_SEP+left;
var newRange=left;
if(parts[1]){
var right=parts[1];
right=songs[parseInt(right)].id+SONG_ID_SEP+right;
newRange+=sep+right;
}
newRanges.push(newRange);
});
return newRanges.join(',');
}
};



widgets.ArtistList=Class.create();
widgets.ArtistList.all={};

widgets.ArtistList.prototype={
initialize:function(params){
this.wiid='artistList_'+mojo.idGenerator++;

if(!params)params={};
this.renderTargetId=params.renderTargetId;
this.title=params.title;
this.layout=params.layout||'chartWithImages';
this.imageSize=params.imageSize;
if(!mojo.isDefined(this.imageSize)){
this.imageSize=this.layout=='list'?'medium':'small';
}
this.containerClass=params.containerClass||'lrightsection';
this.displayCount=params.displayCount;
this.emptyText=params.emptyText||'No artists';
this.numTextCols=params.numTextCols||2;
this.customHeading=params.customHeading;
this.evenMoreLink=params.evenMoreLink;
this.evenMoreLinkLabel=params.evenMoreLinkLabel||'artists';
this.whichListen=params.whichListen||'listens7';
this.clickTrackingId=params.clickTrackingId||'artistListWidget';
this.songs=[];
this.trackingId='artistList';
this.srcInfo=params.srcInfo;
this.artistKey=params.artistKey||'artist';
this.msgToken=params.msgToken;
this.showExpandLink=params.showExpandLink;
this.startNum=mojo.isDefined(params.startNum)?params.startNum:0;
this.hideNumber=params.hideNumber;

this.showRecoList=params.showRecoList;
this.hideDetails=params.hideDetails;

widgets.ArtistList.all[this.wiid]=this;
},

render:function(artistsOrPagedList){
var self=this;

var artists;
var total;
var skip;

if(mojo.isDefined(artistsOrPagedList.total)){
artists=artistsOrPagedList.list;
total=artistsOrPagedList.total;
skip=artistsOrPagedList.skip;
}else{
artists=artistsOrPagedList;
total=artistsOrPagedList.length;
skip=0;
}
if(artists.length==0){
this.emptyText.compose(this.renderTargetId);
return;
}

this.artists=artists;

var showEvenMoreLink=false;
if(this.evenMoreLink&&this.displayCount&&(total>this.displayCount)){
showEvenMoreLink=true;
}

var t=$T(lt.ArtistListWidget.listWithImages,this.renderTargetId);
t.replaceToken('title',this.title);
t.replaceToken('wiid',this.wiid);
t.replaceToken('clickTrackingId',this.clickTrackingId);

if(this.customHeading){
t.replaceTokenBlock('HeadingBlock',this.customHeading);
}else if(!this.title){
t.removeTokenBlock('HeadingBlock');
}

var artistsWithImages=artists.lfindIfNot('imgBasePath','');
if(artistsWithImages.length>=1){
var imgIter=t.getTokenBlock('PicsBlock').getTokenBlock('ImgBlock');
if(artistsWithImages.length>3)artistsWithImages.length=3;
artistsWithImages.leach(function(artist,index,isLast){
imgIter.replaceTokensWithBean('artist',artist);
imgIter.replaceToken('msgToken',self.msgToken);
imgIter.replaceToken('extensionPlain',self.getExtension(artist,true));
if(isLast){
imgIter.replaceToken('lastImgStyle','margin-right:0px');
}
if(self.imageSize=='medium'){
imgIter.replaceToken('imageClass','artistPic');
}else{
imgIter.replaceToken('imageClass','smallArtistPic');
}
t.replaceToken('imageSize',self.imageSize);
imgIter.next();
});
}else{
t.removeTokenBlock('PicsBlock');
}

switch(this.layout){
case'chartWithImages':
if(artistsWithImages.length>=1){
t.replaceToken('style','margin-left: 62px');
}
t.replaceToken('layout',this.layout);

var artIter=t.getTokenBlock('ListBlock')
.getTokenBlock('ListArtistBlock');
artists.leach(function(artist,index){
artIter.replaceTokensWithBean('artist',artist)
.replaceToken('msgToken',self.msgToken)
.replaceToken('extension',self.getExtension(artist))
.replaceToken('extensionPlain',self.getExtension(artist,true))
.replaceToken('num',index+1)
.replaceToken('offscreenRow',
index>(self.displayCount-1)
?'offscreenRow':'')
.replaceToken('style',index>(self.displayCount-1)?'display:none':'')
.next();
});
t.removeTokenBlock('WideBlock');
break;
case'list':
var listLayoutTemplate=$T(lt.ArtistListWidget.listLayout)
.replaceToken('wiid',this.wiid);
var rows=[];
artists.leach(function(artist,index,isLast){
rows.push(self.getListRowHtml(artist,index,skip+index+1,isLast));
});
listLayoutTemplate.replaceToken('list',rows.join(''));
t.replaceToken('artistWideContent',listLayoutTemplate.compose());
t.removeTokenBlock('ListBlock');
t.removeTokenBlock('PicsBlock');
break;
case'listWithImages':
t.replaceToken('containerClass',this.containerClass);
var textCols=new widgets.core.TextColumns({
numCols:this.numTextCols,
displayCount:this.displayCount,
clickTrackingId:this.clickTrackingId,
colItemTemplate:lt.ArtistListWidget.colItem});
artists.leach(function(a){
a._extension=self.getExtension(a);
a._extensionPlain=self.getExtension(a,true);
});

t.replaceToken('artistWideContent',
textCols.render(artists,true));
t.removeTokenBlock('ListBlock');

if(this.showExpandLink&&artists.length-this.displayCount>0){
var showMoreContent=$T(lt.ArtistListWidget.showMoreInline)
.replaceToken('wiid',this.wiid);
var showMoreBlock=showMoreContent.getTokenBlock('MoreArtistsBlock');

for(var i=this.displayCount;i<artists.length;i+=this.displayCount){
var textCols2=new widgets.core.TextColumns({
numCols:this.numTextCols,
displayCount:this.displayCount,
clickTrackingId:this.clickTrackingId,
colItemTemplate:lt.ArtistListWidget.colItem});

var moreArtists=artists.slice(i,i+this.displayCount);
showMoreBlock.replaceToken('moreArtists',textCols2.render(moreArtists,true));
showMoreBlock.next();
}
var moreContent=showMoreContent.compose();
t.replaceToken('showMoreInline',moreContent);
}
break;
}

if(showEvenMoreLink){


var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type',this.evenMoreLinkLabel)
.compose();
t.replaceToken('apageLink',linkHtml);
}
t.replaceToken('clickTrackingId',this.clickTrackingId);

t.compose();
},


getRowsHtml:function(artists,useLast){
this.artists=artists;
var self=this;
var html=[];
artists.leach(function(artist,index,isLast){
var row=self.getListRowHtml(
artist,
index,
index+self.startNum+1,
useLast&&isLast);
html.push($T(lt.ArtistListWidget.rowWrapper)
.replaceToken('row',row)
.compose());
});
return html.join('');
},

getListRowHtml:function(artist,index,num,isLast){
var ab=$T(lt.ArtistListWidget.ArtistRow)
.replaceToken('wiid',this.wiid)
.replaceToken('index',index)
.replaceToken('lastOne',isLast?'lastOne':'')
.replaceToken('num',num)
.replaceToken('msgToken',this.msgToken)
.removeTokenBlock('ListensDirBlock')
.replaceToken('s',artist.listens==1?'':'s')
.replaceToken('imageSize',this.imageSize)
.keepTokenBlock('NumBlock',!this.hideNumber)
.keepTokenBlock('RecoListBlock',this.showRecoList)
.keepTokenBlock('DetailsBlock',!this.hideDetails);

if(this.imageSize=='medium'){
ab.replaceToken('imgClass','artistPic');
}else{
ab.replaceToken('imageClass','smallArtistPic');
ab.replaceToken('extraClass','artistThumbSmall');
}

if(artist.licensedTrackCount<=0){
ab.removeTokenBlock('DetailsBlock');
if(artist.licensedAlbumCount>0){
mojo.log.error("no songs, but there are some albums for artist "+artist.artist+".  weird");
}
}else{
var listens=mojo.isDefined(this.whichListen)
?mojo.util.formatNumber(artist[this.whichListen])
:'';

ab.replaceToken('listens',listens)
.replaceToken('s',listens==1?'':'s');

if(artist[this.whichListen+'Rank']>5000){
ab.getTokenBlock('DetailsBlock').removeTokenBlock('RankBlock');
}else{
ab.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:artist.listensTrend,
size:'micro',
what:'artist'
}));
}

}
ab.replaceTokensWithBean('artist',artist);
ab.replaceToken('extension',this.getExtension(artist));
ab.replaceToken('extensionPlain',this.getExtension(artist,true));

return ab.compose();
},

getExtension:function(artist,isPlain){
return artist.extension
?' '
+(isPlain?'':'<span class="lextension">')
+'('+artist.extension+')'+(isPlain?'':'</span>')
:'';
},

onPlaySong:function(index){
var song=this.songs[index];
Player.g.playSong(song,this.trackingId);
},

onPlayButtonHover:function(index,size,button,evt){
var song=this.songs[index];
var offsets={};
if(mojo.FF3){
offsets.left=-1;
offsets.top=-3;
}else if(mojo.FF2){
offsets.top=-2;
}else if(mojo.IE7){
offsets.top=-2;
}
widgets.core.PlayButtonHover.open(size,song,button,evt,offsets,null,this.clickTrackingId);
},

onQueue:function(index,elem){
if(frontend.requiresSignin())return;
Player.g.queueSong(this.songs[index],
function(){
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);
},'artistList');
},

onToggleInlineExpand:function(){
var moreArtists=$('moreInline_'+this.wiid);
var moreLink=$('showMoreLink_'+this.wiid);
var moreLinkText=$('showMoreLink_'+this.wiid+'_text');

if(mojo.css.isDisplayed(moreArtists)){
mojo.animate.close(moreArtists,function(){
mojo.css.display(moreArtists,false);
$S(moreLinkText,'Show more');
$DC(moreLink,'contract');
$AC(moreLink,'expand');
},mojo.FF?25:75);
}else{
mojo.animate.open(moreArtists,function(){
$S(moreLinkText,'Show less');
$AC(moreLink,'contract');
$DC(moreLink,'expand');
},mojo.FF?25:75);
}
lala.Track.clientPageInteraction('relatedArtistsToggleMore');
},

getArtistById:function(artistId){
return this.artists.lfindIf('id',artistId,false,true);
}
};





api.FacebookConnect={
signinWithFacebook:function(onResponse){
lala.sendRequest({
params:{fbName:LalaFBConnect.loggedInUser.name,
fbPicSquare:LalaFBConnect.loggedInUser.pic_square_with_logo,
fbPicBig:LalaFBConnect.loggedInUser.pic_big_with_logo},
url:'FacebookConnect/signinWithFacebook',
onResponse:onResponse
});
},
linkAccount:function(source,onResponse){
lala.sendRequest({
params:{source:source,
fbName:LalaFBConnect.loggedInUser.name,
fbPicSquare:LalaFBConnect.loggedInUser.pic_square_with_logo,
fbPicBig:LalaFBConnect.loggedInUser.pic_big_with_logo
},
url:'FacebookConnect/linkAccount',
onResponse:function(res){
if(res.data.facebookId){
lala.user.facebookId=res.data.facebookId;
lala.user.facebookName=res.data.facebookName;
lala.user.facebookImgUrl=res.data.facebookImgUrl;
lala.user.facebookImgUrlBig=res.data.facebookImgUrlBig;
}
if(onResponse){
onResponse(mojo.isBoolean(res.data.linkSuccess)
&&res.data.linkSuccess);
}
}
});
},
unlinkAccount:function(facebookId,onResponse){
lala.sendRequest({
params:{facebookId:facebookId},
url:'FacebookConnect/unlinkAccount',
onResponse:onResponse,
method:'POST'
});
},
getFacebookFriends:function(uids,onResponse){
lala.sendRequest({
url:'FacebookConnect/getFacebookFriends',
params:{uids:uids},
onResponse:onResponse,
method:'POST'
});
},
setInfiniteSessionKey:function(onResponse){
lala.sendRequest({
url:'FacebookConnect/setInfiniteSessionKey',
onResponse:onResponse
});
},
revokePermission:function(perm,onResponse){
lala.sendRequest({
url:'FacebookConnect/revokePermission',
params:{perm:perm},
onResponse:onResponse
});
}

};






api.Trading={
EVT_LIST_CHANGE:"tradingListChange",

getList:function(params,onResponse){
params.count=params.count;
params.skip=params.skip;
var self=this;
var response=function(res){
self._normalizeDiscs(res);
onResponse(res);
}
lala.sendRequest({url:'Trading/getList',
params:params,
onResponse:response});
},

getTransactions:function(params,onResponse){
params.count=params.count;
params.skip=0;
var self=this;
var response=function(res){
self._normalizeDiscs(res);
onResponse(res);
}
lala.sendRequest({url:'Trading/getTransactions',
params:params,
onResponse:response});
},

_normalizeDiscs:function(res){
if(res.data.discs&&res.data.discs.list){
var discs=res.data.discs.list;
discs.leach(function(disc,index){
if(disc.nbdisc>1){
disc.title=disc.title+' (Disc '+disc.discno+'/'+disc.nbdisc+')';
}
});
}
},

deleteFromList:function(album,listId,onafter){
var albumId=album.id;

lala.sendRequest(
{url:'Trading/deleteFromList',
params:{'albumId':albumId,'listId':listId},
onResponse:function(res){

var listCount=0;
var filterCount=0;

if(listId=='havelist'){
lala.user.haveListCount--;
if(res.data
&&res.data.isShippable){
if(res.data.isTradeable){



lala.user.canShipCount--;
}


lala.user.requestedCount--;
}
listCount=lala.user.haveListCount;
filterCount=lala.user.canShipCount;
album.owned=false;
}else{
lala.user.wantListCount--;
if(res.data&&res.data.shipDate)lala.user.willReceiveCount--;
listCount=lala.user.wantListCount;
filterCount=lala.user.willReceiveCount;
album.wanted=false;
}

mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
if(onafter)onafter(album);
}});


},

addToList:function(albumId,listId,onResponse){
lala.sendRequest(
{url:'Trading/addToList',
params:{'albumId':albumId,'listId':listId},
onResponse:function(res){
if(res.data==null){
onResponse();
return;
}


if(listId=='havelist'){
lala.user.haveListCount++;
if(res.data.isShippable){
if(res.data.isTradeable){
lala.user.canShipCount++;
}
lala.user.requestedCount++;
}
}else if(listId=='wantlist'){
lala.user.wantListCount++;
}


onResponse(res);


mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
}});
},

setNextHaveListCoverArtStatus:function(id,timestamp,
currStatus,
onresponse){
this.setHaveListCoverArtStatus(id,timestamp,currStatus,
onresponse,'setNextHaveListCoverArtStatus');
},

setHaveListCoverArtStatus:function(id,timestamp,
status,onResponse,
cmdOverride)
{
var cmd=!cmdOverride?'setCoverArtStatus':cmdOverride;
lala.sendRequest({url:'Trading/'+cmd,
params:{'coverArtStatus':status,
'id':id,
'ts':timestamp},
onResponse:onResponse});

},

toggleWantListCoverArtStatus:function(id,timestamp,onResponse){
lala.sendRequest({url:'Trading/toggleWantListCoverArtStatus',
params:{'id':id,
'ts':timestamp},
onResponse:onResponse});
},


setTradeableCD:function(id,timestamp,disc,isTradeable,ondone){
lala.sendRequest({url:'Trading/setIsTradeable',
params:{'id':id,
'ts':timestamp,
'isTradeable':isTradeable},
onResponse:function(res){

if(!isTradeable){

if(disc&&disc.isShippable){
disc.isShippable=false;
lala.user.canShipCount--;
}
}else{


if(res.data.shippable){
disc.isShippable=true;
lala.user.canShipCount++;
}
}

ondone(res.data);
mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
}});
},

receivedCD:function(transId,condition,onResponse){
lala.sendRequest({url:'Trading/received',
params:{'transId':transId,'condition':condition},
onResponse:onResponse});
},

shipCD:function(id,timestamp,withCoverArt,friendToken,onship){
lala.sendRequest({url:'Trading/ship',
params:{'id':id,
'ts':timestamp,
'coverArt':withCoverArt,
friendToken:friendToken},
onResponse:function(res){
var transToken=null;
transToken=res.data.transToken;


if(transToken){
lala.user.haveListCount--;
lala.user.requestedCount--;
lala.user.canShipCount--;
mojo.listeners.notify(api.Trading.EVT_LIST_CHANGE);
}
onship(transToken);
}});
},

orderShippingSupplies:function(envCount,casesCount,onResponse){
lala.sendRequest({url:'Trading/orderShippingSupplies',
params:{'envCount':envCount,'casesCount':casesCount},
onResponse:onResponse});
},

getTradePageData:function(onResponse){
lala.sendRequest({url:'Trading/getTradePageData',
onResponse:onResponse});
},

getShipItPageData:function(discId,onResponse){
lala.sendRequest({url:'Trading/getShipItPageData',
params:{discId:discId},
onResponse:onResponse});
},

getShipLabelPageData:function(transId,onResponse){
lala.sendRequest({url:'Trading/getShipLabelPageData',
params:{transId:transId},
onResponse:onResponse});
},

getReceivedStatusPageData:function(transId,onResponse){
lala.sendRequest({url:'Trading/getReceivedStatusPageData',
params:{transId:transId},
onResponse:onResponse});
},

getAddress:function(transId,onResponse){
lala.sendRequest({url:'Trading/getAddress',
params:{transId:transId},
onResponse:onResponse});
},

setSerialNo:function(transId,serialNo,onResponse){
lala.sendRequest({url:'Trading/setSerialNo',
params:{transId:transId,
serialNo:serialNo},
onResponse:onResponse});
}
};




widgets.LabelList=Class.create();
widgets.LabelList.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.title=params.title;
this.subtitle=params.subtitle;
this.labelCount=params.labelCount;
this.artistCount=params.artistCount;
this.clickTrackingId=params.clickTrackingId||'labelListWidget';
this.hideTitles=params.hideTitles;
},

render:function(labels,artists){
if(!(labels.length>0||(artists&&artists.length>0)))return;


labels=labels.lpluck('name');

var t=$T(lt.LabelListWidget.main,this.renderTargetId)
.replaceToken('title',this.title)
.replaceToken('subtitle',this.subtitle);
if(!this.subtitle)t.replaceToken('subtitleClass','lnone');
var count=this.labelCount||labels.length;
if(count>0){
labels.length=count;
var l=t.getTokenBlock('LabelBlock');
l.replaceToken('labelContent',
new widgets.core.TextColumns(
{numCols:2,
clickTrackingId:this.clickTrackingId,
colItemTemplate:lt.LabelListWidget.labelItem})
.render(labels));
l.replaceToken('padding',this.hideTitles?'0px':'10px');
}else{
t.removeTokenBlock('LabelBlock');
}
var count=this.artistCount||(artists&&artists.length);
if(count>0){
artists=artists.lpluck('artist');
artists.length=count;
var l=t.getTokenBlock('ArtistBlock');
l.replaceToken('artistContent',
new widgets.core.TextColumns(
{numCols:2,
colItemTemplate:lt.LabelListWidget.artistItem})
.render(artists));
l.replaceToken('padding',this.hideTitles?'0px':'10px');
}else{
t.removeTokenBlock('ArtistBlock');
}
if(this.hideTitles){
t.getTokenBlock('LabelBlock').removeTokenBlock('LabelTitle');
t.getTokenBlock('ArtistBlock').removeTokenBlock('ArtistTitle');
}
t.compose();
}
};











widgets.PopupHover=Class.create();
widgets.PopupHover.prototype={
initPopup:function(){
this.dialog=null;

widgets.PopupHover.g=this;
},


render:function(data,popupId,offsets){
this.dialog=new MojoDialog({
id:popupId,
mode:'horizTwoTone',
contextualElemId:widgets.PopupHover.btnId,
isModal:false,
offsets:offsets||{top:1}
});
this.dialog.onClose=this.onClose.lbind(this);

var content=this.getContent(data);
this.dialog.open(content.top,null,null,content.bottom);
},



getContent:function(data){
mojo.log.error('widgets.PopupHover.getTopContent is an interface method');
},

onClose:function(){
if(widgets.PopupHover.btnId&&$(widgets.PopupHover.btnId)){
mojo.css.hide(widgets.PopupHover.btnId);
}
widgets.PopupHover.btnId=null;
},

onClick:function(id,btn,event,topOffset,leftOffset){
if(btn.id==widgets.PopupHover.btnId){
this.dialog.close();
}else{

if(widgets.PopupHover.btnId)MojoDialog.close();
widgets.PopupHover.btnId=btn.id;

this._onClick(id,topOffset,leftOffset);
}
mojo.event.create(event).stopPropagation();
},






_onClick:function(id,topOffset,leftOffset){
mojo.log.error('widgets.PopupHover._onClick is an interface method');
},

onMouseOver:function(triggerId){
mojo.css.show(triggerId);
},

onMouseOut:function(triggerId){


if(widgets.PopupHover.btnId!=triggerId&&$(triggerId))mojo.css.hide(triggerId);
}
};

widgets.PopupHover.btnId=null;




widgets.MemberPopup=Class.create();
widgets.MemberPopup.prototype={
initialize:function(){
this.user=null;
this.isMemberPopup=true;

this.initPopup();
},

_onClick:function(userToken){
var self=this;

this.addSongWidgetListener_Init();

api.User.getLeahInfo(userToken,function(res){
self.render(res.data.user,'memberHover');
});
},

playLastListen:function(){
Player.g.playSong(this.user.lastListen,'memberHover');
},

onPlayButtonHover:function(size,elem,event){
var song=this.user.lastListen;
if(song.isDigied||song.isLicensedForStreaming){
var offsets={};
if(mojo.FF2){
offsets.top=-2;
}else if(mojo.FF3){
offsets.top=mojo.MAC?-4:-3;
}else if(mojo.IE7){
offsets.top=-2;
}
widgets.core.PlayButtonHover.open(size,song,elem,event,offsets,null,'memberHover');
}
},

getContent:function(user){
this.user=user;

var content={};
content.top=this._getTopContent(user);
content.bottom=this._getBottomContent(user);
return content;
},

_getTopContent:function(user){
var t=$T(lt.MemberPopup.contentTop);

t.replaceTokensWithBean('user',user);

var rel=new widgets.core.Relationship({
them:user,
trackingId:'memberHover',
renderTargetId:'memberHoverRelBox',
mode:'lite'
});
t.replaceToken('relBox',rel.getHTML());

if(user.isPrivate){
t.replaceToken('privateClass','lnone');
t.removeTokenBlock('OnlineBlock');
}else if(!user.isOnline){
t.removeTokenBlock('OnlineBlock');
}

return t.compose();
},

_getBottomContent:function(user){
var b=$T(lt.MemberPopup.contentBottom);
b.replaceTokensWithBean('user',user);
b.replaceToken('uniqueFact',widgets.core.Util.replaceLalaLinks(user.uniqueFact));



if(!this.user.isPrivate){
var song=this.user.lastListen;
if(song){




var playImg='';
var playType='Not yet available for streaming';

if(song.playType!='NotPlayable'){
playImg=song.isLicensedForStreaming||song.isDigied
?'play_icon_full_medium':'play_icon_30_medium';
playType=song.isLicensedForStreaming
?'Play full length song ('+mojo.util.secondsToTime(song.duration,true)+')'
:song.isDigied?'Play song from your collection'
:'Play 30 second sample';
}else{
playImg='play_icon_dim_medium';
}
b.replaceToken('playIcon',playImg);
b.replaceToken('playType',playType);
}else{
b.removeTokenBlock('LastListenBlock');
}

b.replaceToken('timeAgo',
new Date(parseInt(user.lastListenTimestamp)).lgetDaysAgoLabel());

if(this.user.uniqueFact){
var text=this.user.uniqueFact.lescapeHTML(true);
b.replaceToken('user.uniqueFact',text);
}else{
b.removeTokenBlock('AboutMeBlock');
}

if(this.user.genreList){
b.replaceToken('genreList',this.user.genreList);
}else{
b.removeTokenBlock('GenreBlock');
}

if(this.user.artistList){
b.replaceToken('artistList',this.user.artistList);
}else{
b.removeTokenBlock('ArtistBlock');
}
}else{
b.replaceToken('privateClass','lnone');
}

return b.compose();
},

addSongWidgetListener_GetSongByLinkLalaId:function(id){
var song=this.user.lastListen;
return song.linkSongLalaId==id?song:null;
}
};
Object.extend(widgets.MemberPopup.prototype,widgets.PopupHover.prototype,true);
Object.extend(widgets.MemberPopup.prototype,AddSongWidgetListener,true);
widgets.MemberPopup.g=new widgets.MemberPopup();




widgets.PlaylistPopup=Class.create();
widgets.PlaylistPopup.prototype={
initialize:function(){
this.initPopup();
},

render:function(data,popupId){
this.dialog=new MojoDialog({
id:popupId,
contextualElemId:widgets.PopupHover.btnId,
mode:'dropShadowBox',
isModal:false,
offsets:{top:-6,left:9}
});
this.dialog.onClose=this.onClose.lbind(this);
this.dialog.open(this.getContent(data));
},

_onClick:function(playlistStrOrObj){
this.playlist=typeof(playlistStrOrObj)=='string'?eval(playlistStrOrObj):playlistStrOrObj;
var self=this;
if(this.playlist.tracks){
this.render(this.playlist,'playlistPreviewDialog');
}else{
api.Playlists.getPlaylistDetails(this.playlist.id,function(res){
self.playlist.tracks=res.data.tracks;
self.playlist.info=res.data.playlist;
self.playlist.artistHisto=res.data.artistHisto;
self.render(self.playlist,'playlistPreviewDialog');
});
}
},

getContent:function(playlist){
if(!playlist.tracks||playlist.tracks.total==0){
return $TC(lt.PlaylistPopup.noContent);
}
var trackingId='playlistPreviewDialog';
var t=$T(lt.PlaylistPopup.content);
t.dateFormatString="%b %e, %Y";
t.replaceToken('artistCount',playlist.artistHisto.length)
.replaceTokensWithBean('user',playlist.info.user)
.replaceTokensWithBean('playlist',playlist.info)
.replaceToken('clickTrackingId',trackingId)
.replaceToken('plTitle',playlist.title)
.replaceToken('playlistToken',playlist.id)
.replaceToken('what',playlist.tracks.total>50
?'full list':'details');
if(playlist.info.description.length>40){
t.replaceToken('description',playlist.info.description.ltruncate(35));
t.replaceToken('displayFullDesc','lnone');
}else{
t.replaceToken('description',playlist.info.description);
t.replaceToken('displayAbbrDesc','lnone');
}
t.keepTokenBlock('DescriptionBlock',playlist.info.description);


var artistHtml='';
for(var i=0,images=0;i<playlist.artistHisto.length&&images<3;i++){
if(playlist.artistHisto[i].imgBasePath){
artistHtml+=frontend.img.ArtistLink(playlist.artistHisto[i],'small');
images++;
}
}
if(!artistHtml){
t.removeTokenBlock('ArtistsBlock');
}else{
t.replaceToken('artistHtml',artistHtml);
}


var songList=new widgets.SongList({
layout:'fancySongs',
srcInfo:{lalaId:playlist.id},
trackingId:trackingId,
usePlayButtonHover:true
});
t.replaceToken('playlistPopupSongList',songList.render(playlist.tracks));
return t.compose();
},

onPlay:function(){
Player.g.playMemberPlaylist(this.playlist.lalaId,this.trackingId);
},

onQueue:function(elem){
Player.g.queueMemberPlaylist(this.playlist.lalaId,this.trackingId,function(){
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);
});
}
};
Object.extend(widgets.PlaylistPopup.prototype,widgets.PopupHover.prototype,true);
widgets.PlaylistPopup.g=new widgets.PlaylistPopup();




widgets.BillboardPopup=Class.create();
widgets.BillboardPopup.prototype={
initialize:function(){
this.initPopup();
},

_onClick:function(id,topOffset,leftOffset){
var self=this;
var left=30;
if(leftOffset){
left+=leftOffset;
}
var top=-20;
if(topOffset){
top+=topOffset;
}
api.Q.searchCharts(id,function(res){
var chart=res.data.charts.list[0];
self.render(chart,'billboardHot100Popup',{top:top,left:left});
});


},

getContent:function(data){
return{
top:this._getTopContent(data),
bottom:this._getBottomContent(data)
};
},

_getTopContent:function(data){
var isAlbum=data.isAlbum;
return $T(lt.BillboardPopup.contentTop)
.replaceToken('title',isAlbum
?'Billboard 200':'Hot 100')
.replaceToken('subtitle',isAlbum
?'The top-selling albums across all genres'
:'The most popular songs across all genres')
.compose();
},

_getBottomContent:function(data){
var t=$T(lt.BillboardPopup.contentBottom)
.replaceTokensWithBean('data',data)
.replaceToken('href',data.isAlbum
?'http://www.billboard.com/#/charts/billboard-200'
:'http://www.billboard.com/#/charts/hot-100')
.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:data.position-data.lastweekPosition,
size:'micro',
what:data.isAlbum?'album':'song'}));
return t.compose();
},


onClose:function(){
widgets.PopupHover.btnId=null;
}
};
Object.extend(widgets.BillboardPopup.prototype,widgets.PopupHover.prototype,true);
widgets.BillboardPopup.g=new widgets.BillboardPopup();





widgets.AlbumPopup=Class.create();
widgets.AlbumPopup.prototype={
initialize:function(){

this.cache={};

this.buttonHoverOffsets={};
if(mojo.FF3){
this.buttonHoverOffsets.top=-3;
}else if(mojo.IE7){
this.buttonHoverOffsets.top=-2;
}else if(mojo.WEBKIT){
this.buttonHoverOffsets.top=3;
}

this.initPopup();
},

onBuySongEvent:function(evt){
var self=this;
evt.songs.leach(function(song){
var albumGroup=self.cache[song.discLalaId];
if(albumGroup){

for(var j=0;j<albumGroup.discs.length;j++){
var disc=albumGroup.discs[j];
for(var i=0;i<disc.tracks.length;i++){
var track=disc.tracks[i];
if(track.id==song.id){
AddSongWidgetListener.addSongWidgetListener_UpdateSongAdded(track,song);
break;
}
}
}
}
});
},

albumPriceListener_GetAlbumById:function(discId){
if(this.cache[discId])return this.cache[discId].discs[0];
else return null;
},

onUpdateAlbumPrice:function(album){
if($('albumHover')){
$S('buyOptions',this._getBuyingInfo(this.cache[album.id]));
}
},

_onClick:function(albumId){
if(!widgets.AlbumPopup.inited){
this.addListeners();
}

var hoverId='albumHover';
if(this.cache[albumId]){
this.render(this.cache[albumId],hoverId);
}else{
var self=this;
api.Catalog.getAlbumGroupInfo(albumId,function(res){
self.cache[albumId]=res.data;
self.render(res.data,hoverId);
});
}
},

addListeners:function(){
mojo.listeners.add(
api.MicroWallet.EVT_BUYSONG_CHANGE,
this.onBuySongEvent.lbind(this));
mojo.listeners.addGlobal(
MyMusic.EVT_PAGE_UNLOADED,
this.onUnload.lbind(this));
this.albumPriceListener_Init(this.onUpdateAlbumPrice.lbind(this));
},

getContent:function(group){
lala.Track.click('albumPopup.open');
return{top:this._getTopContent(group),
bottom:this._getBottomContent(group)};
},

_getTopContent:function(group){
var top=$T(lt.AlbumPopup.albumPopupTop);

if(group.discs.length>1){
top.getTokenBlock('DiscCountBlock').replaceToken('discCount',group.discs.length);
}else{
top.removeTokenBlock('DiscCountBlock');
}

var disc=group.discs[0];
top.replaceToken('s',disc.albumTrackCount==1?'':'s');


disc.titleJsSmall=disc.title.ltruncate(45);

top.replaceTokensWithBean('disc',disc);
top.replaceToken('buyOptions',this._getBuyingInfo(group));
if(lala.isTradingTransition||!lala.user||!lala.user.isTradingEnabled)top.removeTokenBlock('TradingBlock');

if(!disc.isLicensedForStreaming&&!disc.isAllTracksDigied){
top.removeTokenBlock('QueueLink');
if(!disc.samples){
top.removeTokenBlock('PlayLink');
}
}

return top.compose();
},

_getBuyingInfo:function(group){
var buyingInfo=$T(lt.AlbumPopup.buyingInfo);
var disc=group.discs[0];

buyingInfo.replaceTokensWithBean('disc',disc);

if(!disc.isFreeMp3&&frontend.hasOnlyFreeTracksOnAlbum(group.discs)){
disc.isFreeMp3=true;
}
if(disc.isFreeMp3&&disc.downloadMissingTracksCount>0){
buyingInfo.removeTokenBlock('BuyWebBlock')
.removeTokenBlock('HaveWebBlock')
.removeTokenBlock('BuyMp3Block')
.removeTokenBlock('HaveMp3Block');
}else{
buyingInfo.removeTokenBlock('FreeMp3Block');

if(disc.isLicensedForStreaming){
if(disc.addMissingTracksCount>0){
var addPrice=StoreUtil.getRealWebPrice(disc);
buyingInfo.removeTokenBlock('HaveWebBlock');
buyingInfo.getTokenBlock('BuyWebBlock').replaceToken('webPrice',mojo.util.formatPrice(addPrice));
}else{
buyingInfo.removeTokenBlock('BuyWebBlock');
}
}else{
buyingInfo.removeTokenBlock('BuyWebBlock');
buyingInfo.removeTokenBlock('HaveWebBlock');
}

if(disc.isLicensedForDownload){
if(disc.downloadMissingTracksCount>0){
var dlPrice=StoreUtil.getRealDownloadPrice(disc);
buyingInfo.removeTokenBlock('HaveMp3Block');
buyingInfo.replaceToken('mp3Price',mojo.util.formatPrice(dlPrice));
}else{
buyingInfo.removeTokenBlock('BuyMp3Block');
}
}else{
buyingInfo.removeTokenBlock('BuyMp3Block');
buyingInfo.removeTokenBlock('HaveMp3Block');
}
}
if(group.isCDForSale){
buyingInfo.getTokenBlock('BuyCdBlock').replaceToken('cdPrice',mojo.util.formatPrice(group.minCDPriceInCents));
if(disc.isLicensedForStreaming){
buyingInfo.getTokenBlock('BuyCdBlock').replaceToken('albumId',disc.id);
}
}else{
buyingInfo.removeTokenBlock('BuyCdBlock');
}

return buyingInfo.compose();
},

_getBottomContent:function(group){
var bottom=$T(lt.AlbumPopup.albumPopupBottom);

var discBlock=bottom.getTokenBlock('DiscBlock');
var self=this;
group.discs.leach(function(disc,index){
var songList=new widgets.SongList({
layout:'lite',
hideArtist:true,
srcInfo:{lalaId:disc.id},
trackingId:'albumPopup',
customFrameClass:'tracksFrame',
usePlayButtonHover:true,
offsets:self.buttonHoverOffsets
});

if(disc.trackCount<1){
disc.trackCount=0;
}
discBlock.replaceTokensWithBean('disc',disc);
discBlock.replaceToken('s',disc.trackCount==1?'':'s');

discBlock.replaceToken('trackList',songList.render(disc.tracks));
if(group.discs.length<=1&&index<=0){
discBlock.removeTokenBlock('DiscNumBlock');
}else{
var discNumBlock=discBlock.getTokenBlock('DiscNumBlock');
discNumBlock.replaceToken('discNum',index+1);
if(!disc.isLicensedForStreaming){
discNumBlock.removeTokenBlock('PlayableBlock');
}
}
discBlock.next();
});

return bottom.compose();
},

onPlayAlbum:function(playToken){
var albumObj={playToken:playToken};
Player.g.playAlbum(albumObj,'albumPopup');
},

onPlayDisc:function(playToken){
var discObj={playToken:playToken};
Player.g.playDisc(discObj,'albumPopup');
},

onQueueAlbum:function(playToken,link){
var albumObj={playToken:playToken};
Player.g.queueAlbum(albumObj,
function(){
link.parentNode.innerHTML=$TC(lt.Core.addedToQueueShort);
});
},

onQueueDisc:function(playToken,link){
var discObj={playToken:playToken};
Player.g.queueDisc(discObj,
function(){
link.parentNode.innerHTML=$TC(lt.Core.addedToQueueShort);
});
},

onUnload:function(){
this.cache={};
},

onBuyWebAlbum:function(discId){
var album=this.cache[discId].discs[0];
widgets.store.openBuyWebAlbumDialog(album,mojo.emptyFunction);
},

onBuyMp3Album:function(discId){
var album=this.cache[discId].discs[0];
widgets.store.openBuyAlbumDownloadDialog(album,mojo.emptyFunction);
}
};
Object.extend(widgets.AlbumPopup.prototype,widgets.PopupHover.prototype,true);
Object.extend(widgets.AlbumPopup.prototype,AlbumPriceListener,true);
widgets.AlbumPopup.inited=false;
widgets.AlbumPopup.g=new widgets.AlbumPopup();



api.Catalog={
getArtistWiki:function(artistName,onResponse){
lala.sendRequest({url:'Catalog/getArtistWiki',
params:{'artistName':artistName},
onResponse:onResponse,
isRawResponse:true});
},

getExtendedDiscInfo:function(id,onResponse,addlParams){
var params={'id':id};
Object.extend(params,addlParams);

lala.sendRequest({url:'Catalog/getExtendedDiscInfo',
params:params,
onResponse:onResponse});
},

getDiscInfo:function(id,onResponse){
lala.sendRequest({
url:'Catalog/getDiscInfo',
params:{'lalaId':id},
onResponse:onResponse});
},

getAlbumGroupInfo:function(id,onResponse){
lala.sendRequest({
url:'Catalog/getAlbumGroupInfo',
params:{'discId':id},
onResponse:function(res){
api.Catalog.util.processDiscWithPriceInfo(
res.data.discs[0],
res.data.priceInfo
);
onResponse(res);
}
});
},

getAlbumBuyerInfo:function(groupId,onResponse,digitalId){
lala.sendRequest({
url:'Catalog/getAlbumBuyerInfo',
params:{groupId:groupId,digitalId:digitalId},
onResponse:onResponse});
},

getAlbumTraderInfo:function(groupId,onResponse,discId){
lala.sendRequest({
url:'Catalog/getAlbumTraderInfo',
params:{groupId:groupId,discId:discId},
onResponse:onResponse});
},

getSimilarArtists:function(artistName,onResponse){
lala.sendRequest({
url:'Catalog/getSimilarArtists',
params:{artistName:artistName},
onResponse:onResponse
});
}
};

api.Catalog.util={



processDiscWithPriceInfo:function(disc,priceInfo,isUpdate){








if(mojo.isDefined(priceInfo.downloadAlbumPriceInCents)){
disc.downloadAlbumPriceInCents=priceInfo.downloadAlbumPriceInCents;
}

if(mojo.isDefined(priceInfo.webAlbumPriceInCents)){
disc.webAlbumPriceInCents=priceInfo.webAlbumPriceInCents;
}




if(mojo.isDefined(priceInfo.isAllTracksDigied)){
disc.isAllTracksDigied=priceInfo.isAllTracksDigied;
}

if(mojo.isDefined(priceInfo.isAllAlbumTracksDigied)){
disc.isAllAlbumTracksDigied=priceInfo.isAllAlbumTracksDigied
}

if(mojo.isDefined(priceInfo.isAllAlbumTracksDownloaded)){
disc.isAllAlbumTracksDownloaded=priceInfo.isAllAlbumTracksDownloaded;
}

if(mojo.isDefined(priceInfo.downloadMissingTracksCount)
&&(!isUpdate||priceInfo.downloadMissingTracksCount<disc.downloadMissingTracksCount)){
disc.downloadMissingTracksCount=priceInfo.downloadMissingTracksCount;
}

if(mojo.isDefined(priceInfo.downloadMissingTracksPriceInCents)
&&(!isUpdate||priceInfo.downloadMissingTracksPriceInCents<disc.downloadMissingTracksPriceInCents)){
disc.downloadMissingTracksPriceInCents=priceInfo.downloadMissingTracksPriceInCents;
}

if(mojo.isDefined(priceInfo.addMissingTracksCount)
&&(!isUpdate||priceInfo.addMissingTracksCount<disc.addMissingTracksCount)){
disc.addMissingTracksCount=priceInfo.addMissingTracksCount;
}

if(mojo.isDefined(priceInfo.addMissingTracksPriceInCents)
&&(!isUpdate||priceInfo.addMissingTracksPriceInCents<disc.addMissingTracksPriceInCents)){
disc.addMissingTracksPriceInCents=priceInfo.addMissingTracksPriceInCents;
}
}
}




api.User={
EVT_PERSONAL_INFO:'apiUserPersonalInfoChange',
EVT_CREDIT_CARD_CLEARED:'apiUserCCCLeared',

isInUS:function(onResponse){
lala.sendRequest(
{url:'User/isInUS',
onResponse:onResponse});
},

siteDownEmail:function(email){
lala.sendRequest(
{url:'User/siteDownEmail',
params:{email:email},
onResponse:mojo.emptyFunction(),
method:'POST'});
},

getLoggedInUser:function(onResponse){
lala.sendRequest({url:'User/getLoggedInUser',onResponse:onResponse});
},

signin:function(params,onResponse){
lala.sendRequest(
{url:'User/signin',
params:params,
onResponse:onResponse,
ssl:true,
method:'POST'});
},

signup:function(params,onResponse){
lala.sendRequest(
{url:'User/signup',
params:params,
onResponse:onResponse,
ssl:true,
method:'POST'});
},

signupForDev:function(params,onResponse){
lala.sendRequest(
{url:'User/signupForDev',
params:params,
onResponse:onResponse,
ssl:true,
method:'POST'});
},

getUserImageInfo:function(onResponse){
lala.sendRequest(
{url:'User/getUserImageInfo',
onResponse:onResponse});
},

flushCounters:function(){

lala.sendRequest(
{url:'User/flushCounters',
onResponse:mojo.emptyFunction,
skipVersionDetection:true,
method:'POST'});
},

updateCreditCard:function(params,onResponse){
lala.sendRequest(
{url:'User/updateCreditCard',
params:params,
onResponse:onResponse,
ssl:true,
method:'POST'});
},

clearCreditCard:function(params,onResponse){
lala.sendRequest(
{url:'User/clearCreditCard',
params:params,
onResponse:function(res){
mojo.listeners.notify(api.User.EVT_CREDIT_CARD_CLEARED,null);
onResponse(res);
},
ssl:true,
method:'POST'});
},

updateBillingAddress:function(params,onResponse){
lala.sendRequest(
{url:'User/updateBillingAddress',
params:params,
onResponse:onResponse,
ssl:true,
method:'POST'});
},

getShoppingSettings:function(onResponse){
lala.sendRequest(
{url:'User/getShoppingSettings',
params:null,
onResponse:onResponse,
ssl:true});
},

resetPassword:function(token,newPwd,callback){
lala.sendRequest(
{url:'User/resetPassword',
params:{token:token,newPwd:newPwd},
onResponse:callback,
ssl:true,
method:'POST'});
},

validateResetPasswordToken:function(token,callback){
lala.sendRequest(
{url:'User/validateResetPasswordToken',
params:{token:token},
onResponse:callback,
ssl:true,
method:'POST'});
},

getTradeNumbers:function(callback){
lala.sendRequest({
url:'User/getTradeNumbers',
skipVersionDetection:true,
onResponse:callback
});
},

getBasicInfo:function(forUserToken,callback){
lala.sendRequest({
url:'User/getBasicInfo',
params:{forUserToken:forUserToken},
onResponse:callback});
},

getAccountInfo:function(callback){
lala.sendRequest({
url:'User/getAccountInfo',
onResponse:callback
});
},

clearIsNewToRelease:function(callback){
lala.sendRequest({
url:'User/clearIsNewToRelease',
onResponse:callback
});
},

getEmployees:function(callback){
lala.sendRequest({
url:'User/getEmployees',
onResponse:callback
});
},

updatePersonalInfo:function(params,callback){
lala.sendRequest({
url:'User/updatePersonalInfo',
params:params,
onResponse:function(res){
lala.user.firstName=params.first_name;
lala.user.lastName=params.last_name;
lala.user.nickName=params.newNickname;
mojo.listeners.notify(api.User.EVT_PERSONAL_INFO,params);
callback(res);
},
method:'POST',
ssl:true
});
},

updateEmailAddress:function(params,callback){
lala.sendRequest({
url:'User/updateEmailAddress',
params:params,
onResponse:function(res){
if(!res.data){
lala.user.email=params.new_e_mail;
}
callback(res);
},
method:'POST',
ssl:true
});
},

updatePassword:function(params,callback){
lala.sendRequest({
url:'User/updatePassword',
params:params,
onResponse:callback,
method:'POST',
ssl:true
});
},

updateShippingAddress:function(params,callback){
lala.sendRequest({
url:'User/updateShippingAddress',
params:params,
onResponse:callback,
method:'POST',
ssl:true
});
},

updateTradingPreferences:function(params,callback){
lala.sendRequest({
url:'User/updateTradingPreferences',
params:params,
onResponse:callback,
method:'POST',
ssl:true
});
},

updatePrivacyPreferences:function(params,callback){
lala.sendRequest({
url:'User/updatePrivacyPreferences',
params:params,
onResponse:callback,
method:'POST',
ssl:true
});
},

updateEmailPreferences:function(params,callback){
lala.sendRequest({
url:'User/updateEmailPreferences',
params:params,
onResponse:callback,
method:'POST',
ssl:true
});
},

setAvatar:function(params,callback){
lala.sendRequest({
url:'User/setAvatar',
params:params,
onResponse:function(res){
callback(res);
}
});
},

setTrading:function(params,callback){
lala.sendRequest({
url:'User/setTrading',
params:params,
onResponse:function(res){
lala.isTradingEnabled=true;
lala.user.isTradingEnabled=true;
callback(res);
},
method:'POST',
ssl:true
});
},

setUseFacebookAvatar:function(useFacebookAvatar,callback){
lala.sendRequest({
url:'User/setUseFacebookAvatar',
params:{useFacebookAvatar:useFacebookAvatar},
onResponse:function(res){
lala.user.isUseFacebookAvatar=useFacebookAvatar;
if(useFacebookAvatar){
if(res.data.error){
alert('An error occured: '+res.data.error+'. Please contact support.');
}else{
LalaFBConnect.setFacebookImgs(res.data.square,res.data.big);
}
}
callback(res);
},
method:'POST',
ssl:true
});
},

setBetaFeatures:function(params,callback){
lala.sendRequest({
url:'User/setBetaFeatures',
params:{
newPlaylistView:params.newPlaylistView,
isBookmarksEnabled:params.isBookmarksEnabled,
keys:params.userPrefKeys,
values:params.userPrefValues
},
onResponse:callback,
method:'POST',
ssl:true
});
},

setLastFMScrobblingInfo:function(params,callback){
lala.sendRequest({
url:'User/setLastFMScrobblingInfo',
params:params,
onResponse:function(res){
lala.user.isLastFmScrobblingEnabled=true;
lala.user.lastFmUserName=params.userName;
callback(res);
},
method:'POST',
ssl:true
});
},

clearIsLastFMScrobblingInfo:function(params,callback){
lala.sendRequest({
url:'User/clearIsLastFMScrobblingInfo',
params:params,
onResponse:function(res){
lala.user.isLastFmScrobblingEnabled=false;
callback(res);
},
method:'POST',
ssl:true
});
},

getFavoriteGenres:function(onResponse){

if(!lala.user){
onResponse({
data:[]
});
return;
}
lala.sendRequest({
url:'User/getFavoriteGenres',
params:{},
onResponse:onResponse
});
},






convertCookiesToPreferences:function(preferences,callback){
var prefs={};
for(var pref in preferences){








}
preferences=mojo.url.buildQueryString(prefs);
lala.sendRequest({
url:'User/convertCookiesToPreferences',
params:{userPreferences:preferences},
onResponse:callback
});
},






setUserPreference:function(key,value,callback){
lala.sendRequest({
url:'User/setUserPreference',
params:{key:key,value:value},
onResponse:callback
});
},

setUserPreferences:function(keys,values,callback){
lala.sendRequest({
url:'User/setUserPreferences',
params:{keys:keys,values:values},
onResponse:callback
});
},

removeUserPreference:function(key,callback){
lala.sendRequest({
url:'User/removeUserPreference',
params:{key:key},
onResponse:callback
});
},

getLeahInfo:function(userToken,onResponse){
lala.sendRequest({
url:'User/getLeahInfo',
params:{forUserToken:userToken},
onResponse:onResponse
});
},

getRecentActivity:function(onResponse){
lala.sendRequest({
url:'User/getRecentActivity',
onResponse:onResponse
});
},

verifyEmailAddress:function(verifyToken,onResponse){
lala.sendRequest({
url:'User/verifyEmail',
params:{verifyToken:verifyToken},
onResponse:onResponse
});
},

resendVerifyEmail:function(onResponse){
lala.sendRequest({
url:'User/resendVerifyEmail',
onResponse:onResponse
});
},

pingForUserInfo:function(onResponse){
var onRes=function(res){
if(res.data){
if(lala.user){
lala.user.isEmailValidated=res.data.isEmailValidated;
lala.user.isEmailValidationRequired=res.data.isEmailValidationRequired;
}
api.MicroWallet.updateWallet(res.data.wallet);
}
onResponse(res);
};

lala.sendRequest({
url:'User/pingForUserInfo',
onResponse:onRes
});
},

unsubscribeFromEmail:function(token,onResponse){
lala.sendRequest({
url:'User/unsubscribeFromEmail',
params:{token:token},
onResponse:onResponse
});
},

checkAudioStream:function(onResponse){
lala.sendRequest({
url:'User/checkAudioStream',
onResponse:onResponse
});
}
};



api.Player={

getTrackInfo:function(songId,onResponse){
lala.sendRequest({url:'Player/getTrackInfo',
params:{id:songId},
onResponse:onResponse});
},

getShuffle:function(lalaId,onResponse){
lala.sendRequest({url:'Player/getShuffle',
params:{lalaId:lalaId},
onResponse:onResponse});
},

getDownloadUrls:function(playToken,onResponse,method){
lala.sendRequest({url:'Player/getDownloadUrls',
params:{T:playToken},
method:method,
onResponse:onResponse});
}
};




api.Gifts={
DEFAULT_COMMENT:'Write a comment...',

getGifts:function(onResponse,count){
var params={count:count||5,skip:0};
lala.sendRequest({
url:'Gifts/getGifts',
params:params,
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.gifts.list);
res.data.gifts.list.leach(function(gift){
api.Messaging._preprocessMessages(gift.comments.list);
});
onResponse(res);
}
});
},

getSentGifts:function(onResponse,addlParams,count){
var params={count:count||5,skip:0};
lala.sendRequest({
url:'Gifts/getSentGifts',
params:params,
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.gifts.list);
res.data.gifts.list.leach(function(share){
api.Messaging._preprocessMessages(share.comments.list);
});
onResponse(res);
}
});
},

acceptGift:function(giftLalaId,onResponse){
lala.sendRequest({
url:'Store/acceptGift',
method:'POST',
params:{giftLalaId:giftLalaId},
onResponse:onResponse
});
},

exchangeGift:function(giftLalaId,onResponse){
lala.sendRequest({url:'Store/exchangeGift',
params:{giftLalaId:giftLalaId},
method:'POST',
onResponse:function(res){
api.MicroWallet.updateWallet(res.data);
onResponse(res);
}
});
},

getComments:function(giftToken,onResponse){
lala.sendRequest({
url:'Gifts/getComments',
params:{giftToken:giftToken},
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.list);
onResponse(res);
}
});
},

addComment:function(params,onResponse){
var fn=function(){
api.Gifts.addComment(params,onResponse);
};
if(api.Messaging.processLinksInText(
params,
fn))return;

lala.sendRequest({
url:'Gifts/addComment',
params:params,
onResponse:onResponse
});
},

claimGiftCard:function(code,onResponse){
lala.sendRequest({
url:'Store/claimGiftCard',
method:'POST',
params:{code:code},
onResponse:function(res){
if(!res.data.invalid){
api.MicroWallet.balance=res.data.walletBalanceInCents;
mojo.listeners.notify(api.MicroWallet.EVT_BALANCE_CHANGE);
}
onResponse(res);
}
});
}
};




widgets.PlaylistList=Class.create();
widgets.PlaylistList.all={};

widgets.PlaylistList.prototype={
initialize:function(params){
this._wiid='playlistList_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.trackingId=params.trackingId||'playlistListWidget';
this.clickTrackingId=params.trackingId||'playlistListWidget';
this.moreLink=params.moreLink;
this.hideMember=params.hideMember;
this.hideArtist=params.hideArtist;
this.hideNumber=params.hideNumber;
this.layout=params.layout||'narrow';
this.msgToken=params.msgToken;


this.startNum=mojo.isDefined(params.startNum)?params.startNum:0;

widgets.PlaylistList.all[this._wiid]=this;
},

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

renderPod:function(title,playlistsOrPaged){
$T(lt.PlaylistListWidget.pod,this.renderTargetId)
.replaceToken('podTitle',title)
.replaceToken('wiid',this._wiid)
.compose();
$S(this._wiid+'_pod',this.getHtml(playlistsOrPaged));
},

getHtml:function(playlistsOrPaged,setLast){
var total;
var skip;
var playlists;

if(mojo.isDefined(playlistsOrPaged.total)){
playlists=playlistsOrPaged.list;
total=playlistsOrPaged.total;
skip=playlistsOrPaged.skip;
}else{
playlists=playlistsOrPaged;
total=playlistsOrPaged.length;
skip=0;
}

if(total==0)return"No playlists.";

var t=$T(lt.PlaylistListWidget[this.layout]);
t.replaceToken('clickTrackingId',this.clickTrackingId);

var l=t.getTokenBlock('PlaylistBlock');
for(var i=0;i<playlists.length;i++){
var isLast=mojo.isDefined(setLast)?setLast:(i==playlists.length-1);


if(!playlists[i].title){
var noMorePlaylist=$T(lt.PlaylistListWidget.noPlaylistRow)
.replaceToken('isLast',isLast?'playlistThumbLast':'')
.compose();
l.addNextHtmlChunk(noMorePlaylist);
}else{
this.replacePlaylistTokens({
playlist:playlists[i],
index:i,
num:skip+i+this.startNum+1,
isLast:isLast,
template:l,
msgToken:this.msgToken
});
l.next();
}
}

if(this.moreLink&&(total>playlists.length)){
var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.moreLink)
.replaceToken('type','playlists');
t.replaceToken('apageLink',linkHtml.compose());
}

this.playlists=playlists;

return t.compose();
},

replacePlaylistTokens:function(params){
var t=params.template;
var playlist=params.playlist;
var i=params.index;
var num=params.num;
var isLast=params.isLast;
var msgToken=params.msgToken;

t.replaceToken('wiid',this._wiid);
t.replaceToken('num',num);
t.replaceToken('isLast',isLast?'playlistThumbLast':'');
t.replaceToken('s',playlist.numTracks==1?'':'s');
t.replaceToken('index',i);
t.replaceToken('msgToken',msgToken);
t.replaceToken('icon',this.layout!='narrow'?'icon':'iconSmall');
t.replaceToken('titleUI',playlist.title.lescapeHTML());

if(this.hideArtist){
t.removeTokenBlock('ArtistBlock');
}
if(this.hideMember){
t.removeTokenBlock('MemberBlock');
}else{
t.getTokenBlock('MemberBlock').replaceTokensWithBean('user',playlist.owner);
}
if(this.hideNumber){
t.removeTokenBlock('NumBlock');
}
t.replaceTokensWithBean('playlist',playlist);
},

getPlaylistListRowHtml:function(playlist,i,num,isLast){
var t=$T(lt.PlaylistListWidget.wide).getTokenBlock('PlaylistBlock');
this.replacePlaylistTokens({
playlist:playlist,
index:i,
num:num,
isLast:isLast,
template:t
});
return t.compose();
}
};



widgets.core={};

widgets.core.TwoColumn=Class.create();
widgets.core.TwoColumn.prototype={
initialize:function(params){
if(!params)params={};
this.renderTargetId=params.renderTargetId;
this.wiid=params.id||'twoColWidget_'+mojo.idGenerator++;
this.col1=this.wiid+'_col1';
this.col2=this.wiid+'_col2';
this.col1Content=params.col1Content;
this.col2Content=params.col2Content;
this.classes=params.classes||'';
},

render:function(){
var t=$T(lt.Core.twoColWidget,this.renderTargetId);
t.replaceToken('wiid',this.wiid);
t.replaceToken('col1',this.col1);
t.replaceToken('col2',this.col2);
t.replaceToken('col1Content',this.col1Content);
t.replaceToken('col2Content',this.col2Content);
t.replaceToken('classes',this.classes);
return t.compose();
},

renderPage:function(){
this.classes='twoColPage';
this.renderTargetId='contentRegion';
this.render();
},


replace:function(html){
$(this.wiid).innerHTML=html||'';
}
};

widgets.core.ShadowBox=Class.create();
widgets.core.ShadowBox.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.wiid='shadowBoxWidget_'+mojo.idGenerator++;
this.contentId=this.wiid+'_contentId';
this.shadowId=this.wiid+'_shadowId';
this.content=params.content;
},

render:function(){
var html=$T(lt.ShadowBoxWidget.main,this.renderTargetId)
.replaceToken('contentId',this.contentId)
.replaceToken('shadowId',this.shadowId)
.replaceToken('content',this.content)
.compose();
return html;
}
};

widgets.core.DropShadowBoxWidget=Class.create();
widgets.core.DropShadowBoxWidget.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.wiid='dropShadowBox_'+mojo.idGenerator++;
this.contentId=this.wiid+'_contentId';
},

render:function(html){
return $T(lt.DropShadowBoxWidget.main,this.renderTargetId)
.replaceToken('contentId',this.contentId)
.replaceToken('html',html)
.compose();
}
};

















widgets.core.RoundedBox=Class.create();
widgets.core.RoundedBox.prototype={
initialize:function(params){
if(!params)params={};

this.wiid=params.id||'roundedBoxWidget_'+mojo.idGenerator++;
this.contentId=params.contentId||this.wiid+'_contentId';

this.mode=params.mode||'default';

this.contentHTML=params.contentHTML||'';
this.headerContentHTML=params.headerContentHTML||'';


this.topContentId='top_'+this.contentId;
this.bottomContentId='bottom_'+this.contentId;

this.topBGColor=params.topBGColor;
this.bottomBGColor=params.bottomBGColor;
if(this.mode=='blueWithHeader'){
this.topBGColor='#ACC2D2';
}


this.leftContentId='left_'+this.contentId;
this.rightContentId='right'+this.contentId;

this.leftBGColor=params.leftBGColor;
this.rightBGColor=params.rightBGColor;

this.leftEdgeBGStyle='';
this.rightEdgeBGStyle='';
if(this.mode=='vertTwoToneNoShadow'){
this.leftEdgeBGStyle='background-color: '+this.leftBGColor;
this.rightEdgeBGStyle='background-color: '+this.rightBGColor;
}

this.renderTargetId=params.renderTargetId;
this.tableId=params.tableId||'table_'+this.wiid;

this.backgroundColor=params.backgroundColor||'';


this.extraClass=params.extraClass;


this.width='width: '+(params.width?params.width:'auto');
if(this.mode=='vertTwoTone')this.width='';

this.mouseEvents=params.mouseEvents||'';
},

getHTML:function(){
var html='';
var t='';

if(this.mode=='default'
||this.mode=='border'
||this.mode=='tinyBorder'
||this.mode=='dropShadow'
||this.mode=='dropShadowGray'
||this.mode=='tinyBorderCCC'
||this.mode=='blue'){
t=$T(lt.Core.roundedBox);
}else if(this.mode=='horizTwoTone'){
t=$T(lt.Core.roundedBoxHorizTwoToneDropShadow)
.replaceToken('topContentId',this.topContentId);
}else if(this.mode=='horizTwoToneBorder'){
t=$T(lt.Core.roundedBoxHorizTwoToneNoShadow)
.replaceToken('topContentId',this.topContentId)
.replaceToken('topBGColor',this.topBGColor)
.replaceToken('bottomBGColor',this.bottomBGColor);
}else if(this.mode=='blueWithHeader'){
t=$T(lt.Core.roundedBoxHorizTwoToneNoShadow)
.replaceToken('topBGColor',this.topBGColor)
.replaceToken('topContentId',this.topContentId)
}else if(this.mode=='vertTwoToneNoShadow'
||this.mode=='vertTwoTone'){
t=$T(lt.Core.roundedBoxVertTwoTone)
.replaceToken('leftContentId',this.leftContentId)
.replaceToken('leftBGColor',this.leftBGColor)
.replaceToken('leftEdgeBGStyle',this.leftEdgeBGStyle)
.replaceToken('rightContentId',this.rightContentId)
.replaceToken('rightBGColor',this.rightBGColor)
.replaceToken('rightEdgeBGStyle',this.rightEdgeBGStyle)
.replaceToken('');
}else{
mojo.log.error('Invalid rounded box mode: '+this.mode);
return;
}

html=this._replaceCommonTokens(t).compose();
return html;
},

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

_replaceCommonTokens:function(tmpl){
var style=this.width;
var tableStyle=''
if(this.backgroundColor){
var bgColor='background-color: '+this.backgroundColor;
tableStyle+=bgColor;
}
return tmpl.replaceToken('wiid',this.wiid)
.replaceToken('tableId',this.tableId)
.replaceToken('mode',this.mode)
.replaceToken('contentId',this.contentId)
.replaceToken('bottomContentId',this.bottomContentId)
.replaceToken('extraClass',this.extraClass)
.replaceToken('content',this.contentHTML)
.replaceToken('style',style)
.replaceToken('tableStyle',tableStyle)
.replaceToken('mouseEvents',this.mouseEvents);
}
};

widgets.core.TextColumns=Class.create();
widgets.core.TextColumns.prototype={
initialize:function(params){
if(!params)params={};
this.renderTargetId=params.renderTargetId;
this.numCols=params.numCols;
this.clickTrackingId=params.clickTrackingId;
this.displayCount=params.displayCount;
this.colItemTemplate=params.colItemTemplate||lt.Core.textColumnItem;
this.extraTokenMap=params.extraTokenMap||{};
},

render:function(items,isBean){
var t=$T(lt.Core.textColumnsTable,this.renderTargetId);
var itemsLen=items.length;
var c=t.getTokenBlock('ColBlock');
if(this.displayCount&&items.length>this.displayCount){
itemsLen=this.displayCount;
}
var whole=itemsLen%this.numCols==0;
var numRows=Math.floor(itemsLen/this.numCols)
+(whole?0:1);
var b=$T(this.colItemTemplate);
var done=0;
for(var j=0;j<this.numCols;j++){
for(var i=0;i<numRows&&((done+i)<itemsLen);i++){
var aItem=items[done+i];
if(isBean){
b.replaceTokensWithBean('item',aItem);
}else{
b.replaceToken('item',aItem);
}

b.replaceToken('clickTrackingId',this.clickTrackingId);
b.replaceTokensWithMap(this.extraTokenMap);
b.next();
}





c.replaceToken('item',i>0?b.compose():'&nbsp;');

c.replaceToken('width',Math.floor((100-(this.numCols-1)*3)/this.numCols));
c.removeTokenBlock('SpaceBlock',j==this.numCols-1);
c.next();
done+=numRows;
}
return t.compose();
}
};





widgets.core.NewTextColumns=Class.create();
widgets.core.NewTextColumns.prototype={
initialize:function(params){
if(!params)params={};

this.renderTargetId=params.renderTargetId;
this.clickTrackingId=params.clickTrackingId;

this.numCols=params.numCols;
this.displayCount=params.displayCount;
},

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

getHtml:function(items){
var t=$T(lt.Core.newTextColumnsTable);

if(this.displayCount&&items.length>this.displayCount){
items.length=this.displayCount;
}

var whole=items.length%this.numCols==0;
var numRowsPerCol=Math.floor(items.length/this.numCols)
+(whole?0:1);

var col=t.getTokenBlock('ColBlock');
for(var j=0;j<this.numCols;j++){
var row=col.getTokenBlock('RowBlock');
for(var i=0;i<numRowsPerCol;i++){
var itemPtr=(j*numRowsPerCol)+i;
if(itemPtr<items.length){
row.replaceToken('item',items[itemPtr]);

}else{




row.replaceToken('item','&nbsp;');
}
row.next();
}
col.replaceToken('width',Math.floor(100/this.numCols));
col.next();
}

return t.compose();
}
}




widgets.core.Template={
replaceTransactionCondition:function(template,transaction,isCoverArtNeutral){
var hasart="";
var noart="";
if(transaction.hasCoverArt){
hasart=' checked="true" ';
}else{
noart=' checked="true" ';
}
template.replaceToken('transHasArtChecked',hasart);
template.replaceToken('transNoArtChecked',noart);





var textWith="Received in good condition with front booklet cover art";
var textWithout="Received in good condition";
if(!isCoverArtNeutral){
textWith=g_CoverOnlyWith;
textWithout=g_CoverOnlyWithout;
}else{
textWith=g_CoverNeutralWith;
textWithout=g_CoverNeutralWithout;
}
template.replaceToken('transWithoutText',textWithout);
template.replaceToken('transWithText',textWith);
}
};


widgets.core.More=Class.create();
widgets.core.More.all={};
widgets.core.More.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.text=params.text||'More';

this.wiid='more_'+mojo.idGenerator++;
widgets.core.More.all[this.wiid]=this;
},

render:function(){
$T(lt.Core.more,this.renderTargetId)
.replaceToken('text',this.text)
.replaceToken('wiid',this.wiid)
.compose();
},

onMoreClick:function(){

}
};


widgets.core.Paginator=Class.create();
widgets.core.Paginator.all={};
widgets.core.Paginator.prototype={

initialize:function(renderTargetId,mode,renderTargetId2,mode2,autoScroll,alwaysShow,showNums){
this.renderTargetId=renderTargetId;
this.renderTargetId2=renderTargetId2;
this.mode=mode;
this.mode2=mode2;
if(!mojo.isDefined(autoScroll)){
this.autoScroll=true;
}else{
this.autoScroll=autoScroll;
}


this.showNums=mojo.isDefined(showNums)?showNums:true;

this.wiid='pagedList_'+mojo.idGenerator++;
this.onPagedCallback=mojo.emptyFunction;
this.skipped=0;
this._pagedOnce=false;
this._endNum=null;
this.alwaysShow=false;
this.recordBackEvents=false;
this.recordBackEventsKeepPath=false;
this.onBeforePage=mojo.emptyFunction;
widgets.core.Paginator.all[this.wiid]=this;
},

render:function(res,pagedList,skipOverride){
return this._render(res,pagedList,this.mode,this.renderTargetId,skipOverride);
},

renderTwo:function(res,pagedList){
this._render(res,pagedList,this.mode,this.renderTargetId);
this._render(res,pagedList,this.mode2,this.renderTargetId2);
},

_render:function(res,pagedList,mode,renderTargetId,skipOverride){
if(!skipOverride)skipOverride=0;
var renderMode=mode||'lite';

if(pagedList==null){
pagedList=res.data;
}
if(pagedList.total==0){
$S(renderTargetId,'&nbsp;');
return;
}

if(!res){


res={req:{params:{skip:skipOverride,count:this.count}}};
}
var currSkip=res.req.params.skip;
var currCount=res.req.params.count;

this.skipped=currSkip;
this._endNum=pagedList.total;

var html=null;
var atEnd=false;
var startNum=currSkip+1;
var endNum=currSkip+(currCount||pagedList.list.length);
var totalPages=Math.ceil(pagedList.total/currCount);
var currPage=Math.floor(startNum/currCount)+1;
if(pagedList.total<=endNum){
endNum=pagedList.total;
atEnd=true;
}
if(pagedList.total<=currCount&&!this.alwaysShow){
if(renderTargetId){
$S(renderTargetId,'');
}
return'';
}
var t=null;

if(renderMode=='big'){
t=$T(lt.Core.paginatorBig,renderTargetId);
}else if(renderMode=='lite'){
t=$T(lt.Core.paginatorLite,renderTargetId);
}else if(renderMode=='superLite'){
t=$T(lt.Core.paginatorSuperLite,renderTargetId);
}else if(renderMode=='textOnly'){
t=$T(lt.Core.paginatorTextOnly,renderTargetId);
}else if(renderMode=='buttons'){
t=$T(lt.Core.paginatorButtons,renderTargetId);
}else{
t=$T(lt.Core.paginator,renderTargetId);
}
t.replaceToken('wiid',this.wiid);
t.replaceToken('pagedListStart',startNum);
t.replaceToken('pagedListEnd',endNum);
t.replaceToken('pagedListTotal',
mojo.util.addCommasToNumber(pagedList.total));
t.replaceToken('currPage',currPage);
t.replaceToken('totalPages',totalPages);
if(renderMode=='big'
||renderMode=='lite'
||renderMode=='superLite'
||renderMode=='buttons'){

if(!this.showNums)t.removeTokenBlock('NumbersBlock');

var prev=$T(lt.Core.prev);
prev.replaceToken('wiid',this.wiid);
if(startNum==1){
prev.removeTokenBlock('LinkBlock');
}else{
prev.removeTokenBlock('SpanBlock');
}

var prevText='';
if(renderMode=='big'){
prevText='&lt; Prev';
}else if(renderMode=='superLite'){
prevText='<img src="images/blank.gif" width="14" height="15" />';
}else if(renderMode=='buttons'){
prevText='&lt; Previous';
}else{
prevText='&lt;';
}
prev.replaceToken('prevText',prevText);
var prevHTML=prev.compose();
if(renderMode=='superLite'){
prevHTML=prevHTML.ltrim();
}
t.replaceToken('prev',prevHTML);


var next=$T(lt.Core.next);
next.replaceToken('wiid',this.wiid);
if(atEnd){
next.removeTokenBlock('LinkBlock');
}else{
next.removeTokenBlock('SpanBlock');
}

var nextText='';
if(renderMode=='big'||renderMode=='buttons'){
nextText='Next &gt;';
}else if(renderMode=='superLite'){
nextText='<img src="images/blank.gif" width="14" height="15" />';
}else{
nextText='&gt;';
}
next.replaceToken('nextText',nextText);
var nextHTML=next.compose();
if(renderMode=='superLite'){
nextHTML=nextHTML.ltrim();
}
t.replaceToken('next',nextHTML);
}else if(renderMode=='textOnly'){
if(startNum>1){
var prev=$T(lt.Core.prev);
prev.replaceToken('wiid',this.wiid);
prev.removeTokenBlock('SpanBlock');
prev.replaceToken('prevText','&lt; Back');
t.replaceToken('prev',prev.compose());
}

if(!atEnd){
var next=$T(lt.Core.next);
next.replaceToken('wiid',this.wiid);
next.removeTokenBlock('SpanBlock');
next.replaceToken('nextText','More &gt;');
t.replaceToken('next',next.compose());
}

if(startNum<=1||atEnd){
t.removeTokenBlock('PrevNextSepBlock');
}
}else{
t.replaceToken('showPrev',(startNum==1)?'hidden':'');
t.replaceToken('showNext',atEnd?'hidden':'');
}
html=t.compose();

this.res=res;
return html;
},

renderToken:function(res,t,token,mode,pagedList){
t.replaceToken(token,this._render(res,pagedList,mode));
},


onNext:function(){
var self=this;
this._setUpCallback();
this.res.req.params.skip+=this.res.req.params.count;

if(this.res.req.params.skip>=this._endNum){
this.res.req.params.skip=this._endNum-this.res.req.params.count;
}
if(this.onFirstPageOverride){
this.onFirstPageOverride(true);
this.onFirstPageOverride=null;
}else{




var reqClone=mojo.util.clone(this.res.req);
this.res.req.onResponse=function(res){
reqClone.onResponse(res);
if(self.autoScroll
&&frontend
&&frontend.scrollToPageTop)frontend.scrollToPageTop();
};
lala.sendRequest(this.res.req);
this.skipped=this.res.req.params.skip;
this.onPagedCallback(this.res.req.params.skip);

this._handleBackEvents();
}
},

_handleBackEvents:function(){
if(this.recordBackEvents){
var params={skip:this.skipped};
if(this.recordBackEventsKeepPath){
MyMusic.g.history.pushInPageEvent(params,mojo.url.getHash());
}else{
MyMusic.g.history.push(new PageTurnEvent(null,params));
}
}
},

onPrev:function(){
var self=this;
this.res.req.params.skip-=this.res.req.params.count;
if(this.res.req.params.skip<0)this.res.req.params.skip=0;
this._setUpCallback();




if(this.onFirstPageOverride){
this.onFirstPageOverride(false);
this.onFirstPageOverride=null;
}else{
var reqClone=mojo.util.clone(this.res.req);
this.res.req.onResponse=function(res){
reqClone.onResponse(res);
if(self.autoScroll
&&frontend
&&frontend.scrollToPageTop)frontend.scrollToPageTop();
};
lala.sendRequest(this.res.req);

this.skipped=this.res.req.params.skip;
this.onPagedCallback(this.res.req.params.skip);

this._handleBackEvents();
}
},


_setUpCallback:function(){
this.onBeforePage();
var self=this;
if(this._pagedOnce)return;

this._pagedOnce=true;
if(this.res){
var callback=this.res.req.onResponse;
this.res.req.onResponse=function(res){
callback(res);
var scrollDiv=$('scrollableViewDiv');
if(self.autoScroll&&scrollDiv){
scrollDiv.scrollTop=0;
}
}
}
}
};


widgets.core.StandardSelect=Class.create();
widgets.core.StandardSelect.all={};
widgets.core.StandardSelect.prototype={
initialize:function(params){
if(!params)params={};

this.renderTargetId=params.renderTargetId;
this.wiid='select_'+mojo.idGenerator++;
this.selected=params.selectByDefault;
this.options=params.options?params.options
:lala.isTradingEnabled
?['Release Date',
'Popularity',
'Supply (Haves)',
'Demand (Wants)',
'Title']
:['Release Date','Popularity','Title'];
this.onChangeCallback=
params.onChangeCallback||this.onChangeDefaultCallback.lbind(this);
this.selectText=params.selectText||'Sort by: ';

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

render:function(res,intoToken){
var html=null;
var t=$T(lt.Core.select,intoToken?null:this.renderTargetId);
t.replaceToken('wiid',this.wiid);
t.replaceToken('selectText',this.selectText);
var ob=t.getTokenBlock('OptionBlock');
var self=this;
this.options.leach(function(option){
ob.replaceToken('option',option);
ob.replaceToken(
'selected',
self.selected==option?'selected="selected"':'');
ob.next();
});

html=t.compose();

this.res=res;
return html;
},

setOptions:function(options){
this.options=options;
},

getSelectedOption:function(){
if($(this.wiid)){
return this.options[$(this.wiid).selectedIndex];
}else{
return this.selected;
}
},

onChange:function(){
var select=this.getSelectedOption();
this.selected=select;

this.onChangeCallback(select);
},

onChangeDefaultCallback:function(){
var val=this.getSelectedOptionValue();

this.res.req.params.sortKey=val.so;
this.res.req.params.sortDir=val.sa;
this.res.req.params.skip=0;

lala.sendRequest(this.res.req);
},

getSelectedOptionValue:function(){
var value={};
switch(this.selected){
case'Title':
value.so='Title';
value.sa='Asc';
break;
case'Popularity':
value.so='Listens7';
value.sa='Desc';
break;
case'Release Date':
value.so='Year';
value.sa='Desc';
break;
case'Supply (Haves)':
value.so='Supply';
value.sa='Desc';
break;
case'Demand (Wants)':
value.so='Demand';
value.sa='Desc';
break;
}

return value;
}
};

widgets.core.LightDialog={





show:function(params){
mojo.assert(params.msg,"LightDialog show() requires a msg param");

var dialog=$('lalaLightDialog');
if(!dialog){
dialog=
mojo.dom.parseHTMLFragment('<div id="lalaLightDialog"></div>',
document.body);
}

var t=$T(lt.Core.lightDialog,'lalaLightDialog');
if(!params.title){
t.removeTokenBlock('TitleBlock');
}else{
t.replaceToken('title',params.title);
}
t.replaceToken('msg',params.msg);
t.compose();


dialog.style.position='absolute';
$D(dialog);
},

hide:function(){
var dialog=$('lalaLightDialog');
if(!dialog)return;

$D(dialog,false);
document.body.onclick=null;
}
};

widgets.core.Carousel=Class.create();
widgets.core.Carousel.all={};
widgets.core.Carousel.prototype={
initialize:function(params){
this.wiid=params.id||'carouselWidget_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.resizeContainerId=params.resizeContainerId;
this.pageTemplate=params.pageTemplate||lt.Browse.carouselAlbumPage;
this.numCols=params.numCols||3;
this.numRows=params.numRows||1;
this.thumbHeight=params.thumbHeight||125;
this.itemRenderFunction=params.itemRenderFunction||this.itemRenderFunctionDefault.lbind(this);
this.contents=params.contents;
this.title=params.title;
this.hasTabs=params.hasTabs;
this.hideShadow=params.hideShadow;
this.isExpanded=params.isExpanded;
this.tabIndex=params.tabIndex||0;
this.onStateChange=params.onStateChange||mojo.emptyFunction;

this.MAX_NUM_PAGES=5;

this.mojoCarousel=null;

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

render:function(){
$T(lt.Carousel.wrapper,this.renderTargetId)
.replaceToken('id',this.wiid)
.compose();
var renderId=this.wiid+'Wrapper';
if(this.hasTabs){
this.renderTabs(renderId);
}else{
this.renderContent(this.contents[0],renderId,true);
}
},

dontRenderPage:function(length){








return length==0;
},

renderContent:function(content,renderTargetId,firstTime){
var isTab=this.hasTabs;
if(this.dontRenderPage(content.list.length)){
var t=$T(lt.Carousel.empty,renderTargetId)
.replaceToken('height',this.numRows*this.thumbHeight)
.replaceToken('isTab',isTab?'isTab':'');
t.compose();
return;
}

var carouselRenderId=renderTargetId+"_carouselRender";
var topT=$T(lt.Carousel.skel,renderTargetId)
.replaceToken('isTab',isTab?'isTab':'')
.replaceToken('title',content.title?$T(lt.Carousel.title)
.replaceToken('title',content.title)
.compose():'&nbsp;')
.replaceToken('id',carouselRenderId);
if(this.hideShadow)topT.removeTokenBlock('ShadowBlock');
if(content.moreLink){
topT.replaceToken('link',content.moreLink.url)
.replaceToken('linkTitle',content.moreLink.title);
}else{
topT.removeTokenBlock('MoreBlock');
}
topT.compose();

var isExpanded=firstTime&&this.isExpanded||(this.mojoCarousel?this.mojoCarousel.isExpanded:false);
this.mojoCarousel=mojo.carousel.create({
renderTargetId:carouselRenderId,
controlsDivId:carouselRenderId+"_controls",
trackingId:content.trackingId,
parentDivId:renderTargetId,
ie6HackDivId:renderTargetId,
onStateChange:this.onStateChange.lbind(this)
});

var pageSize=this.numCols*this.numRows;
var count=0;
for(var i=0;i<content.list.length;i=i+pageSize){
if(count>=this.MAX_NUM_PAGES)break;
var items=content.list.slice(i,i+pageSize);
this.mojoCarousel.addPage(
{items:items,
numCols:this.numCols,
numRows:this.numRows,
thumbHeight:this.thumbHeight},
this.itemRenderFunction.lbind(this));
count++;
}
this.mojoCarousel.activate(isExpanded,firstTime?content.pageIndex:0);


if(!this.hideShadow){
this.mojoCarousel.fixIE6ShadowAndMoreLink();
}

mojo.listeners.add(MyMusic.EVT_PAGE_RESIZE,this.onInPageResize.lbind(this));
},


renderTabs:function(renderId){
var self=this;
$T(lt.Carousel.tabs,renderId)
.replaceToken('id',this.wiid)
.replaceToken('title',this.title?this.title:'')
.replaceToken('displayNone',this.contents.length==1?'lnone':'')
.compose();
this.tabWidget=mojo.newtabs.create({
id:this.wiid+'Tabs',
divTabsId:this.wiid+'TabsContainer',
divTabsContentId:this.wiid+'TabsContent'
});
this.contents.leach(function(content,index){
self.tabWidget.add(
{id:'carouselTab_'+index+self.wiid,
title:content.tabTitle,
path:content.tabPath
});
});

this.tabWidget.onTabClick=this.loadMainTab.lbind(this);
this.tabWidget.activate('carouselTab_'+this.tabIndex+this.wiid);
},

loadMainTab:function(tab,isClick){
var self=this;
var firstTime=!isClick;
if(!tab)tab=this.mainTabs.active;
var index=parseInt(tab.id.split("_")[1]);
var content=this.contents[index];
this.tabIndex=index;
if(!content.list){
content.getList(function(list){
content.list=list;
self.renderContent(content,tab.contentId,firstTime);
});
}else{
this.renderContent(content,tab.contentId,firstTime);
}
if(isClick)this.onStateChange();
},

itemRenderFunctionDefault:function(itemTemplate,item,trackingId){
itemTemplate.replaceToken('itemContent',
$T(this.pageTemplate)
.replaceTokensWithBean('item',item)
.replaceToken('clickTrackingId',trackingId)
.compose());
},

onInPageResize:function(data){
if(!this.resizeContainerId)return;
var colWidth=$B(this.resizeContainerId).width;
if(this.mojoCarousel&&this.mojoCarousel.isActivated()){
mojo.geometry.setBounds(this.mojoCarousel.viewPortDivId,
{width:colWidth});
}
}
};

widgets.core.SearchMembers=Class.create();
widgets.core.SearchMembers.all={};
widgets.core.SearchMembers.prototype={
initialize:function(params){
this.boxId=params.boxId||'';
this.buttonId=params.buttonId||'';
this.clickTrackingId=params.clickTrackingId||'searchMembersWidget';
this.setUpHandlers();
},

setUpHandlers:function(){
if(!this.boxId)return;
if($(this.buttonId)){
$(this.buttonId).onclick=this.memberSearch.lbind(this);
}
mojo.event.onEnterKey($(this.boxId),this.memberSearch.lbind(this),false,false);
},

memberSearch:function(){
if($F(this.boxId)==''){return;}

if($F('searchPeopleList')){
frontend.go.FriendsSearch($F(this.boxId));
}else{
frontend.go.MemberSearch($F(this.boxId));
}
return false;
}
};

widgets.core.CropWindow=Class.create();
widgets.core.CropWindow.all={};
widgets.core.CropWindow._openInstance=null;

widgets.core.CropWindow.onHide=mojo.emptyFunction;
widgets.core.CropWindow.onShow=mojo.emptyFunction;
widgets.core.CropWindow.getOpenInstance=function(){
return widgets.core.CropWindow._openInstance;
};

widgets.core.CropWindow.prototype={
initialize:function(params){
this.width=params.width;
this.height=params.height;
this.divId=params.divId;
this.wiid='cropWindow_'+mojo.idGenerator++;

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

show:function(){
if(widgets.core.CropWindow._openInstance){
widgets.core.CropWindow._openInstance.hide();
}

this.init();
mojo.css.show(this.wiid);
widgets.core.CropWindow._openInstance=this;
widgets.core.CropWindow.onShow(this);
mojo.event.onEscapeKey(mojo.IE?document.body:window,this.hide.lbind(this));
},

hide:function(){
mojo.css.hide(this.wiid);
widgets.core.CropWindow._openInstance=null;
widgets.core.CropWindow.onHide(this);
},

getBounds:function(){
var boundsPad=$B(this.wiid+'_pad',this.divId);
var boundsCrop=$B(this.wiid+'_crop',this.divId);
var bounds={
height:boundsCrop.height,
width:boundsCrop.width,
left:boundsPad.width,
top:boundsPad.height
};

bounds.height-=2;
return bounds;
},





init:function(){
if(!cropBox){
var imgBox=$(this.divId);
imgBox.style.overflow='hidden';
imgBox.style.position='relative';

var cropBoxHtml=$T(lt.Core.cropWindow)
.replaceToken('wiid',this.wiid)
.replaceToken('cropTableHeight',$B(imgBox).height+'px')
.replaceToken('cropTableWidth',$B(imgBox).width+'px')
.compose();
mojo.css.hide(mojo.dom.parseHTMLFragment(cropBoxHtml,imgBox));
}
var padBox=$(this.wiid+'_pad');
var cropBox=$(this.wiid+'_crop');
padBox.style.width=mojo.WEBKIT?'1px':'0.1px';
padBox.style.height=mojo.WEBKIT?'1px':'0.1px';
cropBox.style.width=this.width+'px';
cropBox.style.height=this.height+'px';
},

onMoveMouseDown:function(evt){
var self=this;
mojo.drag.SLOP=1;

var boundsImage=$B(this.divId);
var boundsPad=$B(this.wiid+'_pad',this.divId);
var boundsCrop=$B(this.wiid+'_crop',this.divId);
mojo.drag.onmove=function(state){
var newHeight=boundsPad.height+state.dy;
var newWidth=boundsPad.width+state.dx;
if(newHeight<=0)newHeight=mojo.WEBKIT?1:0.1;
if(boundsCrop.height+newHeight>boundsImage.height){
newHeight=boundsImage.height-boundsCrop.height;
}
if(newWidth<=0)newWidth=mojo.WEBKIT?1:0.1;
if(boundsCrop.width+newWidth>boundsImage.width){
newWidth=boundsImage.width-boundsCrop.width;
}
var padBox=$(self.wiid+'_pad');
padBox.style.height=newHeight+'px';
padBox.style.width=newWidth+'px';
};
mojo.drag.onstop=function(){
mojo.drag.SLOP=20;
}
mojo.drag.start(evt);
},

onResizeMouseDown:function(evt){
var self=this;
mojo.drag.SLOP=1;

var boundsImage=$B(this.divId);
var boundsPad=$B(this.wiid+'_pad',this.divId);
var boundsCrop=$B(self.wiid+'_crop',self.divId);
var cropBox=$(self.wiid+'_crop');
var cropDiv=$(self.wiid+'_cropDiv');
mojo.drag.onmove=function(state){
var newWidth=boundsCrop.width+state.dx;

if(newWidth<=self.width)newWidth=self.width;

if(newWidth>=boundsImage.width-boundsPad.width)newWidth=boundsImage.width-boundsPad.width;

var newHeight=newWidth*(self.height/self.width);

if(newHeight>=boundsImage.height-boundsPad.height){
newHeight=boundsImage.height-boundsPad.height;
newWidth=newHeight*(self.width/self.height);
}
cropBox.style.width=newWidth+'px';
cropBox.style.height=newHeight+'px';
if(mojo.WEBKIT){
cropDiv.style.width=cropBox.style.width;
cropDiv.style.height=cropBox.style.height;
}
};
mojo.drag.onstop=function(){
mojo.drag.SLOP=20;
};
mojo.drag.start(evt);
new MojoEvent(evt).stopPropagation();
}
};

widgets.core.Util={

urlRegex:new RegExp(/http:\/\/([^ :<\/]+)(?::(?:[0-9]+))?(\/?(?:[\w\d#*!;:.?+=&%@!\-\/\]]*))?/),

openFeedbackDialog:function(){
var t=$T(lt.Core.feedbackDialog);
if(lala.user){
t.removeTokenBlock('FromEmailBlock');
}

this.feedbackDialog=new MojoDialog({
title:'Send us your feedback',
id:'feedbackDialog'
});
this.feedbackDialog.onOpen=function(){
if(lala.user){
$('feedbackSubject').focus();
}else{
$('feedbackFrom').focus();
}
};
this.feedbackDialog.open(t.compose());
},

submitFeedbackDialog:function(){
var self=this;

var clientState='Current URL: '+window.location.toString();
if(lala.isTradingEnabled){
clientState+='\nisTrader: true';
}

var params={
subject:$F('feedbackSubject'),
msg:$F('feedbackMsg'),
clientState:clientState
};

if(!params.subject||!params.msg){
return;
}

if(!lala.user){
params.fromEmail=$F('feedbackFrom');
}

api.Email.feedback(
params,
function(){
$('feedbackDialogButtons').innerHTML=
'<div class="dialogSubmitAckMsg">Thank you for submitting your feedback.</div>';
window.setTimeout(
function(){
self.feedbackDialog.close();
},2000);
});
},










generateLalaLinks:function(fullString,onDone){
var result=0;
var urlRegex=this.urlRegex;

var right=fullString;
var processed="";

var decorateList=[];
var tokenCount=1;

fullString.split('\n').leach(function(right){
while((result=urlRegex.exec(right))!=null){
if(result[0].indexOf("::")>0
||result[0].indexOf("]]")>0){
processed+=right.substring(0,result.index)+result[0];
right=right.substring(result.index+result[0].length);
continue;
}
processed+=right.substring(0,result.index);
right=right.substring(result.index+result[0].length);
var domain=result[1];
var path=result[2]
?result[2].replace(/[.\/,!?\)]*$/,'')
:'';
var url=result[0].replace(/[.\/,!?\)]*$/,'');
if(!domain||!domain.match(/lala.com(?:[:]\d+)?$/)){
if(domain){
domain=domain.replace(/[.,]*$/,'');
domain=domain.replace(/\/.*$/,'');
domain=" ["+domain.match(/([^.]+.[^.]+)$/)[1]+"]";
}
if(url.match(/(?:.gif|.jpg|.jpeg|.png)$/i)){
processed+="[[img::"+url+"]]";
}else{
processed+="[[url::"+url+"::"+
(url.length>28
?url.substring(7,28)+"..."
:url.substring(7))+
"]]";
}
continue;
}


if(url.match(/(?:UserImageServlet|ArtWorkServlet)/)){



url=url.replace(/&.*/,'');
processed+="[[img::"+url+"::60]]";
continue;
}


var hashLoc=path.indexOf('#');
if(hashLoc>-1||path.lstartsWith('/')){
path=path.substring(hashLoc);
}else{
processed+="[[url::"+url+"::"+
(url.length>28
?url.substring(7,28)+"..."
:url.substring(7))+
"]]";
continue;
}


var matches=path.match(/(?:\/?([^ #\/]+))(.*)/);
if(!matches){
processed+=result[0];
continue;
}



var root=matches[1];
var afterRoot=matches.length>1?matches[2]:null;
var afterRootParts=[];
if(afterRoot){


afterRoot=afterRoot.replace(/^\//,'');
afterRoot=afterRoot.replace(/\?.*$/,'');
afterRootParts=afterRoot.split('/');
afterRoot=decodeURIComponent(afterRoot);
afterRootParts.leach(function(part,index){
afterRootParts[index]=decodeURIComponent(part);
});
}


if(root.lstartsWith('z')){
processed+='[[song::'+songId+'::'
+'@title_'+tokenCount+'@]]'
+' by '
+'[[page::Artist::@artist_'+tokenCount+'@]]';
decorateList.push({
id:'/'+root,
type:'tinyUrl',
orig:root,
tokenTitle:'@title_'+(tokenCount)+'@',
tokenArtist:'@artist_'+(tokenCount)+'@',
tokenId:'@songId_'+(tokenCount++)+'@'
});

}else{


switch(root){
case"album":
var discId=afterRootParts[0];
processed+='[[page::Album::'+discId
+'::@title_'+tokenCount+'@]] by '
+'[[page::Artist::@artist_'+tokenCount+'@]]';
decorateList.push({id:discId,
type:'album',
orig:result[0],
tokenTitle:'@title_'+(tokenCount)+'@',
tokenArtist:'@artist_'+(tokenCount++)+'@'});
break;
case"contactsupport":
processed+='[[page::ContactSupport::contact support]]';
break;
case"help":
var category=afterRootParts[0];
var topicId=afterRootParts[1];
if(!category){
processed+='[[page::Help]]';
}else if(!topicId||!topicId.match(/^\d+$/)){
processed+='[[help::'+category+']]';
}else{
processed+='[[help::'+category+'::'+topicId+'::'
+'@token_'+tokenCount+'@]]';
decorateList.push({
id:topicId,
type:'help',
orig:result[0],
token:'@token_'+(tokenCount++)+'@'});
}
break;
case"blog":
var entryId=afterRootParts[0];
if(!entryId||!entryId.match(/^\d+$/)){
processed+='[[page::Blog]]';
}else{
processed+='[[blog::'+entryId+'::'
+'@token_'+tokenCount+'@]]';
decorateList.push({
id:entryId,
type:'blog',
orig:result[0],
token:'@token_'+(tokenCount++)+'@'});
}
break;
case"song":
var songId=afterRootParts[0];
processed+='[[song::'+songId+'::'
+'@title_'+tokenCount+'@]]'
+' by '
+'[[page::Artist::@artist_'+tokenCount+'@]]';
decorateList.push({
id:songId,
type:'song',
orig:result[0],
tokenTitle:'@title_'+(tokenCount)+'@',
tokenArtist:'@artist_'+(tokenCount++)+'@'});
break;
case"artist":
var artist=afterRoot;
processed+='[[page::Artist::'+artist
+'::'+artist.lspacesForUnderbars().ldecodeSlashes()+']]';
break;
case"browse":
if(afterRootParts.length<2){
processed+='[[page::Browse::Browse]]';
break;
}
switch(afterRootParts[0]){
case'label':
processed+='[[page::BrowseLabel::'
+decodeURI(afterRootParts[1])+'::'
+afterRootParts[1]
+']]';
break;
case'genre':
afterRoot=afterRootParts[1];
var genre=afterRoot.lspacesForUnderbars();
if(afterRootParts.length>2){
genre=afterRootParts[1].lspacesForUnderbars();
if(genre.match(/more/)){
mojo.log.error("browse APage linking not supported: "+path);
processed+=result[0];
break;
}
var subGenre=afterRootParts[2].lspacesForUnderbars();
var subTitle=genre+' '+subGenre;
processed+='[[page::SubGenre::'+genre
+'/'+subGenre+'::'+subTitle+']]';
}else{
processed+='[[page::BrowseGenre::'+genre
+'::'+genre+']]';
}
break;
default:
processed+=result[0];
break;
}
break;
case"newreleases":
if(afterRootParts.length<2){
processed+='[[page::NewReleases]]';
break;
}
switch(afterRootParts[0]){
case'label':
processed+='[[page::NewReleasesLabel::'
+decodeURI(afterRootParts[1])+'::'
+'New Releases: '+afterRootParts[1].lspacesForUnderbars()
+']]';
break;
case'genre':
afterRoot=afterRootParts[1];
var NRGenre=afterRoot.lspacesForUnderbars();
if(afterRootParts.length>2){
NRGenre=afterRootParts[1];
if(NRGenre.match(/more/)){
mojo.log.error("newrelease APage linking not supported: "+path);
processed+=result[0];
break;
}
var NRSubGenre=afterRootParts[2];
var NRSubTitle=NRGenre+' '+NRSubGenre;
processed+='[[page::NewReleasesSubGenre::'
+NRGenre+'/'+NRSubGenre+'::'
+'New Releases: '+NRSubTitle.lspacesForUnderbars()+']]';
}else{
processed+='[[page::NewReleasesGenre::'
+NRGenre+'::'
+'New Releases: '+NRGenre.lspacesForUnderbars()+']]';
}
break;
default:
processed+=result[0];
break;
}
break;
case"member":
var userToken=afterRoot;
processed+='[[page::Member::'+userToken
+'::'+'@token_'+tokenCount+'@]]';
decorateList.push({id:userToken,
orig:result[0],
type:'member',
token:'@token_'+(tokenCount++)+'@'});
break;
case"memberplaylist":
case"playlist":
var token=afterRootParts[0];
processed+='[[page::MemberPlaylist::'+token
+'::'+'@token_'+tokenCount+'@]]';
decorateList.push({id:token,
orig:result[0],
type:'playlist',
token:'@token_'+(tokenCount++)+'@'});
break;
default:
mojo.log.error("smart linking not supported: "+path);
processed+=result[0];
}
}
}
processed+=right;
processed+='\n';
});

processed=processed.replace(/\n$/,'');

if(decorateList.length>0){

api.Messaging.decorateIds(
decorateList.lpluck('id'),
decorateList.lpluck('type'),
function(res){
decorateList.leach(function(dec,index){
var data=res.data[index];
if(!data)return;
if(dec.type=='album'){
processed=processed.replace(dec.tokenTitle,
data.title);
processed=processed.replace(dec.tokenArtist,
data.artist);
}else if(dec.type=='song'){
processed=processed.replace(dec.tokenTitle,
data.title);
processed=processed.replace(dec.tokenArtist,
data.artist);
}else if(dec.type=='member'){
processed=processed.replace(dec.token,
data.nickName);
}else if(dec.type=='playlist'){
processed=processed.replace(dec.token,
data.title);
}else if(dec.type=='help'){
processed=processed.replace(dec.token,
data.subject);
}else if(dec.type=='blog'){
processed=processed.replace(dec.token,
data.subject);
}else if(dec.type=='tinyUrl'){
processed=processed.replace(dec.tokenTitle,
data.title);
processed=processed.replace(dec.tokenArtist,
data.artist);
processed=processed.replace(dec.tokenSongId,
data.linkSongLalaId);
}
});
onDone(processed);
});
}else{


onDone(processed);
}
},

bracketRegex:new RegExp(/\[\[([^\]]*?\]?)(\]\])/),




replaceLalaLinks:function(fullString){
var result=0;
var regex=this.bracketRegex;
var right=fullString;
var inside="";
var link="";
var what="";
var cls="lalalink";
var anchorTitle="";
var doNotEscape=false;
var processed=" ";

right+=" ";
right=right.replace(/(contact support)([^\]])/ig,'[[page::ContactSupport::$1]]$2');
right=right.replace(/ $/,'');

while((result=regex.exec(right))!=null){


cls="lalalink";
anchorTitle="";
processed+=right.substring(0,result.index);
right=right.substring(result.index+result[0].length);
inside=result[1];
var params=inside.split("::");
var paramsCount=params.length;


if(paramsCount<=1)continue;

link='';
what='';
doNotEscape=false;

var cmd=params[0];
try{
if(cmd=='page'){
var pageId=params[1];
if(paramsCount==2){

link=frontend.link[pageId]();
}else if(paramsCount>=3){


var pageArg=params[2].lunescapeHTML();


if(!frontend.link[pageId]){

right=pageArg+right;
break;
}
link=frontend.link[pageId](pageArg);
}else{
mojo.log.error('impossible page:: branch');
}


if(what==''){
what=params.llast();
}
doNotEscape=true;
}else if(cmd=='help'){
if(paramsCount==2){

link=frontend.link.Help(params[1]);
}else if(paramsCount>=3){

var pageArgs=params.slice(1,params.length);
pageArgs.leach(function(arg,index){
pageArgs[index]=arg.toString().lunescapeHTML();
});
link=frontend.link.Help.apply(frontend.link,pageArgs);
}


if(what==''){
what=params.llast();
}
doNotEscape=true;

}else if(cmd=='contactsupport'){
if(paramsCount==2||paramsCount==3){


link=frontend.link.ContactSupport({radioId:params[1]});
}else{
link=frontend.link.ContactSupport();
}


if(what==''){
what=params.llast();
}
doNotEscape=true;

}else if(cmd=='blog'){
if(paramsCount==2||paramsCount==3){


link=frontend.link.Blog(params[1]);
}else{
link=frontend.link.Blog();
}


if(what==''){
what=paramsCount==2?'Lala blog':params.llast();
}
doNotEscape=true;

}else if((cmd=='song'||cmd=='song30')&&(paramsCount==3)){


link=frontend.link.PlaySong(params[1]);
what="<img src='images/blank.gif'/>";
right=params[2]+right;
doNotEscape=true;

if(cmd=='song'){
cls="play_icon_full lalaLinkInline";
anchorTitle="full length song";
}else{
cls="play_icon_30 lalaLinkInline";
anchorTitle="30 second sample";
}


}else if((cmd=='url')&&(params.length>=2)
&&this.urlRegex.exec(params[1])){
what=params[2]?params[2]:params[1];
link='class="lexternallink" target="_blank" title="'+params[1]+'" href="'+params[1]+'"';
var domain=this.urlRegex.exec(params[1])[1];
if(domain){
if(params[2]&&!params[1].match(params[2])){
right=' ['+domain+'] '+right;
}
}else{
link='';
}
doNotEscape=true;

}else if((cmd=="image"||cmd=="img")&&(params.length>=2)){
if(mojo.isDefined(params[2])&&params[2].match(/^[0-9]+$/)){
if(params[2]>200){
params[2]="200";
}
}else{
params[2]="100";
}
what="<img class='lblock' src='"+params[1]+"' height='"+
params[2]+"px'>";
if(mojo.isDefined(params[3])&&!params[3].match(':')&&params[3].length!=0){
link="href='"+params[3]+"'";
}else{
processed+=what;
}
doNotEscape=true;

}else if((cmd=='blogimg')&&(params.length==2)){
var imgSrc=params[1];
what='<img src="images/blog/'+imgSrc+'" />';
processed+=what;
doNotEscape=true;

}else if(lala.user&&lala.user.isInternal){
what="<span style='color:red;background-color:#CCCCCC'>&nbsp;deprecated&nbsp;</span>";
doNotEscape=true;
link='href="javascript:lala.showAck(\'[['+inside+']] is not supported\')"';
}
}catch(e){
mojo.log.error("eval error for token link: "+params,e);
}

if(link!=null&&link.length>0){
what=(doNotEscape)?what:what.lescapeHTML(false);
processed+='<a '+link+' title="'+anchorTitle+'"'
+' class="'+cls+'" style="display:inline">'
+what+'</a>';
}
}

processed+=right;
return this.replaceEmoticons(processed);
},

replaceEmoticons:function(text){
text=text.replace(/(:\))|(=\))|(:-\))/g,"<img src='images/smiley.gif'>");
text=text.replace(/([^t];\))|([^t];-\))/g,"<img src='images/wink.gif'>");
text=text.replace(/(:\()|(=\()|(:-\()/g,"<img src='images/frown.gif'>");
text=text.replace(/\[\[smileys\]\]/g,":) ;) :( =) =( :-) ;-) :-(");
return text;
}
};

widgets.core.DownloadDialog=Class.create();
widgets.core.DownloadDialog.prototype={
initialize:function(){
this._onDownloadFinished=mojo.emptyFunction;
},

showInstructions:function(downloadLink,params){
if(!params)params={};
widgets.core.LightDialog.hide();
var dialog=new MojoDialog({title:'Complete your download',
id:"downloadInstructionsDialog",
offsets:{top:-80}});

var html=this.getInstructionsHtml(downloadLink);
dialog.open(html,null,false);

if(params.onDownloadFinished){
this._onDownloadFinished=params.onDownloadFinished;
}
},

getInstructionsHtml:function(downloadLink){
var browser='';
var imgSrc='';

if(mojo.IE){
browser=' (Internet Explorer)';
imgSrc='lib/widgets/Core/images/savetodisk_ie7.gif';
}else if(mojo.FF){
browser=' (Firefox)';
imgSrc=mojo.MAC?'lib/widgets/Core/images/savetodisk_ffmac.gif'
:'lib/widgets/Core/images/savetodisk_ffwin.gif';
}else if(mojo.SAFARI){
browser=' (Safari)';
}

var t=$T(lt.CoreDownloadDialog.instructions)
.replaceToken('browser',browser)
.replaceToken('downloadLink',downloadLink);
if(mojo.IE){









t.getTokenBlock('ButtonsBlock').removeTokenBlock('InWindowBlock');
}else{



t.getTokenBlock('ButtonsBlock').removeTokenBlock('PopWindowBlock');
}

var instructionsContent='';
if(mojo.IE||mojo.FF){
var a=$T(lt.CoreDownloadDialog.instructionsImage)
.replaceToken('displayFF',mojo.FF?'':'none')
.replaceToken('imgSrc',imgSrc);
if(!mojo.FF){
a.removeTokenBlock('ToDiskBlock');
a.removeTokenBlock('StepOneBlock');
}
instructionsContent=a.compose();
}else{
instructionsContent=$TC(lt.CoreDownloadDialog.instructionsGeneric);
}
t.replaceToken('instructionsContent',instructionsContent);

if(!downloadLink){
t.removeTokenBlock('ButtonsBlock');
}
return t.compose();
},

onStartWebDownload:function(replaceDivId){

if(typeof(DataModel)!='undefined'){
DataModel.g.decrementPendingCount('Download');
}

this._onDownloadFinished();
var t=mojo.SAFARI?lt.CoreDownloadDialog.webDownloadedAckSafari
:lt.CoreDownloadDialog.webDownloadedAck;
$TC(t,replaceDivId);
}
};
widgets.core.DownloadDialog.g=new widgets.core.DownloadDialog();


widgets.core.ClientAutoCompleteMatcher=Class.create();
widgets.core.ClientAutoCompleteMatcher.prototype={
initialize:function(){
this._data={};
this._matches=[];
},

setData:function(dataArray,key){
this._processData(dataArray,key);
},

getMatches:function(sTerm,showAll){
if(sTerm.lisEmpty()){
if(showAll){
var fullList=[];
for(var k in this._data){
if(!fullList.lcontainsAttr('value',this._data[k].value)){
fullList.ladd({value:this._data[k].value});
}
}
return fullList;
}else{
return[];
}
}

this._matches={};

sTerm=sTerm.toLowerCase();
var matchedNames={};
this._matches=this._data[sTerm.charAt(0)];


if(sTerm.indexOf("+")!=-1){
sTerm=new RegExp(sTerm.replace(/\+/g,"\\+"));
}

if(this._matches&&this._matches.length>0){
for(var i=0;i<this._matches.length;i++){
if(this._matches[i].match.match(sTerm)){
matchedNames[this._matches[i].value]={value:this._matches[i].value};
}
}
}
var shortList=[];
var index=0;
for(var key in matchedNames){
if(index>=9)break;
shortList[index]=matchedNames[key];
index++;
}

return shortList;
},





_processData:function(dataArray,key){
if(!dataArray)return;
if(!key)key='name';



this._data={};
for(var i=0;i<dataArray.length;i++){
var item=dataArray[i][key];

var itemLetter=item.charAt(0).toLowerCase();
if(!this._data[itemLetter])this._data[itemLetter]=[];
this._data[itemLetter].push({match:item.toLowerCase(),value:item});

var itemTok=item;
var firstSpace=itemTok.indexOf(' ');
while(firstSpace>=0){
var token=itemTok.substring(0,firstSpace).ltrim();
var tokLetter=token.charAt(0).toLowerCase();

if(this._isValidWord(token)){
if(!this._data[tokLetter])this._data[tokLetter]=[];
this._data[tokLetter].push({match:token.toLowerCase(),value:item});
}




var remaining=itemTok.substring(firstSpace,itemTok.length).ltrim().toLowerCase();
var remainingLetter=remaining.charAt(0);
if(!this._data[remainingLetter])this._data[remainingLetter]=[];
this._data[remainingLetter].push({match:remaining,value:item});

itemTok=itemTok.substring(firstSpace).ltrim();
firstSpace=itemTok.indexOf(' ');
}



if(item.toLowerCase!=itemTok){
var letter=itemTok.charAt(0).toLowerCase();
if(!this._data[letter])this._data[letter]=[];
this._data[letter].push({match:itemTok.toLowerCase(),value:item});
}
}
},

_isValidWord:function(word){
word=word.toLowerCase;
return!(word=='the'
||word=='and'
||word=='or'
||word=='/'
||word=='\\'
||word=='&'
||word=='a'
||word=='of'
||word=='&'
||word=='\''
||word=='"');
}
};


widgets.core.Invite=Class.create();
widgets.core.Invite.all={};
widgets.core.Invite.prototype={
initialize:function(params){
this.wiid=params.id||'inviteWidget_'+mojo.idGenerator++
this.renderTargetId=params.renderTargetId;
this.clickTrackingId=params.clickTrackingId||'inviteWidget';
this.mode=params.mode;

this.hidePromoMsg=params.hidePromoMsg||false;

widgets.core.Invite.all[this.wiid]=this;

this.MAX_CHAR_COUNT=300;
},

render:function(){
var contentTemplate=null;
if(this.mode=='stacked'){
contentTemplate=$T(lt.Invite.stackedContent,this.renderTargetId);
}else if(this.mode=='sideBySide'){
contentTemplate=$T(lt.Invite.sideBySideContent,this.renderTargetId);
}

contentTemplate
.replaceToken('wiid',this.wiid)
.replaceToken('maxCharCount',this.MAX_CHAR_COUNT)
.compose();

mojo.input.clearOnClick('spreadFriendEmail');
$('spreadFriendEmail').onfocus=function(){
$('spreadFriendEmail').style.color='black';
};
mojo.event.onEnterKey('spreadFriendEmail',this.spreadTheWordClick.lbind(this));
this.updateMsgCharCount($('inviteMessage'),'inviteCharCount');
},

spreadTheWordClick:function(){
var self=this;
if(!this.validateSpreadInfo())return;

var emails=$F('spreadFriendEmail').split(',');
var msg=$F('inviteMessage');
if(msg=='')msg=' ';
api.Email.sendInvites(
emails,msg,
function(res){
$T(lt.Invite.sent,'sendInviteButtonArea')
.replaceToken('s',emails.length==1?'':'s')
.compose();
window.setTimeout(function(){

self.render();
},2000);
});

},

validateSpreadInfo:function(){

$D('errorSpread',false);
$('spreadFriendEmail').style.backgroundColor='white';
$('inviteMessage').style.backgroundColor='white';



var emails=$F('spreadFriendEmail');
emails=emails.split(',');
for(var i=0;i<emails.length;i++){
var email=emails[i].ltrim();
var at=email.indexOf('@');
var dot=email.lastIndexOf('.');
var space=email.lastIndexOf(' ');
if(!(at>0&&dot>1&&dot>at&&space<0)){
return this.showErrorMessage('spreadFriendEmail','Invalid Email Address')
}
}

if($F('inviteMessage').length>this.MAX_CHAR_COUNT){
return this.showErrorMessage('inviteMessage','Your message is too long.');
}

return true;
},

showErrorMessage:function(elem,msg){
mojo.util.highlightErrorField(elem);
$S('errorSpread',msg);
$D('errorSpread',true,'inline');
return false;
},

updateMsgCharCount:function(textarea,charCountId){
var length=$F(textarea).length;
$S(charCountId,this.MAX_CHAR_COUNT-length);
if(length>this.MAX_CHAR_COUNT){
mojo.util.highlightErrorField(textarea);
}
}
};

widgets.core.Invite.renderInviteLink=function(renderTargetId){
$T(lt.Invite.inviteLink,renderTargetId)
.replaceToken('inviteLinkUrl',lala.user.inviteLink)
.compose();
};



widgets.core.BuyWalletDialog=Class.create();
widgets.core.BuyWalletDialog={
open:function(params){
if(MyMusic.g.requiresSignin())return;
if(!params)params={};


widgets.core.BuyWalletDialog._params=params;

var titleTmpl=lt.CoreFrontend.dialogAlertTitle;
var title='';
var subTitle='';
var submitText;

var t=$T(lt.Core.addWalletFundsDialog);
t.replaceToken('creditCardText',DataModel.g.getCreditCardOnFile());

t.getTokenBlock('BalanceBlock').keepTokenBlock('PriceBlock',
params.song&&!lala.user.isCreditCardRequired);
t.keepTokenBlock('ExplainLink',!lala.user.hasHadWallet&&!lala.user.isCreditCardRequired);

t.replaceToken('balance',mojo.util.formatPrice(api.MicroWallet.balance));
if(lala.user.isCreditCardRequired){
t.removeTokenBlock('ValidFundsBlock');
t.removeTokenBlock('WalletBlock');
t.removeTokenBlock('BalanceBlock');
t.removeTokenBlock('ExplainLinkBlock');

if(params.isGift){
if(lala.user.hasHadWallet){
submitText='Update credit card';
title='Gifts cost 10&cent; each. To gift songs, please update your credit card info.';
}else{
submitText='Set up your wallet';
title='Gifts cost 10&cent; each.  To gift songs, please set up your Lala wallet.';
}
}else if(lala.user.hasCreditCard){
t.replaceToken('showExplain','lnone');
submitText='Update credit card';
title='Oops.  Your credit card info is out of date.';
}else{
title='Oops.  You need a credit card to buy a wallet.';
submitText='Set up credit card';
}
}else{
t.replaceToken('showExplain','lnone');
t.removeTokenBlock('InvalidFundsBlock');
if(params.song){

t.replaceToken('preText','To continue adding songs, please add funds to your wallet.');
t.replaceToken('itemDescription',params.itemDescription);
t.replaceToken('price',mojo.util.formatPrice(params.song.addPrice));
submitText='Fund wallet &amp; add song';

if(params.isGift){
title='Gifts cost only 10&cent;.';
subTitle='You need a wallet to buy them.';
}else if(lala.user.hasHadWallet){
title='Oops.  Not enough money in your wallet.';
}else{
title='You need a wallet to buy web songs.';
subTitle='Song cost only 10&cent;, but you need a wallet to buy them.';
}
}else if(!params.song){

titleTmpl=lt.CoreFrontend.dialogLogoTitle;
title='Add funds to your wallet';
t.replaceToken('preText','Select an amount to purchase for your wallet.');
t.replaceToken('itemDescription',params.itemDescription);
submitText='Purchase funds';
}


var w=t.getTokenBlock('WalletBlock').getTokenBlock('WalletForSale');
t.replaceToken("payment",DataModel.g.getCreditCardOnFile());
api.MicroWallet.walletOffers.leach(function(offer){
w.replaceTokensWithBean("wallet",offer);
w.replaceToken("selected",offer.price==5?'selected':'');
w.next();
});
}

var paymentMethodContext='addWalletFundsDialog';

if(!lala.user.hasHadWallet)paymentMethodContext+=':firstTime';

t.replaceToken('goToPaymentMethod',
"MyMusic.g.onGoToPaymentMethod('"+paymentMethodContext+"', 'wallet')");

t.replaceToken('submitText',submitText);

var displayTitle=$T(titleTmpl).replaceToken('title',title)
.replaceToken('subTitle',subTitle)
.removeTokenBlock('SubTitleBlock',subTitle=='')
.compose();
var dialog=new MojoDialog({
title:displayTitle,
id:'addWalletFundsDialog'
});
if(params.purchaseOnResponse)dialog.onClose=params.purchaseOnResponse;
dialog.open(t.compose());
},

close:function(){
MojoDialog.close();
},




submit:function(){
if(MyMusic.g.requiresSignin())return;

btn=mojo.util.buttonAnchor('addFundsSubmitButton','addFundsCancelButton');
btn.disable();
var option=mojo.form.getSelectedOption('addFundsSelect');
var lalaId=option.value;

$('addFundsSubmitButton').onclick='';


api.Store.purchaseMicroWallet(
lalaId,
function(res){
var params=widgets.core.BuyWalletDialog._params;
if(!params.song){

widgets.core.BuyWalletDialog.openWalletAck();
}else{
if(params.isGift){

widgets.store.openBuyGiftWebSongDialog(params.song);
}else{

frontend.buyWebSong(
params.song,
function(res){
if(params.songOnBuyResponse){
params.songOnBuyResponse(res);
}
if($('addFundsButtonRow')){
$T(lt.Core.addWalletSuccessMessage,'addFundsButtonRow')
.replaceToken('total',mojo.util.formatPrice(api.MicroWallet.balance))
.compose();
window.setTimeout(MojoDialog.close,3000);
}
},
params.fromTrackingContext,
params.playlistToken,
params.onBeforePurchase,
params.addlEvtData
);
}
}
});
},

openWalletAck:function(showExplainText){
var t=$T(lt.Core.walletSuccessDialog)
.removeTokenBlock('WhatIsAWalletBlock',!showExplainText)
.compose();
var title=$T(lt.CoreFrontend.dialogCheckTitle)
.replaceToken('title',
'You now have $'+mojo.util.formatPrice(api.MicroWallet.balance)
+' in your wallet.')
.replaceToken('subtitle','Now go add some music to your collection!')
.compose();

new MojoDialog({title:title,id:'walletPaymentAckDialog'}).open(t);
}
};

widgets.core.PlayButtonHover={


open:function(size,song,button,evt,offsets,customAddLink,
clickTrackingId,onOpen,onClose){
widgets.core.PlayButtonHover.onOpen=onOpen;
var hover=$('playButtonHover');


if(hover&&mojo.css.isVisible(hover)){


if(widgets.core.PlayButtonHover.onClose){
widgets.core.PlayButtonHover.onClose();
widgets.core.PlayButtonHover.onClose=null;
}
this.openHover({
size:size,
song:song,
button:button,
offsets:offsets,
customAddLink:customAddLink,
clickTrackingId:clickTrackingId
});
}else{
var self=this;
widgets.core.PlayButtonHover.openTimer=window.setTimeout(
function(){
self.openHover({
size:size,
song:song,
button:button,
offsets:offsets,
customAddLink:customAddLink,
clickTrackingId:clickTrackingId,
fadeIn:false
});
},25);
}

widgets.core.PlayButtonHover.onClose=onClose;


var event=mojo.event.create(evt);
event.stopPropagation();
},


openHover:function(params){
var size=params.size;
var song=params.song;
var button=params.button;
var offsets=params.offsets;
var fadeIn=params.fadeIn;
var customAddLink=params.customAddLink;

widgets.core.PlayButtonHover.currentSong=params.song;
widgets.core.PlayButtonHover.clickTrackingId=params.clickTrackingId||'playButtonHover';
var buttonClass='play_icon_full';
if(size!='small'){
buttonClass+='_'+size;
}

if(button.tagName!='A'){
button=button.parentNode;
}

var hover=$('playButtonHover');
if(!$('playButtonHover')){
mojo.dom.parseHTMLFragment($TC(lt.PlayButtonHover.hoverWrapper),
document.getElementsByTagName('BODY')[0]);

hover=$('playButtonHover');
widgets.core.PlayButtonHover.rb=new widgets.core.RoundedBox({
renderTargetId:'playButtonHover',
mode:'dropShadowGray'
}).render();

hover.onclick=function(event){mojo.event.create(event).stopPropagation();};
}

var addLink=customAddLink?customAddLink:$TC(lt.PlayButtonHover.addLink);
var content=$T(lt.PlayButtonHover.hover,widgets.core.PlayButtonHover.rb.contentId)
.replaceToken('size',size)
.replaceToken('addLink',song.isDigied?$TC(lt.PlayButtonHover.hasSong):addLink)
.replaceToken('topPadding',(size=='large'&&!mojo.IE)?'3':'6');

hover.className=size+'_playButtonHover';

content.compose();
var b=mojo.geometry.getFancyBounds(button);
var h=mojo.geometry.getFancyBounds('playButtonHover');
var c=mojo.geometry.getFancyBounds('playButtonHoverPlayButton');

if(mojo.FF3)h.top-=2;
else if(mojo.FF2)h.top-=2;
if(offsets&&offsets.top)c.top+=offsets.top;
if(offsets&&offsets.left)c.left+=offsets.left;

mojo.geometry.setBounds(hover,{
top:h.top+(b.top-c.top),
left:h.left+(b.left-c.left)
});

if(fadeIn&&!mojo.IE7){
mojo.animate.fade(hover,'in',null,1,.05);
}else{
mojo.css.show(hover);
}

$('playButtonHoverPlayButton').className=buttonClass;
$('playButtonHoverPlayButton').onclick=button.onclick;
mojo.event.onMouseOut('playButtonHover',widgets.core.PlayButtonHover.close,button);
$('scrollableViewDiv').onscroll=widgets.core.PlayButtonHover.close;
if(widgets.core.PlayButtonHover.onOpen){
window.setTimeout(function(){
if(widgets.core.PlayButtonHover.onOpen)widgets.core.PlayButtonHover.onOpen();
widgets.core.PlayButtonHover.onOpen=null;
},2);
}
},

close:function(){
if(widgets.core.PlayButtonHover.onClose){
widgets.core.PlayButtonHover.onClose();
widgets.core.PlayButtonHover.onClose=null;
}
var hoverElem=$('playButtonHover');
if(!hoverElem)return;



mojo.geometry.setBounds(hoverElem,{top:-100,left:-100});
mojo.css.hide(hoverElem);

$('scrollableViewDiv').onscroll=null;
widgets.core.PlayButtonHover.currentSong=null;
widgets.core.PlayButtonHover.context=null;
},

onQueueSong:function(queueLink){
if(frontend.requiresSignin())return;
Player.g.queueSong(widgets.core.PlayButtonHover.currentSong,
function(){
queueLink.parentNode.innerHTML=$TC(lt.PlayButtonHover.queuedSong);
},widgets.core.PlayButtonHover.clickTrackingId);
},

onAddSong:function(addLink){
frontend.buyWebSong(
widgets.core.PlayButtonHover.currentSong,
function(res){
addLink.parentNode.innerHTML=$TC(lt.PlayButtonHover.addedSong);
},
widgets.core.PlayButtonHover.clickTrackingId);
},

leavingTarget:function(){
window.clearTimeout(widgets.core.PlayButtonHover.openTimer);
widgets.core.PlayButtonHover.openTimer=null;
}
};
widgets.core.PlayButtonHover.currentSong=null;
widgets.core.PlayButtonHover.firstTime=true;
widgets.core.PlayButtonHover.context=null;
widgets.core.PlayButtonHover.openTimer=null;
widgets.core.PlayButtonHover.rb=null;

widgets.core.Tooltip={


open:function(elem,content,onAfterOpen,width,boundsParent,leftRight,ie6Offsets){
if(!boundsParent)boundsParent='scrollableViewDiv';
if(boundsParent=='body')boundsParent=document.body;
if(!width)width=150;
if(!leftRight)leftRight='right';

if(!widgets.core.Tooltip._bubble){
mojo.dom.parseHTMLFragment($TC(lt.Tooltip.bubbleWrap),boundsParent);
widgets.core.Tooltip._bubble=$('tooltipBubble');
var rb=new widgets.core.RoundedBox({
mode:'dropShadow',
renderTargetId:'tooltipBubble'
}).render();
$TC(lt.Tooltip.bubble,rb.contentId);
widgets.core.Tooltip._renderDiv='tooltipBubbleContent';
}
widgets.core.Tooltip._bubble.style.width=width+'px';
$S('tooltipBubbleContent',content);

var div=widgets.core.Tooltip._bubble;

mojo.css.hide(div);
mojo.css.display(div,true);
var ttb=mojo.geometry.getBounds(div);
mojo.css.display(div,false);
mojo.css.show(div);

var eb=mojo.geometry.getBounds(elem,boundsParent,true);
var vpb=mojo.geometry.getViewportBounds();
var pb=mojo.geometry.getBounds(boundsParent);

var horizPadding=5;
var puLeft=0;
var ptrLeft=0;

var topBottom='Top';
var puTop=eb.top+(ttb.height/2);
var ptrTop=(ttb.height/2)-11;
var ptrWidth=20;


if(eb.left+eb.width+ttb.width+ptrWidth>boundsParent){

leftRight='left';
}else if(eb.left-ttb.width-ptrWidth<0){

leftRight='right';
}

if(leftRight=='right'){
puLeft=eb.left+eb.width+ptrWidth;
ptrLeft=-7;
}else{
puLeft=eb.left-horizPadding-ttb.width-ptrWidth+20;
ptrLeft=ttb.width-14;
}

if((puTop+ttb.height)>vpb.height){
puTop=vpb.height-ttb.height-5;
}else if(puTop<=0){
puTop=2;
}


if((puTop+(ttb.height/2)>(eb.top+eb.height/2))){
topBottom='Bottom';
}

ptrTop=eb.top+(eb.height/2)-puTop;

if(topBottom=='Top')ptrTop+=-20;

if(ptrTop<11){
var slop=11-ptrTop+5;
puTop-=(slop+5);
ptrTop+=slop;
}

if(mojo.IE6&&ie6Offsets){
if(ie6Offsets.top){
puTop+=ie6Offsets.top;
}
}

widgets.core.Tooltip._bubble.className=leftRight+topBottom;
mojo.geometry.setBounds(widgets.core.Tooltip._bubble,{left:puLeft,top:puTop});
mojo.geometry.setBounds('tooltipBubblePointer',{left:ptrLeft,top:ptrTop});

mojo.css.display(div,true);
if(onAfterOpen)onAfterOpen(elem);
document.body.onscroll=function(){widgets.core.Tooltip.close()};
window.setTimeout(function(){
if(mojo.css.isDisplayed('tooltipBubbleContent')){
document.body.onclick=function(event){
event=mojo.event.create(event);
if(event.target==elem)return;
widgets.core.Tooltip.close()
};
}
},50);

},

render:function(content){
if($(widgets.core.Tooltip._bubble)){
$S(widgets.core.Tooltip._renderDiv,content);
}
},

close:function(){
if(widgets.core.Tooltip._bubble){
mojo.css.display(widgets.core.Tooltip._bubble,false);
}
document.body.onscroll=null;
document.body.onclick=null;
},

isOpen:function(){
return mojo.css.isDisplayed(widgets.core.Tooltip._bubble);
}
}
widgets.core.Tooltip._bubble=null;
widgets.core.Tooltip._renderDiv=null;
widgets.core.Tooltip.events=function(content,onOpen,width,boundsParent,leftOrRight){
if(!width)width=150;
if(!boundsParent)boundsParent='scrollableViewDiv';
if(!onOpen)onOpen='mojo.emptyFunction';
if(!leftOrRight)leftOrRight='right';
return'onmouseout="widgets.core.Tooltip.close()" onmouseover="widgets.core.Tooltip.open(this, \''+content.lescapeQuotes()+'\', '+onOpen+', '+width+', \''+boundsParent+'\', \''+leftOrRight+'\')"';
}

widgets.core.Relationship=Class.create();
widgets.core.Relationship.all={};
widgets.core.Relationship.prototype={
initialize:function(params){
this.wiid='relationship_'+mojo.idGenerator++;
this.them=params.them;
this.mode=params.mode||'linksOut';
this.renderTargetId=params.renderTargetId;
this.notConnectedRenderTargetId=params.notConnectedRenderTargetId||params.renderTargetId;
this.alwaysShowBlock=params.alwaysShowBlock;

this.followCallback=params.followCallback||mojo.emptyFunction;
this.stopFollowingCallback=params.stopFollowingCallback||mojo.emptyFunction;
this.blockCallback=params.blockCallback||mojo.emptyFunction;
this.unblockCallback=params.unblockCallback||mojo.emptyFunction;
this.trackingId=params.trackingId||'relationshipWidget';

var _showingInfo=false;
widgets.core.Relationship.all[this.wiid]=this;
},

getHTML:function(skipEvents,skipInfoLine){
if(lala.user&&lala.user.userToken==this.them.userToken){
return $TC(lt.Relationship.thisIsYou);
}else if(!this.isConnected()){
if(this.them.isPrivate){
return $TC(lt.Relationship.privateLine);
}else{
return $T(lt.Relationship.notConnected)
.replaceToken('wiid',this.wiid)
.removeTokenBlock('BlockBlock',!this.alwaysShowBlock)
.compose();
}
}else{
var html='';
if(this.mode=='linksOut'){
html=$T(lt.Relationship.linksOutSkel)
.replaceToken('relBox',this._getBigBox(skipEvents));
}else if(this.mode=='lite'){
html=$T(lt.Relationship.liteSkel)
.replaceToken('imgClass',this._getArrowsClass())
.replaceToken('bigBox',this._getBigBox(skipEvents));
if(skipInfoLine)html.removeTokenBlock('InfoLine');
}else{
mojo.log.error('invalid relationship box mode: '+this.mode);
return;
}
html.replaceToken('wiid',this.wiid);
html.replaceToken('links',this._getLinks());
return html.compose();
}
},



_getBigBox:function(skipEvents){
var content=$T(lt.Relationship.content)
.replaceToken('wiid',this.wiid)
.replaceToken('imgClass',this._getArrowsClass())
.replaceToken('userName',this.them.nickName.lescapeHTML())
.compose();

var mouseEvents=$T(lt.Relationship.mouseEvents)
.replaceToken('wiid',this.wiid)
.compose();

this._rb=new widgets.core.RoundedBox({
mode:'tinyBorder',
backgroundColor:'#eee',
extraClass:'relationshipBox',
contentHTML:content,
mouseEvents:skipEvents?null:mouseEvents
});

return this._rb.getHTML();
},

_getArrowsClass:function(){
var youArrow='';
if(this.them.isPrivate&&!this.them.isCurrentUserFollowing){
youArrow='youDont';
}else{
if(this.them.isCurrentUserFollowing){
youArrow='youFollow';
}else if(this.them.isCurrentUserBlockedBy){
youArrow='youreBlocked';
}else{
youArrow='youDont';
}
}
var themArrow='';
if(this.them.isCurrentUserFollowedBy){
themArrow='TheyFollow';
}else if(this.them.isCurrentUserBlocking){
themArrow='TheyreBlocked';
}else{
themArrow='TheyDont';
}
return youArrow+themArrow;
},



_getLinks:function(){
var links=$T(lt.Relationship.links)
.replaceToken('wiid',this.wiid)
.replaceToken('userToken',this.them.userToken);

if(this.them.isPrivate&&!this.them.isCurrentUserFollowing){
links.removeTokenBlock('FollowLinkBlock');
links.removeTokenBlock('StopFollowLinkBlock');
}else{
links.removeTokenBlock('DisabledFollowBlock');
if(this.them.isCurrentUserFollowing){
links.removeTokenBlock('FollowLinkBlock');
}else if(this.them.isCurrentUserBlockedBy){
links.removeTokenBlock('FollowLinkBlock');
links.removeTokenBlock('StopFollowLinkBlock');
}else{
links.removeTokenBlock('StopFollowLinkBlock');
}
}

if(this.them.isCurrentUserFollowedBy){
links.removeTokenBlock('UnblockLinkBlock');
}else if(this.them.isCurrentUserBlocking){
links.removeTokenBlock('BlockLinkBlock');
}else{
links.removeTokenBlock('UnblockLinkBlock');
}
return links.compose()
},

render:function(skipEvents,skipInfoLine){



if(!$(this.renderTargetId))return;

if(this.isConnected()){
$S(this.renderTargetId,this.getHTML(skipEvents,skipInfoLine));
}else if(this.renderTargetId&&$(this.renderTargetId)){
$S(this.notConnectedRenderTargetId,this.getHTML(skipEvents,skipInfoLine));
if(this.notConnectedRenderTargetId!=this.renderTargetId){
$S(this.renderTargetId,'');
}
}
},



isConnected:function(){
return(this.them.isCurrentUserFollowing
||this.them.isCurrentUserFollowedBy
||this.them.isCurrentUserBlocking
||this.them.isCurrentUserBlockedBy);
},

onToggleInfo:function(show){
if(!mojo.isDefined(show)){
show=!mojo.css.isDisplayed('extraInfo_'+this.wiid);
}


if(this.mode=='lite'){
if(show||this.isConnected()){
mojo.css.display('bigBox_'+this.wiid,show);
}else{

this.render();
return;
}
}
mojo.css.display('extraInfo_'+this.wiid,show);

var html='';
if(this.them.isCurrentUserFollowing&&this.them.isCurentUserFollowedBy){
html=$T(lt.Relationship.twoWayInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}else{
if(this.them.isPrivate){
html+=$TC(lt.Relationship.privateInfo);
}else if(this.them.isCurrentUserFollowing){
html+=$T(lt.Relationship.youFollowInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}else if(this.them.isCurrentUserBlockedBy){
html+=$T(lt.Relationship.theyBlockInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}else{
html+=$T(lt.Relationship.youDontFollowInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}

if(this.them.isCurrentUserFollowedBy){
html+=$T(lt.Relationship.theyFollowInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}else if(this.them.isCurrentUserBlocking){
html+=$T(lt.Relationship.youBlockInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}else{
html+=$T(lt.Relationship.theyDontFollowInfo)
.replaceToken('userName',this.them.nickName)
.compose();
}
}
$S('extraInfo_'+this.wiid,html);
},

onFollow:function(){
if(frontend.requiresSignin({trackingId:'follow'}))return
var self=this;
api.Friends.follow(
this.them.userToken,
'FRIEND',
function(res){
self.them.isCurrentUserFollowing=true;
self.them.isCurrentUserBlocking=false;
self.render();
self.followCallback(self.them)
},
this.trackingId);
},






onStopFollowing:function(){
var self=this;
api.Friends.stopFollowing(this.them.userToken,function(res){
self.them.isCurrentUserFollowing=false;
self.render();
self.stopFollowingCallback(self.them);
});
},

onBlock:function(){
var self=this;
api.Friends.block(this.them,
function(res){
self.them.isCurrentUserFollowing=false;
self.them.isCurrentUserFollowedBy=false;
self.them.isCurrentUserBlocking=true;
self.render();
self.blockCallback(self.them);
});
},

onUnblock:function(){
var self=this;
api.Friends.unblock(this.them.userToken,
function(res){
self.them.isCurrentUserBlocking=false;
self.render();
self.unblockCallback(self.them);
});
}
}

widgets.core.WidgetEmbed={










open:function(params){
this.title=params.title;
this.type=params.type;
this.shareTitle=params.shareTitle;
this.shareLink=params.shareLink?"http://"+lala.host+params.shareLink:null;
this.footerText=params.footerText;
this.vars=params.vars||{};
this.item=params.item;

this._initializeTypeVars();


this.vars.host=lala.host;
if(this.type=='forecast'){
this.vars.userImageUrlFs=lala.avatarUrlFs;
this.vars.userImageUrlDb=lala.avatarUrlDb;
}
if(lala.isWidgetPartner){
this.vars.partnerId=lala.user.widgetPartnerId;
}else{
this.vars.partnerId='member'+this.type+(lala.user?'.'+lala.user.userToken:'');
}
this.flashvars=mojo.url.buildQueryString(this.vars);

var template={
left:lt.WidgetEmbed.left,
right:lt.WidgetEmbed.right
};

this.embedCode=this._getFlashEmbed();

var subTitle="Let others enjoy this song on your favorite web site.";
var previewEmbedCode=this.embedCode.replace(/width=\"\d+\"/g,"width=\"150\"");
if(this.type!="song"){
subTitle="Let others enjoy these songs on your favorite web site.";
previewEmbedCode=previewEmbedCode.replace(/height=\"\d+\"/g,"height=\"250\"");
}

var d=new MojoDialog({id:'widgetEmbed'});
var leftContent=$T(template.left)
.replaceToken('title',this.title)
.replaceToken('subTitle',subTitle)
.replaceToken('embedCode',this.embedCode)
.compose();

var rightContent=$T(template.right)
.replaceToken('previewEmbedCode',previewEmbedCode)
.compose();

d.open(leftContent,"",false);
},

postToSite:function(service){
switch(service){
case'myspace':

var myspaceEmbed=this.embedCode.replace(/<a.*?>/,"").replace(/<\/a>/,"");
window.open('http://www.myspace.com/index.cfm?fuseaction=postto&t='+encodeURIComponent(this.shareTitle)+'&c='+encodeURIComponent(myspaceEmbed)+'&u='+encodeURIComponent(this.shareLink)+'&l=6','sharer');
break;
case'facebook':
if(this.type=="forecast"){
var canvasPage="lalawidgets";
if(lala.host!="www.lala.com"){
canvasPage="lalawidgetsdev";
}
window.open('http://apps.facebook.com/'+canvasPage,'_blank');
}else{
widgets.core.WidgetEmbed.postThingToFacebook(this.shareLink);
}
break;
case'blogger':

var bloggerEmbed;
var matches;
if(matches=this.embedCode.match(/width=\"(\d+)\"/)){
if(matches[1]>220){
bloggerEmbed=this.embedCode.replace(/width=\"\d+\"/g,"width=\"220\"");
}
}

if(!bloggerEmbed){
bloggerEmbed=this.embedCode;
}

var form=$T(lt.WidgetEmbed.bloggerForm)
.replaceToken('content',bloggerEmbed)
.replaceToken('url',encodeURIComponent(this.shareLink))
.replaceToken('title',this.shareTitle.substr(0,100))
.compose();

var win=window.open('','blogger_share_'+mojo.idGenerator++);
win.document.open('text/html','replace');
win.document.write(form);
win.document.close();
win.focus();
break;
}
},

postSongToTwitter:function(title,link){

var newWin=window.open('http://twitter.com/home?status=%E2%99%AB+'+encodeURIComponent(title)+'+'+encodeURIComponent(link),'twitter_sharer');
newWin.focus();
},


postThingToFacebook:function(link){
var newWin=window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(link),'fb_sharer','toolbar=0,status=0,menubar=0,width=626,height=436');
if(newWin){
newWin.focus();
}else{
lala.showAck('It looks like you\'re using a popup blocker. Enable popups for Lala and try again.');
}
},

onCopyCode:function(textArea){
if(textArea){
textArea.select();
}
},

_initializeTypeVars:function(){
var host=lala.host;
var versionPath=host.indexOf('dhcp')!=-1||host.indexOf('localhost')!=-1?'static':'external';
this.swfUrl='http://'+host+'/'+versionPath+'/flash/';

switch(this.type){
case"forecast":
this.width=150;
this.height=345;
this.swfId="lalaForecastEmbed";
this.swfUrl+="LalaForecastWidget.swf";
break;
case"album":
this.width=300;
this.height=254;
this.swfId="lalaAlbumEmbed";
this.swfUrl+="PlaylistWidget.swf";
break;
case"artist":
this.width=300;
this.height=254;
this.swfId="lalaArtistEmbed";
this.swfUrl+="PlaylistWidget.swf";
this.vars.showAlbumNames=true;
break;
case"playlist":
this.width=300;
this.height=254;
this.swfId="lalaPlaylistEmbed";
this.swfUrl+="PlaylistWidget.swf";
break;
case"song":
this.width=220;
this.height=70;
this.swfId="lalaSongEmbed";
this.swfUrl+="SingleSongWidget.swf";
break;
}
},

_getFlashEmbed:function(){
var footerTextShort="";
if(this.footerText&&this.footerText.length>30){
footerTextShort=this.footerText.substr(0,30)+"...";
}else{
footerTextShort=this.footerText;
}

var html=$T(lt.WidgetEmbed.code)
.replaceToken('swfId',this.swfId)
.replaceToken('swfUrl',this.swfUrl)
.replaceToken('width',this.width)
.replaceToken('height',this.height)
.replaceToken('flashvars',this.flashvars)
.replaceToken('type',this.type)
.replaceToken('footerLink',this.shareLink)
.replaceToken('footerTextShort',footerTextShort)
.replaceToken('footerText',this.footerText)
.compose();

html=html.replace(/\n\s*/g,"");
return html;
}
};



widgets.core.ArtistPicker=Class.create();
widgets.core.ArtistPicker.all={};
widgets.core.ArtistPicker.prototype={
initialize:function(params){
this.wiid=params.id||'artistPicker_'+mojo.idGenerator++;
this.searchBoxId='searchBox_'+this.wiid;

this.boxRenderTargetId=params.boxRenderTargetId||'';
this.resultsRenderTargetId=params.resultsRenderTargetId;



this._pickArtistCallback=params.pickArtistCallback||mojo.emptyFunction;

this.pageSize=params.pageSize||15;
this._autoComplete=null;
widgets.core.ArtistPicker.all[this.wiid]=this;
},




getHTML:function(){
var t=$T(lt.ArtistPicker.searchBox);
t.replaceToken('wiid',this.wiid);
return t.compose();
},


render:function(){
$S(this.boxRenderTargetId,this.getHTML());
this.setUpEvents();
},


setUpEvents:function(){
var offsets={};
var self=this;

this._autoComplete=new widgets.SearchAutoComplete({
inputId:this.searchBoxId,
offsets:offsets,
onRunSearch:function(text,suggestion){
self.onSubmitArtistSearch(suggestion!=null);
}});
mojo.input.clearOnClick(this.searchBoxId);
mojo.input.onEnterKey(this.searchBoxId,this.onSubmitArtistSearch.lbind(this));
},

onSubmitArtistSearch:function(isAutoCompleted){
var self=this;
var artistName=$F('searchBox_'+this.wiid);
if(!artistName)return;

this._autoComplete.hide();

if(isAutoCompleted){
this._pickArtistCallback(artistName);
}else{

api.AutoComplete.artistCheck(
artistName,
function(isArtist,noop,runArtistName){
if(isArtist){
self._pickArtistCallback(runArtistName);
}else{
self.loadAndRenderArtistSearchResults(artistName);
}
});
}
},

loadAndRenderArtistSearchResults:function(artistName){
var self=this;
api.SearchUtils.searchArtists({
Q:artistName.lescapeQuotes(),
skip:0,
count:this.pageSize,
sortKey:'Listens7',
sortDir:'Desc'
},function(res){
var t=$T(lt.ArtistPicker.results,self.resultsRenderTargetId);

t.replaceToken('count',res.data.artists.total);
t.replaceToken('term',artistName);
t.replaceToken('wiid',self.wiid);

if(res.data.artists.total>0){
var artistItems=self._mapToArtistItems(
res.data.artists.list.lpluck('artist')
);
var artistCols=new widgets.core.TextColumns({
numCols:2,
colItemTemplate:lt.ArtistPicker.artistMatch,
extraTokenMap:{wiid:self.wiid}
}).render(artistItems,true);
t.replaceToken('artistColumns',artistCols);
t.removeTokenBlock('NoMatchesBlock');
var paginatorHtml=new widgets.core.Paginator(null,'textOnly')
.render(res,res.data.artists);
t.replaceToken('paginator',paginatorHtml);
}else{
t.removeTokenBlock('MatchesBlock');
}
t.compose();
}
);
},

onChooseArtist:function(artist){
$(this.searchBoxId).value=artist;
this._pickArtistCallback(artist);
},

_mapToArtistItems:function(artists){
return artists.lmap(
function(artist){
return{
artist:artist,
artistJs:artist.lescapeQuotes()
}
});
}
}

widgets.core.postFormat='%B %e at %l:%M %p';

widgets.core.BecauseOfYou=Class.create();
widgets.core.BecauseOfYou.prototype={
initialize:function(params){
this.renderTargetParentId=params.renderTargetParentId;
this.profileUserName=params.profileUserName;
this.profileUserScore=params.profileUserScore;
this.clickTrackingId=params.clickTrackingId||'becauseOfYou';
this.evenMoreLink=params.evenMoreLink;

this.typeEnum={
LISTEN:"recently listened to",
ADD:"added",
PICK:"picked for Forecast"
};
},

render:function(entries){
if(entries.length==0)return;
















var t=$T(lt.BecauseOfYou.main,this.renderTargetParentId+'_content');
t.replaceToken('profileUserName',this.profileUserName?this.profileUserName:'you');
if(this.profileUserScore>0){
t.replaceToken('profileUserScore',mojo.util.addCommasToNumber(this.profileUserScore));
}else{
t.removeTokenBlock('ScoreBlock');
}

var e=t.getTokenBlock('Entry');
var self=this;
entries.leach(function(entry){
e.replaceToken('action',self.typeEnum[entry.type]);
e.replaceToken('shortUserNickName',entry.user.nickName.ltruncate(14));
e.replaceToken('clickTrackingId',self.clickTrackingId);
e.replaceToken('shortSongTitle',entry.track.title.ltruncate(18));
e.replaceTokensWithBean('user',entry.user);
e.replaceTokensWithBean('song',entry.track);
e.next();
});

if(this.evenMoreLink&&(total>list.length)){
var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type','influencers')
.compose();
t.replaceToken('apageLink',linkHtml);
}

t.compose();
}
};

widgets.core.People=Class.create();
widgets.core.People.all={};
widgets.core.People.prototype={
initialize:function(params){
this.renderTargetParentId=params.renderTargetParentId;
this.profileUserToken=params.profileUserToken;
this.clickTrackingId=params.clickTrackingId||'peopleWidget';
this.users=[];
this.total=0;

this.wiid=params.id||'peopleWidget_'+mojo.idGenerator++;
widgets.core.People.all[this.wiid]=this;
},

render:function(following,followedBy,isRerender,tabId){
this.following=following;
this.followedBy=followedBy;

if(this.profileUserToken&&following.total+followedBy.total==0){
this.renderDoubleEmpty(this.renderTargetParentId+'_content');
}else{
$TC(lt.People.main,this.renderTargetParentId+'_content');
this.tabs=mojo.newtabs.create({
divTabsId:'rfTabs',
divTabsContentId:'rfContent'});

this.tabs.add({
id:'followingTab',
title:'Follows '+following.total});
this.tabs.add({
id:'followedByTab',
title:'Followed by '+followedBy.total});
this.tabs.onTabClick=this.onTabClick.lbind(this);
this.tabs.activate(tabId||'followingTab');

if(!isRerender){
mojo.listeners.add(
api.Friends.EVT_FOLLOWING_CHANGED,
this.onFollowingChangedEvent.lbind(this));
mojo.listeners.add(
api.Friends.EVT_FOLLOWERS_CHANGED,
this.onFollowedByChangedEvent.lbind(this));

}
}
},


onFollowingChangedEvent:function(evt){
var tabId;


if(this.profileUserToken&&evt.user.userToken==this.profileUserToken){

if(evt.amountChanged==1){
this.followedBy.list.linsertAt(lala.user,0);
this.followedBy.total++;
tabId='followedByTab';
}else{
this.followedBy.list.lremoveIf('userToken',lala.user.userToken);
this.followedBy.total--;
tabId=this.tabs.active.id;
}
}else if(!this.profileUserToken
||(lala.user&&lala.user.userToken==this.profileUserToken)){
if(evt.amountChanged==1){
this.following.list.linsertAt(evt.user,0);
this.following.total++;
tabId='followingTab';
}else{
this.following.list.lremoveIf('userToken',evt.user.userToken);
this.following.total--;
tabId=this.tabs.active.id;
}
}

this.render(this.following,this.followedBy,true,tabId);
},



onFollowedByChangedEvent:function(evt){
if(evt.amountChanged==-1){

if(this.profileUserToken&&evt.user.userToken==this.profileUserToken){
this.following.list.lremoveIf('userToken',lala.user.userToken);
this.following.total--;
}

else if(!this.profileUserToken||lala.user.userToken==this.profileUserToken){
this.followedBy.list.lremoveIf('userToken',evt.user.userToken);
this.followedBy.total--;
}
}


this.render(this.following,this.followedBy,true,this.tabs.active.id);
},

onTabClick:function(tab){
if(tab.id=='followingTab'){
this.users=this.following.list;
this.total=this.following.total;
}else{
this.users=this.followedBy.list;
this.total=this.followedBy.total;
}

if(this.users.length==0){
this.renderEmptyList(tab);
return;
}

var t=$T(lt.People.recentlyFollowing,tab.contentId)
.replaceToken('userList',
new widgets.UserList({
colCount:2,
clickTrackingId:this.clickTrackingId,
emptyText:'No people to show'
}).getHtml(this.users));

t.replaceToken('viewAllText',this.users.length<this.total
?"View all "+this.total
:"See details");

t.replaceToken('viewAllHrefOnClick',
this.tabs.active.id=='followingTab'
?frontend.link.Following()
:frontend.link.Followers()
);


if(this.profileUserToken){
t.removeTokenBlock('HomePage');
t.replaceToken('userToken',this.profileUserToken);
t.replaceToken('tab',tab.id=='followingTab'
?'following':'followedBy');
}else{
t.removeTokenBlock('ProfilePage');
}
t.compose();
},

renderEmptyList:function(tab){
var t=null;
if(this.profileUserToken){
$T(lt.People.recentlyFollowingEmpty,tab.contentId)
.replaceToken('message',tab.id=="followingTab"
?"This person isn't following anyone yet."
:"Nobody follows this person yet.")
.compose();
}else{
t=$T(lt.People.recentlyFollowingEmpty,tab.contentId)
.replaceToken('message',tab.id=="followingTab"
?"You're not following anyone yet."
:"Nobody follows you yet.");
t.compose();
}
},

renderDoubleEmpty:function(target){
$TC(lt.People.recentlyFollowingDoubleEmpty,target);
}
};

widgets.core.SimplePeopleList=Class.create();
widgets.core.SimplePeopleList.prototype={
initialize:function(params){
this.title=params.title;
this.divId=params.renderTargetId;
},

renderPod:function(users){
var randomId=mojo.idGenerator++;
$T(lt.SimplePeopleList.pod,this.divId)
.replaceToken('title',this.title)
.replaceToken('id',randomId)
.compose();
this.divId='simplePeopleListPod_'+randomId;

this.render(users);
},

render:function(users){


users=users.lclone();

if(users.length==1){
users.push({user:{}});
}

var t=$T(lt.SimplePeopleList.list,this.divId);
var row=t.getTokenBlock('RowBlock');
var user=row.getTokenBlock('UserBlock');

var userIndex=0;
while(userIndex<users.length){
for(var j=0;j<2;j++){
if(userIndex<users.length){
user.replaceTokensWithBean('user',users[userIndex]);
user.next();
userIndex++;
}
}
row.next();
}
t.compose();
}
};


widgets.core.FriendFinder=Class.create();
widgets.core.FriendFinder.all={};
widgets.core.FriendFinder.prototype={
initialize:function(params){
this.wiid=params.id||'friendFinder_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId||'';
this.clickTrackingId=params.clickTrackingId||'friendFinderWidget';


this.layoutMode=params.mode||'wide';

this.findMode=params.mode||'members'

this.foundMembers=null;
this.foundAddresses=null;


this.numFollowed=0;
this.numInvited=0;

this.noWebmailCallback=params.noWebmailCallback||null;

this.onStartCallback=params.onStartCallback||mojo.emptyFunction;

this.onDoneCallback=params.onDoneCallback||mojo.emptyFunction;

this.onStartedStepTwo=params.onStepTwoCallback||mojo.emptyFunction;

this.onWrongPasswordCallback=params.onWrongPasswordCallback||mojo.emptyFunction;



this.switchPage=params.switchPage||false;

this.gotoGetData=MyMusic.g.getGoToPageTransientState();
this.skipAuth=this.gotoGetData&&this.gotoGetData.context=='finder';


this.noFocus=params.noFocus||false;
widgets.core.FriendFinder.all[this.wiid]=this;
this.domains=['gmail.com','aol.com','yahoo.com','hotmail.com'];
},

getHTML:function(){
if(this.skipAuth){
return $T(lt.FriendFinder.skeletonWide)
.replaceToken('wiid',this.wiid)
.compose();
}else{
return this._getFormHTML();
}
},

_getFormHTML:function(){
var split=lala.user.email.split('@');
var userEmail=split[0];
var userDomain=split[1];
userDomain=userDomain.toLowerCase();

var t=$T(lt.FriendFinder.form);
t.replaceToken('wiid',this.wiid);
if(!this.noWebmailCallback){
t.removeTokenBlock('NoWebmailBlock');
}

var option=t.getTokenBlock('OptionBlock');
for(var i=0;i<this.domains.length;i++){
if(this.domains[i]==userDomain){
option.replaceToken('selected','selected');
t.replaceToken('emailAddress',userEmail);
}
option.replaceToken('text',this.domains[i]);
option.replaceToken('value',this.domains[i].lremove('.com'));
option.next();
}

return $T(lt.FriendFinder.skeletonWide)
.replaceToken('content',t.compose())
.replaceToken('wiid',this.wiid)
.compose();
},

render:function(){
$S(this.renderTargetId,this.getHTML());
if(this.skipAuth){
this.onStartCallback();
this.retrieveContactData();
}else{
this.setupHandlers();
}
return this;
},

setupHandlers:function(){
mojo.event.onEnterKey('emailPassword',this.onFormSubmit.lbind(this));

if(!this.noFocus){
if(this.domains.lcontains(lala.user.email.split('@')[1])){
$('emailPassword').focus();
}else{
$('emailName').focus();
}
}
},

onFormSubmit:function(){
var self=this;

var service=$F('webmailServices');
var username=$F('emailName');
var password=$F('emailPassword');

if(mojo.isEmpty(username)){
this._showError('Please enter the username for your email account');
return;
}else if(mojo.isEmpty(password)){
this._showError('Please enter the password for your email account');
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{
this._showError('Please chooose a valid webmail service');
return;
}
}

if(mojo.isEmpty(service)){
this._showError('Please choose a webmail service');
return;
}

this.onStartCallback();
this.showLoading();

this.noFocus=false;

lala.Track.click(this.clickTrackingId+'.getContacts');
api.Friends.getContacts(service,username,password,
function(res){
if(res.data&&res.data!='InternalError'){
self.retrieveContactData();
}else{



if(!$(self.wiid))return;
self._showError('Incorrect username or password');
self.render();
$('emailName').value=username;
$('webmailServices').value=service;
$('emailPassword').value=password;
self.onWrongPasswordCallback();
}
});
},

_showError:function(errorMsg,errorField){
lala.showAck(errorMsg);
},

onNoWebmail:function(){
lala.Track.click(this.clickTrackingId+'.onNoWebMail');
this.noWebmailCallback();
},

retrieveContactData:function(){



if(!$(this.wiid))return;

if(this.switchPage){
MyMusic.g.setGoToPageTransientState('finder','skipAuth');
MyMusic.g.gotoPage('people/finder');
return;
}


this.showLoading();
var self=this;
api.Friends.getContactData(
function(res){
res.data=mojo.evalJson(res.data);
self.onStartedStepTwo();

if(res.data.members.length==0&&res.data.emails.length==0){
self.renderNoContactsFound();
self.onDoneCallback();
}else{
self.foundMembers=res.data.members;
self.foundAddresses=res.data.emails;
if(self.findMode=='members'){
self.renderFoundMembers();
}else{
self.renderFoundAddresses();
}
}
});
},

renderNoContactsFound:function(){
var rb=new widgets.core.RoundedBox({
renderTargetId:this.wiid,
mode:'border',
backgroundColor:'#fff',
width:'430px',
id:'ackBox'
}).render();

$TC(lt.FriendFinder.noContacts,rb.contentId);
},

renderFoundMembers:function(){
if(!this.foundMembers||this.foundMembers.length<=0){
this.continueFriends();
return;
}
var t=$T(lt.FriendFinder.members,this.wiid);
t.replaceToken('wiid',this.wiid);
t.replaceToken('num',this.foundMembers.length);
var user=t.getTokenBlock('UserBlock');
var self=this;
this.foundMembers.leach(function(member,index){
if(!member.email.name)user.removeTokenBlock('EmailNameBlock');
if(!member.user.location)user.removeTokenBlock('LocationBlock');
if(!member.user.uniqueFact)user.removeTokenBlock('AboutBlock');

user.replaceTokensWithBean('user',member.user);
user.replaceToken('email.name',member.email.name);
user.replaceToken('email.address','&lt;'+member.email.address+'&gt;');

user.setEmptyTokenText('&nbsp;');
user.next();
});
return t.compose();
},

renderFacebookMembers:function(fbUsers,total){
var t=$T(lt.FriendFinder.facebookMembers);
t.replaceToken('facebookImgUrl',lala.user.facebookImgUrl);
t.replaceToken('wiid',this.wiid);
t.replaceToken('num',total);
t.replaceToken('areOrIs',total==1?'is':'are');
t.removeTokenBlock('NotFollowingBlock',this.foundMembers.length==total||total==1);
var user=t.getTokenBlock('UserBlock');
this.foundMembers.leach(function(lalaUser,index){
lalaUser.user=lalaUser;
var member=fbUsers[index];
user.replaceToken('name',member.name);
var affiliations=member.affiliations;
user.replaceToken('location',affiliations.length>0?affiliations.lpluck('name').join(', '):'');
user.replaceToken('facebookImg',member.pic_square_with_logo||'http://static.ak.connect.facebook.com/pics/q_silhouette_logo.gif');
user.replaceToken('nickName',lalaUser.nickName);
user.replaceToken('user.userToken',lalaUser.userToken);
user.next();
});
return t.compose();
},

selectAllNoneFriends:function(){
var self=this;
var onOff=$('friendsAllNone'+"_"+this.wiid).checked;
this.foundMembers.leach(function(member){
$('check_'+member.user.userToken+"_"+self.wiid).checked=onOff;
});
},

onFollow:function(btn){
var self=this;
btn.onclick=null;
var tokensToFollow=[];
this.foundMembers.leach(function(member){
if($('check_'+member.user.userToken+"_"+self.wiid).checked){
tokensToFollow.ladd(member.user.userToken);
}
});

this.numFollowed=tokensToFollow.length;
if(this.numFollowed>0){
var self=this;
api.Friends.followBatch(tokensToFollow,function(res){
var personOrPeople=self.numFollowed==1?' person':' people';
btn.parentNode.innerHTML=self.numFollowed+personOrPeople+' followed';
window.setTimeout(self.continueFriends.lbind(self),1000)
});
}else{
this.continueFriends();
}
},

onSkipFriends:function(){
this.continueFriends();
},

continueFriends:function(){
if(this.findMode=='members'){
this.renderFoundAddresses();
}else{
this.renderAck();
}
},

renderFoundAddresses:function(){
if(!this.foundAddresses||this.foundAddresses.length<=0){
this.continueInvites();
return;
}

var t=$T(lt.FriendFinder.addresses,this.wiid);
t.replaceToken('wiid',this.wiid);
var email=t.getTokenBlock('EmailBlock');
this.foundAddresses.leach(function(address,index){
email.replaceTokensWithBean('email',address);
email.replaceToken('email.address','&lt;'+address.address+'&gt;');
email.replaceToken('index',index);
email.next();
});
t.replaceToken('num',this.foundAddresses.length);
t.replaceToken('s',this.foundAddresses.length==1?'':'s');
t.compose();
},

selectAllNoneEmails:function(){
var onOff=$('emailsAllNone').checked;
this.foundAddresses.leach(function(email,index){
$('email_'+index).checked=onOff;
});
},

onInvite:function(btn){
btn.onclick=null;
var emailsToInvite=[];
this.foundAddresses.leach(function(email,index){
if($('email_'+index).checked){
emailsToInvite.ladd(email.address);
}
});

this.numInvited=emailsToInvite.length;
if(this.numInvited>0){
var note=$F('personalMessage');
if(note=='')note=' ';
var self=this;
api.Email.sendInvites(emailsToInvite,note,function(res){
btn.parentNode.innerHTML='You invited '+self.numInvited+' of your contacts';
window.setTimeout(self.continueInvites.lbind(self),1000);
});
}else{
this.continueInvites();
}
},

onSkipInvites:function(){
this.continueInvites()
},

continueInvites:function(){
if(this.findMode=='invite'){
this.renderFoundMembers();
}else{
this.renderAck();
}
},

renderAck:function(){
var rb=new widgets.core.RoundedBox({
renderTargetId:this.wiid,
mode:'border',
backgroundColor:'#fff',
width:'430px',
id:'ackBox'
}).render();

var t=$T(lt.FriendFinder.ack,rb.contentId);
var title='';
var peoplePerson=this.numFollowed==1?'person':'people';
if(this.numFollowed>0&&this.numInvited>0){
title=$T(lt.FriendFinder.invitesAndMembersAck)
.replaceToken('numMembers',this.numFollowed)
.replaceToken('numInvites',this.numInvited)
.replaceToken('peoplePerson',peoplePerson)
.compose();
}else if(this.numFollowed>0){
title=$T(lt.FriendFinder.justMembersAck)
.replaceToken('numMembers',this.numFollowed)
.replaceToken('peoplePerson',peoplePerson)
.compose();
t.removeTokenBlock('InviteText');
}else if(this.numInvited>0){
title=$T(lt.FriendFinder.justInvitesAck)
.replaceToken('numInvites',this.numInvited)
.compose();
}else{
title=$TC(lt.FriendFinder.nothingAck);
t.removeTokenBlock('InviteText');
}

t.replaceToken('title',title);
t.compose();
this.onDoneCallback();
},

showLoading:function(){
$TC(lt.FriendFinder.loadingContacts,this.wiid);
}

};

widgets.core.InfluencerSampler=Class.create();
widgets.core.InfluencerSampler.prototype={
initialize:function(){
var self=this;
this.artistPicker=new widgets.core.ArtistPicker({
resultsRenderTargetId:'influencers',
boxRenderTargetId:'artistSearchBox',
pickArtistCallback:function(artistName){
self.artist=artistName;
self.loadAndRenderInfluencerSampler();
}
});

this.dialog=null;

this.influencerMode='genre';
widgets.core.InfluencerSampler.g=this;
},

onOpenInfluencers:function(){
lala.Track.click('feed.influencers.open');

this.dialog=new MojoDialog({
id:'samplerPopup'
})
this.dialog.open($TC(lt.InfluencerSampler.skel));
$TC(lt.InfluencerSampler.influencersPane,'influencerSampler');
this.onSwitchToGenre();
},

onSwitchToGenre:function(){
mojo.autocomplete.hide();
this.influencerMode='genre';

var controls=$T(lt.InfluencerSampler.findInfluencerByGenre,'influencerControls');
var genreOption=controls.getTokenBlock('GenreOptionBlock');
DataModel.g.getAllGenres().leach(function(genre){
genreOption.replaceToken('genre',genre);
genreOption.next();
});
controls.compose();

this.loadAndRenderInfluencerSampler();
},

loadAndRenderInfluencerSampler:function(){
$D('influencerBottomButtons',true);
$S('influencerPager','');

var Q='';
var selectedGenreOption='';
if(this.influencerMode=='genre'){
selectedGenreOption=$F('influencerGenreSelect');
Q=this.getGenreInfluencerQ(selectedGenreOption);
}else if(this.influencerMode=='artist'){
Q=this.getArtistInfluencerQ(this.artist);
}else{
mojo.log.error('error loading influencers: invalid mode');
return;
}

this.showInfluencerLoading();

var self=this;
var currMode=this.influencerMode;
var callback=function(res){
window.setTimeout(function(){

if(!$('influencerPager'))return;

if(self.influencerMode!=currMode)return;

var users=res.data.list;
if(users.length<1){
var emptyTmpl=lt.InfluencerSampler[self.influencerMode+'EmptyInfluencers'];
if(currMode=='genre'&&selectedGenreOption=='recommended'){
emptyTmpl=lt.InfluencerSampler.recommendedEmptyInfluencers;
}
$TC(emptyTmpl,'influencers');
}else{
var t=$T(lt.InfluencerSampler.influencers,'influencers');
var row=t.getTokenBlock('RowBlock');
var userBlock=row.getTokenBlock('UserBlock');

var userIndex=0;
while(userIndex<users.length){
for(var j=0;j<2;j++){
if(userIndex<users.length){
var user=users[userIndex].user;
userBlock.replaceTokensWithBean('user',user);
userBlock.replaceToken('artistList',user.artistList);
userBlock.removeTokenBlock('ArtistsBlock',!user.artistList);
if(!user.isCurrentUserBlockedBy){
var button=(user.isCurrentUserFollowing)
?$T(lt.InfluencerSampler.stopFollowingButton)
:$T(lt.InfluencerSampler.followButton);
button=button.replaceToken('user.userToken',user.userToken)
.compose();
userBlock.replaceToken('button',button);
}

userBlock.next();
userIndex++;
}
}
row.next();
}
t.compose();

var pager=new widgets.core.Paginator('influencerPager','superLite',null,null,null,null,false);
pager.render(res,res.data);
pager.onBeforePage=self.showInfluencerLoading.lbind(self);
}
},600);
}

if(selectedGenreOption=='featured'){
api.SearchUtils.getEditorialInfluencers({},callback);
}else{
var recommended=false;
if(selectedGenreOption=='recommended'){
Q='filter: +full';
recommended=true;
}
api.SearchUtils.getInfluencers({
Q:Q,
count:6,
skip:0,
excludeFriends:true,
recommended:recommended
},callback);
}
},

onFollow:function(userToken){
api.Friends.follow(
userToken,
'INFLUENCER',
function(res){
var followSpan=$('followButton_'+userToken);
if(followSpan){
$T(lt.InfluencerSampler.stopFollowingButton,followSpan.id)
.replaceToken('user.userToken',userToken)
.compose();
}

if($F('influencerGenreSelect')=='featured'){
lala.Track.click('peopleActions.followFeatured');
}
},
'feed');
},

onStopFollowing:function(userToken){
api.Friends.stopFollowing(
userToken,
function(res){
var followSpan=$('followButton_'+userToken);
if(followSpan){
$T(lt.InfluencerSampler.followButton,followSpan.id)
.replaceToken('user.userToken',userToken)
.compose();
}
},
'feed');
},

onChangeInfluencerGenre:function(){
this.showInfluencerLoading();
this.loadAndRenderInfluencerSampler();
},

getGenreInfluencerQ:function(genre){
return'filter: +full genre: "'+genre+'"';
},

getArtistInfluencerQ:function(artist){
return'filter: +full artist: "'+artist+'"';
},

onSwitchToArtist:function(){
this.influencerMode='artist';
$TC(lt.InfluencerSampler.findInfluencerByArtist,'influencerControls');
this.artistPicker.render();
$S('influencers','');
},

showInfluencerLoading:function(){
$TC(lt.InfluencerSampler.loadingInfluencers,'influencers')
},

showButtons:function(show){
if(!mojo.isDefined(show))show=true;
mojo.css.show('influencerBottomButtons');
}
};


widgets.core.Forecast={
DEFAULT_COMMENT:'Tell your followers why you\'re adding this song.',
openPickDialog:function(pickSong){
if(frontend.requiresSignin())return;

var self=this;
api.LalaForecast.getSongs(
lala.user.userToken,
function(res){
self.forecastSongs=res.data;
self.render(pickSong);
});
},

openHelpDialog:function(clickTrackingId){
lala.Track.click('openCreateForecastDialog.'+clickTrackingId);

var dialog=new MojoDialog({
id:'forecastHelpDialog'
});
dialog.open($TC(forecastHelpDialogContent));
},

render:function(pickSong){
var songs=this.forecastSongs;
this.song=pickSong;

var firstTime=!DataModel.g.getUserPreference('hasPickedForecast',false)&&songs.length<=0;
DataModel.g.setUserPreference('hasPickedForecast',true);

var title=firstTime
?'You\'ve just picked the first song for your Music Forecast!'
:'Adding new pick to your Forecast';

var id=firstTime?'forecastWideDialog':"forecastDialog";

var dialog=
new MojoDialog(
{id:id,
title:title});
var t=$T(lt.Core.addPickDialog);
if(!firstTime)t.removeTokenBlock('FirstTimeBlock');
if(songs.length<4){
t.removeTokenBlock('ReplaceSongsBlock');
}else{
var iter=t.getTokenBlock('ReplaceSongsBlock').getTokenBlock('SongBlock');
songs.leach(function(song,oldIndex,isLast){
iter.replaceToken('title',song.title.lescapeHTML())
iter.replaceToken('artist',song.artist)
iter.replaceToken('index',oldIndex)
if(isLast){
iter.replaceToken('checked','checked');
}
iter.next();
});
}
t.replaceTokensWithBean('song',this.song)
.replaceToken('defaultComment',this.DEFAULT_COMMENT);
dialog.onOpen=function(){
mojo.input.clearOnClick('pickSongComment');
}
dialog.open(t.compose());

},

toggleComment:function(){
mojo.css.toggleDisplay('pickSongComment');
mojo.css.toggleDisplay('pickSongCharsLeft','inline');
},

onSubmitAddSong:function(){
var self=this;
var song=this.song;

var comment=$F('pickSongComment');
if(comment==this.DEFAULT_COMMENT){
comment=null;
}else if(comment.length>100){
lala.showAck('Comment too long, please edit');
return;
}
if(this.forecastSongs.length<4){
api.LalaForecast.addSong(
{song:song,comment:comment},
this.onForecastUpdated.lbind(this));
}else{
var oldSongIndex=parseInt(mojo.form.getRadioValue('replaceSong'));
var oldSong=this.forecastSongs[oldSongIndex];
api.LalaForecast.replaceSong(
{oldSong:oldSong,
newSong:song,
comment:comment},
this.onForecastUpdated.lbind(this));
}
},

onForecastUpdated:function(){
MojoDialog.close();
},

editComment:function(song){
var d=new MojoDialog({id:'forecastEditCommentDialog'});
var html=$T(lt.Core.forecastEditComment)
.replaceTokensWithBean('song',song)
.replaceToken('charsLeft',100-song.comment.length)
.compose();
d.open(html,'Edit your comment');
this.song=song;
},

onSubmitEdit:function(){
var self=this;
var song=this.song;

var comment=$F('forecastEditTextArea');
if(comment.length>100){
lala.showAck('Comment too long, please edit');
return;
}

api.LalaForecast.changeSongComment(
{song:song,
comment:comment},
function(res){
self.onForecastUpdated();
});
},

remove:function(song){
var d=new MojoDialog({id:'forecastRemoveSongDialog'});
var html=$T(lt.Core.forecastRemove)
.replaceTokensWithBean('song',song)
.compose();
d.open(html,'Confirm delete song');
this.song=song;
},

onSubmitRemove:function(){
var song=this.song;
var self=this;
api.LalaForecast.deleteSong(
{song:song},
function(res){
self.onForecastUpdated();
});
}

};

widgets.core.HelpBubble={
toggle:function(contentId,qMark,event,dir,ie6TopOffset){
event=mojo.event.create(event);
event.stopPropagation();
if($('helpBubbleWidgetContent_'+contentId)
&&widgets.core.Tooltip.isOpen()){
widgets.core.HelpBubble.close();
}else{
var offsets=null;
if(ie6TopOffset){
offsets={top:parseInt(ie6TopOffset)};
}
widgets.core.HelpBubble.open(contentId,qMark,dir,offsets);
}
},

open:function(contentId,qMark,dir,ie6Offsets){
if(!dir)dir='left';
lala.Track.clientPageInteraction('widget.HelpBubble.'+contentId);
var content=$T(lt.HelpBubble.bubble)
.replaceToken('contentId',contentId)
.replaceToken('content',$TC(lt.HelpBubble[contentId]))
.compose();
widgets.core.Tooltip.open(qMark,content,null,200,'body',dir,ie6Offsets);
document.body.onclick=function(event){widgets.core.HelpBubble.close(event)};
},

close:function(event){

if(event){
event=mojo.event.create(event);
if(event.target.id.lstartsWith('helpBubble'))return;
}
document.body.onclick=null;
widgets.core.Tooltip.close();
}
};

widgets.core.HelpBubble.qMark=function(contentId,dir,ie6TopOffset){
return $T(lt.HelpBubble.qMark)
.replaceToken('contentId',contentId)
.replaceToken('dir',dir)
.replaceToken('ie6TopOffset',ie6TopOffset)
.compose();
};

widgets.core.versionMenu=Class.create();
widgets.core.versionMenu.all={};
widgets.core.versionMenu.prototype={
initialize:function(params){
this.onVersionClickOverride=params.onVersionClick;
this.elemId=params.elemId;
this.selectedAlbum=params.selectedAlbum;
this.versions=params.versions;
this.offsets=params.offsets;

this.wiid='versionMenu_'+mojo.idGenerator++;

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

open:function(evt){
var self=this;
var w=mojo.pulldown.create(
{id:'versionMenuPulldown',
target:this.elemId,
animate:false,
openBelowTarget:this.elemId,
disableOnClick:true
});
if(w.isVisible()){
w.close();
if(w.getTarget()==$(this.elemId))return;
}

w.onBeforeOpen=function(div){
var rb=new widgets.core.RoundedBox({
renderTargetId:'versionMenuPulldown',
mode:'dropShadow'
}).render();

var vt=$T(lt.Core.versionMenu,rb.contentId);
var verBlock=vt.getTokenBlock('VersionBlock');
self.versions.leach(function(version,index){
if(index==0)verBlock.replaceToken('firstOne','firstOne');
if(version.discId==self.selectedAlbum.id)return;
verBlock.replaceTokensWithBean('version',version);
verBlock.replaceToken('num',index+1);
verBlock.replaceToken('index',index);
verBlock.replaceToken('wiid',self.wiid);
if(version.isExplicit){
verBlock.replaceToken('extraInfo','(Explicit)');
}
verBlock.replaceToken('groupId',self.selectedAlbum.groupId);
verBlock.next();
});
vt.compose();
}
var offsets={scrollId:'scrollableViewDiv'};
if(this.offsets){
Object.extend(offsets,this.offsets);
}
w.open(offsets,true);
evt=mojo.event.create(evt);
evt.stopPropagation();
},

onVersionClick:function(index){
var version=this.versions[index];
if(this.onVersionClickOverride){
this.onVersionClickOverride(version);
}else{
frontend.go.Album(version.discId,version.title);
}
}
};

widgets.core.friendOrMemberSelectorDialog={
open:function(evt,contextualElemId,onSelectFriend){
if(frontend.requiresSignin())return;
var self=this;
new MojoEvent(evt).stopPropagation();
var d=new MojoDialog({
id:'friendOrMemberSelectorDialog',
contextualElemId:contextualElemId
});

d.onOpen=function(){


$S('friendOrMemberSelectorDialogContent','<div style="height:230px">&nbsp;</div>');
new widgets.FriendOrMemberSelector({
singleSelect:true,
renderTargetId:'friendOrMemberSelectorDialogContent',
pickerHeadingText:'Select a Lala member',
onSelectFriend:onSelectFriend})
.showFriends();
};
d.onClose=function(){document.onclick=null;}
window.setTimeout(function(){
d.open($TC(lt.Core.friendOrMemberSelectorDialog));
},20);
}
};

CommentWideWidget=Class.create();
CommentWideWidget.all={};
CommentWideWidget.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.onSubmitCallback=params.onSubmit;
this.onEditThreadCallback=params.onEditThread||mojo.emptyFunction;
this.onEditCommentCallback=params.onEditComment||mojo.emptyFunction;
this.onDeleteThreadCallback=params.onDeleteThread||mojo.emptyFunction;
this.onDeleteCommentCallback=params.onDeleteComment||mojo.emptyFunction;
this.onBeforeDisplay=params.onBeforeDisplay||mojo.emptyFunction;
this.wiid=params.id||'commentWideWidget_'+mojo.idGenerator++;

CommentWideWidget.all[this.wiid]=this;
},

getHtml:function(total,list){
this.comments={
total:total||0,
list:list||[]
};
var self=this;
var t=$T(lt.CommentWide.item);
for(var i=0;i<this.comments.list.length;i++){
var comment=this.comments.list[i];
t.replaceTokensWithBean('comment',comment)
.replaceToken('commentText',$T(lt.CommentWide.commentText).replaceTokensWithBean('comment',comment).compose())
.replaceToken('timeAgo',comment.createTime.lgetDaysAgoLabel('Today',
false,
false,
widgets.core.postFormat))
.replaceToken('num',i+1)
.replaceToken('wiid',self.wiid)
.replaceToken('editDelete',this.renderEditDeleteComment(comment))
.next();
}
var commentsHtml=t.compose();
return $T(lt.CommentWide.main)
.replaceToken('defaultComment',api.Gifts.DEFAULT_COMMENT)
.replaceToken('commentsText',this.getToggleCommentsText(this.comments.total))
.replaceToken('noCommentsClass',this.comments.total<=0?'noComments':'')
.replaceToken('comments',commentsHtml)
.replaceToken('wiid',this.wiid)
.compose();
},

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

renderMessage:function(message,hideTime){
return $T(lt.CommentWide.item)
.replaceTokenBlock('FromBlock',$T(lt.CommentWide.commentText).replaceTokensWithBean('comment',message).compose())
.removeTokenBlock('SecondRow')
.replaceTokensWithBean('comment',message)
.replaceToken('timeAgo',hideTime?'':message.createTime.lgetDaysAgoLabel('Today',false,false,widgets.core.blurbFormat))
.replaceToken('wiid',this.wiid)
.compose();
},

renderEditDeleteThread:function(message){
if(message.canEdit||message.canDelete){
return $T(lt.CommentWide.editDeleteThread)
.replaceToken('editThread',message.canEdit?'':'lnone')
.replaceToken('deleteThread',message.canDelete?'':'lnone')
.replaceToken('wiid',this.wiid)
.compose();
}else{
return"";
}
},

renderEditDeleteComment:function(message){
if(message.canEdit||message.canDelete){
return $T(lt.CommentWide.editDeleteComment)
.replaceToken('editComment',message.canEdit?'':'lnone')
.replaceToken('deleteComment',message.canDelete?'':'lnone')
.replaceToken('wiid',this.wiid)
.replaceToken('msgToken',message.msgToken)
.compose();
}else{
return"";
}
},

deleteComment:function(msgToken){
this.comments.total--;
this.comments.list.lremoveIf("msgToken",msgToken);
this.render(this.comments.total,this.comments.list);
this.displayComments(true);
},

getToggleCommentsText:function(total){
return total>0
?'Show comments ('+total+')'
:'No comments';
},

toggleComments:function(){
if(this.comments.total==0)return;


var shouldDisplay=!mojo.css.isDisplayed('comments_'+this.wiid);

if(shouldDisplay&&this.comments.list.length==0){

this.onBeforeDisplay();
}else{
this.displayComments(shouldDisplay);
}
},

displayComments:function(shouldDisplay){
if(!mojo.isDefined(shouldDisplay)){
shouldDisplay=true;
}
$D('comments_'+this.wiid,shouldDisplay);
$S('toggleComments_'+this.wiid,
shouldDisplay?'Hide comments'
:this.getToggleCommentsText(this.comments.total));
},

toggleSubmitComment:function(){
if(frontend.requiresSignin({trackingId:'blurbs'}))return;

this.displaySubmitComment(!mojo.css.isDisplayed('comment_'+this.wiid));
},

displaySubmitComment:function(shouldDisplay){
if(!mojo.isDefined(shouldDisplay)){
shouldDisplay=true;
}
if(shouldDisplay){
mojo.input.clearOnClick('comment_'+this.wiid+'_textArea');
}
$D('comment_'+this.wiid,shouldDisplay);
if(shouldDisplay){
$('comment_'+this.wiid+'_textArea').focus();
}
},

onSubmit:function(){
var comment=$F('comment_'+this.wiid+'_textArea');
if(comment==api.Gifts.DEFAULT_COMMENT||comment.ltrim()=='')return;
this.onSubmitCallback(comment);
},

onEditThread:function(){
this.onEditThreadCallback();
},

onEditComment:function(msgToken){
this.onEditCommentCallback(msgToken);
},

onDeleteThread:function(){
this.onDeleteThreadCallback();
},

onDeleteComment:function(msgToken){
this.onDeleteCommentCallback(msgToken);
}
};

CommentWidget=Class.create();
CommentWidget.all={};
CommentWidget.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.onSubmitCallback=params.onSubmit;
this.onClose=params.onClose;
this.hideActions=params.hideActions;
this.defaultComment=params.defaultComment;
this.wiid=params.id||'commentWidget_'+mojo.idGenerator++;
CommentWidget.all[this.wiid]=this;
},

render:function(){
return $T(lt.CommentNarrow.main,this.renderTargetId)
.replaceToken('defaultComment',this.defaultComment)
.replaceToken('wiid',this.wiid)
.replaceToken('hideActions',this.hideActions?'lnone':'')
.compose();
},

onCommentClick:function(){
$D('commentActions_'+this.wiid,false);
$D('commentContainer_'+this.wiid);
mojo.input.clearOnClick(this.wiid+'_textArea');
},

onCancel:function(){
$D('commentActions_'+this.wiid);
$D('commentContainer_'+this.wiid,false);
},

onSubmit:function(){
var msgText=$F(this.wiid+'_textArea');
if(msgText&&msgText!=api.Gifts.DEFAULT_COMMENT){
this.onSubmitCallback(msgText,this.onSubmitResponse.lbind(this));
}
},

onSubmitResponse:function(){
$D('commentContainer_'+this.wiid,false);
$D('commentSent_'+this.wiid);
var self=this;
window.setTimeout(function(){
if($('commentSent_'+self.wiid)){
$D('commentSent_'+self.wiid,false);
}
self.onCancel();
},2000);
}
};

InfluencerListWidget=Class.create();
InfluencerListWidget.all={};
InfluencerListWidget.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.layout=params.layout||'lastListen';
this.context=params.context;
this.wiid=params.id||'influencerListWidget_'+mojo.idGenerator++;

InfluencerListWidget.all[this.wiid]=this;
},

render:function(pagedList){
if(mojo.isDefined(pagedList.total)){
this.users=pagedList.list;
this.total=pagedList.total;
this.skip=pagedList.skip;
}else{
this.users=pagedList;
this.total=pagedList.length;
this.skip=0;
}

if(this.total==0){
$TC('No influencers',this.renderTargetId);
}else{
switch(this.layout){
case'influential':
this.renderInfluential();
break;
case'artistListen':
this.renderArtistListen();
break;
case'lastListen':
default:
this.renderLastListen();
break;
}
}
},





renderInfluential:function(){
var t=$T(lt.InfluencerList.influential,this.renderTargetId);
var row=t.getTokenBlock('Influencer');
var context=this.context;
this.users.leach(function(influencer,index){
var fw=new widgets.core.Relationship({
mode:'lite',
them:influencer.user,
renderTargetId:'followWidget_'+index
});
row.replaceTokensWithBean('user',influencer.user)
.replaceToken('nickNameClassName',influencer.user.isEmployee?'lemployeelink':'')
.replaceToken('influencerScore',mojo.util.addCommasToNumber(influencer.user.influencerScore))
.replaceToken('points',mojo.util.addCommasToNumber(influencer.score));
if(!context){
row.removeTokenBlock('ContextBlock');
}else{
row.replaceToken('context',context);
}
row.replaceToken('topGenres',influencer.user.genreList)
.replaceToken('topArtists',influencer.user.artistList)
.replaceToken('index',index)
.replaceToken('followWidget',fw.getHTML())
.next();
});
t.compose();
},







renderArtistListen:function(){
var t=$T(lt.InfluencerList.artistListen,this.renderTargetId);
var row=t.getTokenBlock('Influencer');
var context=this.context;
this.users.leach(function(influencer,index){
var listenCount=influencer.A;
var user=influencer.B;
var fw=new widgets.core.Relationship({
mode:'lite',
them:user,
renderTargetId:'followWidget_'+index
});
row.replaceTokensWithBean('user',user)
.replaceToken('nickNameClassName',user.isEmployee?'lemployeelink':'')
.replaceToken('topGenres',user.genreList)
.replaceToken('topArtists',user.artistList)
.replaceToken('listenCount',mojo.util.formatNumber(listenCount))
.replaceToken('s',listenCount==1?'':'s')
.replaceToken('index',index)
.replaceToken('followWidget',fw.getHTML());
if(context.artist){
row.removeTokenBlock('AlbumLink')
.removeTokenBlock('TitleText')
.getTokenBlock('ArtistLink')
.replaceToken('artist',context.artist);
}else if(context.album){
row.removeTokenBlock('ArtistLink')
.removeTokenBlock('TitleText')
.getTokenBlock('AlbumLink')
.replaceTokensWithBean('album',context.album);
}else if(context.title){
row.removeTokenBlock('ArtistLink')
.removeTokenBlock('AlbumLink')
.getTokenBlock('TitleText')
.replaceToken('title',context.title);
}
row.next();
});
t.compose();
},

renderLastListen:function(){
var t=$T(lt.InfluencerList.lastListen,this.renderTargetId);
var row=t.getTokenBlock('Influencer');
row.dateFormatString="%b %e at %l:%M %p";
var self=this;
this.users.leach(function(influencer,index){
var user=influencer.B;
var fw=new widgets.core.Relationship({
mode:'lite',
them:user,
renderTargetId:'followWidget_'+index
});
row.replaceTokensWithBean('user',user)
.replaceTokensWithBean('lastListen',user.lastListen)
.replaceToken('nickNameClassName',user.isEmployee?'lemployeelink':'')
.replaceToken('index',index)
.replaceToken('wiid',self.wiid)
.replaceToken('followWidget',fw.getHTML())

if(user.lastListen&&user.lastListen.lastListenTimestamp&&parseInt(user.lastListen.lastListenTimestamp)>0){
row.replaceToken('lastListenDate',new Date(parseInt(user.lastListen.lastListenTimestamp)))
}else{
row.removeTokenBlock('LastListenBlock');
}
row.next();
});
t.compose();
},

playLastListen:function(index){
var song=this.users[index].B.lastListen;
Player.g.playSong(song);
}
};




PromoWidget=Class.create();
PromoWidget.all={};
PromoWidget.prototype={
initialize:function(params){
this.wiid=params.id||'promoWidget_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.blobId=params.blobId;

this.promoArr=[];

this.CACHE_DURATION=1000*60*60;
this.timeToExpireCache=new Date().getTime();

PromoWidget.all[this.wiid]=this;
},


loadAndRender:function(promoId,previewMode){
var self=this;


if(!previewMode&&new Date().getTime()<this.timeToExpireCache){
this.render(promoId);
}else{

var onResponse=function(res){
self._init(mojo.evalJson(res.data),previewMode);
self.render(promoId);
};

if(previewMode){

api.Content.getClientBlobForPreview(
'PromoWidgets',this.blobId,onResponse);
}else{
api.Content.getClientBlob(
'PromoWidgets',this.blobId,onResponse);
}
}
},

_init:function(promoData,previewMode){
if(promoData){
var data;
for(var promo in promoData){
data=promoData[promo];
if(!previewMode
&&data.id=='FacebookConnect'
&&lala.user
&&lala.user.facebookId){

}else{
this.promoArr.push(data);
}
}
}

if(!previewMode){
this._scrubPromos();
this.timeToExpireCache=new Date().getTime()+this.CACHE_DURATION;
}
this.cursor=this.promoArr.lrandomIndex();
},


_scrubPromos:function(){
for(var i=this.promoArr.length-1;i>=0;i--){
var promo=this.promoArr[i];
var now=new Date().getTime();
var isLive=true;

if(promo.date){
var start=promo.date.start.getTime();
var end=promo.date.end.getTime();
if(start>now||end<now){
isLive=false;
}
}
if(!promo.isPublished||!isLive){
this.promoArr.lremoveAt(i);
}
}
},








getHtml:function(promoId){

if(promoId&&!this.promoArr.lcontainsAttr('id',promoId)){
promoId=null;
}

var hideCloseButton=false;

if(!promoId){
promoId=this._getPromoId();
}else{
hideCloseButton=true;
}

var html='';
if(promoId){
lala.Track.clientPage('widget.Promos.viewed.'+promoId);

var promo=this.promoArr.lfindObject('id',promoId);
this.generateClientData(promo);

html=$T(lt.PromoWidgets.skel)
.replaceTokensWithBean('text',promo.text)
.replaceToken('target',promo.path?'':"target='_blank'")
.replaceToken('href',promo.clientHref)
.replaceToken('imgSrc',promo.clientImgSrc)
.replaceToken('hideCloseButton',hideCloseButton?'display:none':'')
.replaceToken('wiid',this.wiid)
.replaceToken('promoId',promoId)
.replaceToken('displayNav',this.promoArr.length>1?'':'lnone')
.compose();
}
return html;
},

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

generateClientData:function(promo){
var href='javascript:void 0';
var imgSrc='images/lala_logo_dark_blue.gif';
var path=frontend.path.Home(this.clickTrackingId+'.error.clicked');

switch(promo.link.type){
case'album':
href=frontend.url.Album(promo.link.data,null,this.clickTrackingId);
imgSrc=frontend.img.Album(promo.link.data,'small');
path=frontend.path.Album(promo.link.data,null,this.clickTrackingId);
break;
case'artist':
href=frontend.url.Artist(promo.link.data,null,this.clickTrackingId);
if(promo.image.path){
imgSrc=lala.Servlet.UserImage+'?path='+promo.image.path;
}
path=frontend.path.Artist(promo.link.data,null,this.clickTrackingId);
break;
case'page':
href=frontend.url[promo.link.data]();
if(promo.image.path){
imgSrc=lala.Servlet.UserImage+'?path='+promo.image.path;
}
path=frontend.path[promo.link.data]();
break;
case'custom page':
href=frontend.url.Content(promo.link.data);
if(promo.image.path){
imgSrc=lala.Servlet.UserImage+'?path='+promo.image.path;
}
path=frontend.path.Content(promo.link.data);
break;
case'playlist':
href=frontend.url.MemberPlaylist(promo.link.data);
if(promo.image.path){
imgSrc=lala.Servlet.UserImage+'?path='+promo.image.path;
}
path=frontend.path.MemberPlaylist(promo.link.data);
break;
case'external':
href=promo.link.data;
if(promo.image.path){
imgSrc=lala.Servlet.UserImage+'?path='+promo.image.path;
}
path=null;
break;
}

promo.clientHref=href;
promo.clientImgSrc=imgSrc;
promo.clientPath=path;
},

_getPromoId:function(){
var promoId=null;
if(this.promoArr.length>0){
promoId=this.promoArr[this.cursor].id;
this.cursor++;
if(this.cursor>=this.promoArr.length)this.cursor=0;
}
return promoId;
},


onPrevPromo:function(){
if(this.promoArr.length>1){
this.cursor-=2;
if(this.cursor<0)this.cursor+=this.promoArr.length;
}
this.render();
lala.Track.clientPageInteraction('widget.Promos.prev');
},

onNextPromo:function(){
this.render();
lala.Track.clientPageInteraction('widget.Promos.next');
},

onClick:function(promoId,event){
var promo=this.promoArr.lfindObject('id',promoId);
if(promo.clientPath){
return MyMusic.g.gotoPageViaClick(event,promo.clientPath,'widget.Promos.'+promoId);
}else{
return true;
}
}
};











widgets.core.GenreSelectorPopup=Class.create();
widgets.core.GenreSelectorPopup.prototype={
initialize:function(params){
if(!params)params={};
this.wiid='genreSelectorPopup_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;

this.genreList=params.genreList||DataModel.g.getAllGenres();
this._renderedList=null;
this.topGenres=params.topGenres||DataModel.g.getFavoriteGenres();

this.selectedGenre=params.selectedGenre;
this.parentGenre=params.parentGenre;

this.mode=params.mode||'default';
this.linkToPage=params.linkToPage||'BrowseGenre';
this.trackingId=params.trackingId||'GenreSelector';

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

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

getHtml:function(){
var self=this;
var t=$T(lt.GenreSelectorPopup.topGenres)
.replaceToken('wiid',this.wiid);
t.replaceToken('trackingId',this.trackingId);
var genreLink=t.getTokenBlock('LinkBlock');

this.topGenres.leach(function(genre,index,isLast){
genreLink.replaceToken('genre',genre)
.replaceToken('linkToPage',self.linkToPage);

if(self.parentGenre){
genreLink.replaceToken('parentGenre',self.parentGenre);
genreLink.removeTokenBlock('GenreLink');
}else{
genreLink.removeTokenBlock('SubGenreLink');
}

genreLink.removeTokenBlock('SepBlock',isLast);
genreLink.replaceToken('trackingId',self.trackingId);
genreLink.next();
});

if(this.genreList.length<=this.topGenres.length){
t.removeTokenBlock('MoreLink');
}
t.replaceToken('label',this.parentGenre?'Sub-genres':'Genres');
return t.compose();
},

onOpenGenrePopup:function(trigger,event){
lala.Track.clientPageInteraction(this.trackingId+'.seeMore');
mojo.event.create(event).stopPropagation();
if(this.dialog&&this.dialog.isOpen){
MojoDialog.close();
return;
}

if(!this._renderedList)this._initGenreList();

var popupTitle='';
if(this.parentGenre){
popupTitle=this.parentGenre+' sub-genres';
}else{
popupTitle='Music genres';
}

var columns=new widgets.core.NewTextColumns({
numCols:3,
displayCount:this._renderedList.length
}).getHtml(this._renderedList);

this.dialog=new MojoDialog({
title:popupTitle,
contextualElemId:trigger.id,
id:'genreSelectorPopup'
});

this.dialog.open(columns);
},


_initGenreList:function(){
var self=this;
this._renderedList=[];

this.genreList.leach(function(genre){
var t='';
if(genre==self.selectedGenre){
t=$T(lt.GenreSelectorPopup.selectedGenreColItem);
}else if(self.parentGenre){
t=$T(lt.GenreSelectorPopup.subGenreColItem)
.replaceToken('linkToPage',self.linkToPage)
.replaceToken('parentGenre',self.parentGenre)
}else{
t=$T(lt.GenreSelectorPopup.genreColItem)
.replaceToken('linkToPage',self.linkToPage);
}
t.replaceToken('genre',genre);
t.replaceToken('trackingId',self.trackingId);

self._renderedList.push(t.compose());
});
}

}
widgets.core.GenreSelectorPopup.all={};

LalaMover={
_init:function(){
if(this._inited)return;

this._plugin=null;
this._inited=true;
this._downloadPlaylistSupport=false;
this._supportsAddToQueue2=false;
this._downloadEnabled=true;
this._wantsDownloadConfirmation=false;

var detected=
frontend.detectFFPlugin('application/lalaDownloader-plugin');
if(!(mojo.IE||detected))return;

var deviceDiv=
mojo.dom.forceHTMLFragment(
'hiddenDL_Embed',
'<div id="hiddenDL_Embed" class="offscreen"></div>');
if(!deviceDiv)return;


deviceDiv.innerHTML=
$TC(mojo.IE?lt.Core.ieDownloaderEmbed:lt.Core.ffDownloaderEmbed);


var trialDevice=
mojo.IE?window['lalaDownloadObjectIE']
:document.getElementById('lalaDownloadObjectFF');
if(mojo.IE){
if(trialDevice&&mojo.isDefined(trialDevice.Version)){
this._plugin=trialDevice;
}
}else if(detected){
this._plugin=trialDevice;
}


if(this._plugin!=null){
var version=this._plugin.Version;
if(version==null){
this._plugin=null;
}else{

this._downloadPlaylistSupport=(parseInt(version)>>>16)>=2?true:false;
if(this._downloadPlaylistSupport){

this._downloadEnabled=this._plugin.DownloadEnabled;
this._wantsDownloadConfirmation=this._plugin.WantsDownloadConfirmation;

this._supportsAddToQueue2=((parseInt(version)&0x0000FF00)>>>8)>=1?true:false;
}
}
}
},

isInstalled:function(){
if(!lala.user)return false;
this._init();
return(this._plugin!=null);
},

isDownloadEnabled:function(){
this._init();
if(this._plugin!=null&&this._downloadEnabled){
return true;
}else{
return false;
}
},

isDownloadPlaylistSupported:function(){
this._init();

return this._downloadPlaylistSupport;
},

supportsAddToQueue2:function(){
return this._supportsAddToQueue2;
},

wantsDownloadConfirmation:function(){
this._init();
return this._wantsDownloadConfirmation;
},

setWantsDownloadConfirmation:function(bWants){
this._init();

if(this._downloadPlaylistSupport){
this._wantsDownloadConfirmation=bWants;
this._plugin.WantsDownloadConfirmation=bWants;
}
},

downloadSongs:function(songs){
var self=LalaMover;

lala.Track.click('downloads.viaPlugin');




DataModel.g.decrementPendingCount('Download',songs.length);

this._plugin.OpenQueue();

var useAddToQueue=this.isDownloadPlaylistSupported();
var useAddToQueue2=this.supportsAddToQueue2();
songs.leach(function(song){
song.isUserDownloadable=false;
mojo.assert(song.syncUrl,'missing sync url');

if(useAddToQueue2){
self._plugin.AddToQueue2(
song.artist.lescapeForPlugin(),
song.discTitle.lescapeForPlugin(),
song.title,
song.trackNumber,
song.syncUrl,
song.songLalaId,
song.discLalaId,
song.id
);
}else if(useAddToQueue){
self._plugin.AddToQueue(
song.artist.lescapeForPlugin(),
song.discTitle.lescapeForPlugin(),
song.title,
song.trackNumber,
song.syncUrl,
song.songLalaId,
song.discLalaId);
}else{
self._plugin.Queue(
song.artist.lescapeForPlugin(),
song.discTitle.lescapeForPlugin(),
song.title,
song.trackNumber,
song.syncUrl);
}
});

this._plugin.CloseQueue();
},





createPlaylist:function(name,songs){
var self=LalaMover;

this._plugin.OpenPlaylist();
songs.leach(function(song,index){





self._plugin.AddToPlaylist(
song.artist.lescapeForPlugin(),
song.discTitle.lescapeForPlugin(),
song.title,
song.trackNumber,
'noop',
song.songLalaId,
song.discLalaId);
});
this._plugin.ClosePlaylist(name);
},

getDownloadUrl:function(isWin,isDownloadContext){
var projHost='&proj=mover&host=lalamover';
var moverUrl=frontend.url.PluginCommand()+'?';
moverUrl+='c=download&isDownloadContext='+(isDownloadContext?'true':'false')+'&os='+(isWin?'win':'mac')+projHost;
return moverUrl;
}
};

widgets.core.GiftCards={
getGiftToMemberHtml:function(userToken,clickTrackingId){
return $T(lt.GiftCardUtil.iconToMember)
.replaceToken('userToken',userToken)
.replaceToken('clickTrackingId',clickTrackingId)
.compose();
},

openPrintWindow:function(giftCardId){
var url=frontend.url.GiftCardPrint(giftCardId);
var win=window.open(
url,
'giftCardPrint',
'toolbar=no,scrollbars=yes,width=820,height=600,resizable=1');
win.focus();
},

openClaimWindow:function(){
if(MyMusic.g.requiresSignin({
title:'Create a Lala account to redeem your Gift Card',
openDialogContext:'claimCode'
}))return;

lala.Track.click('claimGiftDialog.open');

var d=new MojoDialog({title:'Enter claim code',id:'giftClaimDialog'});
d.onOpen=function(){mojo.input.clearOnClick('giftClaimCodeInput');};
d.open($T(lt.Core.claimCodeDialog)
.replaceToken('wallet',mojo.util.formatPrice(api.MicroWallet.balance))
.compose());

},





submitClaimCode:function(button){
var onclick=button.onclick;
button.onclick=null;
try{
mojo.util.validate({fieldId:'giftClaimCodeInput',
type:'name',
isRequired:true});
}catch(e){
$S('claimCodeError','Invalid claim code');
$D('claimCodeErrorDiv');
button.onclick=onclick;
return;
}

api.Gifts.claimGiftCard($F('giftClaimCodeInput'),function(res){
if(res.data.error){
button.onclick=onclick;
if(res.data.error=='GiftCard_InvalidCode'){
lala.Track.click('claimGiftDialog.claimInvalid');
$S('claimCodeError','Invalid claim code');
}else if(res.data.error=='GiftCard_AlreadyRedeemed'){
$S('claimCodeError','Already redeemed');
lala.Track.click('claimGiftDialog.claimAlready');
}else{
mojo.log.error('unknown store gift error code/enum: '+res.data.error);
}
mojo.util.highlightErrorField('giftClaimCodeInput');
$D('claimCodeErrorDiv');
}else{
lala.Track.click('claimGiftDialog.claimSuccess');

var amtAdded=res.data.result.valueInCents;
$D('claimCurrentAmount',false);
$S('dialogTitle','Gift card added');
$S('claimCodeContent',$T(lt.Core.claimCodeDialogSuccess)
.replaceToken('amountAdded',mojo.util.formatPrice(amtAdded))
.replaceToken('totalAmount',mojo.util.formatPrice(api.MicroWallet.balance))
.compose());
}
});
},





getCommentBox:function(params){
var w=new CommentWidget({
hideActions:true,
defaultComment:api.Gifts.DEFAULT_COMMENT,
onClose:params.onClose||mojo.emptyFunction,
onSubmit:function(comment,onResponse){
widgets.core.GiftCards.onSubmitGiftComment(
params.messageLalaId,comment,onResponse);
}
});
w.onCancel=params.onCancel||mojo.emptyFunction;
return w;
},







onSubmitGiftComment:function(giftLalaId,msgText,onResponse){
api.Gifts.addComment({
giftLalaId:giftLalaId,
text:msgText
},onResponse);
}
};


widgets.EmailForm=Class.create();
widgets.EmailForm.all={};
widgets.EmailForm.prototype={
initialize:function(params){
this.wiid=params.wiid||'emailForm_'+mojo.idGenerator++;
this.type=params.type||'share';
this.shouldFocus=params.shouldFocus||false;

this.defaultMsg=params.defaultMsg||'';
this.cancelButton=params.cancelButton||'';
this.sendButton=params.sendButton||'';

this.ackTmpl=params.ackTmpl||lt.EmailForm.defaultAck;
this.renderTargetId=params.renderTargetId;

this.onCancel=mojo.emptyFunction;
this.onSend=mojo.emptyFunction;
widgets.EmailForm.all[this.wiid]=this;
},

render:function(){
var t=$T(lt.EmailForm.emailForm)
.replaceToken('wiid',this.wiid)
.replaceToken('defaultMsg',this.defaultMsg)
.replaceToken('cancelButton',this.cancelButton)
.replaceToken('sendButton',this.sendButton);
if(this.cancelButton==''){
t.replaceToken('cancelClass','lnone');
}
var html=t.compose();
if(this.renderTargetId){
$S(this.renderTargetId,html);
if(this.shouldFocus)
$(this.wiid+'_emailAddresses').focus();
}
return html;
},

onSendEmails:function(){
var emailError=$(this.wiid+'_emailError');
var msgError=$(this.wiid+'_messageError');

mojo.css.display(emailError,false);
mojo.css.display(msgError,false);

var emails=$F(this.wiid+'_emailAddresses');

if(!emails){
mojo.util.highlightErrorField(this.wiid+'_emailAddresses');
$S(emailError,'Please enter at least one email address');
mojo.css.display(emailError,true);
return;
}
emails=emails.split(',');

var message=$F(this.wiid+'_emailMessage');
if(!message){
message=' ';
}
if(message.length>1024){
mojo.util.highlightErrorField(this.wiid+'_emailMessage');
$S(msgError,'Message is too long');
mojo.css.display(msgError,true);
return;
}



for(var i=0;i<emails.length;i++){
var at=emails[i].indexOf('@');
var dot=emails[i].lastIndexOf('.');
if(!(at>0&&dot>1&&dot>at)){
mojo.util.highlightErrorField(this.wiid+'_emailAddresses');
$S(emailError,'Invalid Email Address');
mojo.css.display(emailError,true);
return;
}
}

var self=this;
if(!message)message='';
api.Email.sendInvites(emails,message,
function(res){
widgets.core.LightDialog.hide();
lala.showAck($T(self.ackTmpl).replaceToken('s',
(emails==1)?'s':'').compose());
self.onSend();
});
},

focusEmailField:function(){
$(this.wiid+'_emailAddresses').focus();
},

setEmailAddresses:function(emails){
$(this.wiid+'_emailAddresses').value=emails.join(', ');
}
};





widgets.store={
checkAuthLevel:function(onContinue){
api.Store.checkAuthLevel(onContinue);
},


openBuyWebSongsDialog:function(songs,onResponse){
if(frontend.requiresSignin({trackingId:'buyWebSongs'}))return;

widgets.store.PurchaseDialog.WebSongs.open(
{songs:songs,onPurchasedCallback:onResponse});
},

openBuySongDownloadDialog:function(song,onResponse,addlEvtData){
widgets.store.PurchaseDialog.SongDownload.open(
{song:song,onPurchasedCallback:onResponse,addlEvtData:addlEvtData});
},


openBuySongDownloadsDialog:function(songs,onResponse){
if(frontend.requiresSignin({trackingId:'buyMp3Songs'}))return;

widgets.store.PurchaseDialog.SongDownloads.open({
songs:songs,
onPurchasedCallback:onResponse
});
},

openBuyDownloadPlaylistDialog:function(playlist,onResponse){
widgets.store.PurchaseDialog.PlaylistDownload.open(
{playlist:playlist,onPurchasedCallback:onResponse});
},

openBuyAlbumDownloadDialog:function(album,onResponse){
widgets.store.PurchaseDialog.AlbumDownload.open(
{album:album,onPurchasedCallback:onResponse});
},

openBuyWebAlbumDialog:function(album,onResponse,onOpen){
widgets.store.PurchaseDialog.WebAlbum.open(
{album:album,onPurchasedCallback:onResponse,onOpen:onOpen});
},

openBuyWebPlaylistDialog:function(playlist,onResponse){
widgets.store.PurchaseDialog.WebPlaylist.open(
{playlist:playlist,onPurchasedCallback:onResponse});
},

openBuyGiftWebSongDialog:function(song,onResponse){
if(frontend.requiresSignin({trackingId:'giftWebSong'}))return;

this.checkAuthLevel(function(){
var makePurchase=function(){
widgets.store.PurchaseDialog.WebSongGift.open(
{song:song,onPurchasedCallback:onResponse});
};

if(api.MicroWallet.balance>=song.addPrice){
makePurchase();
}else{
widgets.core.BuyWalletDialog.open({
song:song,
isGift:true,
itemDescription:song.addPrice+'&cent; web song'
});
}
});
},

openBuyGiftCardDialog:function(params,onResponse){
if(frontend.requiresSignin({trackingId:'buyGiftCard'}))return;

widgets.store.PurchaseDialog.GiftCard.open(params,onResponse);
},

openBuyPhysicalCDDialog:function(params,onResponse){
if(frontend.requiresSignin({trackingId:'buyCD'}))return;

widgets.store.PurchaseDialog.PhysicalCD.open(params,onResponse);
},

openBuyCartDialog:function(onResponse){
if(frontend.requiresSignin({trackingId:'cart'}))return;

widgets.store.PurchaseDialog.Cart.open(onResponse);
},

PurchaseDialog:{





BaseClass:{

openBase:function(subClass,authChecked){











widgets.store.PurchaseDialog.BaseClass._subClass=subClass;


var prodData=this.getCustomizations()||{};

var showOtherOptions=false;
this.price=prodData.itemPrice;

var isWalletInsufficient=api.MicroWallet.balance<prodData.itemPrice;
var hasSufficientCredits=prodData.creditsAllowed
&&(api.MicroWallet.credits>=prodData.creditsRequired);
var canBuy=lala.user
&&(!isWalletInsufficient||hasSufficientCredits
||!lala.user.isCreditCardRequired||this.isFreeDownload);



if(prodData.paymentMethodPath&&!canBuy){
MyMusic.g.onGoToPaymentMethod('',prodData.paymentMethodPath,this.isFreeDownload);
return;
}else if(!authChecked){
var self=this;
widgets.store.checkAuthLevel(function(){
self.openBase(subClass,true);
});
return;
}


widgets.store.PurchaseDialog.g=this;

if(this.isFreeDownload){

new MojoDialog({
id:'buyProductAckDialog'
}).open($TC(lt.PurchaseProductDialog.PurchasePendingDialog));

widgets.store.PurchaseDialog.BaseClass._subClass.onSubmitPurchase(api.Store.PROMO_PAYMENT);
}else{
var dialog=new MojoDialog({
title:subClass.dialogTitle||'Pay for your purchase',
mode:'horizTwoTone',
id:'buyProductDialog'});

var top=$T(lt.PurchaseProductDialog.dialogTop);
var bottom=$T(subClass.customBottom
||lt.PurchaseProductDialog.dialogBottom);

this._renderBasicData(top,bottom,prodData);

if(!subClass.customBottom){
this._renderWalletRefillOptions(top,bottom,prodData);

if(isWalletInsufficient){




showOtherOptions
=this._renderInsufficientWalletOptions(
top,bottom,prodData);
}else{

this._renderSufficientWalletOptions(
top,bottom,prodData);
}
}

if(prodData.disablePaymentButton){



bottom.replaceToken('disabledSubmit','disabled');
bottom.replaceToken('disabledStyle','color:#999');
}

dialog.open(top.compose(),null,null,bottom.compose());
this.onAfterRender();

if(!subClass.customBottom){
if(!lala.user.hasHadWallet
&&!lala.user.isCreditCardRequired){
var walletRow=$('walletOption');
var ccRow=$('creditCardOption');
var paymentOptions=$('paymentOptionChoices');
mojo.table.deleteRow('creditCardOption');
mojo.table.insertRow(paymentOptions,ccRow.innerHTML,walletRow);
showOtherOptions=false;
}
this._selectInitialRadio(prodData);
}
if(showOtherOptions){
this.onTogglePaymentOptions(
$('buyProductDialogBottomOptionsLink'));
}

this.prevBalance=api.MicroWallet.balance;
}
},

_renderBasicData:function(top,bottom,prodData){
var ccInfo=DataModel.g.getCreditCardOnFile();


if(!prodData.hideBy)prodData.subtitle='by '+prodData.subtitle;
top.replaceToken('prodTitle',prodData.title);
top.replaceToken('prodSubtitle',prodData.subtitle);
top.replaceToken('what',prodData.what);
top.replaceToken('what2',prodData.what2);
top.replaceToken('what3',prodData.what3);
top.replaceToken('iconImgUrl',prodData.iconImgUrl);
if(!prodData.iconImgUrl)top.replaceToken('hideImg','lnone');

bottom.replaceToken('submitText',prodData.submitText);
bottom.replaceToken('goToPaymentMethod',
'MyMusic.g.onGoToPaymentMethod()');
bottom.replaceToken('ccInfo',' ('+ccInfo+')');
bottom.replaceToken('creditCardText',
DataModel.g.getCreditCardText());

var formattedItemPrice=
'Total: &nbsp; $'+mojo.util.formatPrice(prodData.itemPrice);
if(!prodData.hidePrice){
top.replaceToken('fullPrice',formattedItemPrice);
}
bottom.replaceToken('fullPrice',formattedItemPrice);
bottom.replaceToken(
'walletBalance',
mojo.util.formatPrice(api.MicroWallet.balance));

if(prodData.creditsAllowed
&&(api.MicroWallet.credits>=prodData.creditsRequired)){
bottom.replaceToken('creditsRequired',prodData.creditsRequired);
bottom.replaceToken('s',
prodData.creditsRequired==1?'':'s');
}else{
bottom.removeTokenBlock('CreditBlock');
}
},


_renderWalletRefillOptions:function(top,bottom,prodData){
var w=bottom.getTokenBlock('WalletBlock')
.getTokenBlock('PartialWalletBlock')
.getTokenBlock('WalletForSale');
api.MicroWallet.walletOffers.leach(function(offer){


var offerInCents=parseInt(offer.price)*100;
if((offerInCents)
>=(prodData.itemPrice-api.MicroWallet.balance)){
w.replaceTokensWithBean("wallet",offer);
w.replaceToken("selected",offerInCents==500?'selected':'');
w.next();
}
});
},

_renderInsufficientWalletOptions:function(top,bottom,prodData){
var isRefillShown=false;

bottom.getTokenBlock('WalletBlock')
.removeTokenBlock('FullWalletBlock');
bottom.replaceToken(
'deltaPrice',
mojo.util.formatPrice(
prodData.itemPrice-api.MicroWallet.balance));

if(lala.user.isCreditCardRequired){



bottom.removeTokenBlock('WalletBlock');
bottom.removeTokenBlock('InvalidCreditCardBlock');
bottom.removeTokenBlock('CreditCardBlock');
bottom.removeTokenBlock('ShowAllLink');
}else{


bottom.removeTokenBlock('InvalidCreditCardNoWalletBlock');
bottom.removeTokenBlock('InvalidCreditCardBlock');
var walletBlock=bottom.getTokenBlock('WalletBlock')
.getTokenBlock('PartialWalletBlock');

if(lala.user.hasHadWallet){
walletBlock.removeTokenBlock('HasntHadWalletBlock');
}else{
walletBlock.removeTokenBlock('HasHadWalletBlock');
}
isRefillShown=true;
}

return isRefillShown;
},

_renderSufficientWalletOptions:function(top,bottom,prodData){
bottom.getTokenBlock('WalletBlock')
.removeTokenBlock('PartialWalletBlock');
if(lala.user.isCreditCardRequired){
bottom.removeTokenBlock('CreditCardBlock');
}else{
bottom.removeTokenBlock('InvalidCreditCardBlock');
}
bottom.removeTokenBlock('InvalidCreditCardNoWalletBlock');
},

_selectInitialRadio:function(prodData){

this._visitRadios(function(input,index){
if(index==0)input.checked=true;
});
this._visitRadios(function(input,index){
var row=mojo.dom.getAncestorByTagName(input,'TR');
mojo.css.display(row,false);},
true);




var paymentOption=mojo.form.getRadioValue('paymentRadio');
if(paymentOption=='Wallet'){
this.onRadioClick(true);
}



var choicesRegion=$('buyProductDialogChoicesRegion');
var inputs=choicesRegion.getElementsByTagName('INPUT');
if(inputs.length==0){
this._renderNoOptionsAvailableMessaging(prodData);
}else{

mojo.css.hide(inputs[0]);
}
},

_renderNoOptionsAvailableMessaging:function(prodData){
$D('buyProductDialogPrompt',false);
$D('buyProductDialogInvalidCC',true);
$D('buyProductDialogInvalidHR',false);
$('buyProductSubmitButton').value='Go to settings';
$('buyProductSubmitButton').onclick=function(){
MyMusic.g.onGoToPaymentMethod();
};

if(lala.user.hasCreditCard){
$D('buyProductDialogNoCCMsg',false);
$D('buyProductDialogInvalidCCMsg',true);
$D('buyProductDialogInvalidCCNote',false);
}else{
$D('buyProductDialogNoCCMsg',true);
$D('buyProductDialogInvalidCCMsg',false);





if(prodData.creditsAllowed){
$T(lt.PurchaseProductDialog.notEnoughCredits,
'buyProductNoCCNoCreditsMsg')
.replaceToken('creditsNeeded',prodData.creditsRequired)
.replaceToken('credits',api.MicroWallet.credits)
.compose();
$D('buyProductNoCCNoCreditsMsg',true);
}
}




var changeAddr=$('paymentDialogCartChangeAddress');
if(changeAddr){
changeAddr.innerHTML='[not set]';
}
$('buyProductSubmitButton').disabled=false;
$('buyProductSubmitButton').style.color='#333';
},

close:function(){
MojoDialog.close();
},






onTogglePaymentOptions:function(elem){

this._visitRadios(
function(input,index,total,firstInput){
if(index==1){
mojo.css.show(firstInput);
$S('buyProductDialogPromptText',
'Select payment method');
}

var row=mojo.dom.getAncestorByTagName(input,'TR');
mojo.css.display(row,true);},
true);
var invalidCCElem=$('buyProductDialogInvalidCC');
if(invalidCCElem){
mojo.css.display(invalidCCElem,true);
}
$D(elem.parentNode,false);
},







onRadioClick:function(isWallet){
var refillText=$('buyProductDialogWalletRefillText');
if(!refillText)return;

if(isWallet){
$D(refillText,false);
$D('buyProductDialogWalletRefillOptions',true);
}else{
$D(refillText,true);
$D('buyProductDialogWalletRefillOptions',false);
}
},




onSubmit:function(){
if(MyMusic.g.requiresSignin())return;

$('buyProductSubmitButton').disabled=true;
var paymentOption=mojo.form.getRadioValue('paymentRadio');
var refillWallet=null;
if(paymentOption=='Wallet'){


var select=$('addFundsSelect');
if(select){
refillWallet=$F(select);
}
}
var payment={
method:paymentOption,
refillWallet:refillWallet
};
widgets.store.PurchaseDialog.BaseClass._subClass.onSubmitPurchase(payment);
},

onAfterRender:function(){

},

_visitRadios:function(visitor,skipFirst){
var choicesRegion=$('buyProductDialogChoicesRegion');
if(!choicesRegion)return;

var inputs=choicesRegion.getElementsByTagName('INPUT');
for(var i=skipFirst?1:0;i<inputs.length;i++){
var input=inputs[i];
if(input.type=='radio'){
visitor(input,i,inputs.length,inputs[0]);
}
}
},







renderSimpleAck:function(msg,replaceDiv,onTimeout){
if(!$(replaceDiv))return;

$S(replaceDiv,msg);
window.setTimeout(function(){
MojoDialog.close();
if(onTimeout)onTimeout();
},3000);
},





renderWebProductAck:function(payment,priceInCents,preMsg){
if(!$('buyProductButtonRow'))return;
if(payment.method=='Wallet'){
$T(lt.PurchaseProductDialog.paymentWithWalletAck,
'buyProductButtonRow')
.replaceToken('preMsg',preMsg)
.replaceToken('thanksMsg','Thanks for your purchase!')
.replaceToken('cost',mojo.util.formatPrice(priceInCents))
.replaceToken('wallet',mojo.util.formatPrice(api.MicroWallet.balance))
.compose();
}else if(payment.method=='Credit'){
$T(lt.PurchaseProductDialog.paymentWithCreditsAck,
'buyProductButtonRow')
.replaceToken('preMsg',preMsg)
.replaceToken('credits',api.MicroWallet.credits)
.replaceToken('thanksMsg','Thanks for your purchase!')
.compose();
}else if(payment.method=='CreditCard'){
$T(lt.PurchaseProductDialog.paymentWithCreditCardAck,
'buyProductButtonRow')
.replaceToken('preMsg',preMsg)
.replaceToken('cost',mojo.util.formatPrice(priceInCents))
.replaceToken('creditCardText',DataModel.g.getCreditCardText())
.replaceToken('thanksMsg','Thanks for your purchase!')
.compose();
}
window.setTimeout(MojoDialog.close,3000);
},




renderDownloadProductWithMoverAck:function(res){
MojoDialog.close();
var dialog=new MojoDialog({
title:'',
id:'buyProductAckDialog'});
var t=$T(lt.PurchaseProductDialog.downloadWithMoverAck);
dialog.open(t.compose());
},




renderDownloadProductStartedAck:function(replaceDiv,onTimeout){
this.renderSimpleAck(
lt.PurchaseProductDialog.downloadStartedAck.compose(),replaceDiv||'buyProductButtonRow',onTimeout);
},






renderDownloadProductWithoutMoverAck:function(res,isMulti){
MojoDialog.close();
var dialog=new MojoDialog({
title:'',
id:'buyProductAckDialog'});
var t=$T(lt.PurchaseProductDialog.downloadWithoutMoverAck);

if(LalaMover.isInstalled()){
t.removeTokenBlock('MoverNotInstalledBlock');

if(isMulti){
t.removeTokenBlock('DownloadsPageBlock');
}
}

var dBlock=t.getTokenBlock('DownloadsPageBlock');
if(dBlock){
if(isMulti){
dBlock.removeTokenBlock('SingleSongHeaderBlock');
}else{
dBlock.removeTokenBlock('MultiSongHeaderBlock');
}
}

if(isMulti){
t.removeTokenBlock('SingleSongButtonBlock');
}else{
t.removeTokenBlock('MultiSongButtonBlock');
t.replaceToken('downloadLink',res.data.result[0].syncUrl);
}

dialog.open(t.compose());
},

renderDialogAck:function(title,msg,payment,priceInCents){
var paymentMsg='';

if(payment.method=='Wallet'){
paymentMsg+=
$T(lt.PurchaseProductDialog.paymentWithWalletAck)
.replaceToken('cost',mojo.util.formatPrice(priceInCents))
.replaceToken('wallet',mojo.util.formatPrice(api.MicroWallet.balance))
.compose();
}else if(payment.method=='Credit'){
paymentMsg+=
$T(lt.PurchaseProductDialog.paymentWithCreditsAck)
.replaceToken('credits',api.MicroWallet.credits)
.compose();
}else if(payment.method=='CreditCard'){
paymentMsg+=
$T(lt.PurchaseProductDialog.paymentWithCreditCardAck)
.replaceToken('cost',mojo.util.formatPrice(priceInCents))
.replaceToken('creditCardText',DataModel.g.getCreditCardText())
.compose();
}


MojoDialog.close();
var dialog=new MojoDialog({
title:'',
id:'buyProductAckDialog'});
var t=$T(lt.PurchaseProductDialog.genericAckDialog);
t.replaceToken('title',title);
t.replaceToken('msg',msg);
t.replaceToken('paymentMsg',paymentMsg);
dialog.open(t.compose());
},

onOpenChangeAddressDialog:function(){
var self=this;


MojoDialog.close();
var dialog=new MojoDialog(
{title:'Change shipping address',
id:'changeAddressDialog'});
var t=$T(lt.PurchaseProductDialog.changeAddressDialog);
t.replaceTokensWithBean('shippingInfo',this.address);

dialog.onOpen=function(){
mojo.form.selectOption('select_state',self.address.state);
};
dialog.onClose=function(){


window.setTimeout(
function(){
self.openBase(self);
},
10);
};
dialog.open(t.compose());
},

onSaveChangeAddress:function(){
if(!this._validateShippingInfo())return;

lala.Track.click('purchaseDialog.changeShippingAddress');


this.address.name=$F('full_name');
this.address.addr1=$F('mail_addr1');
this.address.addr2=$F('mail_addr2');
this.address.city=$F('mail_city');
this.address.state=$F('select_state');
this.address.zip=$F('mail_zip');
this.address.isChanged=true;


MojoDialog.close();
},

_validateShippingInfo:function(){
try{
mojo.util.validate({fieldId:'full_name',
fieldName:'Full name',
type:'name',
isRequired:true});
mojo.util.validate({fieldId:'mail_addr1',
fieldName:'Address Line 1',
type:'address',
isRequired:true});
mojo.util.validate({fieldId:'mail_addr2',
fieldName:'Address Line 2',
type:'address',
isRequired:false});
mojo.util.validate({fieldId:'mail_city',
fieldName:'City',
type:'city',
isRequired:true});
mojo.util.validate({fieldId:'select_state',
fieldName:'State',
type:'state',
isRequired:true});
mojo.util.validate({fieldId:'mail_zip',
fieldName:'Zip code',
type:'zip',
isRequired:true});
return true;
}catch(e){
return false;
}
},

_getCartInfoDisplay:function(cart,address){
var t=$T(lt.PurchaseProductDialog.cartPurchase);
if(address.addr1){

var addr=address.addr1.lescapeHTML();
if(address.addr2){
addr+='<br>'+address.addr2.lescapeHTML();
}

t.replaceToken('shippingName',(address.name||lala.user.fullName).lescapeHTML());
t.replaceToken('addr',addr);
t.replaceToken('city',address.city.lescapeHTML());
t.replaceToken('state',address.state.lescapeHTML());
t.replaceToken('zip',address.zip);
t.removeTokenBlock('AddrNotSetBlock');
}else{


t.removeTokenBlock('AddrSetBlock');
}

t.replaceToken(
'price',
mojo.util.formatPriceDouble(cart.itemsTotal));
t.replaceToken(
'shipPrice',
mojo.util.formatPriceDouble(cart.shippingTotal));
t.replaceToken(
'taxPrice',
mojo.util.formatPriceDouble(cart.taxTotal));
t.replaceToken(
'totalPrice',
mojo.util.formatPriceDouble(cart.total));
return t.compose();
},

onDownloadPurchased:function(res,purchasedSongs,type){
this._purchasedSongs=purchasedSongs;
this._purchaseType=type;




if(LalaMover.isDownloadEnabled()){
if(LalaMover.wantsDownloadConfirmation()){
this.renderDownloadProductWithMoverAck(res);
}else{
LalaMover.downloadSongs(purchasedSongs);
if(this._purchaseType=='playlist'){
self.createPlaylistWithMover();
}
this.renderDownloadProductStartedAck();
}
}else{
this.renderDownloadProductWithoutMoverAck(res,purchasedSongs.length>1);
}
this.onPurchasedCallback(res);
},

onDownloadWithMover:function(){
if(this._purchasedSongs){
LalaMover.downloadSongs(this._purchasedSongs);

if(this._purchaseType=='playlist'){
this.createPlaylistWithMover();
}

this.renderDownloadProductStartedAck('downloadInstructionButtons');
}
},

onDownloadManually:function(downloadLink){
lala.Track.click('downloads.viaWeb');
widgets.core.DownloadDialog.g.showInstructions(downloadLink);
},

onSetMoverPreferences:function(){
var hideDownloadConfirm=$F('lalaMoverConfirmCheckbox');
if(hideDownloadConfirm){
LalaMover.setWantsDownloadConfirmation(false);
}
},

createPlaylistWithMover:function(){
if(LalaMover.isDownloadPlaylistSupported()){


var nativeTracks=
this.playlist.clientAllTracks
.lfindIf('isUploaded',true);
nativeTracks.laddAll(
this.playlist.clientAllTracks
.lfindIf('isDownloadPurchased',true));
LalaMover.createPlaylist(
this.playlist.title,
nativeTracks);
}
}
},






WebAlbum:{
open:function(params){
this.album=params.album;
this.onPurchasedCallback=params.onPurchasedCallback||mojo.emptyFunction;
this.onOpen=params.onOpen;
this.openBase(this);
},

getCustomizations:function(){
var firstTimeBuyFlow='web/'+this.album.id;
if(this.album.nbdisc>1)firstTimeBuyFlow=null;

return{
itemPrice:StoreUtil.getRealWebPrice(this.album),
retailPrice:StoreUtil.getRetailWebPrice(this.album),
title:this.album.title,
subtitle:this.album.artist,
what:'Web Album (for online listening)',
what2:this.album.addMissingTracksCount+' web songs',
submitText:'Purchase web album',
iconImgUrl:frontend.img.Album(this.album.id,'small'),
creditsAllowed:true,
creditsRequired:this.album.addMissingTracksCount,
paymentMethodPath:firstTimeBuyFlow
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.purchaseAlbum(
this.album,
'Web',
payment,
function(res){
self.renderWebProductAck(
payment,
self.price,
null);
self.onPurchasedCallback(res);
});
},

onAfterRender:function(){
if(this.onOpen)this.onOpen();
}
},





WebSongs:{
open:function(params){
this.songs=params.songs;
this.onPurchasedCallback=params.onPurchasedCallback||mojo.emptyFunction;

this.openBase(this);
},

getCustomizations:function(){
var price=0;
this.songs.leach(function(s){price+=s.addPrice;});

return{
itemPrice:price,
title:this.songs.length+' Web songs',
hideBy:true,
creditsAllowed:true,
creditsRequired:this.songs.length,
subtitle:'',
what:'Unlimited streaming',
submitText:'Purchase web songs',
iconImgUrl:'images/payment_icon_webSongs.gif'
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.purchaseSongs(
this.songs,
'Web',
payment,
function(res){
self.renderWebProductAck(
payment,
self.price,
null);
self.onPurchasedCallback(res);
});
}
},





SongDownload:{
open:function(params){
this.song=params.song;
this.onPurchasedCallback=params.onPurchasedCallback||mojo.emptyFunction;
this.addlEvtData=params.addlEvtData;
this.isFreeDownload=this.song.isFreeMp3;

this.openBase(this);
},

getCustomizations:function(){
var quality=this.song.downloadQuality;
return{
itemPrice:this.song.downloadPriceInCents,
title:this.song.title,
subtitle:this.song.artist,
what:'MP3 song (DRM-free)',
what2:'Download 1 song, '+quality,
submitText:'Purchase song download',
iconImgUrl:'images/payment_icon_mp3.gif',
paymentMethodPath:'mp3/'+this.song.linkSongLalaId
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.purchaseSongs(
this.song,
'Mp3',
payment,
function(res,purchasedSongs){
self.onDownloadPurchased(res,purchasedSongs,'song');
},
null,
null,
this.addlEvtData);
}
},





SongDownloads:{
open:function(params){
this.songs=params.songs;
this.onPurchasedCallback=params.onPurchasedCallback||mojo.emptyFunction;
this.isFreeDownload=this.songs[0].isFreeMp3;
for(var i=1;i<this.songs.length;i++){
this.isFreeDownload=this.isFreeDownload&&this.songs[i].isFreeMp3;
}

this.openBase(this);
},

getCustomizations:function(){
var quality='192 kbps or better';
var price=0;
this.songs.leach(function(s){price+=s.downloadPriceInCents;});

return{
itemPrice:price,
title:'Selected MP3s',
hideBy:true,
subtitle:'',
what:this.songs.length+' MP3 songs (DRM-free)',
what2:'Download '+this.songs.length+' songs, '+quality,
submitText:'Purchase song downloads',
iconImgUrl:'images/payment_icon_mp3s.gif'
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.purchaseSongs(
this.songs,
'Mp3',
payment,
function(res,purchasedSongs){
self.onDownloadPurchased(res,purchasedSongs,'songs');
});
}
},





AlbumDownload:{
open:function(params){
this.album=params.album;
this.onPurchasedCallback=params.onPurchasedCallback||mojo.emptyFunction;
this.isFreeDownload=this.album.isFreeMp3;

this.openBase(this);
},

getCustomizations:function(){
var quality=this.album.downloadQuality||'192 kbps or better';
var firstTimeBuyFlow='mp3/'+this.album.id;
if(this.album.nbdisc>1)firstTimeBuyFlow=null;

return{
itemPrice:StoreUtil.getRealDownloadPrice(this.album),
retailPrice:StoreUtil.getRetailDownloadPrice(this.album),
title:this.album.title,
subtitle:this.album.artist,
what:'MP3 album (DRM-free)',
what2:'Download '+this.album.downloadMissingTracksCount
+' songs, '+quality,
submitText:'Purchase album download',
iconImgUrl:frontend.img.Album(this.album.id,'small'),
paymentMethodPath:firstTimeBuyFlow
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.purchaseAlbum(
this.album,
'Mp3',
payment,
function(res,purchasedSongs){
self.onDownloadPurchased(res,purchasedSongs,'album');
});
}
},






WebPlaylist:{
open:function(params){
this.playlist=params.playlist;
this.onPurchasedCallback=
params.onPurchasedCallback||mojo.emptyFunction;

mojo.assert(
this.playlist.clientAllTracks,
'requires playlist.clientAllTracks attribute');
mojo.assert(
this.playlist.clientUnaddedTracksCount,
'requires playlist.clientUnaddedTracksCount');
mojo.assert(
this.playlist.clientWebPriceInCents,
'requires playlist.clientWebPriceInCents');

this.openBase(this);
},

getCustomizations:function(){
return{
itemPrice:this.playlist.clientWebPriceInCents,
title:this.playlist.title.lescapeHTML(),
subtitle:this.playlist.nickName.lescapeHTML(),
what:'Web song playlist (for online listening)',
what2:this.playlist.clientUnaddedTracksCount
+' web songs',
submitText:'Buy playlist',
iconImgUrl:'images/payment_icon_playlist_web.gif',
creditsAllowed:true,
creditsRequired:this.playlist.clientUnaddedTracksCount
};
},

onSubmitPurchase:function(payment){
var self=this;
var clientPriceInCents=this.playlist.clientWebPriceInCents;
api.Store.purchasePlaylist(
this.playlist,
'Web',
payment,
function(res){
self.renderWebProductAck(
payment,
clientPriceInCents,
'The playlist has been added to your collection.<br>');
self.onPurchasedCallback(res);
});
}
},






PlaylistDownload:{
open:function(params){
this.playlist=params.playlist;
this.onPurchasedCallback=
params.onPurchasedCallback||mojo.emptyFunction;

mojo.assert(
this.playlist.clientAllTracks,
'requires playlist.clientAllTracks attribute');
mojo.assert(
this.playlist.clientUndownloadedTracksCount,
'requires playlist.clientUndownloadedTracksCount');
mojo.assert(
this.playlist.clientDownloadPriceInCents>=0,
'requires playlist.clientDownloadPriceInCents');

if(this.playlist.clientDownloadPriceInCents==0)this.isFreeDownload=true;
this.openBase(this);
},

getCustomizations:function(){
var quality=null;
this.playlist.clientAllTracks.leach(function(track){
if(!frontend.hasDownload(track)){
if(!quality){
quality=track.downloadQuality;
}else if(quality!=track.downloadQuality){
quality='192 kbps or better';
}
}
});

var numTracks=this.playlist.clientUndownloadedTracksCount;
return{
itemPrice:this.playlist.clientDownloadPriceInCents,
title:this.playlist.title.lescapeHTML(),
subtitle:this.playlist.nickName.lescapeHTML(),
what:'MP3 playlist (DRM-free)',
what2:'Download '+numTracks+' song'
+(numTracks==1?'':'s')+', '+quality,
submitText:'Buy Playlist',
iconImgUrl:'images/payment_icon_playlist_mp3.gif'
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.purchasePlaylist(
this.playlist,
'Mp3',
payment,
function(res,purchasedSongs){
self.onDownloadPurchased(res,purchasedSongs,'playlist');
});
}
},






WebSongGift:{
open:function(params){
this.song=params.song;
this.onPurchasedCallback=
params.onPurchasedCallback||mojo.emptyFunction;
this.dialogTitle='Gift this song';
this.customBottom=lt.PurchaseProductDialog.giftDialogBottom;

this.openBase(this);
},

getCustomizations:function(){
return{
itemPrice:this.song.addPrice,
title:this.song.title,
subtitle:this.song.artist,
what:'Web song',
what2:'1 web song',
submitText:"OK"
};
},

onAfterRender:function(){
var self=this;
this.picker=new widgets.ShareEmailOrLalaTabs(
{renderTargetId:'giftDialogPickerHolder',
singleSelect:true,
pickerHeadingText:'Select a Lala friend',
onSelectFriend:function(member){
self.selectedMember=member;
if(member){
self.enableSubmit();
}else{
self.disableSubmit();
}
},
onTabClickExternal:this.onTabClick.lbind(this)
});
this.picker.render();
},

enableSubmit:function(){
var btn=$('giftDialogSubmitButton');
btn.disabled=false;
btn.style.color='#333';
},

disableSubmit:function(){
var submitButton=$('giftDialogSubmitButton');
submitButton.disabled=true;
submitButton.style.color='#999';
},

onTabClick:function(tab){
var submitButton=$('giftDialogSubmitButton');
if(tab.id=='emailShareTab'){
$T(lt.Core.emailFormGift,tab.contentId)
.replaceToken('userName',lala.user.firstName)
.compose();
mojo.focus('giftRecipientName');
this.enableSubmit();
submitButton.onclick=this.onSelectEmail.lbind(this);
}else if(tab.id=='friendsShareTab'){
this.disableSubmit();
submitButton.onclick=this.onSelectFriend.lbind(this);
}
},

onSelectEmail:function(){
if(!this.validateEmailFields()){
return;
}

this.selectedMember={};
this.selectedMember.name=$F('giftRecipientName');
this.selectedMember.email=$F('giftRecipientEmail');
this.selectedMember.senderName=$F('giftYourName');

mojo.css.display('giftDialogNoteBox',true);
$('giftDialogMemberName').innerHTML=this.selectedMember.name;
mojo.css.display('giftDialogAnotherFriend',false);
var submitButton=$('giftDialogSubmitButton');
submitButton.value='Purchase and send';
submitButton.onclick=this.onSendGift.lbind(this);
$T(lt.PurchaseProductDialog.giftDialogSendTo,'giftDialogPickerHolder')
.replaceToken('nickName',this.selectedMember.name+' ('
+this.selectedMember.email+')')
.compose();
},

onSelectFriend:function(){
mojo.css.display('giftDialogNoteBox',true);
$('giftDialogMemberName').innerHTML=this.selectedMember.nickName;
mojo.css.display('giftDialogAnotherFriend',false);
var submitButton=$('giftDialogSubmitButton');
submitButton.value='Purchase and send';
submitButton.onclick=this.onSendGift.lbind(this);
$T(lt.PurchaseProductDialog.giftDialogSendTo,'giftDialogPickerHolder')
.replaceToken('nickName',this.selectedMember.nickName)
.compose();
},

onChangeFriend:function(){
this.selectedMember=null;
this.enableSubmit();
var submitButton=$('giftDialogSubmitButton');
submitButton.value='OK';
submitButton.onclick=this.onSelectFriend.lbind(this);
mojo.css.display('giftDialogNoteBox',false);
$('giftDialogMemberName').innerHTML='';
mojo.css.display('giftDialogAnotherFriend',false);
this.picker.render();
},

onSendGift:function(){
var self=this;

this.disableSubmit();
var note=
$F('giftDialogNote')
||'Here is a little something to add to your collection';
api.Store.giftSong(
this.song,
'Web',
{method:'Wallet'},
this.selectedMember,
note,
function(){
if($('giftDialogButtonRow')){
$('giftDialogButtonRow').innerHTML=
'<div class="dialogSubmitAckMsg">Your gift has been sent. Thanks.</div>';
window.setTimeout(
function(){
self.close();
},2000);
}
});
},

validateEmailFields:function(){
try{
mojo.util.validate({fieldId:'giftRecipientName',
fieldName:'Recipient name',
type:'name',
isRequired:true});
mojo.util.validate({fieldId:'giftRecipientEmail',
fieldName:'Email',
type:'email',
isRequired:true});
mojo.util.validate({fieldId:'giftYourName',
fieldName:'Your name',
type:'name',
isRequired:true});
this.hideErrorMessage('errorEmail');
return true;
}catch(e){
this.showErrorMessage('errorEmail',e.errMsg||'Check it');
return false;
}
},

showErrorMessage:function(elem,msg){
$(elem).innerHTML=msg;
mojo.css.show(elem);
},

hideErrorMessage:function(elem){
mojo.css.hide(elem);
}
},

GiftCard:{
open:function(params,onResponse){
this.params=params;

var offer=params.offer;
this.giftCardAmountInCents=parseFloat(offer.price)*100;

this.onPurchasedCallback=onResponse||mojo.emptyFunction;
this.openBase(this);
},

getCustomizations:function(){
var title='Gift Card ';
var img='';
var toLine='To:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+this.params.toName;
if(this.params.giftCardMode=='email'){
if(this.params.toEmail){
toLine+=' ('+this.params.toEmail+')';
}
title+='<span style="color:#999">(Send by email)</span>';
img='images/payment_icon_giftcard_mail.gif';
}else{
title+='<span style="color:#999">(Print at home)</span>';
img='images/payment_icon_giftcard_print.gif';
}
var msg='';
if(this.params.note!=''){
msg='<div class="giftCardDialogMsg">'+this.params.note.lescapeHTML()+'</div>';
}
return{
itemPrice:this.giftCardAmountInCents,
title:title,
subtitle:toLine,
what:'<span style="color:#333;">From:&nbsp;&nbsp;'+this.params.fromName+'</span>',
what3:msg,
submitText:'Purchase Gift Card',
iconImgUrl:img,
hideBy:true
};
},

onSubmitPurchase:function(payment){
var self=this;
api.Store.giftGiftCard(
this.params,
payment,
function(res){
MojoDialog.close();
self.onPurchasedCallback(res);
})
}
},






PhysicalCD:{
open:function(params,onPurchasedCallback){
var self=this;
this.album=params.album;
this.webAlbumId=params.webAlbumId;
this.onPurchasedCallback=onPurchasedCallback||mojo.emptyFunction;
this.cart=null;
this.address=null;

api.Store.preparePhysicalCdPurchase(
this.album.id,
this.webAlbumId,
function(res){
if(res.data.cart==null){

self.onPurchasedCallback(null,true);
return;
}

self.cart=res.data.cart;
self.address=res.data.shipping;
self.openBase(self);
});
},

getCustomizations:function(){
var whatLabel=
this.album.nbdisc>1
?'CD ('+this.album.nbdisc+' discs'+')'
:'CD';
var cartDisplay=this._getCartInfoDisplay(this.cart,this.address);
if(cartDisplay){
lala.Track.click('purchaseDialog.PhysicalCD.opened');
}

return{
itemPrice:this.cart.total*100,
title:this.album.title,
subtitle:this.album.artist,
what:whatLabel+' - UPC: '+this.album.upc,
what2:this.webAlbumId?'Web album included for FREE':'',
what3:cartDisplay,
hidePrice:true,
submitText:'Place order now',
iconImgUrl:frontend.img.Album(this.album.id,'small'),
disablePaymentButton:this.address.addr1==null
};
},

onSubmitPurchase:function(payment){
var self=this;
var priceInCents=this.cart.total*100;

api.Store.purchasePhysicalCd(
this.album.id,
this.webAlbumId,
payment,
function(res){
if(res.data.cart==null){

MojoDialog.close();
self.onPurchasedCallback(res,true);
return;
}

lala.Track.click('purchaseDialog.PhysicalCD.purchased');
self.renderDialogAck(
'Thanks for your order!',
lt.PurchaseProductDialog.cartPurchasedAckMsg.compose(),
payment,
priceInCents);
self.onPurchasedCallback(res);
},
this.address.isChanged?this.address:null);
}
},

Cart:{
open:function(onPurchasedCallback){
var self=this;
this.onPurchasedCallback=onPurchasedCallback||mojo.emptyFunction;

api.Store.getCartForConfirmedPurchase(
function(res){
self.cart=res.data.cart;
self.address=res.data.shipping;
self.openBase(self);
});
},

getCustomizations:function(){
var cartDisplay=this._getCartInfoDisplay(this.cart,this.address);
if(cartDisplay){
lala.Track.click('purchaseDialog.Cart.opened');
}

var totalCount=0;
this.cart.items.leach(function(item){
totalCount+=item.quantity/1;
});

var what=totalCount+' item';
if(totalCount>1)what+='s';

return{
itemPrice:this.cart.total*100,
title:'Cart purchase',
what:what,
hideBy:true,
what3:cartDisplay,
hidePrice:true,
submitText:'Place your order',
iconImgUrl:'images/payment_icon_cart.gif',
disablePaymentButton:this.address.addr1==null
};
},

onSubmitPurchase:function(payment){
var self=this;
var priceInCents=this.cart.total*100;

api.Store.confirmPurchase(
payment,
function(res){
lala.Track.click('purchaseDialog.Cart.purchased');
self.renderDialogAck(
'Thanks for your order!',
lt.PurchaseProductDialog.cartPurchasedAckMsg.compose(),
payment,
priceInCents);
self.onPurchasedCallback(res);
},
this.address.isChanged?this.address:null);
}
}
}
};


Object.extend(widgets.store.PurchaseDialog.WebAlbum,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.WebSongs,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.SongDownload,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.SongDownloads,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.AlbumDownload,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.WebPlaylist,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.PlaylistDownload,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.WebSongGift,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.GiftCard,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.PhysicalCD,widgets.store.PurchaseDialog.BaseClass,true);
Object.extend(widgets.store.PurchaseDialog.Cart,widgets.store.PurchaseDialog.BaseClass,true);


PurchasePlaylistTracksUtil=Class.create();
PurchasePlaylistTracksUtil.MAX_SONGS_COUNT=50;
PurchasePlaylistTracksUtil.prototype={
initialize:function(playlist,tracks,onPurchaseCallback){
var self=this;
this.playlist=playlist;
this.tracks=tracks;
this.hasDups=false;
this.hasEnoughTracks=true;
this.onPurchaseCallback=onPurchaseCallback||mojo.emptyFunction;

if(this.tracks.total>PurchasePlaylistTracksUtil.MAX_SONGS_COUNT){
this.hasEnoughTracks=false;
return;
}

this._processTracks(true);


mojo.listeners.add(
api.MicroWallet.EVT_BUYSONG_CHANGE,
function(){self._processTracks();});
mojo.listeners.add(
api.MicroWallet.EVT_BUY_DOWNLOAD,
function(){self._processTracks();});
},

_processTracks:function(init){
this.totalWebTracks=0;
this.totalWebPrice=0;
this.unAddedTracksCount=0;
this.unAddedTracksPrice=0;
this.totalDownloadableTracks=0;
this.totalDownloadablePrice=0;
this.unDownloadedTracksCount=0;
this.unDownloadedTracksPrice=0;

var visitedTracks={};

for(var i=0;i<this.tracks.list.length;i++){
var t=this.tracks.list[i];



if(t.isLicensedForStreaming||t.isLicensedForDownload){
if(visitedTracks[t.linkSongLalaId]){
this.hasDups=true;
}
visitedTracks[t.linkSongLalaId]=t;
}

if(t.isLicensedForDownload&&!t.isDownloadAlbumOnly){
this.totalDownloadableTracks++;
this.totalDownloadablePrice+=t.downloadPriceInCents;
if(!frontend.hasDownload(t)){
this.unDownloadedTracksCount++;
this.unDownloadedTracksPrice+=t.downloadPriceInCents;
}
}
if(t.isLicensedForStreaming){
this.totalWebTracks++;
this.totalWebPrice+=t.addPrice;
if(!t.isDigied){
this.unAddedTracksCount++;
this.unAddedTracksPrice+=t.addPrice;
}
}
}


this.playlist.clientAllTracks=this.tracks.list;
this.playlist.clientWebPriceInCents=this.unAddedTracksPrice;
this.playlist.clientUnaddedTracksCount=this.unAddedTracksCount;
this.playlist.clientDownloadPriceInCents=this.unDownloadedTracksPrice;
this.playlist.clientUndownloadedTracksCount=this.unDownloadedTracksCount;

if(!init){
this.onPurchaseCallback();
}
}
};


MenuGroup=Class.create();
MenuGroup.prototype={
initialize:function(){
this._menuShowing=false;
this._currentMenu=null;
this._menus={};
},

registerMenu:function(name,menu){
this._menus[name]=menu;
},

showMenu:function(name){

var menu=this._menus[name];
if(menu){
if(this._currentMenu){
this._currentMenu.hide(true);
}


if(menu.onBeforeOpen&&menu.onBeforeOpen()){
return;
}

this._menuShowing=true;
this._currentMenu=menu;

menu.setVisibility(true);;
}
},

hideMenu:function(name){

var menu=name?this._menus[name]:this._currentMenu;
if(menu){
this._menuShowing=false;
this._currentMenu=null;

menu.setVisibility(false);
}
},

refreshMenu:function(){
var menu=this._currentMenu;
if(menu&&menu.isShowing()){
menu.setVisibility(true);
}
},

isMenuShowing:function(){
return this._menuShowing;
},

hideAllMenus:function(name){
var name;
var menu;
for(name in this._menus){
var menu=this._menus[name];
menu.hideImmediately();
this._menuShowing=false;
this._currentMenu=null;
}
}
};

MenuPulldown=Class.create();
MenuPulldown.prototype={
initialize:function(params){
this.onClose=mojo.emptyFunction;
this._mouseOverCallback=params.mouseOverCallback;
this._mouseOutCallback=params.mouseOutCallback;
this._hoverTarget=$(params.hoverTarget);
this._clickTarget=$(params.clickTarget);
this._menuId=params.menuId;
this._name=params.name||'menu';
this._group=params.group||new MenuGroup();

if(!params.width)params.width="140px";
this._menuWidth=params.width.replace(/px/,'');

this._menuDiv=null;
this._showTimer=null;
this._hideTimer=null;

var style='display: none; width: '+params.width+";z-index:80";

this._menuDiv=mojo.dom.parseHTMLFragment(
'<div class="menuPulldown" id="'+this._menuId+'_container" style="'+style+'"></div>',document.body);
this._menuDiv.style.position=mojo.IE6?"absolute":"fixed";

var dropShadowBox=new widgets.core.DropShadowBox({renderTargetId:this._menuId+'_container'});
dropShadowBox.render();

this._menuContentDiv
=mojo.dom.parseHTMLFragment('<div class="'+params.className+'" id="'+this._menuId+'"></div>',dropShadowBox.getContentId());

var self=this;
var overFn=function(){
self.onMouseOver();
}

var outFn=function(){
self.onMouseOut();
}

var clickFn=function(){
self.show();
}

if(this._clickTarget){
mojo.dom.setEventListener(this._clickTarget,'onclick',clickFn);
}
if(this._hoverTarget){
mojo.dom.setEventListener(this._hoverTarget,'onmouseover',function(event){
event=new MojoEvent(event);
mojo.event.fixOnMouseOver(this,event,overFn);
});

mojo.dom.setEventListener(this._hoverTarget,'onmouseout',function(event){
event=new MojoEvent(event);
mojo.event.fixOnMouseOut(this,event,outFn);
});
}

mojo.dom.setEventListener(this._menuDiv,'onmouseover',function(event){
event=new MojoEvent(event);
mojo.event.fixOnMouseOver(this,event,overFn);
});

mojo.dom.setEventListener(this._menuDiv,'onmouseout',function(event){
event=new MojoEvent(event);
mojo.event.fixOnMouseOut(this,event,outFn);
});

this._group.registerMenu(this._name,this);
},

getName:function(){
return this._name;
},

show:function(){
if(mojo.IE6)mojo.util.hideSelects();
clearTimeout(this._showTimer);
this._group.showMenu(this._name);
},

hide:function(suppressShowSelects){
if(mojo.IE6&&!suppressShowSelects){
mojo.util.showSelects();
}
clearTimeout(this._hideTimer);
this.onClose();
this._group.hideMenu(this._name);
},

hideImmediately:function(){
clearTimeout(this._showTimer);
clearTimeout(this._hideTimer);
this.onClose();
this.setVisibility(false);
},

isShowing:function(){
return(this._menuDiv&&this._menuDiv.style.display=="block");
},

onMouseOver:function(){

clearTimeout(this._hideTimer);
if(this.isShowing())return;



if(this._group.isMenuShowing()){
this.show();
}else{
var self=this;
this._showTimer=setTimeout(function(){

self.show();
},400);
}
},

onMouseOut:function(){

clearTimeout(this._showTimer);
if(!this.isShowing())return;

var self=this;
this._hideTimer=setTimeout(function(){

self.hide();
},mojo.IE6?1000:200);
},

setVisibility:function(bVisible){
if(bVisible){
var bounds=$B(this._hoverTarget.id);

this._menuDiv.style.left=bounds.left-10+"px";
this._menuDiv.style.top=bounds.bottom+"px";
this._menuDiv.style.display="block";
}else{
this._menuDiv.style.display="none";
}
}
};

widgets.core.DropShadowBox=Class.create();
widgets.core.DropShadowBox.prototype={
initialize:function(params){
if(!params)params={};

this.wiid=params.id||'dropShadowBox'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
},

getHtml:function(contentHtml){
return $T(lt.DropShadowBox.skel)
.replaceToken('content',contentHtml)
.replaceToken('wiid',this.wiid)
.compose();
},

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

getContentId:function(){
return this.wiid+'_content';
}
};








widgets.core.Select=Class.create();
widgets.core.Select.prototype={







initialize:function(params){
this.wiid=params.id||'mojoSelect_'+mojo.idGenerator++;

this.selectBoxTargetId=params.selectBoxTargetId;



this.selectBox=params.selectBoxHtml;
this.selectBoxId='selectWidget_'+this.wiid;

this.selectedId=null;
this.options=[];

this.pulldownOffsets=params.pulldownOffsets;
if(!this.pulldownOffsets)this.pulldownOffsets={};
if(!this.pulldownOffsets.left)this.pulldownOffsets.left=0;
this.pulldownOffsets.left-=13;
this.pulldownOffsets.scrollId=params.scrollContainer;
this.pulldownWidth=params.pulldownWidth;
this.pulldown=mojo.pulldown.create({
id:this.wiid,
animate:false,
openBelowTarget:this.selectBoxId,
disableOnClick:true
});

this.selectionCallback=params.selectionCallback;

this.enabled=true;
widgets.core.Select.all[this.wiid]=this;
},


getHtml:function(){
return $T(lt.Select.selectBox)
.replaceToken('selectBox',this._getSelectedOptionHtml())
.replaceToken('wiid',this.wiid)
.compose();
},


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

onToggle:function(event){
if(this.pulldown&&this.pulldown.isVisible()){
this.close();
}else{
if(this.enabled)this._onOpen(event);
}
},

enable:function(){
this.enabled=true;
},

disable:function(){
this.enabled=false;
},

_onOpen:function(event){
mojo.event.create(event).stopPropagation();
var self=this;
this.pulldown.onBeforeOpen=function(){

self.pulldown.setTarget({
target:self.selectBoxId,
openBelowTarget:self.selectBoxId
});
var menu=$T(lt.Select.menuContents);
var menuBlock=menu.getTokenBlock('OptionBlock');
for(var i=0;i<self.options.length;i++){
var option=self.options[i];
if(option.isSelectable){
menuBlock.removeTokenBlock('NoClickOptionBlock');
}else{
menuBlock.removeTokenBlock('ClickOptionBlock');
}

menuBlock.replaceToken('option',option.html);
menuBlock.replaceToken('optionId',option.optionId);
menuBlock.replaceToken('wiid',self.wiid);
var klass=option.extraClass;
if(self.selectedId==option.optionId)klass+=' selected';
menuBlock.replaceToken('optionClass',klass);
menuBlock.next();
}
menu=menu.compose();

var w=new widgets.core.RoundedBox({
renderTargetId:self.wiid,
mode:'dropShadow',
width:self.pulldownWidth,
contentHTML:menu
}).render();
};
this.pulldown.open(this.pulldownOffsets);
},

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














addOption:function(optionId,optionHtml,optionalParams){
if(!optionalParams)optionalParams={};
if(!mojo.isDefined(optionalParams.isSelectable))optionalParams.isSelectable=true;
if(!optionalParams.optionSelectedHtml)optionalParams.optionSelectedHtml=optionHtml;

var option={
optionId:optionId,
html:optionHtml,
selectBoxHtml:optionalParams.optionSelectedHtml,
isSelectable:optionalParams.isSelectable,
clearsSelection:optionalParams.clearsSelection,
extraClass:optionalParams.extraClass||''
};
if(optionalParams.addToBeginning){
this.options.linsertAt(option,0);
}else{
this.options.push(option);
}
if(optionalParams.isSelected){
this.selectedId=optionId;
}
return this;
},


addHRule:function(optionId,addToBeginning){
this.addOption(optionId,'<div class="lhrm"></div>',
{addToBeginning:addToBeginning,isSelectable:false});
},

removeOption:function(optionId){
this.options.lremoveIf('optionId',optionId);
},

_getOption:function(optionId){
return this.options.lfindIf('optionId',optionId,false,true);
},

_getSelectedItem:function(){
return this._getOption(this.selectedId);
},

getSelectedId:function(){
return this.selectedId;
},


onSelect:function(optionId){
var oldId=this.selectedId;

var option=this._getOption(optionId);
this.selectedId=option.clearsSelection?null:optionId;

this.pulldown.close();
this._renderSelectedOption();
var self=this;



window.setTimeout(function(){self.selectionCallback(self.selectedId,oldId)},1);
},


manualSelect:function(optionId){
var option=this._getOption(optionId);
this.selectedId=option.clearsSelection?null:optionId;

this._renderSelectedOption();
},


_renderSelectedOption:function(){
$S(this.selectBoxId,this._getSelectedOptionHtml())
},


_getSelectedOptionHtml:function(){
var selectBoxHtml='';
if(this.selectedId){
var option=this._getOption(this.selectedId);
selectBoxHtml=option.selectBoxHtml;
}else{
selectBoxHtml=this.selectBox;
}
return selectBoxHtml;
}
};
widgets.core.Select.all=[];

widgets.core.ShoutDialog={
open:function(shareObj,shareType){
if(!shareObj)return;

mojo.assert(shareType
&&(shareType=='song'
||shareType=='album'
||shareType=='artist'
||shareType=='playlist'),
'unsupported shout type. shareType == '+shareType);

this.shareObj=shareObj;
this.shareType=shareType;

new MojoDialog({id:'shoutBox'}).open($T(lt.ShoutDialog.dialogContent)
.replaceTokensWithBean('shareObj',this.shareObj)
.replaceToken('displayShout',lala.user?'':'lnone')
.keepTokenBlock('SongBlock',this.shareType=='song')
.keepTokenBlock('AlbumBlock',this.shareType=='album')
.keepTokenBlock('ArtistBlock',this.shareType=='artist')
.keepTokenBlock('PlaylistBlock',this.shareType=='playlist')
.compose());
mojo.input.clearOnClick('shoutOnLalaTextArea');
lala.Track.client('Player.interaction.openShout.'+this.shareType);
},

postToTwitter:function(){
var self=this;
lala.Track.client('Player.interaction.ShoutDialog.postToTwitter.'+this.shareType);

var title='';
var lalaId=-1;

switch(this.shareType){
case'song':
title=this.shareObj.title+' - '+this.shareObj.artist+' ';
lalaId=this.shareObj.linkSongLalaId;
break;
case'album':
title=this.shareObj.title+' - '+this.shareObj.artist+' ';
lalaId=this.shareObj.id;
break;
case'artist':
title=this.shareObj.artist+' ';
lalaId=this.shareObj.lalaId;
break;
case'playlist':
title=this.shareObj.title+' ';
lalaId=this.shareObj.lalaId;
break;
default:
mojo.log.error('unsupported shout type. this.shareType == '+this.shareType);
return;
}

api.Tiny['for'+this.shareType.ltoFirstUpperCase()](
lalaId,
function(tinyUrl){

var tweetUrl='http://twitter.com/home?status=%E2%99%AB+'
+encodeURIComponent(title)+'+'
+encodeURIComponent(tinyUrl);
var newWin=window.open(tweetUrl,'twitter_sharer');

if(newWin){
newWin.focus();
}else{
lala.showAck('It looks like you\'re using a popup blocker. Enable popups for Lala and try again.');
}
self._showLalaSocialLinks('twitter');
});

},

postToFacebook:function(){
lala.Track.client('Player.interaction.ShoutDialog.postToFacebook.'+this.shareType);

switch(this.shareType){
case'song':
if(LalaFBConnect.isConnected()){
LalaFBConnect.openListeningSongDialog({song:this.shareObj});
}else{
widgets.core.WidgetEmbed.postThingToFacebook(frontend.url.Song(this.shareObj.linkSongLalaId));
}
break;
case'album':
if(LalaFBConnect.isConnected()){
LalaFBConnect.openListeningAlbumDialog({album:this.shareObj});
}else{
widgets.core.WidgetEmbed.postThingToFacebook(frontend.url.Album(this.shareObj.id));
}
break;
case'artist':
if(LalaFBConnect.isConnected()){
LalaFBConnect.openListeningArtistDialog({artist:this.shareObj});
}else{
widgets.core.WidgetEmbed.postThingToFacebook(frontend.url.Artist(this.shareObj.artist));
}
break;
case'playlist':
if(LalaFBConnect.isConnected()){
LalaFBConnect.openListeningPlaylistDialog({playlist:this.shareObj});
}else{
widgets.core.WidgetEmbed.postThingToFacebook(frontend.url.Playlist(this.shareObj.id));
}
break;
default:
mojo.log.error('unsupported postToFacebook type. this.shareType == '+this.shareType);
return;
}

this._showLalaSocialLinks('facebook');
},

postToLala:function(){
var self=this;
if(!$('shoutOnLalaTextArea').hasUserText()){
alert("You're telling your followers about this, so make sure to say something.");
return;
}
var message=$F('shoutOnLalaTextArea');

if(message.length>500){
alert("Messages can't be longer than 500 characters.");
return;
}

lala.Track.client('Player.interaction.ShoutDialog.postToLala.'+this.shareType);

switch(this.shareType){
case'song':
api.Stories.shout({
lalaId:this.shareObj.linkSongLalaId,
type:'Song',
message:message
},function(){
LalaFBConnect.openListeningSongDialog({song:self.shareObj},'doFeedListening',message);
});
break;
case'album':
api.Stories.shout({
lalaId:this.shareObj.id,
type:'Album',
message:message
},function(){
LalaFBConnect.openListeningAlbumDialog({album:self.shareObj},'doFeedListening',message);
});
break;
case'artist':
api.Stories.shout({
lalaId:this.shareObj.lalaId,
type:'Artist',
message:message
},function(){
LalaFBConnect.openListeningArtistDialog({artist:self.shareObj},'doFeedListening',message);
});
break;
case'playlist':
api.Stories.shout({
lalaId:this.shareObj.lalaId,
type:'Playlist',
message:message
},function(){
LalaFBConnect.openListeningPlaylistDialog({playlist:self.shareObj},'doFeedListening',message);
});
break;
default:
mojo.log.error('unsupported postToLala type. this.shareType == '+this.shareType);
return;
}
this._showLalaShoutPromo();
},

openGiftSongDialog:function(){
widgets.store.openBuyGiftWebSongDialog(this.shareObj);
},

_showLalaSocialLinks:function(type){
$S('shoutButtons',$TC(lt.ShoutDialog[type+'Promo']));
},

_showLalaShoutPromo:function(){
$S('shoutOnLala',$TC(lt.ShoutDialog.lalaPromo));
}
};

RatingWidget=Class.create();
RatingWidget.all={};
RatingWidget.TYPE_LALA="Lala";
RatingWidget.TYPE_USER="User";
RatingWidget.RATE_API_QUEUE="Queue";
RatingWidget.RATE_API_PLAYLIST="Playlist";
RatingWidget.SIZE_SMALL="Small";
RatingWidget.SIZE_LARGE="Large";
RatingWidget.SMALL_STAR_WIDTH=8;
RatingWidget.LARGE_STAR_WIDTH=11;
RatingWidget.LALA_RATING_FIELD="lalaRating";
RatingWidget.USER_RATING_FIELD="rating";
RatingWidget.idGenerator=0;


RatingWidget.EVT_USER_RATING_CHANGED="userRatingChanged";

RatingWidget.prototype={
initialize:function(params){
this._wiid=params.id||'ratingWidget_'+mojo.idGenerator++;

this._type=params.type||RatingWidget.TYPE_LALA;
this._size=params.size||RatingWidget.SIZE_SMALL;
this._rateApi=params.rateApi||RatingWidget.RATE_API_PLAYLIST;
this._songData={};
this._songMap={};
this._globalTrackingId=params.globalTrackingId;
this._trackingId='widget.Ratings';
this._eventOffset=params.eventOffset;


this._ratingField=params.ratingField;
if(!this._ratingField){
if(this._type==RatingWidget.TYPE_LALA){
this._ratingField=RatingWidget.LALA_RATING_FIELD;
}else{
this._ratingField=RatingWidget.USER_RATING_FIELD;
}
}

var self=this;





if(this._ratingField==RatingWidget.USER_RATING_FIELD){
if(params.isGlobal){
mojo.listeners.addGlobal(
RatingWidget.EVT_USER_RATING_CHANGED,
function(data){
self.updateUserRatings(data);
});
}else{
mojo.listeners.add(
RatingWidget.EVT_USER_RATING_CHANGED,
function(data){
self.updateUserRatings(data);
});
}
}

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


render:function(song,playbackUrl,containerId,isRateEnabled){
if(!song)return;

var ratingId=RatingWidget.idGenerator++;
this._songData[song.id]={
ratingId:ratingId,
song:song,
playbackUrl:playbackUrl};

if(song.songLalaId!=null){
if(!this._songMap[song.songLalaId]){




this._songMap[song.songLalaId]=[];
}






this._songMap[song.songLalaId].push(song.id);
}

var t=$T(lt.RatingWidget.control,containerId);
var ratingWidth=this._getRatingWidth(song,isRateEnabled);
if(isRateEnabled){
t.removeTokenBlock('RatingDisabledBlock');
}else{
t.replaceToken('title',this._getRatingTooltip(song));
t.removeTokenBlock('RatingEnabledBlock');
}
t.replaceToken('size',this._size);
t.replaceToken('type',this._type);
t.replaceToken('wiid',this._wiid);
t.replaceToken('ratingId',ratingId);
t.replaceToken('songId',song.id);
t.replaceToken('width',ratingWidth);
t.replaceToken('ratingWidth',ratingWidth);
return t.compose();
},

renderFake:function(rating,containerId){
var ratingWidth=this._getRatingWidth(null,false,rating);
var ratingId=RatingWidget.idGenerator++;
return $T(lt.RatingWidget.control,containerId)
.removeTokenBlock('RatingEnabledBlock')
.replaceToken('size',this._size)
.replaceToken('type',this._type)
.replaceToken('wiid',this._wiid)
.replaceToken('ratingId',ratingId)
.replaceToken('width',ratingWidth)
.replaceToken('ratingWidth',ratingWidth)
.compose();
},

updateUserRatings:function(data){
var ratedSong=data.song;
if(ratedSong.songLalaId!=null){




var songMap=this._songMap[ratedSong.songLalaId];
if(songMap&&songMap.length>0){
for(var i=0;i<songMap.length;i++){
var songId=songMap[i];
this._updateUserRating(songId,data.rating);
}
}
}else{
this._updateUserRating(ratedSong.id);
}
},

_updateUserRating:function(songId,rating){
var data=this._songData[songId];
if(data&&data.song){
data.song.rating=rating;
var elt=document.getElementById("ratingStrip_"+data.ratingId);
if(elt){
var isRateEnabled=false;
if(elt.parentNode&&elt.parentNode.className.match(/ratingEnabled/)){
isRateEnabled=true;
}
var ratingWidth=this._getRatingWidth(data.song,isRateEnabled);
elt.style.width=ratingWidth+"px";
elt.setAttribute("ratingWidth",ratingWidth);
}
}
},

clearSongCache:function(){
for(var id in this._songData){
delete this._songData[id];
this._songData[id]=null;
}

for(var lalaId in this._songMap){
delete this._songMap[lalaId];
this._songMap[lalaId]=null;
}
},

onRatingOver:function(event){
var self=this;
event=new MojoEvent(event);
var mask=event.target;
var foreStrip=self._getForeStrip(mask.parentNode);
if(foreStrip){
var offset=self._size==RatingWidget.SIZE_SMALL?
RatingWidget.SMALL_STAR_WIDTH:
RatingWidget.LARGE_STAR_WIDTH;
if(foreStrip.className!="ratingForegroundRate"){
foreStrip.className="ratingForegroundRate";
}
var starCount=self._getStarCount(event);
var titleText="You must log in to rate a song";
if(lala.user){
if(starCount>1){
titleText="Click to rate this song";
}else{
titleText="Click to unrate this song";
}
}
mask.title=titleText;

var ratingWidth=(starCount*offset)+"px";
if(foreStrip.style.width!=ratingWidth){
foreStrip.style.width=ratingWidth;
}
}
},

onRatingOut:function(event,songId){
var self=this;
event=new MojoEvent(event);
var mask=event.target;
var foreStrip=self._getForeStrip(mask.parentNode);
if(foreStrip){
foreStrip.className="ratingForeground"+self._type;
var ratingWidth=foreStrip.getAttribute("ratingWidth");
foreStrip.style.width=ratingWidth+"px";
}
},

onRatingClick:function(event,songId){
event=new MojoEvent(event);
event.stopPropagation();


var rating=this._getStarCount(event)-1;
var songData=this._getSongData(songId);
if(this._rateApi==RatingWidget.RATE_API_PLAYLIST){
api.Playlists.rateSong(songData.song,rating,function(res){
mojo.listeners.notify(RatingWidget.EVT_USER_RATING_CHANGED,
{song:songData.song,rating:rating});
});
}else{
api.Queue.rateSong(songData.song,
songData.playbackUrl.url,
rating,function(res){
mojo.listeners.notify(RatingWidget.EVT_USER_RATING_CHANGED,
{song:songData.song,rating:rating});
});
}

var counter='rateSong.'+(songData.song.isDigied?'digied':'free');
if(this._globalTrackingId){
lala.Track.client(this._globalTrackingId+'.interaction.'+counter);
}else{
lala.Track.clientPageInteraction(this._trackingId+'.'+counter);
}
},

_getForeStrip:function(parent){
for(var i=0;i<parent.childNodes.length;i++){
var node=parent.childNodes[i];
if(node.className&&node.className.match(/ratingForeground/)){
return node;
}
}

return null;
},

_getSongData:function(songId){
return this._songData[songId];
},

_getStarCount:function(event){
var starCount=0;
if(event){
var offset=this._size==RatingWidget.SIZE_SMALL?
RatingWidget.SMALL_STAR_WIDTH:
RatingWidget.LARGE_STAR_WIDTH;
var xPos=event.posX;
if(this._eventOffset)xPos+=this._eventOffset;
starCount=Math.min(Math.ceil(xPos/offset),6);
}
return starCount;
},

_getRatingTooltip:function(song){
if(this._type==RatingWidget.TYPE_LALA){
var s=song.numRatings==1?'':'s';
return song.lalaRating+" stars based on "+song.numRatings+
" rating"+s+" - Play song to rate";
}else{
return"";
}
},

_getRatingWidth:function(song,isRateEnabled,ratingOverride){
var rating;
if(song){
rating=song[this._ratingField];
}
if(ratingOverride)rating=ratingOverride;

if(!rating){
rating=0;
}



if(isRateEnabled){
rating=rating+1;
}

var width=0;
var wholeRating=Math.floor(rating);
var partRating=rating-wholeRating;
if(this._size==RatingWidget.SIZE_SMALL){
width=(RatingWidget.SMALL_STAR_WIDTH*wholeRating)+
((RatingWidget.SMALL_STAR_WIDTH-1)*partRating);
}else{
width=(RatingWidget.LARGE_STAR_WIDTH*wholeRating)+
((RatingWidget.LARGE_STAR_WIDTH-1)*partRating);
}
return Math.ceil(width);
}
};






TutorialWidget=Class.create();
TutorialWidget.all={};
TutorialWidget.prototype={
initialize:function(params){
this.numSlides=params.numSlides;
this.templateScope=params.templateScope;
this.templateNameBase=params.templateNameBase;
this.getSlideCallback=params.slideCallback;
this.title=params.title;
this.name=params.name;
this.height=params.height;

this.wiid='tutorial_'+mojo.idGenerator++;
this.dialog=new MojoDialog({id:'tutorialPopup'});
this.currSlide=0;

TutorialWidget.all[this.wiid]=this;
},

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

open:function(){
this.currSlide=0;
this._renderCurrSlide();
},

onPrev:function(){
this.currSlide--;
this._renderCurrSlide();
},

onNext:function(){
this.currSlide++;
this._renderCurrSlide();
},

_getCurrSlideHtml:function(){
if(this.getSlideCallback)return this.getSlideCallback(this.currSlide);
else return $TC(this.templateScope[this.templateNameBase+'_'+this.currSlide]);
},

_renderCurrSlide:function(){
var html=$T(lt.Tutorial.slide)
.replaceToken('wiid',this.wiid)
.replaceToken('title',this.title)
.replaceToken('klass',this.name)
.replaceToken('currSlide',this.currSlide+1)
.replaceToken('numSlides',this.numSlides)
.replaceToken('content',this._getCurrSlideHtml())
.removeTokenBlock('PrevButtonBlock',this.currSlide==0)
.removeTokenBlock('NextButtonBlock',this.currSlide==this.numSlides-1)
.keepTokenBlock('CloseButtonBlock',this.currSlide==this.numSlides-1);
if(this.height)html.replaceToken('height','height:'+this.height);
this.dialog.open(html.compose());
lala.Track.client('Header.interaction.Menu.Credits.Tutorial.'+this.name+'.openSlide'+this.currSlide);
}
};





SignInOrUp=Class.create();

SignInOrUp.onSignInSuccessViaIFrame=function(userToken){
mojo.cookie.remove('inviteToken');




window.setTimeout(function(){
if(SignInOrUp.g&&SignInOrUp.g.onSignedInCallback){
SignInOrUp.g.onSignedInCallback(userToken);
}else{
lala.gotoPage.id('MyMusic');
}
},1);

};

SignInOrUp.prototype={
initialize:function(){
this.onSignedInCallback=null;
this.onSignedUpCallback=null;

this.onOpen=mojo.emptyFunction;
this.onCancel=mojo.emptyFunction;

this.expiredAuth=false;
this.openDialogContext=null;

this.isSignUp=null;


this.signupValuePropsTemplate=lt.SignInOrUp.signupValueProps;
this.signinValuePropsTemplate=lt.SignInOrUp.signinValueProps;

SignInOrUp.g=this;
},

open:function(params){
if(!params)params={};
if(params.isFacebook)params.openDialogContext='fbConnectLinked';
this.openDialogContext=params.openDialogContext||'';
this.renderTargetId=params.renderTargetId;

if(params.showSignIn){
this.openSignIn(params);
}else{
this.openSignUp(params);
}
},

openSignIn:function(params){
if(!params)params={};
this.expiredAuth=params.expiredAuth||false;
this.skipRedirect=params.skipRedirect;




var showFacebookSignin=!params.isFacebook&&lala.showFacebookConnect;

var t=$T(lt.SignInOrUp.signinBox);
var iframeParams='?isIframe=true';

var rightContent='';
if(this.expiredAuth){
rightContent=$TC(lt.SignInOrUp.reAuth);
t.removeTokenBlock('RememberMeBlock');
iframeParams+=lala.user?'&emailAddress='+encodeURIComponent(lala.user.email):'';
iframeParams+='&reauth=true';
t.replaceToken(
'signinText',
params.signinText||
'We ask for your password to keep your account secure');
t.replaceToken(
'submitButtonText',
'Continue');
}else{
rightContent=DataModel.g.isUsIpAddress()
?(frontend.isLimitedSiteDown
?lt.SignInOrUp.signinValuePropsSiteDown
:$T(this.signinValuePropsTemplate)
.replaceToken(
'FBConnectBlock',
showFacebookSignin?$T(lt.SignInOrUp.fbConnectLogin)
.replaceToken('signInOrUp','signin')
.compose():'')
.removeTokenBlock('LearnPropsBlock',params.isFacebook)
.replaceToken('isFacebook',mojo.isBoolean(params.isFacebook)&&params.isFacebook)
.compose())
:$T(lt.SignInOrUp.signinInternational)
.replaceToken(
'FBConnectBlock',
showFacebookSignin?$T(lt.SignInOrUp.fbConnectLogin)
.replaceToken('signInOrUp','signin')
.compose():'')
.compose();
t.replaceToken(
'signinText',
params.signinText||
'Please enter your email and password to log in');
t.replaceToken(
'submitButtonText',
'Log in');
}

if(this.backgroundColor){
iframeParams+='&backgroundColor='+this.backgroundColor;
}
if(this.skipRedirect){
iframeParams+='&skipRedirect=true';
}

if(params.isFacebook){
t.removeTokenBlock('SmallLinksBlock')
.replaceToken('facebookBlock',$T(lt.SignInOrUp.facebookText)
.replaceToken('uid',LalaFBConnect.loggedInUserId)
.removeTokenBlock('SignUpBlock')
.compose());
iframeParams+='&isFacebook=true'
+'&fbName='+encodeURIComponent(LalaFBConnect.loggedInUser.name)
+'&fbPicSquare='+encodeURIComponent(LalaFBConnect.loggedInUser.pic_square_with_logo)
+'&fbPicBig='+encodeURIComponent(LalaFBConnect.loggedInUser.pic_big_with_logo);
}

var signinFrameUrl=lala.URL.SignInIFrame+iframeParams;
if(params.isSslPage&&mojo.IE&&lala.isSslEnabled){
signinFrameUrl=lala.makeSameProtocolUrl(signinFrameUrl);
}

if(!params.renderTargetId){
this.dialog=new MojoDialog({
id:'signIn',
mode:'vertTwoTone'
});
this.dialog.onOpen=this.setupEventHandlers.lbind(this);
this.dialog.onCancel=this.onCancel.lbind(this);
this.dialog.open(t.compose(),'',true,rightContent);
$('signInIFrame').src=signinFrameUrl;
this.enableButton('letsgo');
}else{
t.removeTokenBlock("CloseDialogButton");
$S(params.renderTargetId,t.compose());
$('signInIFrame').src=signinFrameUrl;
}

if(params.isFacebook){
LalaFBConnect.addXFBMLElement('Name','fbName');
LalaFBConnect.addXFBMLElement('ProfilePic','fbProfilePic');
this.setUpFacebookLinkContext();
this.dialog.onCancel=function(){
FB.Facebook.apiClient.revokeAuthorization(LalaFBConnect.loggedInUserId,function(){
LalaFBConnect.forceSessionRefresh();
LalaFBConnect.status=0;
LalaFBConnect.track('signinCloseRevokeAuth','interaction');
});
};
}else{
this.removeFacebookLinkContext();
}

this.onOpen();
lala.Track.pageView('SignIn'+(this.renderTargetId?'InPage':''));

if(this.expiredAuth){
$S('signinTitle','Re-enter your password');
}
this.isSignUp=false;
},

openSignUp:function(params){



if(!DataModel.g.isUsIpAddress()){
var html=$TC(lt.SignInOrUp.signupInternational);
if(!params.renderTargetId){
this.dialog=new MojoDialog({
id:'signUpInternational',
title:''
}).open(html);
}else{
$S(params.renderTargetId,html);
}
return;
}

if(!params)params={};
var title=params.title||'Sign up to play 8 million tracks for FREE';
if(!params.dontClobberMyTitle
&&(SignInOrUp.freePlaylistToken
||SignInOrUp.freeWebSong
||SignInOrUp.promoCode)){
title='Create your FREE lala account';
}

this.expiredAuth=params.expiredAuth||false;
var showFacebookSignup=!params.isFacebook&&lala.showFacebookConnect;
this.signUpValueProps=$TC(this.signupValuePropsTemplate)
+$T(lt.SignInOrUp.alreadyMember)
.replaceToken('isFacebook',mojo.isBoolean(params.isFacebook)&&params.isFacebook)
.compose()
+(showFacebookSignup?$T(lt.SignInOrUp.fbConnectLogin)
.replaceToken('signInOrUp','signup')
.compose():'');

var t=$T(lt.SignInOrUp.signupBox);
if(frontend.isLimitedSiteDown){
t=$T('<br><br><br>Signup is currently unavailable.<br>The site should back back up shortly.');
}

t.replaceToken('btnText',params.buttonText||'Sign me up!');
t.replaceToken('title',title);

var rightContent='';
rightContent=this.signUpValueProps;
t.replaceToken(
'submitButtonText',
"Let's go");

if(params.isFacebook){
t.removeTokenBlock('SmallLinksBlock',true)
.replaceTokenBlock('SignUpFirstName',LalaFBConnect.loggedInUser.first_name)
.replaceTokenBlock('SignUpLastName',LalaFBConnect.loggedInUser.last_name)
.replaceToken('colorInputStyle','color: black')
.replaceToken('facebookBlock',$T(lt.SignInOrUp.facebookText)
.replaceToken('uid',LalaFBConnect.loggedInUserId)
.removeTokenBlock('SignInBlock')
.compose());
}
t.replaceToken('isFacebook',params.isFacebook?'true':'false');

var isInviteContext=false;
if(!params.renderTargetId){
this.dialog=new MojoDialog({
id:'signIn',
mode:'vertTwoTone'
});
this.dialog.onOpen=this.setupSignupEventHandlers.lbind(this);
this.dialog.onCancel=this.onCancel.lbind(this);
this.dialog.open(t.compose(),'',true,rightContent);

isInviteContext=this.setUpSignUpInviteContext();
this.enableButton('signmeup');
}else{
t.getTokenBlock('SmallLinksBlock').removeTokenBlock('CloseDialogButton');
$S(params.renderTargetId,t.compose());
}
if(params.isFacebook){
LalaFBConnect.addXFBMLElement('Name','fbName');
LalaFBConnect.addXFBMLElement('ProfilePic','fbProfilePic');
this.setUpFacebookLinkContext();
if(this.dialog){
this.dialog.onCancel=function(){
FB.Facebook.apiClient.revokeAuthorization(LalaFBConnect.loggedInUserId,function(){
LalaFBConnect.forceSessionRefresh();
LalaFBConnect.status=0;
LalaFBConnect.track('signupCloseRevokeAuth','interaction');
});
};
}
}else{
this.removeFacebookLinkContext();
}

this.onOpen();
lala.Track.pageView('SignUp'+(this.renderTargetId?'InPage':''));
this.isSignUp=true;

var fieldToFocus=isInviteContext?'userpwdSignUp':'emailSignUp';
window.setTimeout(function(){mojo.focus(fieldToFocus);},50);
},

setSignUpFreePlaylistToken:function(token){

SignInOrUp.freePlaylistToken=token;
},

setSignUpFreeWebSong:function(id){
SignInOrUp.freeWebSong=id;
},

setSignUpPromoCode:function(code){
SignInOrUp.promoCode=code;
},

setUpFacebookLinkContext:function(){
Cookies.setFromSignupContext('fbConnectLinked');
},

removeFacebookLinkContext:function(){
mojo.cookie.remove('_lcFromSignup');
},









setUpSignUpInviteContext:function(){
if(!MyMusic.g.invite)return false;

var invite=MyMusic.g.invite;
var roundedBox=new widgets.core.RoundedBox({
renderTargetId:'valuePropsHeadline',
backgroundColor:'#FFE6A4'
});
roundedBox.render();
if(invite.giftCard&&!invite.giftCard.isClaimed){
var gct=$T(lt.SignUp.giftCardFromUser,roundedBox.contentId)
.replaceTokensWithBean('user',invite.fromUser)
.replaceToken('facebookImgUrl',invite.facebookImgUrl)
.replaceToken(
'giftCardValue',
'$'+mojo.util.formatPrice(invite.giftCard.valueInCents));
if(invite.giftCard.note){
gct.replaceTokensWithBean('giftCard',invite.giftCard);
}else{
gct.removeTokenBlock('Message');
}
gct.compose();
this.openDialogContext=
'inviteGiftCard::'+invite.giftCard.valueInCents;
}else if(invite.song){
var st=$T(lt.SignUp.webSongFromUser,roundedBox.contentId)
.replaceToken('facebookImgUrl',invite.facebookImgUrl)
.replaceTokensWithBean('user',invite.fromUser);
if(invite.giftMsg){
st.replaceTokensWithBean('giftMsg',invite.giftMsg);
}else{
st.removeTokenBlock('Message');
}
st.compose();
this.openDialogContext='inviteGiftWebSong';
}else{
var t=$T(lt.SignUp.inviteFromUser,roundedBox.contentId)
.replaceTokensWithBean('user',invite.fromUser)
.replaceToken('facebookImgUrl',invite.facebookImgUrl)
.replaceToken('totalSongs',mojo.util.formatNumber(invite.collectionCount));
if(invite.lastListen){
t.removeTokenBlock('TopGenres');
t.replaceTokensWithBean('lastListen',invite.lastListen);
t.replaceToken('lastListenTime',
parseInt(invite.lastListen.lastListenTimestamp)>0
?' '+new Date(parseInt(invite.lastListen.lastListenTimestamp)).lgetDaysAgoLabel('today')
:'');
}else{
t.removeTokenBlock('LastListen');
t.replaceToken('topGenres',invite.topGenres.join(', '));
}
t.compose();
this.openDialogContext='inviteEmail';
}

if(invite&&invite.toEmail&&invite.toEmail!="noop@lala.com"){
$('emailSignUp').onclick();
$('emailSignUp').value=invite.toEmail;
return true;
}else{
return false;
}
},

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

setupEventHandlers:function(){
if($('cancelButton')){
$('cancelButton').onclick=function(){
MojoDialog.close(true);
}.lbind(this);
}
},

setupSignupEventHandlers:function(){
this.setupEventHandlers();
mojo.input.clearOnClick('emailSignUp',null,null,true);
mojo.input.clearOnClick('userpwdSignUp',false,'password');
mojo.input.clearOnClick('confirmuserpwdSignUp',false,'password');
mojo.input.clearOnClick('firstName');
mojo.input.clearOnClick('lastName');
},

onSignUpSubmit:function(event,isFacebook){
var self=this;
this.disableButton('signmeup');

var mevent=new MojoEvent(event);
if($F('emailSignUp')&&$F('userpwdSignUp')=='Choose password'&&mevent.ctrlKey){

this.openDialogContext=null;
api.User.signupForDev(
{email:$F('emailSignUp').replace('Email address','')},
function(res){self.onSignupResponse(res);});
return;
}

try{
this.resetError();
mojo.util.validate({fieldId:'emailSignUp',
fieldName:'Email address',
type:'email',
isRequired:true,
origValue:'Email address'});
mojo.util.validate({fieldId:'userpwdSignUp',
fieldName:'Password',
type:'password',
isRequired:true,
origValue:'Choose password'});
mojo.util.validate({fieldId:'firstName',
fieldName:'First name',
type:'name',
isRequired:true,
origValue:'First name'});
mojo.util.validate({fieldId:'lastName',
fieldName:'Last name',
type:'name',
isRequired:true,
origValue:'Last name'});
if(!$F('signupTermsOfService')){
throw{errMsg:'You must agree to the terms of service'};
}


var fc=mojo.cookie.get('fc',null);
var fbHomePageTestVersion=mojo.cookie.get('lchpfbtv',null);
if(!fc&&fbHomePageTestVersion){
mojo.cookie.set('fc','fe.homePage.'+fbHomePageTestVersion);
}

api.User.signup({
email:$F('emailSignUp'),
userpwd:$F('userpwdSignUp'),
firstName:$F('firstName'),
lastName:$F('lastName'),
hpfbtv:fbHomePageTestVersion,
isFacebook:isFacebook,
fbName:LalaFBConnect.loggedInUser.name,
fbPicSquare:LalaFBConnect.loggedInUser.pic_square_with_logo,
fbPicBig:LalaFBConnect.loggedInUser.pic_big_with_logo,
freePlaylistToken:SignInOrUp.freePlaylistToken,
freeWebSong:SignInOrUp.freeWebSong,
promoCode:SignInOrUp.promoCode,
wantsMarketing:$F('signupWantsMarketing')},
function(res){
self.onSignupResponse(res);
});
}catch(ex){
this.enableButton('signmeup');
self.dontSignUp=false;
this.showError(ex);
}
},

onSignupResponse:function(res){
this.dontSignUp=false;
if(res.data.userToken){
if(!mojo.IE6){

mojo.cookie.set('adWordsConversion',true);
mojo.cookie.remove('inviteToken');

}
Cookies.setFromSignupContext(this.openDialogContext);

if(this.onSignedUpCallback){
this.onSignedUpCallback();
}else if(SignInOrUp.freePlaylistToken||SignInOrUp.freeWebSong){
lala.gotoPage.url(frontend.url.Collection());
}else{
lala.gotoPage.id('MyMusic');
}
}else{
if(res.data.errorCode=='AccountAlreadyExists'){
this.showError($TC(lt.SignInOrUp.accountExists));
}else{
this.showError($TC(lt.SignInOrUp.genericError));
}
this.enableButton('signmeup');
}
},

showError:function(msg){
msg=msg.errMsg?'<span id="formError">'+msg.errMsg+'</span>':msg;
$S('errorSpace',msg);
},

resetError:function(){
$S('errorSpace','');
},

enableButton:function(idOrElem){
var elem=$(idOrElem);
if(!elem)return;

elem.disabled=false;
elem.parentNode.className="enabled";
},

disableButton:function(idOrElem){
var elem=$(idOrElem);
elem.disabled=true;
elem.parentNode.className="disabled";
},

onForgotPassword:function(){
if(this.onForgotPasswordCallback){
this.onForgotPasswordCallback();
}else{
MyMusic.g.forgotPassword();
}
}
};

strings.SignOrUp={
enter_email:'Please enter your email address.',
enter_pwd:'Please enter your password.'
};

ForgotPassword=Class.create();
ForgotPassword.prototype={
initialize:function(){
this.submitButton=mojo.util.button('email_submit');
ForgotPassword.g=this;

},

open:function(){
var t=$T(lt.ForgotPassword.main);
this.dialog=new MojoDialog({
id:'forgotPasswordDialog',
title:'Forgot your password?'
});
this.dialog.open(t.compose());
lala.Track.pageView('ForgotPassword');
mojo.focus('emailForgotPassword');
mojo.input.onEnterKey('emailForgotPassword',this.submitEmail.lbind(this));
},

submitEmail:function(){
var self=this;
var email=$F('emailForgotPassword');
if(email.lisEmpty())return;
this.submitButton.disable();
api.Email.forgotPassword(email,function(res){
if(res.data){
$('content').innerHTML=$T(lt.ForgotPassword.ack).compose();
}else{
$('error').innerHTML=$T(lt.ForgotPassword.error).compose();
self.submitButton.enable();
}
});

}
}


ResetPassword=Class.create();
ResetPassword.prototype={
initialize:function(){
ResetPassword.g=this;
this.submitButton=mojo.util.button('savePassword');
},

open:function(token){
lala.Track.pageView('ResetPassword');
this.token=token;

this.dialog=new MojoDialog({
id:'resetPasswordDialog',
title:'Reset password'
});
if(!this.token){
t=$T(lt.ResetPassword.invalid);
this.dialog.open(t.compose());
}else{
var self=this;
api.User.validateResetPasswordToken(
this.token,
function(res){
var t=$T(lt.ResetPassword.main);
switch(res.data){
case"invalid":
t=$T(lt.ResetPassword.invalid);
break;
case"expired":
t=$T(lt.ResetPassword.expired);
break;
case"success":
t=$T(lt.ResetPassword.main);
self.dialog.onOpen=function(){
mojo.input.onEnterKey('confirmnewpwd',
self.onSubmitPassword.lbind(self));
mojo.focus('newpwd');
};
break;
}
self.dialog.open(t.compose());
});
}

},

onSubmitPassword:function(){
try{
this.resetError();
mojo.util.validate({
fieldId:'newpwd',
fieldName:'Password',
type:'password',
isRequired:true});


this.submitButton.disable();
api.User.resetPassword(
this.token,
$F('newpwd'),
function(res){
var t=res.data?lt.ResetPassword.success:lt.ResetPassword.error;
$('content').innerHTML=$TC(t);
});
}catch(ex){
this.submitButton.enable();
this.showError(ex);
}
},

showError:function(msg){
msg=msg.errMsg?'<span id="formError">'+msg.errMsg+'</span>':msg;
$S('newpwdError',msg);
},

resetError:function(){
$S('newpwdError','');
}
};
TrendArrow=Class.create();
TrendArrow.prototype={







render:function(params){
var isUp=params.trendNum<0;
var isEven=params.trendNum==0;
var numToShow=Math.abs(params.trendNum);
return $T(lt.TrendArrow.main)
.replaceToken('upOrDown',isEven?'even':isUp?'up':'dn')
.replaceToken('size',params.size)
.replaceToken('roseOrFell',isEven?'stayed':isUp?'rose':'fell')
.replaceToken('titleTrendNum',isEven?'the same':mojo.util.addCommasToNumber(numToShow))
.replaceToken('asOrSince',isEven?'as':'since')
.replaceToken('trendPositionS',isEven||numToShow==1?'':'s')
.replaceToken('what',params.what)
.compose();
}
}
TrendArrow.g=new TrendArrow();




api.Polls={
getActive:function(onResponse){
lala.sendRequest(
{url:'Polls/getActive',
onResponse:onResponse});
},

answer:function(pollId,pollAnswer,onResponse){
lala.sendRequest(
{url:'Polls/answer',
params:{'pollId':pollId,'pollAnswer':pollAnswer},
onResponse:onResponse,
method:'POST'});
},

expire:function(pollId,onResponse){
lala.sendRequest(
{url:'Polls/expire',
params:{'pollId':pollId},
onResponse:onResponse});
}
};




api.Email={
sendInvites:function(inviteeEmails,note,callback){
lala.sendRequest(
{url:'Email/sendInvites',
params:{inviteEmails:inviteeEmails,inviteMessage:note},
onResponse:callback,
method:'POST'});
},

forgotPassword:function(email,callback){
lala.sendRequest(
{url:'Email/forgotPassword',
params:{email:email},
onResponse:callback,
method:'POST'});
},

support:function(params,callback){
lala.sendRequest(
{url:'Email/support',
params:params,
onResponse:callback,
method:'POST'});
},

feedback:function(params,onResponse){
params.userAgent=mojo.USER_AGENT;

lala.sendRequest(
{url:'Email/feedback',
params:params,
onResponse:onResponse,
method:'POST'});
},

ttrInternationalSupport:function(params,onResponse){
params.userName=params.userName;
params.userEmail=params.userEmail;
params.userAgent=mojo.USER_AGENT;

lala.sendRequest(
{url:'Email/ttrInternationalSupport',
params:params,
onResponse:onResponse,
method:'POST'});
},

shareSong:function(params,onResponse){
this._shareSong(params,onResponse,'Email/shareSong');
},

shareSongAnon:function(params,onResponse){
this._shareSong(params,onResponse,'Email/shareSongAnon');
},

_shareSong:function(params,onResponse,url){
lala.sendRequest(
{url:url,
params:params,
onResponse:onResponse,
method:'POST'});
}
};



widgets.Shipping=Class.create();
widgets.Shipping.all={};

widgets.Shipping.prototype={
initialize:function(params){
this._wiid='Shipping_'+mojo.idGenerator++;
widgets.Shipping.all[this._wiid]=this;

this.heading=params.heading;
this.renderTargetId=params.renderTargetId;
this.onSubmitResponse=params.onSubmitResponse;
mojo.assert(this.onSubmitResponse,'requires onSubmitResponse as param');
this.hideCancel=params.hideCancel;
this.submitText=params.submitText||'Continue';
},

render:function(user){
var t=$T(lt.ShippingWidget.form,this.renderTargetId);
if(this.heading){
t.replaceToken('heading',this.heading)
}else{
t.removeTokenBlock('HeadingBlock');
}
if(this.hideCancel){
t.replaceToken('hideCancel',"hidden");
}
t.replaceTokensWithBean('user',user)
.setEmptyTokenText("")
.replaceToken('submitText',this.submitText)
.compose();
$('select_state').value=user.mail_state;

$('submitButton').onclick=this.onSubmit.lbind(this);
$('cancelButton').onclick=this.onCancel.lbind(this);
},


onSubmit:function(){
var self=this;
if(!this.validateShippingInfo()){
return;
}
$('submitButton').disabled=true;
var onResponse=function(){
$('submitButton').disabled=false;
self.onSubmitResponse();
}
var params={shipping_name:$F('mail_name'),
shipping_company:$F('mail_company'),
shipping_addr1:$F('mail_addr1'),
shipping_addr2:$F('mail_addr2'),
shipping_city:$F('mail_city'),
shipping_state:$F('select_state'),
shipping_zip:$F('mail_zip')};
this.addressValidateFailures=0;
api.User.updateShippingAddress(params,function(res){
onResponse();
});
},

validateShippingInfo:function(){
try{
mojo.util.validate({fieldId:'mail_name',
fieldName:'Name',
type:'name',
isRequired:true});
mojo.util.validate({fieldId:'mail_company',
fieldName:'Company',
type:'address',
isRequired:false});
mojo.util.validate({fieldId:'mail_addr1',
fieldName:'Address Line 1',
type:'address',
isRequired:true});
mojo.util.validate({fieldId:'mail_addr2',
fieldName:'Address Line 2',
type:'address',
isRequired:false});
mojo.util.validate({fieldId:'mail_city',
fieldName:'City',
type:'city',
isRequired:true});
mojo.util.validate({fieldId:'select_state',
fieldName:'State',
type:'state',
isRequired:true});
mojo.util.validate({fieldId:'mail_zip',
fieldName:'Zip code',
type:'zip',
isRequired:true});
this.hideErrorMessage('errorShippingInfo');
return true;
}catch(e){
this.showErrorMessage('errorShippingInfo',e.errMsg);
return false;
}
},

showErrorMessage:function(elem,msg){
$(elem).innerHTML=msg;
mojo.css.show(elem);
},

hideErrorMessage:function(elem){
mojo.css.hide(elem);
},

onCancel:function(){
history.go(-1);
}

};




api.Queue={
EVT_QUEUE_UPDATED:"queueUpdated",

play:function(type,obj,onResponse){
var requestUrl;
var params=this._getParams(obj);
switch(type){
case'song':
requestUrl='Queue/playSong';
break;
case'disc':
requestUrl='Queue/playDisc';
break;
case'album':
requestUrl='Queue/playAlbum';
break;
}

this._send(requestUrl,params,onResponse);
},

playMemberPlaylist:function(playlistId,onResponse,sourcePath){
var params={
playlistId:playlistId,
sourceParams:sourcePath?sourcePath:mojo.url.getHash()
};
this._send('Queue/playMemberPlaylist',params,onResponse);
},

playSongsWithQuery:function(sourceId,queryParams,sourceTitle,onResponse){
var params={
sourceId:sourceId,
sourceParams:mojo.url.getHash()+"||"+sourceTitle
};
Object.extend(params,queryParams);

this._send('Queue/playSongsFromQ',params,onResponse);
},

queueSongsWithQuery:function(sourceId,queryParams,sourceTitle,onResponse){
var params={
sourceId:sourceId,
sourceParams:mojo.url.getHash()+"||"+sourceTitle
};
Object.extend(params,queryParams);

this._send('Queue/queueSongsFromQ',params,onResponse);
},

playCustomBag:function(playIds,sourceTitle,onResponse){
var params={
playIds:playIds.join(","),
sourceParams:mojo.url.getHash()+"||"+sourceTitle
};
this._send('Queue/playCustomBag',params,onResponse);
},

queueCustomBag:function(playIds,sourceTitle,onResponse){
var params={
songIds:playIds.join(","),
sourceParams:mojo.url.getHash()+"||"+sourceTitle
};
this._send('Queue/queueCustomBag',params,onResponse);
},

playPublicFeed:function(userToken,filterBy,onResponse){
var params={userToken:userToken,filterBy:filterBy};
this._send('Queue/playPublicFeed',params,onResponse);
},

queuePublicFeed:function(userToken,filterBy,onResponse){
var params={userToken:userToken,filterBy:filterBy};
this._send('Queue/queuePublicFeed',params,onResponse);
},

playPrivateFeed:function(filterBy,onResponse){
this._send('Queue/playPrivateFeed',{filterBy:filterBy},onResponse);
},

queuePrivateFeed:function(filterBy,onResponse){
this._send('Queue/queuePrivateFeed',{filterBy:filterBy},onResponse);
},

playFeedStory:function(storyId,onResponse){
this._send('Queue/playStoryInFeed',{storyId:storyId},onResponse);
},

queueFeedStory:function(storyId,onResponse){
this._send('Queue/queueStoryInFeed',{storyId:storyId},onResponse);
},

queue:function(type,obj,onResponse){
var requestUrl;
var params=this._getParams(obj);

switch(type){
case'song':
requestUrl='Queue/queueSong';
break;
case'disc':
requestUrl='Queue/queueDisc';
break;
case'album':
requestUrl='Queue/queueAlbum';
break;
}
this._send(requestUrl,params,onResponse);
},

queueMemberPlaylist:function(playlistId,onResponse){
var params={
playlistId:playlistId,
sourceParams:mojo.url.getHash()
};
this._send('Queue/queueMemberPlaylist',params,onResponse);
},

jumpTo:function(id,onResponse){
lala.sendRequest({url:'Queue/jumpTo',
params:{trackId:id},
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
onResponse(res);
}});
},

moveToHeadAndPlay:function(id,onResponse){
lala.sendRequest({url:'Queue/moveToHeadAndPlay',
params:{itemId:id},
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
onResponse(res);
}});
},

getPlaybackUrl:function(song,onResponse){
var params=this._getParams(song);
lala.sendRequest({url:'Queue/getPlaybackUrl',
params:params,
onResponse:onResponse});
},

getItems:function(historyCount,activeCount,onResponse){
var params={historyCount:historyCount,
activeCount:activeCount};
lala.sendRequest({url:'Queue/getItems',
params:params,
onResponse:function(res){















var origResult=res.data.result;
res.data.result={
activeTracks:{
total:res.data.activeCount,
list:[]
},
activeBags:{},
historyTracks:{
total:res.data.historyCount,
list:[]
},
historyBags:{}
};

var keys=['active','history'];
keys.leach(function(key){
var pagedList=origResult[key];
var list=res.data.result[key+'Tracks'].list;
var bags=res.data.result[key+'Bags'];
pagedList.list.leach(function(qItem){







if(qItem.bagType){

bags[qItem.id]=qItem;
qItem.tracks.leach(function(qTrack){
if(qTrack.song){
list.push(qTrack);
qTrack.song.clientQTrackId=qTrack.id;
}else{
res.data.result[key+'Tracks'].total--;

}
});
api.Queue.preprocessSourceParams(qItem);
}else{
if(qItem.song){
list.push(qItem);
qItem.song.clientQTrackId=qItem.id;
}else{
res.data.result[key+'Tracks'].total--;

}
}
});
});

api.Queue._preprocessResponse(res,onResponse);
}});
},

moveToTop:function(item,onResponse){
lala.sendRequest({
url:'Queue/moveToTop',
params:{itemId:item.id},
onResponse:function(res){
api.Queue._preprocessResponse(res,onResponse);
}});
},

removeActiveItems:function(onResponse){
lala.sendRequest({
url:'Queue/removeActiveItems',
onResponse:function(res){
api.Queue._preprocessResponse(res,onResponse);
}});
},

removeItem:function(item,onResponse){
lala.sendRequest({
url:'Queue/removeItem',
params:{itemId:item.id},
onResponse:function(res){
api.Queue._preprocessResponse(res,onResponse);
}});
},

removeAllItems:function(onResponse){
lala.sendRequest({
url:'Queue/removeAllItems',
onResponse:function(res){
api.Queue._preprocessResponse(res,onResponse);
}});
},

getNext:function(onResponse){
var params={};
lala.sendRequest({url:'Queue/getNext',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
if(onResponse)onResponse(res);
}});
},

getPrevious:function(skipHead,onResponse){
var params={skipHead:skipHead};
lala.sendRequest({url:'Queue/getPrevious',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
if(onResponse)onResponse(res);
}});
},

setShuffleMode:function(shuffleMode,onResponse){
var params={shuffleMode:shuffleMode};
lala.sendRequest({url:'Queue/setShuffleMode',
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
mojo.listeners.notify(api.Queue.EVT_QUEUE_UPDATED,res);
if(onResponse)onResponse(res);
}});
},

rateSong:function(song,playbackUrl,rating,onResponse){
var params=this._getParams(song);
params.playbackUrl=playbackUrl;

if(rating<0)rating=0;
else if(rating>5)rating=5;
params.rating=rating;

lala.sendRequest({url:'Queue/rateSong',
onResponse:onResponse,
params:params});
},

_getParams:function(obj,sourceTitle){
var params={};
if(obj&&obj.playToken){
params.T=obj.playToken;
params.md5T=mojo.md5.hex_md5(obj.playToken
+"Warning: Unauthorized reproduction, capture or distribution of this stream can result in civil and criminal liability. This stream and its content is owned by la la media, inc. and/or its licensors, and is protected by applicable intellectual property and other laws, including but not limited to copyright.   To prevent unauthorized and infringing uses of this stream, generation of an MD5 digest with this text is required and will be used for monitoring and tracking unauthorized and infringing activity."
+"abs123");
}

var isTooLong=false;
var sourceParams=mojo.url.getHash();
if(sourceParams&&sourceParams.length>128){
sourceParams=sourceParams.substring(0,128);
isTooLong=true;
}
if(sourceTitle&&!isTooLong){
sourceParams+="||"+sourceTitle;
}

params.sourceParams=sourceParams;
return params;
},

_send:function(url,params,onResponse){
lala.sendRequest({url:url,
params:params,
onResponse:function(res){
api.Queue.preprocessSourceParams(res.data.result);
mojo.listeners.notify(api.Queue.EVT_QUEUE_UPDATED,res);
if(onResponse)onResponse(res);
}});
},

preprocessSourceParams:function(qItem){
if(!qItem)return;

if(qItem.sourceParams){
var sourceParams=qItem.sourceParams.split('||');
qItem.clientSourcePath=sourceParams[0]||"";

if(sourceParams[1]){
qItem.clientSourceTitle=sourceParams[1];
}
}

if(qItem.bagType){
if(!qItem.clientSourceTitle){

qItem.clientSourceTitle=qItem.title||'';
}

qItem.clientBagType=qItem.bagType;
if(qItem.bagType=='Custom'){
qItem.clientBagType='All songs';
}
}
},

_preprocessResponse:function(res,onResponse){

this.preprocessSourceParams(res.data.result);
Player.g.onQueueUpdated(res);
onResponse(res);
}
};




api.LalaForecast={
EVT_FORECAST_UPDATED:'forecastUpdated',

getSongs:function(userToken,callback){
lala.sendRequest({
url:'LalaForecast/getSongs',
params:{userToken:userToken},
onResponse:callback
});
},

deleteSong:function(params,onResponse){
var self=this;
var song=params.song;

lala.sendRequest({
url:'LalaForecast/deleteSong',
params:{songLalaId:song.linkSongLalaId},
onResponse:function(res){
song.isForecast=false;
onResponse(res);

self._fireNotification(res,'delete',song);
}});
},

addSong:function(params,onResponse){
var self=this;
var song=params.song;

lala.sendRequest({
url:'LalaForecast/addSong',
params:{songLalaId:song.linkSongLalaId,
playToken:song.playToken,
comment:params.comment},
method:'POST',
onResponse:function(res){
song.isForecast=true;
onResponse(res);
self._fireNotification(res,'added',song,params.comment);
}});
},

replaceSong:function(params,onResponse){
var self=this;
var oldSong=params.oldSong;
var newSong=params.newSong;

lala.sendRequest({
url:'LalaForecast/replaceSong',
params:{oldSongLalaId:oldSong.linkSongLalaId,
newSongLalaId:newSong.linkSongLalaId,
playToken:newSong.playToken,
comment:params.comment},
method:'POST',
onResponse:function(res){
oldSong.isForecast=false;
newSong.isForecast=true;
onResponse(res);

self._fireNotification(res,'delete',oldSong);
self._fireNotification(res,'added',newSong,params.comment);
}});
},

changeSongComment:function(params,onResponse){
var self=this;
var song=params.song;

lala.sendRequest({
url:'LalaForecast/changeSongComment',
params:{songLalaId:song.linkSongLalaId,
comment:params.comment},
method:'POST',
onResponse:function(res){
song.comment=params.comment;
onResponse(res);
self._fireNotification(res);
}});
},

_fireNotification:function(res,type,extra,comment){
mojo.listeners.notify(
api.LalaForecast.EVT_FORECAST_UPDATED,
{songs:res.data,type:type,extra:extra,comment:comment});
}
};






widgets.SignInBox=Class.create();
widgets.SignInBox.prototype={
initialize:function(){
this.nextUrl=null;
this.onSignedIn=null;

widgets.SignInBox.g=this;
},

render:function(t){
if(lala.params.reason=='pwd'){
t.removeTokenBlock('DefaultBlock');
}else{
t.removeTokenBlock('PasswordBlock');
}
t.compose();




if(lala.user&&lala.user.email){
$('email').value=lala.user.email;
mojo.focus('userpwd');
}else{
mojo.focus('email');
}

return false;
},














onSubmit:function(){
try{
$D('errorRow',false);
mojo.util.validate({
fieldId:'email',
fieldName:'Email address',
type:'email',
isRequired:true});
mojo.util.validate({
fieldId:'userpwd',
fieldName:'Password',
type:'password',
isRequired:true});
$('signinButton').disabled=true;
lala.debugPagePath='secureSigninBox';
api.User.signin({
email:$F('email'),
userpwd:$F('userpwd'),
rm:$F('rm')
},this.onSignInServerResponse.lbind(this));
}catch(e){
$S('errorRow','<span>'+e.errMsg+'</span>');
$D('errorRow');
}
},




onSignInServerResponse:function(res){
var userToken=res.data.userToken;
if(!userToken){

$('signinButton').disabled=false;
$S('errorRow','<span>Invalid lala ID or Password</span>.<br>Please Try again.');
$D('errorRow');

$('pipeFrame').src=lala.staticBaseURL+"lib/core/blank.htm";
}else{
mojo.cookie.remove('inviteToken');
if(!lala.user)lala.user={};
lala.user.userToken=userToken;

var doDefault=true;



if(this.onSignedIn){
doDefault=this.onSignedIn(userToken);
}

if(doDefault){
this.goToNextPage();
}
}
},

goToNextPage:function(){
var url;
if(lala.params.action){
var actionUrl=lala.params.action;
var actionId=actionUrl.replace(/[\?\/].*$/,'');
url=lala.URL[actionId];

var pathAndQuery=actionUrl.substring(actionUrl.indexOf(actionId)+actionId.length);

if(pathAndQuery){
url+=pathAndQuery;
}
if(window.location.hash){
url+='#'+window.location.hash;
}



}else if(lala.params.path){
url=frontend.extractReturnURL();
}else if(lala.params.returnUrl){
url=lala.params.returnUrl;
}
if(url&&lala.params.ssl){
url=url.replace('http://','https://');
}
lala.gotoPage.url(url||this.nextUrl||lala.URL.Home);
}
};

strings.SignInBox={
enter_email:'Please enter your email address.',
enter_pwd:'Please enter your password.'
};




widgets.Influencers=Class.create();
widgets.Influencers.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.clickTrackingId=params.clickTrackingId||'influencersWidget';
this.subtitle=params.subtitle||'Listeners who help others discover music';
this.context=params.context;
this.evenMoreLink=params.evenMoreLink;
},

render:function(listOrPagedList){
var self=this;

var list;
var total;
var skip;
if(mojo.isDefined(listOrPagedList.total)){
list=listOrPagedList.list;
total=listOrPagedList.total;
skip=listOrPagedList.skip;
}else{
list=listOrPagedList;
total=listOrPagedList.length;
skip=0;
}
if(total==0)return;

var t=$T(lt.InfluencersWidget.main,this.renderTargetId);
t.replaceToken('influencerSubtitle',this.subtitle);

var ib=t.getTokenBlock('InfluencerRowBlock');



var context=this.context;
list.leach(function(item){
var user=item.user;
ib.replaceTokensWithBean('user',user)
.replaceToken('isCurrentUserFollowing',user.isCurrentUserFollowing?'true':'false')
.replaceToken('isOnline',user.isOnline?'true':'false')
.replaceToken('clickTrackingId',self.clickTrackingId)
.replaceToken('influencerScore',mojo.util.addCommasToNumber(item.user.influencerScore))
.replaceToken('is',item.user.influencerScore==1?'':'s');
if(!context){
ib.removeTokenBlock('ContextBlock');
}else{
ib.replaceToken('context',context)
.replaceToken('points',mojo.util.addCommasToNumber(item.score))
.replaceToken('ps',item.score==1?'':'s');
}
ib.next();
});

if(this.evenMoreLink&&(total>list.length)){
var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type','influencers')
.compose();
t.replaceToken('apageLink',linkHtml);
}

t.replaceToken('clickTrackingId',this.clickTrackingId);
t.compose();
}
};

widgets.TopListeners=Class.create();
widgets.TopListeners.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.clickTrackingId=params.clickTrackingId||'topListenersWidget';
this.subtitle=params.subtitle||'';
this.evenMoreLink=params.evenMoreLink;
},

render:function(listOrPagedList){
var self=this;

var list;
var total;
var skip;
if(mojo.isDefined(listOrPagedList.total)){
list=listOrPagedList.list;
total=listOrPagedList.total;
skip=listOrPagedList.skip;
}else{
list=listOrPagedList;
total=listOrPagedList.length;
skip=0;
}
if(total==0)return;

var t=$T(lt.TopListenersWidget.main,this.renderTargetId);
t.replaceToken('listenerSubtitle',this.subtitle);

var lb=t.getTokenBlock('ListenerRowBlock');
list.leach(function(pair){
var user=pair.B;
lb.replaceTokensWithBean('user',user)
.replaceToken('isCurrentUserFollowing',user.isCurrentUserFollowing?'true':'false')
.replaceToken('isOnline',user.isOnline?'true':'false')
.replaceToken('clickTrackingId',self.clickTrackingId)
.replaceToken('numListens',mojo.util.formatNumber(pair.A))
.next();
});

if(this.evenMoreLink&&(total>list.length)){
var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type','listeners')
.compose();
t.replaceToken('apageLink',linkHtml);
}

t.compose();
}
};




api.Alerts={
getNewItems:function(type,callback){
lala.sendRequest({
params:{type:type},
url:'Alerts/getNewItems',
onResponse:callback?callback:mojo.emptyFunction
});
}
};



api.Bookmarks={
DELETED:'bookmarkDeleted',
ADDED:'bookmarkAdded',

getBookmarks:function(sortDir,onResponse,count,skip){
lala.sendRequest({
url:'Bookmarks/getAll',
params:{count:count||25,skip:skip||0,sortDir:sortDir},
onResponse:onResponse
});
},

getSongBookmarks:function(sortDir,onResponse,count,skip){
this._getByType('Song',sortDir,onResponse,count,skip);
},

getArtistBookmarks:function(sortDir,onResponse,count,skip){
this._getByType('Artist',sortDir,onResponse,count,skip);
},

getAlbumBookmarks:function(sortDir,onResponse,count,skip){
this._getByType('Album',sortDir,onResponse,count,skip);
},

getPlaylistBookmarks:function(sortDir,onResponse,count,skip){
this._getByType('Playlist',sortDir,onResponse,count,skip);
},

_getByType:function(type,sortDir,onResponse,count,skip){
lala.sendRequest({
url:'Bookmarks/getByType',
params:{count:count||25,skip:skip||0,sortDir:sortDir,type:type},
onResponse:onResponse
});
},

addSong:function(songId,onResponse){
lala.Track.clientPage('interaction.bookmark.added.song');
lala.sendRequest({
url:'Bookmarks/addSongBookmark',
params:{songId:songId},
onResponse:onResponse
});
},

addAlbum:function(albumId,onResponse){
lala.Track.clientPage('interaction.bookmark.added.album');
lala.sendRequest({
url:'Bookmarks/addAlbumBookmark',
params:{albumId:albumId},
onResponse:onResponse
});
},

addArtist:function(artistId,onResponse){
lala.Track.clientPage('interaction.bookmark.added.artist');
lala.sendRequest({
url:'Bookmarks/addArtistBookmark',
params:{artistId:artistId},
onResponse:onResponse
});
},

addPlaylist:function(playlistId,onResponse){
lala.Track.clientPage('interaction.bookmark.added.playlist');
lala.sendRequest({
url:'Bookmarks/addPlaylistBookmark',
params:{playlistId:playlistId},
onResponse:onResponse
});
},

deleteBookmark:function(bookmarkId,onResponse){
lala.Track.clientPage('interaction.bookmark.deleted');
lala.sendRequest({
url:'Bookmarks/delete',
params:{bookmarkId:bookmarkId},
onResponse:function(res){
mojo.listeners.notify(api.Bookmarks.DELETED,{bookmarkId:bookmarkId});
onResponse(res);
}
});
}
};



api.Recos={
EVT_RECO_ALBUM:'evtRecoAlbum',
EVT_RECO_SONG:'evtRecoSong',
EVT_RECO_ARTIST:'evtRecoArtist',
EVT_RECO_PLAYLIST:'evtRecoPlaylist',

sendSongRecoFromMember:function(p){
lala.sendRequest(
{url:'Recos/sendSongRecoFromMember',
method:'POST',
params:{
lalaId:p.lalaId,
msg:p.msg,
members:p.members.lpluck('userToken'),
emails:p.emails
},
onResponse:function(res){
p.onResponse(res);
mojo.listeners.notify(api.Recos.EVT_RECO_SONG,
{song:p.shareObj,
members:p.members,
message:p.msg,
targetIds:p.facebookFriends});
}});
},

sendAlbumRecoFromMember:function(p){
lala.sendRequest(
{url:'Recos/sendAlbumRecoFromMember',
method:'POST',
params:{
lalaId:p.lalaId,
msg:p.msg,
members:p.members.lpluck('userToken'),
emails:p.emails
},
onResponse:function(res){
p.onResponse(res);
mojo.listeners.notify(api.Recos.EVT_RECO_ALBUM,
{album:p.shareObj,
members:p.members,
message:p.msg,
targetIds:p.facebookFriends});
}});
},

sendArtistRecoFromMember:function(p){
lala.sendRequest(
{url:'Recos/sendArtistRecoFromMember',
method:'POST',
params:{
lalaId:p.lalaId,
msg:p.msg,
members:p.members.lpluck('userToken'),
emails:p.emails
},
onResponse:function(res){
p.onResponse(res);
mojo.listeners.notify(api.Recos.EVT_RECO_ARTIST,
{artist:p.shareObj,
members:p.members,
message:p.msg,
targetIds:p.facebookFriends});
}});
},

sendPlaylistRecoFromMember:function(p){
lala.sendRequest(
{url:'Recos/sendPlaylistRecoFromMember',
method:'POST',
params:{
lalaId:p.lalaId,
msg:p.msg,
members:p.members.lpluck('userToken'),
emails:p.emails
},
onResponse:function(res){
p.onResponse(res);
mojo.listeners.notify(api.Recos.EVT_RECO_PLAYLIST,
{playlist:p.shareObj,
members:p.members,
message:p.msg,
targetIds:p.facebookFriends});
}});
},

_processAlbumResponse:function(res){
res.albums=res.data.discs;
return res.data.n;
},

killAlbum:function(albumId,showId,onResponse){
lala.sendRequest(
{url:'Recos/killAlbum',
params:{albumId:albumId,showId:showId},
onResponse:onResponse});
},

suspendAlbum:function(albumId,showId,onResponse){
lala.sendRequest(
{url:'Recos/suspendAlbum',
params:{albumId:albumId,showId:showId},
onResponse:onResponse});
}
};



widgets.UserList=Class.create();
widgets.UserList.all={};

widgets.UserList.prototype={


initialize:function(params){
this._wiid='userList'+mojo.idGenerator++;
this._template=params.template||lt.UserListWidget.main;
this.emptyText=params.emptyText||$TC(lt.UserListWidget.none);
this.renderTargetId=params.renderTargetId;
this.clickTrackingId=params.clickTrackingId||'userListWidget';
this.colCount=params.colCount||1;

widgets.UserList.all[this._wiid]=this;
},

getHtml:function(users){
var self=this;
if(!(users&&users.length>0)){
return $TC(this.emptyText);
}

var t=$T(this._template);
var rb=t.getTokenBlock('RowBlock');
var mb;
for(var i=0;i<users.length;i+=this.colCount){
mb=rb.getTokenBlock('MemberBlock');
users.slice(i,i+this.colCount).leach(function(u){
mb.replaceTokensWithBean('user',u)
.replaceToken('clickTrackingId',self.clickTrackingId)
.replaceToken('isCurrentUserFollowing',u.isCurrentUserFollowing?'true':'false')
.replaceToken('isOnline',u.isOnline?'true':'false')
.replaceToken('nickNameClassName',frontend.getMemberClassName(u))
.next();
});
rb.next();
}
return t.compose();
},

render:function(users){
$T(this.getHtml(users),this.renderTargetId).compose(true);
}
}



widgets.AddToPlaylist=Class.create();
widgets.AddToPlaylist.all={};

widgets.AddToPlaylist.prototype={
initialize:function(params){
if(!params)params={};
this._wiid=params.id||'addToPlaylist_'+mojo.idGenerator++;
this.count=params.count||6
this.upperCount=params.upperCount||8
this.ITEM_LINE_HEIGHT=18;
this.renderTargetId='';
this.title=params.title;
this.elemId=params.elemId;
this.relHackId=params.relHackId;

this.onOpen=params.onOpen||mojo.emptyFunction;
this.onClose=params.onClose||mojo.emptyFunction;

widgets.AddToPlaylist.all[this._wiid]=this;
},

onClick:function(params){
var self=this;
this.songsToAdd=params.songsToAdd;
this.title=params.title||this.title;
this.elemId=params.elemId||this.elemId;
if(params.onOpen)this.onOpen=params.onOpen;
if(params.onClose)this.onClose=params.onClose;

if(!this.pulldown){
this.pulldown=mojo.pulldown.create({
id:this._wiid,
target:this.elemId,
animate:false,
openBelowTarget:this.elemId,
disableOnClick:true,
relHackId:this.relHackId
});
}

if(this.pulldown.isVisible()){
this.pulldown.close();
if(this.pulldown.getTarget()==$(this.elemId))return;
}

this.pulldown.setTarget({target:this.elemId,openBelowTarget:this.elemId});
this.pulldown.onBeforeOpen=function(div){
var w=new widgets.core.RoundedBox({
renderTargetId:self._wiid,
mode:'dropShadow',
width:'225px'
}).render();
self.renderTargetId=w.contentId;
self.render();
$(self._wiid).onclick=function(evt){
mojo.event.create(evt).stopPropagation();
};

$('a2pContainer_'+self._wiid).onscroll=function(evt){
mojo.event.create(evt).stopPropagation();
};

self.onOpen();
};
this.pulldown.open({scrollId:'scrollableViewDiv',left:-23,top:-2},null,params.inHeader);
this.pulldown.onClose=this.onClose;
if(params.evt){

var evt=mojo.event.create(params.evt);
evt.stopPropagation();
}

},

render:function(myPlaylists){
if(!myPlaylists)myPlaylists=DataModel.g.getRecentPlaylists();
var count=Math.min(this.count,myPlaylists.length);

var t=$T(lt.AddToPlaylist.main,this.renderTargetId);
t.replaceToken('wiid',this._wiid);
var overflow='';
var height='';
if(myPlaylists.length<=count){
overflow='visible';
height='auto';
t.removeTokenBlock('MoreBlock');
}else{
overflow='hidden';
height=(this.count*this.ITEM_LINE_HEIGHT+3)+'px';
}
t.replaceToken('style','overflow:'+overflow+';height: '+height);
if(myPlaylists.length>0){
t.replaceToken('playlists',this._renderPlaylists(myPlaylists,count));
}else{
t.replaceToken('extraClass','addToPlaylistidgetNoPlaylists');
}

if(!this._shouldShowPrice()){
t.replaceToken('addPriceClass','lnone');
}else{
t.replaceToken('price',this._getDisplayPrice());
}
return t.compose();
},

_getDisplayPrice:function(){
return api.MicroWallet.credits>0?'1 credit'
:'$'+mojo.util.formatPrice(this.songsToAdd[0].addPrice);
},

_renderPlaylists:function(myPlaylists,count){
if(!mojo.isDefined(count))count=myPlaylists.length;
var t=$T(lt.AddToPlaylist.playlistItems);
var ib=t.getTokenBlock('ItemBlock');
for(var i=0;i<count;i++){
ib.replaceTokensWithBean('playlist',myPlaylists[i]);
if(!this._shouldShowPrice()||api.MicroWallet.credits>0){
ib.removeTokenBlock('PriceBlock');
}else{
ib.replaceToken('price',this._getDisplayPrice())
}
ib.replaceToken('wiid',this._wiid);
ib.next();
}
return t.compose();
},

_shouldShowPrice:function(){
return this.songsToAdd&&!this.songsToAdd[0].isDigied;
},

addSongsToNewPlaylist:function(){

var self=this;
MyMusic.g.openCreatePlaylistDialog(
function(playlist){
self.onAddToPlaylist(playlist.id);
});
this.pulldown.close();
},


onAddToPlaylist:function(dstPlaylistId){
var self=this;

if(!this.songsToAdd[0].isDigied){
mojo.assert(this.songsToAdd.length==1,"only supports single add");


frontend.buyWebSong(
this.songsToAdd[0],
null,
'addToPlaylist',
dstPlaylistId);
lala.Track.clientPageInteraction('addToPlaylist.notDigied');
}else{

MyMusic.g.addSongsToPlaylist(dstPlaylistId,this.songsToAdd);
lala.Track.clientPageInteraction('addToPlaylist.digied');
}
if(this.onAddedCallback)this.onAddedCallback();
this.pulldown.close();
},

showMore:function(evt){
mojo.event.create(evt).stopPropagation();

var myPlaylists=DataModel.g.getPlaylists();
if(myPlaylists.length>this.upperCount){
$AC(this._wiid+'_main','addToPlaylistWidgetExpanded');
}
$DC('showRecentPlaylistsLink_'+this._wiid,'lnone');
$S('addToPlaylistWidgetTitle_'+this._wiid,'Add to playlist:');
$D('addToPlaylist_moreLink_'+this._wiid,false);

var elem=$('a2pContainer_'+this._wiid);

if(myPlaylists.length>this.upperCount){
elem.style.overflowY='auto';
elem.style.height=this.upperCount*this.ITEM_LINE_HEIGHT+3+"px";
}else{
elem.style.overflow='visible';
elem.style.height='auto';
}
$S(elem,this._renderPlaylists(DataModel.g.getPlaylists()));
},

showRecent:function(evt){
mojo.event.create(evt).stopPropagation();
this.render();
}
};



api.Content={
getHelpConfig:function(configId,onResponse,ignoreWhiteSpace){
var self=this;
lala.sendRequest(
{url:'Content/getHelpConfig',
params:{configId:configId},
onResponse:function(res){
if(!res.data){
onResponse(res);
return;
}

var allTopics=[];
res.data.categories.leach(function(cat){
allTopics.laddAll(cat.topics);
cat.subCategories.leach(function(sub){
allTopics.laddAll(sub.topics);
});
});

allTopics.leach(function(topic){
self.normalizeTopic(topic,ignoreWhiteSpace);
});

onResponse(res);
}});
},

getClientBlob:function(subtype,blobId,onResponse){
lala.sendRequest(
{url:'Content/getClientBlob',
params:{subtype:subtype,blobId:blobId},
onResponse:onResponse});
},

getClientBlobForPreview:function(subtype,blobId,onResponse){
lala.sendRequest(
{url:'Content/getClientBlobForPreview',
params:{subtype:subtype,blobId:blobId},
onResponse:onResponse});
},

getContentForCustomPage:function(discs,songs,onResponse){
lala.sendRequest(
{url:'Content/getContentForCustomPage',
params:{discs:discs,songs:songs},
onResponse:onResponse,
method:'POST'}
);
},

getContactSupport:function(onResponse){
lala.sendRequest(
{url:'Content/getContactSupport',
params:{},
onResponse:onResponse});
},

getContactStoreSupport:function(params,onResponse){
lala.sendRequest(
{url:'Content/getContactStoreSupport',
params:{itemType:params.itemType,itemToken:params.itemToken},
onResponse:onResponse});
},

getHelpWizard:function(params,onResponse){
lala.sendRequest(
{url:'Content/getHelpWizard',
params:{transToken:params.transToken,
context:params.context},
onResponse:onResponse})
},

normalizeTopic:function(topic,ignoreWhiteSpace){
if(!ignoreWhiteSpace){
topic.text=topic.text.lescapeWhiteSpace();
}

topic.text=widgets.core.Util.replaceLalaLinks(topic.text);
}
};



widgets.AlbumList=Class.create();
widgets.AlbumList.all={};

widgets.AlbumList.prototype={
initialize:function(params){
if(!params)params={};
this._wiid='albumList_'+mojo.idGenerator++;
this.layout=params.layout||'grid';
this.evenMoreLink=params.evenMoreLink;
this._noAlbumsTemplate=params.noAlbumsTemplate||lt.AlbumList.noAlbums;
this._hideArtist=params.hideArtist;
this._showGenre=params.showGenre;
this._showNum=params.showNum;
this._isArtistAlbums=params.isArtistAlbums;
this._whichListen=params.whichListen||'listens7';
this.trackingId=params.trackingId||'albumList';
this.clickTrackingId=params.clickTrackingId||'albumListWidget';
this.renderTargetId=params.renderTargetId;
this.toggleId=params.toggleId;
this.showKill=params.showKill;
this.moreType=params.moreType||'albums';
this.dateFormat=params.dateFormat||'%Y';
this.useReleaseDate=params.useReleaseDate;
this.showPriceField=params.showPriceField;
this.hideExtraInfo=params.hideExtraInfo;
this.hideYear=params.hideYear;
this.listAlbumImgSize=params.listAlbumImgSize||'small';
this.startNum=mojo.isDefined(params.startNum)?params.startNum:0;

this._songs=[];
this.pagedList={};
this.onViewModeToggledCallback=mojo.emptyFunction;
this.skip=0;
this.albums=null;

this.showMp3Price=params.showMp3Price||false;
this.showWebPrice=params.showWebPrice||false;

if(this.showMp3Price||this.showWebPrice){
this.albumPriceListener_Init(this.onAlbumPriceChange.lbind(this));
}
widgets.AlbumList.all[this._wiid]=this;
},

albumPriceListener_GetAlbumById:function(discId){
return this._getAlbumById(discId);
},

_getAlbumById:function(discId){
if(this.albums)return this.albums.lfindIf('id',discId,false,true);
else return null;
},

renderPod:function(pagedList,title){
var randomId=mojo.idGenerator++;
$T(lt.AlbumList.pod,this.renderTargetId)
.replaceToken('title',title)
.replaceToken('id',randomId)
.compose();
this.renderTargetId='albumListPod_'+randomId;
this.layout='listNarrow';

this.render(pagedList);
},

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

getHtml:function(pagedList,useLayout,setLast){
if(useLayout){
this.layout=useLayout;
}

var total;

if(mojo.isDefined(pagedList.total)){
this.albums=pagedList.list;
total=pagedList.total;
this.skip=pagedList.skip;
}else{
this.albums=pagedList;
total=pagedList.length;
this.skip=0;
}

if(this.albums.length==0){
return $TC(this._noAlbumsTemplate);
}
var t=null;
switch(this.layout){
case'list':
t=$T(lt.AlbumList.listLayout);
break;
case'grid':
t=$T(lt.AlbumList.gridLayout)
.replaceToken('layoutView','gridLayout');
break;
case'feed':
t=$T(lt.AlbumList.feedLayout)
.replaceToken('layoutView','feedLayout');
break;
case'gift':
t=$T(lt.AlbumList.gridLayout,this.renderTargetId)
.replaceToken('layoutView','giftLayout');
break;
case'listNarrow':
t=$T(lt.AlbumList.listNarrowLayout);
break;
}
t.replaceToken('wiid',this._wiid);
t.replaceToken('clickTrackingId',this.clickTrackingId);

var isLast=mojo.isDefined(setLast)?setLast:(i==this.albums.length-1);
var l=t.getTokenBlock("AlbumBlock");
for(var i=0;i<this.albums.length;i++){
this.replaceAlbumTokens(
this.albums[i],
i,
this.skip+i+1+this.startNum,
isLast,
l);
l.next();
}
this.pagedList.list=this.albums;
this.pagedList.total=total;
this.pagedList.skip=this.skip;

if(this.evenMoreLink&&(total>this.albums.length)){


var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type',this.moreType)
.compose();
t.replaceToken('apageLink',linkHtml);
}

if(this.toggleId){
this.renderToggleLayout();
}

return t.compose();
},

replaceAlbumTokens:function(disc,i,num,isLast,tmpl){
tmpl.dateFormatString=this.dateFormat;
tmpl.replaceToken('heightOverride',
this.showKill?'height: 78px"':'');
if(this.useReleaseDate){
tmpl.replaceToken('displayDate',disc.releaseDate);
}else{
tmpl.replaceToken('displayDate',disc.year);
}

tmpl.replaceToken('lastOne',isLast?'lastOne':'');
tmpl.replaceToken('index',i);

if(this.showPriceField){
tmpl.replaceToken(
'webPrice',
mojo.util.formatPrice(disc.webAlbumPriceInCents));


if(!disc.isFreeMp3&&disc.downloadMissingTracksCount>0
&&disc.downloadMissingTracksPriceInCents==0){
disc.isFreeMp3=true;
}
var mp3Price=disc.isFreeMp3?'Free'
:'$'+mojo.util.formatPrice(disc.downloadAlbumPriceInCents);

tmpl.replaceToken('mp3Price',mp3Price);
tmpl.getTokenBlock('PriceBlock')
.removeTokenBlock('WebPriceBlock',!this.showWebPrice||disc.webAlbumPriceInCents<=0)
.removeTokenBlock('MP3PriceBlock',!this.showMp3Price
||(disc.downloadAlbumPriceInCents<=0&&!disc.isFreeMp3));
}else{
tmpl.removeTokenBlock('PriceBlock');
}

tmpl.removeTokenBlock('YearBlock',this.hideYear);

if(disc.type=='Album'){
disc.typeUI='';
}else{
disc.typeUI=' ('+disc.type+')';
}
if(this.layout=='list'){
tmpl.replaceToken('smallOrTiny',this.listAlbumImgSize);
if(this._hideArtist){
tmpl.replaceToken('artistStyle','display:none');
}
if(this._isArtistAlbums){
tmpl.replaceToken('artistPageStyle','padding-top: 10px');
}
if(this._showNum){
tmpl.replaceToken('num',num);
}else{
tmpl.removeTokenBlock('NumBlock');
}

if(!this._showGenre){
tmpl.removeTokenBlock('GenreBlock');
}

tmpl.replaceToken('s',disc.albumTrackCount==1?'':'s');
if(disc.nbdisc>1){
tmpl.getTokenBlock('DiscCountBlock').replaceToken('discCount',disc.nbdisc);
}else{
tmpl.removeTokenBlock('DiscCountBlock');
}
if(disc.isLicensedForStreaming||disc.isAllTracksDigied){
if(this.hideExtraInfo){
tmpl.removeTokenBlock('ExtraInfoBlock');
}else{
var extraInfoBlock=tmpl.getTokenBlock('ExtraInfoBlock');
if(disc[this._whichListen+'Rank']>1000){
extraInfoBlock.removeTokenBlock('RankBlock');
}else{
extraInfoBlock.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:disc.listensTrend,
size:'micro',
what:'album'
}));
}

var listenCount=disc[this._whichListen];
extraInfoBlock.replaceToken('s',listenCount==1?'':'s')
.replaceToken('listenCount',mojo.util.addCommasToNumber(listenCount));

extraInfoBlock.keepTokenBlock('BillboardBlock',disc.billboardChartPosition);
}
}else{
tmpl.removeTokenBlock('ExtraInfoBlock');
}


if((this.showWebPrice&&disc.isLicensedForStreaming)
||(this.showMp3Price&&disc.isLicensedForDownload)){
tmpl.replaceToken('buyArea',this._getPriceArea(disc));
tmpl.replaceToken('titleStyle','width:75%');
}else{
tmpl.removeTokenBlock('BuyBlock');
}

if(!this.showKill){
tmpl.removeTokenBlock('KillBlock');
}

if(!disc.subgenre){
tmpl.removeTokenBlock('SubGenreBlock');
}
}

if(((this.layout=='list'||this.layout=='grid')
&&frontend.isDiscMP3Only(disc))){
tmpl.replaceToken('mp3Only','true');
}else{
tmpl.replaceToken('mp3Only','false');
}


var showSpecialTag=!!(disc.isPromoPriceSet&&!disc.isFreeMp3);
tmpl.replaceToken('showSpecialTag',showSpecialTag);
tmpl.replaceToken('showFreeMp3Tag',!!disc.isFreeMp3);

tmpl.replaceToken('listens',
mojo.util.formatBigNumber(disc[this._whichListen]));
tmpl.replaceTokensWithBean('disc',disc);
},


_getPriceArea:function(disc){

var buyArea=$T(lt.AlbumList.buyArea);
if((this.showWebPrice&&this.showWebPrice&&disc.addMissingTracksCount==0)
||(!this.showWebPrice&&this.showMp3Price&&disc.downloadMissingTracksCount==0)){
buyArea.removeTokenBlock('PriceBlock');
buyArea.removeTokenBlock('ButtonBlock');
buyArea.removeTokenBlock('SavingsBlock');
}else{
buyArea.replaceToken('buttonLabel',this.showWebPrice?'web':'MP3');
buyArea.replaceToken('buttonAction',this.showWebPrice?'Web':'Mp3');
buyArea.removeTokenBlock('CheckmarkBlock');

var indPrice=this.showWebPrice?disc.addMissingTracksPriceInCents
:disc.downloadMissingTracksPriceInCents;
var price='';
var priceUI='';
if(this.showWebPrice){
price=StoreUtil.getRealWebPrice(disc);
priceUI='$'+mojo.util.formatPrice(price);
}else{
price=StoreUtil.getRealDownloadPrice(disc);
if(disc.downloadMissingTracksCount>0
&&disc.downloadMissingTracksPriceInCents==0){
disc.isFreeMp3=true;
}
priceUI=disc.isFreeMp3?'Free':'$'+mojo.util.formatPrice(price);
}


if(indPrice!=price){
var saveCents=indPrice-price;
buyArea.replaceToken('saveCents',mojo.util.formatPrice(saveCents));
}else{
buyArea.replaceTokenBlock('SavingsBlock','<div>&nbsp;</div>');
}
buyArea.replaceToken('price',priceUI);
}

buyArea.replaceToken('wiid',this._wiid);
buyArea.replaceTokensWithBean('disc',disc);
return buyArea.compose();
},

onAlbumPriceChange:function(album){


if($('buyArea_'+this._wiid+'_'+album.id)){
$S('buyArea_'+this._wiid+'_'+album.id,this._getPriceArea(album));
}
},

renderToggleLayout:function(){
$T(lt.AlbumList.layoutToggle,this.toggleId)
.replaceToken('wiid',this._wiid)
.compose();
mojo.css.addClass($(this._wiid+'_toggle_'+this.layout),'selected');
},


toggleLayout:function(layout){
mojo.css.removeClass($(this._wiid+'_toggle_'+this.layout),'selected');
this.layout=layout;
this.render(this.pagedList);
mojo.css.addClass($(this._wiid+'_toggle_'+layout),'selected');

this.onViewModeToggledCallback(this.layout);
},

onPlayAlbum:function(index){
if(index>=this.pagedList.list.length)return;
var album=this.pagedList.list[index];
Player.g.playAlbum(album,this.trackingId);
},

onAddAlbum:function(index){
var self=this;
var disc=this.pagedList.list[index];

widgets.store.openBuyWebAlbumDialog(
disc,
function(res){
$S(self._wiid+'_alw_addDiv_'+disc.id,
widgets.SongList.IN_ICON);
});
},

onKillArtist:function(index){
var album=this.pagedList.list[index];
var self=this;
api.Recos.killArtist(album.artist,function(res){
$D(self._wiid+'_albumThumb_'+index,false);
});
},

onKillAlbum:function(index){
var album=this.pagedList.list[index];
var self=this;
api.Recos.killAlbum(album.id,album.groupId,function(res){
$D(self._wiid+'_albumThumb_'+index,false);
});
},

onBuyWebAlbum:function(discId){
var album=this._getAlbumById(discId);
widgets.store.openBuyWebAlbumDialog(album,mojo.emptyFunction);
},

onBuyMp3Album:function(discId){
var album=this._getAlbumById(discId);
widgets.store.openBuyAlbumDownloadDialog(album,mojo.emptyFunction);
},

getAlbumById:function(discId){
return this.pagedList.list.lfindIf('id',discId,null,true);
}
};
Object.extend(widgets.AlbumList.prototype,AlbumPriceListener,true);

widgets.AlbumListSimple=Class.create();
widgets.AlbumListSimple.all={};
widgets.AlbumListSimple.prototype={
initialize:function(params){
this.wiid='albumListSimple_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
this.title=params.title;
this.subtitle=params.subtitle;
this.displayCount=params.displayCount||100000;
this.customHeading=params.customHeading;
this.clickTrackingId=params.clickTrackingId;
this.evenMoreLink=params.evenMoreLink;
this.layout=params.layout||'chartWithImages';

widgets.AlbumListSimple.all[this.wiid]=this;
},

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

getHtml:function(albumsOrPagedList){
var albums;
var total;
if(mojo.isDefined(albumsOrPagedList.total)){
albums=albumsOrPagedList.list;
total=albumsOrPagedList.total;
}else{
albums=albumsOrPagedList;
total=albumsOrPagedList.length;
}

if(albums.length==0)return;

var self=this;

var t=$T(lt.AlbumListSimpleWidget.listWithImages);
t.replaceToken('modeClass',this.layout);
t.replaceToken('title',this.title);
t.replaceToken('subtitle',this.subtitle);
t.replaceToken('wiid',this.wiid);
t.replaceToken('clickTrackingId',this.clickTrackingId);
if(this.customHeading){
t.replaceTokenBlock('HeadingBlock',this.customHeading);
}

var imgIter=t.getTokenBlock('PicsBlock');
for(var i=0;i<albums.length&&i<3;i++){
var album=albums[i];
imgIter.replaceTokensWithBean('album',album);
t.replaceToken('mp3Only',frontend.isDiscMP3Only(album));
imgIter.next();
}

var albumBlock=null;
switch(this.layout){
case'listWithImages':
t.removeTokenBlock('RankingsAlbumBlock');
albumBlock=t.getTokenBlock('ListAlbumBlock');
break;
case'chartWithImages':
default:
t.removeTokenBlock('ListAlbumBlock');
albumBlock=t.getTokenBlock('RankingsAlbumBlock');
}
albums.leach(function(album,index){
albumBlock.replaceTokensWithBean('album',album);
albumBlock.replaceToken('num',index+1);
albumBlock.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:album.listensTrend,
what:'album',
size:'sml'
}));
albumBlock.replaceToken('offscreenRow',index>(self.displayCount-1)?'offscreenRow':'')
albumBlock.replaceToken('style',index>(self.displayCount-1)?'display:none':'')
albumBlock.next();
});

if(this.evenMoreLink&&(total>this.displayCount)){
var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type','albums')
.compose();
t.replaceToken('apageLink',linkHtml);
}
return t.compose();
}
};




api.Messaging={
EVT_REVIEW_CREATED:'evtReviewCreated',
getThreads:function(args){
lala.sendRequest(
{url:'Messaging/getThreads',
params:{src:args.src,dst:args.dst,
type:args.type,subtype:args.subtype,
subject:args.subject,
includeAutoHide:args.includeAutoHide,
skip:0,
count:args.count},
onResponse:function(res){
api.Messaging._preprocessListResponse(res,args.onResponse);
}});
},

getBlurbs:function(args){
lala.sendRequest(
{url:'Messaging/getBlurbs',
params:{src:args.src,dst:args.dst,
type:args.type,subtype:args.subtype,
subject:args.subject,
includeAutoHide:args.includeAutoHide,
skip:0,
count:args.count},
onResponse:function(res){



for(var i in res.data.data){
res.data[i]=res.data.data[i];
}
delete res.data.data;
api.Messaging._preprocessListResponse(res,args.onResponse);
}});
},

getReplies:function(args){
lala.sendRequest(
{url:'Messaging/getReplies',
params:{threadToken:args.threadToken},
onResponse:function(res){
api.Messaging._preprocessMessages(res.data.list);
args.onResponse(res);
}});
},

getSubTypes:function(args){
lala.sendRequest(
{url:'Messaging/getSubTypes',
params:{type:args.type},
onResponse:function(res){
args.onResponse(res);
}});
},

deleteThread:function(args){
lala.sendRequest(
{url:'Messaging/deleteThread',
params:{threadToken:args.threadToken},
onResponse:args.onResponse});
},

deleteReply:function(args){
lala.sendRequest(
{url:'Messaging/deleteReply',
params:{msgToken:args.msgToken},
onResponse:args.onResponse});
},

createThread:function(args){
if(api.Messaging.processLinksInText(
args,
api.Messaging.createThread))return;

lala.sendRequest(
{url:'Messaging/createThread',
params:{src:args.src,dst:args.dst,
type:args.type,subtype:args.subtype,
text:args.text,subject:args.subject,
transToken:args.transToken,
rating:args.rating,
discId:args.discId,
origText:args.origText},
method:'POST',
onResponse:function(res){
api.Messaging.normalizeMessage(res.data);
args.onResponse(res);
}});
},

processLinksInText:function(args,apiFunc){
if(args.generateLinks){
widgets.core.Util.generateLalaLinks(
args.text,
function(newText){
args.generateLinks=false;
args.origText=args.text;
args.text=newText;
apiFunc(args);
});
return true;
}
return false;
},

decorateIds:function(ids,types,onResponse){
lala.sendRequest(
{url:'Messaging/decorateIds',
params:{ids:ids,types:types},
onResponse:onResponse});
},

updateReply:function(args){
if(api.Messaging.processLinksInText(
args,
api.Messaging.updateReply))return;

lala.sendRequest(
{url:'Messaging/updateReply',
params:{replyToken:args.msgToken,text:args.text,rating:args.rating},
method:'POST',
onResponse:function(res){
api.Messaging.normalizeMessage(res.data);
args.onResponse(res)}});
},

updateThread:function(args){
if(api.Messaging.processLinksInText(
args,
api.Messaging.updateThread))return;

lala.sendRequest(
{url:'Messaging/updateThread',
params:{threadToken:args.threadToken,
subject:args.subject,
text:args.text,
isDefault:args.isDefault,
threadName:args.threadName},
method:'POST',
onResponse:function(res){
api.Messaging.normalizeMessage(res.data);
args.onResponse(res)}});
},

addReply:function(args){
if(api.Messaging.processLinksInText(
args,
api.Messaging.addReply))return;

lala.sendRequest(
{url:'Messaging/addReply',
params:{threadToken:args.threadToken,
text:args.text,
origText:args.origText},
method:'POST',
onResponse:function(res){
api.Messaging.normalizeMessage(res.data);
args.onResponse(res)}});
},

stickThread:function(args){
lala.sendRequest(
{url:'Messaging/stickThread',
params:{threadToken:args.threadToken,
onoff:args.onoff},
onResponse:args.onResponse});
},

lockThread:function(args){
lala.sendRequest(
{url:'Messaging/lockThread',
params:{threadToken:args.threadToken,
onoff:args.onoff},
onResponse:args.onResponse});
},

moderateThread:function(args){
lala.sendRequest(
{url:'Messaging/moderateThread',
params:{threadToken:args.threadToken,
subtype:args.subtype},
onResponse:function(res){
args.onResponse(res)}});
},

_preprocessListResponse:function(res,onResponse){
res.data.threads=res.data.list;
res.data.threadsByToken={};

for(var i=0;i<res.data.list.length;i++){
var thread=res.data.threads[i];
res.data.threadsByToken[thread.msgToken]=thread;
}

this._preprocessMessages(res.data.threads);
onResponse(res);
},

_preprocessMessages:function(msgs){
for(var i=0;i<msgs.length;i++){
var msg=msgs[i];
this.normalizeMessage(msg);
if(msg.lastMsg)this.normalizeMessage(msg.lastMsg);
}
},

normalizeMessage:function(msg){
if(msg.text){
msg.origText=msg.text;
if(msg.type=="NextHelp"&&msg.subtype=="Phoenix"){
msg.text=msg.text.lescapeWhiteSpace();
}else{
msg.text=msg.text.lescapeHTML(true);
}
msg.text=this.replaceLalaLinks(msg.text);



msg.innerText=mojo.util.htmlToText(msg.text);
}

if(msg.subject){
msg.origSubject=msg.subject;
msg.subject=msg.subject.lescapeHTML(true);
}

if(msg.src&&(msg.type&&msg.type!='Artist')){
msg.srcMemberHref=this.getMemberHref(msg.src.userToken);
msg.srcMemberUrl=this.getMemberImageUrl(msg.src);

}else if(msg.type&&msg.type=='Artist'){
msg.src={};
msg.srcMemberUrl='images/free_tshirt_girl.jpg';
msg.src.nickName='Lala';
}
if(!msg.createTime&&msg.timestamp){
msg.createTime=new Date(parseFloat(msg.timestamp));
}
}
};

Object.extend(api.Messaging,{
replaceLalaLinks:function(msgText){
return msgText;
},
getMemberHref:function(userToken){
mojo.log.error('api messaging msgclient missing method');
},
getMemberImageUrl:function(user){
mojo.log.error('api messaging msgclient missing methodreturn');
}
});




widgets.FriendList=Class.create();
widgets.FriendList.all={};
widgets.FriendList.prototype={
initialize:function(params){
this.renderTargetId=params.renderTargetId;
this.wiid=params.id||'friendBox_'+mojo.idGenerator++;
this.template=params.template||lt.FriendListWidget.main;
this.searchMemberMode=!!params.searchMemberMode;
this.checkbox=params.checkbox;
this.trackingId=params.trackingId||'friendListWidget';
this.onPagingCallback=params.onPagingCallback||mojo.emptyFunction;

this.changeSortOrderCallback=mojo.emptyFunction;




this.friendList=params.friendList||false;

this.showSorter=params.showSorter||false;
this.confirmMode=params.confirmMode||false;

this.sortOrder=params.sortOrder||'LoginTimestamp';
this.sortAsc=params.sortAsc||false;
this.users=null;
this.userCount=0;
this.newMembers={};

this.shouldRemoveOnStopFollow=params.shouldRemoveOnStopFollow||false;
this.shouldRemoveOnBlock=params.shouldRemoveOnBlock||false

this.showingDetails=true;
widgets.FriendList.all[this.wiid]=this;

this.addSongWidgetListener_Init();
},

render:function(usersOrPagedUsers,emptyT,pagedRes,newMembers){
var self=this;
var users=usersOrPagedUsers;
var pagedList=null;
this.newMembers=newMembers||{};
if(mojo.isDefined(usersOrPagedUsers.total)){

users=usersOrPagedUsers.list;
pagedList=usersOrPagedUsers;
}

if(users.length==0){
$TC(emptyT,this.renderTargetId);
return;
}

var t=$T(this.template,this.renderTargetId);
t.replaceToken('wiid',this.wiid);
t.replaceToken('hideOrShow',this.showingDetails?'Hide':'Show');


if(!this.showSorter){
t.removeTokenBlock('SorterBlock');
}

var ut=t.getTokenBlock('UserBlock');
ut.dateFormatString="%b %d, %Y";

this.relationshipBoxes=[];
users.leach(function(user,index,isLast){
ut.replaceToken('isNewFollow',self.newMembers[user.id]?'inline':'none')
ut.replaceToken('index',index);
ut.replaceToken('detailsDisplay',self.showingDetails?'':'none');

var displayName=user.nickName;
var tokens={
userNickNameJs:displayName.lescapeQuotes()
};

ut.replaceTokensWithMap(tokens);
ut.replaceTokensWithBean('user',user);
if(user.uniqueFact){
ut.replaceToken('uniqueFact',widgets.core.Util.replaceLalaLinks(user.uniqueFact));
}

if(!user.isOnline)ut.removeTokenBlock('IsOnlineBlock');
if(user.isEmployee)ut.replaceToken('usernameClass','lemployeelink');

var relBox=new widgets.core.Relationship({
mode:'lite',
them:user,
trackingId:self.trackingId,
renderTargetId:'relationshipBox_'+self.wiid+'_'+user.userToken,
stopFollowingCallback:self.onStoppedFollowing.lbind(self),
blockCallback:self.onBlocked.lbind(self)
});
self.relationshipBoxes.ladd(relBox);
ut.replaceToken('relBox',relBox.getHTML());
if(!self._isCurrentUser(user)){
ut.replaceToken('giftPromo',widgets.core.GiftCards.getGiftToMemberHtml(user.userToken,'giftCardsPage.from.'+self.trackingId));
}

if(!user.isPrivate){
if(user.uniqueFact){
var text=user.uniqueFact;
text=text.lescapeHTML(true);

ut.replaceToken('user.uniqueFact',text);
}else{
ut.removeTokenBlock('FactBlock');
}

if(user.lastLogin)
ut.replaceToken('lastOnline',new Date(parseInt(user.lastLogin)).lgetDaysAgoLabel(null,null,true,'%B %e, %Y'));
if(!user.lastListen){
ut.removeTokenBlock('SongBlock');
}else{
ut.replaceToken('title',user.lastListen.title.lescapeHTML());
ut.dateFormatString='%B %e, %Y';
ut.replaceToken('artist',user.lastListen.artist.lescapeHTML());
ut.replaceToken('songLalaId',user.lastListen.songLalaId);





var playImg='';
var playType='Not yet available for streaming';
var song=user.lastListen;

if(song.playType!='NotPlayable'){
playImg=song.isLicensedForStreaming||song.isDigied
?'play_icon_full':'play_icon_30';
playType=song.isLicensedForStreaming
?'Play full length song ('+mojo.util.secondsToTime(song.duration,true)+')'
:song.isDigied?'Play song from your collection'
:'Play 30 second sample';
}else{
playImg='play_icon_dim_small';
}
t.replaceToken('playIcon',playImg);
t.replaceToken('playType',playType);
}
}else{
ut.removeTokenBlock('SongBlock');
ut.removeTokenBlock('LastOnlineBlock');
ut.removeTokenBlock('FactBlock');
ut.replaceToken('private','This user\'s profile is private');
}
ut.next();
});


if(pagedRes){
var paginator=new widgets.core.Paginator();
paginator.recordBackEvents=true;
paginator.renderToken(pagedRes,t,'pagingControlsTop','lite',pagedList);
paginator.renderToken(pagedRes,t,'pagingControlsBottom','big',pagedList);
if(pagedList&&pagedList.list.length==pagedList.total){
t.removeTokenBlock('PagingBlock');
}
}else{
t.removeTokenBlock('PagingBlock');
}

if(pagedRes&&pagedRes.req.params.count>=pagedRes.data.total){
t.replaceToken('pageSplitterDisplay','display:none');
}
t.compose();

if(this.showSorter){
var sorterOrder=this.sortOrder;
if(sorterOrder=='Alpha'&&this.sortAsc){
sorterOrder='a-z';
}
else if(sorterOrder=='Alpha'&&!this.sortAsc){
sorterOrder='z-a';
}
mojo.form.selectOption('sortOrder',sorterOrder);
}

this.users=users;
this.userCount=users.length;
},

_isCurrentUser:function(userToTest){
return(lala.user&&lala.user.userToken==userToTest.userToken);
},

onPlaySong:function(index){
var user=this.users[index];
if(user.lastListen&&user.lastListen.playToken){
Player.g.playSong(user.lastListen,'friendList');
}
},

onPlayButtonHover:function(index,button,evt){
var song=this.users[index].lastListen;
if(!(song.isLicensedForStreaming||song.isDigied))return;
var offsets={};
if(mojo.SAFARI&&!mojo.MAC)offsets.top=2;
else if(mojo.IE6)offsets.left=0;
else if(mojo.FF3)offsets.top=-2;
else if(mojo.FF2)offsets.top=-1;
else if(mojo.CHROME)offsets.top=1;
widgets.core.PlayButtonHover.open('small',song,button,evt,offsets,null,this.trackingId);
},

addSongWidgetListener_GetSongByLinkLalaId:function(linkSongLalaId){
var user=this.users.lfindObjectWithSubKey('lastListen','linkSongLalaId',linkSongLalaId);
return user?user.lastListen:null;
},

selectOrDeselectAll:function(select){
var el;
for(var i=0;(el=$('checkbox_'+i));i++){
el.checked=select;
}
},

getSelectedUserTokens:function(){
var el;
var selectedUsers=[];
for(var i=0;(el=$('checkbox_'+i));i++){
if(el.checked)selectedUsers.push(el.getAttribute('_userToken'));
}
return selectedUsers;
},

setSortOrder:function(sortOrder){
this.sortOrder=sortOrder;
this.sortAsc=false;

if(this.sortOrder=='a-z'){
this.sortAsc=true;
this.sortOrder='Alpha';
}else if(this.sortOrder=='z-a'){
this.sortOrder='Alpha';
}

this.changeSortOrderCallback();
},

changeSortOrder:function(){
this.setSortOrder($F('sortOrder'));
},

onToggleDetails:function(){
this.showingDetails=!this.showingDetails;
this.users.leach(function(user){
mojo.css.toggleDisplay('minorDetails_'+user.userToken);
});

if(!this.showingDetails){
this.relationshipBoxes.leach(function(box){
box.render();
});
}
var toggleLink=$('toggle_'+this.wiid);
if(this.showingDetails){
$S(toggleLink,'Hide details');
}else{
$S(toggleLink,'Show details');
}
},

onStoppedFollowing:function(user){
if(this.shouldRemoveOnStopFollow)this._hideUser(user);
},

onBlocked:function(user){
if(this.shouldRemoveOnBlock||this.shouldRemoveOnStopFollow){
this._hideUser(user);
}
},

_hideUser:function(user){
if($('friend_'+user.userToken)){

mojo.table.deleteRow('friend_'+user.userToken);

this.userCount--;
if(this.userCount==0){
$D(this.renderTargetId,false);
}
}
}
};
Object.extend(widgets.FriendList.prototype,AddSongWidgetListener,true);



widgets.ShareEmailOrLalaTabs=Class.create();
widgets.ShareEmailOrLalaTabs.all={};
widgets.ShareEmailOrLalaTabs.prototype={
initialize:function(params){
this.wiid=params.id||'shareEmailOrLalaTabs_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId||'';
this.onTabClickExternal=params.onTabClickExternal||mojo.emptyFunction;
this.isGift=params.singleSelect;

params.renderTargetId='pickerContent';
this.selector=new widgets.FriendOrMemberSelector(params);

widgets.ShareEmailOrLalaTabs.all[this.wiid]=this;
},

render:function(isClick){
$TC(lt.ShareEmailOrLalaTabs.main,this.renderTargetId);

this.tabs=mojo.newtabs.create({
id:'shareStuff',
divTabsId:'shareEmailOrLalaTabsContainer',
divTabsContentId:'pickerContent'
});
this.tabs.onTabClick=this.onTabClick.lbind(this);

if(lala.user){
this.tabs.add({
id:'friendsShareTab',
title:'<img src="lib/widgets/Share/images/lala_icon_16.gif" '
+'class="tabIcon"/> Lala members'
});
}

this.tabs.add({
id:'emailShareTab',
title:'<img src="lib/widgets/Share/images/mail_icon_16.gif" '
+'class="tabIcon"/> Email addresses'
});
if(!this.isGift&&lala.showFacebookConnect){
this.tabs.add({
id:'facebookShareTab',
title:'<img src="images/facebook/fb_favicon.gif" '
+'class="tabIcon"/> Facebook friends'
});
mojo.geometry.setBounds('shareDialog',{width:570});
}

this.tabs.activate(lala.user?'friendsShareTab':'emailShareTab');
},

onTabClick:function(tab,isClick){
if(tab.id=='friendsShareTab'){
this.selector.showFriends(null,isClick);
}else if(tab.id=='facebookShareTab'){
this.selector.showFacebookFriends(null,isClick);
}
this.onTabClickExternal(tab);
}
};

widgets.FriendOrMemberSelector=Class.create();
widgets.FriendOrMemberSelector.all={};
widgets.FriendOrMemberSelector.prototype={
initialize:function(params){
this.wiid=params.wiid||'friendMemberSelectorWidget_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;
widgets.FriendOrMemberSelector.all[this.wiid]=this;

this.picker=new widgets.PeoplePicker({
renderTargetId:'shareFriends_'+this.wiid,
singleSelect:params.singleSelect,
autoCompleteId:'friendAutoCompleteDiv',
maxRecipients:params.maxRecipients,
selected:params.selected
});
this.memberPicker=new widgets.PeoplePicker({
renderTargetId:'shareMembers_'+this.wiid,
singleSelect:params.singleSelect,
maxRecipients:params.maxRecipients,
selected:params.selected
});
this.picker.onSelectFriend=params.onSelectFriend||mojo.emptyFunction;
this.memberPicker.onSelectFriend=params.onSelectFriend||mojo.emptyFunction;
var self=this;

this.doThisWhenNoFriends=function(){
self.showMembers(null,true);
};
this.pickerHeadingText=params.pickerHeadingText||'Click to add your friends';
},

showMembers:function(evt,noFriends){
var t=$T(lt.FriendOrMemberSelector.memberPickerContent,this.renderTargetId)
.replaceToken('wiid',this.wiid)
.replaceToken('pickerList',
$T(lt.FriendOrMemberSelector.memberPicker)
.replaceToken('id',this.wiid)
.compose());
if(noFriends)t.removeTokenBlock('BackToFriends');
t.compose();
mojo.focus('shareMemberSearch');
mojo.input.onEnterKey('shareMemberSearch',this.searchMembers.lbind(this));
},

showFriends:function(evt,isClick){
var self=this;
DataModel.g.getFriends(function(friends,isLoad){
if(friends.length==0){
if(isClick){
self.showMembers(null,true);
}else{
self.doThisWhenNoFriends();
}
return;
}
$T(lt.FriendOrMemberSelector.friendPickerContent,self.renderTargetId)
.replaceToken('wiid',self.wiid)
.replaceToken('pickerList',
$T(lt.FriendOrMemberSelector.friendPicker)
.replaceToken('id',self.wiid)
.replaceToken('showAutoComplete',friends.length>0?'':'hidden')
.replaceToken('pickerHeadingText',self.pickerHeadingText)
.compose())
.compose();
self.picker.render(friends,isLoad);
mojo.focus('friendAutoComplete');
});
},

showFacebookFriends:function(evt,isClick){
var self=this;
if(LalaFBConnect.isConnected()){
$S('pickerContent','<div class="lcenter" style="margin:15px 0"><img src="images/ajax-loader.gif" alt="Loading" /></div>');
if(LalaFBConnect.isLoggedLinkedDiff()){
LalaFBConnect.renderLoggedLinkedNotSame('pickerContent');
}else{
DataModel.g.getFacebookFriends(function(friends,isLoad){
if(friends.length==0){
if(isClick){
self.showMembers(null,true);
}else{
self.doThisWhenNoFriends();
}
return;
}
$T(lt.FriendOrMemberSelector.friendPickerContent,self.renderTargetId)
.replaceToken('wiid',self.wiid)
.replaceToken('pickerList',
$T(lt.FriendOrMemberSelector.friendPicker)
.replaceToken('id',self.wiid)
.replaceToken('showAutoComplete',friends.length>0?'':'hidden')
.replaceToken('pickerHeadingText',self.pickerHeadingText)
.compose())
.compose();
self.picker.render(friends);
mojo.focus('friendAutoComplete');
});
}
}else{
$TC(lt.FriendOrMemberSelector.facebookNotConnected,'pickerContent');
if(!this.facebookFriendsListenerSet){
mojo.listeners.add(LalaFBConnect.LISTENER_NOW_CONNECTED,
function(){
api.FacebookConnect.linkAccount('shareToFacebookFriends',function(resSuccess){
self.showFacebookFriends();
if(resSuccess){
widgets.Share.showFacebookLinkedDialog=true;
}
});

});
this.facebookFriendsListenerSet=true;
}
}
},

searchMembers:function(){
var text=$F('shareMemberSearch');
if(!text)return;
var self=this;
api.SearchUtils.searchMember(
{Q:text,
count:100,
sortDir:'Desc',
sortKey:'LoginTimestamp'},
function(res){
self.memberPicker.render(res.data.list);
$S('shareMembersFound',res.data.list.length+' members found');
if(res.data.total>0){
mojo.css.show('shareMembers_'+self.wiid);
}
});
}
};

widgets.PeoplePicker=Class.create();
widgets.PeoplePicker.all={};
widgets.PeoplePicker.prototype={
initialize:function(params){
var self=this;
this._wiid=params.wiid||'peoplePickerWidget_'+mojo.idGenerator++;

this.onSelectFriend=mojo.emptyFunction;
this.renderTargetId=params.renderTargetId||'';
this.singleSelect=params.singleSelect||false;
this.selected=this.singleSelect?null:params.selected;
this.autoCompleteId=params.autoCompleteId;
this.MAX_RECIPIENTS=params.maxRecipients||20;

widgets.PeoplePicker.all[this._wiid]=this;

mojo.listeners.add(widgets.Share.REMOVE_RECIPIENT,
function(friend){
self.onRemoveFriendUI(friend);
if(friend.isFacebook){
self.facebookFriendSelected=false;
}
});

},

render:function(friends,isLoad){
this.friends=friends;
this._renderFriends(this.friends,isLoad);
this._renderAutoComplete();
},

_renderAutoComplete:function(){

if(!this.autoCompleteId)return;

$TC(lt.PeoplePicker.autoComplete,this.autoCompleteId);

this._friendMatcher=new widgets.core.ClientAutoCompleteMatcher();
this._friendMatcher.setData(this.friends,'displayName');
var friendAutoComplete=new widgets.SearchAutoComplete({
inputId:'friendAutoComplete',
onRunSearch:mojo.emptyFunction,
global:false
});
var self=this;
friendAutoComplete.onFillDelegate=function(sTerm){


var matchingFriends=[];
var allFriends=self.friends.lclone();
if(sTerm!=""){
var matches=self._friendMatcher.getMatches(sTerm);
matches.leach(function(match){
allFriends.leach(function(f){
if(f.displayName==match.value){
matchingFriends.push(f);
}
});
});
}else{
matchingFriends=allFriends;
}

self._renderFriends(matchingFriends);
};
},

_renderFriends:function(friends,isLoad){


if(friends.length>0){
var t=$T(lt.PeoplePicker.main,this.renderTargetId);
var friendBlock=t.getTokenBlock('FriendBlock');
var self=this;
friends.leach(function(f,index){
friendBlock.replaceToken('wiid',self._wiid);
friendBlock.replaceTokensWithBean('friend',f);
friendBlock.replaceToken('index',index);

if(self.containsFriend(f)){
friendBlock.replaceToken('addedIcon',widgets.PeoplePicker.ADDED_ICON);
friendBlock.replaceToken('addedStyle',"color:#999999;");
}else{
friendBlock.replaceToken('addedIcon',"");
friendBlock.replaceToken('addedStyle',"color:#333333;");
}
friendBlock.next();
});
return t.compose();
}else{
var tmpl=isLoad?lt.PeoplePicker.noFriends:lt.PeoplePicker.noMatches;
return $TC(tmpl,this.renderTargetId);
}
},

onRemoveFriendUI:function(friend){
var id=this._wiid+"_"+friend.userToken+"_addedCell";


if($(id))$S(id,'');

id=this._wiid+"_"+friend.userToken+"_nameCell";
if($(id))$(id).style.color="#333333";
},

onRemoveFriendModel:function(friend){
for(var i=0;i<this.selected.length;i++){
if(this.selected[i].userToken==friend.userToken){
this.selected.lremoveAt(i);
return;
}
}
},

onClick:function(userToken,evt){
evt=new MojoEvent(evt);

var friend=this.friends.lfindObject('userToken',userToken);
if(this.singleSelect){
this.changeUIToAdded(userToken);
if(this.selected)this.onRemoveFriendUI(this.selected);
var elem=evt.target;
while(elem.tagName!='TR'){
elem=elem.parentNode;
}
if(this.selectedNode)this._colorTDs(this.selectedNode,'#FFFFFF');
if(this.selected&&this.selected.userToken==friend.userToken){
this.selectedNode=null;
this.selected=null;
this.onSelectFriend(null);
}else{
this.selectedNode=elem;
this.selected=friend;
this._colorTDs(this.selectedNode,'#BDE3FF');
this.onSelectFriend(friend);
}
}else{
this.changeUIToAdded(userToken);
if(this.containsFriend(friend)){
this.onRemoveFriendUI(friend);
this.onRemoveFriendModel(friend);
if(friend.isFacebook){
this.facebookFriendSelected=false;
}
}else{
if(this.maxRecipientsReached()){
this.onRemoveFriendUI(friend);
}else if(friend.isFacebook&&this.facebookFriendSelected){
lala.showAck('Currently only one Facebook recipient can '
+'be selected at a time');
this.onRemoveFriendUI(friend);
}else{
this.selected.push(friend);
if(friend.isFacebook){
this.facebookFriendSelected=true;
}
}
}
this.onSelectFriend();
}
},

containsFriend:function(user){
if(this.selected){
for(var i=0;i<this.selected.length;i++){
if(this.selected[i].userToken==user.userToken){
return true;
}
}
}
return false;
},

changeUIToAdded:function(userToken){
$S(this._wiid+"_"+userToken+"_addedCell",widgets.PeoplePicker.ADDED_ICON);
$(this._wiid+"_"+userToken+"_nameCell").style.color="#999999";
},

maxRecipientsReached:function(){
if(this.selected.length>=this.MAX_RECIPIENTS){
lala.showAck($T(lt.Share.maxRecipientsReached)
.replaceToken('maxRecipients',this.MAX_RECIPIENTS)
.compose());
return true;
}
return false;
},

onMouseOver:function(elem){
this._colorTDs(elem,'#BDE3FF');
},

onMouseOut:function(elem){
if(this.singleSelect&&elem==this.selectedNode)return;
this._colorTDs(elem,'#ffffff');
},

_colorTDs:function(tr,hexColor){
var tds=tr.getElementsByTagName('TD');
for(var i=0;i<tds.length;i++){
tds[i].style.backgroundColor=hexColor;
}
}
};

widgets.PeoplePicker.ADDED_ICON
="<img src='images/checkmark_mini.gif' height='12px' width='14px'/>";



widgets.SongList=Class.create();
widgets.SongList.all={};
widgets.SongList.CHECKMARK='<img class="checkmark" src="images/checkmark_mini.gif" />';
widgets.SongList.TIP_BUY='Add this web song to your online collection';
widgets.SongList.TIP_BOUGHT='This song is in your collection';

widgets.SongList.prototype={
initialize:function(params){
this._wiid=params.id||'songList_'+mojo.idGenerator++;
this.renderTargetId=params.renderTargetId;


this.showAlbumImg=params.showAlbumImg;
this.disableAlbumImgHover=params.disableAlbumImgHover;
this.showListenerImg=params.showListenerImg;
this.hideDuration=params.hideDuration;
this.artRight=params.artRight;
this.showArtistImg=params.showArtistImg;
this.artistArray=params.artistArray;
this.isAlbum=params.isAlbum;
this.showDateKey=params.showDateKey;
this.listenersKey=params.listenersKey;
this.showComment=params.showComment;

this.showListens=params.showListens;
this.whichListen=params.whichListen;
this.showListener=params.showListener;
this.hideNum=params.hideNum;
this.hideArtist=params.hideArtist;
this.hideActions=params.hideActions;
this.showBuyActions=params.showBuyActions;
this.showQueueAction=params.showQueueAction;
this.hideAlbum=params.hideAlbum;
this.showArtistSeeMore=params.showArtistSeeMore;
this.hideRankInfo=params.hideRankInfo;
this.showTrendInfo=params.showTrendInfo;
this.showPrice=params.showPrice;
this.hideAddedTransient=params.hideAddedTransient;
this.hidePlayHover=params.hidePlayHover;

this.evenMoreLink=params.evenMoreLink;
this.evenMoreText=params.evenMoreText||'songs';
this.customFrameClass=params.customFrameClass;
this.emptyText=params.emptyText||'No songs';
this.srcInfo=params.srcInfo;
this.truncated=params.truncated;
this.displayCount=params.displayCount||100000;
this.layout=params.layout||'list';
this.customLiteFooter=params.customLiteFooter;
this.trackingId=params.trackingId||'songListWidget';
this.onPlaySong=params.onPlaySong||this.onPlaySongDefault.lbind(this);
this.totalDuration=0;

this.pulldown=null;

this.licensedForStreamingCount=0;
this.licensedForDownloadCount=0;
this.songs=null;
this.songsById=null;
this.songIdMap=null;

this.disc=null;


this.usePlayButtonHover=params.usePlayButtonHover||false;

this.playButtonHoverOffsets=params.offsets||{};


this.liteWithAddButtons=params.liteWithAddButtons||false;


this.buyMode=params.buyMode;


this.showRatings=params.showRatings||false;
this.ratingSize=params.ratingSize||RatingWidget.SIZE_SMALL;
this.ratingField=params.ratingField||RatingWidget.LALA_RATING_FIELD;
this.hideZeroRating=params.hideZeroRating||false;
this.ratingType=params.ratingType||RatingWidget.TYPE_LALA;

this.startNum=mojo.isDefined(params.startNum)?params.startNum:0;
this.showMyRatings=params.showMyRatings;
this.showMemberRatings=params.showMemberRatings;
this.username=params.username;


this.customBuyFreeMp3Text=params.customBuyFreeMp3Text;

mojo.listeners.add(
Player.EVT_STATUS_CHANGE,
this.onPlayingSongEvent.lbind(this));
mojo.listeners.add(
api.MicroWallet.EVT_BUYSONG_CHANGE,
this.onBuySongEvent.lbind(this));
mojo.listeners.add(
api.MicroWallet.EVT_BUY_DOWNLOAD,
this.onBuySongDownloadEvent.lbind(this));
mojo.listeners.add(
api.LalaForecast.EVT_FORECAST_UPDATED,
this.onForecastSongEvent.lbind(this));
widgets.SongList.all[this._wiid]=this;

if(this.showRatings){
this.ratingWidget=new RatingWidget({
type:this.ratingType,
size:this.ratingSize,
ratingField:this.ratingField,
isRateEnabled:false
});
}

if(this.showMyRatings){
this.userRatings=new RatingWidget({
type:RatingWidget.TYPE_USER,
size:this.ratingSize,
ratingField:RatingWidget.USER_RATING_FIELD,
isRateEnabled:false
});
}

if(this.showMemberRatings){
this.memberRatings=new RatingWidget({
type:RatingWidget.TYPE_USER,
size:this.ratingSize,
ratingField:RatingWidget.USER_RATING_FIELD,
isRateEnabled:false
});
}
},

render:function(songsOrPagedList,isReRender,numToRender,setLast){
this.songsById={};
this.songIdMap={};



if(!isReRender){
if(mojo.isDefined(songsOrPagedList.total)){
this.songs=songsOrPagedList.list;
this.total=songsOrPagedList.total;
this.skip=songsOrPagedList.skip||0;
}else{
this.songs=songsOrPagedList;
this.total=songsOrPagedList.length;
this.skip=0;
}

if(this.songs.length==0){
this.emptyText.compose(this.renderTargetId);
return;
}
}

if(!numToRender||numToRender>this.songs.length){
numToRender=this.songs.length;
}


var layout=this.getLayoutConfig();
var t=$T(layout.template,this.renderTargetId);
t.replaceToken('bookmarkEnabled',lala.isBookmarksEnabled?'bookmarkEnabled':'');

switch(this.layout){
case'fancySongs':
this._render_fancySongs_Tokens(t);
break;
default:
this._renderTableTokens(t);

var songBlock=t.getTokenBlock('SongBlock');
for(var i=0;i<this.songs.length;i++){
var song=this.songs[i];
if(song.linkSongLalaId){
this.songsById[song.linkSongLalaId]=song;
}

if(!this.songIdMap[song.songLalaId]){
this.songIdMap[song.songLalaId]=song.id;
}

this.totalDuration+=song.duration;
var tokens=this._getSongInfoTokens(song,i,songBlock);
var isLast=mojo.isDefined(setLast)?setLast:(i==this.songs.length-1);
this._renderSongRow(songBlock,song,tokens,i,isLast);
songBlock.next();
}
}
var html=t.compose();
if(this.renderTargetId){

this.onPlayingSongEvent(Player.g.getPlayingInfo());
}

return html;
},

getLayoutConfig:function(){
var template;
switch(this.layout){
case'list':
template=lt.SongListWidget.listLayout;
break;
case'lite':
template=lt.SongListWidget.liteLayout;
break;
case'simple':
template=lt.SongListWidget.simpleLayout;
break;
case'feed':
template=lt.SongListWidget.feedLayout;
break;
case'single':
template=lt.SongListWidget.singleLayout;
break;
case'fancySongs':
template=lt.SongListWidget.fancySongsLayout;
break;
};

return{template:template};
},

_renderTableTokens:function(t){
t.replaceToken('wiid',this._wiid);
t.replaceToken('tableId','slTable_'+this._wiid);
t.replaceToken('customFrameClass',this.customFrameClass);



if(this.evenMoreLink
&&((this.songs.length>this.displayCount)
||(this.total>this.songs.length))){


var linkHtml=$T(lt.Core.apageLink)
.replaceToken('link',this.evenMoreLink)
.replaceToken('type',this.evenMoreText)
.compose();
t.replaceToken('apageLink',linkHtml);
}

if(!this.customLiteFooter){
t.removeTokenBlock('CustomLiteFooterBlock');
}else{
t.replaceToken('customLiteFooter',this.customLiteFooter);
}
},

_getSongInfoTokens:function(song,index,songBlock){
var listens=song[this.whichListen];
var listensRank=song[this.whichListen+'Rank'];
if(this.hideRankInfo||!listensRank||(listensRank&&listensRank>5000)){
listensRank=null;
if(this.layout!='simple'&&this.layout!='single'){
var listensBlock=songBlock.getTokenBlock('ListensCountBlock');
if(listensBlock){
listensBlock.removeTokenBlock('RankInfoBlock');
}
}
}
var tokens={
title:song.title?song.title.ltruncate(42):lt.SongListWidget.notAvailable,
titleTooltip:song.title?song.title.lescapeHTML()+' ('+widgets.SongList.renderDuration(song,null,true)+')':'Not available',
titleClass:song.title?'':'unavailableSong',
rowId:'slwRow_'+this._wiid+'_'+song.id,
playIconId:'slwPlayIcon_'+this._wiid+'_'+song.id,
addLinkId:'slwAddLink_'+this._wiid+'_'+song.id,
downloadLinkId:'slwDownloadLink_'+this._wiid+'_'+song.id,
mp3LinkId:'slwMp3Link_'+this._wiid+'_'+song.id,
addPriceId:'slwAddPrice_'+this._wiid+'_'+song.id,
downloadPriceId:'slwDownloadPrice_'+this._wiid+'_'+song.id,
addLabelId:'slwAddLabel_'+this._wiid+'_'+song.id,
buyLabelId:'slwBuyLabel_'+this._wiid+'_'+song.id,
buyBoxId:'slwBuyBox_'+this._wiid+'_'+song.id,
index:index,
listens:mojo.isDefined(listens)&&song.title
?mojo.util.addCommasToNumber(listens):'',
listensRank:mojo.isDefined(listensRank)&&song.title
?mojo.util.formatBigNumber(listensRank):'',
lastRow:index==(this.songs.length-1)?'lastRow':'',
num:this.skip+index+1+this.startNum
};
tokens.listensS=listens==1?'':'s';

if(this.showRatings
&&(!this.hideZeroRating||this.hideZeroRating&&song.lalaRating>0)){
tokens.rating=this.ratingWidget.render(song);
tokens.numRatings=song.numRatings;
}


if(this.showMyRatings&&song.rating>0){
tokens.myRating=this.userRatings.render(song);
}

if(this.showMemberRatings){
tokens.username=this.username.ltruncate(22);
tokens.memberRating=this.memberRatings.render(song);
}

if(this.showTrendInfo&&song.listensTrend!=0&&song.listens7Rank!=0){
var numToShow=Math.abs(song.listensTrend);
if(song.listensTrend<0){
tokens.upOrDn='up';
}else{
tokens.upOrDn='dn';
}
tokens.trendNum=mojo.util.formatBigNumber(numToShow,1000);

tokens.trendArrow=TrendArrow.g.render({
trendNum:song.listensTrend,
size:'med',
what:'song'
});

}else{
songBlock.removeTokenBlock('TrendBlock');
}

if(song.isLicensedForDownload){
var mp3Cents;
if(song.isFreeMp3){
mp3Cents='Free';
}else{
if(song.downloadPriceInCents<100){
mp3Cents=song.downloadPriceInCents+'&cent;';
}else{
mp3Cents='$'+mojo.util.formatPrice(song.downloadPriceInCents);
}
}
tokens.downloadCents=mp3Cents;
}else{
tokens.downloadCents='No';
}

if(!this.hideDuration){
tokens.time=song.title?widgets.SongList.renderDuration(song,null,true):'';
tokens.timeTooltip=widgets.SongList.renderDurationTooltip(song);
}
if(this.showDateKey){
var time=parseInt(song[this.showDateKey]);
if(time>0){
tokens.timeAgo=new Date(time)
.lgetDaysAgoLabelSimple();
}else{
tokens.timeAgo='&nbsp;';
}
}
if(this.listenersKey){
tokens.listeners='';
var lk=this.listenersKey;
song[lk].leach(function(user,i){
tokens.listeners+='<a class="mjn_3" '
+frontend.link.Member(user.userToken)+'>'
+user.nickName+'</a>'
+(i<(song[lk].length-1)?', ':'');
});
}

return tokens;
},

_renderSongRow:function(songBlock,song,tokens,index,isLast){
songBlock.replaceTokensWithMap(tokens);
songBlock.replaceToken('clickTrackingId',this.trackingId);

if(this.showListens&&(song.isLicensedForStreaming||song.isDigied)){
if(this.showListens=='count'||this.showListens=='dir'){

songBlock.replaceToken('trendArrow',
TrendArrow.g.render({
trendNum:song.listensTrend,
what:'song',
size:'micro'
}));
}
}else{


if((this.layout!='simple')
||(mojo.isBoolean(this.showListens)&&!this.showListens)){
songBlock.removeTokenBlock('ListensCountBlock');
songBlock.removeTokenBlock('ListensDirBlock');
}
}
if(this.layout=='feed'){
if(this.showRatings){
songBlock.removeTokenBlock('ListensCountBlock');
}else{
songBlock.removeTokenBlock('RatingBlock');
}

if(!this.listenersKey){
songBlock.removeTokenBlock('ListenersBlock');
}
}

var ratingsLine=songBlock.getTokenBlock('RatingsLine');
var hideLalaRating=!this.showRatings
||(this.showRatings&&this.hideZeroRating&&(song.lalaRating<=0||!song.lalaRating));
var hideMyRating=!this.showMyRatings||song.rating<=0||!song.rating;
var hideMemberRating=!this.showMemberRatings||song.rating<=0||!song.rating;

var listenBlock=songBlock.getTokenBlock('ListensCountBlock');
if(hideLalaRating){
if(this.layout=='simple'){
if(ratingsLine)ratingsLine.removeTokenBlock('RatingBlock');
}else{
if(listenBlock)listenBlock.removeTokenBlock('RatingBlock');
}
}
if(listenBlock){
listenBlock.keepTokenBlock('BillboardBlock',song.billboardChartPosition);
}

if(hideMyRating){
songBlock.removeTokenBlock('MyRatingBlock');
}

if(hideMemberRating){
if(ratingsLine)ratingsLine.removeTokenBlock('MemberRatingBlock');
}



if(hideLalaRating&&hideMemberRating){
songBlock.removeTokenBlock('RatingsLine');
}



if(!this.isAlbum&&this.hideAlbum&&song.linkDiscLalaId){
songBlock.removeTokenBlock('SongTextTitleBlock');
}else{
songBlock.removeTokenBlock('SongLinkTitleBlock');
}

songBlock.replaceTokensWithBean('song',song);

if(parseInt(song.year)>0){
songBlock.replaceToken('songYear',"- "+song.year);
}
this._renderSongActions(songBlock,song);
this._renderSongPlayIcon(songBlock,song,index);

if(this.hideNum){
songBlock.removeTokenBlock('NumCellBlock');
}
if(this.showArtistImg){
if(this.artRight){
songBlock.replaceToken('artistLink',song.leahArtist?frontend.img.ArtistLink(song.leahArtist,'small'):'');
songBlock.removeTokenBlock('ArtistImgBlock');
}else{
songBlock.removeTokenBlock('ArtistImgBlockRight');
songBlock.getTokenBlock('ArtistImgBlock')
.replaceToken('imgBasePath',this.artistArray[index].imgBasePath)
.replaceToken('trackingId',this.trackingId);
}
}else{
songBlock.removeTokenBlock('ArtistImgBlock');
songBlock.removeTokenBlock('ArtistImgBlockRight');
}
if(!this.showListener){
songBlock.removeTokenBlock('ListenerCellBlock');
}
if(this.showComment){
songBlock.replaceToken('songComment',song.comment||'&nbsp;');
}else{
songBlock.removeTokenBlock('CommentBlock');
}
if(this.showAlbumImg){
if(this.artRight){
songBlock.removeTokenBlock('AlbumImgBlockLeft');
}else{
songBlock.removeTokenBlock('AlbumImgBlockRight');
if(this.disableAlbumImgHover){
songBlock.getTokenBlock('AlbumImgBlockLeft').replaceTokenBlock('AlbumImgPopupBlock','title="'+song.discTitle+'"');
}
}
}else{
songBlock.removeTokenBlock('AlbumImgBlockLeft');
songBlock.removeTokenBlock('AlbumImgBlockRight');
}
if(!this.showListenerImg){
songBlock.removeTokenBlock('ListenerImgBlock');
}else{
songBlock.getTokenBlock('ListenerImgBlock')
.replaceTokensWithBean('user',song.user);
}
if(this.hideArtist||!song.title){
songBlock.removeTokenBlock('ArtistBlock');
}
if(this.hideAlbum){
songBlock.removeTokenBlock('AlbumBlock');
if(!this.hideArtist){


songBlock.replaceToken('byStyle','width:1.6em')
}
}else if(this.layout=='list'){
if(song.discTitle==''){
songBlock.getTokenBlock('AlbumBlock').removeTokenBlock('AlbumLinkBlock');
}else{
songBlock.getTokenBlock('AlbumBlock').removeTokenBlock('UnknownAlbumBlock');
}

}

if(this.hideActions){
if(!this.showBuyActions){
songBlock.removeTokenBlock('BuyBlock');
}
songBlock.removeTokenBlock('ActionsBlock');
songBlock.replaceToken('noActions','noActions');
if(!this.showQueueAction){
songBlock.removeTokenBlock('QueueBlock');
}
}

if(this.layout=='simple'&&!this.showBuyActions){
songBlock.removeTokenBlock('BuyBlock');
}



var buyBlock=songBlock.getTokenBlock('BuyBlock');
if(buyBlock){
if(this.buyMode=='mp3'){
buyBlock.removeTokenBlock('AddCellBlock');
}else{
buyBlock.removeTokenBlock('BuyCellBlock');
}
}

if(!this.showArtistSeeMore){
songBlock.removeTokenBlock('ShowArtistMoreLinkBlock');
}

if(song.songLalaId)songBlock.replaceToken('songLalaId',song.songLalaId);
songBlock.replaceToken('style',index>(this.displayCount-1)?'display:none':'');

if(frontend.canPurchaseDownload(song)&&this.layout=='simple'
&&this.buyMode=='mp3'&&song.isFreeMp3){
songBlock.replaceToken('buyButtonCellStyle','width: 11em');
}
var rowFlags='';
if(isLast)rowFlags+='lastRow ';
if(index==0)rowFlags+='firstRow ';
songBlock.replaceToken('rowFlags',rowFlags);
},

_renderSongActions:function(songBlock,song){
if(this.layout=='lite'&&!this.liteWithAddButtons){
songBlock.removeTokenBlock('AddButtonCellBlock');
}

var buyBlock=songBlock.getTokenBlock('BuyBlock');

if(buyBlock){
var cellBlock;
if(this.buyMode=='mp3'){
if(!this.showPrice){
cellBlock=buyBlock.getTokenBlock('BuyCellBlock');
cellBlock.removeTokenBlock('BuyPriceBlock');
}

if(song.isDownloadPurchased){
songBlock.replaceToken('buyLabel',widgets.SongList.CHECKMARK);
songBlock.replaceToken('downloadDisabled','DisabledBought');
}else if(!frontend.canPurchaseDownload(song)){
songBlock.replaceToken('noActions','noActions');
songBlock.replaceToken('buyLabel','Buy');
}else{
var buyText='Buy';
if(song.isFreeMp3){
if(this.customBuyFreeMp3Text)buyText=this.customBuyFreeMp3Text;
else buyText='Free';
}
songBlock.replaceToken('buyLabel',buyText);
}
}else{
if(!this.showPrice){
cellBlock=buyBlock.getTokenBlock('AddCellBlock');
cellBlock.removeTokenBlock('AddPriceBlock');
}

if(song.isDigied){
songBlock.replaceToken('addPrice','&nbsp;');
songBlock.replaceToken('addLabel',widgets.SongList.CHECKMARK);
songBlock.replaceToken('addDisabled','DisabledBought');
songBlock.replaceToken('webTooltip',widgets.SongList.TIP_BOUGHT);
}else if(!frontend.isSongAddable(song)){
if(buyBlock&&this.layout!='lite'){
songBlock.removeTokenBlock('BuyBlock');
}else if(buyBlock&&this.layout=='lite'){
cellBlock.replaceTokenBlock('AddCellBlockContent','&nbsp;');
}
songBlock.replaceToken('addDisabled','Disabled');
songBlock.replaceToken('noActions','noActions');
songBlock.replaceToken(
'webTooltip',
'This web song is not available.');
songBlock.replaceToken('addLabel','Add');
}else{
var addCents;
if(song.addPrice<100){
addCents=song.addPrice+'&cent;';
}else{
addCents='$'+mojo.util.formatPrice(song.addPrice);
}

songBlock.replaceToken('addPrice',addCents);
songBlock.replaceToken('webTooltip',widgets.SongList.TIP_BUY);
songBlock.replaceToken('addLabel','Add');
}
}
}


songBlock.replaceToken('downloadMp3Text','MP3');
var actionsBlock=songBlock.getTokenBlock('ActionsBlock');
if(actionsBlock){
actionsBlock.keepTokenBlock('BookmarkLink',lala.isBookmarksEnabled&&!song.clientBookmarkInfo);
}

if(!song.isLicensedForDownload){
songBlock.replaceToken('downloadDisabled','Disabled');
songBlock.replaceToken('disabledDownload','disabledAction');
songBlock.replaceToken('downloadLink','');
songBlock.replaceToken(
'downloadTooltip',
'title="The MP3 for this song is coming soon"');
}else if(frontend.hasDownload(song)){
songBlock.replaceToken('downloadDisabled','Disabled');
songBlock.replaceToken('disabledDownload','disabledAction');
songBlock.replaceToken('downloadLink','');
songBlock.replaceToken(
'downloadTooltip',
'title="You already purchased this MP3"');
if(this.buyMode=='mp3'){
songBlock.replaceToken('downloadCents','&nbsp;');
songBlock.replaceToken('downloadMp3Text','');
}else{
songBlock.replaceToken('downloadCents',widgets.SongList.IN_ICON_SMALL);
}
}else if(song.isDownloadAlbumOnly){
songBlock.replaceToken('downloadDisabled','Disabled');
songBlock.replaceToken('disabledDownload','disabledAction');
songBlock.replaceToken('downloadLink','');
songBlock.replaceToken(
'downloadTooltip',
'title="The MP3 for this song is only available if your purchase the entire album"');
songBlock.replaceToken(
'downloadCents',
'Album-only MP3');
songBlock.replaceToken(
'downloadMp3Text',
' ');
}else{
if(this.buyMode!='mp3'){
var downloadLinkClass='downloadLink';
if(song.isFreeMp3)downloadLinkClass+=' freeMp3';
songBlock.replaceToken('downloadLink',downloadLinkClass);
}
var tooltipText=song.isFreeMp3
?'Get this DRM-free MP3 for free!'
:'Purchase this DRM-free MP3';

songBlock.replaceToken(
'downloadTooltip',
'title="'+tooltipText+'"');
}

if(!song.isLicensedForStreaming){

songBlock.replaceToken(
'disabledShare',
'disabledAction');
songBlock.replaceToken(
'dimGiftImg',
'_dim');
songBlock.replaceToken(
'disabledShareTooltip',
'title="You can only share songs that have been licensed"');

if(!song.isDigied){

songBlock.replaceToken('disabledPlaylist','disabledAction');

songBlock.removeTokenBlock('QueueBlock');
if(!song.isLicensedForDownload){
songBlock.removeTokenBlock('ActionsBlock');
}
}
}

if(!song.isLicensedForStreaming&&!song.isLicensedForDownload){
songBlock.replaceToken('disabledBookmark','disabledAction');
}
},

_renderSongPlayIcon:function(songBlock,song,index){
var playAction='void 0';
var playSongLink='javascript:void 0';
var playImg='';
var playType='Not yet available for streaming';

if(song.playType!='NotPlayable'){
playImg=song.isLicensedForStreaming||song.isDigied
?'play_icon_full':'play_icon_30';
if(this.layout=='simple'||this.layout=='single'||this.layout=='fancySongs'){
playImg+='_medium';
if(this.layout!='fancySongs'
&&(song.isLicensedForStreaming||song.isDigied)){
playImg+=' play_icon_full_medium_no_hover';
}
}else if(this.layout!='lite'&&this.layout!='feed'){
playImg+='_large';
}

playSongLink=frontend.url.Song(song.linkSongLalaId);
playAction="widgets.SongList.all."
+this._wiid+".onPlaySong("+index+"); return false;";
playType=song.isLicensedForStreaming||song.playType=='Full'
?'Play full length song ('+mojo.util.secondsToTime(song.duration,true)+')'
:song.isDigied?'Play song from your collection'
:'Play 30 second sample';


if(!this.hidePlayHover&&(song.isLicensedForStreaming||song.isDigied)){
var hoverT;
if(this.layout=='simple'){
hoverT=lt.SongListWidget.simpleLayoutEvents;
}else if(this.layout=='lite'){
hoverT=lt.SongListWidget.litePlayButtonHoverEvents;
}else if(this.layout=='feed'){
hoverT=lt.SongListWidget.feedLayoutEvents;
}else if(this.layout=='single'){
hoverT=lt.SongListWidget.singlePlayButtonHoverEvents;
}else if(this.usePlayButtonHover){
hoverT=lt.SongListWidget.playButtonHoverEvents;
}

if(hoverT){
var hoverEvents=$T(hoverT)
.replaceToken('wiid',this._wiid)
.replaceToken('index',index)
.compose();
songBlock.replaceToken('events',hoverEvents);
}
}
}else{
playImg='play_icon_dim';
if(this.layout=='simple'||this.layout=='single'||this.layout=='fancySongs'){
playImg+='_medium';
}else if(!(this.layout=='lite'||this.layout=='feed')){
playImg+='_large';
}else{
playImg+='_small';
}
}

songBlock.replaceToken('playSongLink',playSongLink);
songBlock.replaceToken('playIcon',playImg);
songBlock.replaceToken('playAction',playAction);
songBlock.replaceToken('playType',playType);
},

_render_fancySongs_Tokens:function(t){
var self=this;
var b=t.getTokenBlock('SongBlock');
this.songs.leach(function(song,index){
self._renderSongPlayIcon(b,song,index);
b.replaceTokensWithBean('song',song);
b.replaceToken('wiid',self._wiid);
b.replaceToken('index',index);
b.replaceToken('number',index+1);
b.keepTokenBlock('NoDiscLinkBlock',!song.linkDiscLalaId);
b.keepTokenBlock('DiscLinkBlock',song.linkDiscLalaId);
b.next();
});
},

onRowMouseOver:function(elem,evt,index){
if(!this.songs)return;
var song=this.songs[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.songs)return;

var song=this.songs[index];
if(!song)return;

var row=$('songRow'+song.id);
row.className=row.className.replace(' fancyMouseOver','');

this.showOrHidePlayAndRemove(false,song);
},

onPlayButtonHover:function(btn,evt,index){
var song=this.songs[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);
},

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);
}else if(song){
if(!(this.currPlayerSong&&song.songLalaId==this.currPlayerSong.songLalaId)){
if($('songPlayIcon_'+id))mojo.css.hide('songPlayIcon_'+id);
}
}
},

onPlaySongDefault:function(index){
var song=this.songs[index];
Player.g.playSong(song,this.trackingId);
lala.Track.clientPageWidgetInteraction(this.trackingId,'play');
},

onFindVideos:function(songIndex,event){
if($('youtubeVideosSmall')!=null&&this.videoSongIndex!=null
&&this.videoSongIndex==songIndex){
MojoDialog.close();
return;
}else{
MojoDialog.close();
}





if(mojo.SAFARI){
new MojoEvent(event).stopPropagation();
}

this.videoSongIndex=songIndex;
var song=this.songs[this.videoSongIndex];
var artist='"'+song.artist.replace(/[^a-zA-Z0-9]/g,' ').ltrim().replace(/\s+/g,'+')+'"';
var title=song.title

.replace(/\(.*?album.*?\)/gi,' ')
.replace(/\[.*?album.*?\]/gi,' ')
.replace(/[^a-zA-Z0-9]/g,' ')
.ltrim()
.replace(/\s+/g,'+');
var self=this;
Player.g.getYouTubeVideos(artist,title,function(entry){
self.renderVideos(entry);
});
},

renderVideos:function(entry){

var counter='videos.open.';
if(!entry||!(entry.length>0)){
this.renderNoVideoPopup();
counter+='notFound';
}else{
this.youtubeVideos=entry;
this.renderSmallVideo(0);
counter+='found';
}
lala.Track.clientPageWidgetInteraction(this.trackingId,counter);
},

renderVideoPopup:function(videoIndex,size){
if(!size)size='small';
if(videoIndex<0
||videoIndex+1>this.youtubeVideos.length)return;
var entry=this.youtubeVideos[videoIndex];
var song=this.songs[this.videoSongIndex];
var elemId='songListVideoLink_'+this._wiid+'_'+song.id;
var d=null;

var row=mojo.dom.getAncestorByTagName($(elemId),'TR');
var onClose=mojo.emptyFunction;

if(size=='small'){
if(!$('youtubeVideosSmall')){
d=new MojoDialog({
title:lt.SongListWidget.videoPopupTitle,
id:'youtubeVideosSmall',
contextualElemId:elemId
});
}else{
d=new MojoDialog({
title:lt.SongListWidget.videoPopupTitle,
id:'youtubeVideosSmall',
isModal:false,
shouldCenter:false
});
}
d.onOpen=function(){
if(lala.isBookmarksEnabled)$AC(row,'stayHovered');
};
onClose=function(){
if(lala.isBookmarksEnabled)$DC(row,'stayHovered');
};
}else if(size=='full'){
if(!$('youtubeVideosFull')){
d=new MojoDialog({
title:lt.SongListWidget.videoPopupTitle,
id:'youtubeVideosFull'
});
}else{
d=new MojoDialog({
title:lt.SongListWidget.videoPopupTitle,
id:'youtubeVideosFull',
shouldCenter:false
});
}
lala.Track.clientPageWidgetInteraction(this.trackingId,'videos.showFull');
}
d.getDraggableElem=mojo.emptyFunction;
var html=$T(lt.SongListWidget[size+'Video'])
.replaceToken('MEDIA_CONTENT_URL',entry.mediaUrl+'&autoplay=1&fs=1')
.replaceToken('MEDIA_CONTENT_TYPE',entry.mediaType)
.replaceToken('MEDIA_THUMBNAIL_URL',entry.thumbUrl)
.replaceToken('wiid',this._wiid)
.replaceToken('prevVideoIndex',videoIndex-1)
.replaceToken('pagingPrev',videoIndex-1<0?'pagingPrevDisabled':'pagingPrev')
.replaceToken('nextVideoIndex',videoIndex+1)
.replaceToken('pagingNext',videoIndex+1>=this.youtubeVideos.length?'pagingNextDisabled':'pagingNext')
.replaceToken('displayIndex',videoIndex+1)
.replaceToken('videoIndex',videoIndex)
.replaceToken('total',this.youtubeVideos.length)
.replaceToken('title',entry.title)
.compose();
d.onClose=function(){
document.onclick=null;
onClose();
};
d.open(html);
},

renderSmallVideoEmbed:function(videoIndex){
if(videoIndex<0
||videoIndex+1>this.youtubeVideos.length)return;
var entry=this.youtubeVideos[videoIndex];
$T(lt.SongListWidget.smallVideoEmbed,'smallVideoContent')
.replaceToken('MEDIA_CONTENT_URL',entry.mediaUrl+'&autoplay=1')
.replaceToken('MEDIA_CONTENT_TYPE',entry.mediaType)
.compose();
Player.g.pausePlayback();
},

renderNoVideoPopup:function(){
var song=this.songs[this.videoSongIndex];
var elemId='songListVideoLink_'+this._wiid+'_'+song.id;

var d=new MojoDialog({
title:lt.SongListWidget.videoPopupTitle,
id:'youtubeVideosNone',
contextualElemId:elemId});
d.onClose=function(){document.onclick=null;}
d.open($TC(lt.SongListWidget.noVideo));
},

onPageSmallVideo:function(videoIndex){
this.renderSmallVideo(videoIndex);
lala.Track.clientPageWidgetInteraction(this.trackingId,'videos.pagingSmall');
},

renderSmallVideo:function(videoIndex){
this.renderVideoPopup(videoIndex,'small');
},

onPageFullVideo:function(videoIndex){
this.renderFullVideo(videoIndex);
lala.Track.clientPageWidgetInteraction(this.trackingId,'videos.pagingFull');
},

renderFullVideo:function(videoIndex){
Player.g.pausePlayback();
this.renderVideoPopup(videoIndex,'full');
},

onBuySongDownload:function(index,elem){
var song=this.songs[index];
widgets.store.openBuySongDownloadDialog(song);
lala.Track.clientPageWidgetInteraction(this.trackingId,'mp3');
},


openSongDownloadDialog:function(linkSongLalaId){
var found=false;
var song=this.songsById[linkSongLalaId];
if(song){
var span=$('slwDownloadPrice_'
+this._wiid+'_'+song.linkSongLalaId);
if(span){
var anc=span.parentNode;
if(!anc.className.lcontains('disabledAction')){
widgets.store.openBuySongDownloadDialog(song);
}
}
found=true;
}
return found;
},

onBuySong:function(index,btn){
var song=this.songs[index];
frontend.buyWebSong(song,null,MyMusic.g.getPageId(),null,function(){

$AC(btn,'Disabled');
});
lala.Track.clientPageWidgetInteraction(this.trackingId,'add');
},

onBuySongEvent:function(evt){
var self=this;
mojo.assert(this._wiid,'"this" reference is jacked in song list widget, happens in feed from time to time');

evt.songs.leach(function(theirSong){
var song=self.songsById[theirSong.linkSongLalaId];
if(!song||song.isDigied)return;

AddSongWidgetListener.addSongWidgetListener_UpdateSongAdded(song,theirSong);

var span=$('slwAddLabel_'+self._wiid+'_'+song.id);
if(span){
var buyClsName=span.parentNode.className;
span.parentNode.className="Disabled";
}

var showCheckMark=function(){
var span=$('slwAddLabel_'+self._wiid+'_'+song.id);
if(span){
span.innerHTML=widgets.SongList.CHECKMARK;
if(buyClsName&&!buyClsName.lcontains('buySquareButtonDisabledBought')){
span.parentNode.className=
buyClsName.replace(
'buySquareButton',
'buySquareButtonDisabledBought');
span.parentNode.title=widgets.SongList.TIP_BOUGHT;
}
}

var downloadPrice=$('slwDownloadPrice_'+self._wiid+'_'+song.id);
if(downloadPrice){
$DC(downloadPrice.parentNode,"highlightDownload");
}
};

if(self.layout!='lite'){
if(!self.hideAddedTransient){
if(span){
span.innerHTML=$T(lt.SongListWidget.songAddedTransient)
.replaceToken('numCredits',api.MicroWallet.credits)
.replaceToken('showCreditsLeft',api.MicroWallet.credits>0?'':'none')
.replaceToken('s',api.MicroWallet.credits==1?'':'s')
.compose();

}
}


var addPrice=$('slwAddPrice_'+self._wiid+'_'+song.id);
if(addPrice){
addPrice.innerHTML='&nbsp;';
}


if(frontend.canPurchaseDownload(song)){
var downloadPrice=$('slwDownloadPrice_'+self._wiid+'_'+song.id);
if(downloadPrice&&downloadPrice.innerHTML!=0){
var mp3Cents=null;
if(song.downloadPriceInCents<100){
mp3Cents=song.downloadPriceInCents+'&cent;';
}else{
mp3Cents='$'+mojo.util.formatPrice(song.downloadPriceInCents);
}
downloadPrice.innerHTML=song.isFreeMp3?'Free':mp3Cents;
$AC(downloadPrice.parentNode,"highlightDownload");
}
}

if(!self.hideAddedTransient){
window.setTimeout(showCheckMark,2000);
}else{
showCheckMark();
}
}else{
showCheckMark();
}
});
},

onBuySongDownloadEvent:function(evt){
var rerender=false;
var self=this;
evt.songs.leach(function(theirSong){
var song=self.songsById[theirSong.linkSongLalaId];
if(!song)return;

AddSongWidgetListener.addSongWidgetListener_UpdateMp3Purchased(song,theirSong);

if(!song.isLicensedForStreaming){



rerender=true;
return;
}

var downloadPrice;
if(self.buyMode=='mp3'){
var span=$('slwBuyLabel_'+self._wiid+'_'+song.id);
if(span){
var buyClsName=span.parentNode.className;
span.innerHTML=widgets.SongList.CHECKMARK;
if(buyClsName&&!buyClsName.lcontains('buySquareButtonDisabledBought')){
span.parentNode.className=
buyClsName.replace(
'buySquareButton',
'buySquareButtonDisabledBought');
span.parentNode.title='You already purchased this MP3';
}
}


downloadPrice=$('slwDownloadPrice_'+self._wiid+'_'+song.id);
if(downloadPrice){
downloadPrice.parentNode.innerHTML='&nbsp;';
}
}else{
downloadPrice=$('slwDownloadPrice_'+self._wiid+'_'+song.id);
if(downloadPrice){
$S(downloadPrice,widgets.SongList.IN_ICON_SMALL);
var downloadAnc=downloadPrice.parentNode;
$AC(downloadAnc,'disabledAction');
$DC(downloadAnc,'downloadLink');
$DC(downloadAnc,'freeMp3');
downloadAnc.title='You already purchased this MP3';
}
}
});

if(rerender){
this.render(null,true);
}
},

onForecastSongEvent:function(evt){
if(!(evt.type=='added'||evt.type=='delete'))return;

var updatedSong=evt.extra;

var mySong=this.songsById[updatedSong.linkSongLalaId];
if(mySong){
mySong.isForecast=evt.type=='added';

}
},

onQueue:function(index,elem){
Player.g.queueSong(this.songs[index],
function(){
elem.parentNode.innerHTML=$TC(lt.Core.addedToQueue);
},this.trackingId);
lala.Track.clientPageWidgetInteraction(this.trackingId,'queue');
},

onBookmarkClick:function(index,evt){
var song=this.songs[index];
evt=mojo.event.create(evt);
ActionLinks.onBookmark(song.linkSongLalaId,'song',evt.target);
},

onShareClick:function(index,evt){
var song=this.songs[index];
var elemId='songListShareLink_'+this._wiid+'_'+song.id;
var row=mojo.dom.getAncestorByTagName($(elemId),'TR');
mojo.event.create(evt).stopPropagation();
widgets.Share.openSharePulldown({
song:song,
elemId:elemId,
onBeforeOpen:function(){
if(lala.isBookmarksEnabled)$AC(row,'stayHovered');
},
onClose:function(){
if(lala.isBookmarksEnabled)$DC(row,'stayHovered');
}
});
lala.Track.clientPageWidgetInteraction(this.trackingId,'share');
},

onGiftClick:function(index,evt){
var song=this.songs[index];
mojo.event.create(evt).stopPropagation();
widgets.store.openBuyGiftWebSongDialog(song);
lala.Track.clientPageWidgetInteraction(this.trackingId,'gift');
},

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

var song=this.songs[index];
var elemId='songListPlaylistLink_'+this._wiid+'_'+song.id;
var row=mojo.dom.getAncestorByTagName($(elemId),'TR');

if(!this.a2p){
this.a2p=new widgets.AddToPlaylist();
}
this.a2p.onClick({
songsToAdd:[song],
elemId:elemId,
evt:evt,
onOpen:function(){if(lala.isBookmarksEnabled)$AC(row,'stayHovered');},
onClose:function(){if(lala.isBookmarksEnabled)$DC(row,'stayHovered');}
});
lala.Track.clientPageWidgetInteraction(this.trackingId,'playlist');
},

onPlayingSongEvent:function(evt){
if(!evt)return;

var song=evt.song;
if(!song)return;


if(this.currPlayerSongId){

var oldIcon=$('slwPlayIcon_'+this._wiid+'_'+this.currPlayerSongId);
if(oldIcon){
oldIcon.className=oldIcon.className.replace('_pause','');
}


var oldRow=$('slwRow_'+this._wiid+'_'+this.currPlayerSongId);
if(oldRow){
$('slwRow_'+this._wiid+'_'+this.currPlayerSongId).className=
$('slwRow_'+this._wiid+'_'+this.currPlayerSongId).className.replace(/currentlyPlaying/,'');
if(this.disc){
$('slwRow_'+this._wiid+'_'+this.currPlayerSongId+'_actions').className=
$('slwRow_'+this._wiid+'_'+this.currPlayerSongId+'_actions').className.replace(/currentlyPlaying/,'');
}
}

this.currPlayerSongId=null;
}





var newId=this.songIdMap[song.songLalaId];
var newIcon=$('slwPlayIcon_'+this._wiid+'_'+newId);















if(newIcon&&evt.status=='playing'){


if(newIcon.className.match(/play_icon_full_large/)
&&!newIcon.className.match(/play_icon_full_large_pause/)){
newIcon.className=newIcon.className.replace(
'play_icon_full_large',
'play_icon_full_large_pause');
}else if(newIcon.className.match(/play_icon_30_large/)
&&!newIcon.className.match(/play_icon_30_large_pause/)){
newIcon.className=newIcon.className.replace(
'play_icon_30_large',
'play_icon_30_large_pause');
}else if(newIcon.className.match(/play_icon_full_medium/)
&&!newIcon.className.match(/play_icon_full_medium_pause/)){
newIcon.className=newIcon.className.replace(
'play_icon_full_medium',
'play_icon_full_medium_pause');
}else if(newIcon.className.match(/play_icon_30_medium/)
&&!newIcon.className.match(/play_icon_30_medium_pause/)){
newIcon.className=newIcon.className.replace(
'play_icon_30_medium',
'play_icon_30_medium_pause');
}else if(newIcon.className.match(/play_icon_full/)
&&!newIcon.className.match(/play_icon_full_pause/)){
newIcon.className=newIcon.className.replace(
'play_icon_full',
'play_icon_full');
}else if(newIcon.className.match(/play_icon_30/)
&&!newIcon.className.match(/play_icon_30_pause/)){
newIcon.className=newIcon.className.replace(
'play_icon_30',
'play_icon_30');
}


mojo.css.addClass('slwRow_'+this._wiid+'_'+newId,'currentlyPlaying');
if(this.disc){
mojo.css.addClass(
'slwRow_'+this._wiid+'_'+newId+'_actions',
'currentlyPlaying');
}
this.currPlayerSongId=newId;
}
},

onPlayButtonHoverSimple:function(index,btn,event){
var song=this.songs[index];
var offsets={};
if(this.playButtonHoverOffsets){
offsets.top=this.playButtonHoverOffsets.top;
offsets.left=this.playButtonHoverOffsets.left;
}else{
offsets.top=0;
offsets.left=0;
}
if(index==0&&(mojo.SAFARI||mojo.CHROME)){
offsets.top++;
}
widgets.core.PlayButtonHover.open('medium',song,btn,event,{top:offsets.top,left:offsets.left},null,this.trackingId);
},

onPlayButtonHoverLite:function(index,btn,event){
var song=this.songs[index];
var offsets={};
if(this.playButtonHoverOffsets){
offsets.top=this.playButtonHoverOffsets.top;
offsets.left=this.playButtonHoverOffsets.left;
}else{
offsets.top=0;
offsets.left=0;
}
widgets.core.PlayButtonHover.open('small',song,btn,event,{top:offsets.top,left:offsets.left},null,this.trackingId);
},

onPlayButtonHoverSingle:function(index,btn,event){
var song=this.songs[index];
var offsets={};
if(this.playButtonHoverOffsets){
offsets.top=this.playButtonHoverOffsets.top;
offsets.left=this.playButtonHoverOffsets.left;
}
widgets.core.PlayButtonHover.open('medium',song,btn,event,{top:offsets.top,left:offsets.left},null,this.trackingId);
},

onPlayButtonHoverDefault:function(index,btn,event){
var song=this.songs[index];
var offsets={};
if(this.playButtonHoverOffsets){
offsets.top=this.playButtonHoverOffsets.top;
offsets.left=this.playButtonHoverOffsets.left;
}else{
offsets.top=0;
offsets.left=0;
}
if(index==0&&(mojo.SAFARI||mojo.CHROME)){
offsets.top++;
}
widgets.core.PlayButtonHover.open('large',song,btn,event,{top:offsets.top,left:offsets.left},null,this.trackingId);
}
};







widgets.SongList.renderDuration=function(song,songRow,hideNotPlayableIcon){
var durationDisplay=null;
if(song.playType!='NotPlayable'){
if(song.duration>0){
durationDisplay=mojo.util.secondsToTime(song.duration,true);
}else{

durationDisplay='--';
}
}else if(song.duration>0){
durationDisplay=mojo.util.secondsToTime(song.duration,true);
}else{
if(!hideNotPlayableIcon){
durationDisplay='<img title="this song cannot be played" width=7 src="pages/MyMusic/images/table_icon_not_playable.gif" />';
}else{
durationDisplay='-';
}
}

if(songRow){
songRow.replaceToken('durationDisplay',durationDisplay);
}

return durationDisplay;
};

widgets.SongList.renderDurationTooltip=function(song){
var text="";
if(song.playType=='Full'){
text="Listen to this track in full now";
}else if(song.playType=='NotPlayable'){
text="This track is currently not licensed for listening on Lala";
}else{
text="Listen to a 30 sec sample";
}
return text;

};

widgets.SongList.IN_ICON=
'<img class="inIcon" alt="in my collection" title="in my collection" src="images/checkmark_gray.gif" />';

widgets.SongList.IN_ICON_SMALL=
'<img alt="in my collection" title="in my collection" src="lib/widgets/SongList/images/checkmark_mp3.gif" />';

widgets.SongList.IN_ICON_TINY='<img src="pages/MyMusic/images/checkmark.gif" title="In your collection" />';


