/* ##################################################################
//! This file contains both original and merged/adapted code.        !//
//! Except where indicated, all code is                              !//
//! Copyright (c) 2008-2009 YouScrobble.com, and its Affiliates.     !//
//! All Rights Reserved.                                             !//
//! Not to be reused without permission.                             !//
//! Date: 2009/01/07 19:26:25                                        !//
   ################################################################## */

var elements = new Array();

var ug = false;

var ys_application=false;

var quicklist=new Array();
var quicklist_playing = -1;

addHandle("keypress",function(event) { if((event?event:window.event).keyCode!=27) return; Dialog.dismiss(); });

function request(url,options,caller) {
  if(!options.method||!options.method in oc(["get","post"])) { options.method = (options.body?"post":"get"); }
  if(!options.type  ||!options.type   in oc(["txt","xml" ])) { options.type   = "txt"; }
  options.json=options.json||false; options.async=options.async||true; caller=caller||this;
  if(typeof window.XMLHttpRequest == "undefined") window.XMLHttpRequest = function() {
    try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP"    ); } catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP" ); } catch(e) {}
    return false;
  }; var object = new XMLHttpRequest();
  if(Object.overrideMimeType) {
    var mime; switch(options.type) {
    case "txt": mime = "text/plain"; break;
    case "xml": mime = "text/xml";   break;
    } Object.overrideMimeType(mime);
  } var error = function() {
    if(options.handler||options.error) {
      (options.handler||options.error).call(caller,(object.responseText?object.responseText:object),false);
    } else { alert("An error occured while performing this operation."); }
  }; object.onreadystatechange = function() {
    if(options.state) { options.state.call(caller,object); }
    if(object.readyState==4&&object.status!=0) {
      if((object.status==200||window.location.href.indexOf("http")==-1) &&
        ((options.type=="txt" && object.responseText!==null) ||
         (options.type=="xml" && object.responseXML !==null))) {
        if(!(options.handler||options.success)) { return; }
        var result; switch((options.json?"json":options.type)) {
        case "json":
          try { result = eval('('+object.responseText+')'); }
          catch(e) { return error(); } break;
        case "txt" :  result = object.responseText; break;
        case "xml" :  result = object.responseXML;  break;
        } (options.handler||options.success).call(caller,result,true);
      } else { error(); }
    }
  }; object.open(options.method.toUpperCase(),options.parameters?url+(url.indexOf("?")==-1?"?":"&")+options.parameters:url,options.async);
  switch(options.method) {
  case "get": object.send(null); break;
  case "post":
    options.body = function(post){
      switch(typeof post) {
      case "string": return post;
      case "object": var pairs = []; for(var property in (post||{})) { pairs.push([encode_uc(property),encode_uc(post[property])].join('=')); } return pairs.join("&");
      } return new String();
    }(options.body);
    object.setRequestHeader("Content-type"  ,"application/x-www-form-urlencoded");
    object.setRequestHeader("Content-length",options.body.length);
    object.setRequestHeader("Connection"    ,"close");
    object.send(options.body); break;
  } return object;
}

function getNode(response,tag,default_value,index) {
  if(response.responseXML) { response = response.responseXML; }
  var node = response.getElementsByTagName(tag)[!index?0:index];
  return node||null;
}
function getNodeData(response,tag,default_value,index) {
  var node = getNode(response,tag,default_value,index)
  if(node) { node = node.firstChild; } if(!node) return default_value;
  return node.data||null;
}

function clearReport(el,loading,singleton) {
  if(!el) { return false; }
  for(var i = 0; i < el.childNodes.length; i++) {
    var node = el.childNodes.item(i);
    if((node.style&&node.style.display!="none")&&!hasClass(node,"ensure")&&!hasClass(node,"hide")) { if(singleton) { return false; } empty = false; el.removeChild(node); i--; }
  } if(loading) {
    var el_div=document.createElement('div'); el_div.innerHTML = '<center><img class="pad10" src="http://www.youscrobble.com/images/loading_ajax.gif"></center>';
    if(el.firstChild) { el.appendChild(el_div); }
    else { el.insertBefore(el_div,el.firstChild); }
  } return true;
}

var report_list_page = 0;
function processListReport(response) {
  var rows = element("listRows",true); if(!rows) { return; }
  for(var i = 0; i < rows.childNodes.length; i++) {
    var node = rows.childNodes.item(i);  
    if(!hasClass(node,"hide")) { rows.removeChild(node); i--; }
  } var root = response.childNodes.item(0);
  for(var i=0,l=0;i<root.childNodes.length;i++) {
    var node = root.childNodes.item(i); if(node.nodeType==3) continue; l++;
    var row = element("listRow_placeholder",true).cloneNode(true);
    var data = {type:node.nodeName,title:getNodeData(node,"name",getNodeData(node,"title")),value:getNodeData(node,"artist",getNodeData(node,"id")),image:getNodeData(node,"image",getNodeData(node,"image"),2)};
    data.text = data.title; if(!(data.description = getNodeData(node,"description",false))) {
      data.text = data.value;
      data.description = data.title;
    } new TemplateParameters(
      [['music-cell','id',"listRow"+l],
       ['music-title','innerHTML',(data.text.length>34?data.text.substr(0,34)+"...":data.text)],
       ['music-title','title',data.text],
       ['music-title','href',get_link(data.type,data.title,data.value)],
       ['music-description','innerHTML',(data.description.length>100?data.description.substr(0,100)+"...":data.description)],
       ['music-image-120','src',data.image?data.image:"http://cdn.last.fm/depth/catalogue/noimage/cover_large.gif"],
       ['video-id','value',data.value],
       ['artist','value',data.value],
       ['track','value',data.title],
       ['badge-thumb-box','innerHTML',badge_button_preview(l,data.type,data.title,data.value)]]
    ).fill(row);
    row.className = row.className.replace(/hide/g,"");
    var lastRow = element("listRow"+(l-1),true);
    if(lastRow) { rows.insertBefore(row,lastRow.nextSibling); }
    else{ rows.insertBefore(row,rows.firstChild); }
  } if(l==0) { show(element("list-empty",true)); hide(element("list-more",true)); } addBrowse();
}
function getVideoReport(search,page) {
  clearReport(element("listRows",true),true); window.scrollTo(0,0);
  request("http://www.youscrobble.com/report",{parameters:"type=video&attribute="+encode_uc(search)+"&page="+(!page?++report_list_page:page),type:"xml",success:processListReport});
}
function getTrackReport(search,page) {
  clearReport(element("listRows",true),true); window.scrollTo(0,0);
  request("http://www.youscrobble.com/report",{parameters:"type=track&attribute="+encode_uc(search)+"&page="+(!page?++report_list_page:page),type:"xml",success:processListReport});
}

function processLyricsReport(response) {
  var content; clearReport(content=element("info-tab-content-lyrics",true));
  content.appendChild($ce("div",{cl:"info-text"},getNodeData(response,"Lyric","We are sorry, there are no lyrics available for this track.").replace(/\n/g,"<br>")));
}
function getLyricsReport(artist,track) {
  if(!clearReport(element("info-tab-content-lyrics",true),true,true)) { return; }
  request("http://www.youscrobble.com/report",{parameters:"type=lyrics&attribute="+encode_uc(artist)+" - "+encode_uc(track),type:"xml",success:processLyricsReport});
}

function getStatisticReport() {  
  request("http://www.youscrobble.com/report",{parameters:"type=statistic",type:"xml",success:function(response) {
    if(element("statistic-0")) { element("statistic-0").innerHTML = getNode(response,"previews" ,0).getAttribute("text"); }
    if(element("statistic-1")) { element("statistic-1").innerHTML = getNode(response,"downloads",0).getAttribute("text"); }
    if(element("statistic-user-0")) { element("statistic-user-0").innerHTML = parseInt(getNodeData(getNode(response,"transactions"      ,0),"left",0)); }
    if(element("statistic-user-1")) { element("statistic-user-1").innerHTML = parseInt(getNodeData(getNode(response,"daily_transactions",0),"left",0)); }
    if(element("statistic-user-2")) { element("statistic-user-2").innerHTML = getNodeData(response,"previews" ,0); }
    if(element("statistic-user-3")) { element("statistic-user-3").innerHTML = getNodeData(response,"downloads",0); }
    if(element("statistic-user-4")) { element("statistic-user-4").innerHTML = parseInt(getNodeData(getNode(response,"transactions"      ,0),"left",0)) +
                                                                              parseInt(getNodeData(getNode(response,"daily_transactions",0),"left",0)); }
  }});
}

var report_recent = new Array();
var report_display_delay = 250;
var report_hide_delay = 8000;
function buildRecentReport(number) {
  if(! element("report-recent")) { return; }
  if(! number) { number = 15; };
  element("report-recent").innerHTML = "";
  if(report_recent.length == 0) {
    setTimeout('buildRecentReport('+number+')',500);
    return;
  }
  for(var i_download = number;i_download > 0;i_download--) {
    var download = report_recent.shift();
    report_recent.push(download);
    element("report-recent").innerHTML += '<li id="rd_'+i_download+'" style="font-size:'+(Math.floor(Math.random()*12)+10)+'px"><a href="/browse/'+parameter_secure(download["artist"])+'/_/'+parameter_secure(download["title"])+'" onclick="track(\'recent\',\'track\',\''+addslashes(download["artist"])+' - '+addslashes(download["title"])+'\')" title="'+download["artist"]+'">'+download["title"].replace(/[({\[][^({\[]*[)}\]]/g,new String()).substr(0,30)+'</a></li>';
    elements["rd_"+i_download] = null;
    setTimeout('fadeIn("rd_'+i_download+'")',(number-i_download)*report_display_delay);
    setTimeout('fadeOut("rd_'+i_download+'")',(number-i_download)*report_display_delay+report_hide_delay);
  }
  setTimeout('buildRecentReport('+number+')',(number*report_display_delay)+report_hide_delay+1500); //1500=Fade delay (100Opacity/5StepOpacity*50Interval)+500Buffer
}
function getRecentReport() {
  request("http://www.youscrobble.com/report",{parameters:"type=recent",type:"xml",success:function(response) {
    var tracks = response.getElementsByTagName("track");
    report_recent = new Array(); var report_unique = new Array();
    for(var i_track = 0;i_track < tracks.length;i_track++) {
      var s_artist = getNodeData(tracks[i_track],"artist");
      var s_title  = getNodeData(tracks[i_track],"title");
      var s_key    = s_title.replace(/\W/g,new String()).toLowerCase();
      if(report_unique[s_key]) { continue; }
      report_recent.push({artist:s_artist,title:s_title});
      report_unique[s_key] = true;
    }
  }});
}

var preview_last = new Array();
var preview_last_response = new Array();
var preview_request;
var preview_time = 0;
function processPreview(response,success) {
  if(arguments.length==0) {
    if(preview_last_response.length!=0) {
      return processPreview.apply(this,preview_last_response);
    } else { return false; }
  } preview_last_response = arguments;
  var e_player = element("preview-player"); if(!e_player) { return; } player.video.setVisible(false); e_player.innerHTML = "";
  var type;
       if(response.match(/^http:\/\/.*$/))  type = 1;
  else if(response.match(/^[\w_-]{11}.*$/)) type = 2;
  else type = false;
  if(!success||response.length == 0||!type) {
    if(typeof quicklist_playing != "undefined" && quicklist_playing != -1) { quicklist_remove("quicklistRow"+quicklist_playing); return; }
    var error,explanation,link;if(response.match(/^ERROR\[[0-9]{1,}\]$/)) {
      switch(error=parseInt(response.substr(response.indexOf("[")+1))) {
      case 13: explanation = "This track is not available for listening!\n\nDo you want to display the help article to this error?"; link = "/help/listen/unavailable"; remove_preview(); break;
      case 14: explanation = "This album is not available for listening!\n\nDo you want to display the help article to this error?"; link = "/help/listen/unavailable"; remove_preview(); break;
    }} if(!explanation) { explanation = "Please try again in a few seconds! (#"+error+")"; } explanation = "Whoops! Preview could not be played.\n"+explanation;
    if(!link) { alert(explanation); } else if(confirm(explanation)) { document.location.href = link; }
    toggle_preview();
  } else {
    var text = response.split(" "); var video = text.shift(); var text = text.join(" ");
    var b_video = hasClass(e_player,"preview-video"); if(b_video) player.video.setVisible(true);
    switch(type) {
    case 1:
      var swf = (dc.SWFObjectUtil.getPlayerVersion().major<9) ? "youscrobble_preview_v7.swf" : "youscrobble_preview.swf";
      var o_swf = new dc.SWFObject("/embed/"+swf,"preview-player:"+e_player.playing,!b_video?1:194,!b_video?1:145,"7","#FFFFFF");
      o_swf.addVariable("url",escape(video));
      if(checkPlayer()) {
        o_swf.addVariable("volume",player.getVolume()*100);
        player.setPlaying(text,true);
      } if(b_video) { o_swf.addVariable("video","true"); }
      if(dc.SWFObjectUtil.getPlayerVersion().major<9) {
        var iv = window.setInterval(function() {
          if(!$("preview-player").innerHTML) { window.clearInterval(iv); return; }
          if(typeof o_swf.GetVariable == "undefined") { return; }        
          preview_progress(o_swf.GetVariable("get_time"),o_swf.GetVariable("get_duration"));
        },250);
      }  break;
    case 2:
      var swf = "http://www.youtube.com/apiplayer?enablejsapi=1&version="+((dc.SWFObjectUtil.getPlayerVersion().major<9)?"3":"2")+"&playerapiid="+video;
      var o_swf = new dc.SWFObject(swf,"preview-player:"+e_player.playing,!b_video?1:194,!b_video?1:145,"7","#FFFFFF");
      o_swf.addVariable("autoplay",1); break;
    } o_swf.addVariable("id",e_player.playing);
    o_swf.addParam("allowscriptaccess","always"); o_swf.addParam("allowfullscreen","true"); o_swf.addParam("swliveconnect","true"); o_swf.addParam("menu","false"); o_swf.addParam("wmode","opaque");
    if(o_swf.write(e_player)) {
      if(checkPlayer()) player.setPlaying(text,true);
      o_swf = $("preview-player:"+e_player.playing);
    } preview_time = Math.ceil((new Date()).getTime()/1000);
    setBadgeStatus(getBadge(e_player.playing),"stop");  
  }
}
function onYouTubePlayerReady(playerapiid) {
  var e_player = element("preview-player"); if(!e_player) return;
  var o_swf = $("preview-player:"+e_player.playing); if(!o_swf) return;
  if(checkPlayer()) o_swf.setVolume(player.getVolume()*100);
  o_swf.loadVideoById(playerapiid);
  var iv = window.setInterval(function() {
    if(!$("preview-player").innerHTML||!o_swf.getCurrentTime||!o_swf.getDuration) window.clearInterval(iv);
    else preview_progress(o_swf.getCurrentTime(),o_swf.getDuration());
  },250);
  o_swf.addEventListener("onStateChange","onYouTubeStateChange");
  o_swf.addEventListener("onError","onYouTubeStateChange");
}
function onYouTubeStateChange(state) {
       if(state in oc([101,150])) getPreview("taint");
  else if(state==0||state>=100)
    preview_finished(state>=100);
}

//request preview from youscrobble (no parameters: repeat last entry)
function getPreview(type,title,value,taint) {
  if(arguments.length==0||type in oc(["taint"])) {
    if(preview_last.length!=0) {
      var e_player = element("preview-player"); if(!e_player) { return; }
      player.video.setVisible(false); e_player.innerHTML = "";
      var e_badge = getBadge(e_player.playing); setBadgeStatus(e_badge,"listen");
      switch(type) {
      case "taint": preview_last.push(true); break;
      default: if(preview_last[0]=="track") return getPreview("similar",preview_last[1],preview_last[2]);
      } setBadgeStatus(e_badge,"buffer"); return getPreview.apply(this,preview_last);
    } else { return false; }
  } preview_last = Array.prototype.slice.call(arguments);
  if(dc.SWFObjectUtil.getPlayerVersion().major<7) { return false; }
  preview_request = request("http://www.youscrobble.com/get",{parameters:"preview"+(taint?"&download":new String())+"&type="+type+"&title="+encode_uc(title)+(value?"&value="+encode_uc(value):new String())+(dc.SWFObjectUtil.getPlayerVersion().major<8?"&mono":new String()),handler:processPreview});
  if(checkPlayer()){player.setPlaying("Buffering Track...");} track("preview",type,value+" - "+title); return true;
}
function abortPreview() {
  if(preview_request&&preview_request.readyState!=4) { preview_request.abort(); }
  if(preview_time&&checkPlayer()&&element("account-link")) {
    var playing = player.getPlaying(); if(playing.type=="video") { playing = playing.title.split(/ - /,2); playing.title = playing[0]; playing.value = playing[1]; }
    if(!playing.title||!playing.value||!playing.position||!playing.duration
                  ||playing.position<=30||(playing.position<240&&playing.position<(playing.duration/2))) { preview_time = 0; return; }
    request("http://www.youscrobble.com/scrobble",{parameters:"artist="+encode_uc(playing.value)+"&track="+encode_uc(playing.title)+"&time="+preview_time,handler:processScrobble});
  } preview_time = 0;
}
function processScrobble(result,success) {
  if(!success) { return; }
  if(result.match(/^ERROR\[[0-9]{1,}\]$/)) {
      var explanation; switch(parseInt(response.substr(response.indexOf("[")+1))) {
      case 2:         explanation = "Whoops! Your Last.fm account data seems to be invalid!"; break;
      case 4: case 5: explanation = "Whoops! This track could not be scrobbled to Last.fm!"; break;
      } if(explanation) { alert(explanation+"\n\nPlease go to your accounts page and check your Last.fm account data.");  }
  }
}

var browse_hash=getBrowseHash();
var browse_request=false;
function getBrowseHash() { return unescape(window.location.hash.substr(1).replace(/%3F/g,"?")); }
function setBrowseHash(hash) {
  browse_hash=unescape(hash);
  window.location.hash="#"+hash.replace(/\?/g,"%3F");
}
function checkBrowseHash() {
  if(getBrowseHash() != browse_hash) {
    var link = getBrowseHash();
    if(link.length==0) {
      link = window.location.href.substr(window.location.href.indexOf("/browse")+"/browse".length);
      if(link == browse_hash) { return; }
    } getBrowse("/browse"+link);
  }
}
function processBrowse(response,success) {  
  element("util-ajax").style.display = "none"; document.body.style.cursor="auto";
  if(!success) { alert("Whoops! The requested page could not be displayed!\n\nPlease try again in a few seconds!"+(response.status?" (Error "+response.status+")":"")); }
  else {
    addClass(element("box-confirm")?element("box-confirm"):element("box-error"),"hide");
    element("homepage-main-content").innerHTML = response;
    var scripts = element("homepage-main-content").getElementsByTagName("script");
    for(var i_script=0;i_script<scripts.length;i_script++) { eval(scripts[i_script].innerHTML); }
  } addBrowse(); window.scrollTo(0,0);
}
function getBrowse(link) {
  Dialog.dismiss(); element("util-ajax").style.display = "block"; document.body.style.cursor="wait";
  var s_link = link; if(typeof link=="object") { s_link = UTF8.decode(unescape(link.href)); } s_link = s_link.replace(/[\r\n\v\t]/g," ")
  if(s_link.indexOf("/browse")!=-1) { s_link=s_link.substr(s_link.indexOf("/browse")+"/browse".length);  } else { s_link = ""; }
  if(!s_link.match(/^[?\/][^#]*$/)) { element("util-ajax").style.display = "none"; document.body.style.cursor="auto"; return false; }
  browse_request = request("http://www.youscrobble.com/browse"+(s_link.match(/^\?/)?s_link:encode_u(s_link)),{parameters:"async",handler:processBrowse});
  setBrowseHash(s_link); if(typeof link=="object") { link.onclick=function(){ return false; };link.style.cursor="wait"; }
  track("/browse"+s_link); return false;
}
function addBrowse(parent) {
  if(!parent) { parent = document; }
  var links = parent.getElementsByTagName("a");
  for(i_link=0;i_link<links.length;i_link++) {
    var link=links[i_link];
    if(link.href.match(/^http:\/\/[^ \/]*\/(?:browse)(\?[^ \/]{1,}|\/.{1,})$/) //^http://[^ /]*/(?:browse)(\?[^ /]{1,}|/.{1,})$
    &&(!link.onclick||link.style.cursor=="wait")) {
      link.onclick = function() { return getBrowse(this); };
      link.style.cursor = "pointer";
    }
  }
}

var application;
var application_search;
function add_search(type,title,value) {
  if(!application||application.closed) {
    var features; application = window.open(new String(),"youscrobble_application",features="width=700,height=375,scrollbars=yes,resizable=no,location=no,menubar=no,status=no,toolbar=no,directories=no,fullscreen=no");
    if(!application||application.closed||typeof application.add_search=="undefined") { application = window.open("/download","youscrobble_application",features); }
  } if(type!="quicklist"&&arguments.length!=3) { return; }
  if(typeof application.add_search=="undefined") { application_search = {type:type,title:title,value:value}; }
  else { application.focus(); application.add_search(type,title,value); }
  track("download",type,(value&&title?value+" - "+title:""));
}

function fadeIn(id) {
  var e = element(id);
  if(e.style.display != "inline") {
    e.style.display = "inline";
    changeOpacity(e,0);
  } else if(getOpacity(e) < 100) { changeOpacity(e,getOpacity(e)+5); }
  if(getOpacity(e) < 100) { setTimeout('fadeIn("'+id+'")',50); }
}
function fadeOut(id) {
  var e = element(id);
  if(getOpacity(e) > 0) {
    changeOpacity(e,getOpacity(e)-5);
    setTimeout('fadeOut("'+id+'")',50);
  } else {
    e.style.visibility = "hidden";
    changeOpacity(e,0);
  }
}

function getColor(e) {
       if(window.getComputedStyle) { return window.getComputedStyle(e,new String()).getPropertyValue("background-color"); }
  else if(e.currentStyle)          { return e.currentStyle.backgroundColor; }
  else if(e.bgColor)               { return e.bgColor; }
  else                             { return e.style.backgroundColor; }
}

function getOpacity(e) {
  var s = e.style;
       if(s.opacity)      { return s.opacity*100; }
  else if(s.MozOpacity)   { return s.MozOpacity*100; }
  else if(s.KhtmlOpacity) { return s.KhtmlOpacity*100; }
  else if(s.filter) {
    return s.filter.substring(s.filter.indexOf("=")+1,s.filter.length-1)*100;
  } else return 100;
}
function changeOpacity(e,opacity) {
  var s = e.style;
  s.opacity = (opacity / 100);
  s.MozOpacity = (opacity / 100);
  s.KhtmlOpacity = (opacity / 100);
  s.filter = "alpha(opacity=" + opacity + ")";
}
function element(id,no_from_buffer,no_to_buffer) {
  var e = null; if(id.nodeType==1) { return id; }
  if(!no_from_buffer && elements[id]) { return elements[id]; }
       if (document.getElementById) { e = document.getElementById(id);  }
  else if (document.all) { e = document.all[id]; }
  else if (document.layers) { e = document.layers[id]; }
  if(!no_to_buffer) { elements[id] = e; }
  return e;
}
function $(id,from_buffer,to_buffer) { return element(id,!from_buffer,!to_buffer); }
function $ce(name,attributes,children){
  var el=document.createElement(name);
  for(var attribute in attributes) {
    switch(attribute){
    case 'id': el.id = attributes[attribute]; break;
    case 'cl': el.className = attributes[attribute]; break;
    default:   el.setAttribute(attribute,attributes[attribute]); break;
    }
  }
       if(typeof children=='string') { el.innerHTML=children; }
  else if(children instanceof Array) {
    for(var child in children) { el.appendChild(children[child]); }
  } else if(children) { el.appendChild(children); }
  return el;
}
function $ctn(text){ return document.createTextNode(text); }

function count_substr(haystack,needle) {
  if(!haystack) { return -1; } var count = 0; var offset = -1;
  while((offset = haystack.indexOf(needle, offset+1))!=-1) { count++; }
  return count;
}

function compare(o1,o2){
  if(typeof o1!=typeof o2) { return false; }
  switch(typeof o1) {
  case "object":
    for(var p in o1) { if(o1[p]!==o2[p]) { return false; }}
    for(var p in o2) { if(o1[p]!==o2[p]) { return false; }}
    return true;
  default: return o1===o2; }
}

function oc(array) {
  var object = {};
  for(var i_array=0;i_array<array.length;i_array++) { object[array[i_array]]=null; }
  return object;
}
function co(object) {
  var array = [];
  for(var s_object in object) { array.push(object[s_object]); }
  return array;
}

function dump(object,dump) { //dump 1: show keys, dump 2: recrusive
  var array = [];
  for(var s_object in object) { try { array.push(typeof object[s_object]=="object"&&dump>1?"["+co(object[s_object],dump)+"]":(dump>0?s_object+":"+object[s_object]:object[s_object])); }catch(e){}}
  return array;
}

function submit_search(form) {
  if(self.location.pathname.indexOf("/browse")==0) {
    if(window.google.ac) { window.google.ac.Suggest_close(); } document.body.focus();
    return getBrowse("/browse?search_query="+encode_uc(element("search-term").value)+"&"+encode_uc(element("search-type").value));
  } else {
    if(element("search-type"       )) { element("search-type"       ).name = element("search-type"       ).value; }
    if(element("guided-search-type")) { element("guided-search-type").name = element("guided-search-type").value; }
    if(form&&form.submit) { form.submit(); }
  } return true;
}

function check_submit(event,func) {
  if((event?event:window.event).keyCode!=13) { return; }
  var args = new Array();
  for(var i_arguments=2;i_arguments<arguments.length;i_arguments++) {
    args.push(arguments[i_arguments]);
  } func.apply(null,args);
}

function watchSelectTab(tab){
  var el=tab.parentNode.firstChild;
  while(el){
    removeClass(el,'watch-tab-sel');
    el=el.nextSibling;
  } addClass(tab,'watch-tab-sel');
  tab.getElementsByTagName("a")[0].blur();
}
function guidedSearchSelect(item) {
  var el = element("guided-search-term"); if(!el) { return; }
  el.title = "Name the title of a"+(item.match(/^[aeiou]{1}.*$/)?"n":new String())+" "+item;
  el.value = new String(); focusInput(el,false);
  element("guided-search-type").value = item;
}

function navigateMusic(title,value) {
  if(self.location.pathname.indexOf("/browse")!=-1&&value) {
    toggle_preview('r',"track",title,value); return;
  } var url = "http://www.youscrobble.com/browse";
  if(value) { url += "/"+parameter_secure(value)+"/_/"+parameter_secure(title); track("recent","track",value+" - "+title); }
  else { url += "?search_query="+encode_uc(title)+"&track"; }
  self.location.href = url;
}

function navigateTab(area,key) {
  var tabs = $(area+"-tabs"), tab = $(area+"-tab-"+key); if(!tabs||!tab) { return; }
  var current_tabs = getElementsByTagNameAndClass("li","current",tabs);
  for(var i_tab in current_tabs) { removeClass(current_tabs[i_tab],"current"); } addClass(tab,"current");
  var content = getElementsByTagNameAndClass("div","content",tabs)[0]; if(!content) { return; }
  content = content.firstChild; do{ addClass(content,"hide"); } while(content&&(content=content.nextSibling));
  removeClass($(area+"-tab-content-"+key),"hide");
}

function navigateLink(key,link) {
  if(typeof key=="string") { //video
    if(!link) { //link track to video
      Dialog.create({type:'RequestPage',url:"http://www.youscrobble.com/link?video="+encode_uc(key)});
    } else {    //show track(s) to video
      if(link.length==1) { //tracks
        getBrowse("/browse/"+link[0][0]+"/_/"+link[0][1]);
      } else {             //track
        var container = $('info-tab-content-video'); var childs = [$ce("span",null,"linked tracks")];
        for(var i_link in link) {
          var _link = link[i_link];
          childs.push($ce("a",{href:get_link("track",_link[1],_link[0])},_link[0]+" - "+_link[1]));
        } var list = $ce("div",{cl:"track-video-list"},childs);
        container.insertBefore(list,container.firstChild.nextSibling); addBrowse(container);
        addEvent(document,"click",function(){ if(!list||!list.parentNode) { return; } list.parentNode.removeChild(list); });
      }
    }
  } else { //track
    if(!link) { //link video to track
      Dialog.create({type:'RequestPage',url:"http://www.youscrobble.com/link?artist="+encode_uc(key[0])+"&track="+encode_uc(key[1])});
    } else {    //show video to track
      getBrowse("/browse/video/"+link);
    }
  }
}

function addEvent(obj, event_name, callbackfunc) {
  if(!obj) { return; }
       if(obj.attachEvent)      { obj.attachEvent("on"+event_name,callbackfunc); }
  else if(obj.addEventListener) { obj.addEventListener(event_name,callbackfunc,true); }
  else { obj["on"+event_name] = callbackfunc; }
}

function addHandle(eventname, handler) {
  if(window.addEventListener) { window.addEventListener(eventname, handler, false); }
  else if(window.attachEvent) { window.attachEvent("on" + eventname, handler); }
}
function removeHandle(eventname, handler) {
  if(window.removeEventListener) { window.removeEventListener(eventname, handler, false); }
  else if(window.detachEvent)    { window.detachEvent("on" + eventname, handler); }
}

function addPopupHandle(popup,eventname,handler) {
  if(popup.addEventListener) { popup.addEventListener(eventname, handler, false); }
  else if(popup.attachEvent) { popup.attachEvent("on" + eventname, handler); }
}

function setCookie(name,value,expires,path,domain,secure) {
  var today = new Date(); today.setTime(today.getTime());
  if(expires) { expires = expires * 1000 * 60 * 60 * 24; }
  var expires_date = new Date(today.getTime()+(expires));
  document.cookie = name+"="+escape(value)+(expires ? ";expires="+expires_date.toGMTString() : "")+
                                            ";path="+(path ? path : "/")+
                                           (domain  ? ";domain="+domain : "")+
                                           (secure  ? ";secure" : "");
}

function getCookie(name,default_value) {
  if(document.cookie.length>0) {
	  var cookie = document.cookie.split(";");
	  for(position = 0;position<cookie.length;position++) {
	    if(cookie[position].indexOf('=') == -1) { continue; }
	    cookie[position] = cookie[position].split('=');
	    if(cookie[position][0].replace(/^\s+|\s+$/g,'') == name) {
	      return unescape(cookie[position][1].replace(/^\s+|\s+$/g, ''));
	    }
	  }
	} return (typeof default_value!="undefined" ? default_value : "");
}

var clearedInput = new Array();
function focusInput(obj,focus) {
  if(focus) {
    if(! clearedInput[obj.id]) {
      obj.title = obj.value; obj.value = new String();
      obj.style.color = "#000";
      clearedInput[obj.id] = true;
    } obj.select();
  } else {
    if(obj.value == new String()) {
      obj.value = obj.title; obj.title = new String();
      obj.style.color = "#999";
      clearedInput[obj.id] = false;
    }
  }
}

function toggleSimpleTooltip(el,show){
  if(typeof el=="string") { el = element(el,true); }
  while(el){
    if(!hasClass(el,'tooltip-wrapper-box')) { el=el.nextSibling; continue; }
    if(show){ removeClass(el,"hide"); }
    else{ addClass(el,"hide"); }
    break;
  }
}
function toggleTimedTooltip(name) {
  toggleSimpleTooltip(name,true);
  setTimeout('toggleSimpleTooltip("'+name+'",false);',10000);
}
function toggleFirstTimeTooltip(name) {
  if(parseInt(getCookie("tip_"+name,"0"))<3) {
    toggleTimedTooltip("sub_"+name);
    setCookie("tip_track",parseInt(getCookie("tip_"+name,"0"))+1,360);
  }
}
  
function checkPlayer() { return (typeof player=="object"); }
function getRepeat() {
  if(!checkPlayer()) { return 0; }
  else { return player.getRepeat(); }
}

var dropdown_menu={};
function dropdown(e,id,pid,event_type){
  hideDropdown();
  dropdown_menu.id=id;
  dropdown_menu.pid=(pid)?pid:element(id).parentNode.id;
  dropdown_menu.event_type=(event_type)?event_type:"click";
  stopPropagation(e);
  show(dropdown_menu.id); addClass(element(dropdown_menu.pid),"show-dropdown");
}
function hideDropdown(){
  if(!dropdown_menu.id) { return; }
  hide(dropdown_menu.id);  removeClass(element(dropdown_menu.pid),'show-dropdown');
  dropdown_menu={};
}
addEvent(document,"click",function(e){ hideDropdown(); });
addEvent(document,"mouseover",function(e){
  if(!e) { var e = window.event; } var el=e.target||e.srcElement;
  if(!dropdown_menu||!dropdown_menu.event_type||!dropdown_menu.pid) { return; }
  if(e.type.indexOf(dropdown_menu.event_type)!=-1&&!hasAncestor(el,dropdown_menu.pid)) { hideDropdown(); }
});

function dropdownSelect(el,value) {
  var dropdown = findAncestorByClass(el,"soft-dropdown"); if(!dropdown) { return; }
  var dropdown_menu = getElementsByTagNameAndClass("ul","soft-dropdown-menu",dropdown)[0];
  dropdown_menu.style.visibility = "hidden"; setTimeout(function(){dropdown_menu.style.visibility = new String();},10);
  var dropdown_button = getElementsByTagNameAndClass("a","soft-dropdown-button",dropdown)[0];
  dropdown_button.replaceChild($ce("span",null,el.innerHTML),dropdown_button.firstChild);
  var inp = dropdown.getElementsByTagName("input");
  if(value&&inp.length!=0) { inp[0].value = value; }
}

function hasAncestor(el,an){
  el=element(el); an=element(an);
  while(el!=document&&el!=null){
    if(el==an) { return true; }
    el = el.parentNode;
  } return false;
}

function findAncestorByClass(element,className){
  var el=element;
  while(el!=document&&el!=null){
    if(hasClass(el,className)) { return el; }
    el = el.parentNode;
  } return null;
}

function show(e){
  if(e instanceof Array) {
    for(var i in e) { show(e[i]); } e=null;
  } else if(typeof e=="string") { e = element(e); } if(!e){ return; }
       if(hasClass(e,"wasinline")) { e.style.display="inline"; removeClass(e,"wasinline"); }
  else if(hasClass(e,"wasblock" )) { e.style.display="block";  removeClass(e,"wasblock" ); }
  else {
    var n=e.nodeName.toLowerCase();
    e.style.display=(n=="span"||n=="img"||n=="a")?"inline":(n=='tr'||n=='td'?"":"block");
  }
}
function hide(e){
  if(e instanceof Array) {
    for(var i in e) { hide(e[i]); } e=null;
  } else if(typeof e=="string") { e = element(e); } if(!e){ return; }
       if(e.style.display=="inline"){ addClass(e,"wasinline"); }
  else if(e.style.display=="block" ){ addClass(e,"wasblock");  }
  e.style.display="none";
}

function stopPropagation(e){
  if(!e) { var e=window.event; }
  e.cancelBubble=true;
  if(e.stopPropagation) { e.stopPropagation(); }
}

function quicklist_toggle(index) {
  quicklist_playing = index;
  addClass(element("quicklistRow"+quicklist_playing,true),"watch-quicklist-row-playing");
  removeClass(element("playstop"),"hide"); addClass(element("playall"),"hide");
}
function quicklist_play(index) {
  if(!index) { index = 0; } if(!quicklist[index]) { index = 0; }
  if(quicklist.length<=index) { return; } toggle_preview();
  toggle_preview(-1*index,quicklist[index].type,quicklist[index].title,quicklist[index].value);
  quicklist_toggle(index);
}
function quicklist_stop() {
  if(quicklist_playing!=-1) {
    removeClass(element("quicklistRow"+quicklist_playing,true),"watch-quicklist-row-playing");
    quicklist_playing = -1;
  } addClass(element("playstop"),"hide"); removeClass(element("playall"),"hide");
}
function quicklist_next(backward) {
  if(quicklist_playing==-1) { quicklist_playing = backward?quicklist.length-1:0; }
  else {
    if(getRepeat()==1) { processPreview(); return; }
    var i_previous = quicklist_playing; toggle_preview();
    if(i_previous==(backward?0:quicklist.length-1)) {
      if(getRepeat()!=2) { quicklist_stop(); return; }
      i_previous = backward?quicklist.length:-1;
    } quicklist_playing = i_previous+(backward?-1:1);
  } toggle_preview(-1*quicklist_playing,quicklist[quicklist_playing].type,quicklist[quicklist_playing].title,quicklist[quicklist_playing].value);
}
function quicklist_previous() { quicklist_next(true); }

var tip_quicklist = false;
function quicklist_add(type,title,value,image,silent) {
  if(isPopup()&&window.opener.quicklist_add) { return window.opener.quicklist_add.apply(null,arguments); }
  if(!element("quicklist-panel")) return;
  if(!silent) {
    for(i_quicklist=0;i_quicklist<quicklist.length;i_quicklist++) {
      var e_item = quicklist[i_quicklist];
      if(e_item.type == type && e_item.value == value && e_item.title == title) {
        if(confirm("This entry does already exist, do you want to add it anyway?")) { break; }
        else { return; }
      }
    }
    if(typeof(element("quicklist-panel").scrollIntoView) == "function") { element("quicklist-panel").scrollIntoView(false); }
  }  quicklist.push({type:type,title:title,value:value,image:image,index:quicklist_item_add(quicklist.length,type,title,value,image)});
  if(!silent) { quicklist_save(); quicklist_class(); }
}

function quicklist_add_all() {
  addClass(element("quicklist-panel"),"hide");
  var badge; for(var i_badge=1;(badge=getBadge(i_badge,true,true));i_badge++) {
    quicklist_add.apply(null,co(getBadgeInfo(badge)).concat("",true));
  }  quicklist_save(); quicklist_class();
}

function quicklist_remove(row) {
  if(typeof(row)=="string") { row=element(row); }
  else { row=findAncestorByClass(row,"watch-quicklist-row"); }
  var index = row.id.replace(/[^-\d]/g,new String());
  if(index == quicklist_playing) { quicklist_next(); }
  if(quicklist.length!=1) { quicklist.splice(index,1); } else { quicklist_clear(); return; }
  row.parentNode.removeChild(row); var new_index=0;
  for(var i_quicklist=0;i_quicklist<quicklist.length+1;i_quicklist++){
    var e_row = element("quicklistRow"+i_quicklist,true);
    if(e_row) {
      var e_index = element("quicklistRowIndex"+i_quicklist,true);
      var e_badge = element("quicklistRowBadge"+i_quicklist,true);
      e_row.id="quicklistRow"+new_index;
      e_index.id="quicklistRowIndex"+new_index;
      e_badge.id="quicklistRowBadge"+new_index;
      e_index.innerHTML=new_index+1;
      e_badge.innerHTML =  quicklist_item_badge(new_index,quicklist[new_index].type,quicklist[new_index].title,quicklist[new_index].value);
      if(hasClass(e_row,"watch-quicklist-row-playing")) {
        quicklist_playing=new_index;
        var e_player = element("preview-player");
        e_player.playing = -1*new_index;
        getBadge(e_player.playing).getElementsByTagName("img")[0].className = "badge badge-stop";
      }
      quicklist[new_index].index = new_index;
      new_index++;
    }
  } quicklist_save(); quicklist_class();
}

function quicklist_clear() {
  if(quicklist_playing != -1) { toggle_preview(); quicklist_stop(); }
  for(var i_quicklist=0;i_quicklist<quicklist.length;i_quicklist++){
    e_row = element("quicklistRow"+quicklist[i_quicklist].index,true);
    if(e_row) { e_row.parentNode.removeChild(e_row); }
  } quicklist = new Array(); quicklist_save(); quicklist_class();
}

function quicklist_get() {
  var quicklist = []; var cookie = getCookie("quicklist");
  if(!cookie) { return quicklist; }
  var items = cookie.split(String.fromCharCode(30));
  for(var i_item in items) { quicklist.push(items[i_item].split(String.fromCharCode(31))); }  
  return quicklist;
}

function quicklist_load() {
  var quicklist = quicklist_get();  
  for(var i_item in quicklist) {
    var item = quicklist[i_item]; item.push(true);
    quicklist_add.apply(null,item);
  } quicklist_class();
}

function quicklist_save() {
  var items = []; for(var i_item in quicklist) {
    var item = []; for(var key in oc(["type","title","value","image"])){ item.push(quicklist[i_item][key]); }
    items.push(item.join(String.fromCharCode(31)));
  } setCookie("quicklist",items.join(String.fromCharCode(30)),7);
}

function quicklist_class() {
  if(element("quicklistQuantity")) { element("quicklistQuantity").innerHTML = quicklist_get().length; }
  if(!element("quicklist-panel")) { return; }
  addClass(element("quicklist-panel-no"),"hide");
  removeClass(element("quicklist-panel"),"hide");
       if(quicklist.length==0){ addClass(element("quicklist-panel"),"hide"); removeClass(element("quicklist-panel-no"),"hide"); }
  else if(quicklist.length<5){
    addClass(element("quicklistContainer"),"watch-quicklist-auto-height");
    removeClass(element("quicklistContainer"),"watch-quicklist-fixed-height");
  } else {
    addClass(element("quicklistContainer"),"watch-quicklist-fixed-height");
    removeClass(element("quicklistContainer"),"watch-quicklist-auto-height");
  }
}

function quicklist_link(link) {
  if(isPopup()) {
    self.opener.location.href = link.href;
    return false;
  } else if(self.location.pathname.indexOf("/browse")==0) {
    getBrowse(link);
    return false;
  }
}

function get_text(type,title,value) {
  if(!type) { return new String(); }
  if(!title&&!value) {
    switch(type) {
    case "tag": return "Category";
    } return toWordCase(type);
  } else {
    var text = ""; switch(type) {
    case "album": case "track": case "playlist": text  = value+" - ";
    case "tag": case "category": case "video":   text += title; break;
    case "artist": case "user":                  text  = value; break;
    } return text;
  }
}
function get_link(type,title,value,short) {
  switch(type) {
  case "artist":   return "/browse/"+encode_uc(value);
  case "album":    return "/browse/"+encode_uc(value)+"/"+encode_uc(title);
  case "track":    return "/browse/"+encode_uc(value)+"/_/"+encode_uc(title);
  case "tag":
  case "category": return (!short?"/browse":null)+"/category/"+encode_uc(title);
  case "user":     return (!short?"/browse":null)+"/user/"+encode_uc(value);
  case "playlist": return (!short?"/browse":null)+"/user/"+encode_uc(value)+"/"+encode_uc(title);
  case "video":    return (!short?"/browse":null)+"/video/"+encode_uc(value);
  } return "/browse";
}

function quicklist_item_add(index,type,title,value,image) {
  var row = element("quicklistRow_placeholder").cloneNode(true);
  quicklist_item_fill(row,index,type,title,value,image);
  row.className = row.className.replace(/hide/g,"");
  var rows = element("quicklistRows");
  var lastRow = element("quicklistRow"+(index-1),true);
  if(lastRow) { rows.insertBefore(row,lastRow.nextSibling); }
  else{ rows.insertBefore(row,rows.firstChild); }
  element("quicklistContainer").scrollTop=row.offsetTop;
  track("quicklist","add",type+" - "+value+" - "+title); return index;
}

function quicklist_item_fill(row,index,type,title,value,image){
  var single_line = type in oc(["artist","tag","user","video"]);
  var text = (single_line?title:value);
  new TemplateParameters(
    [['watch-quicklist-row','id',"quicklistRow"+index],
    ['watch-quicklist-row','class',function(node){}],
    ['quicklist-index','id',"quicklistRowIndex"+index],
    ['quicklist-index','innerHTML',index+1],
    ['quicklist-type','id',"quicklistRowType"+index],
    ['quicklist-type','className',"type-"+type],
    ['quicklist-type','title',type=="tag"?"Category":toWordCase(type)],
    ['watch-quicklist-row-link','href',get_link(type,title,value)],
    ['quicklist-title','innerHTML',(text.length>14?text.substr(0,14)+"...":text)],
    ['quicklist-title','title',text],
    ['quicklist-title','className',function(node){ if(single_line){addClass(node,"marT10");} return node.className; }],
    ['quicklist-facets','innerHTML',title],
    ['quicklist-facets','className',function(node){ if(single_line){addClass(node,"hide");} return node.className; }],
    ['watch-quicklist-item-badge','id',"quicklistRowBadge"+index],    
    ['watch-quicklist-item-badge','innerHTML',quicklist_item_badge(index,type,title,value)]]
  ).fill(row);
}

function quicklist_item_badge(index,type,title,value,dom) {
  return badge_preview(-1*index,type,title,value,dom);
}

function TemplateParameters(params) {
  this.addParameter=addParameter;
  this.applyToNode=applyToNode;
  this.fill=fill;
  this.parameters=new Object();
  for(var i=0;i<params.length;i++){
    this.addParameter(params[i][0],params[i][1],params[i][2]);
  }
  
  function Parameter(attrName,value){
    this.attrName=attrName;
    this.value=value;
  }
  function addParameter(className,attrName,value){
    if(!this.parameters[className]) { this.parameters[className]=new Array(); }
    this.parameters[className].push(new Parameter(attrName,value));
  }
  function applyToNode(node){
    var classList=getClassList(node);
    for(var i=0;i<classList.length;i++) {
      var applyList=this.parameters[classList[i]];
      if(applyList){
        for(var j=0;j<applyList.length;j++) {
          if(applyList[j].attrName.substr(0,1)=="$") {
                 if(!applyList[j].value) { continue; }
            else if( applyList[j].value.parentNode) { applyList[j].value.parentNode.removeChild(applyList[j].value); }
            switch(applyList[j].attrName.substr(1)) {
            case "append": node.appendChild(applyList[j].value); break;
            case "insert": node.insertBefore(applyList[j].value[0],applyList[j].value[1]); break;
            }
          } else if(typeof applyList[j].value=="function") {
            if(applyList[j].attrName.substr(0,2)=="on") {
              addEvent(node,applyList[j].attrName.substr(2),applyList[j].value);
            } else {
              node[applyList[j].attrName]=applyList[j].value(node);
            }
          } else if(applyList[j].value instanceof Array) {
            if(typeof applyList[j].value[0]=="function") {
              (function(n,e,f) { //node,event,function
                var c = [n,e,f];
                addEvent(c[0],c[1],function() { c[2][0].apply(null,c[2][1]) });
              })(node,applyList[j].attrName.substr(2),applyList[j].value);
            }
          } else {
            node[applyList[j].attrName]=applyList[j].value;
          }
        }
      }
    }
  }
  function fill(node){
    for(var i=0;i<node.childNodes.length;i++) { this.fill(node.childNodes[i]); }
    this.applyToNode(node);
  }
}
function getClassList(el){
  if(el.className) { return el.className.split(' '); }
  else{ return[]; }
}
function hasClass(el,_className){
  if(!el){ return;  }
  var upperClass=_className.toUpperCase();
  if(el.className){
    var classes=el.className.split(' ');
    for(var i=0;i<classes.length;i++){ if(classes[i].toUpperCase()==upperClass){return true; }  }
  }
  return false;
}

function addClass(el,_class){
  if(typeof el=="string") el=$(el); if(!el) return;
  if(!hasClass(el,_class)){ el.className+=el.className?(" "+_class):_class; }
}

function removeClass(el,_class){
  if(typeof el=="string") el=$(el); if(!el) return;
  var upperClass=_class.toUpperCase();
  var remainingClasses=[];
  if(el.className){
    var classes=el.className.split(' ');
    for(var i=0;i<classes.length;i++){if(classes[i].toUpperCase()!=upperClass){ remainingClasses[remainingClasses.length]=classes[i];  }}
    el.className=remainingClasses.join(' ');
  }
}

function toggleClass(el,_class){
  if(typeof el=="string") el=element(el,true); if(!el) return;
  if(hasClass(el,_class)) { removeClass(el,_class); }
  else{ addClass(el,_class);  }
}

function getElementsByTagNameAndClass(tag,_class,parent) { parent = parent||document;
  var array=(tag=="*"&&parent.all)?parent.all:parent.getElementsByTagName(tag);
  var regex=new RegExp("\\b(?!\-)"+_class+"(?!\-)\\b",""); var matches=[];
  for(var i=0;i<array.length;i++){
    if(!regex.test(array[i].className)) { continue; }
    matches.push(array[i]);
  } return matches;
}
function getElementsByClassName(_class,parent){ return getElementsByTagNameAndClass("*",_class,parent); }

function toWordCase(str) {
  if(!str) { return new String(); }
  return str.replace(/^(.)|\s(.)/g,function($1){return $1.toUpperCase();});
}

function addslashes(str) {
  if(typeof str!="string") { return str; }
  return str.replace(/([\\"'])/g, "\\$1").replace(/\u0000/g, "\\0");
}
function stripslashes( str ) {
  if(typeof str!="string") { return str; }
  return str.replace(/\\(.?)/g,function (s,m) {
                                 switch(m) { case '\\': return '\\'; case '0': return '\0'; case '': return ''; }
                                       return m;
                               });
}

function parameter_secure(str) {
  return encode_uc(str_replace(new Array("/","&"),new Array("%2F","%26"),str));
  //if(parameter_secure.caller!=parameter_secure) { return parameter_secure(encode_uc(str)); } return encode_uc(str);
}

function str_replace(search, replace, subject) {
    var f = search, r = replace, s = subject;
    var ra = r instanceof Array, sa = s instanceof Array, f = [].concat(f), r = [].concat(r), i = (s = [].concat(s)).length;
    while (j = 0, i--) {
        if (s[i]) { while (s[i] = (s[i]+'').split(f[j]).join(ra ? r[j] || "" : r[0]), ++j in f){}; }
    }; return sa ? s : s[0];
}

/* ##################################################################
//! The following section of this file code was mainly adapted from: !//
//! "YouTube.com"                                                    !//
//! Copyright (c) 2008 Google Inc. All Rights Reserved.              !//
//! Some minor changes and additions have been made to suit the      !//
//! current application requirements and to enhance functionality.   !//
   ################################################################## */
window.google=window.google||{};
(function(){
function H(a,b,c){var d="on"+b;if(a.addEventListener){a.addEventListener(b,c,false)}else if(a.attachEvent){a.attachEvent(d,c)}else{var f=a[d];a[d]=function(){var e=f.apply(this,arguments),h=c.apply(this,arguments);return e==undefined?h:(h==undefined?e:h&&e)}}};var l=window,p=document,ha,P,D,n,V,J="",Jc="",M=null,y=null,v=null,B=-1,R,g,s,u,C=null,r=null,x,F,ma={},m=null,X,G=0,K=0,U=0,A=null,Ls=null,S,I=false,$=false,da,L,su="";{var xa=navigator.userAgent.toLowerCase();da=xa.indexOf("opera")!=-1;L=xa.indexOf("msie")!=-1&&!da}var Q=null,ya=new RegExp("^[\\s\\u1100-\\u11FF\\u3040-\\u30FF\\u3130-\\u318F\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\u9FFF\\uAC00-\\uD7A3\\uF900-\\uFAFF\\uFF65-\\uFFDC]+$"),j="google-ac-",la=true;function Ca(a,b,c,d,f,e,s1){R=a;g=b;ha=d;Q=f;la=e;su=s1;P=qa()==null&&
!ha;var h=l.google.kHL;S=/^(zh-(CN|TW)|ja|ko)$/.test(h);if(c=="search")c="";X="/complete/search?nolabels=t&hl="+ba(h)+(c?"&ds="+ba(c):"")+"&client=suggest";if(P)fa("");g.setAttribute("autocomplete","off");H(g,"blur",Fa);H(g,"beforedeactivate",Ga);if(g.addEventListener){g.onkeypress=ua;g.onkeyup=va}else{H(g,L?"keydown":"keypress",ua);H(g,"keyup",va)}n=(V=(D=g.value));s=t("table");s.id="completeTable";s.cellSpacing=(s.cellPadding="0");u=s.style;w(s,j+"m");z();o(p.body,s);if(1){C=t("iframe");r=C.style;
C.id="completeIFrame";r.zIndex="1";r.position="absolute";r.display="block";r.borderWidth=0;o(p.body,C)}W();ja("",[],[]);Ba();if(P){var k=t("div"),i=k.style;O(i,false);i.position="absolute";i.left="0";i.top="-10000";i.width=(i.height="0");var q=t("iframe");q.name=(q.id="completionFrame");q.src=X;o(k,q);o(p.body,k)}H(l,"resize",W);H(l,"pageshow",Ja);if(S)l.setInterval(Ka,10);x=na("aq","f",false);F=na("oq","",true);Z()}function Ja(a){if(a.persisted)x.value="f";F.value=""}function Ba(){var a=p.body.dir==
"rtl",b=a?"right":"left",c=a?"left":"right",d=p.getElementsByTagName("head")[0],f=t("style"),e=null,h=null,k=false;if(p.styleSheets){o(d,f);k=true;e=f.sheet?f.sheet:f.styleSheet}if(!e){h=p.createTextNode("");o(f,h)}var i=function(q,E){var ia=q+" { "+E+" }";if(e){if(e.insertRule){e.insertRule(ia,e.cssRules.length)}else if(e.addRule){e.addRule(q,E)}}else{h.data+=ia+"\n"}};i("."+j+"m","font-size:13px;font-family:arial,sans-serif;cursor:default;line-height:17px;border:1px solid #999;z-index:66;position:absolute;background-color:white;margin:0;");
i("."+j+"a","background-color:white;");i("."+j+"b","background-color:#5a2;color:white;");i("."+j+"c","white-space:nowrap;overflow:hidden;text-align:"+b+";padding-"+b+":3px;"+(L||da?"padding-bottom:1px;":""));i("."+j+"d","white-space:nowrap;overflow:hidden;font-size:10px;text-align:"+c+";color:#666;padding-"+b+":3px;padding-"+c+":3px;");i("."+j+"b td","background-color:#5a2;color:white;");i("."+j+"e td","padding:0 3px 2px;text-align:"+c+";font-size:10px;line-height:15px;");i("."+j+"e td","color:#052;text-decoration:underline;cursor:pointer;");
if(!k)o(d,f)}function W(){if(s){u.left=pa(g,"offsetLeft")+"px";u.top=pa(g,"offsetTop")+g.offsetHeight-1+"px";u.width=g.offsetWidth+"px";if(C){r.left=u.left;r.top=u.top;r.width=s.offsetWidth+"px";r.height=s.offsetHeight+"px"}}}function t(a){return p.createElement(a)}function o(a,b){a.appendChild(b)}function O(a,b){a.visibility=b?"visible":"hidden"}function Wu(a){return a.replace(/^(.)|\s(.)/g,function($1){return $1.toUpperCase();});}function na(a,b,c){var d=t("input");d.type="hidden";d.name=a;d.value=b;d.disabled=c;o(R,d);return d}function Fa(a){if(!I)z();I=false}function Ga(a){if(I){l.event.cancelBubble=
true;l.event.returnValue=false}I=false}function ua(a){var b=a.keyCode;if(b==27&&ka()){z();N(n);a.cancelBubble=true;a.returnValue=false;return false}if(!T(b))return true;U++;if(U%3==1)ea(b);return false}function va(a){var b=a.keyCode;if(!(S&&T(b))&&U==0)ea(b);U=0;return!T(b)}function ea(a){if(S&&T(a))Aa();if(g.value!=D||a==39){n=g.value;if(a!=39)F.value=n}if(ra(a)){wa(B+1)}else if(sa(a)){wa(B-1)}W();if(J!=n&&!A)A=l.setTimeout(z,500);D=g.value;if(D==""&&!M)Z()}function sa(a){return a==38||a==63232}
function ra(a){return a==40||a==63233}function T(a){return sa(a)||ra(a)}function Ha(){g.blur();x.value=B;N(this.completeString);if(la){if(oa()){if(typeof R.onsubmit!="function"||R.onsubmit()!==false) R.submit()}}else{z()}}function ta(){if($)return;if(v)w(v,j+"a");w(this,j+"b");v=this;for(var a=0;a<y.length;a++){if(y[a]==v){B=a;break}}}function Ia(){if($){$=false;ta.call(this)}}function wa(a){if(J==""&&n!=""){V="";Z();return}if(n!=J||!M)return;if(!y||y.length<=0)return;if(!ka()){ga();return}var b=y.length;if(Q)b-=1;if(v)w(v,j+"a");if(a==b||a==-1){B=-1;
N(n);ca();x.value="f";return}else if(a>b){a=0}else if(a<-1){a=b-1}x.value=a;B=a;v=y.item(a);w(v,j+"b");N(v.completeString)}function z(){if(A){l.clearTimeout(A);A=null}O(u,false);if(C)O(r,false)}function ga(){O(u,true);if(C)O(r,true);W();$=true}function ka(){return u.visibility=="visible"}function za(a,b,c){if(c.length==0||c[0]<2)return;var d=[],f=[],e=c[0],h=Math.floor((c.length-1)/e);for(var k=0;k<h;k++){d.push(c[k*e+1]);f.push(c[k*e+2])}Y(a,b,d,f)}function Y(a,b,c,d){if(G>0)G--;ja(b,c,d);if(b!=
n)return;if(A){l.clearTimeout(A);A=null}J=b;Jc=J.toLowerCase();La(s,c,d);B=-1;y=s.rows;if(y.length>0){ga()}else{z()}Ls=c[0];}function Da(a){var b;a.unshift(b);if(a.length>=3){if(a.length<4)a.push([])}Y.apply(null,a)}function ja(a,b,c){ma[a]=[b,c]}function oa(){if(P)fa("");z();F.disabled=true;if(F.value!=g.value){x.value=B;F.disabled=false}else if(K>=3||G>=10){x.value="o"}return true}function Z(){if(K>=3)return false;if(V!=n){var a=ba(n),b=ma[n];if(b){Y(null,n,b[0],b[1])}else{G++;if(ha){var c=t("script");c.setAttribute("type",
"text/javascript");c.setAttribute("charset","utf-8");c.setAttribute("id","jsonpACScriptTag");c.setAttribute("src","http://suggestqueries.google.com"+X+"&json=t&jsonp=window.google.ac.jsonRPCDone&q="+a);var d=p.getElementById("jsonpACScriptTag"),f=p.getElementsByTagName("head")[0];if(d){f.removeChild(d)}o(f,c)}else if(P){fa(a);l.frames.completionFrame.document.location.reload(true)}else{Ma(a)}}ca()}V=n;var e=100;for(var h=1;h<=(G-2)/2;++h){e*=2}e+=50;M=l.setTimeout(Z,e);return true}function ba(a){if(l.encodeURIComponent)return encodeURIComponent(a);
return escape(a)}function N(a){g.value=a;D=a}function ca(){g.focus()}function pa(a,b){var c=0;while(a){c+=a[b];a=a.offsetParent}return c}function fa(a){p.cookie="qu="+a+"; path=/complete/search"}function w(a,b){a.className=b}function aa(a,b){a.appendChild(p.createTextNode(Wu(b)))}function La(a,b,c){while(a.rows.length>0)a.deleteRow(-1);var p=R.search_type.value=="artist";for(var d=0;d<b.length;++d){if(p&&((b[d]!=b[0]&&b[d].indexOf(b[0])==0)||(Ls==Jc&&b[d].indexOf(Ls)==0)))continue;var f=a.insertRow(-1);f.onmousedown=Ha;f.onmouseover=ta;f.onmousemove=Ia;f.completeString=b[d];w(f,j+"a");var e=t("td");aa(e,b[d]);w(e,j+"c");
if(L&&ya.test(b[d]))e.style.paddingTop="2px";o(f,e);var h=t("td");if(d==0)aa(h,su);w(h,j+"d");o(f,h)}if(Q&&a.rows.length>0){var k=a.insertRow(-1);k.onmousedown=function(E){if(E&&E.stopPropagation){E.stopPropagation();ga();g.focus()}else{I=true}return false};var i=t("td");i.colSpan=2;w(k,j+"e");var q=t("span");o(k,i);o(i,q);aa(q,Q);q.onclick=function(){z();J="";l.clearTimeout(M);M=null;x.value="x"}}}function qa(){var a=null;try{a=new ActiveXObject("Msxml2.XMLHTTP")}catch(b){try{a=new ActiveXObject("Microsoft.XMLHTTP")}catch(c){a=
null}}if(!a&&typeof XMLHttpRequest!="undefined")a=new XMLHttpRequest;return a}function Ma(a){if(m&&m.readyState!=0&&m.readyState!=4){m.abort()}if(m)m.onreadystatechange=Ea;m=qa();if(m){m.open("GET",X+"&js=true&q="+a,true);m.onreadystatechange=function(){if(m.readyState==4&&m.responseText){switch(m.status){case 403:K=1000;break;case 302:case 500:case 502:case 503:K++;break;case 200:var b=m.responseText;if(b.charAt(0)!="<"&&(b.indexOf("sendRPCDone")!=-1||b.indexOf("Suggest_apply")!=-1||b.indexOf("Suggest_close")!=-1)){eval(b)}else{G--}default:K=
0}}};m.send(null)}}function Ea(){}function Ka(){var a=g.value;if(a!=D)ea(0);D=a}function Aa(){I=true;g.blur();l.setTimeout(ca,10)}l.google.ac={install:Ca,Suggest_apply:za,Suggest_close:z,sendRPCDone:Y,jsonRPCDone:Da,setFieldValue:N};
})();
/* ##################################################################
//! END CODE from "YouTube.com"                                      !//
//! Copyright (c) 2008 Google Inc. All Rights Reserved.              !//
//! #################################################################
//! The following section of this file code was mainly adapted from: !//
//! "Paj's Home"                                                     !//
//! Copyright (c) 1999-2002 Paul Johnston. All Rights Reserved.      !//
//! Some minor changes and additions have been made to suit the      !//
//! current application requirements and to enhance functionality.   !//
   ################################################################## */
var chrsz=8;function md5(s){return binl2hex(core_md5(str2binl(s),s.length*chrsz))}function core_md5(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=md5_ff(a,b,c,d,x[i+0],7,-680876936);d=md5_ff(d,a,b,c,x[i+1],12,-389564586);c=md5_ff(c,d,a,b,x[i+2],17,606105819);b=md5_ff(b,c,d,a,x[i+3],22,-1044525330);a=md5_ff(a,b,c,d,x[i+4],7,-176418897);d=md5_ff(d,a,b,c,x[i+5],12,1200080426);c=md5_ff(c,d,a,b,x[i+6],17,-1473231341);b=md5_ff(b,c,d,a,x[i+7],22,-45705983);a=md5_ff(a,b,c,d,x[i+8],7,1770035416);d=md5_ff(d,a,b,c,x[i+9],12,-1958414417);c=md5_ff(c,d,a,b,x[i+10],17,-42063);b=md5_ff(b,c,d,a,x[i+11],22,-1990404162);a=md5_ff(a,b,c,d,x[i+12],7,1804603682);d=md5_ff(d,a,b,c,x[i+13],12,-40341101);c=md5_ff(c,d,a,b,x[i+14],17,-1502002290);b=md5_ff(b,c,d,a,x[i+15],22,1236535329);a=md5_gg(a,b,c,d,x[i+1],5,-165796510);d=md5_gg(d,a,b,c,x[i+6],9,-1069501632);c=md5_gg(c,d,a,b,x[i+11],14,643717713);b=md5_gg(b,c,d,a,x[i+0],20,-373897302);a=md5_gg(a,b,c,d,x[i+5],5,-701558691);d=md5_gg(d,a,b,c,x[i+10],9,38016083);c=md5_gg(c,d,a,b,x[i+15],14,-660478335);b=md5_gg(b,c,d,a,x[i+4],20,-405537848);a=md5_gg(a,b,c,d,x[i+9],5,568446438);d=md5_gg(d,a,b,c,x[i+14],9,-1019803690);c=md5_gg(c,d,a,b,x[i+3],14,-187363961);b=md5_gg(b,c,d,a,x[i+8],20,1163531501);a=md5_gg(a,b,c,d,x[i+13],5,-1444681467);d=md5_gg(d,a,b,c,x[i+2],9,-51403784);c=md5_gg(c,d,a,b,x[i+7],14,1735328473);b=md5_gg(b,c,d,a,x[i+12],20,-1926607734);a=md5_hh(a,b,c,d,x[i+5],4,-378558);d=md5_hh(d,a,b,c,x[i+8],11,-2022574463);c=md5_hh(c,d,a,b,x[i+11],16,1839030562);b=md5_hh(b,c,d,a,x[i+14],23,-35309556);a=md5_hh(a,b,c,d,x[i+1],4,-1530992060);d=md5_hh(d,a,b,c,x[i+4],11,1272893353);c=md5_hh(c,d,a,b,x[i+7],16,-155497632);b=md5_hh(b,c,d,a,x[i+10],23,-1094730640);a=md5_hh(a,b,c,d,x[i+13],4,681279174);d=md5_hh(d,a,b,c,x[i+0],11,-358537222);c=md5_hh(c,d,a,b,x[i+3],16,-722521979);b=md5_hh(b,c,d,a,x[i+6],23,76029189);a=md5_hh(a,b,c,d,x[i+9],4,-640364487);d=md5_hh(d,a,b,c,x[i+12],11,-421815835);c=md5_hh(c,d,a,b,x[i+15],16,530742520);b=md5_hh(b,c,d,a,x[i+2],23,-995338651);a=md5_ii(a,b,c,d,x[i+0],6,-198630844);d=md5_ii(d,a,b,c,x[i+7],10,1126891415);c=md5_ii(c,d,a,b,x[i+14],15,-1416354905);b=md5_ii(b,c,d,a,x[i+5],21,-57434055);a=md5_ii(a,b,c,d,x[i+12],6,1700485571);d=md5_ii(d,a,b,c,x[i+3],10,-1894986606);c=md5_ii(c,d,a,b,x[i+10],15,-1051523);b=md5_ii(b,c,d,a,x[i+1],21,-2054922799);a=md5_ii(a,b,c,d,x[i+8],6,1873313359);d=md5_ii(d,a,b,c,x[i+15],10,-30611744);c=md5_ii(c,d,a,b,x[i+6],15,-1560198380);b=md5_ii(b,c,d,a,x[i+13],21,1309151649);a=md5_ii(a,b,c,d,x[i+4],6,-145523070);d=md5_ii(d,a,b,c,x[i+11],10,-1120210379);c=md5_ii(c,d,a,b,x[i+2],15,718787259);b=md5_ii(b,c,d,a,x[i+9],21,-343485551);a=safe_add(a,olda);b=safe_add(b,oldb);c=safe_add(c,oldc);d=safe_add(d,oldd)}return Array(a,b,c,d)}function md5_cmn(q,a,b,x,s,t){return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b)}function md5_ff(a,b,c,d,x,s,t){return md5_cmn((b&c)|((~b)&d),a,b,x,s,t)}function md5_gg(a,b,c,d,x,s,t){return md5_cmn((b&d)|(c&(~d)),a,b,x,s,t)}function md5_hh(a,b,c,d,x,s,t){return md5_cmn(b^c^d,a,b,x,s,t)}function md5_ii(a,b,c,d,x,s,t){return md5_cmn(c^(b|(~d)),a,b,x,s,t)}function safe_add(x,y){var lsw=(x&0xFFFF)+(y&0xFFFF);var msw=(x>>16)+(y>>16)+(lsw>>16);return(msw<<16)|(lsw&0xFFFF)}function bit_rol(num,cnt){return(num<<cnt)|(num>>>(32-cnt))}function str2binl(str){var bin=Array();var mask=(1<<chrsz)-1;for(var i=0;i<str.length*chrsz;i+=chrsz)bin[i>>5]|=(str.charCodeAt(i/chrsz)&mask)<<(i%32);return bin}function binl2hex(binarray){var hex_tab="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}
/* ##################################################################
//! END CODE from "Paj's Home"                                       !//
//! Copyright (c) 1999-2002 Paul Johnston. All Rights Reserved.      !//
//! #################################################################
//! The following section of this file code was mainly adapted from: !//
//! "Deconcept SWFObject"                                            !//
//! Copyright (c) 2007 Geoff Stearns. All Rights Reserved.           !//
//! Some minor changes and additions have been made to suit the      !//
//! current application requirements and to enhance functionality.   !//
   ################################################################## */
if(typeof dc=="undefined"){var dc={};}if(typeof dc.util=="undefined"){dc.util={};}if(typeof dc.SWFObjectUtil=="undefined"){dc.SWFObjectUtil={};}dc.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=dc.util.getRequestParameter(this.DETECT_KEY);this.params={};this.variables={};this.attributes=[];if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new dc.PlayerVersion(_5.toString().split(".")));}this.installedVer=dc.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){if(!dc.unloadSet){dc.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",dc.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",dc.SWFObjectUtil.prepUnload);dc.unloadSet=true;}}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};dc.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10]||"";},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15]||"";},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=[];var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+(this.getAttribute("style")||"")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+(this.getAttribute("style")||"")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new dc.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};dc.SWFObjectUtil.getPlayerVersion=function(){var _23=new dc.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new dc.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new dc.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new dc.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new dc.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};dc.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};dc.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};dc.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};dc.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}
/* ##################################################################
//! END CODE from "Deconcept SWFObject"                              !//
//! Copyright (c) 2007 Geoff Stearns. All Rights Reserved.           !//
//! #################################################################
//! The following section of this file code was mainly adapted from: !//
//! "WebToolkit Javascript UTF-8"                                    !//
//! Copyright (c) 2008 WebToolkit. All Rights Reserved.              !//
//! Some minor changes and additions have been made to suit the      !//
//! current application requirements and to enhance functionality.   !//
   ################################################################## */
var UTF8={encode:function(string){string=string.replace(/\r\n/g,"\n");var utftext="";for(var n=0;n<string.length;n++){var c=string.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c)}else if((c>127)&&(c<2048)){utftext+=String.fromCharCode((c>>6)|192);utftext+=String.fromCharCode((c&63)|128)}else{utftext+=String.fromCharCode((c>>12)|224);utftext+=String.fromCharCode(((c>>6)&63)|128);utftext+=String.fromCharCode((c&63)|128)}}return utftext},decode:function(utftext){var string="";var i=0;var c=c1=c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){string+=String.fromCharCode(c);i++}else if((c>191)&&(c<224)){c2=utftext.charCodeAt(i+1);string+=String.fromCharCode(((c&31)<<6)|(c2&63));i+=2}else{c2=utftext.charCodeAt(i+1);c3=utftext.charCodeAt(i+2);string+=String.fromCharCode(((c&15)<<12)|((c2&63)<<6)|(c3&63));i+=3}}return string}}
/* ##################################################################
//! END CODE derived from "WebToolkit Javascript UTF-8"              !//
//! Copyright (c) 2008 WebToolkit. All Rights Reserved.              !//
//! #################################################################
//! Except where indicated, all the code that follows is             !//
//! Copyright (c) 2008-2009 YouScrobble.com, and its Affiliates.     !//
//! All Rights Reserved.                                             !//
//! Not to be reused without permission.                             !//
//! Date: 2009/01/07 19:26:25                                        !//
   ################################################################## */

function get_preview() {
  var e_badge; var e_player = element("preview-player"); if(!e_player) { return; }
       if(e_player.playing.length==0) { fillBadgeBuffer(); }
  else if(e_player.playing!="c" && isBadge("c")) { e_badge = getBadge(e_player.playing); }
       if(!e_badge&&quicklist.length>0) { e_badge = getBadge(0); }
  else if(!e_badge||!(getBadgeInfo(e_badge).type in oc(["album","playlist"]))) { e_badge = getBadge("c"); }
  if(!e_badge||((getBadgeInfo(e_badge).type in oc(["track","video"]))&&e_player.playing.length!=0)) {
    var a_random = random_array(1,50,10); a_random[10] = 1;
    for(var i_random in a_random) {
      e_badge = getBadge(a_random[i_random]);
      if(e_badge) { break; }
    }
  } return e_badge;
}
function play_preview(badge) {
  if(!badge) { badge = get_preview(); } toggle_preview();
  if(badge) {
    badge = getBadgeLink(badge);
    if(!badge.onclick) {
        alert("Whoops! Preview could not be played for some strange reason.");
        return false;
    } badge.onclick();
  }
}
function toggle_preview(id,type,title,value) {
  var e_player = element("preview-player"); if(!e_player) { return; } player.video.setVisible(false); e_player.innerHTML = "";
  var c_previous = new String()+e_player.playing; e_player.playing = new String(); var e_previous = getBadge(c_previous,false,false,true);
  abortPreview(); if(checkPlayer()){player.setPlaying();} if(typeof quicklist_stop!="undefined") { quicklist_stop(); }
  if(e_previous) {
    if(getBadgeStatus(e_previous) != "listen") {
      setBadgeStatus(e_previous,"listen");
      if(c_previous == id) { return; }
    }
  } e_previous = null;
  if(!type || !title) { return; }
  if(!(id<=0)&&!compare(getBadgeInfo(elements["badge-preview:"+id]),{type:type,title:title,value:value})) { fillBadgeBuffer(); }
  var e_badge = getBadge(id); if(!e_badge) { return; }
  if(getBadgeStatus(e_badge) == "listen"||!checkBadge(e_badge)) {
    setBadgeStatus(e_badge,"buffer");
    e_player.playing = id; if(!getPreview(type,title,value)) {
      if(confirm("Whoops! Preview could not be played.\n\nAdobe Flash Player is not installed or not up to date.\n\nDo you want to download the newest version of Adobe Flash Player now?")) {
        document.location.href = "http://www.adobe.com/go/getflashplayer/";
      } toggle_preview();
    }
  } if(typeof quicklist_toggle!= "undefined") { if(id<=0) { quicklist_toggle(id*-1); } }
}
function badge_preview(index,type,title,value,dom) {
  var badge = $ce("img",{cl:"badge badge-listen",src:"/images/pixel.gif",alt:"Listen",title:"Listen to this entry",border:"0"});
  badge.setAttribute("onclick","toggle_preview('"+index+"','"+type+"','"+addslashes(title)+"','"+addslashes(value)+"'); return false");
  if(!dom) { return $ce("div",null,$ce("span",{id:"badge-preview:"+index},badge)).innerHTML; }
  else { return $ce("span",{id:"badge-preview:"+index},badge); }  
}
function badge_button_preview(index,type,title,value,dom) {
  var badge = $ce("a",{cl:"soft-button",href:"#"},$ce("span",{},"Listen"));
  badge.setAttribute("onclick","toggle_preview('"+index+"','"+type+"','"+addslashes(title)+"','"+addslashes(value)+"'); return false");
  if(!dom) { return $ce("div",null,$ce("div",{id:"badge-preview:"+index},badge)).innerHTML; }
  else { return $ce("div",{id:"badge-preview:"+index}); }
}
function badge_box(index,type,title,value,no_download) {
  var badges = []; var badge;
    badge = $ce("img",{cl:"badge badge-listen",src:"/images/pixel.gif",alt:"Listen",title:"Listen to this entry",border:"0"});
    badge.setAttribute("onclick","toggle_preview('"+index+"','"+type+"','"+addslashes(title)+"','"+addslashes(value)+"'); return false");
    badges.push(badge);
  if(!no_download) {
    badge = $ce("img",{cl:"badge badge-download",src:"/images/pixel.gif",alt:"Download",title:"Download music file",border:"0"});
    badge.setAttribute("onclick","add_search('"+type+"','"+addslashes(title)+"','"+addslashes(value)+"'); return false");
    badges.push(badge);
  } badge = $ce("img",{cl:"badge badge-quicklist",src:"/images/pixel.gif",alt:"Quicklist",title:"Add to quicklist",border:"0"});
    badge.setAttribute("onclick","quicklist_add('"+type+"','"+addslashes(title)+"','"+addslashes(value)+"'); return false");
    badges.push(badge);  
  return $ce("div",{},$ce("div",{id:"badge-preview:"+index,cl:"badges-thumb-box"},badges)).innerHTML;
}

function preview_progress(time,length) {
  if(!checkPlayer()) { return; }
  player.setProgress(time,length);
}
function preview_finished(error) {
  if(typeof quicklist_playing != "undefined" && quicklist_playing != -1) { quicklist_next(); }
  else {
    if(!error) {
      switch(getRepeat()) {
      case 1: processPreview(); return;
      case 2: play_preview(); return; }
    } toggle_preview();
  }
}

function remove_preview() {
  var e_player = element("preview-player"); if(!e_player) { return; }
  var e_previous = getBadge(e_player.playing); if(!e_previous) { return; }
  var e_badges = e_previous.parentNode;
  if(hasClass(e_badges,"badges-thumb-box")) { e_badges.parentNode.removeChild(e_badges); }
}

function getBadge(badge,no_from_buffer,no_to_buffer,check) {
  if(typeof badge=="number") { badge=badge.toString(); }
  if(typeof badge=="string") {
    if(badge.length<14) { badge="badge-preview:"+badge; }
    if(!no_from_buffer) {
      var badge_id = /:([a-z]|-{0,1}[0-9]+)$/.exec(badge); if(badge_id==null) { return null; }
      if(badge_id[1]<=0) { badge=element(badge,true,no_to_buffer); } //quicklist entry
      else { badge=elements[badge]; }
    } else { badge=element(badge,no_from_buffer,no_to_buffer); }
    if(check&&!no_from_buffer&&!checkBadge(badge)) { badge = null; }
  } else { badge = null; }
  return badge;
}
function checkBadge(badge) {
  return badge&&(badge==element(badge.id,true,true));
}
function isBadge(badge) {
  badge = getBadge(badge);
  return badge&&getBadgeLink(badge).onclick?true:false;
}
function isBadgeType(badge,type) { return getBadgeInfo(badge).type===type; }
function getBadgeInfo(badge) {
  var match,attr; if(!badge) { return false; }
  if((match = /onclick=('|")(.{0,}?[^\\])\1/.exec(badge.innerHTML))!=null) { attr = match[2]; } //extract from html, easier utf-8 handling
  if(!attr) { badge = getBadgeLink(badge); if(!badge) { return false; } attr = badge.onclick.toString(); } //use toString method if not possible
  match = attr.match(/('|").{0,}?[^\\]\1/g); while(match.length>3) { match.shift(); }
  var extract = function(s) { return html_entities_decode(stripslashes(s.substring(1,s.length-1))); }
  return (match!=null?{type:extract(match[0]),title:extract(match[1]),value:extract(match[2])}:false);
}
function getBadgeStatus(badge) {
  badge = getBadgeLink(badge); if(!badge) { return false; }
  switch(badge.tagName) {
  case "IMG": return badge.className.split("-",2)[1].toLowerCase();
  case "A":   return getTextNode(badge).data.toLowerCase();
  } return false;
}
function setBadgeStatus(badge,status) {
  badge = getBadgeLink(badge); if(!badge) { return false; }
  switch(badge.tagName) {
  case "IMG": badge.className = "badge badge-"+status.toLowerCase(); break;
  case "A":   getTextNode(badge).parentNode.innerHTML = toWordCase(status); break;
  } return false;
}
function fillBadgeBuffer() { //buffered:#>0,a-z; unbuffered:#<=0
  for(var i_badge=1;getBadge(i_badge,true)||i_badge<50;i_badge++);
  for(var i_badge=97;i_badge<123;i_badge++) getBadge(String.fromCharCode(i_badge),true);
}

function getBadgeLink(badge) {
  if(!badge||!badge.childNodes) { return false; } if(badge.onclick) { return badge; }
  for(var i=0;i<badge.childNodes.length;i++) {
    if(badge.childNodes[i].onclick) { return badge.childNodes[i]; }
    else {
      var e_badge = getBadgeLink(badge.childNodes[i]);
      if(e_badge.onclick) { return e_badge; }
    }
  } return false;
}

function getTextNode(node) {
  if(node.nodeType==3) return node;
  for(var i=0;i<node.childNodes.length;i++) {
    var e_node = getTextNode(node.childNodes[i]);
    if(e_node) { return e_node; }
  } return false;
}

function stopEvent(event) {
  if (event.preventDefault) {
    event.preventDefault();
    event.stopPropagation();
  } else {
    event.returnValue=false;
    event.cancelBubble=true;
  }
}

function getOffsetLeft(element) {
  var i_offset=0; var e_parent = element;
  while(e_parent) {
    i_offset+=e_parent.offsetLeft;
    e_parent=e_parent.offsetParent;
  }     if(window.pageXOffset) { i_offset -= window.pageXOffset; }
  else if(document.body.scrollLeft) { i_offset -= document.body.scrollLeft; }
  else if(document.documentElement.scrollLeft) { i_offset -= document.documentElement.scrollLeft; }
  return i_offset;
}

function toggleMore(type,link) {
  var e_more = element(type+"-more",true);
  if(!e_more) { return; } var show = hasClass(e_more,"hide");
  (!show?addClass:removeClass)(e_more,"hide");
  link.innerHTML = link.innerHTML.replace(show?/more/:/less/,show?"less":"more");
  for(var i=2;;i++) {
    e_more = element(type+"-more-"+i,true);
    if(e_more) { (!show?addClass:removeClass)(e_more,"hide"); }
    else { return; }
  }
}

function isPopup() {
  if(!self.opener||self.opener.closed||self.opener==self) { return false; }
  try {
    if(eval("self.opener.location.href")) { return true; }
  } catch(e) {}
  return false;
}
function checkPopup(check,check_attr) {
  switch(arguments.length) {
  case 0: return isPopup() && typeof self.opener.checkPlayer   !="undefined" && self.opener.checkPlayer();
  case 1: return isPopup() && typeof check                     !="undefined" && check;
  case 2: return checkPopup(check) && typeof check[check_attr] !="undefined" && typeof check[check_attr];
  } return false;
}
function linkPopup(link) {
  if(typeof link!="string") { link = link.href; }
  if(link&&isPopup()) { self.opener.location.href = link; return false; }
  return true;
}

function random(min,max) {
  if( min > max  ) { return(-1 ); }
  if( min == max ) { return(min); }
  return(min+parseInt(Math.random()*(max-min+1)));
}
function random_array(min,max,length) {
  var arr = new Array();
  while(length-->=0) arr[length] = random(min,max);
  return arr;
}

function encode_u(uri) { return (encodeURI||escape)(uri); }
function encode_uc(uri_component) { return (encodeURIComponent||escape)(uri_component); }

function isAdmin() { return ((md5(getCookie("admin",new String())) == "6df21ca9e6be3491da496752d1b42997")); }
function isTester() { return ((md5(getCookie("tester",new String())) == "1c0b5552c18cd566a0c072cae8356c09"))||isAdmin(); }

(new Image()).src = "http://www.youscrobble.com/images/badge_buffer.gif";
(new Image()).src = "http://www.youscrobble.com/images/badge_buffer_box.gif";

function imageError(image) {
  if(image.className.match(/(^| )music-image-\d{2,3}( |$)/)) {
    image.src = "http://cdn.last.fm/depth/catalogue/noimage/cover_large.gif";
  } else { image.style.display = "none"; }
}

function disableButton(btn,clear_onclick){
  if(typeof btn=="string") { btn=element(btn,true); }
  if(btn){
    btn.disabled=true;
    if(clear_onclick){ btn.onclick=null;  }
  }
}
function openPopup(url,name,height,width,show_scrollbars){
  var popup=window.open(url,name,'height='+height+',width='+width+(show_scrollbars?",scrollbars=1":""));
  if(popup&&!popup.opener){popup.opener=window;}
  if(window.focus){popup.focus();}
  return false;
}
function openSharePopup(link) { return openPopup(link.href,'YouScrobble',650,1024,true); }

var _pt=false;
function track(category,action,label) {
  if(!_pt&&typeof _gat=="object"&&typeof _gat._getTracker=="function") { _pt = _gat._getTracker("UA-592060-5"); }
  if(_pt&&typeof _pt=="object") {
         if(!action&&typeof _pt._trackPageview=="function") { _pt._trackPageview(category); }
    else if( action&&typeof _pt._trackEvent   =="function") { _pt._trackEvent   (category,action,label); }
  }
}

function marquee(el,width) {
  el.title = text = getTextNode(el).data; if(!el.marquee) {
    window.setInterval(function() {
      var tn = getTextNode(el); if(!tn) { return; }
      var tn_d; if(width&&el.offsetWidth<width) { tn_d = el.title; }
      else { el.marquee = el.marquee.substring(1)+el.marquee.substring(0,1); tn_d = el.marquee; }
      tn.parentNode.replaceChild($ctn(tn_d.replace(/^ /,"\xA0")),tn);
     },250);
  } el.marquee = el.title+" / ";
}

function toggle_detail(el,force) {
  var item = findAncestorByClass(el,"item"); var expanded = (arguments.length<2)?hasClass(item,"expanded"):!force;
  (expanded?removeClass:addClass)(item,"expanded");
  (expanded?hide:show)(getElementsByTagNameAndClass("div","item-details",item));
  if(typeof toggle_detail_data=="function") { toggle_detail_data(el,expanded); }
}

function Player() {
  this.handler = function() { return false; };
  
  this.player = element("preview-player",true);
  if(!this.player.playing) { this.player.playing = new String(); }
  this.playing = new Object(); this.playing_next = new Object();
  
  this.player_frame = element("player-frame",true);
  this.player_popup = element("player-popup",true);
  
  this.player_button = new Object();
  this.player_button.play     = element("player-button"       ,true);
  this.player_button.forward  = element("player-button-small" ,true);
  this.player_button.repeat   = element("player-button-tiny-1",true);
  this.player_button.settings = element("player-button-tiny-2",true);
  
  this.player_badge = new Array();
  this.player_badge[0] = element("player-badge-1",true);
  this.player_badge[1] = element("player-badge-2",true);
  this.player_badge[2] = element("player-badge-3",true);
  this.player_badge[3] = element("player-badge-4",true);
  
  this.player_playing = new Array();
  this.player_playing[0] = element("player-playing-1",true); //value
  this.player_playing[1] = element("player-playing-2",true); //title
  this.player_playing[2] = element("player-playing-3",true); //next
  
  this.player_time = new Array();
  this.player_time[0] = element("player-time-1",true);
  this.player_time[1] = element("player-time-2",true);
  
  this.player_progress = element("player-progress",true);
  this.player_progress_length = (this.player_frame.clientWidth==300)?68:46;
  
  this.player_slider = element("player-slider",true);
  this.player_slider_active = false;
  this.player_slide_length = 60;
  this.player_slide_border = 8;
  
  this.player_repeat_none = 0;
  this.player_repeat_single = 1;
  this.player_repeat_all = 2;
  
  this.video = function(player) {
    this.player = player;
    this.player_video_enabled = hasClass(this.player,"preview-video");
    this.setVisible = function(visible) {
      var e_player = element("preview-player"); if(!e_player) return false;
      if(!this.player_video_enabled) return false;
      (visible?addClass:removeClass)(e_player,"preview-border");
      (visible?removeClass:addClass)($("player-toolbar"),"hide");
      if(!visible) this.setSize(false);
    }
    this.toggleSize = function() { this.setSize(!hasClass($('browse-content'),"wide-view")); }
    this.setSize = function(wide) {
      (wide?addClass:removeClass)($('browse-content'),"wide-view");
      var e_player = element("preview-player"); if(!e_player) { return; }
      var o_swf = element("preview-player:"+e_player.playing,true); if(!o_swf) { return; }
      if(!this.player_video_enabled) o_swf.width = o_swf.height = 1;
      else {
        o_swf.width = (!wide?194:759)+"px";
        o_swf.height = (!wide?145:427)+"px"; //4:3 / 16:9
      }
    }
  }; this.video = new this.video(this.player);
    
  this.getClass = function(type,action,disabled) {
    return "player-"+type+"-"+action+(disabled?"-disabled":"");
  };
  this.setEnabled = function(el,enabled) {
    if(!el) return; el.className = el.className.replace(/-disabled/,new String());
    if(!enabled) { el.className += "-disabled"; }
  };
  this.setVisible = function(el,visible) {
    if(!el) return; el.style.display = visible?"block":"none";
  }
  
  this.convertNumber = function(num) {
    num = num.toString();
    while(num.length<2) { num='0'+num; }
    return num;
  };
  
  this.convertTime = function(sec) {
    var min = Math.floor(sec/60);
    var time = this.convertNumber(min)+":"+this.convertNumber(Math.floor(sec-min*60));
    return time;
  };
  
  this.setProgress = function(attr1,attr2,update) {
    if(!attr2) { //Percent
      if(!attr1 || attr1<0) { attr1=0; }
      else if(attr1>1) {  attr1=1; }
      this.player_progress.style.width = Math.ceil(this.player_progress_length * attr1)+"px";
      if(!update) { return; }
      var e_player = element("preview-player"); if(!e_player) { return; }
      var o_swf = element("preview-player:"+e_player.playing,true); if(!o_swf) { return; }
           if(typeof o_swf.seekTo      !="undefined" &&
              typeof o_swf.getDuration !="undefined" ) o_swf.seekTo(attr1*o_swf.getDuration(),true);
      else if(typeof o_swf.setProgress != "undefined") o_swf.setProgress(attr1*100);
      else if(typeof o_swf.SetVariable != "undefined") o_swf.SetVariable("set_progress",attr1*100);
    } else { //Time
      if(!this.isPlaying()) { return; }
      this.player_time[0].innerHTML = this.convertTime(attr1); this.playing.position = attr1;
      this.player_time[1].innerHTML = this.convertTime(attr2); this.playing.duration = attr2;
      this.setProgress(attr1/attr2,undefined,update);
    }
  };
  
  this.setPlaying = function(text,playing) {
    this.player_button.play.className = this.getClass("button","play");
    this.setEnabled(this.player_button.forward ,false);
    this.setEnabled(this.player_button.settings,false);
    for(var i_badge in this.player_badge) { this.setEnabled(this.player_badge[i_badge],false); }
    for(var i_playing in this.player_playing) { this.player_playing[i_playing].innerHTML = new String(); }
    for(var i_time in this.player_time) { this.player_time[i_time].innerHTML = "00:00"; }
    this.setProgress(0); this.playing = new Object(); var badge = getBadge(this.player.playing);
         if(typeof text!="string") { this.playing_next = {}; return; }
    else if(text.match(/.* - .*/)) {
      var playing = text.split(/ - /,2); this.playing = {type:"track",title:playing[1],value:playing[0]}; //Could be also a "video" matching * - *
      this.player_playing[0].innerHTML = '<a class="player-link" onclick="return quicklist_link(this)" href="/browse/'+parameter_secure(playing[0])+'">'+playing[0]+'</a>';
      this.player_playing[1].innerHTML = '<a class="player-link" onclick="return quicklist_link(this)" href="/browse/'+parameter_secure(playing[0])+'/_/'+parameter_secure(playing[1])+'">'+playing[1]+'</a>';
      marquee(this.player_playing[0],105); marquee(this.player_playing[1],105);
    } else { this.player_playing[1].innerHTML = text; marquee(this.player_playing[1],105); this.playing = getBadgeInfo(badge); }
    this.playing.badge = badge; if(playing) {
      this.setEnabled(this.player_button.settings,true); this.defineNext();
      for(var i_badge in this.player_badge) { this.setEnabled(this.player_badge[i_badge],true); }
    } this.player_button.play.className = this.getClass("button","stop");
    this.setEnabled(this.player_button.forward,true);
    var left = this.player_slider.style.left; this.player_slider.style.left = 0; this.player_slider.style.left = left;
  };
  
  this.getPlaying = function() { return this.playing; }
  this.isPlaying = function() { return this.player.playing.length!=0; };
  
  this.setVolume = function(volume) {
    setCookie("volume",Math.round(volume*100),30);
    var e_player = element("preview-player"); if(!e_player) { return; }
    var o_swf = element("preview-player:"+e_player.playing,true); if(!o_swf) { return; }
         if(typeof o_swf.setVolume   != "undefined") o_swf.setVolume(volume*100);
    else if(typeof o_swf.SetVariable != "undefined") o_swf.SetVariable("set_volume",volume*100);
  };
  this.getVolume = function() { return parseInt(getCookie("volume",50))/100; };
  
  this.setFullscreen = function() {
    var e_player = element("preview-player"); if(!e_player) { return; }
    var o_swf = element("preview-player:"+e_player.playing,true); if(!o_swf) { return; }
    if(typeof o_swf.setFullscreen != "undefined") { o_swf.setFullscreen(); }
  }
  
  this.setRepeat = function(repeat) {
    setCookie("repeat",repeat,30); if(!this.player_button.repeat) { return; }
    this.player_button.repeat.className = "player-button-repeat";
    if(this.getRepeat()!=this.player_repeat_none) {
      this.player_button.repeat.className += "-active";
      if(this.getRepeat()==this.player_repeat_single) { this.player_button.repeat.className += "-single"; }
    }
  };
  this.getRepeat = function() { return parseInt(getCookie("repeat",this.player_repeat_all)); }
  
  this.defineNext = function() {
    this.playing_next = {}; if(this.isPlaying()) { var badge;
      if(quicklist_playing!=-1) { this.playing_next = getBadgeInfo(badge = getBadge(-1*(quicklist_playing+1))); }
      switch(this.getRepeat()) {
      case this.player_repeat_all:
        if(!badge) {
          if(quicklist_playing!=-1) { this.playing_next = getBadgeInfo(badge = getBadge(0)); }
          else { this.playing_next = getBadgeInfo(badge = get_preview()); }
        } break;
      case this.player_repeat_single: this.playing_next = this.playing; break; }
      this.playing_next.badge = badge;
    } this.player_playing[2].innerHTML = this.playing_next.value?this.playing_next.value:new String();
         if(this.playing_next.type in oc(["album","track","playlist"])) { this.player_playing[2].innerHTML += " - "+this.playing_next.title; }
    else if(this.playing_next.type == "video") { this.player_playing[2].innerHTML = this.playing_next.title; }
    marquee(this.player_playing[2],80);
  }
  
  this.drawSlider = function(percent) {
    if(!percent || percent<0) { percent=0; }
    else if(percent>1) { percent=1; } this.setVolume(percent);
    var x_pos = (this.player_frame.clientWidth-this.player_slide_length-this.player_slide_border)+((this.player_slide_length-this.player_slider.clientWidth)*percent);
    this.player_slider.style.left=x_pos+"px";
  };
  this.setSlider = function(clientX) {
    var percent = (clientX-getOffsetLeft(this.player_frame)-this.player_frame.clientWidth+this.player_slide_length+this.player_slide_border) / this.player_slide_length;
    if(!percent || percent<0) { percent=0; }
    else if(percent>1) { percent=1; }
    this.drawSlider(percent);
  };
  this.moveSlider = function(e) {
    if(!player) { return; }
    if(!e) e=window.event;
    if(player.player_slider_active) {
      player.setSlider(e.clientX);
      stopEvent(e);
    }
  };
  this.init = function() {
    this.setPlaying(); this.setRepeat(this.getRepeat());
    addEvent(this.player_frame,"mousedown",function(e) {
      if(!player) { return; }
      if(!e) { e=window.event; }
            if(e.target)     { el=e.target; }
      else if(e.srcElement) { el=e.srcElement; }
      else { return; }
      e.relativeX = e.offsetX; e.relativeY = e.offsetY;
      if(!e.relativeX) e.relativeX = e.layerX;
      if(!e.relativeY) e.relativeY = e.layerY;
      var el_p = el; while(el_p&&el_p!=player.player_frame) {
        e.relativeX += el_p.offsetLeft;
        e.relativeY += el_p.offsetTop;
        el_p = el_p.parentNode;
      }
      if(dc.SWFObjectUtil.getPlayerVersion().major>=9 && parseInt(player.player_progress.style.width) != 0 &&
         e.relativeX<player.player_progress.offsetLeft+player.player_progress_length      && e.relativeX>=player.player_progress.offsetLeft &&
         e.relativeY<player.player_progress.offsetTop+player.player_progress.offsetHeight && e.relativeY>=player.player_progress.offsetTop) {
        if(!player.isPlaying()) { return; }
        player.setProgress((e.relativeX-player.player_progress.offsetLeft) / player.player_progress_length,undefined,true);
        return;
      } else if(el.id.match(/.*slider.*/)) { el = el.parentNode; }
        else {
        if(!el.id.match(/.*frame.*/)) { el = el.parentNode; }
        if(el.id.match(/.*frame.*/)) {
          if(!(e.relativeX<el.clientWidth -7 && e.relativeX>=el.clientWidth -68 &&
               e.relativeY<el.clientHeight-6 && e.relativeY>=el.clientHeight-12)) {
            el=false;
          }
        } else { el=false; } if(! el) return;
      }
      player.setSlider(e.clientX); stopEvent(e);
      player.player_slider_active = true;
      addEvent(document,"mouseup",function(){ player.player_slider_active = false; });
    });  addEvent(document,"click",function(){ if(!player) { return; } player.setVisible(player.player_popup,false); });
            addEvent(document,"mousemove",this.moveSlider);
    this.handler = function(e) {
      if(!e) { e=window.event; }
            if(e.target)     { el=e.target; }
      else if(e.srcElement) { el=e.srcElement; }
      else if(e.blur)       { el=e; }
      else { return false; }
      el.blur(); this.setVisible(this.player_popup,false);
      var a_command = el.className.split(/(?!.* )-/);
      if(a_command[3]=="disabled") { return false; }
      switch(a_command[2]) {
      case "forward": if(quicklist_playing!=-1&&typeof quicklist_next!="undefined") { quicklist_next(); break; }
      case "play":
        if(this.isPlaying()&&this.getRepeat()==this.player_repeat_single) { processPreview(); return false; }
        play_preview(this.playing_next.badge); break; //getPreview();
      case "repeat":
        switch(this.getRepeat()) {
        case this.player_repeat_all:    this.setRepeat(this.player_repeat_single); break;
        case this.player_repeat_single: this.setRepeat(this.player_repeat_none  ); break;
        default:                        this.setRepeat(this.player_repeat_all   ); break;
        } this.defineNext(); break;
      case "stop": toggle_preview(); break;
      case "link": if(this.playing.type!="track") { alert("Whoops! You can only link tracks to videos!"); break; }
      case "share": getBrowse(get_link(this.playing.type,this.playing.title,this.playing.value)+"/+"+a_command[2]); track('player',a_command[2]); break;
      case "add": if(typeof quicklist_add=="undefined") { break; } quicklist_add(this.playing.type,this.playing.title,this.playing.value,null); break;
      case "download": if(typeof add_search=="undefined") { break; } add_search(this.playing.type,this.playing.title,this.playing.value); break;
      case "settings": this.setVisible(this.player_popup,true); if(e){e.cancelBubble=true;} break;
      case "next": this.defineNext(); break;
      } return false;
    }; this.drawSlider(this.getVolume());
  }; this.init();
}

function html_entities_encode(string) {
  var histogram = html_entities_get(), tmp_str = string.toString();
  for(var symbol in histogram) { tmp_str = tmp_str.split(symbol).join(histogram[symbol]); }
  return tmp_str;
  }
function html_entities_decode(string) {
  var histogram = html_entities_get(), tmp_str = string.toString();
  delete(histogram['&']); histogram['&'] = '&amp;';
  for(var symbol in histogram) { tmp_str = tmp_str.split(histogram[symbol]).join(symbol); }
  return tmp_str;
}
function html_entities_get() {
  var histogram={},decimal=0,symbol='',entities={'34':'&quot;','38':'&amp;','39':'&#039;','60':'&lt;','62':'&gt;','160':'&nbsp;','161':'&iexcl;','162':'&cent;','163':'&pound;','164':'&curren;','165':'&yen;','166':'&brvbar;','167':'&sect;','168':'&uml;','169':'&copy;','170':'&ordf;','171':'&laquo;','172':'&not;','173':'&shy;','174':'&reg;','175':'&macr;','176':'&deg;','177':'&plusmn;','178':'&sup2;','179':'&sup3;','180':'&acute;','181':'&micro;','182':'&para;','183':'&middot;','184':'&cedil;','185':'&sup1;','186':'&ordm;','187':'&raquo;','188':'&frac14;','189':'&frac12;','190':'&frac34;','191':'&iquest;','192':'&Agrave;','193':'&Aacute;','194':'&Acirc;','195':'&Atilde;','196':'&Auml;','197':'&Aring;','198':'&AElig;','199':'&Ccedil;','200':'&Egrave;','201':'&Eacute;','202':'&Ecirc;','203':'&Euml;','204':'&Igrave;','205':'&Iacute;','206':'&Icirc;','207':'&Iuml;','208':'&ETH;','209':'&Ntilde;','210':'&Ograve;','211':'&Oacute;','212':'&Ocirc;','213':'&Otilde;','214':'&Ouml;','215':'&times;','216':'&Oslash;','217':'&Ugrave;','218':'&Uacute;','219':'&Ucirc;','220':'&Uuml;','221':'&Yacute;','222':'&THORN;','223':'&szlig;','224':'&agrave;','225':'&aacute;','226':'&acirc;','227':'&atilde;','228':'&auml;','229':'&aring;','230':'&aelig;','231':'&ccedil;','232':'&egrave;','233':'&eacute;','234':'&ecirc;','235':'&euml;','236':'&igrave;','237':'&iacute;','238':'&icirc;','239':'&iuml;','240':'&eth;','241':'&ntilde;','242':'&ograve;','243':'&oacute;','244':'&ocirc;','245':'&otilde;','246':'&ouml;','247':'&divide;','248':'&oslash;','249':'&ugrave;','250':'&uacute;','251':'&ucirc;','252':'&uuml;','253':'&yacute;','254':'&thorn;','255':'&yuml;'};
  for(decimal in entities) { histogram[String.fromCharCode(decimal)]=entities[decimal]; }
  return histogram;
}

function Message(page_info,ref_obj) {
  Message.hide(); this.page = Page.create(page_info,false);
  this.holder = getElementsByTagNameAndClass("div","message-holder",ref_obj.container)[0];
  if(!this.holder) { return; } this.holder.appendChild(this.page.build());
  show(this.holder); Message.active = this;
  if(typeof this.holder.scrollIntoView == "function") { this.holder.scrollIntoView(true); }
  this.timeout = window.setTimeout("Message.hide()",5000);
} Message.active = null;
Message.create = function(page_info,ref_obj) { return new Message(page_info,ref_obj); }
Message.hide = function() { if(!Message.active) { return; } Message.active.hide(); }
Message.prototype.hide = function() {
  if(this.holder.hasChildNodes()) { this.holder.removeChild(this.page.container); }
  hide(this.holder); Message.active = null; window.clearTimeout(this.timeout);
}

function Dialog(page_info,transition_function,transition_arguments) {
  Dialog.dismiss(); this.page = Page.create(page_info,false);
  $("dialog-body").appendChild(this.page.build());
  show($("dialog")); Dialog.active = this;
  this.transition = {"function_reference":transition_function,"arguments":transition_arguments};
} Dialog.active = null;
Dialog.create = function(page_info,transition_function,transition_arguments) { return new Dialog(page_info,transition_function,transition_arguments); }
Dialog.dismiss = function() { if(!Dialog.active) { return; } Dialog.active.dismiss(); }
Dialog.prototype.dismiss = function() {
  try { $("dialog-body").removeChild(this.page.container); } catch(e) { $("dialog-body").innerHTML = new String(); }
  hide($("dialog")); Dialog.active = null;
}
Dialog.proceed = function() { if(!Dialog.active) { return; } Dialog.active.proceed(); }
Dialog.prototype.proceed = function() {
  this.dismiss(); if(!this.transition) { return; }
  page.check_dirty = false; this.transition.function_reference.apply(this,this.transition.arguments);
}
Dialog.save = function() { if(!Dialog.active) { return; } Dialog.active.save(); }
Dialog.prototype.save = function() { this.page.save(); }

function Page(page_info,ref_obj) {
  this.components = (page_info&&page_info.components)?page_info.components:[];
  this.container = null; if(arguments.length==0) return;
  this.type = page_info.type; this.title = page_info.title; this.ref_obj = ref_obj;
  if(ref_obj!==false) {
    if(!ref_obj) { Page.active = this; this.pages = []; this.field_values = {}; this.dirt_repellent = page_info.dirt_repellent; }
    else if(this.get_ref_obj().pages) { this.get_ref_obj().pages.push(this) } //check dialog
  }
} Page.types = {"HeadFoodPage":page_head_food,"TemplatePage":page_template,"RequestPage":page_request,"StaticPage":page_static,"ContainerPage":page_container,"SectionedPage":page_sectioned,"JsonPage":page_json_request}; Page.check_dirty = true; Page.active = null;
Page.create = function(page_info,ref_obj) { return new (Page.types[page_info.type]||Page)(page_info,ref_obj); }
Page.find = function(node,text) {
  if(node.nodeValue&&node.nodeValue.indexOf(text)!=-1) { return node; }
  var current=node.firstChild;
  while(current) { var temp; if(temp=Page.find(current,text)) return temp; current=current.nextSibling; }
}
Page.save = function() { if(!Page.active) { return false; } return Page.active.save(); }
Page.prototype.get_ref_obj = function() { if(this.ref_obj&&this.ref_obj) { return this.ref_obj.get_ref_obj(); } return this; }
Page.prototype.create = function() { this.container=$ce("div",{"cl":this.type.replace(/(?!^)([A-Z])/g,"-$1").toLowerCase()},this.components); this.clean(); return this.container; }
Page.prototype.build = function() { return this.create(); }
Page.prototype.remove_build = function() { if(!this.container) { return; } this.container.parentNode.removeChild(this.container); delete this.container; this.components = []; }
Page.prototype.update_build = function() {
  if(!this.container) { return; }
  var parent = this.container.parentNode; this.remove_build();
  parent.appendChild(this.build());
}
Page.prototype.is_dirty = function() {
  if(this!=this.get_ref_obj()) { return this.get_ref_obj().is_dirty(); }
  if(!Page.check_dirty||this.dirt_repellent) { Page.check_dirty = true; return false; }
  var fields = this.get_fields(); if(fields.length==0) { return false; }
  for(var i_field=0;i_field<fields.length;i_field++) {
    var field = fields[i_field]; if(!field||!field.name||field.name.length==0) { continue; }
         if((field.type in oc(["text","password","file"])
          || field.nodeName in oc(["TEXTAREA","SELECT"])) && field.value   != this.field_values[field.name]) { return true; }
    else if(field.type == "checkbox"                      && field.checked != this.field_values[field.name]) { return true; }
    else if(field.type == "radio"        && field.checked && field.value   != this.field_values[field.name]) { return true; }
  } return false;
}
Page.prototype.clean = function() {
  if(this.pages) { for(var i_page in this.pages) { this.pages[i_page].clean(); }}
  this.get_ref_obj().field_values = {};
  var fields = this.get_fields(); if(fields.length==0) { return false; }
  for(var i_field=0;i_field<fields.length;i_field++) {
    var field = fields[i_field]; if(!field||!field.name||field.name.length==0) { continue; }
         if(field.type in oc(["text","password","file"])
                     || field.nodeName in oc(["TEXTAREA","SELECT"])) { this.get_ref_obj().field_values[field.name] = field.value;   }
    else if(field.type == "checkbox"                               ) { this.get_ref_obj().field_values[field.name] = field.checked; }
    else if(field.type == "radio"    && field.checked              ) { this.get_ref_obj().field_values[field.name] = field.value;   }
  }
}
Page.prototype.get_fields = function(element) {
  if(!element) { if(!this.container) { return []; } return this.get_fields(this.container); }
  var elements = []; for(var i_child=0;i_child<element.childNodes.length;i_child++) {
    if(element.childNodes[i_child].nodeName in oc(["INPUT","TEXTAREA","SELECT"])) { elements.push(element.childNodes[i_child]); }
    else { elements = elements.concat(this.get_fields(element.childNodes[i_child])); }
  } return elements;
}
Page.prototype.get = function() {
  var fields = this.get_fields(); if(fields.length==0) { return false; }
  var pairs = []; for(var i_field=0;i_field<fields.length;i_field++) {
    var field = fields[i_field]; if(!field||!field.name||field.name.length==0) { continue; }
         if(field.type in oc(["text","password","hidden"])
         || field.nodeName in oc(["TEXTAREA","SELECT"]   )  
         || field.type == "radio" && field.checked       ) { pairs.push({"name":field.name,"value":field.value                     }); }
    else if(field.type == "checkbox"                     ) { pairs.push({"name":field.name,"value":field.checked?"true":"false"}); }
  } var encoded_pairs = []; for(var pair in pairs) { encoded_pairs.push([encode_uc(pairs[pair].name),encode_uc(pairs[pair].value)].join('=')); }
  return encoded_pairs.join('&');
}
Page.prototype.save = function() {
  request("http://www.youscrobble.com/account",{parameters:"async",body:this.get(),handler:this.saved,json:true},this);
  Message.create({type:"TemplatePage",clone:"status-template",content:{message:"Saving your changes..."}},this); return true;
}
Page.prototype.saved = function(result,success) {
  var page_info = false;
  if(!success&&result.indexOf("<!--MTN-->")!=-1) { page_info = {clone:"error-template",message:result+" Your account settings are temporarily unavailable."}; }
       if(result.confirm) { page_info = {clone:"success-template",message:result.confirm}; this.get_ref_obj().clean(); }
  else if(result.error  ) { page_info = {clone:"error-template"  ,message:result.error  }; }
  if(!page_info) { page_info = {clone:"error-template",message:"Sorry, an error occurred. Please reload the page and try again."}; }
  page_info = {type:"TemplatePage",clone:page_info.clone,content:{message:page_info.message}}
  Message.create(page_info,this);
}

function page_static(page_info,ref_obj) {
  if(arguments.length==0) { return; } Page.call(this,page_info,ref_obj);
  page_info.content&&(this._content=page_info.content);
} page_static.prototype = new Page();
page_static.prototype.build = function() {
  this.components.push($ce('div',null,this._content));
  return this.create();
}

function page_head_food(page_info,ref_obj) {
  if(arguments.length==0) { return; } Page.call(this,page_info,ref_obj);
  page_info.head&&(this._head=Page.create(page_info.head,this));
  page_info.body&&(this._body=Page.create(page_info.body,this));
  page_info.foot&&(this._foot=Page.create(page_info.foot,this));
} page_head_food.prototype = new Page();
page_head_food.prototype.build = function() {
  if(this._head){ this.components.push($ce('div',{cl:'head'},this._head.build())) };
  if(this._body){ this.components.push($ce('div',{cl:'body'},this._body.build())) };
  if(this._foot){ this.components.push($ce('div',{cl:'foot'},this._foot.build())) };
  return this.create();
}

function page_container(page_info,ref_obj) {
  if(arguments.length==0) { return; } Page.call(this,page_info,ref_obj);
  this._container = []; for(var i_container in page_info.container) {
    var container = page_info.container[i_container];
    if(container.type in Page.types) { container = Page.create(container,this); }
    this._container.push(container);
  }
} page_container.prototype = new Page();
page_container.prototype.build = function() {
  for(var i_container in this._container) {
    var container = this._container[i_container];
    if(container.type in Page.types) { this.components.push(container.build()); }
    else { this.components.push(container); }
  } return this.create();
}

function page_sectioned(page_info,ref_obj) {
  if(arguments.length==0) { return; } page_container.call(this,page_info,ref_obj);
} page_sectioned.prototype = new page_container();
page_sectioned.prototype.build = function() {
  for(var i_container in this._container) {
    var container = this._container[i_container];  var section,section_container;
    section = $ce("div",{cl:"section"+(i_container==this._container.length-1?" last":"")},[$ce("span",null,[$ctn(container.title?container.title:new String())]),(section_container=$ce("div"))]);
    if(container.type in Page.types) { section_container.appendChild(container.build()); }
    else { section_container.appendChild(container); }
    this.components.push(section);
  } return this.create();
}

function page_template(page_info,ref_obj){
  if(arguments.length==0) { return; } Page.call(this,page_info,ref_obj);
  page_info.clone&&(this._clone=$(page_info.clone).cloneNode(true));
  this._content = page_info.content;
} page_template.prototype = new Page();
page_template.prototype.build = function() {
  this.components.push(this._clone); this.create();
  for(var content in this._content) {
    var node=Page.find(this.container,'{'+content+'}');
    if(node) { node.parentNode.replaceChild($ctn(this._content[content].replace(/<!--.*-->/g,new String())),node); }
  } return this.container;
}

function page_request(page_info,ref_obj){
  if(arguments.length==0) { return; } Page.call(this,page_info,ref_obj);
  this._ready = 0; this._respone = null;
  this._parameters = page_info.parameters?page_info.parameters:new String();
  if(page_info.handover_parameters&&!page_request.handover) {
    if(this._parameters) { this._parameters+="&"; }
    this._parameters += page_info.handover_parameters;
    page_request.handover = true; //only use hand over variables once
  } if(this._parameters) { this._parameters+="&"; } this._parameters+="async";
  request(page_info.url,{parameters:this._parameters,handler:this._handle,json:this._json()},this);
} page_request.prototype = new Page();
page_request.prototype._json = function() { return false; }
page_request.prototype._build = function() { return Page.create({type:"StaticPage",content:this._response},this).build(); };
page_request.prototype._handle = function(response,success) {
  this._ready = success&&response?1:2;
  this._response = response;
  this.update_build();
}
page_request.prototype.build = function() {
  var page_info = false; switch(this._ready) {
  case 0: page_info = {type:"TemplatePage",clone:"centered-loading-template"}; break;
  case 2: page_info = {type:"TemplatePage",clone:"error-template",content:{message:"Whoops! We could not load the page!"}}; break;
  } this.components.push(page_info?Page.create(page_info,this).build():this._build());
  if(!this.scripts) {
    this.scripts = this.components[0].getElementsByTagName("script");
    for(var i_script=0;i_script<this.scripts.length;i_script++) { eval(this.scripts[i_script].innerHTML); }
  } return this.create();
}

function page_json_request(page_info,ref_obj){
  if(arguments.length==0) { return; } this._call = page_info._call;
  page_template.call(this,page_json_request,ref_obj);
  page_request.call(this,page_info,ref_obj);
} page_json_request.prototype = new page_request();
page_json_request.prototype._json = function() { return true; }
page_json_request.prototype._build = function() {
  this._clone.style.display = "block";
  this._call(this._clone);
  return this._clone;
};

function submit_picture() {
  var form = $("image-upload-form"); form.submit();
  hide(form); show($("image-upload-busy"));
  hide($("image-upload-message"));
}
function preview_picture(result,success) {
  hide($("image-upload-busy"));
  if(success) {
    var preview = $("image-upload-preview");
    preview.appendChild($ce("img",{src:result,height:88}));
    $("image-upload-url").value = result;  
    hide($("image-upload-busy")); show(preview);
  } else {
    var error = $("image-upload-message");
    show($("image-upload-form")); show(error);
    error.replaceChild($ctn(result),error.firstChild);
  }
}
function save_picture() {
  Dialog.save(); Dialog.dismiss();
  window.setTimeout(function(){tabs_activate(tabs_current.firstChild.name);},500);
}