var ActivitiesRoot="http://2.app.joost.com";
var joost_main_root="http://www.joost.com/";

function analyticsTrackEvent(name,repeat) {
  if (window.pageTracker) {
    try {
    window.pageTracker._trackPageview("/_event/"+name);
    } catch(err) {}
  } else {
    if (!repeat) {
      if (window.delayedTrackingEvents) {
        window.delayedTrackingEvents.push(name);
      } else {
        window.delayedTrackingEvents=[name];
      }
    }
  }
}

function analyticsTrackEvent2(category,action,optional_label,optional_value) {
  if (window.pageTracker) {
    try {
    window.pageTracker._trackEvent(category, action, optional_label, optional_value);
    } catch(err) {}
  } else {
    var o = {category:category,action:action,label:optional_label,
             value:optional_value};
    if (window.delayedTrackingEvents2) {
      window.delayedTrackingEvents2.push(o);
    } else {
      window.delayedTrackingEvents2=[o];
    }
  }
}

allowJSONRequests = true;
if (document.addEventListener) {
  var jsonScriptArray = [];
  if ((/gecko/i).test(navigator.userAgent) && !(/safari/i).test(navigator.userAgent)) {
    allowJSONRequests = false;
    document.addEventListener("DOMContentLoaded", appendJsonRequest, false);
    window.allowJSONtimer=setTimeout(appendJsonRequest,5000);
  }
};

function appendJsonRequest(){
  clearTimeout(window.allowJSONtimer);
  allowJSONRequests = true;
  var scriptHolder = document.createDocumentFragment();
  for(var i = 0; i <  jsonScriptArray.length;i++){
    scriptHolder.appendChild(jsonScriptArray[i]);
  }
  document.getElementsByTagName('head')[0].appendChild(scriptHolder);
};


var JoostlinkDelayedExecute=[];
var JoostlinkCodeLoading=false;
function loadJoostlinkCode(func) {
  if (func) {
    window.JoostlinkDelayedExecute.push(func);
  }
  if (!JoostlinkCodeLoading) {
    JoostlinkCodeLoading=true;
    jsonRequest("/joostlink.10.0.17.js");
  }
}

var FriendsDelayedExecute=[];
var FriendsCodeLoading=false;
function loadFriendsCode(func) {
  if (func) {
    window.FriendsDelayedExecute.push(func);
  }
  if (!FriendsCodeLoading) {
    FriendsCodeLoading=true;
    jsonRequest("/friends.10.0.17.js");
  }
}

var GroupsDelayedExecute=[];
var GroupsCodeLoading=false;
function loadGroupsCode(func) {
  if (func) {
    window.GroupsDelayedExecute.push(func);
  }
  if (!GroupsCodeLoading) {
    GroupsCodeLoading=true;
    jsonRequest("/groups.10.0.17.js");
  }
}

function jsonRequest(url) {
  var script = document.createElement("script");
  script.defer = "true";
  script.type = "text/javascript";
  script.src = url;
  if(document.addEventListener && allowJSONRequests == false){
    jsonScriptArray.push(script);
  } else {
    document.getElementsByTagName('head')[0].appendChild(script);
  }
}


(function(){

   var ifrCount = 0;
   function nextIfrName() {
     return "__post_ifr_" + ifrCount++;
   }

   function cleanupIframeAndCallback(name){
     var ifr = document.getElementById(name);
     if(ifr) ifr.parentNode.removeChild(ifr);
     try{ // ie hates it when you delete things off window
       window[name + "_callback"] = null;
       delete window[name + "_callback"];
     } catch(e){
       // ignore it
     }

   }

   function setupCallback(name, cbContext, callback) {
     var cbName = name + "_callback";
     window[name + "_callback"] = function() {
       try {
         callback.apply(cbContext || window, arguments);
       } finally {
         cleanupIframeAndCallback(name);
       }
     };
     return cbName;
   }

   function setHiddenInput(frm, name, value) {
     if(!frm.elements[name]){
       //HACK: workaround for IE not supporting setting the name
       //      attribute on an input element created using createElement
       var holder = document.createElement("div");
       holder.innerHTML = "<input type='hidden' name='" + name + "'>";
       frm.appendChild(holder.firstChild);
     }
     frm.elements[name].value = value;
   }

   window.jsonPost = function(/*String*/ url, /*Object*/ cbContext, /*Function*/ callback, /*HtmlForm*/ frm, /*Object*/ contents) {
     var isIE = false;
     /*@cc_on
     isIE = true;
      @*/
     var ifrName = nextIfrName();
     var ifrStr = isIE ? "<iframe id='" + ifrName + "' name='" + ifrName + "' src='/blank.html'>" : "iframe";
     var ifr = document.createElement(ifrStr);
     if(!isIE){
       ifr.id = ifr.name = nextIfrName();
       ifr.src = "/blank.html";
     }
     ifr.style.display = "none";
     frm.appendChild(ifr);
     frm.target = ifr.name;
     frm.method = "POST";
     frm.action = url;
     var cbName = setupCallback(ifr.name, cbContext, callback);
     setHiddenInput(frm, "json_function", "parent." + cbName);
     setHiddenInput(frm, "iframe", "true");

     var _base = {};

     if(contents){
       for(var x in contents){
         if(_base[x] === undefined || _base[x] != contents[x]){
           setHiddenInput(frm, x, contents[x]);
         }
       }
     }
   };

 })();

function substitute(str, map, transform){
  if(typeof(transform) !== "function") transform = function(n){ return n; };
  return str.replace(/\%\{(\w+)\}/g, function(match, key) {
    return transform(map[key]);
  });
}

function isString(/*any*/s){
  return s != null && (typeof s === "string" || s instanceof String);
}

function byid(/*DomNode|String*/ n) {
  return isString(n) ? document.getElementById(n) : n;
}

function removeNode(/*DomNode|String*/n){
  n = byid(n);
  if(n && n.parentNode) return n.parentNode.removeChild(n);
  return null;
}

function show(/*DomNode|String*/n, /*String?*/ display){
  display = isString(display) ? display : "block";
  n = byid(n);
  if(n && n.style) n.style.display = display;
  return n;
}

function hide(/*DomNode|String*/ n){
  n = byid(n);
  if(n && n.style) n.style.display = "none";
  return n;
}

function setHtml(/*DomNode|String*/ n, /*String*/ str) {
  n = byid(n);
  if(n) n.innerHTML = str;
  return n;
}

var _html2Ent = {
  "<" : "&lt;",
  ">" : "&gt;",
  '"' : "&quot;",
  '&' : "&amp;"
};

function _mapHtmlToEntity(str){
  return _html2Ent[str] || str;
}

function escapeHTML(str) {
  return str ? (str+'').replace(/[<>\"&]/gm, _mapHtmlToEntity) : "";
};

// clone all the properties of src onto dest and return dest
function mixin(dest, src){
  if(dest && src){
    var _t = {};
    for(var x in src){
      if(_t[x] === undefined || _t[x] != src[x]){
        dest[x] = src[x];
      }
    }
  }
  return dest;
}

function getUrlHash(){
  // NOTE: cannot use location.hash as it applies decodeURIComponent
  //       to the hash on firefox. have to do it this crazy way instead
  var h = window.location.href, loc = h.indexOf("#");
  return (loc > 0) ? h.substring(loc+1) : '';
}

function hashAsObj(){
  var h = getUrlHash();
  var pairs = h.split("&"); // get foo=bar pairs
  var map = {};
  // now break up the pairs and jam them into a map
  for(var i = 0, p = null; i < pairs.length; i++){
    p = pairs[i].split("=");
    map[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
  }
  return map;
}

function getPageHeight(){
  var windowHeight;
  if (document.body.scrollHeight > document.body.offsetHeight) {
    windowHeight=document.body.scrollHeight;
  } else {
    if (document.body.offsetHeight>0){
      windowHeight=document.body.offsetHeight;
    } else {
      windowHeight=window.innerHeight+window.scrollMaxY;
    }
  }
  var page0=document.getElementById('page0');
  if (page0 && page0.scrollHeight > windowHeight) {
    windowHeight=document.getElementById('page0').scrollHeight;
  }
  if (windowHeight<screen.height) {
    windowHeight=screen.height;
  }
  return windowHeight;
}

var LightboxShowing=false;
function hideLightbox() {
  LightboxShowing=false;
  var lighbox = document.getElementById('lightbox');
  lighbox.style.display = 'none';
  if (window.core && core.plugin && core.plugin.showPlugin) {
    core.plugin.showPlugin();
  }
  if (window.flashElementsOnPage) {
    for (var i=0;i<flashElementsOnPage.length;i++) {
      var str=flashElementsOnPage[i];
      if(document.getElementById(str)){
        document.getElementById(str).style.visibility="visible";
      }
    }
    clearInterval(window["showLightboxHider"+str]);
  }
}

function hideFlashElement(str) {
  return function() {
    if (LightboxShowing) {
      var el=document.getElementById(str);
      if(el && el.nodeName && (el.nodeName.toLowerCase()=="object" || el.nodeName.toLowerCase()=="embed")){
        el.style.visibility="hidden";
        clearInterval(window["showLightboxHider"+str]);
      }
    }
  };
}

function showLightbox() {
  LightboxShowing=true;
  var lightbox = document.getElementById('lightbox');
  if (lightbox) {
    lightbox.style.height = (getPageHeight() + 'px');
    lightbox.style.display = 'block';
  }
  if (window.core && core.plugin && core.plugin.hidePlugin) {
    core.plugin.hidePlugin();
  }
  var isIE = false;
  /*@cc_on
  isIE = true;
  @*/
  if (window.flashElementsOnPage) {
    for (var i=0;i<flashElementsOnPage.length;i++) {
      var str=flashElementsOnPage[i];
      if(document.getElementById(str) && !isIE){
        document.getElementById(str).style.visibility="hidden";
      }
      clearInterval(window["showLightboxHider"+str]);
      window["showLightboxHider"+str]=setInterval(hideFlashElement(str),200);
    }

  }
}

function createOverlay(str,position,cssclass) {
  showLightbox();
  var div=document.createElement('div');
  div.className="overlayContainer";
  if(cssclass !="" && cssclass !=undefined){
     div.className = div.className + ' ' + cssclass;
  }
  var innerDiv=document.createElement('div');
  innerDiv.className="overlayContents";
  innerDiv.innerHTML=str;
  div.appendChild(innerDiv);
  var el=document.getElementById('addContainer');
  el.appendChild(div);
  innerDiv.style.display = 'block';
  if (position) {
    if (position.center) {
      var innerWidth = document.documentElement.clientWidth;
      var innerHeight = document.documentElement.clientHeight;
      if (!innerWidth) {
        innerWidth=document.body.clientWidth;
        innerHeight=document.body.clientHeight;
      }
      if (!innerWidth) {
        innerWidth=window.innerWidth;
        innerHeight=window.innerHeight;
      }
      var width=innerDiv.offsetWidth;
      var height=innerDiv.offsetHeight;
      var left=Math.floor(innerWidth/2-width/2);
      if (!position.vBias) {
        position.vBias=2;
      }
      var scrollTop= document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
      scrollTop= isNaN(scrollTop) ? 0 : scrollTop;
      var top=Math.floor(innerHeight/position.vBias)+scrollTop;
      div.style.left=left+"px";
      div.style.top=top+"px";
    } else {
      if (position.absolute) {
        div.style.top=position.top+"px";
        div.style.left=position.left+"px";
      }
    }
  }
  return div;
}

function renderThumbnails(list,id,max,offset) {
  var template='<a href="/%s" title="%t" id="%i_%s" onclick="return epgPage.playNow(this.id, this);" onmousedown="analyticsTrackEvent2(\'bricks\', \'brick-play-mousedown\', \'%i\', %pos);" onmouseover="epgPage.toggleButtons(this.id, true);" onmouseout="epgPage.toggleButtons(this.id, false);"><img src="%h" alt="%t" class="%z" onerror="changeToFallback(this, \'/static/%z.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility:hidden"><img src="/static/%p.png" class="%p" alt="" id="%i_%s_play" rel="png"/></a>';//'
  var elt=document.getElementById(id);
  elt.innerHTML="";
  if (list && list.length>0) {
    if(list.length<max){
      max=list.length;
    }
    var count=0;
    for (var i=0;i<max;i++) {
      var obj=list[i];
      if (obj) {
        var div2=document.createElement('div');
        var sz="t1";
        var pz="p1";
        var thumb;
        if(count++<offset){
          sz="t2";
          pz="p2";
        }
        if (!obj.publicId) {
          obj.publicId=obj.publicId;
        }
        if (obj.thumbnail) {
          thumb=obj.thumbnail;
        } else {
          if (obj.logo) {
            thumb=obj.logo;
          } else {
            thumb="/static/t2.jpg";
          }
        }
        var str=template.replace(/%h/gm,escapeHTML(thumb)).replace(/%t/gm,escapeHTML(obj.title)).replace(/%s/gm,escapeHTML(obj.publicId)).replace(/%z/gm,escapeHTML(sz)).replace(/%i/gm,id).replace(/%pos/gm,i).replace(/%p/gm,pz);
        div2.className="thumbnail " +sz + ((obj.geoPlayable === false) ? ' disabled' : '');
        div2.innerHTML=str;
        elt.appendChild(div2);
      }
    }
  } else {
    elt.innerHTML="<p>None yet</p>";
  }
}

function renderThumbnailsText(list,id,max,args) {
  var defargs = {'title': true, 'desc':	true, 'summdesc': true, 'actions': true, 'type': 'default' };
  var args = args || {};
  for(var k in defargs) {
      if(typeof args[k] == "undefined") args[k] = defargs[k];
  }
  var fauxButtons = renderVideoListFauxButtons([{icon: "miniButtonQueueAdd16"}, {icon: "miniButtonAddToFavorites16"}]);
  var template='<div onmouseover="epgPage.toggleButtons(\'%i_%s\', true);" onmouseout="epgPage.toggleButtons(\'%i_%s\', false);"><div class="thumbnails"><div class="thumbnail %z %g"><a href="/%s" title="%t" id="%i_%s" onclick="return epgPage.playNow(\'%s\', this);" onmousedown="analyticsTrackEvent2(\'bricks\', \'brick-thumbnail-play-mousedown\', \'%i\', %pos);"><img src="%h" alt="%t" class="%z" onerror="changeToFallback(this, \'/static/%z.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility: hidden"><img src="/static/%p.png" class="%p" alt="" id="%i_%s_play" rel="png" /></a></div><div class="break"></div></div><div class="description"><h3 class="oneLine"><a href="/%s" title="%t" onclick="return epgPage.playNow(\'%s\', this);" onmousedown="analyticsTrackEvent2(\'bricks\', \'brick-text-play-mousedown\', \'%i\', %pos);">%ts</a></h3>';
  if(args.desc) {
  template += '<p>%ds</p>'
  }
  if(args.actions) {
  template += '<div id="%i_%s_fauxButtons" class="fauxButtons"><p>' + fauxButtons + '</p></div><div id="%i_%s_buttons" style="display: none;"><p><a class="miniButton miniButtonQueueAdd16" title="Add to My Queue" onclick="analyticsTrackEvent2(\'bricks\', \'brick-addqueue-click\', \'%i\', %pos); epgPage.addToList(event, \'playlist\', \'%s\', \'%i_%s\'); return false;" href="#"><img alt="Add to My Queue" src="/static/transparent.gif"/></a> <a class="miniButton miniButtonAddToFavorites16" title="Add to favorites" onclick="analyticsTrackEvent2(\'bricks\', \'brick-favorite-click\', \'%i\', %pos); epgPage.addToList(event, \'favorites\', \'%s\', \'%i_%s\'); return false;" href="#"><img alt="Add to favorites" src="/static/transparent.gif"/></a></p></div>'
  }
  template += '</div><div class="break"></div></div>';

  var elt=document.getElementById(id);
  var div=document.createElement('div');
  div.className="thumbnailsList";
  var ul=document.createElement('ul');
  elt.innerHTML="";
  if (list && list.length>0) {
    if(list.length<max){
      max=list.length;
    }
    var count=0;
    
    for (var i=0;i<max;i++) {
      var obj=list[i];
      if (obj) {
        var li=document.createElement('li');
//        li.className = "thumbnailsText";
        var sz="t1";
        var pz="p1";
        var thumb;
        if (!obj.publicId) {
          obj.publicId=obj.publicId;
        }
        if (obj.thumbnail) {
          thumb=obj.thumbnail;
        } else {
          if (obj.logo) {
            thumb=obj.logo;
          } else {
            thumb="/static/%z.jpg";
          }
          if(args.type==='group') {
            thumb="/static/joost_group_t1.jpg";
          }
        }

        summary.maxLength = 30;
        summary.sumLength = 25;
        
        if(args.summdesc){
            obj.description = summary.sumShort(obj.description + " ");
        }
        var geoPlayable = '';
        if (obj.geoPlayable === false) { geoPlayable = 'disabled'; }

        var str=template.replace(/%h/gm,escapeHTML(thumb)).replace(/%ts/gm,escapeHTML(summary.sumShort(obj.title + " ")));
        if(args.desc){
        str=str.replace(/%ds/gm,escapeHTML(obj.description))        
        }
  str=str.replace(/%t/gm,escapeHTML(obj.title)).replace(/%s/gm,escapeHTML(obj.publicId)).replace(/%z/gm,escapeHTML(sz)).replace(/%i/gm,id).replace(/%pos/gm,i).replace(/%p/gm,pz).replace(/%g/gm,geoPlayable);
        li.innerHTML=str;
        ul.appendChild(li);
      }
    }
    div.appendChild(ul);
    elt.appendChild(div);
    fixPNG();
    return elt.innerHTML;
  } else {
    return elt.innerHTML="<p>None yet</p>";
  }
}


function renderUserText(list,id,max) {
  var template='<div onmouseover="epgPage.toggleButtons(\'%i_%s\', true);" onmouseout="epgPage.toggleButtons(\'%i_%s\', false);"><div class="thumbnails"><div class="thumbnail %z %g"><a href="/%s" title="%t" id="%i_%s" onclick="return epgPage.playNow(\'%s\', this);"><img src="%h" alt="%t" class="%z" onerror="changeToFallback(this, \'/static/%z.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility: hidden"><img src="/static/%p.png" class="%p" alt="" id="%i_%s_play" rel="png" /></a></div><div class="break"></div></div><div class="description"><h3 class="oneLine"><a href="/users/%j">%ts</a></h3><p>Watched <a href="/%s">%ds</a></p></div><div class="break"></div></div>';
  var elt=document.getElementById(id);
  var div=document.createElement('div');
  div.className="thumbnailsList";
  var ul=document.createElement('ul');
  elt.innerHTML="";
  if (list && list.length>0) {
    if(list.length<max){
      max=list.length;
    }
    var count=0;
    for (var i=0;i<max;i++) {
      var obj=list[i];
      if (obj) {
        var li=document.createElement('li');
//        li.className = "thumbnailsText";
        var sz="t1";
        var pz="p1";
        var thumb;
        if (!obj.publicId) {
          obj.publicId=obj.publicId;
        }
        if (obj.thumbnail) {
          thumb=obj.thumbnail;
        } else {
          if (obj.logo) {
            thumb=obj.logo;
          } else {
            thumb="/static/%z.jpg";
          }
        }
        //BUG?? what's summary?
        summary.maxLength = 30;
        summary.sumLength = 25;

        
        var geoPlayable = '';
        if (obj.geoPlayable === false) { geoPlayable = 'disabled'; }
        var str=template.replace(/%h/gm,escapeHTML(thumb)).replace(/%ts/gm,escapeHTML(summary.sumShort(obj.subjectName + " "))).replace(/%ds/gm,escapeHTML(summary.sumShort(obj.title + " "))).replace(/%t/gm,escapeHTML(obj.title)).replace(/%s/gm,escapeHTML(obj.publicId)).replace(/%z/gm,escapeHTML(sz)).replace(/%i/gm,id).replace(/%p/gm,pz).replace(/%g/gm,geoPlayable).replace(/%j/gm,escapeHTML(obj.subject));
        li.innerHTML=str;
        ul.appendChild(li);
      }
    }
    div.appendChild(ul);
    elt.appendChild(div);
    fixPNG();

  } else {
    elt.innerHTML="<p>None yet</p>";
  }
}

 function replaceLink(lnk) {
   var out=lnk.match(/([^\w\/]$)/g);
   if (out) {
     lnk=lnk.replace(/([^\w\/]$)/g,"");
     return '<a href="'+lnk+'" rel="nofollow" target="_blank">'+lnk+'</a>'+out;
   }
   return '<a href="'+lnk+'" rel="nofollow" target="_blank">'+lnk+'</a>';
 }

 var linkRE=/https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.\-]*(\?\S+)?)?)?/g;
 var endRE=/([^\w\/]$)/g;

function makeParas(text) {
  if (text) {
    text=(text+'').split(/\\n\\n|\n/gim);
    var tl=text.length;
    var str=["<p>"];
    for (var i=0;i<tl;i++) {
      var para=escapeHTML(text[i]);
      if (para.length>0) {
        para=para.replace(linkRE,replaceLink);
        str.push(para);
        str.push('</p><p>');
      }
    }
    str.push("</p>");
    return str.join('').replace(/<p><\/p>/gim,"");
  } else {
    return "";
  }
}

  function renderThumbAndTextList(list,nolinks,breakAt) {
    if (list && list.length==0) {
      return "";
    }

    if (nolinks) {
      var itemTemplate='<li><div class="thumbnails"><div class="thumbnail t1"><img src="%h" alt="%t" class="t1" onerror="changeToFallback(this, \'/static/t1.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility:hidden"></div><div class="break"></div></div><div class="description"><h3><a href="/%i" title="%t">%t</a></h3><p>%d</p><p>%v</p></div><div class="break"></div></li>';
    } else {
      var itemTemplate='<li><div class="thumbnails"><div class="thumbnail t1"><a href="/%i" title="%t"><img src="%h" alt="%t" class="t1" onerror="changeToFallback(this, \'%e\');" onload="this.style.visibility=\'visible\'" style="visibility: hidden;"></a></div><div class="break"></div></div><div class="description"><h3><a href="/%i" title="%t">%t</a></h3><p>%d</p><p>%v</p></div><div class="break"></div></li>';
    }

    var itemFBTemplate='<li><div class="thumbnails"><div class="thumbnail t1"><div class="thumbnail-t1-fb"><a href="/%i" title="%t"><fb:profile-pic uid="%f" size="square" facebook-logo="false" linked="false" class="t1-fb"></fb:profile-pic></a></div><a href="http://www.facebook.com/profile.php?id=%f"><img src="/static/facebook-minilabel-f2.gif" alt="" class="fb-minilabel"/></a></div><div class="break"></div></div><div class="description"><h3><a href="/%i" title="%t">%t</a></h3><p>%d</p><p>%v</p></div><div class="break"></div></li>';

    var str=["<div class='thumbnailsList'><ul>"];
    var item=list[0];
    for (var i=0;i<list.length;i++) {
      item=list[i];

      if(item.lastViewed) {
        var lastViewTitle = String(item.lastViewed.title)
        lastViewTitle = ((lastViewTitle.length > 30) ? (lastViewTitle.substring(0, 25) + ' ...') : lastViewTitle);
        item.lastViewed = '<a href="/'+item.lastViewed.publicId+'">'+lastViewTitle+'</a>';
      } else {
        item.lastViewed = '';
      }

      if(item.fbid && item.fbid != 'undefined' && item.showProfile) {
        str.push(itemFBTemplate.replace(/%f/gm,escapeHTML(item.fbid)).replace(/%t/gm,escapeHTML(item.title)).replace(/%i/gm,item.link).replace(/%d/gm,item.description).replace(/%e/gm,item.fallback).replace(/%v/gm,item.lastViewed));
      } else {
        if (!item.thumbnail || item.thumbnail=="") {
            if (item.type == 'user') {
            item.thumbnail="/static/joost_generic_t1.jpg";
            } else if (item.type == 'group') {
            item.thumbnail="/static/joost_group_t1.jpg";
            } else {
            item.thumbnail="/static/t1.jpg";
            }
        }
        if (item.type == 'user') {
            item.fallback="/static/joost_generic_t1.jpg";
        } else if (item.type == 'group') {
            item.fallback="/static/joost_group_t1.jpg";
        } else {
            item.fallback="/static/t1.jpg";
        }
               str.push(itemTemplate.replace(/%h/gm,escapeHTML(item.thumbnail)).replace(/%t/gm,escapeHTML(item.title)).replace(/%i/gm,item.link).replace(/%d/gm,item.description).replace(/%e/gm,item.fallback).replace(/%v/gm,item.lastViewed));
      }
      if (breakAt && breakAt > 0) {
        if (i % breakAt == breakAt - 1) {
          str.push('<li class="break"></li>');
        }
      }
    }
    str.push('</ul></div><div class="break"></div>');
    return str.join('');
  }

  function renderUserBrickInThumbMode(list,nolinks) {
    if (list && list.length==0) {
      return "";
    }
    var str=[];
    var item=list[0];
    for (var i=0;i<list.length;i++) {
	item=list[i];
	var itemTemplate='<div class="brick brickB1 brickBordered"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList"><div class="thumbnails"><div class="thumbnail t2">%a</div><div class="break"></div></div><div class="description"><h3><a href="%i">%t</a><br /></h3>%n</div></div><div class="break"></div><div class="gutter"><div class="break"></div></div></div></div></div></div></div></div></div>';
	
	var imageTemplate ="";
    if(item.fbid && item.fbid != 'undefined' && item.showProfile) {
		imageTemplate = '<span class="thumbnail-t2-fb"><a title="%t" href="%i"><fb:profile-pic uid="' + item.fbid + '" size="small" facebook-logo="false" linked="false" class="t2-fb"></fb:profile-pic></a></span><a href="http://www.facebook.com/profile.php?id=' + item.fbid + '"><img src="/static/facebook-minilabel-f.gif" alt="%t on Facebook" class="fb-minilabel"></a>';
	} else {
		imageTemplate = '<a title="%t" href="%i"><img onerror="changeToFallback(this, \'/static/joost_generic_t2.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility: visible;" alt="%t" class="t2" src="%h"/></a>'; 
	}

	itemTemplate = itemTemplate.replace(/%a/gm,imageTemplate);
    
	if(nolinks) {
		itemTemplate = itemTemplate.replace(/%n/gm,'');
	} else {
        
		if(item.description && item.description != "") {
			itemTemplate = itemTemplate.replace(/%n/gm,item.description);
		} else if (!item.friend) {
			itemTemplate = itemTemplate.replace(/%n/gm,'<div class="buttons"><a title="Add" class="miniButton miniButtonMore" onclick="requestFriend(\'%t\',this); return false;" href="#"><img alt="Add" src="/static/transparent.gif"/><span class="label">Add</span></a></div>');
		} else {
			itemTemplate = itemTemplate.replace(/%n/gm,"");
		}
   	}
 
    if (!item.thumbnail || item.thumbnail=="") {
        if (item.type == 'user') {
          item.thumbnail="/static/joost_generic_t2.jpg";
        } else if (item.type == 'group') {
          item.thumbnail="/static/joost_group_t2.jpg";
        } else {
          item.thumbnail="/static/t2.jpg";
        }
    }	str.push(itemTemplate.replace(/%h/gm,escapeHTML(item.thumbnail)).replace(/%t/gm,item.title).replace(/%i/gm,item.link));
    }
    return str.join('');
  }
  
  function renderUserBrickInListMode(list) {
    if (list && list.length==0) {
      return "";
    }
    var str=[];
    var item=list[0];
    
    for (var i=0;i<list.length;i++) {
	item=list[i];
    
	var itemTemplate='<div id="member-%{joostName}"><div class="brick brickB2"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList"><div class="thumbnails"><div class="thumbnail t1">%a</div><div class="break"></div></div><div class="description"><h3><a href="%{link}">%{displayName}</a></h3><p>%{description}</p><div class="buttons"></div></div></div><div class="break"></div></div><div class="gutter"><div class="break"></div></div></div></div></div></div></div></div>';
	
	var imageTemplate=""; var description = "";
    if(item.fbid && item.fbid != 'undefined' && item.showProfile) {
		imageTemplate = '<span class="thumbnail-t1-fb"><a title="%{displayName}" href="%{link}"><fb:profile-pic uid="' + item.fbid + '" size="square" facebook-logo="false" linked="false" class="t1-fb"></fb:profile-pic></a></span><a href="http://www.facebook.com/profile.php?id=' + item.fbid + '"><img src="/static/facebook-minilabel-f2.gif" alt="%{displayName} on Facebook" class="fb-minilabel"></a>';
	} else {
		imageTemplate = '<a title="%{displayName}" href="%{link}"><img onerror="changeToFallback(this, \'/static/joost_generic_t1.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility: visible;" alt="%{displayName}" class="t1" src="%{thumbnail}"  src="/static/joost_male_t1.jpg" /></a>'; 
	}
	itemTemplate = itemTemplate.replace(/%a/gm,imageTemplate);
    
    if (!item.thumbnail || item.thumbnail=="") {
        item.thumbnail="/static/joost_generic_t2.jpg";
    }
    if(item.gender || item.age || item.country || item.regDate) {
      description = item.gender != "" ? item.gender + ', ' : "";
      description += item.age != "" ? item.age + ', ' : "";
      description += item.country != "" ? item.country : "";
      description += item.regDate != "" ? '<br /><strong>Signed up: </strong>' + item.regDate : "";
    }
    if(item.description != "") {
      description += '</p><p>' + item.description;
    } else if (!item.friend) {
        description += '</p><p><div class="buttons"><a title="Add" class="miniButton miniButtonMore" onclick="requestFriend(\''+ item.joostName +'\', this); return false;" href="#"><img alt="Add" src="/static/transparent.gif"/><span class="label">Add</span></a></div>';
	} else {
		description = "";
    }
    
    itemTemplate = substitute(itemTemplate, {joostName: item.joostName, link: item.link, displayName: item.title, description: description, thumbnail: item.thumbnail});
    str.push(itemTemplate);
    
    if(i % 2 === 1) {
        str.push('<div class="break"></div>');
    }
    
    }
    
    return str.join('');
  }  
  

  function renderGroupBrickInListMode(list) {
    if (list && list.length==0) {
      return "";
    }
   
    var str=[];
    var item=list[0];
    for (var i=0;i<list.length;i++) {
        item=list[i];
        var itemTemplate='<div class="brick brickB4 brickBordered"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList"><div class="description"><h3><a href="/groups/%{groupId}">%{groupName}</a></h3><div><p>%{description}</p></div></div><div class="thumbnails"><div class="thumbnail t2"><a href="/groups/%{groupId}" title="%{groupName}"><img src="%{avatar}" onerror="changeToFallback(this, \'/static/t2.jpg\');" class="t2" alt="%{groupName}" style="visibility: visible;" onload="this.style.visibility=\'visible\'"/></a></div><div class="break"></div></div><div class="metadata"><p>%{members} member%{plural}</p>%{isMember}</div><div class="gutter"><div class="break"></div></div></div></div></div></div></div></div>';
        
    if (!item.avatar || item.avatar === "") {     
          item.avatar="/static/joost_group_t2.jpg";
    }
    
    var plural = item.members > 1 ? 's' : '';
    
    var isMemberStr = substitute('<div class="buttons" style="display: block;"><a title="Join Group" class="miniButton miniButtonJoinedAGroup16" onclick="AddGroup.addGroup(\'%{groupId}\',\'%{username}\'); return false;" href="#"><img alt="Join Group" src="/static/transparent.gif"/></a><div class="break"></div></div>', {groupId: item.groupId, username: item.username});
    var isMember = item.isMember ? isMemberStr : '';
    
    itemTemplate = substitute(itemTemplate, {isMember: isMember, groupId: item.groupId, groupName: item.groupName, avatar: item.avatar, members: item.members, username: item.username, description: item.description, plural: plural});
    
    str.push(itemTemplate);
    }
    return str.join('');
  }

  function renderGroupBrickInThumbMode(list) {
    if (list && list.length==0) {
      return "";
    }
    var str=[];
    var item=list[0];
    for (var i=0;i<list.length;i++) {
        item=list[i];
        var itemTemplate='<div id="video_%{groupId}_front" style="display: block;"><div class="brick brickB1 brickBordered"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div onmouseout="epgPage.toggleButtons(this.id, false);" onmouseover="epgPage.toggleButtons(this.id, true);" id="video_%{groupId}" class="thumbnailsList"><div class="thumbnails"><div class="thumbnail t2"><a href="/groups/%{groupId}/" title="%{group}"><img src="/static/joost_group_t2.jpg" class="t2" alt="%{groupName}" style="visibility: visible;" onload="this.style.visibility=\'visible\'"/></a></div><div class="break"></div></div><div class="description"><h3><a href="/groups/%{groupId}/" title="%{groupName}">%{groupName}</a></h3><p>%{members} member%{plural}</p><div style="display: none;" id="video_%{groupId}_buttons" class="buttons"><a title="Group information..." class="miniButton miniButtonInfo16" onclick="brickFlippedFlip(\'%{groupId}\', \'back\'); return false;" href="#"><img alt="Group information..." src="/static/transparent.gif"/></a> %{isMember}</div><div id="video_%{groupId}_fauxButtons" class="buttons fauxButtons" style="display: block;"><img src="/static/transparent.gif" class="miniButtonInfo16Faux" alt="" /> %{isMemberFaux}</div></div></div><div class="break"></div></div><div class="gutter"><div class="break"></div></div></div></div></div></div></div></div>' + 
        '<div style="display: none;" id="video_%{groupId}_back"><div class="brick brickB1 brickBordered brickFlipped"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList"><div class="description"><h3><a href="/groups/%{groupId}/" title="%{groupName}">%{groupName}</a></h3><div class="scrolledDescription" id="sd_%{groupId}"><div><p>%{description}</p></div></div><div class="buttons"><a title="Close" class="miniButton miniButtonClose" onclick="brickFlippedFlip(\'%{groupId}\', \'front\'); return false;" href="#"><img alt="Close" src="/static/transparent.gif"/></a></div><div style="display: none;" id="sb_%{groupId}"><div class="scrollUp"><img onmouseout="brickFlippedStopScroll();" onmouseover="brickFlippedScroll(\'sd_%{groupId}\', -1);" alt="" src="/static/transparent.gif"/></div><div class="scrollDown"><img onmouseout="brickFlippedStopScroll();"  onmouseover="brickFlippedScroll(\'sd_%{groupId}\', 1);" alt="" src="/static/transparent.gif"/></div></div></div></div><div class="break"></div></div><div class="gutter"><div class="break"></div></div></div></div></div></div></div></div>';
        
    if (!item.avatar || item.avatar === "") {     
          item.avatar="/static/joost_group_t2.jpg";
    }
    
    var plural = item.members > 1 ? 's' : '';
    var isMemberFaux = item.isMember ? '<img src="/static/transparent.gif" class="miniButtonJoinedAGroup16Faux" alt="" />' : '';
    var isMemberStr = substitute('<a title="Join Group" class="miniButton miniButtonJoinedAGroup16" onclick="AddGroup.addGroup(\'%{groupId}\',\'%{username}\'); return false;" href="#"><img alt="Join Group" src="/static/transparent.gif"/></a>', {groupId: item.groupId, username: item.username});
    var isMember = item.isMember ? isMemberStr : '';
    
    itemTemplate = substitute(itemTemplate, {isMemberFaux: isMemberFaux, isMember: isMember, groupId: item.groupId, groupName: item.groupName, avatar: item.avatar, members: item.members, username: item.username, description: item.description, plural: plural})
    
    str.push(itemTemplate);
    }
    return str.join('');
  }  

function renderVideoList(list,id) {
  // XXX Add in handling here for the intelligent show/hide of images etc.
  if (list.length==0) {
    return "";
  }

  var firstItemTemplate='<div class="thumbnail tbbc"><a href="/%s/" title="%t" id="%i" onclick="return epgPage.playNow(\'%s\', this);" onmouseover="epgPage.toggleButtons(this.id, true);" onmouseout="epgPage.toggleButtons(this.id, false);"><img src="%h" class="tbbc" alt="%t" onerror="changeToFallback(this, \'/static/t2.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility:hidden" rel="png"/><img src="/static/p2.png" class="p2" alt="" id="%i_play" rel="png" /></a></div><div class="break"></div></div><div class="thumbnailBBCList"><ul><li><a onmouseover="changeVideoListDisplay(this,\'%h\')"  href="/%s" onclick="return epgPage.playNow(\'%s\', this);">%t</a></li><li><a onmouseover="changeVideoListDisplay(this,\'%m1\')" href="/%s1" onclick="return epgPage.playNow(\'%s1\', this);">%t1</a></li><li><a onmouseover="changeVideoListDisplay(this,\'%m2\')" href="/%s2" onclick="return epgPage.playNow(\'%s2\', this);">%t2</a></li></ul></div><div class="break"></div><div class="thumbnailBBCList2"><ul>';
  var itemTemplate='<li><a href="/%s" onclick="return epgPage.playNow(\'%s\', this);">%t</a><br /></li>';
  var str=['<div class="thumbnailBBC"><div class="thumbnails">'];
  var item=list[0];
  var t2,s2,m2;
  if (list[2]) {
    t2=escapeHTML(list[2].title);
    s2=list[2].publicId;
    m2=list[2].thumbnail;
  } else {
    t2="";
    s2=item.publicId;
    m2="";
  }
  var t1,s1,m1;
  if (list[1]) {
    t1=escapeHTML(list[1].title);
    s1=list[1].publicId;
    m1=list[1].thumbnail;
  } else {
    t1="";
    s1=item.publicId;
    m1="";
  }
  if (!m2.thumbnail || m2.thumbnail=="") {
    m2.thumbnail="/static/t2.jpg";
  }
  if (!m1.thumbnail || m1.thumbnail=="") {
    m1.thumbnail="/static/t2.jpg";
  }
  if (!item.thumbnail || item.thumbnail=="") {
    item.thumbnail="/static/t2.jpg";
  }
  str.push(firstItemTemplate.replace(/%h/gm,item.thumbnail).replace(/%t2/gm,t2).replace(/%m1/gm,m1).replace(/%m2/gm,m2).replace(/%s2/gm,s2).replace(/%t1/gm,t1).replace(/%s1/gm,s1).replace(/%t/gm,escapeHTML(item.title)).replace(/%s/gm,item.publicId).replace(/%i/gm,id));
  var len=list.length;
  if(len>6){len=6;}// MWF-1279 - 3 extra links only
  for (var i=3;i<len;i++) {
    item=list[i];
    str.push(itemTemplate.replace(/%h/gm,escapeHTML(item.thumbnail)).replace(/%t/gm,escapeHTML(item.title)).replace(/%s/gm,item.publicId));
  }
  str.push('</ul></div></div><div class="break"></div>');
  return str.join('');
}

function changeVideoListDisplay(target, imagePath){
  var thumbnailHolder = target.parentNode.parentNode.parentNode.parentNode.parentNode.firstChild;

  if(imagePath == ""){
    return;
  }

  var image = thumbnailHolder.getElementsByTagName('img')[0];
  image.src = imagePath;
  image.alt = target.title;

  var link = thumbnailHolder.getElementsByTagName('a')[0];
  link.href = target.href;
  link.title = target.title;

  fixPNG();
}

function renderVideoListWide(list,buttons) {
  if (list.length==0) {
    return "";
  }

  var str=[];
  str.push('<div class=\"listViewmodeSearch\">');

  var item,itemTemplate;

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

    var playNow = "";
    var playIcon = "";
    var pngFix = "";
    if (item.type && item.type == "video") {
      playNow = item.syndicated ? 'target="_blank"' : 'onclick="return epgPage.playNow(\'%i\', this);"'
      playIcon = '<img id="video_%i_play" src="/static/p2.png" class="p2" alt="" rel="png"/>';
    }
    if (item.type && item.type == "channel") {
      pngFix = 'rel="png"';
    }
    var itemTitle = "";
    var channelPublicId, channelTitle, channelHref;
    if (item.type && item.type == "video" && item.channels && item.channels.size() > 0) {
      itemTitle = '<h4 class="video"><a href="%cs" title="%ct">%ct</a></h4>';
      channelPublicId = item.channels[0].publicId;
      channelTitle = item.channels[0].title;
      channelHref = semanticURLize(channelPublicId, channelTitle);
    }

    itemTemplate='<div class="brick brickB4 brickBordered"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList" onmouseout="epgPage.toggleButtons(\'video_%i\', false, true);" onmouseover="epgPage.toggleButtons(\'video_%i\', true, true);"><div class="description"><h3><a ' + playNow + ' href="%s" title="%t">%t</a></h3>';
    itemTemplate=itemTemplate+summary.sumTemplate(item.description);
    itemTemplate=itemTemplate+'</div><div class="thumbnails"><div class="thumbnail t2"><a ' + playNow + ' href="%s" title="%t"><img src="%h" class="t2" alt="%t" onerror="changeToFallback(this, \'/static/t2.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility:hidden" '+pngFix+'/>'+playIcon+'</a></div><div class="break"></div></div><div class="metadata"><p>%a<br/><strong>%l</strong></p><div class="buttons" id="video_%i_buttons">';
    if (item.type && item.type == "channel") {
      itemTemplate=itemTemplate+'<div class="floatRight">' + renderVideoListButtons([{href: "/?playNow=%i", onclick: "return Page.playable && epgPage.playNow('%i', this, true);", icon: "miniButtonPlayAll16", title: "Play Channel"}]) + '</div>';
    }
    if (buttons && !item.syndicated) {
      itemTemplate=itemTemplate+renderVideoListButtons(buttons);
    }
    itemTemplate=itemTemplate+'</div>'+itemTitle+'</div><div class="break"></div></div></div></div></div></div></div></div>';

    if (!item.thumbnail || item.thumbnail=="") {
      item.thumbnail="/static/t2.jpg";
    }
    var dur= item.duration ? dateTime.msToShortTime(item.duration) : "";
    var itemHref = item.syndicated ? item.link : semanticURLize(item.publicId, item.title);
    var x=itemTemplate.replace(/%h/gm,escapeHTML(item.thumbnail)).replace(/%d/gm,makeParas(item.description)).replace(/%sd/gm,escapeHTML(summary.sumShort(item.description))).replace(/%t/gm,escapeHTML(item.title)).replace(/%i/gm,item.publicId).replace(/%s/gm,itemHref).replace(/%l/gm,dur).replace(/%a/gm,"Added: " + dateTime.getElapsed(item.publicationDate)).replace(/%ct/gm,escapeHTML(channelTitle)).replace(/%cs/gm,channelHref);
    str.push(x);
  }
  str.push('<div class="break"></div></div>');
  return str.join('');
}


function renderVideoListWideThumbs(list,buttons) {
  if (list.length==0) {
    return "";
  }

  var str=[];
  str.push('<div class=\"listViewmodeThumbs\">');

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

    var playNow = "";
    var playIcon = "";
    var pngFix = "";
    var fauxButtons = "";
    if (item.type && item.type == "video") {
      playNow = item.syndicated ? 'target="_blank"' : 'onclick="return epgPage.playNow(\'%i\', this);"';
      playIcon = '<img id="video_%i_play" src="/static/p2.png" class="p2" alt="" rel="png"/>';
    }
    if (item.type && item.type == "channel") {
      pngFix = 'rel="png"';
    }

    var itemTitle = "";
    var channelPublicId, channelTitle, channelHref;
    if (item.type && item.type == "video" && item.channels && item.channels.size() > 0) {
      itemTitle = '<h3 class="video"><a ' + playNow + ' href="%s">%t</a></h3><h4 class="video"><a href="%cs" title="%ct">%ct</a></h4>';
      channelPublicId = item.channels[0].publicId;
      channelTitle = item.channels[0].title;
      channelHref = semanticURLize(channelPublicId, channelTitle);
    }
    else {
      itemTitle = '<h3><a ' + playNow + ' href="%s" title="%t">%t</a></h3>';
    }

    //Front
    var itemTemplate='<div id="video_%i_front"><div id="video_%i" class="brick brickB1 brickBordered"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList" onmouseout="epgPage.toggleButtons(\'video_%i\', false);" onmouseover="epgPage.toggleButtons(\'video_%i\', true);"><div class="thumbnails"><div class="thumbnail t2"><a ' + playNow + ' href="%s" title="%t"><img src="%h" alt="%t" class="t2" onerror="changeToFallback(this, \'/static/t2.jpg\');" onload="this.style.visibility=\'visible\'" style="visibility:hidden" ' + pngFix + '>'+playIcon+'</a></div><div class="break"></div></div><div class="description">'+itemTitle+'<p>%l</p><div class="buttons" id="video_%i_buttons" style="display: none;">';
    if (item.type && item.type == "channel") {
      itemTemplate=itemTemplate+'<div class="floatRight">' + renderVideoListButtons([{href: "/?playNow=%i", onclick: "return Page.playable && epgPage.playNow('%i', this, true);", icon: "miniButtonPlayAll16", title: "Play Channel"}]) + '</div>';
      fauxButtons=fauxButtons+'<div class="floatRight">'+renderVideoListFauxButtons([{icon: "miniButtonPlayAll16"}])+'</div>';
    }
    itemTemplate=itemTemplate+'<a title="Video information..." class="miniButton miniButtonInfo16" onclick="brickFlippedFlip(\'%i\', \'back\'); return false;" href="#"><img alt="Video information..." src="/static/transparent.gif"/></a>';
    fauxButtons=fauxButtons+renderVideoListFauxButtons([{icon: "miniButtonInfo16"}]);
    if (buttons && !item.syndicated) {
      itemTemplate=itemTemplate+renderVideoListButtons(buttons);
      fauxButtons=fauxButtons+renderVideoListFauxButtons(buttons);
    }
    itemTemplate=itemTemplate+'</div>';
    if(fauxButtons != "") {
      itemTemplate=itemTemplate+'<div class="buttons fauxButtons" id="video_%i_fauxButtons">'+fauxButtons+'</div>';
    }
    itemTemplate=itemTemplate+'</div></div><div class="break"></div><div class="gutter"><div class="break"></div></div></div></div></div></div></div></div></div>';

    //Back
    itemTemplate=itemTemplate+'<div id="video_%i_back" style="display: none;"><div class="brick brickB1 brickBordered brickFlipped"><div class="outerPadding"><div class="outerBorder"><div class="innerBorder"><div class="innerPadding"><div class="content"><div class="thumbnailsList"><div class="description">'+itemTitle+'<div id="sd_%i" class="scrolledDescription"><div><p>%d</p></div></div><div class="buttons"><a href="#" onclick="brickFlippedFlip(\'%i\', \'front\'); return false;" class="miniButton miniButtonClose" title="Close"><img src="/static/transparent.gif" alt="Close"></a></div><div id="sb_%i" style="display: none;"><div class="scrollUp"><img src="/static/transparent.gif" alt="" onmouseover="brickFlippedScroll(\'sd_%i\', -1);" onmouseout="brickFlippedStopScroll();"></div><div class="scrollDown"><img src="/static/transparent.gif" alt="" onmouseover="brickFlippedScroll(\'sd_%i\', 1);" onmouseout="brickFlippedStopScroll();"></div></div></div></div></div></div></div></div></div></div></div>';

    if (!item.thumbnail || item.thumbnail=="") {
      item.thumbnail="/static/t2.jpg";
    }

    var dur= item.duration ? dateTime.msToShortTime(item.duration) : "";
    var itemHref = item.syndicated ? item.link : semanticURLize(item.publicId, item.title);

    var x=itemTemplate.replace(/%h/gm,escapeHTML(item.thumbnail)).replace(/%d/gm,makeParas(item.description)).replace(/%t/gm,escapeHTML(item.title)).replace(/%i/gm,escapeHTML(item.publicId)).replace(/%s/gm,itemHref).replace(/%l/gm,dur).replace(/%ct/gm,escapeHTML(channelTitle)).replace(/%cs/gm,channelHref);
    str.push(x);
  }
  str.push('<div class="break"></div></div>');
  return str.join('');
}


function renderVideoListButtons (buttons) {
  var itemTemplate = "";
  for (var x = 0; x < buttons.length; x++) {
    if (buttons[x]) {
      var href, onclick, icon, title;
      (buttons[x].href == "undefined" ? href = "#" : href = buttons[x].href);
      (buttons[x].onclick == "undefined" ? onclick = "" : onclick = buttons[x].onclick);
      (buttons[x].icon == "undefined" ? icon = "" : icon = buttons[x].icon);
      (buttons[x].title == "undefined" ? title = "" : title = buttons[x].title);

      itemTemplate=itemTemplate+' <a href="' + href + '" onclick="' + onclick + '" class="miniButton ' + icon + '" title="' + title + '"><img src="/static/transparent.gif" alt="' + title + '"></a> ';
    }
  }
  return itemTemplate;
}

function renderVideoListFauxButtons (buttons) {
  var itemTemplate = "";
  for (var x = 0; x < buttons.length; x++) {
    if (buttons[x]) {
      var href, onclick, icon, title;
      (buttons[x].icon == "undefined" ? icon = "" : icon = buttons[x].icon);
      itemTemplate=itemTemplate+' <img alt="" class="' + icon + 'Faux" src="/static/transparent.gif"/> ';
    }
  }
  return itemTemplate;
}

////

var currentFunctionBoxItem=undefined;
 function functionBox(str,els) {
   var fbBrick=document.getElementById('function_box_expand_brick');
   var addEl=document.getElementById('function_box_expand_brick_add');
   if (currentFunctionBoxItem) {
     var el=addEl.firstChild;
     document.getElementById('function_box_container').appendChild(addEl.firstChild);
     currentFunctionBoxItem.overlay=undefined;
   }
   currentFunctionBoxItem=els;
   addEl.innerHTML=str;
   // XXX add in animation here later;
   fbBrick.style.display="block";
   return fbBrick;
 }


 function functionBarToggleShow(el,els,str) {
   if (el && els.container) {
     if(els.container.style.display=="block") {
       els.container.style.display="none";
     } else {
       els.container.style.display="block";
     }
   }
   if (!el && els.overlay) {
     if(els.overlay.style.display=="block") {
       els.overlay.style.display="none";
     } else {
       els.overlay.style.display="block";
     }
   } else {
     if (el) {
       if (els == currentFunctionBoxItem) {
         currentFunctionBoxItem.overlay=undefined;
       }
       els.container=el;
       var elInput=document.getElementById(''+str+'Input');
       elInput.style.display="block";
       el.appendChild(elInput);
     } else {
       els.overlay=functionBox('<div id="'+str+'Container"></div>',els);
       var elInput=document.getElementById(''+str+'Input');
       elInput.style.display="block";
       document.getElementById(''+str+'Container').appendChild(elInput);
     }
   }
 }


 function friendFormat(user,displayMood) {
   var gender="";
   var arr=[];
   if(user.gender=="MALE"||user.gender=="Male"){gender="Male";}
   if(user.gender=="FEMALE"||user.gender=="Female"){gender="Female";}
   var age=(user.age&&user.age!=-1?user.age:"");
   var mood=(user.mood?"<br/><em>"+escapeHTML(user.mood)+"</em>":"");
   var country=user.country;
   if(gender!=""){arr.push(gender);}
   if(age!=""){arr.push(age);}
   if(country&&country!=""){arr.push(country);}
   var str=arr.join(', ');
   if(mood!=""&&displayMood){str=str+mood;}
   return str;
 }

function removeFromPlaylist(publicId,el) {
  if (!publicId) {
    errorOrNote(publicId,"Failed to remove from My Queue","");
  }
  jsonRequest('/api/playlist/remove?publicId=' + publicId + '&json_function=handleRemoveFromPlaylist');
  return false;
}

function handleRemoveFromPlaylist(response){
  errorOrNote(response.success,"Failed to remove from My Queue",(response.entry) ? "Removed "+escapeHTML(response.entry.title)+" from My Queue" : "Removed video/channel from My Queue");
  if(response.success) {
    if(window.AddedVideo && AddedVideo.preventDouble['playlist'][response.entry.publicId]) {
        AddedVideo.preventDouble['playlist'][response.entry.publicId]=false;
    }
    var el=byid('metaConsoleAddToQueue');
    if(el) {
        turnIntoAddPlaylistButton(el,response.entry.publicId);
    }
  }
  if(Loader) {
    Loader.clearZapper("playlist");
  }
}

function turnIntoAddPlaylistButton(el,publicId) {
  if (el) {
    if(!MetaConsole) {
        if(publicId != Page.publicId)
        return;
    } else if(publicId != MetaConsole.current.publicId) {
        return;
    }
      
    el.title="Add to My Queue";
    el.className=el.className.replace("miniButtonQueueRemove","miniButtonQueueAdd");
    el.firstChild.alt="Add to My Queue";
    el.lastChild.innerHTML = "Add to My Queue";
    el.onclick=function() {
      addEntryToList('playlist',publicId, this); return false;
    }
  }
}

function removeFromFavorites(publicId,el) {
  if (!publicId) {
    errorOrNote(publicId,"Failed to remove from favorites","");
  }
  jsonRequest('/api/favorites/remove?publicId=' + publicId + '&json_function=handleRemoveFromFavorites');
  return false;
}


function handleRemoveFromFavorites(response){
  errorOrNote(response.success,"Failed to remove from favorites",(response.entry) ? "Removed "+escapeHTML(response.entry.title)+" from favorites" : "Removed video/channel from favorites");
  if(window.Favorites && response.entry){
    //update faves
    Favorites.hide(response.entry.publicId);
  } 
  if(response.success) {
    if(window.AddedVideo && AddedVideo.preventDouble['favorites'][response.entry.publicId]) {
          AddedVideo.preventDouble['favorites'][response.entry.publicId]=false;
    }
    var el=byid('metaConsoleAddToFavorites');
    if(el) { 
        turnIntoAddButton(el,response.entry.publicId);
    }
    var el2=byid('video_'+response.entry.publicId+'_front');
    if(el2) {
        removeNode(el2);
    }
  }
  if(Loader) {
    Loader.clearZapper("favorites");
  }
   
  if(window.Page && Page.pageType=="favorites" && response.success && response.entry) {
    var listViewThumbs = byid('listViewThumbs');
    if(listViewThumbs && listViewThumbs != '') {
        var url = '/api/favorites/getfans/'+ response.entry.publicId +'/?json_function=updateFansList';
        jsonRequest(url);
    }
  }
}

function turnIntoAddButton(el,publicId) {
  if (el) {
    if(!MetaConsole) {
        if(publicId != Page.publicId)
        return;
    } else if(publicId != MetaConsole.current.publicId) {
        return;
    }
    
    el.title="Add to Favorites";
    el.className=el.className.replace("miniButtonQueueRemove","miniButtonAddToFavorites");
    el.firstChild.alt="Add to Favorites";
    el.lastChild.innerHTML = "Add to Favorites";
    el.onclick=function() {
      addEntryToList('favorites',publicId,this); return false;
    }
  }
}

function removeFromSubscriptions(publicId,el) {
  if (!publicId) {
    errorOrNote(publicId,"Failed to remove from subscriptions","");
  }
  jsonRequest('/api/subscriptions/remove/' + publicId + '/?json_function=handleRemoveFromSubscriptions');
  //turnIntoAddButton(el,publicId);
  return false;
}


function handleRemoveFromSubscriptions(response){
  errorOrNote(response.success,"Failed to remove from subscriptions",(response.body) ? "Removed "+escapeHTML(response.body.channel.title)+" from subscriptions" : "Removed video/channel from subscriptions");
  if(window.Subscriptions && response.body){
    //update Subscriptions
    Subscriptions.hide(response.body.channel.publicId);
  }
}


function getAvatar(friend, size) {
  if(friend.profileImage) {
    return friend.profileImage;
  } else {
    if (size) {
      var imageTail = (size == 'large') ? '_120x92.jpg' : '_56x42.jpg';
    } else {
      var imageTail = '_120x92.jpg';
    }
    if (friend.gender && friend.gender!= "") {
      return (friend.gender.toLowerCase() == 'male') ? '/static/joost_male'+imageTail : '/static/joost_female'+imageTail;
    }
  }
  return '/static/joost_generic'+imageTail;
};


function errorOrNote(success,error,note){
  if(!success) {
    document.getElementById('blockTopErrorContainer').innerHTML=error;
    document.getElementById('blockTopError').style.display='block';
    document.getElementById('blockTopNotification').style.display='none';
    setTimeout(function(){
      document.getElementById('blockTopError').style.display='none';
    }, 10000);
    return;
  }
  document.getElementById('blockTopNotificationContainer').innerHTML='<p>' + note + '</p>';
  document.getElementById('blockTopNotification').style.display='block';
  setTimeout(function(){
    document.getElementById('blockTopNotification').style.display='none';
  }, 10000);

};

// transform a string so that it can be inserted in a semantic URL
function semanticURLize(publicId,title) {
  //  return "/"+publicId+"/t/"+encodeURIComponent(title.replace(/[\[\]\s\"\.\/,:/?#@|]/g,'-').replace(/--+/g,'-').replace(/^-|-$/g,''));
  return "/"+publicId+"/t/"+encodeURIComponent(title.replace(/[^A-Za-z0-9_]/g,'-').replace(/--+/g,'-').replace(/^-|-$/g,''));

}

function normalize(groupName){
  groupName=escape((groupName+'').replace(/\s+/gim, "_"));
//  groupName=(groupName+'').replace(/\s+/gim, "_");
//  groupName=(groupName+'').replace(/\W/gim,"_");
  return groupName;
};

var brickFlippedScrollTimer;

function brickFlippedScroll(id, dir) {
  if(document.getElementById(id)) {
    document.getElementById(id).scrollTop = document.getElementById(id).scrollTop + (dir * 3);
    brickFlippedScrollTimer = setTimeout("brickFlippedScroll('" + id + "', " + dir + ");", 50);
  }
}

function brickFlippedStopScroll() {
  clearTimeout (brickFlippedScrollTimer);
}

function brickFlippedInitScroll(id) {
  if (document.getElementById("sb_" + id) && document.getElementById("sd_" + id)) {
    document.getElementById("sd_" + id).scrollTop = 0;
    if(document.getElementById("sd_" + id).scrollHeight > 85) {
      document.getElementById("sb_" + id).style.display = "block";
    }
  }
}

function brickFlippedFlip(id, flipTo) {
  if (document.getElementById("video_" + id + "_front") && document.getElementById("video_" + id + "_back")) {
    document.getElementById("video_" + id + "_front").style.display = "none";
    document.getElementById("video_" + id + "_back").style.display = "none";
    document.getElementById("video_" + id + "_" + flipTo).style.display = "block";
  }
  brickFlippedInitScroll(id);
}

function changeAvatar(type,containerId, id){
  if(window.AvatarEditor){
    AvatarEditor.show(type, containerId, id);
    return;
  }
  var containerHTML = document.getElementById(containerId).innerHTML;
  document.getElementById(containerId).innerHTML = '<p><img alt="" src="/static/big-loader.gif"/></p>';
  //calback when changeAvatar code is loaded
  window.avatarEditorLoaded = function() {
    document.getElementById(containerId).innerHTML = containerHTML;
    AvatarEditor.show(type, containerId, id);
  }
  jsonRequest('/js-packets/avatarEditor.js');
};

function removeAvatar(type,containerId, id) {
  if(window.AvatarRemove){
    AvatarRemove.show(type, containerId, id);
    return;
  }
  var containerHTML = document.getElementById(containerId).innerHTML;
  document.getElementById(containerId).innerHTML = '<p><img alt="" src="/static/big-loader.gif"/></p>';
  //calback when changeAvatar code is loaded
  window.avatarRemoveLoaded = function() {
    document.getElementById(containerId).innerHTML = containerHTML;
    AvatarRemove.show(type, containerId, id);
  }
  jsonRequest('/js-packets/avatarRemove.js');
}

function fixPNG() {
  if (navigator.appVersion.indexOf("MSIE") > -1) {
    var version = parseFloat(navigator.appVersion.split("MSIE")[1])
    if ((version >= 5.5) && (version < 7) && (document.body.filters)) {
      for(var i = 0; i < document.images.length; i++) {
        var img = document.images[i];
        if (img.rel && img.rel.indexOf("png") > -1) {
          var imgID = (img.id) ? "id='" + img.id + "' " : "";
          var imgClass = (img.className) ? "class='" + img.className + "' " : "";
          var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' ";
          var imgStyle = "";
          if (img.onload) { img.style.visibility = 'visible'; }
          if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle;
          var strNewHTML = "<img src=\"/static/transparent.gif\" " + imgID + imgClass + imgTitle
          + " style=\"" + "width:" + img.width + "px; visibility: " + img.style.visibility + "; height:" + img.height + "px;" + imgStyle + ";"
          + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
          + "(src=\'" + img.src + "\', sizingMethod='scale');\"/>";
          img.outerHTML = strNewHTML;
          i = i - 1;
        }
      }
    }
  }
}

function getCookie(name) {
  name = name + "=";
  var begin = document.cookie.indexOf("; " + name);
  if (begin == -1) {
    begin = document.cookie.indexOf(name);
    if (begin != 0) return null;
  }
  else {
    begin += 2;
  }
  var end = document.cookie.indexOf(";", begin);
  if (end == -1) {
    end = document.cookie.length;
  }
  return unescape(document.cookie.substring(begin + name.length, end));
}

// This piece of FacebookConnect script is placed here termporary
var FacebookConnect = {
  status: "",
  fbintval: null,
  postConnectResp: function(obj) {
    if(obj.success){
      var proptab = obj.proposal.replace(new RegExp(/^\[+/),"").replace(new RegExp(/\]+$/),"");
      proptab = proptab.split(',');
      if (obj.newbe) {
        analyticsTrackEvent2('facebook', 'selectaname', 'required');
        User.loginFbShow(proptab,obj.fbemail);
      } else {
        analyticsTrackEvent2('facebook', 'selectaname', 'notrequired');
        if(typeof Page == 'object' && Page.publicId && Page.publicId != "") {
          window.location="/?playNow="+Page.publicId;    
        } else {
          window.location='/';
        }
      }
    } else {
      analyticsTrackEvent2('facebook', 'selectaname', 'postconnect-failed');
    }
  },

  createIdentity: function () {
    analyticsTrackEvent2('facebook', 'create', 'create-identity');
    jsonRequest("/api/connect/facebook/addFacebook?json_function=FacebookConnect.createIdentityResp");
  },

  createIdentityResp: function(obj) {
    if(obj && obj.success){
      analyticsTrackEvent2('facebook', 'create', 'identity-created');
      window.location="/users/me/general/fb/";
    } else {
      analyticsTrackEvent2('facebook', 'create', 'created-failed');
      alert(obj.message);
    }
  },

  stopInterval: function() {
    if(FacebookConnect.fbintval) window.clearInterval(FacebookConnect.fbintval);
    FacebookConnect.fbintval = null;
  },
  startInterval: function() {
    FacebookConnect.fbintval = window.setInterval(hideFBoverlay, 10);
  }
};

 try {
   if (window.FBFunction) {
     var startFBConnect = FBFunction(function(callback) {
       User.hideOver('register');
       // defer the action to take until the session comes online
       FB.Facebook.get_sessionWaitable().waitUntilReady(callback);
       checkFBConnect();
       if(FacebookConnect.status == 'NOAPP'){
         showFBoverlay();
         FB.Connect.requireSession();
         FacebookConnect.startInterval();
       } else if (FacebookConnect.status == 'NOTLOGGEDIN') {
         FB.Connect.requireSession();
       }
     });
     FacebookConnect.postConnect=FBFunction(function(callback) {
                                              jsonRequest("/api/connect/facebook/postConnect?json_function=FacebookConnect.postConnectResp");
                                            }, function(){return false;}, 1000);
   }
 } catch (e) {
   }

function showFBoverlay() {
  if (!document.getElementById('fbchecker')) {
    var checker = document.createElement('div');
    checker.setAttribute('id','fbchecker');
    document.body.appendChild(checker);
  }
}

function hideFBoverlay() {
  var el = byid("fbchecker");
  elemFB = el && el.nextSibling && el.nextSibling.hasChildNodes();
  if(!elemFB){
    el.parentNode.removeChild(el)
    hideLightbox();
    FacebookConnect.stopInterval();
  } else {
    if (!LightboxShowing) {
      showLightbox();
    }
  }
}

function checkFBConnect() {
  if(! (window.FB && window.FB.Connect) ) {
    FacebookConnect.status = "UNAVAILABLE";
    return;
  }
  var status = FB.Connect.get_status().result;
  var fbStatus;
  if(status == FB.ConnectState.connected) {
    fbStatus = "CONNECTED";
  } else if(status == FB.ConnectState.appNotAuthorized) {
    fbStatus = "NOAPP";
  } else if (status == FB.ConnectState.userNotLoggedIn) {
    fbStatus = "NOTLOGGEDIN";
  } else {
    fbStatus = "NOTLOGGEDIN";
  }
  FacebookConnect.status = fbStatus;
}

function changeToFallback(img, src) {
  img.onerror=null;
  img.removeAttribute('onerror');
  img.src=src;
}

window.reqfriend = {};
window.reqfriendCount = 0;
function requestFriend(joostName, btnEl){
  var addNoteEl = document.createElement('p');
  addNoteEl.innerHTML = "Sending...";
  btnEl.parentNode.replaceChild(addNoteEl, btnEl);
  
  window.reqfriend['load' + window.reqfriendCount] = function(r) {
    if(r.success) {
      addNoteEl.innerHTML = "Request Sent!";
    } else if (r.resultCode == 8005){
      addNoteEl.innerHTML = "Request pending!";
    } else {
      addNoteEl.innerHTML = "Failed: Try again later!";
    }
  }
  jsonRequest("/api/friends/add/" + joostName + "?json_function=reqfriend.load" + window.reqfriendCount++);
}

function updateMetaconsoleBtns(publicId, list, icoply) {
    if(!MetaConsole) {
        if(publicId != Page.publicId)
        return;
    } else if(publicId != MetaConsole.current.publicId) {
        return;
    }
    var btnLabel = (list=='playlist') ? 'Remove from My Queue' : 'Remove from Favorites';
    
    icoply.className = ("miniButton miniButtonQueueRemove16");
    if(list=='playlist') {
        icoply.onclick = function() {removeFromPlaylist(publicId,this);return false};
    } else {
        icoply.onclick = function() {removeFromFavorites(publicId,this);return false};
    }
    icoply.title=btnLabel;
    var span=icoply.getElementsByTagName('span')[0];
    setHtml(span, btnLabel);
}


function changeInputType(
  oldElm, 
  iType, 
  iValue, 
  blankValue, 
  noFocus) {
  if(!oldElm || !oldElm.parentNode || (iType.length<4) || 
    !document.getElementById || !document.createElement) return;
  var isMSIE=/*@cc_on!@*/false; 
  if(!isMSIE){
    var newElm=document.createElement('input');
    newElm.type=iType;
  } else {
    var newElm=document.createElement('span');
    newElm.innerHTML='<input type="'+iType+'" name="'+oldElm.name+'">';
    newElm=newElm.firstChild;
  }
  var props=['name','id','className','size','tabIndex','accessKey'];
  for(var i=0,l=props.length;i<l;i++){
    if(oldElm[props[i]]) newElm[props[i]]=oldElm[props[i]];
  }
  newElm.onfocus=function(){return function(){
    if(this.hasFocus) return;
    var newElm=changeInputType(this,'password',iValue,
      (this.value.toLowerCase()==iValue.toLowerCase())?true:false);
    if(newElm) newElm.hasFocus=true;
    newElm.value='';
  }}();
  newElm.onblur=function(){return function(){
    if(this.hasFocus)
    if(this.value=='' || (this.value.toLowerCase()==iValue.toLowerCase())) {
      changeInputType(this,'text',iValue,false,true);
    }
    Register.matchPasswords(this,'passwordconfirm')
  }}();
  newElm.hasFocus=false;
  if(!blankValue) newElm.value=iValue;
  oldElm.parentNode.replaceChild(newElm,oldElm);
  if(!isMSIE && !blankValue) newElm.value=iValue;
  if(!noFocus || typeof(noFocus)=='undefined') {
    window.tempElm=newElm;
    setTimeout("tempElm.hasFocus=true;tempElm.focus();",1);
  }
  return newElm;
}


 if (window.User_Details && window.User_Details.registration) {
   RegistrationService=window.User_Details.registration.service;
   RegistrationAnalytic=window.User_Details.registration.analytic;
 } else {
   RegistrationService="/registration";
   RegistrationAnalytic="";
 }

 window.autoPlayAllowed=true;

 if (window.User_Details && window.User_Details.loginDisabled) {
  window.LoginDisabled=true;
 } else {
  window.LoginDisabled=false;
 }
 
FacebookConnect.active = "YES";

var User={ loggedIn: undefined, onlogin: [], overlay: null, callback:null, registerDiv: undefined, loginDiv: undefined, confirmed: undefined, interact: undefined, overlayConfirm : undefined,
           loggedInStr:"<div id='hasUser' class='userNavigationInfoDisplay'><ul><li class='first'>Hello, <a id='username' href='/users/%j/'><span>%u</span></a> <span id='usernamefbconnect'></span></li><li><span id='settings'><a href='/users/%j/general/'>Settings</a></span></li><li><span><a id='lnklogout' href='/logout'>Logout</a></span></li></ul></div>",
           loggedInFbConnectStr:' <a class="fb-login"' +
                'onclick="analyticsTrackEvent2(\'facebook\',\'login\',\'loggedin\');' + 'startFBConnect(FacebookConnect.%fcon); return false;" ' +
                'href="#"><span>Connect with Facebook</span></a>',
           loggedInFbProfileStr:' <a class="fb-profile" href="http://www.facebook.com/profile.php?id=%fbid"><img src="/static/facebook-profile.gif"/></a>',
           notLoggedInStr:"<div id='notHasUser' class='userNavigationInfoDisplay'><ul><li class='first'><span><a href='/login#register' onclick='User.Register();return false;'>Sign up</a></span></li><li><span><a href='/login#login' onclick='User.loginTopBar();return false;'>Login</a></span></li>%{fbcon}</ul></div>",
           loginDisabledStr:'<div class="payoff"></div><div class="overlayClose">' +
                        '<a title="close" class="miniButton miniButtonOverlayClose" onclick="User.hideOver(\'login\');return false;" href="#"><img alt="close" src="/static/transparent.gif"/></a>' +
                      '</div> ' +
                      '<div class="brick brickB4"> ' +
                        '<div class="outerPadding">' +
                          '<div class="outerBorder">' +
                            '<div class="innerBorder">' +
                              '<div class="innerPadding">' +
                                '<div class="brickForm">' +
                                  '<div class="content">' +
                                        '<div class="row">' +
                                          '<h1>Login Disabled</h1>' +
                                        '</div>' +
                                        '<div class="row">' +
                                        '<p>Joost is undergoing some maintenance and Login and Registration are currently disabled.  You can continue to watch, but our great social features are unavailable.</p>' +
                                        '</div>' +
                                        '<div class="break"></div>' +
                                  '</div>' +
                                '</div>' +
                                '<div>' +
                                  '<img src="/static/overlay-logo.gif" alt="Joost" class="overlayLogo" />' +
                                  '<div class="break"></div>' +
                                '</div>' +
                              '</div>' +
                            '</div>' +
                          '</div>' +
                        '</div>' +
                      '</div>',
           loginFbBoxStr:'<div class="payoff"><div class="pad01">' +
                           '<h1 title="You have been successfully authenticated by Facebook">You have been successfully authenticated by <img src="/static/facebook-authenticated.png" style="margin: 10px 0 0 0;" /></h1>' +
                         '</div><div class="overlayClose">' +
                        '<a title="close" class="miniButton miniButtonOverlayClose" onclick="analyticsTrackEvent2(\'facebook\', \'selectaname\', \'close\'); User.doFbLogin(\'%f1\',\'%e\');return false;" href="#"><img alt="close" src="/static/transparent.gif"/></a>' +
                      '</div></div>' +
                      '<div class="brick brickB4"> ' +
                        '<div class="outerPadding">' +
                          '<div class="outerBorder">' +
                            '<div class="innerBorder">' +
                              '<div class="innerPadding">' +
                                '<div class="brickForm">' +
                                  '<div class="content" id="regFBcontent">' +
                                    '<form action="/login" id="regfb_form" onsubmit="analyticsTrackEvent2(\'facebook\', \'selectaname\', \'create\'); User.doFbLogin(\'%f1\',\'%e\'); return false">' +
                                      '<fieldset class="big">' +
                                        '<div class="row">' +
                                          '<div class="description">' +                                            
                                            '<div class="content"><p><strong>%f1</strong> is your new Joost Name.</p>' +
                                            '<div class="pad"><p>Now you can:</p>' +
                                            '<ul>' +
                                              '<li>Share videos with friends</li>' +
                                              '<li>Save and favorite cool videos</li>' +
                                              '<li>Leave comments</li>' +
                                              '<li>Join groups and more.</li>' +
                                            '</ul>' +
                                          '</div>' +
                                          '<p><input type="submit" class="inputSubmit" value="Start watching" /></p>' +
                                        '</div>' +
                                        '<div class="row buttons">' +
                                          '<div class="label"></div>' +
                                          '<div class="input">' +
                                            '<p><a href="#" onclick="User.doMergeFbLogin(\'%f1\',\'%e\')">' + 
                                            'Do you already have a Joost Name? Use your existing Joost Name instead</a>.</p>' +
                                          '</div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                      '</fieldset>' +
                                    '</form>' +
                                  '</div>' +
                                '</div>' +
                              '</div>' +
                            '</div>' +
                          '</div>' +
                        '</div>' +
                      '</div>',
           loginMergeFBform:'<form action="/login" id="login_form" onsubmit="User.doFbMerge(); return false">' +
                                      '<fieldset class="big">' +
                                        '<div class="row">' +
                                          '<div class="description">' +                                            
                                            '<p>Enter your Joost Name and password you want to associate with your Facebook Account</p>' +
                                          '</div>' +
                                        '</div>' +
                                        '<div class="row">' +
                                          '<div class="label">' +
                                            '<label for="username">Joost Name (or email)</label>' +
                                          '</div>' +
                                          '<div class="input"><input type="text" class="inputText" name="username" id="username" /></div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                        '<div class="row">' +
                                          '<div class="label"><label for="password">Password</label></div>' +
                                          '<div class="input"><input type="password" class="inputText" name="password" id="password" /></div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                        '<div><div class="row error" style="display:none" id="login_error_message_container">' +
                                          '<div class="label"></div>' +
                                          '<div class="warning" style="width:200px"><p id="login_error_message"></p></div>' +
                                          '<div class="break"></div>' +
                                        '</div></div>' +
                                        '<div class="row buttons">' +
                                          '<div class="label"></div>' +
                                          '<div class="input">' +
                                            '<input type="submit" class="inputSubmit" value="Submit" > ' +
                                          '</div>' +
                                        '</div>' +
                                        '<div class="row">' +
                                          '<div class="label"></div>' +
                                          '<div class="input">' +
                                            '<p><a onclick="User.doFbLogin(\'%f1\',\'%e\');return false;" href="#">I do not have an existing Joost Name</a></p>' +
                                            '<p><a href="/forgot/">Forgot my password</a></p>' +
                                          '</div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                      '</fieldset>' +
                                    '</form>',
           confirmBoxStr:'<div class="payoff"></div><div class="overlayClose">' +
                          '<a title="close" class="miniButton miniButtonOverlayClose" onclick="User.hideConfirm();return false;" href="#"><img alt="close" src="/static/transparent.gif"/></a>' +
                        '</div> ' +
                        '<div id="confirm_prompt_html" class="loginPrompt">' +
                          '<h1>Confirm</h1>' +
                        '</div>' +
                        '<div class="brick brickB4"> ' +
                          '<div class="outerPadding">' +
                            '<div class="outerBorder">' +
                              '<div class="innerBorder">' +
                                '<div class="innerPadding">' +
                                  '<div class="brickForm">' +
                                    '<div class="content">' +
                                      '<form onsubmit="return false">' +
                                        '<fieldset class="big">' +
                                          '<div class="row ">' +
                                            '<div class="label"></div>' +
                                            '<div class="description">' +
                                              '<p>Please confirm your email address with the link in the email. If you\'ve not got the email, we can send you another email.</p>' +
                                            '</div>' +
                                          '</div>' +
                                          '<div class="row buttons">' +
                                            '<div class="label"></div>' +
                                            '<div class="input">' +
                                              '<input type="button" class="inputSubmit" value="Send another email" onclick="User.sendConfirmationEmail(this); return false;">' +
                                            '</div><br /><br /><br /><br />' +
                                          '</div>' +
                                        '</fieldset>' +
                                      '</form>' +
                                    '</div>' +
                                  '</div>' +
                                '</div>' +
                              '</div>' +
                            '</div>' +
                          '</div>' +
                        '</div>',
loginProvider:'http://www.joost.com/auth/Validate?json_function=User.loginResult&username=%j&password=%p',
loginFBMergeProvider:'http://www.joost.com/auth/MergeFBuser?json_function=User.loginResult&username=%j&password=%p',
           detailsProvider:'http://www.joost.com/auth/Userdata?json_function=User.userRefresh',
           confirmationEmailProvider:'/api/sendConfirmation?json_function=User.sendConfirm',
           confirmationProvider:'/api/doConfirmation?json_function=User.confirmResult&pin=%p',
           regFbProvider:'http://www.joost.com/auth/RegFBuser?json_function=User.loginResultSelectaname&username=%j&fbemail=%e'
 };

User.loginTopBar=function() {
  User.callback=null;
  if (window.Page && Page.Login) {
    User.callback=Page.Login;
  }
  User.promptForLogin('',null);
};

User.login=function() {
};

User.loginShow=function() {
  //User.cancelRegister();
  if (window.LoginDisabled) {
    if (window.analyticsTrackEvent) {
      analyticsTrackEvent("login/open/disabled");
    }
    if (User.overlay) {
      showLightbox();
      User.overlay.style.display="block";
    } else {
      User.overlay=createOverlay(User.loginDisabledStr,{center:true,vBias:6});
    }
    return;
  }
  var fbconstr = '<div class="row buttons"><p>Login with your Facebook Account</p><p><a class="fb-connect" href="#" onclick="analyticsTrackEvent2(\'facebook\', \'login\', \'loginlightbox\'); startFBConnect(FacebookConnect.postConnect); return false;"><img width="169" height="20" id="fb_login_image" src="/static/facebook-connect-medium-long.gif" alt="Connect with Facebook"/></a></p><div class="break"></div></div>';

  var logfbstr = Register.showMultiForm();

if(FacebookConnect.active != 'NO'){  
  var displayFacebookConnect = FBFunction(function () {
        logfbstr = logfbstr.replace(/%\{fbcon\}/gim,fbconstr);
  }, function(){
        logfbstr = logfbstr.replace(/%\{fbcon\}/gim,"");
  },0);
  displayFacebookConnect();
} else {
    logfbstr = logfbstr.replace(/%\{fbcon\}/gim,"");
}
  if (window.analyticsTrackEvent) {
    analyticsTrackEvent("login/open");
  }
  if (User.registerDiv) {
    showLightbox();
    User.registerDiv.style.display="block";
  } else {
    User.registerDiv=createOverlay(logfbstr,{center:true,vBias:6});
  }
  if (window.Page && Page.Login) {
    User.callback=Page.Login;
  }
  var el=document.getElementById("username");if(el) {el.focus();}

  User.switchLabels();
};

User.confirm=function() {
  if (User.overlayConfirm) {
    showLightbox();
    User.overlayConfirm.style.display="block";
  } else {
    User.overlayConfirm=createOverlay(User.confirmBoxStr,{center:true,vBias:6});
  }
  
  var el=document.getElementById("confirm");if(el) {el.focus();}
};

User.sendConfirmationEmail=function(ref,link) {
  if (ref.getAttribute('id') === 'confirmation_link') {
    ref.innerHTML="sending..";
  } else {
    ref.value="Sending...";
  }
  User.confirmationRef=ref;
  jsonRequest(User.confirmationEmailProvider);
};

User.sendConfirm=function(obj) {
  if (obj.success) {
    var el=User.confirmationRef;
    if (el) {
      el.onclick=function() {return false};
      if(el.getAttribute('id') === 'confirmation_link') {
        el.innerHTML="sent"
      } else {
        el.value="Sent";
      }
    }
  } else {
    document.getElementById("confirmation_link").innerHTML="Error";
  }
};

User.hideFBLogin=function() {
  if (User.overlay && User.overlay.parentNode) {
    User.overlay.parentNode.removeChild(User.overlay);
    hideLightbox();
    User.overlay=null;
  }
};

User.loginFbShow=function(prop,fbemail) {
  if (User.overlay && User.overlay.parentNode) {
    User.overlay.parentNode.removeChild(User.overlay);
    User.overlay=null;
  } else {
    showLightbox();
  }
  User.overlay=createOverlay(User.loginFbBoxStr.replace(/%f1/gim,prop[0]).replace(/%e/gim,fbemail),{center:true,vBias:6},'');
  for (var i=3;i>prop.length;i--) {
    var el=document.getElementById('usernamepro'+i);
    if (el) {
      el.parentNode.parentNode.style.display="none";
    }
  }
  if (window.Page && Page.Login) {
    User.callback=Page.Login;
  }
  if (window.analyticsTrackEvent) {
    analyticsTrackEvent("facebook/selectaname/open");
  }
};

User.doFbLogin=function(prop,fbmail) {
  var frm=document.forms['regfb_form'];
  var propuser = prop;
  var fbemail = fbmail;
  var msgContainer=document.getElementById('login_error_message_container');
  if (msgContainer) {
    msgContainer.style.display="none";
  }
  var url=User.regFbProvider.replace(/%j/gim,encodeURIComponent(propuser)).replace(/%e/gim,encodeURIComponent(fbemail));
  jsonRequest(url);
};

User.doMergeFbLogin=function(prop,fbmail) {
  var frm=byid('regFBcontent');
  frm.innerHTML = User.loginMergeFBform.replace(/%f1/gim,prop).replace(/%e/gim,fbmail);
};

User.hideOver=function(context) {
  if (User.registerDiv && User.registerDiv.parentNode) {
    User.registerDiv.parentNode.removeChild(User.registerDiv);
    hideLightbox();
    User.registerDiv=null;  
    if (window.analyticsTrackEvent) {
      analyticsTrackEvent(context+"/close");
    }
  }
};

User.hideConfirm=function() {
  if (User.overlayConfirm && User.overlayConfirm.parentNode) {
    User.overlayConfirm.parentNode.removeChild(User.overlayConfirm);
    hideLightbox();
    User.overlayConfirm=null;
  }
};

User.doLogin=function(type) {
  User.loggingInType=type;
  var frm=document.forms['login_form'];
  var joostid=frm.username.value;
  var password=frm.pswd.value;
  var msgContainer=document.getElementById('login_error_message_container');
  msgContainer.style.display="none";
  url=User.loginProvider.replace(/%j/gim,encodeURIComponent(joostid)).replace(/%p/gim,encodeURIComponent(password));
  jsonRequest(url);
};

User.doFbMerge=function(type) {
  User.loggingInType=type;
  var frm=document.forms['login_form'];
  var joostid=frm.username.value;
  var password=frm.password.value;
  var msgContainer=document.getElementById('login_error_message_container');
  msgContainer.style.display="none";
  url=User.loginFBMergeProvider.replace(/%j/gim,encodeURIComponent(joostid)).replace(/%p/gim,encodeURIComponent(password));
  jsonRequest(url);
};

User.doConfirm=function(id,pin) {
  if (id && pin) {
    User.confirmId=id;
  } else {
    var frm=document.forms['confirm_form'];
    var pin=frm.confirm.value;
  }
  var msgContainer=document.getElementById('confirm_error_message_container');
  if (msgContainer) {
    msgContainer.style.display="none";
  }
  url=User.confirmationProvider.replace(/%p/gim,encodeURIComponent(pin));
  jsonRequest(url);
};

User.getLoginError=function(obj) {
  if (obj.retcode==500) {
    var errorMessage="Uh oh ... we're having some difficulties. Please try again.";
  }
  else if (obj.retcode==107) {
    var errorMessage="Unfortunately this name is taken, try different.";
  }
  else if (obj.retcode==105) {
    var errorMessage="Please, type your user name.";
  }
  else {
    errorMessage="Sorry - that didn't work. Do you have the right username and password?";
  }
  return errorMessage;
};

User.errorMessage=function(errorMessage) {
  var msg=document.getElementById('login_error_message');
  if (msg) {
    msg.innerHTML = errorMessage;
  }
  var msgContainer=document.getElementById('login_error_message_container');
  if (msgContainer) {
    msgContainer.style.display="block";
  }
};

User.loginResultSelectaname=function(obj) {
  if (obj.success) {
    analyticsTrackEvent2("facebook", "selectaname", "failed-selectname");
  } else {
    analyticsTrackEvent2("facebook", "selectaname", "success-selectname");
  }
  User.loginResult(obj);
};

User.loginResult=function(obj) {
  if (User.loggingInType=="selectaname") {
    if (obj.success) {
      analyticsTrackEvent2("facebook", "selectaname", "failed-login");
    } else {
      analyticsTrackEvent2("facebook", "selectaname", "success-login");
    }
  }
  User.loggingInType=undefined;
  if (!obj.success) {
    User.errorMessage(User.getLoginError(obj));
    if (window.analyticsTrackEvent) {
        analyticsTrackEvent("login/error");
    }
  } else {
    if ((''+document.cookie).indexOf("NewProdAuthCookie")<0) {
      User.errorMessage("You must have cookies enabled in order to use Joost.");
      if (window.analyticsTrackEvent) {
        analyticsTrackEvent("login/error");
      }
      return;
    }
    if (User.overlay) {
      User.overlay.parentNode.removeChild(User.overlay);
      hideLightbox();
      User.overlay=null;
    }
    if (window.analyticsTrackEvent) {
        analyticsTrackEvent("login/success");
    }
    User.loggedIn=true;
    User.confirmed=undefined;
    User.interact=undefined;
    if(obj.retcode == '202') {
      User.callback=Page.Login=function() {
        location='/users/me/general/fb/';
      };
    }
    jsonRequest(User.detailsProvider);
  }
}

User.confirmResult=function(obj) {
  if (!obj.success) {
    var msg=document.getElementById('confirm_error_message');
    if (msg) {
      msg.innerHTML=escapeHTML(obj.message);
    }
    var msgContainer=document.getElementById('confirm_error_message_container');
    if (msgContainer) {
      msgContainer.style.display="block";
    }
    if (!msg && !msgContainer) {
      errorOrNote(false,obj.message,"");
    }
  } else {
    if (User.overlayConfirm) {
      User.overlayConfirm.parentNode.removeChild(User.overlayConfirm);
    }
    hideLightbox();
    User.overlayConfirm=null;

    User.confirmed=true;
    User.interact=true;
    if (User.callback) {
      User.callback();
      User.callback=null;
    }
    var el=document.getElementById(User.confirmId);
    if (el) {
      errorOrNote(true,"","eMail confirmed");
      el.style.display="none";
    }
  }
};

User.userRefresh=function(obj) {
  if (obj.joostName) {
    window.User_Details=obj;
    var done=false;
    if (User.callback) {
      User.callback();
      User.callback=null;
      done=true;
    }
    for (var i=0;i<User.onlogin.length;i++) {
      try {
        User.onlogin[i]()
        done=true;
      } catch (e) {
        done=false;
      };
    }
    User.updateLoginArea();
    if (!done) {
      // hide the login, it was a successful log in.
      if (User.registerDiv) {
        User.registerDiv.style.display="none";
        hideLightbox();
      }
    }
  } else {
    User.loggedIn=false;
  }
};

User.updateLoginArea=function() {
  var headNav=document.getElementById('headerUserNavigation');
  if (window.LoginDisabled) {
    User.loggedIn=false;
    User.confirmed=undefined;
    User.interact=undefined;
    return;
  }
  if (window.User_Details && User_Details.joostName) {
    User.loggedIn=true;
    User.confirmed=(User_Details.status=="CONFIRMED");
    User.interact=User_Details.interact;
    var joostid=User_Details.joostName;    
    var username=User_Details.userName;
    var loggedInStr=User.loggedInStr.replace(/%j/gim,escapeHTML(joostid));
    loggedInStr=loggedInStr.replace(/%u/gim,escapeHTML(username));

    if (headNav) {
      headNav.innerHTML=loggedInStr;
    }

   if(FacebookConnect.active != 'NO'){
      // if connected with FB
      var displayFacebookConnect = FBFunction(function () {
    
        var usernamefbconnect = document.getElementById('usernamefbconnect');
        var fblink;

        var onFBConnected = function() {
        if(window.User_Details && User_Details.fbid && User_Details.fbid != 'undefined') {
            fblink = User.loggedInFbProfileStr.replace(/%fbid/gim,User_Details.fbid);
            var fblogout = document.getElementById('lnklogout');
            fblogout.href="#";
            fblogout.onclick = logoutFromFB;
        } else {
            fblink = User.loggedInFbConnectStr.replace(/%fcon/gim,'createIdentity');;
        }
        usernamefbconnect.innerHTML = fblink;        
        }

        var onFBNotConnected = function() {
        if(window.User_Details && User_Details.fbid && User_Details.fbid != 'undefined') {
            fblink = User.loggedInFbConnectStr.replace(/%fcon/gim,'postConnect');
        } else {
            fblink = User.loggedInFbConnectStr.replace(/%fcon/gim,'createIdentity');
        }
        usernamefbconnect.innerHTML = fblink;
        }
        if (window.FB && FB.Connect) {
        
            FB.Connect.ifUserConnected(onFBConnected, onFBNotConnected) 
        }
    },function(){return false;},0);
    displayFacebookConnect();
   } else {
     var usernamefbconnect = document.getElementById('usernamefbconnect');
     usernamefbconnect.innerHTML = "";
   }
   
   var jgroup = byid('joinGroup');
   if(jgroup) jgroup.style.display = "block";
   
   var descGroup = byid('groupDescMsg');
   if(descGroup) descGroup.innerHTML="";

  } else {
    if (window.Page && Page.loggedInOnly) {
      location.replace('/login');
    } 
    User.loggedIn=false;
    User.confirmed=false;
    User.interact=false;
    var strHeader = User.notLoggedInStr;
    var fbconstr = "<li><a href='#' class='fb-login' onclick='analyticsTrackEvent2(\"facebook\", \"login\", \"merge\"); startFBConnect(FacebookConnect.postConnect); return false;'><span>Login using Facebook</span></a></li>";
    strHeader = User.notLoggedInStr.replace(/%\{fbcon\}/gim,fbconstr);
    // check if FB Connect response then change header
    if (window.FB && FB.Connect) {
        var displayFacebookConnect = FBFunction( function(){return false;}, function(){strHeader = User.notLoggedInStr.replace(/%\{fbcon\}/gim,"");}, 1000);
        displayFacebookConnect();
    }
    if (headNav) {
      headNav.innerHTML=strHeader;
    }
    
    var jgroup = byid('joinGroup');
    if(jgroup) jgroup.style.display = 'none';
    var descGroup = byid('groupDescMsg');
    if(descGroup) descGroup.style.display = 'block';
  }
};

if (window.User_Details && User_Details.joostName && window.Page && Page.AlreadyLoggedIn) {
  Page.AlreadyLoggedIn();
}
User.updateLoginArea();

User.promptForLogin=function(promptHTML, callback) {
  if (callback) {
    User.callback=callback;
  }
  User.loginShow();
  var promptEl=document.getElementById('login_prompt_html');
  if (promptEl) {
    promptEl.innerHTML=promptHTML;
  }
};

User.promptForConfirmation=function(promptHTML, callback) {
  User.callback=callback;
  User.confirm();
  var promptEl=document.getElementById('confirm_prompt_html');
  if (promptEl) {
    promptEl.innerHTML=promptHTML;
  }
};

User.promptForRegister=function(promptHTML, callback) {
  if (callback) {
    User.callback=callback;
  }
  User.RegisterCallBack=function(doc) {
    var el=doc.getElementById('register_prompt_html');
    if (promptEl) {
      el.innerHTML=promptHTML;
    }
  };
  User.Register();
};

User.Register=function(callback) {
  User.hideOver('login');
  if (window.LoginDisabled) {
    if (window.analyticsTrackEvent) {
      analyticsTrackEvent("registration/open/disabled");
    }
    if (User.overlay) {
      showLightbox();
      User.overlay.style.display="block";
    } else {
      User.overlay=createOverlay(User.loginDisabledStr,{center:true,vBias:6});
    }
    return;
  }
  
  if (window.analyticsTrackEvent) {
      analyticsTrackEvent("registration/open");
  }
  
  if (callback) {
    User.callback=callback;
  } else {
    if (window.Page && Page.Register) {
      User.callback=Page.Register;
    }
  }
  
  var fbconstr = '<div class="break"></div><br/><div class="row buttons" style="font-size:11px;padding-left:20px"><p>Or login with your Facebook account</p><p><a class="fb-connect" href="#" onclick="analyticsTrackEvent2(\'facebook\', \'login\', \'loginlightbox\'); startFBConnect(FacebookConnect.postConnect); return false;"><img width="169" height="20" id="fb_login_image" src="/static/facebook-connect-medium-long.gif" alt="Connect with Facebook"/></a></p><div class="break"></div></div>';
  
  var logfbstr = Register.showRegForm();
if(FacebookConnect.active != 'NO'){   
  var displayFacebookConnect = FBFunction(function () {
        logfbstr = logfbstr.replace(/%\{fbcon\}/gim,fbconstr);
  }, function(){
        logfbstr = logfbstr.replace(/%\{fbcon\}/gim,"");
  },0);
  displayFacebookConnect();
} else {
    logfbstr = logfbstr.replace(/%\{fbcon\}/gim,"");
}
  if (User.registerDiv) {
    showLightbox();
    User.registerDiv.style.display="block";
  } else {
    User.registerDiv=createOverlay(logfbstr,{center:true,vBias:6});
  }
  User.switchLabels();
};

User.cancelRegister=function() {
  User.login=User.loginShow;
  if (Register.regFormTemplate && Register.regFormTemplate.parentNode) {
    Register.regFormTemplate.parentNode.removeChild(Register.regFormTemplate);
    hideLightbox();
    Register.regFormTemplate=null;
    if (window.analyticsTrackEvent2) {
      analyticsTrackEvent2("registration", "cancel", RegistrationAnalytic);
    }
  }
};

User.switchLabels=function() {
    var allowInputTypeChange = true;
    var password = byid('password');
    if(password) {
        if(document.getElementById) {
            try { // to keep IE from showing errors.
                password.type = 'text';
                if(password.type == 'text') password.value = 'Must be at least 6 characters';
                else allowInputTypeChange = false;
                } 
            catch(e) { 
                allowInputTypeChange = false; 
            }
        }
        if(allowInputTypeChange) {
            password.onfocus = function() {
                var tempVal = this.value; // NS6 fix.
                var iType = this.type; // Opera 7 fix.
                if(this.type != 'password') this.type = 'password';
                this.value = tempVal; // NS6 fix.
                if(this.value=='Must be at least 6 characters')
                this.value = '';
                if(window.opera && iType != 'password') this.focus();
            }
            password.onblur = function() {
                if(this.type == 'password')
                if(this.value=='' || this.value=='Must be at least 6 characters') {
                    this.type = 'text';
                    this.value = 'Must be at least 6 characters';
                }
            }
        }
        var ua=navigator.userAgent.toLowerCase();
        if(!((ua.indexOf('konqueror')!=-1) && /khtml\/3\.[0-4]/.test(ua)) && 
            !(((ua.indexOf('safari')!=-1) && !window.print))) {
            var password = byid('password');
            changeInputType(password,'text','Must be at least 6 characters',false,true);
        }
    }
};
var BetaBox={ overlay: null,
              betaBoxStr: '<div class="overlayClose">' +
                            '<a title="close" class="miniButton miniButtonOverlayClose" onclick="BetaBox.hide();return false;" href="#"><img alt="close" src="/static/transparent.gif"/></a>' +
                          '</div> ' +
                          '<div id="payoff" class="payoff">' +
                          '<h1>Tell Us What You Think</h1>' +
                          '</div>' +
                          '<div class="brick brickB4"> ' +
                            '<div class="outerPadding">' +
                              '<div class="outerBorder">' +
                                '<div class="innerBorder">' +
                                  '<div class="innerPadding">' +
                                    '<div class="brickForm">' +
                                      '<div class="content">' +
                                        '<iframe src="/blank.html" class="hidden" src="" name="BetaBoxFrame" id="BetaBoxFrame" /></iframe>' +
                                        '<form action="/betaFeedback/submit/" target="BetaBoxFrame" id="BetaBoxForm" method="post" onsubmit="return BetaBox.doSubmit();">' +
                                          '<fieldset class="big">' +
                                            '<div class="row">' +
                                              '<div class="label">' +
                                                '<label for="betaLiked" style="width:360px">Here is what I liked about "%{fs}":</label>' +
                                              '</div>' +
                                              '<div class="input" style="width:360px"><textarea cols="40" rows="8" name="betaLiked" id="betaLiked" style="width:360px"></textarea></div>' +
                                              '<div class="break"></div>' +
                                            '</div>' +
                                            '<div class="row">' +
                                              '<div class="label" style="width:360px">' +
                                                '<label for="betaBetter">Here is what I think you can do better with "%{fs}":</label>' +
                                              '</div>' +
                                              '<div class="input" style="width:360px"><textarea cols="40" rows="8" name="betaBetter" id="betaBetter" style="width:360px"></textarea></div>' +
                                              '<div class="break"></div>' +
                                            '</div>' +
                                            '<div class="row">' +
                                              '<div class="label" style="width:360px">' +
                                                '<label for="betaOverall">Overall, I thought:</label>' +
                                              '</div>' +
                                              '<div class="input" style="width:360px"><textarea cols="40" rows="8" name="betaOverall" id="betaOverall" style="width:360px"></textarea></div>' +
                                              '<div class="break"></div>' +
                                            '</div>' +
                                            '<div class="row error" style="display:none" id="BetaBoxError_container">' +
                                              '<div class="warning"><p id="BetaBoxError_message"></p></div>' +
                                              '<div class="break"></div>' +
                                            '</div>' +
                                            '<div class="row buttons">' +
                                              '<div class="label"></div>' +
                                              '<div class="input"><input type="hidden" id="betaFeature" name="betaFeature" value="%{fs}"/><img id="BetaBox_throbber" src="/static/big-loader.gif" alt="Please wait..." style="display: none;"/> <input id="BetaBox_submit" type="submit" class="inputSubmit" value="Tell us" /></div>' +
                                              '<div class="break"></div>' +
                                            '</div>' +
                                          '</fieldset>' +
                                        '</form>' +
                                        '<form action="#" target="BetaBoxFrame" id="BetaBoxFormSuccess" onsubmit="return false;" style="display:none;">' +
                                          '<fieldset class="big">' +
                                            '<p>Thanks. We really appreciate the time that you put in to giving us feedback.</p>' + 
                                            '<div class="row buttons">' +
                                              '<div class="label"></div>' +
                                              '<div class="input"><input type="button" class="inputReset" value="Close" onclick="BetaBox.hide();return false;" /></div>' +
                                              '<div class="break"></div>' +
                                            '</div>' +
                                          '</fieldset>' +
                                        '</form>' +
                                      '</div>' +
                                    '</div>' +
                                    '<div>' +
                                      '<img src="/static/overlay-logo.gif" alt="Joost" class="overlayLogo" />' +
                                      '<div class="break"></div>' +
                                    '</div>' +
                                  '</div>' +
                                '</div>' +
                              '</div>' +
                            '</div>' +
                          '</div>'
};

BetaBox.show=function(strFeatureName){
  if (BetaBox.overlay) {
    showLightbox();
    BetaBox.overlay.style.display="block";
  } else {
    BetaBox.overlay=createOverlay(BetaBox.betaBoxStr.replace(/%{fs}/gm,escapeHTML(strFeatureName)),{center:true,vBias:6});
  }
  return;  
};

BetaBox.hide=function(){
  if (BetaBox.overlay && BetaBox.overlay.parentNode) {
    BetaBox.overlay.parentNode.removeChild(BetaBox.overlay);
    hideLightbox();
    BetaBox.overlay=null;
  }
};
  
BetaBox.doSubmit=function() {
  var frm=document.forms['BetaBoxForm'];
  var betaFeature=frm.betaFeature.value;
  var betaLiked=frm.betaLiked.value;
  var betaBetter=frm.betaBetter.value;
  var betaOverall=frm.betaOverall.value;
  var BetaBox_submit = byid('BetaBox_submit');
  var BetaBox_throbber = byid('BetaBox_throbber');
  if (betaLiked != "" || betaBetter != "" || betaOverall != "") {
    BetaBox_throbber.style.display = "inline";
    BetaBox_submit.disabled = true;
    return true; 
  }
  BetaBox_submit.disabled = false;
  return false; 
};
function paginateRender(targetContainer, totalItems, selectedItem, itemsPerPage, itemURL, itemURLTail, numberFormat) {
  var el=document.getElementById(targetContainer);
  if (!el) {
    return;
  }
  if(itemsPerPage >= totalItems) {
    el.style.display = "none";
    return;
  }

  var output = [];
  var totalPages = Math.ceil(totalItems / itemsPerPage);
  var selectedPage = Math.ceil(selectedItem / itemsPerPage);

  output.push('<div class="blockPagination"><div class="padding"><p>');

  if (selectedPage > 1) {
    var linkItem = ((selectedPage - 2) * itemsPerPage) + 1;
    output.push(' <a href="' + itemURL + linkItem + itemURLTail + '" class="previousPage" title="Previous"><img src="/static/transparent.gif" alt="Previous" /></a> ');
  }

  if (totalPages > 12) {
    if (selectedPage > 5) {
      startPage = selectedPage - 3;
      endPage = selectedPage + 5;

      linkItem = 1;
      if (numberFormat == "items") {
        linkItemLabel = "1-" + itemsPerPage;
      } else {
        linkItemLabel = 1;
      }
      output.push(' <a href="' + itemURL + linkItem + itemURLTail + '">' + linkItemLabel + '</a>');
      output.push(' <span class="paginationEllipse">...</span> ');
    } else {
      startPage = 1;
      endPage = 10;
    }

    if (selectedPage > totalPages - 6) {
      startPage = totalPages - 9;
      endPage = totalPages;
    }

    for (paginationPage = startPage; paginationPage <= endPage; paginationPage++ ) {
      linkItem = ((paginationPage - 1) * itemsPerPage) + 1;
      if (numberFormat == "items") {
        if ( paginationPage == totalPages) {
          linkItemLabel = linkItem + "-" + totalItems;
        } else {
          linkItemLabel = linkItem + "-" + (linkItem + itemsPerPage - 1);
        }
      } else {
        linkItemLabel = paginationPage;
      }
      if (paginationPage == selectedPage) {
        output.push(' <span class="selected">' + linkItemLabel + '</span> ');
      } else {
        output.push(' <a href="' + itemURL + linkItem + itemURLTail + '">' + linkItemLabel + '</a> ');
      }
    }

    if (selectedPage < totalPages - 6) {
      output.push('<span class="paginationEllipse">...</span>');
    }
    if (selectedPage < totalPages - 5) {
      linkItem = ((totalPages - 1) * itemsPerPage) + 1;
      if (numberFormat == "items") {
        linkItemLabel = linkItem + "-" + totalItems;
      } else {
        linkItemLabel = totalPages;
      }
      output.push(' <a href="' + itemURL + linkItem + itemURLTail + '">' + linkItemLabel + '</a> ');
    }

  } else {
    //simply render 12 (or less) items;
    for ( paginationPage = 1;  paginationPage <= totalPages; paginationPage++) {
      linkItem = ((paginationPage - 1) * itemsPerPage) + 1;
      if (numberFormat == "items") {
        if (paginationPage == totalPages) {
          linkItemLabel = linkItem + "-" + totalItems;
        } else {
          linkItemLabel = linkItem + "-" + (linkItem + itemsPerPage - 1);
        }
      } else {
        linkItemLabel = paginationPage;
      }
      if (paginationPage == selectedPage) {
        output.push(' <span class="selected">' + linkItemLabel + '</span> ');
      } else{
        output.push(' <a href="' + itemURL + linkItem + itemURLTail + '">' + linkItemLabel + '</a> ');
      }
    }
  }

  if (selectedPage < totalPages) {
    linkItem = (selectedPage * itemsPerPage) + 1;
    output.push(' <a href="' + itemURL + linkItem + itemURLTail + '" class="nextPage" title="Next"><img src="/static/transparent.gif" alt="Next" /></a>');
  }

  output.push('</p></div>');
  output.push('</div>');
  el.innerHTML = output.join('');
  el.style.display = "block";
}


function paginateRender2(el,params, functionStr) {
  if(!functionStr) {
    functionStr = 'showFeed';
  }
  // Add pagination markup to element el using pagination parameters passed.
  // This version handles data coming as type Sequence, i.e. with no size available
  if (el) {
    var output=[];
    if (params) {
      if(params.numPages>1) {
        output.push('<div class="blockPagination"><div class="padding"><p>');
        if(!params.isFirstPage) {
          output.push('<a class="previousPage" title="Previous" href="#" onclick="' + functionStr + '(\'' + params.prevPageStart + '\',\'' + params.count + '\');return false"><img src="/static/transparent.gif" alt="Previous" /></a>');
        }

        for (var page=0;page<params.pageList.length;page++) {
          var pageNumber = params.pageList[page].number;
          if (pageNumber==params.currentPage) {
            output.push("<span class='selected'>"+pageNumber+"</span>");
          } else {
            output.push('<a href="#" onclick="' + functionStr + '(\'' +(pageNumber-1)*params.count+ '\',\''+params.count+'\'); return false">'+pageNumber+'</a>');
          }
        }

        if(!params.isLastPage) {
          output.push('<a class="nextPage" title="Next" href="#" onclick="'+ functionStr +'('+params.nextPageStart+','+params.count+');return false"><img src="/static/transparent.gif" alt="Next" /></a>');
        }
        output.push('</p></div></div>');
      }
      el.innerHTML=output.join('');
    }
  }
}

function paginateRender3(el,params, functionStr, arg) {
  if(!functionStr) {
    functionStr = 'showFeed';
  }
  // Add pagination markup to element el using pagination parameters passed.
  // This version handles data coming as type Sequence, i.e. with no size available
  if (el) {
    var output=[];
    if (params) {
      if(params.numPages>1) {
        output.push('<div class="blockPagination"><div class="padding"><p>');
        if(!params.isFirstPage) {
          output.push('<a class="previousPage" title="Previous" href="#" onclick="' + functionStr + '(' + params.prevPageStart + ',' + params.count + ',' + arg + ');return false"><img src="/static/transparent.gif" alt="Previous" /></a>');
        }

        for (var page=0;page<params.pageList.length;page++) {
          var pageNumber = params.pageList[page].number;
          if (pageNumber==params.currentPage) {
            output.push("<span class='selected'>"+pageNumber+"</span>");
          } else {
            output.push('<a href="#" onclick="' + functionStr + '(' +(pageNumber-1)*params.count+ ','+params.count+',' + arg + '); return false">'+pageNumber+'</a>');
          }
        }

        if(!params.isLastPage) {
          output.push('<a class="nextPage" title="Next" href="#" onclick="'+ functionStr +'('+params.nextPageStart+','+params.count+',' + arg + ');return false"><img src="/static/transparent.gif" alt="Next" /></a>');
        }
        output.push('</p></div></div>');
      }
      el.innerHTML=output.join('');
    }
  }
}

Activities = {
  cols: 2,
  service: "/api/events/get/%j?json_function=Activities.render",
  serviceMe: "/api/events/get/%J?json_function=Activities.render",
  serviceAll: "/api/events/getrecent?json_function=Activities.render",
  serviceFriends: "/api/events/getbyfriends?name=%J&json_function=Activities.render",
  serviceGroups: "/api/events/getgroup?groupName=%g&json_function=Activities.render",

  formatChannelComment: " commented on channel <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-channel-comment-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a>",
  formatChannelRate: " shouted %r! about <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-channel-rate-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a>",
  formatChannelTag: " tagged channel <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-channel-tag-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a> with \"<a href=\"/search?q=tag:%g\">%g</a>\"",
  formatFriend: " and <a href='/users/%f/'>%n</a> became friends",
  formatFriendShare: " shared <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-friend-share-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a> with <a href='/users/%u/'>%n</a>",
  formatGroupComment: " commented on group <a href='/groups/%i'>%t</a>",
  formatGroupCreate: " created group <a href='%u'>%b</a>",
  formatGroupJoin: " joined <a href='%u'>%b</a>",
  formatGroupLeave: " left group <a href='%u'>%b</a>",
  formatGroupShare: " shared <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-group-share-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a> with group <a href='%u'>%b</a>",
  formatRegistration: " signed up",
  formatVideoComment: " commented on <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-video-comment-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a>",
  formatVideoRate: " shouted %r! about <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-video-rate-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a>",
  formatVideoTag: " tagged <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-video-tag-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a> with \"<a href=\"/search?q=tag:%g\">%g</a>\"",
  formatVideoView: " watched <a href='/%i/?gaev=1' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-video-view-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a>",
  formatThumb: " gave <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-video-thumbup-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a> a thumbs %d.",
  formatFav: " favorited <a href='/%i/' onmousedown='analyticsTrackEvent2(\"feed\", \"feed-video-tag-mousedown\", \"%i\");' onclick='return epgPage.playNow(\"%i\", this);'>%t</a>",
  formatAddBtn : '<a title=\'Add to My Queue\' class="miniButton miniButtonQueueAdd16" onclick="analyticsTrackEvent2(\'feed\', \'feed-video-favorite-mousedown\', \'%i\'); addEntryToList(\'playlist\',\'%i\',this);return false" href="#">' +
                 '<img alt=\'Add to My Queue\' src="/static/transparent.gif"/></a>',

  iconRate : 'miniButtonShout16',
  iconTag :  'miniButtonTag16',
  iconShare : 'miniButtonShare16',
  iconComment : 'miniButtonComment16',
  iconGroup : 'miniButtonGroup16',
  iconGroupJoin : 'miniButtonJoinedAGroup16',
  iconGroupLeave : 'miniButtonGroup16',
  iconGroupCreate : 'miniButtonGroup16',
  iconWatch : 'miniButtonWatchedAShow16',
  iconFriend : 'miniButtonAddedAFriend16',
  iconUser : 'miniButtonUser16',
  iconThumbUp : 'miniButtonThumbUp16',
  iconThumbDown : 'miniButtonThumbDown16',
  iconFav: 'miniButtonAddToFavorites16'
};

Activities.showThrobber=function() {
  var el=document.getElementById('activitieslistThrobber');
  if (el) {
    el.style.display = "block";
  }
  el=document.getElementById('activitieslist');
  if (el) {
    el.innerHTML="";
  }
}

// Show the activity feed of a user
Activities.show = function(start, nItems, joostName, updateInterval) {
  Activities.showThrobber();
  var el=document.getElementById('activitieslist');
  if (el) {
    var url=Activities.service.replace(/%j/gm,joostName);
    if (nItems) {
      url+="&count="+nItems;
    }
    if (start) {
      url+="&start="+start;
    }
    if (window.ActivitiesRoot) {
      url=window.ActivitiesRoot+url;
    }
    if (updateInterval) {
      setInterval('jsonRequest("'+url+'")',updateInterval*1000);
    }
    jsonRequest(url);
  }
};

// Show the global activity feed
// cols: number of columns, defaults to 2
// start: for pagination: at what event to start
// numberItems: number of items to display
// updateInterval: number of seconds between updated
Activities.showAll = function(start, numberItems, cols, updateInterval) {
  Activities.showThrobber();
  if(cols){
    this.cols=cols;
  }
  clearInterval(Activities.currentInterval);
  Activities.currentMode = 'showAll';
  var url=Activities.serviceAll;
  if (numberItems) {
    url+="&count="+numberItems;
  }
  if (start) {
    url+="&start="+start;
  }
  if (window.ActivitiesRoot) {
    url=window.ActivitiesRoot+url;
  }
  if (updateInterval) {
    Activities.currentInterval = setInterval(function() { if(Activities.currentMode == 'showAll') jsonRequest(url);},updateInterval*1000);
  }
  jsonRequest(url);
};

// Show the activity feed of the logged user's friends
Activities.showFriends = function(start, nItems, updateInterval) {
  Activities.showThrobber();
  var joostName="";
  if (window.User_Details) {
    joostName=window.User_Details.joostName;
  }
  var url=Activities.serviceFriends.replace(/%J/gm,joostName);
  clearInterval(Activities.currentInterval);
  Activities.currentMode = 'showFriends';
  if (window.ActivitiesRoot) {
    url=window.ActivitiesRoot+url;
  }
  if (nItems) {
    url+="&count="+nItems;
  }
  if (start) { 
    url+="&start="+start;
  }
  if (updateInterval) {
    Activities.currentInterval = setInterval(function() {if(Activities.currentMode == 'showFriends') jsonRequest(url);},updateInterval*1000);
  }
  jsonRequest(url);
};

// Show the activity feed of the logged user
Activities.showMe = function(start,nItems, updateInterval) {
  Activities.showThrobber();
  var joostName="";
  if (window.User_Details) {
    joostName=window.User_Details.joostName;
  }
  var url=Activities.serviceMe.replace(/%J/gm,joostName);
  clearInterval(Activities.currentInterval);
  Activities.currentMode = 'showMe';
  if (nItems) {
    url+="&count="+nItems;
  }
  if (start) {
    url+="&start="+start;
  }
  if (window.ActivitiesRoot) {
    url=window.ActivitiesRoot+url;
  }
  if (updateInterval) {
    Activities.currentInterval = setInterval(function() {if(Activities.currentMode == 'showMe') jsonRequest(url);},updateInterval*1000);
  }
  jsonRequest(url);
};

Activities.showSpecial = function(start,nItems,updateInterval, url) {
  Activities.showThrobber();
  clearInterval(Activities.currentInterval);
  Activities.currentMode = 'showSpecial';
  url += "?json_function=Activities.render";
  if (nItems) {
    url+="&count="+nItems;
  }
  if (start) {
    url+="&start="+start;
  }
  if (window.ActivitiesRoot) {
    url=window.ActivitiesRoot+url;
  }
  if (updateInterval) {
    Activities.currentInterval = setInterval(function() {if(Activities.currentMode == 'showMe') jsonRequest(url);},updateInterval*1000);
  }
  jsonRequest(url);
}

Activities.showGroup = function(start,nItems,groupId) {
  Activities.showThrobber();
  var url=Activities.serviceGroups.replace(/%g/gm,encodeURIComponent(groupId));
  if (nItems) {
    url+="&count="+nItems;
  }
  if (start) {
    url+="&start="+start;
  }
  if (window.ActivitiesRoot) {
    url=window.ActivitiesRoot+url;
  }
  jsonRequest(url);
};

Activities.render = function(obj) {
  var el=document.getElementById('activitieslistThrobber');
  if (el) {
    el.style.display = "none";
  }
  el=document.getElementById('activitieslist');
  if (obj.success && el && obj.events && obj.events.length>0) {
    var output=[];
    var j=0;
    var len=Math.floor(obj.events.length/this.cols);

    var elp=document.getElementById('activitiesPagination');
    if (elp) {
      paginateRender2(elp,obj.pagination,"showFeed");
    }

    output.push("<div class='column'><ul>");
     for (var i=0;i<obj.events.length;i++) {
      var event=obj.events[i];
      var hasNoPublicId = false;

      var activitiesText = '';
      var activitiesBtn = '';
      var activitiesIcon;
      var rat;
      switch(event.type) {
      case "CHANNELCOMMENT":
        activitiesIcon = Activities.iconComment;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm, escape(event.publicId));
        activitiesText = Activities.formatChannelComment.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title));
        break;
      case "CHANNELRATE":
         activitiesIcon = Activities.iconRate;
         activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
         rat=event.rating;
         activitiesText = Activities.formatChannelRate.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%r/gm,rat);
        break;
      case "CHANNELTAG":
        activitiesIcon = Activities.iconTag;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
        activitiesText = Activities.formatChannelTag.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%g/gm,escapeHTML(event.tag));
        break;
      case "FRIEND":
        activitiesIcon = Activities.iconFriend;
        activitiesText = Activities.formatFriend.replace(/%f/gm,encodeURIComponent(event.friend)).replace(/%n/gm,escapeHTML(event.friendName));
        break;
      case "FRIENDSHARE":
         activitiesIcon = Activities.iconShare;
         activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
         activitiesText = Activities.formatFriendShare.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%u/gm,encodeURIComponent(event.friend)).replace(/%n/gm,encodeURIComponent(event.friendName));
        break;
      case "GROUPSHARE":
         activitiesIcon = Activities.iconShare;
         activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
         activitiesText = Activities.formatGroupShare.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%u/gm,event.groupUrl).replace(/%b/gm,escapeHTML(event.group));
        break;
      case "GROUPCOMMENT":
        activitiesIcon = Activities.iconComment;
        activitiesText =Activities.formatGroupComment.replace(/%i/gm,event.groupId).replace(/%t/gm,escapeHTML(event.groupName));

        break;
      case "GROUPCREATE":
        activitiesIcon = Activities.iconGroupCreate;
        activitiesText = Activities.formatGroupCreate.replace(/%u/gm,event.groupUrl).replace(/%b/gm,escapeHTML(event.group));
        break;
      case "GROUPJOIN":
        activitiesIcon = Activities.iconGroupJoin;
        activitiesText = Activities.formatGroupJoin.replace(/%u/gm,event.groupUrl).replace(/%b/gm,escapeHTML(event.group));
        break;
      case "GROUPLEAVE":
        activitiesIcon = Activities.iconGroupLeave;
        activitiesText = Activities.formatGroupLeave.replace(/%u/gm,event.groupUrl).replace(/%b/gm,escapeHTML(event.group));
        break;
      case "REGISTRATION":
        activitiesIcon = Activities.iconUser;
        activitiesText = Activities.formatRegistration;
        break;
      case "THUMB":
        if (event.direction=="DOWN") {
          var direction= "Down";
          activitiesIcon = Activities.iconThumbDown;
        } else {
          direction= "Up";
          activitiesIcon = Activities.iconThumbUp;
        }
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
        activitiesText = Activities.formatThumb.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%r/gm,rat).replace(/%d/gm,direction);
        break;
      case "VIDEOCOMMENT":
        activitiesIcon = Activities.iconComment;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
        activitiesText = Activities.formatVideoComment.replace(/%i/gm,escape(event.publicId)).replace(/%t/gm,escapeHTML(event.title));
        break;
      case "VIDEORATE":

        activitiesIcon = Activities.iconRate;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));

        rat=event.rating;

        activitiesText = Activities.formatVideoRate.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%r/gm,rat);

        break;
      case "VIDEOTAG":
        activitiesIcon = Activities.iconTag;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
        activitiesText = Activities.formatVideoTag.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title)).replace(/%g/gm,escapeHTML(event.tag));
        break;
      case "VIDEOVIEW":
        activitiesIcon = Activities.iconWatch;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
        activitiesText = Activities.formatVideoView.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title));
        break;
       case "LISTADDFAV":
        activitiesIcon = Activities.iconFav;
        activitiesBtn = Activities.formatAddBtn.replace(/%i/gm,encodeURIComponent(event.publicId));
        activitiesText = Activities.formatFav.replace(/%i/gm,encodeURIComponent(event.publicId)).replace(/%t/gm,escapeHTML(event.title));
        break;
      default:
        continue;
      }

      if(window.User && !window.User.loggedIn){
        activitiesBtn = '';
      }

      //if more than one column (default is 2)
      if(i%len==0 && i>0 && j<this.cols){
        j++;
        output.push('</ul><div class="break"></div></div><div class="column"><ul>');
      }

      output.push('<li onmouseout="Activities.toggleAddToPlaylist(\'actPL_' + i + '\', false);" onmouseover="Activities.toggleAddToPlaylist(\'actPL_' + i +'\', true);">');
      output.push('<div style="display: none;" id="actPL_' + i +'" class="buttons">');
      output.push(activitiesBtn);
      output.push('</div>');
      output.push('<img alt="" class="' + activitiesIcon + '" src="/static/transparent.gif"/>');
      output.push('<p><a href="/users/'+encodeURIComponent(event.subject)+'/">'+escapeHTML(event.subjectName)+'</a>');
      output.push(activitiesText + '  <span class="time">(' + dateTime.getElapsed(event.date) + ')</span></p>');
      output.push('<div class="break"></div>');
      output.push('</li>');

    }
    output.push('</ul><div class="break"></div></div>');
    if (el) {
      el.innerHTML=output.join('');
    }
  }else{
    if (el) {
      var output=[];
      switch(obj.stream) {
      case "friends":
      case "friendsvideoview":
      case "me_and_friends":
        output.push("<p>No activities.</p><br><br><p>Check out what your friends are watching by adding them to your profile. <a href='/people/invite/'>Import your contact list</a> from major email/social network providers.</p>");
        break;
      default:
        output.push("<p>No activities.</p>");
        break;
      }
    }
    el.innerHTML=output.join('');
  }
};

Activities.toggleAddToPlaylist = function(activityID, activityState) {
  if (document.getElementById(activityID)) {
    if (activityState) {
      document.getElementById(activityID).style.display = 'block';
    } else {
      document.getElementById(activityID).style.display = 'none';
    }
  }
};

Activities.switchTab = function(activityID, activityTab) {
  Activities.showThrobber();
  if (document.getElementById('ActivitiesTabs_' + activityID + '_tabs')) {
    var tabs = document.getElementById('ActivitiesTabs_' + activityID + '_tabs');
    var tabsA = tabs.getElementsByTagName('a');
    for (var i = 0; i < tabsA.length; i++) {
      if (i == activityTab) {
        tabsA[i].className="selected";
        ActivitiesTabs[activityID].func = ActivitiesTabs[activityID][activityTab].func;
        ActivitiesTabs[activityID].rssUrl = ActivitiesTabs[activityID][activityTab].rssUrl;
        ActivitiesTabs[activityID].moreUrl = ActivitiesTabs[activityID][activityTab].moreUrl;
        ActivitiesTabs[activityID].func();
        if (document.getElementById('activityBrick_' + activityID + '_rss')) {
          document.getElementById('activityBrick_' + activityID + '_rss').setAttribute("href", ActivitiesTabs[activityID][activityTab].rssUrl);
        }
        if (document.getElementById('activityBrick_' + activityID + '_more')) {
          document.getElementById('activityBrick_' + activityID + '_more').setAttribute("href", ActivitiesTabs[activityID][activityTab].moreUrl);
        }
      } else {
        tabsA[i].className="";
      }
    }
  }
};
var AddedVideo = {
    preventDouble: {playlist:[],favorites:[]}
};

function removeEntryFromList(list,publicId) {
  // only called from zapper
  if (list == 'playlist') {
    var icoply = byid('metaConsoleAddToQueue');
    if(icoply) {
      turnIntoAddPlaylistButton(icoply,publicId);
    }
  } else if (list == 'favorites') {
    var icofav = byid('metaConsoleAddToFavorites');
    if(icofav) {
      turnIntoAddButton(icofav,publicId);
    }
  }
  var url='/api/'+  list + '/remove/?publicId=' + publicId + '&json_function=' + ((list == 'favorites') ? 'handleRemoveFav' : 'handleRemovePlay');
  jsonRequest(url);
}

function handleRemovePlay(response) {
  if (response.success) {
    Loader.clearZapper("playlist");
    if (window.core && core.plugin && core.plugin.removeEntry && response.entry && core.plugin.currentGroup.name=="playlist") {
      core.plugin.removeEntry(response.entry.publicId,true);
    }
    AddedVideo.preventDouble['playlist'][response.entry.publicId]=false;
  } 
}

function handleRemoveFav(response) {
  if (response.success) {
    Loader.clearZapper("favorites");
    if (window.core && core.plugin && core.plugin.removeEntry && response.entry && core.plugin.currentGroup.name=="favorites") {
      core.plugin.removeEntry(response.entry.publicId,true);
    }
    AddedVideo.preventDouble['favorites'][response.entry.publicId]=false;
  } else {
    core.notifier.addMsg("Oops... we didn't manage to remove that from favorites that time, try again, or maybe keep it as a favorite? ", {style : 'error'});
  }
}

function addEntryToList(list,publicId,el){
  ListUpdated.fire(list, publicId);
  core.notifier.close();
  if (!User.loggedIn) {
    User.promptForLogin('<h1>To add a video to your '+list+', you must be logged in</h1>',function() {addEntryToList(list,publicId,el)});
    return;
  }

  if(!publicId) {
    if (window.Page) {
      var publicId = Page.publicId;
      var entry = { publicId : Page.publicId, title : Page.title,
                    thumbnail :Page.thumbnail, type : Page.type}
    }

    if( window.core && core.plugin &&
      core.plugin.currentPlaying.publicId != '' &&
      core.plugin.currentPlaying.publicId != entry.publicId ){
      var entry = core.plugin.currentPlaying;
    }

    if(!entry.publicId || entry.publicId == '' || entry.publicId == 'undefined'){
      core.notifier.addMsg('Nothing to add, sorry!', {style : 'error'});
      return false;
    }
  } else {
    var entry = {};
    entry.publicId = publicId;
  }
  
  if (AddedVideo.preventDouble[list] && AddedVideo.preventDouble[list][entry.publicId]) {
    return;
  }
  if (!AddedVideo.preventDouble[list][entry.publicId]) {
     AddedVideo.preventDouble[list][entry.publicId]={};
  }
  AddedVideo.preventDouble[list][entry.publicId]=true;
  jsonRequest('/api/'+  list + '/add/' + entry.publicId + '?json_function=' + ((list == 'favorites') ? 'handleAddFav' : 'handleAddPlay'));
  return;
}

function handleAddPlay(r) {
    AddhandleResponse(r, 'playlist');
    if (r.success) {
        var icoply = byid('metaConsoleAddToQueue');
        if(icoply) {
            updateMetaconsoleBtns(r.selected.publicId,'playlist',icoply);
        }
    }
}
function handleAddFav(r) { 
  AddhandleResponse(r, 'favorites');
  if (r.success) {
        var icofav = byid('metaConsoleAddToFavorites');
        fbUtils.addFavorite(r.entry.publicId);
        if(icofav) {
             updateMetaconsoleBtns(r.selected.publicId,'favorites',icofav);
        }
  } 
}

var ListUpdated={playlist:[],favorites:[]};
ListUpdated.fire=function(name,publicId) {
  var list=ListUpdated[name];
  if (list) {
    for (var i=0;i<list.length;i++) {
      try {
        list[i](publicId);
      } catch (e) {
        // integrators may not like us capturing this, consider a DEBUG method for them.
      }
    }
  }
};

function updateFansList(obj) {
  if (!obj.success) {
    return;
  }
  var apiResults=obj.fans;
  var nApiResults=obj.fans.length;

  if(nApiResults==0){
    var listViewThumbs = byid('listViewThumbs');
    listViewThumbs.innerHTML = '<div class="blockFauxPadding"><div class="blockFauxPadding"><p>Sorry, this channel isn\'t anyones favorite yet.</p></div></div>';
    return;
  }
  var outputList=[];
  for (var i=0;i<nApiResults;i+=1) {
    var joostName=apiResults[i].joostName;
    if (!joostName || joostName=="") { continue; }
    var avatar = getAvatar(apiResults[i], 'large');
        
    var fbid = 'undefined';
    if(apiResults[i].fbid) {
      fbid=apiResults[i].fbid;
    } else {
      fbid = 'undefined';
    }
    
    var youIndicator = "";
    if (window.User_Details) {
      if(window.User_Details.joostName == joostName) {
        youIndicator = '<p><img src="/static/minilabel-you.png" class="minilabelYou" alt="You"/></p>';
      }
    }
    
    var isFriend = false;
    if(apiResults[i].friend) {
      isFriend=apiResults[i].friend;
    } else {
      isFriend=false;
    }
    outputList.push({title: escapeHTML(apiResults[i].userName),
                        joostName: joostName,
                        thumbnail:avatar,
                        link:'/users/'+joostName+"/",
                        type:'user',
                        showProfile: apiResults[i].showProfile,
                        fbid: fbid,
                        description: youIndicator,
                        friend: isFriend,
                        gender: apiResults[i].gender,
                        age: apiResults[i].age,
                        country: apiResults[i].country,
                        regDate: apiResults[i].regDate
                        });
  }
  var listViewThumbs = byid('listViewThumbs');
  if(Page.pageView =="thumbs") {
    listViewThumbs.className = 'listViewmodeThumbs';
    var addCont = renderUserBrickInThumbMode(outputList,false);
  } else {
    listViewThumbs.className = 'listViewmodeBlock';
    var addCont = renderUserBrickInListMode(outputList,false);
  }
  listViewThumbs.innerHTML=addCont;
  setTimeout(FBParseDom, 0);
}

function AddhandleResponse(response, listName){
  if (window.Loader) {
    Loader.clearZapper(listName);
  }
  var listPretty = (listName == 'favorites') ? 'Favorites' : 'Queue';
  if(!window.core || !core.notifier){
    return;
  }
  if(response.success){
    var title="It";
    var publicId;
    if (response.selected) {
      title=response.selected.title;
      publicId = response.selected.publicId;
    }
    core.notifier.addMsg(title + ' was added to My ' + listPretty, {style : 'success'});
    
    if(listName == 'favorites' && publicId!= '' && window.Page && Page.pageType=="favorites") {
      var listViewThumbs = byid('listViewThumbs');
      if(listViewThumbs && listViewThumbs != '') {
        var url = '/api/favorites/getfans/'+ publicId +'/?json_function=updateFansList';
        jsonRequest(url);
      }
    }
    return;
  }
  if(response.resultCode == 3007) {
    var msg="You've already done that";
    if(response.selected && response.selected.title) {
      msg="You already have "+response.selected.title+" in your "+listPretty;
    }
    core.notifier.addMsg(msg, {style : 'success'});
  } else if (response.resultCode == 5001) {
    core.notifier.addMsg("Unfortunately, this show is unavailable", {style : 'error'});
  }
  else {
    core.notifier.addMsg("Oops...we weren't able to add this video to My " + listPretty + ". Give it another try! ", {style : 'error'});
  }
};
var Layout = {
/*
  The function miniButtons creates one or more buttons based on an array of
  maps supplied to the function. These arrays contain a hash with the following
  properties:

  Mandatory:
  - href (at least: "#")
  - title (used on label and title attributed)
  Optional:
  - id
  - icon (e.g.: "miniButtonItemTag")
  - onclick
  - nolabel (boolean, omits label from button, but keeps title attribute)
  - righticon (boolean, moves the icon right of the label)
  - hoverlabel (hides label from button, reappears on hover)

*/
  miniButtons: function(buttons){
    var buf = [];
    for(var i=0; i < buttons.length; i++){
      var btn = buttons[i];
      buf.push("<a");
      if(btn.id !== undefined) buf.push(" id=\"", btn.id,"\"");
      if(btn.href !== undefined) buf.push(" href=\"", btn.href, "\"");
      if(btn.onclick !== undefined) buf.push(" onclick=\"", btn.onclick, "\"");
      buf.push(" class=\"miniButton");
      if(btn.icon !== undefined) buf.push(" ", btn.icon);
      buf.push("\"");

      buf.push(" title=\"", btn.title, '"');
      buf.push(">");
      var label = [ btn.title ];
      if(btn.nolabel) label = [];
      else {
        label = ["<span class=\"label" ];
        if(btn.hoverlabel) label.push(" hidelabel");
        label.push('"');
        if(btn.labelId) label.push(" id=\"", btn.labelId, '"');
        label.push(">");
        label.push(btn.title);
        label.push("</span>");
      }
      label = label.join("");

      var icon = ["<img src=\"/static/transparent.gif\""];
      icon.push(" alt=\"", btn.title, '"');
      if(btn.iconId) icon.push(" id=\"", btn.iconId, '"');
      icon.push("/>");
      icon = icon.join("");

      if(btn.righticon){
        buf.push(label, icon);
      } else {
        buf.push(icon, label);
      }
      buf.push("</a>");
    }
    return buf.join("");
  },

  microButtons: function(buttons){
    var buf = [], btn, label, img;
    for(var i = 0; i < buttons.length; i++){
      btn = buttons[i];

      if(btn.nolabel) {
        label = "";
      }else{
        label = '<span class="label';
        if(btn.hoverlabel) label += " hidelabel";
        label += '" ';
        if(btn.labelId) label += 'id="' + btn.labelId + '" ';
        label += ">" + btn.title + "</span>";
      }

      buf.push("<a ");
      if(btn.id) buf.push('id="' + btn.id + '" ');
      if(btn.href) buf.push('href="' + btn.href + '" ');
      if(btn.onclick) buf.push('onclick="' + btn.onclick.replace('"', '\\\"') + '" ');
      buf.push('class="microButton');
      if(btn.icon) buf.push(' ' + btn.icon);
      buf.push('" ');
      buf.push('title="' + btn.title + '">');
      img = '<img src="/static/transparent.gif" alt="' + btn.title + '"' + (btn.iconId ? ' id="' + btn.iconId + '" ' : '');
      if(btn.righticon) buf.push(label, img);
      else buf.push(img, label);
      buf.push("</a>");
    }
    return buf.join('');
  }
};
var dateTime = {};

dateTime.msToFriendlyTime = function (ms) {
  var sec = Number(ms)/1000;
  if (sec<60) {
    return "less than a minute";
  }
  var hours=Math.floor((sec+29)/3600);
  var minutes=Math.round(sec/60)%60;
  var str="";
  if (hours > 0) {
    str = hours + " " + (hours==1 ? "hour" : "hours") + " ";
  }
  if (minutes>0) {
    str += minutes + " " + (minutes==1 ? "minute" : "minutes");
  }
  return str;
};


dateTime.msToShortTime = function (ms) {
  var sec = Math.round(Number(ms)/1000);
  var hours=Math.floor(sec/3600)
  var str="";
  if (hours>0) {
    str=hours+":";
  }
  return  str + dateTime.zeroPad(Math.floor(sec/60)%60) + ':' + dateTime.zeroPad(sec%60);
};


dateTime.zeroPad = function (n) {
  var str = '0' + n;
  return str.match(/..$/)[0];
};


dateTime.getElapsed = function(eventDate) {
  // get the elapsed time and prettify it
  var today = new Date();
  var days = 0;
  var weeks = 0;
  var months = 0;
  var years = 0;
  var hours = 0;
  var minutes = 0;
  var seconds = 0;
  if (!eventDate) {
    return "";
  }
  var difference = Math.floor(today.getTime() - eventDate.getTime());
  var tailString = "";
  days = Math.floor(difference / (1000*60*60*24));
  weeks = Math.floor(days / 7);
  years = Math.floor(days / 365);
  if (weeks > 4) {
    months = Math.floor(days / 30);  // an approximation for now
  }

  if (years > 0 ) {
    return "over a year ago";
  }

  if (months > 0) {
    return (months > 1) ? months+' months ago' : 'a month ago';
  }
  if (weeks > 0) {
    return (weeks > 1) ? weeks+' weeks ago' : 'a week ago';
  }
  if (days > 0) {
     return (days > 1) ? days+' days ago' : 'yesterday';
    }

  // convert for today
  hours = Math.floor(difference / (1000*60*60));
  minutes = Math.floor(difference / (1000*60));
  seconds = Math.floor(difference / (1000));

  if (hours > 0) {
    return (hours > 1) ? hours+' hours ago' : 'an hour ago';
  }
  if (minutes > 0) {
    return (minutes > 1) ? minutes+' minutes ago' : 'a minute ago';
  }
  if (seconds >= 0) {
    return (seconds > 1) ? seconds+' seconds ago' : 'just a second ago';
  }
  return 'just a second ago';
};




dateTime.showFuture = function(eventDate) {
  // get the elapsed time and prettify it
  var today = new Date();
  var days = 0;
  var weeks = 0;
  var months = 0;
  var years = 0;
  var hours = 0;
  var minutes = 0;
  var seconds = 0;
  if (!eventDate) {
    return "";
  }
  var difference = Math.floor(eventDate.getTime() - today.getTime());
  if (difference < 0) {
    return "in the past";
  }
  var tailString = "";
  days = Math.floor(difference / (1000*60*60*24));
  weeks = Math.floor(days / 7);
  years = Math.floor(days / 365);
  if (weeks > 4) {
    months = Math.floor(days / 30);  // an approximation for now
  }

  if (years > 0 ) {
    return "in more than a year";
  }

  if (months > 0) {
    return (months > 1) ? 'in '+months+' months' : 'in a month';
  }
  if (weeks > 0) {
    return (weeks > 1) ? 'in '+weeks+' weeks' : 'in a week';
  }
  if (days > 0) {
     return (days > 1) ? 'in '+days+' days' : 'tomorrow';
    }

  // convert for today
  hours = Math.floor(difference / (1000*60*60));
  minutes = Math.floor(difference / (1000*60));
  seconds = Math.floor(difference / (1000));

  if (hours > 0) {
    return (hours > 1) ? 'in '+hours+' hours' : 'in an hour';
  }
  if (minutes > 0) {
    return (minutes > 1) ? 'in '+minutes+' minutes!' : 'in a minute!';
  }
  if (seconds >= 0) {
    return (seconds > 1) ? 'in '+seconds+' seconds!' : 'in a second!';
  }
  return 'in a second!';
};


var summary = {};

summary.maxLength = 240;
summary.sumLength = 200;

summary.sumExpand = function (id, direction) {
  if (document.getElementById(id + '_full')) {
    if (direction) {
      document.getElementById(id + '_full').style.display = 'block';
      document.getElementById(id + '_sum').style.display = 'none';
    } else {
      document.getElementById(id + '_full').style.display = 'none';
      document.getElementById(id + '_sum').style.display = 'block';
    }
  }
}

summary.sumTemplate = function (sText) {
  var summaryTemplate;
  if (sText) {
    if (sText.length > summary.maxLength) {
      summaryTemplate='<div style="display: none;" id="d_%i_full"><p>%d</p><p><a title="less" class="miniButton miniButtonLess" href="#" onclick="summary.sumExpand(\'d_%i\', false); return false;"><img alt="less" src="/static/transparent.gif"/><span class="label">less</span></a></p></div><div style="display: block;" id="d_%i_sum"><p>%sd<a title="more" class="miniButton miniButtonMore" href="#" onclick="summary.sumExpand(\'d_%i\', true); return false;"><img alt="more" src="/static/transparent.gif"/><span class="label">more</span></a></p></div>';
    } else {
      summaryTemplate='<div id="d_%i"><p>%d</p></div>';
    }
  }
  return summaryTemplate;
}

summary.sumShort = function (sText) {
  if (sText) {
    sText=sText+' ';
    var nText = sText.substring(0, sText.substring(0, summary.sumLength).lastIndexOf(" "));
    if (nText.length == 0) {
      nText = sText.substring(0, summary.sumLength);
    }
    return nText + ((sText.length <= summary.sumLength) ? "" :  " ... ");;
  } else {
    return "";
  }
}

summary.sumMake = function (id, noButtons) {
  var oText = document.getElementById(id);
  if (oText) {
    var fText = "";
    var fTextP = oText.getElementsByTagName('p');
    var len=fTextP.length;
    if (len>0) {
      for (var i = 0; i < len; i++) {
        var str=getStr(fTextP[i]);
        if (str) {
          fText = fText + str + '\\n\\n';
        }
      }
      var summaryTemplate = summary.sumTemplate(fText);
      if (fText.length > summary.maxLength) {
        var str=getStr(fTextP[0]);
        var sText = (str ? summary.sumShort(str) : "");
        oText.innerHTML = summaryTemplate.replace(/%sd/gm,sText).replace(/%d/gm,makeParas(fText)).replace(/%i/gm,id);
      }
    }
  }
};

function getStr(el) {
  if (el.textContent) {
    return el.textContent;
  }
  if (el.innerText) {
    return el.innerText;
  }
  return "";
}
/*!    SWFObject v2.0 <http://code.google.com/p/swfobject/>
    Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
    This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
*/

var swfobject = function() {
    
    var UNDEF = "undefined",
        OBJECT = "object",
        SHOCKWAVE_FLASH = "Shockwave Flash",
        SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
        FLASH_MIME_TYPE = "application/x-shockwave-flash",
        EXPRESS_INSTALL_ID = "SWFObjectExprInst",
        
        win = window,
        doc = document,
        nav = navigator,
        
        domLoadFnArr = [],
        regObjArr = [],
        timer = null,
        storedAltContent = null,
        storedAltContentId = null,
        isDomLoaded = false,
        isExpressInstallActive = false;
    
    /* Centralized function for browser feature detection
        - Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
        - User agent string detection is only used when no alternative is possible
        - Is executed directly for optimal performance
    */    
    var ua = function() {
        var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF && typeof doc.appendChild != UNDEF && typeof doc.replaceChild != UNDEF && typeof doc.removeChild != UNDEF && typeof doc.cloneNode != UNDEF,
            playerVersion = [0,0,0],
            d = null;
        if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
            d = nav.plugins[SHOCKWAVE_FLASH].description;
            if (d) {
                d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
                playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
                playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
                playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
            }
        }
        else if (typeof win.ActiveXObject != UNDEF) {
            var a = null, fp6Crash = false;
            try {
                a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".7");
            }
            catch(e) {
                try { 
                    a = new ActiveXObject(SHOCKWAVE_FLASH_AX + ".6");
                    playerVersion = [6,0,21];
                    a.AllowScriptAccess = "always";  // Introduced in fp6.0.47
                }
                catch(e) {
                    if (playerVersion[0] == 6) {
                        fp6Crash = true;
                    }
                }
                if (!fp6Crash) {
                    try {
                        a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
                    }
                    catch(e) {}
                }
            }
            if (!fp6Crash && a) { // a will return null when ActiveX is disabled
                try {
                    d = a.GetVariable("$version");  // Will crash fp6.0.21/23/29
                    if (d) {
                        d = d.split(" ")[1].split(",");
                        playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
                    }
                }
                catch(e) {}
            }
        }
        var u = nav.userAgent.toLowerCase(),
            p = nav.platform.toLowerCase(),
            webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
            ie = false,
            windows = p ? /win/.test(p) : /win/.test(u),
            mac = p ? /mac/.test(p) : /mac/.test(u);
        /*@cc_on
            ie = true;
            @if (@_win32)
                windows = true;
            @elif (@_mac)
                mac = true;
            @end
        @*/
        return { w3cdom:w3cdom, pv:playerVersion, webkit:webkit, ie:ie, win:windows, mac:mac };
    }();

    /* Cross-browser onDomLoad
        - Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
        - Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
    */ 
    var onDomLoad = function() {
        if (!ua.w3cdom) {
            return;
        }
        addDomLoadEvent(main);
        if (ua.ie && ua.win) {
            try {  // Avoid a possible Operation Aborted error
                doc.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 
                var s = getElementById("__ie_ondomload");
                if (s) {
                    s.onreadystatechange = function() {
                        if (this.readyState == "complete") {
                          try {
                            this.parentNode.removeChild(this);
                           } catch(e){}
                            callDomLoadFunctions();
                        }
                    };
                }
            }
            catch(e) {}
        }
        if (ua.webkit && typeof doc.readyState != UNDEF) {
            timer = setInterval(function() { if (/loaded|complete/.test(doc.readyState)) { callDomLoadFunctions(); }}, 10);
        }
        if (typeof doc.addEventListener != UNDEF) {
            doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
        }
        addLoadEvent(callDomLoadFunctions);
    }();
    
    function callDomLoadFunctions() {
        if (isDomLoaded) {
            return;
        }
        if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
            var s = createElement("span");
            try { // Avoid a possible Operation Aborted error
                var t = doc.getElementsByTagName("body")[0].appendChild(s);
                t.parentNode.removeChild(t);
            }
            catch (e) {
                return;
            }
        }
        isDomLoaded = true;
        if (timer) {
            clearInterval(timer);
            timer = null;
        }
        var dl = domLoadFnArr.length;
        for (var i = 0; i < dl; i++) {
            domLoadFnArr[i]();
        }
    }
    
    function addDomLoadEvent(fn) {
        if (isDomLoaded) {
            fn();
        }
        else { 
            domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
        }
    }
    
    /* Cross-browser onload
        - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
        - Will fire an event as soon as a web page including all of its assets are loaded 
     */
    function addLoadEvent(fn) {
        if (typeof win.addEventListener != UNDEF) {
            win.addEventListener("load", fn, false);
        }
        else if (typeof doc.addEventListener != UNDEF) {
            doc.addEventListener("load", fn, false);
        }
        else if (typeof win.attachEvent != UNDEF) {
            win.attachEvent("onload", fn);
        }
        else if (typeof win.onload == "function") {
            var fnOld = win.onload;
            win.onload = function() {
                fnOld();
                fn();
            };
        }
        else {
            win.onload = fn;
        }
    }
    
    /* Main function
        - Will preferably execute onDomLoad, otherwise onload (as a fallback)
    */
    function main() { // Static publishing only
        var rl = regObjArr.length;
        for (var i = 0; i < rl; i++) { // For each registered object element
            var id = regObjArr[i].id;
            if (ua.pv[0] > 0) {
                var obj = getElementById(id);
                if (obj) {
                    regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
                    regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
                    if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
                        if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements
                            fixParams(obj);
                        }
                        setVisibility(id, true);
                    }
                    else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
                        showExpressInstall(regObjArr[i]);
                    }
                    else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
                        displayAltContent(obj);
                    }
                }
            }
            else {  // If no fp is installed, we let the object element do its job (show alternative content)
                setVisibility(id, true);
            }
        }
    }
    
    /* Fix nested param elements, which are ignored by older webkit engines
        - This includes Safari up to and including version 1.2.2 on Mac OS 10.3
        - Fall back to the proprietary embed element
    */
    function fixParams(obj) {
        var nestedObj = obj.getElementsByTagName(OBJECT)[0];
        if (nestedObj) {
            var e = createElement("embed"), a = nestedObj.attributes;
            if (a) {
                var al = a.length;
                for (var i = 0; i < al; i++) {
                    if (a[i].nodeName.toLowerCase() == "data") {
                        e.setAttribute("src", a[i].nodeValue);
                    }
                    else {
                        e.setAttribute(a[i].nodeName, a[i].nodeValue);
                    }
                }
            }
            var c = nestedObj.childNodes;
            if (c) {
                var cl = c.length;
                for (var j = 0; j < cl; j++) {
                    if (c[j].nodeType == 1 && c[j].nodeName.toLowerCase() == "param") {
                        e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
                    }
                }
            }
            obj.parentNode.replaceChild(e, obj);
        }
    }
    
    /* Fix hanging audio/video threads and force open sockets and NetConnections to disconnect
        - Occurs when unloading a web page in IE using fp8+ and innerHTML/outerHTML
        - Dynamic publishing only
    */
    function fixObjectLeaks(id) {
        if (ua.ie && ua.win && hasPlayerVersion("8.0.0")) {
            win.attachEvent("onunload", function () {
                var obj = getElementById(id);
                if (obj) {
                    for (var i in obj) {
                        if (typeof obj[i] == "function") {
                            obj[i] = function() {};
                        }
                    }
                    obj.parentNode.removeChild(obj);
                }
            });
        }
    }
    
    /* Show the Adobe Express Install dialog
        - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
    */
    function showExpressInstall(regObj) {
        isExpressInstallActive = true;
        var obj = getElementById(regObj.id);
        if (obj) {
            if (regObj.altContentId) {
                var ac = getElementById(regObj.altContentId);
                if (ac) {
                    storedAltContent = ac;
                    storedAltContentId = regObj.altContentId;
                }
            }
            else {
                storedAltContent = abstractAltContent(obj);
            }
            if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
                regObj.width = "310";
            }
            if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
                regObj.height = "137";
            }
            doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
            var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
                dt = doc.title,
                fv = "MMredirectURL=" + win.location + "&MMplayerType=" + pt + "&MMdoctitle=" + dt,
                replaceId = regObj.id;
            // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
            // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
            if (ua.ie && ua.win && obj.readyState != 4) {
                var newObj = createElement("div");
                replaceId += "SWFObjectNew";
                newObj.setAttribute("id", replaceId);
                obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
                obj.style.display = "none";
                win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
            }
            createSWF({ data:regObj.expressInstall, id:EXPRESS_INSTALL_ID, width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
        }
    }
    
    /* Functions to abstract and display alternative content
    */
    function displayAltContent(obj) {
        if (ua.ie && ua.win && obj.readyState != 4) {
            // For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
            // In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
            var el = createElement("div");
            obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
            el.parentNode.replaceChild(abstractAltContent(obj), el);
            obj.style.display = "none";
            win.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
        }
        else {
            obj.parentNode.replaceChild(abstractAltContent(obj), obj);
        }
    }    

    function abstractAltContent(obj) {
        var ac = createElement("div");
        if (ua.win && ua.ie) {
            ac.innerHTML = obj.innerHTML;
        }
        else {
            var nestedObj = obj.getElementsByTagName(OBJECT)[0];
            if (nestedObj) {
                var c = nestedObj.childNodes;
                if (c) {
                    var cl = c.length;
                    for (var i = 0; i < cl; i++) {
                        if (!(c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param") && !(c[i].nodeType == 8)) {
                            ac.appendChild(c[i].cloneNode(true));
                        }
                    }
                }
            }
        }
        return ac;
    }
    
    /* Cross-browser dynamic SWF creation
    */
    function createSWF(attObj, parObj, id) {
        var r, el = getElementById(id);
        if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
            attObj.id = id;
        }
        if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
            var att = "";
            for (var i in attObj) {
                if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
                    if (i == "data") {
                        parObj.movie = attObj[i];
                    }
                    else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
                        att += ' class="' + attObj[i] + '"';
                    }
                    else if (i != "classid") {
                        att += ' ' + i + '="' + attObj[i] + '"';
                    }
                }
            }
            var par = "";
            for (var j in parObj) {
                if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
                    par += '<param name="' + j + '" value="' + parObj[j] + '" />';
                }
            }
            el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
            fixObjectLeaks(attObj.id); // This bug affects dynamic publishing only
            r = getElementById(attObj.id);    
        }
        else if (ua.webkit && ua.webkit < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
            var e = createElement("embed");
            e.setAttribute("type", FLASH_MIME_TYPE);
            for (var k in attObj) {
                if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
                    if (k == "data") {
                        e.setAttribute("src", attObj[k]);
                    }
                    else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
                        e.setAttribute("class", attObj[k]);
                    }
                    else if (k != "classid") { // Filter out IE specific attribute
                        e.setAttribute(k, attObj[k]);
                    }
                }
            }
            for (var l in parObj) {
                if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
                    if (l != "movie") { // Filter out IE specific param element
                        e.setAttribute(l, parObj[l]);
                    }
                }
            }
            el.parentNode.replaceChild(e, el);
            r = e;
        }
        else { // Well-behaving browsers
            var o = createElement(OBJECT);
            o.setAttribute("type", FLASH_MIME_TYPE);
            for (var m in attObj) {
                if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
                    if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
                        o.setAttribute("class", attObj[m]);
                    }
                    else if (m != "classid") { // Filter out IE specific attribute
                        o.setAttribute(m, attObj[m]);
                    }
                }
            }
            for (var n in parObj) {
                if (parObj[n] != Object.prototype[n] && n != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
                    createObjParam(o, n, parObj[n]);
                }
            }
            el.parentNode.replaceChild(o, el);
            r = o;
        }
        return r;
    }
    
    function createObjParam(el, pName, pValue) {
        var p = createElement("param");
        p.setAttribute("name", pName);    
        p.setAttribute("value", pValue);
        el.appendChild(p);
    }
    
    function getElementById(id) {
        return doc.getElementById(id);
    }
    
    function createElement(el) {
        return doc.createElement(el);
    }
    
    function hasPlayerVersion(rv) {
        var pv = ua.pv, v = rv.split(".");
        v[0] = parseInt(v[0], 10);
        v[1] = parseInt(v[1], 10);
        v[2] = parseInt(v[2], 10);
        return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
    }
    
    /* Cross-browser dynamic CSS creation
        - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
    */    
    function createCSS(sel, decl) {
        if (ua.ie && ua.mac) {
            return;
        }
        var h = doc.getElementsByTagName("head")[0], s = createElement("style");
        s.setAttribute("type", "text/css");
        s.setAttribute("media", "screen");
        if (!(ua.ie && ua.win) && typeof doc.createTextNode != UNDEF) {
            s.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
        }
        h.appendChild(s);
        if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
            var ls = doc.styleSheets[doc.styleSheets.length - 1];
            if (typeof ls.addRule == OBJECT) {
                ls.addRule(sel, decl);
            }
        }
    }
    
    function setVisibility(id, isVisible) {
        var v = isVisible ? "visible" : "hidden";
        if (isDomLoaded) {
            getElementById(id).style.visibility = v;
        }
        else {
            createCSS("#" + id, "visibility:" + v);
        }
    }
    
    return {
        /* Public API
            - Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
        */ 
        registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
            if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
                return;
            }
            var regObj = {};
            regObj.id = objectIdStr;
            regObj.swfVersion = swfVersionStr;
            regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
            regObjArr[regObjArr.length] = regObj;
            setVisibility(objectIdStr, false);
        },
        
        getObjectById: function(objectIdStr) {
            var r = null;
            if (ua.w3cdom && isDomLoaded) {
                var o = getElementById(objectIdStr);
                if (o) {
                    var n = o.getElementsByTagName(OBJECT)[0];
                    if (!n || (n && typeof o.SetVariable != UNDEF)) {
                        r = o;
                    }
                    else if (typeof n.SetVariable != UNDEF) {
                        r = n;
                    }
                }
            }
            return r;
        },
        
        embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
            if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
                return;
            }
            widthStr += ""; // Auto-convert to string to make it idiot proof
            heightStr += "";
            if (hasPlayerVersion(swfVersionStr)) {
                setVisibility(replaceElemIdStr, false);
                var att = (typeof attObj == OBJECT) ? attObj : {};
                att.data = swfUrlStr;
                att.width = widthStr;
                att.height = heightStr;
                var par = (typeof parObj == OBJECT) ? parObj : {};
                if (typeof flashvarsObj == OBJECT) {
                    for (var i in flashvarsObj) {
                        if (flashvarsObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
                            if (typeof par.flashvars != UNDEF) {
                                par.flashvars += "&" + i + "=" + flashvarsObj[i];
                            }
                            else {
                                par.flashvars = i + "=" + flashvarsObj[i];
                            }
                        }
                    }
                }
                addDomLoadEvent(function() {
                    createSWF(att, par, replaceElemIdStr);
                    if (att.id == replaceElemIdStr) {
                        setVisibility(replaceElemIdStr, true);
                    }
                });
            }
            else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac)) {
                setVisibility(replaceElemIdStr, false);
                addDomLoadEvent(function() {
                    var regObj = {};
                    regObj.id = regObj.altContentId = replaceElemIdStr;
                    regObj.width = widthStr;
                    regObj.height = heightStr;
                    regObj.expressInstall = xiSwfUrlStr;
                    showExpressInstall(regObj);
                });
            }
        },
        
        getFlashPlayerVersion: function() {
            return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
        },
        
        hasFlashPlayerVersion:hasPlayerVersion,
        
        createSWF: function(attObj, parObj, replaceElemIdStr) {
            if (ua.w3cdom && isDomLoaded) {
                return createSWF(attObj, parObj, replaceElemIdStr);
            }
            else {
                return undefined;
            }
        },
        
        createCSS: function(sel, decl) {
            if (ua.w3cdom) {
                createCSS(sel, decl);
            }
        },
        
        addDomLoadEvent:addDomLoadEvent,
        
        addLoadEvent:addLoadEvent,
        
        getQueryParamValue: function(param) {
            var q = doc.location.search || doc.location.hash;
            if (param == null) {
                return q;
            }
             if(q) {
                var pairs = q.substring(1).split("&");
                for (var i = 0; i < pairs.length; i++) {
                    if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
                        return pairs[i].substring((pairs[i].indexOf("=") + 1));
                    }
                }
            }
            return "";
        },
        
        // For internal usage only
        expressInstallCallback: function() {
            if (isExpressInstallActive && storedAltContent) {
                var obj = getElementById(EXPRESS_INSTALL_ID);
                if (obj) {
                    obj.parentNode.replaceChild(storedAltContent, obj);
                    if (storedAltContentId) {
                        setVisibility(storedAltContentId, true);
                        if (ua.ie && ua.win) {
                            storedAltContent.style.display = "block";
                        }
                    }
                    storedAltContent = null;
                    storedAltContentId = null;
                    isExpressInstallActive = false;
                }
            } 
        }
        
    };

}();
var countriesHash={
AF:{"code":"AF","name":"Afghanistan"},
AX:{"code":"AX","name":"Aland Islands"},
AL:{"code":"AL","name":"Albania"},
DZ:{"code":"DZ","name":"Algeria"},
AS:{"code":"AS","name":"American Samoa"},
AD:{"code":"AD","name":"Andorra"},
AO:{"code":"AO","name":"Angola"},
AI:{"code":"AI","name":"Anguilla"},
AQ:{"code":"AQ","name":"Antarctica"},
AG:{"code":"AG","name":"Antigua and Barbuda"},
AR:{"code":"AR","name":"Argentina"},
AM:{"code":"AM","name":"Armenia"},
AW:{"code":"AW","name":"Aruba"},
AU:{"code":"AU","name":"Australia"},
AT:{"code":"AT","name":"Austria"},
AZ:{"code":"AZ","name":"Azerbaijan"},
BS:{"code":"BS","name":"Bahamas"},
BH:{"code":"BH","name":"Bahrain"},
BD:{"code":"BD","name":"Bangladesh"},
BB:{"code":"BB","name":"Barbados"},
BY:{"code":"BY","name":"Belarus"},
BE:{"code":"BE","name":"Belgium"},
BZ:{"code":"BZ","name":"Belize"},
BJ:{"code":"BJ","name":"Benin"},
BM:{"code":"BM","name":"Bermuda"},
BT:{"code":"BT","name":"Bhutan"},
BO:{"code":"BO","name":"Bolivia"},
BA:{"code":"BA","name":"Bosnia and Herzegovina"},
BW:{"code":"BW","name":"Botswana"},
BV:{"code":"BV","name":"Bouvet Island"},
BR:{"code":"BR","name":"Brazil"},
IO:{"code":"IO","name":"British Indian Ocean Territory"},
BN:{"code":"BN","name":"Brunei Darussalam"},
BG:{"code":"BG","name":"Bulgaria"},
BF:{"code":"BF","name":"Burkina Faso"},
BI:{"code":"BI","name":"Burundi"},
KH:{"code":"KH","name":"Cambodia"},
CM:{"code":"CM","name":"Cameroon"},
CA:{"code":"CA","name":"Canada"},
CV:{"code":"CV","name":"Cape Verde"},
KY:{"code":"KY","name":"Cayman Islands"},
CF:{"code":"CF","name":"Central African Republic"},
TD:{"code":"TD","name":"Chad"},
CL:{"code":"CL","name":"Chile"},
CN:{"code":"CN","name":"China"},
CX:{"code":"CX","name":"Christmas Island"},
CC:{"code":"CC","name":"Cocos (Keeling) Islands"},
CO:{"code":"CO","name":"Colombia"},
KM:{"code":"KM","name":"Comoros"},
CG:{"code":"CG","name":"Congo"},
CK:{"code":"CK","name":"Cook Islands"},
CR:{"code":"CR","name":"Costa Rica"},
CI:{"code":"CI","name":"Cote D'Ivoire (Ivory Coast)"},
HR:{"code":"HR","name":"Croatia (Hrvatska)"},
CU:{"code":"CU","name":"Cuba"},
CY:{"code":"CY","name":"Cyprus"},
CZ:{"code":"CZ","name":"Czech Republic"},
CD:{"code":"CD","name":"Democratic Republic of the Congo"},
DK:{"code":"DK","name":"Denmark"},
DJ:{"code":"DJ","name":"Djibouti"},
DM:{"code":"DM","name":"Dominica"},
DO:{"code":"DO","name":"Dominican Republic"},
TP:{"code":"TP","name":"East Timor"},
EC:{"code":"EC","name":"Ecuador"},
EG:{"code":"EG","name":"Egypt"},
SV:{"code":"SV","name":"El Salvador"},
GQ:{"code":"GQ","name":"Equatorial Guinea"},
ER:{"code":"ER","name":"Eritrea"},
EE:{"code":"EE","name":"Estonia"},
ET:{"code":"ET","name":"Ethiopia"},
FK:{"code":"FK","name":"Falkland Islands (Malvinas)"},
FO:{"code":"FO","name":"Faroe Islands"},
FM:{"code":"FM","name":"Federated States of Micronesia"},
FJ:{"code":"FJ","name":"Fiji"},
FI:{"code":"FI","name":"Finland"},
FR:{"code":"FR","name":"France"},
FX:{"code":"FX","name":"France, Metropolitan"},
GF:{"code":"GF","name":"French Guiana"},
PF:{"code":"PF","name":"French Polynesia"},
TF:{"code":"TF","name":"French Southern Territories"},
GA:{"code":"GA","name":"Gabon"},
GM:{"code":"GM","name":"Gambia"},
GE:{"code":"GE","name":"Georgia"},
DE:{"code":"DE","name":"Germany"},
GH:{"code":"GH","name":"Ghana"},
GI:{"code":"GI","name":"Gibraltar"},
GR:{"code":"GR","name":"Greece"},
GL:{"code":"GL","name":"Greenland"},
GD:{"code":"GD","name":"Grenada"},
GP:{"code":"GP","name":"Guadeloupe"},
GU:{"code":"GU","name":"Guam"},
GT:{"code":"GT","name":"Guatemala"},
GN:{"code":"GN","name":"Guinea"},
GW:{"code":"GW","name":"Guinea-Bissau"},
GY:{"code":"GY","name":"Guyana"},
HT:{"code":"HT","name":"Haiti"},
HM:{"code":"HM","name":"Heard Island and McDonald Islands"},
HN:{"code":"HN","name":"Honduras"},
HK:{"code":"HK","name":"Hong Kong"},
HU:{"code":"HU","name":"Hungary"},
IS:{"code":"IS","name":"Iceland"},
IN:{"code":"IN","name":"India"},
ID:{"code":"ID","name":"Indonesia"},
IR:{"code":"IR","name":"Iran"},
IQ:{"code":"IQ","name":"Iraq"},
IE:{"code":"IE","name":"Ireland"},
IL:{"code":"IL","name":"Israel"},
IT:{"code":"IT","name":"Italy"},
JM:{"code":"JM","name":"Jamaica"},
JP:{"code":"JP","name":"Japan"},
JO:{"code":"JO","name":"Jordan"},
KZ:{"code":"KZ","name":"Kazakhstan"},
KE:{"code":"KE","name":"Kenya"},
KI:{"code":"KI","name":"Kiribati"},
KP:{"code":"KP","name":"Korea (North)"},
KR:{"code":"KR","name":"Korea (South)"},
KW:{"code":"KW","name":"Kuwait"},
KG:{"code":"KG","name":"Kyrgyzstan"},
LA:{"code":"LA","name":"Laos"},
LV:{"code":"LV","name":"Latvia"},
LB:{"code":"LB","name":"Lebanon"},
LS:{"code":"LS","name":"Lesotho"},
LR:{"code":"LR","name":"Liberia"},
LY:{"code":"LY","name":"Libya"},
LI:{"code":"LI","name":"Liechtenstein"},
LT:{"code":"LT","name":"Lithuania"},
LU:{"code":"LU","name":"Luxembourg"},
MO:{"code":"MO","name":"Macao"},
MK:{"code":"MK","name":"Macedonia"},
MG:{"code":"MG","name":"Madagascar"},
MW:{"code":"MW","name":"Malawi"},
MY:{"code":"MY","name":"Malaysia"},
MV:{"code":"MV","name":"Maldives"},
ML:{"code":"ML","name":"Mali"},
MT:{"code":"MT","name":"Malta"},
MH:{"code":"MH","name":"Marshall Islands"},
MQ:{"code":"MQ","name":"Martinique"},
MR:{"code":"MR","name":"Mauritania"},
MU:{"code":"MU","name":"Mauritius"},
YT:{"code":"YT","name":"Mayotte"},
MX:{"code":"MX","name":"Mexico"},
MD:{"code":"MD","name":"Moldova"},
MC:{"code":"MC","name":"Monaco"},
MN:{"code":"MN","name":"Mongolia"},
MS:{"code":"MS","name":"Montserrat"},
MA:{"code":"MA","name":"Morocco"},
MZ:{"code":"MZ","name":"Mozambique"},
MM:{"code":"MM","name":"Myanmar"},
NA:{"code":"NA","name":"Namibia"},
NR:{"code":"NR","name":"Nauru"},
NP:{"code":"NP","name":"Nepal"},
NL:{"code":"NL","name":"Netherlands"},
AN:{"code":"AN","name":"Netherlands Antilles"},
NC:{"code":"NC","name":"New Caledonia"},
NZ:{"code":"NZ","name":"New Zealand (Aotearoa)"},
NI:{"code":"NI","name":"Nicaragua"},
NE:{"code":"NE","name":"Niger"},
NG:{"code":"NG","name":"Nigeria"},
NU:{"code":"NU","name":"Niue"},
NF:{"code":"NF","name":"Norfolk Island"},
MP:{"code":"MP","name":"Northern Mariana Islands"},
NO:{"code":"NO","name":"Norway"},
OM:{"code":"OM","name":"Oman"},
PK:{"code":"PK","name":"Pakistan"},
PW:{"code":"PW","name":"Palau"},
PS:{"code":"PS","name":"Palestinian Territory"},
PA:{"code":"PA","name":"Panama"},
PG:{"code":"PG","name":"Papua New Guinea"},
PY:{"code":"PY","name":"Paraguay"},
PE:{"code":"PE","name":"Peru"},
PH:{"code":"PH","name":"Philippines"},
PN:{"code":"PN","name":"Pitcairn"},
PL:{"code":"PL","name":"Poland"},
PT:{"code":"PT","name":"Portugal"},
PR:{"code":"PR","name":"Puerto Rico"},
QA:{"code":"QA","name":"Qatar"},
RE:{"code":"RE","name":"Reunion"},
RO:{"code":"RO","name":"Romania"},
RU:{"code":"RU","name":"Russian Federation"},
RW:{"code":"RW","name":"Rwanda"},
GS:{"code":"GS","name":"S. Georgia and S. Sandwich Islands"},
SH:{"code":"SH","name":"Saint Helena"},
KN:{"code":"KN","name":"Saint Kitts and Nevis"},
LC:{"code":"LC","name":"Saint Lucia"},
PM:{"code":"PM","name":"Saint Pierre and Miquelon"},
VC:{"code":"VC","name":"Saint Vincent and the Grenadines"},
WS:{"code":"WS","name":"Samoa"},
SM:{"code":"SM","name":"San Marino"},
ST:{"code":"ST","name":"Sao Tome and Principe"},
SA:{"code":"SA","name":"Saudi Arabia"},
SN:{"code":"SN","name":"Senegal"},
CS:{"code":"CS","name":"Serbia and Montenegro"},
SC:{"code":"SC","name":"Seychelles"},
SL:{"code":"SL","name":"Sierra Leone"},
SG:{"code":"SG","name":"Singapore"},
SK:{"code":"SK","name":"Slovakia"},
SI:{"code":"SI","name":"Slovenia"},
SB:{"code":"SB","name":"Solomon Islands"},
SO:{"code":"SO","name":"Somalia"},
ZA:{"code":"ZA","name":"South Africa"},
ES:{"code":"ES","name":"Spain"},
LK:{"code":"LK","name":"Sri Lanka"},
SD:{"code":"SD","name":"Sudan"},
SR:{"code":"SR","name":"Suriname"},
SJ:{"code":"SJ","name":"Svalbard and Jan Mayen"},
SZ:{"code":"SZ","name":"Swaziland"},
SE:{"code":"SE","name":"Sweden"},
CH:{"code":"CH","name":"Switzerland"},
SY:{"code":"SY","name":"Syria"},
TW:{"code":"TW","name":"Taiwan"},
TJ:{"code":"TJ","name":"Tajikistan"},
TZ:{"code":"TZ","name":"Tanzania"},
TH:{"code":"TH","name":"Thailand"},
TL:{"code":"TL","name":"Timor-Leste"},
TG:{"code":"TG","name":"Togo"},
TK:{"code":"TK","name":"Tokelau"},
TO:{"code":"TO","name":"Tonga"},
TT:{"code":"TT","name":"Trinidad and Tobago"},
TN:{"code":"TN","name":"Tunisia"},
TR:{"code":"TR","name":"Turkey"},
TM:{"code":"TM","name":"Turkmenistan"},
TC:{"code":"TC","name":"Turks and Caicos Islands"},
TV:{"code":"TV","name":"Tuvalu"},
UG:{"code":"UG","name":"Uganda"},
UA:{"code":"UA","name":"Ukraine"},
AE:{"code":"AE","name":"United Arab Emirates"},
GB:{"code":"GB","name":"United Kingdom"},
US:{"code":"US","name":"United States"},
UM:{"code":"UM","name":"United States Minor Outlying Islands"},
UY:{"code":"UY","name":"Uruguay"},
UZ:{"code":"UZ","name":"Uzbekistan"},
VU:{"code":"VU","name":"Vanuatu"},
VA:{"code":"VA","name":"Vatican City State (Holy See)"},
VE:{"code":"VE","name":"Venezuela"},
VN:{"code":"VN","name":"Viet Nam"},
VG:{"code":"VG","name":"Virgin Islands (British)"},
VI:{"code":"VI","name":"Virgin Islands (U.S.)"},
WF:{"code":"WF","name":"Wallis and Futuna"},
EH:{"code":"EH","name":"Western Sahara"},
YE:{"code":"YE","name":"Yemen"},
ZM:{"code":"ZM","name":"Zambia"},
ZW:{"code":"ZW","name":"Zimbabwe"}
};
var countries=[
{"code":"AF","name":"Afghanistan"},
{"code":"AX","name":"Aland Islands"},
{"code":"AL","name":"Albania"},
{"code":"DZ","name":"Algeria"},
{"code":"AS","name":"American Samoa"},
{"code":"AD","name":"Andorra"},
{"code":"AO","name":"Angola"},
{"code":"AI","name":"Anguilla"},
{"code":"AQ","name":"Antarctica"},
{"code":"AG","name":"Antigua and Barbuda"},
{"code":"AR","name":"Argentina"},
{"code":"AM","name":"Armenia"},
{"code":"AW","name":"Aruba"},
{"code":"AU","name":"Australia"},
{"code":"AT","name":"Austria"},
{"code":"AZ","name":"Azerbaijan"},
{"code":"BS","name":"Bahamas"},
{"code":"BH","name":"Bahrain"},
{"code":"BD","name":"Bangladesh"},
{"code":"BB","name":"Barbados"},
{"code":"BY","name":"Belarus"},
{"code":"BE","name":"Belgium"},
{"code":"BZ","name":"Belize"},
{"code":"BJ","name":"Benin"},
{"code":"BM","name":"Bermuda"},
{"code":"BT","name":"Bhutan"},
{"code":"BO","name":"Bolivia"},
{"code":"BA","name":"Bosnia and Herzegovina"},
{"code":"BW","name":"Botswana"},
{"code":"BV","name":"Bouvet Island"},
{"code":"BR","name":"Brazil"},
{"code":"IO","name":"British Indian Ocean Territory"},
{"code":"BN","name":"Brunei Darussalam"},
{"code":"BG","name":"Bulgaria"},
{"code":"BF","name":"Burkina Faso"},
{"code":"BI","name":"Burundi"},
{"code":"KH","name":"Cambodia"},
{"code":"CM","name":"Cameroon"},
{"code":"CA","name":"Canada"},
{"code":"CV","name":"Cape Verde"},
{"code":"KY","name":"Cayman Islands"},
{"code":"CF","name":"Central African Republic"},
{"code":"TD","name":"Chad"},
{"code":"CL","name":"Chile"},
{"code":"CN","name":"China"},
{"code":"CX","name":"Christmas Island"},
{"code":"CC","name":"Cocos (Keeling) Islands"},
{"code":"CO","name":"Colombia"},
{"code":"KM","name":"Comoros"},
{"code":"CG","name":"Congo"},
{"code":"CK","name":"Cook Islands"},
{"code":"CR","name":"Costa Rica"},
{"code":"CI","name":"Cote D'Ivoire (Ivory Coast)"},
{"code":"HR","name":"Croatia (Hrvatska)"},
{"code":"CU","name":"Cuba"},
{"code":"CY","name":"Cyprus"},
{"code":"CZ","name":"Czech Republic"},
{"code":"CD","name":"Democratic Republic of the Congo"},
{"code":"DK","name":"Denmark"},
{"code":"DJ","name":"Djibouti"},
{"code":"DM","name":"Dominica"},
{"code":"DO","name":"Dominican Republic"},
{"code":"TP","name":"East Timor"},
{"code":"EC","name":"Ecuador"},
{"code":"EG","name":"Egypt"},
{"code":"SV","name":"El Salvador"},
{"code":"GQ","name":"Equatorial Guinea"},
{"code":"ER","name":"Eritrea"},
{"code":"EE","name":"Estonia"},
{"code":"ET","name":"Ethiopia"},
{"code":"FK","name":"Falkland Islands (Malvinas)"},
{"code":"FO","name":"Faroe Islands"},
{"code":"FM","name":"Federated States of Micronesia"},
{"code":"FJ","name":"Fiji"},
{"code":"FI","name":"Finland"},
{"code":"FR","name":"France"},
{"code":"FX","name":"France, Metropolitan"},
{"code":"GF","name":"French Guiana"},
{"code":"PF","name":"French Polynesia"},
{"code":"TF","name":"French Southern Territories"},
{"code":"GA","name":"Gabon"},
{"code":"GM","name":"Gambia"},
{"code":"GE","name":"Georgia"},
{"code":"DE","name":"Germany"},
{"code":"GH","name":"Ghana"},
{"code":"GI","name":"Gibraltar"},
{"code":"GR","name":"Greece"},
{"code":"GL","name":"Greenland"},
{"code":"GD","name":"Grenada"},
{"code":"GP","name":"Guadeloupe"},
{"code":"GU","name":"Guam"},
{"code":"GT","name":"Guatemala"},
{"code":"GN","name":"Guinea"},
{"code":"GW","name":"Guinea-Bissau"},
{"code":"GY","name":"Guyana"},
{"code":"HT","name":"Haiti"},
{"code":"HM","name":"Heard Island and McDonald Islands"},
{"code":"HN","name":"Honduras"},
{"code":"HK","name":"Hong Kong"},
{"code":"HU","name":"Hungary"},
{"code":"IS","name":"Iceland"},
{"code":"IN","name":"India"},
{"code":"ID","name":"Indonesia"},
{"code":"IR","name":"Iran"},
{"code":"IQ","name":"Iraq"},
{"code":"IE","name":"Ireland"},
{"code":"IL","name":"Israel"},
{"code":"IT","name":"Italy"},
{"code":"JM","name":"Jamaica"},
{"code":"JP","name":"Japan"},
{"code":"JO","name":"Jordan"},
{"code":"KZ","name":"Kazakhstan"},
{"code":"KE","name":"Kenya"},
{"code":"KI","name":"Kiribati"},
{"code":"KP","name":"Korea (North)"},
{"code":"KR","name":"Korea (South)"},
{"code":"KW","name":"Kuwait"},
{"code":"KG","name":"Kyrgyzstan"},
{"code":"LA","name":"Laos"},
{"code":"LV","name":"Latvia"},
{"code":"LB","name":"Lebanon"},
{"code":"LS","name":"Lesotho"},
{"code":"LR","name":"Liberia"},
{"code":"LY","name":"Libya"},
{"code":"LI","name":"Liechtenstein"},
{"code":"LT","name":"Lithuania"},
{"code":"LU","name":"Luxembourg"},
{"code":"MO","name":"Macao"},
{"code":"MK","name":"Macedonia"},
{"code":"MG","name":"Madagascar"},
{"code":"MW","name":"Malawi"},
{"code":"MY","name":"Malaysia"},
{"code":"MV","name":"Maldives"},
{"code":"ML","name":"Mali"},
{"code":"MT","name":"Malta"},
{"code":"MH","name":"Marshall Islands"},
{"code":"MQ","name":"Martinique"},
{"code":"MR","name":"Mauritania"},
{"code":"MU","name":"Mauritius"},
{"code":"YT","name":"Mayotte"},
{"code":"MX","name":"Mexico"},
{"code":"MD","name":"Moldova"},
{"code":"MC","name":"Monaco"},
{"code":"MN","name":"Mongolia"},
{"code":"MS","name":"Montserrat"},
{"code":"MA","name":"Morocco"},
{"code":"MZ","name":"Mozambique"},
{"code":"MM","name":"Myanmar"},
{"code":"NA","name":"Namibia"},
{"code":"NR","name":"Nauru"},
{"code":"NP","name":"Nepal"},
{"code":"NL","name":"Netherlands"},
{"code":"AN","name":"Netherlands Antilles"},
{"code":"NC","name":"New Caledonia"},
{"code":"NZ","name":"New Zealand (Aotearoa)"},
{"code":"NI","name":"Nicaragua"},
{"code":"NE","name":"Niger"},
{"code":"NG","name":"Nigeria"},
{"code":"NU","name":"Niue"},
{"code":"NF","name":"Norfolk Island"},
{"code":"MP","name":"Northern Mariana Islands"},
{"code":"NO","name":"Norway"},
{"code":"OM","name":"Oman"},
{"code":"PK","name":"Pakistan"},
{"code":"PW","name":"Palau"},
{"code":"PS","name":"Palestinian Territory"},
{"code":"PA","name":"Panama"},
{"code":"PG","name":"Papua New Guinea"},
{"code":"PY","name":"Paraguay"},
{"code":"PE","name":"Peru"},
{"code":"PH","name":"Philippines"},
{"code":"PN","name":"Pitcairn"},
{"code":"PL","name":"Poland"},
{"code":"PT","name":"Portugal"},
{"code":"PR","name":"Puerto Rico"},
{"code":"QA","name":"Qatar"},
{"code":"RE","name":"Reunion"},
{"code":"RO","name":"Romania"},
{"code":"RU","name":"Russian Federation"},
{"code":"RW","name":"Rwanda"},
{"code":"GS","name":"S. Georgia and S. Sandwich Islands"},
{"code":"SH","name":"Saint Helena"},
{"code":"KN","name":"Saint Kitts and Nevis"},
{"code":"LC","name":"Saint Lucia"},
{"code":"PM","name":"Saint Pierre and Miquelon"},
{"code":"VC","name":"Saint Vincent and the Grenadines"},
{"code":"WS","name":"Samoa"},
{"code":"SM","name":"San Marino"},
{"code":"ST","name":"Sao Tome and Principe"},
{"code":"SA","name":"Saudi Arabia"},
{"code":"SN","name":"Senegal"},
{"code":"CS","name":"Serbia and Montenegro"},
{"code":"SC","name":"Seychelles"},
{"code":"SL","name":"Sierra Leone"},
{"code":"SG","name":"Singapore"},
{"code":"SK","name":"Slovakia"},
{"code":"SI","name":"Slovenia"},
{"code":"SB","name":"Solomon Islands"},
{"code":"SO","name":"Somalia"},
{"code":"ZA","name":"South Africa"},
{"code":"ES","name":"Spain"},
{"code":"LK","name":"Sri Lanka"},
{"code":"SD","name":"Sudan"},
{"code":"SR","name":"Suriname"},
{"code":"SJ","name":"Svalbard and Jan Mayen"},
{"code":"SZ","name":"Swaziland"},
{"code":"SE","name":"Sweden"},
{"code":"CH","name":"Switzerland"},
{"code":"SY","name":"Syria"},
{"code":"TW","name":"Taiwan"},
{"code":"TJ","name":"Tajikistan"},
{"code":"TZ","name":"Tanzania"},
{"code":"TH","name":"Thailand"},
{"code":"TL","name":"Timor-Leste"},
{"code":"TG","name":"Togo"},
{"code":"TK","name":"Tokelau"},
{"code":"TO","name":"Tonga"},
{"code":"TT","name":"Trinidad and Tobago"},
{"code":"TN","name":"Tunisia"},
{"code":"TR","name":"Turkey"},
{"code":"TM","name":"Turkmenistan"},
{"code":"TC","name":"Turks and Caicos Islands"},
{"code":"TV","name":"Tuvalu"},
{"code":"UG","name":"Uganda"},
{"code":"UA","name":"Ukraine"},
{"code":"AE","name":"United Arab Emirates"},
{"code":"GB","name":"United Kingdom"},
{"code":"US","name":"United States"},
{"code":"UM","name":"United States Minor Outlying Islands"},
{"code":"UY","name":"Uruguay"},
{"code":"UZ","name":"Uzbekistan"},
{"code":"VU","name":"Vanuatu"},
{"code":"VA","name":"Vatican City State (Holy See)"},
{"code":"VE","name":"Venezuela"},
{"code":"VN","name":"Viet Nam"},
{"code":"VG","name":"Virgin Islands (British)"},
{"code":"VI","name":"Virgin Islands (U.S.)"},
{"code":"WF","name":"Wallis and Futuna"},
{"code":"EH","name":"Western Sahara"},
{"code":"YE","name":"Yemen"},
{"code":"ZM","name":"Zambia"},
{"code":"ZW","name":"Zimbabwe"}];
var epgPage = {
 api : { favoritesAdd : '/api/favorites/add/%{publicId}?json_function=%{callback}',
         playlistAdd : '/api/playlist/add/%{publicId}?json_function=%{callback}' }
};

epgPage.addToList = function(e, listName, publicId, htmlId){
  var event = e || window.event;
  var targetButton = (event.target || event.srcElement).parentNode;
  
  if (!User.loggedIn) {
    User.promptForLogin('<h1>To add videos to the ' + listName  + ', you must be logged in</h1>',function() {epgPage.addToList(e, listName, publicId, htmlId)});
    return;
  }
  
  if(listName != 'favorites' && listName != 'playlist') {
    return;
  }
  //disable the btns
  var btnsHolder = document.getElementById(htmlId + '_buttons');
  if (btnsHolder) {
    btnsHolder.style.display = 'none';
    btnsHolder.doHide = true;
    var img = document.createElement('img');
    img.id = htmlId + "_loader";
    img.title = "Please wait";
    img.src = "/static/big-loader.gif";
    btnsHolder.parentNode.appendChild(img);
  }
  
  window.epgPage[htmlId] = function(response) {
    var loader = document.getElementById(htmlId + "_loader");
    loader.parentNode.removeChild(loader);
    
    var success = (response.resultCode == 3007 || response.success) ? true : false;
    if(response.success && window.Loader) {
      Loader.clearZapper(listName);
    }
    if (btnsHolder) {
      var div = document.createElement('div');
      div.id = htmlId + '_note';
      var message = (success) ? 'Added' : 'Failed';
      div.className = (success) ? "note success" : "note failure";
      if(response.resultCode == 3007) {
        message = "Already added";
      }
      div.innerHTML = ["<p>",message,"</p>"].join('');
      btnsHolder.parentNode.appendChild(div);
    }
    if (success && window.ListUpdated) {
      ListUpdated.fire(listName,publicId);
    }
    
    var icoply = (listName == 'favorites') ? byid('metaConsoleAddToFavorites') : byid('metaConsoleAddToQueue');
    if(response.success && icoply) {
        updateMetaconsoleBtns(response.selected.publicId,listName,icoply);
    }
    
  };
    
  jsonRequest(substitute((listName == 'favorites') ? epgPage.api.favoritesAdd : epgPage.api.playlistAdd,
                                                    { publicId : publicId,
                                                      callback : 'epgPage.' + htmlId }
                        ));
  if (listName == 'favorites') {
    fbUtils.addFavorite(publicId);
  }
   
};

epgPage.toggleButtons = function (thumbnail, display, keepBtns) {
  var btns = document.getElementById(thumbnail + '_buttons');
  var fauxBtns = document.getElementById(thumbnail + '_fauxButtons');
  var play = document.getElementById(thumbnail + '_play');
  var hideDesc = document.getElementById(thumbnail + '_hideDesc');
  var note = document.getElementById(thumbnail + '_note');
  var loader = document.getElementById(thumbnail + '_loader');
  if (display) {
    if (btns && !btns.doHide) {
      btns.style.display = "block";
    }
    if (fauxBtns) {
      fauxBtns.style.display = "none";
    }
    if (play) {
      play.style.visibility = "visible";
    }
    if (hideDesc) {
      hideDesc.style.display = "none";
    }
    if(note) {
      setTimeout(function(){
         if(note && note.parentNode) {
           note.parentNode.removeChild(note);
           btns.doHide = false;
           fauxBtns.style.display = "block";
         }
      }, 1000);
    }
  } 
  else {
    if (!keepBtns && btns) {
      btns.style.display = "none";
    }
    if (fauxBtns && !loader && !note) {
      fauxBtns.style.display = "block";
    }
    if (play) {
      play.style.visibility = "hidden";
    }
    if (hideDesc) {
      hideDesc.style.display = "block";
    }
  }
};

epgPage.playNow=function() {
  /* everyone can watch */
  return true;
};

epgPage.geoCheck=function() {
  if (window.User_Details.country && window.User_Details.country != Page.country.toUpperCase()) {
    var epgGeoCheck = document.getElementById('epgGeoCheck');
    if (epgGeoCheck) {
      epgGeoCheck.innerHTML = '<div class="blockGeoWarning"><div class="innerPadding"><p>Oops &ndash; you\'ve landed on a page with shows and channels that are available in a different country.</p><p><a href="/epg/'+window.User_Details.country.toLowerCase()+'/shows/">Find shows and channels that are available in your country now</a>.</p></div></div>';
    }
  }
};
var MetaConsole = {
  current : { publicId : '',
              title : '', description : '',
              thumbnail : '', duration : 0, minimumAge : 0,
              creationDate : '', publicDate : '', owner : '',
              genres : []
            },
  relatedChannel : '<div class="thumbnail %{class}"><a onclick="return epgPage.playNow(\'%{publicId}\', this);" title="%{title}" href="%{href}"><img rel="png" style="visibility: visible;" onload="this.style.visibility=\'visible\'" onerror="changeToFallback(this, \'/static/%{class}.jpg\');" class="%{class}"  src="%{thumbnail}"/></a></div>',

  metadataProvider: '/api/metadata/get/%i?json_function=MetaConsole.update&type=everything'
};

MetaConsole.metaConsoleDrawerThrobber = function(){
  byid('metaConsoleDrawer').innerHTML = '<div class="blockFauxPadding"><div class="blockFauxPadding"><img alt="Please Wait" src="/static/big-loader.gif"/></div></div>';
};

MetaConsole.updateRelatedChannels = function(){
  var channels = MetaConsole.current.channels;
  var html = "";
  if(byid('channelListBrick')) {
    byid('channelListBrick').style.display = ((channels && channels.length) ? 'block' : 'none');
  }
  if(channels) {
    for(var i = 0; i < channels.length && i < 6; i++) {
      var publicId = channels[i].publicId;
      var href = semanticURLize(channels[i].publicId, channels[i].title);
      var title = escapeHTML(channels[i].title);
      var thumbnail = channels[i].thumbnail;
      html += substitute(MetaConsole.relatedChannel, { "class" : (i > 1) ? 't1' : 't2', publicId : publicId, href: href,
                                                       title : title, thumbnail : thumbnail });
    }
  }
  if (byid('channelList')) {
    byid('channelList').innerHTML = html;
  }
};

MetaConsole.track2 = function(str,str1,id) {
  return function() {
    analyticsTrackEvent2(str, str1, id)
  };
}
MetaConsole.emptyFunction = function() { return true; };

MetaConsole.updateShare = function(entryObj){
  var publicId = entryObj.publicId;
  var title = entryObj.title;
  var description = entryObj.description;
  var url = 'http://www.joost.com' + semanticURLize(publicId, title);

  var embedIpt=byid('metaConsoleEmbedIpt');
  var embedDisplay=byid('metaConsoleEmbedDisplay');
  if (embedDisplay && embedIpt) {
    if (entryObj.embeddable) {
      embedDisplay.style.display="block";
      embedIpt.value = '<object width="640" height="360"><param name="movie" value="http://www.joost.com/embed/' + publicId + '"></param><param name="allowFullScreen" value="true"></param><param name="allowNetworking" value="all"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.joost.com/embed/' + publicId + '" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" allownetworking="all" width="640" height="360"><noembed><a href="'+url+'">' + escapeHTML(title) + '</a></noembed></embed></object>';
      embedIpt.oncopy = MetaConsole.track2('metaconsole', 'embed-copy', publicId);
    } else {
      embedDisplay.style.display="none";
      embedIpt.value="";
      embedIpt.oncopy = MetaConsole.emptyFunction;
    }
  }
  var shareIpt=byid('metaConsoleShareIpt');
  if (shareIpt) {
    shareIpt.value = url;
    shareIpt.oncopy = MetaConsole.track2('metaconsole', 'copyurl-copy', publicId);
  }
  byid('metaConsoleStumble').href = "http://www.stumbleupon.com/submit?url="+encodeURIComponent(url)+"/article.php?title="+encodeURIComponent(title);
  byid('metaConsoleFB').href= "http://www.facebook.com/sharer.php?u="+encodeURIComponent(url)+"&t="+encodeURIComponent(title);
  if (Page.diggEnabled) {
    var diggIframe = byid('metaConsoleDigg').getElementsByTagName('iframe');
    if(diggIframe.length) {
      diggIframe[0].src = substitute('http://digg.com/tools/diggthis.php?u=http%3A//www.joost.com/%{publicId}&s=compact&t=%{title}&w=new', {title : title, publicId : publicId });
    }
  }
};

MetaConsole.shareOnClick = function(serviceId, htmlEl){
  var entryObj = MetaConsole.current;
  var title = entryObj.title;
  var publicId = entryObj.publicId
  var url = 'http://www.joost.com' + semanticURLize(publicId, title);
  if(serviceId == 'delicious') {
    window.open('', 'deliciousuiv5','location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=500');
    htmlEl.href = 'http://delicious.com/save?v=5&partner=joost&noui=1&jump=doclose&url=' + encodeURIComponent(url);
  }
  analyticsTrackEvent2('metaconsole', 'share-click', serviceId);
};

MetaConsole.displayTags = function(id) {
  if(id == 'user'){
    byid('metaConsoleUserTagMore').style.display = 'inline';
    byid('metaConsoleUserTagMoreLabel').style.display = 'none';
  } else if(id == 'tags'){
    byid('metaConsoleTagMore').style.display = 'inline';
    byid('metaConsoleTagMoreLabel').style.display = 'none';
  }
};

MetaConsole.openDrawer = function(featureId) {
  var me = MetaConsole;

  if(me.featureId == 'details' && me.drawerOpen) {
    byid('metaConsoleDetails').appendChild(byid('metaConsoleDrawer').firstChild);
  }

  byid('metaConsoleDrawer').innerHTML = "";
  var shareEmbed = byid('shareEmbed');
  if (shareEmbed) {
    shareEmbed.style.display = "none";
  }

  if(me.drawerOpen && me.featureId == featureId) {
    me.drawerOpen = false;
    return;
  }

  me.featureId = featureId;
  me.drawerOpen = true;
  if(featureId == 'details') {
    var detailsHTML = byid('metaConsoleDetails').firstChild;
    byid('metaConsoleDrawer').appendChild(detailsHTML);
    return;
  }
  if(featureId == 'comments'){
    if(!window.Comments && !window.CommentsContentLoad) {
      MetaConsole.metaConsoleDrawerThrobber();
      window.CommentsContentLoad = function() {
        if(MetaConsole.featureId != 'comments') {
          return;
        }
        Comments.show('metaConsoleDrawer', me.current.publicId);
      };
      jsonRequest("/js-packets/comments.js")
    } else {
      Comments.show('metaConsoleDrawer', me.current.publicId);
    }
  }
  if(featureId == 'share') {

    if(!window.Share && !window.ShareContentLoad) {
      MetaConsole.metaConsoleDrawerThrobber();
      window.ShareContentLoad = function() {
        if(MetaConsole.featureId != 'share') {
          return;
        }
        Share.show('metaConsoleDrawer', me.current.publicId, 'toGroup'); 
      };
      jsonRequest("/js-packets/share.js")
    } else {
      Share.show('metaConsoleDrawer', me.current.publicId, 'toGroup'); 
    }
  }
  if(featureId == 'shouts') {
    if(!window.Shouts && !window.ShoutsContentLoad) {
      MetaConsole.metaConsoleDrawerThrobber();
      window.ShoutsContentLoad = function() {
        if(MetaConsole.featureId != 'shouts') {
          return;
        }
        Shouts.show('metaConsoleDrawer', me.current.publicId, me.current.title, me.current.shouts);
      };
      jsonRequest("/js-packets/shouts.js")
    } else {
      Shouts.show('metaConsoleDrawer', me.current.publicId, me.current.title, me.current.shouts);
    }
  }
  if(featureId == 'tags') {
    if (!User.loggedIn) {
      User.promptForLogin('<h1>To tag content, you must be logged in</h1>',MetaConsole.openDrawer(featureId));
      return;
    } else if (!User.interact) {
      User.promptForConfirmation('<h1>To tag content, you must have confirmed your email address</h1>',MetaConsole.openDrawer(featureId));
      return;
    }
    if(!window.Tags && !window.TagsContentLoad) {
      MetaConsole.metaConsoleDrawerThrobber();
      window.TagsContentLoad = function() {
        if(MetaConsole.featureId != 'tags') {
          return;
        }
        Tags.show('metaConsoleDrawer', me.current.publicId);
      };
      jsonRequest("/js-packets/tags.js")
    } else {
      Tags.show('metaConsoleDrawer', me.current.publicId);
    }
  }
  if(featureId == 'favorites'){
    if ((MetaConsole.current.channels && MetaConsole.current.channels[0] && MetaConsole.current.channels[0].publicId) || Page.type == "channel") {
      if(!window.Favorites && !window.FavoritesContentLoad) {
        MetaConsole.metaConsoleDrawerThrobber();
        window.FavoritesContentLoad = function() {
          if(MetaConsole.featureId != 'favorites') {
            return;
          }
          Favorites.show('metaConsoleDrawer', me.current.publicId);
        };
        jsonRequest("/js-packets/favorites.js");
      } else {
        Favorites.show('metaConsoleDrawer', me.current.publicId);
      }
    }
    else {
      addEntryToList('favorites', Page.publicId);
      return;
    }
  }
};

MetaConsole.removeUserTag = function(tagId, publicId, tagName) {
  var cleanup = function(response){
    if(!response.success) {
      //error msg
      return;
    }

    MetaConsole.updateTags();
    //errorOrNote(response.success,
    //            "Oops, something went wrong. Please try again a little later &#8230;",
    //            "Tag &#8220;" + escapeHTML(tagName) + "&#8221; has been deleted");
  };
  if(!window.User_Details) { //need to be logged in
    return;
  }
  jsonPost( substitute("/api/tag/removeByUser/%{publicId}/", { publicId: publicId }),
            null, cleanup, byid('removeTagForm'), { tag: tagName, joostName : window.User_Details.joostName });
  byid('removeTagForm').submit();
};

MetaConsole.updateTags = function() {
  jsonRequest('/api/tag/get/' + MetaConsole.current.publicId + '?json_function=MetaConsole.handleTagsUpdate');
};

MetaConsole.handleTagsUpdate = function(response){
  var me = MetaConsole;
  byid('metaConsoleUserTags').innerHTML = '';
  byid('metaConsoleTag').innerHTML = '';
  if(!response.success) {
    return;
  }
  byid('metaConsoleUserTagsGroup').style.display = (response.usertags.length) ? 'inline' : 'none';
  byid('metaConsoleTagsIconBtn').style.display = (response.usertags.length) ? 'none' : 'inline';
  byid('metaConsoleTagsBtn').style.display = (response.usertags.length) ? 'inline' : 'none';

  var userArray = [];
  for(var i = 0; i < response.usertags.length; i++) {
    var usertaghtml = '<a href="/search?q=tag:' + escapeHTML(response.usertags[i].name) + '">'+ escapeHTML(response.usertags[i].name) +'</a>';
    usertaghtml += ' <a title="Remove '+ escapeHTML(response.usertags[i].name) +'" class="microButton microButtonClose" onclick="MetaConsole.removeUserTag(\'mytag-'+ i +'\', \''+me.current.publicId+ '\', \''+ escapeHTML(response.usertags[i].name) +'\'); return false;" href="#"><img alt="Remove '+ escapeHTML(response.usertags[i].name) +'" src="/static/transparent.gif"/></a>';
    if(i == 2 && response.usertags.length > 3) {
      usertaghtml += '<span id="metaConsoleUserTagMoreLabel"> ... (<a onclick="MetaConsole.displayTags(\'user\'); return false;" href="#" class="groupSeeAll">See all</a>)</span><span id="metaConsoleUserTagMore" style="display:none">';
    }
    if(response.usertags.length == i - 1){
      usertaghtml += '</span>';
    }
    userArray.push(usertaghtml);
  }
  byid('metaConsoleUserTags').innerHTML = userArray.join(', ')


  var tagsArray = [];
  for(var i = 0; i < response.tags.length; i++) {
    var taghtml = '<a href="/search?q=tag:' + escapeHTML(response.tags[i].name) + '">' + escapeHTML(response.tags[i].name) + '</a>';
    if(i == 2 && response.tags.length > 3) {
      taghtml += '<span id="metaConsoleTagMoreLabel"> ... (<a onclick="MetaConsole.displayTags(\'tags\'); return false;" href="#" class="groupSeeAll">See all</a>)</span><span id="metaConsoleTagMore" style="display:none">';
    }
    if(response.tags.length == i - 1){
      taghtml += '</span>';
    }
    tagsArray.push(taghtml);
  }
  if(!tagsArray.length) {
    tagsArray.push('Nothing yet!');
  }

  byid('metaConsoleTag').innerHTML = tagsArray.join(', ');
};

MetaConsole.flagContent = function(){
  if (!User.loggedIn) {
    User.promptForLogin('<h1>To flag this video as as inappropriate, you must be logged in</h1>',function() {MetaConsole.flagContent()});
    return;
  }
  var publicId = MetaConsole.current.publicId;
  var containerId = 'metaconsoleFlagComponentExtended';
  var container = document.getElementById(containerId);
  if (window.FlagContent) {
    FlagContent.show(containerId, publicId);
  } else if(!metaConsole.flagLoading) {
    metaConsole.flagLoading = true;
    window.FlagContentLoad = function() {
      FlagContent.show(containerId, publicId);
    };
    jsonRequest("/js-packets/flagContent.js");
  }
  container.style.display = ( container.style.display == 'block') ? 'none' : 'block';
};

MetaConsole.showWait=function() {
  // XXX this really should be something better than simply hiding the
};

MetaConsole.update = function(response) {
  var me = MetaConsole;
  if (response.resultCode != 1000) {
    byid("metaConsole").style.display = "none";
    return;
  } else {
    byid("metaConsole").style.display = "block";
  }
  var entryObj = response.entry;
  me.current = entryObj;

  if (window.PageShows) {
    PageShows[entryObj.publicId]=entryObj;
  }

  var titleHTML = byid('metaConsoleTitle');
  if(titleHTML) {
    titleHTML.innerText = titleHTML.textContent = (entryObj.title.length > 50) ? (entryObj.title.substring(0, 50) + ' ...') : entryObj.title;
    titleHTML.title = escapeHTML(entryObj.title);
    titleHTML.href = semanticURLize(entryObj.publicId,entryObj.title);
  }

  var addToFavoritesHTML = byid('metaConsoleAddToFavorites');
  if (addToFavoritesHTML) {
    var label=addToFavoritesHTML.getElementsByTagName('span')[0];
    if (label) {
      if(entryObj.inFavorites) {
        addToFavoritesHTML.className = 'miniButton miniButtonQueueRemove16';
        addToFavoritesHTML.title = 'Remove from Favorites';
        addToFavoritesHTML.onclick=function(){removeFromFavorites(entryObj.publicId,this); return false;};
        label.innerHTML = 'Remove from Favorites';
      } else {
        addToFavoritesHTML.className = 'miniButton miniButtonAddToFavorites16';
        addToFavoritesHTML.title = 'Add to Favorites';
        addToFavoritesHTML.onclick=function(){addEntryToList('favorites', entryObj.publicId, this);return false;};
        label.innerHTML = 'Add to Favorites';
      }
    }
  }

  var gernePathHTML = byid('metaConsoleGenrePath');
  var curChannel = null;
  if(entryObj.genres.length || (entryObj.channels && entryObj.channels.length)) {
    var pathStrArray = [];
    if (entryObj.genres.length>0) {
      var pathArray = entryObj.genres[0].path;
      for(var i = 0; i < pathArray.length; i++){
        pathStrArray.push('<a href="'+ pathArray[i].id + '/"> '+ escapeHTML(pathArray[i].name) +' </a>');
      }
    }
    if(entryObj.channels && entryObj.channels.length) {
      curChannel = entryObj.channels[0];
      pathStrArray.push('<a href="'+  semanticURLize(curChannel.publicId,curChannel.title) + '/"> '+ escapeHTML(curChannel.title) +' </a>')
    }
    gernePathHTML.innerHTML = pathStrArray.join('/');
  } else {
    gernePathHTML.innerHTML = '';
  }

  var genreHTML = byid('metaConsoleDetailsGenres');
  if(genreHTML) {
    var genreHTMLStr = [];
    for(var q = 0; q < entryObj.genres.length; q++){
      var genreObj = entryObj.genres[q];
      genreHTMLStr.push('<a href="' + escapeHTML(genreObj.id) + '/">' + escapeHTML(genreObj.name) + '</a>')
    }
    genreHTML.innerHTML = genreHTMLStr.join(', ');
  }
  var descriptionHTML = byid('metaConsoleDescription');
  if(descriptionHTML) {
    descriptionHTML.innerHTML = makeParas(entryObj.description);
  }
  var publicationDateStr = (!entryObj.publicationDateStr) ? '-' : entryObj.publicationDateStr;
  var publicationHTML = byid('metaConsoleDetailsAdded');
  if(publicationHTML){
    publicationHTML.innerText = publicationHTML.textContent = publicationDateStr;
  }
  var expireDateStr = (!entryObj.expireDateStr) ? '-' : entryObj.expireDateStr;
  var expireHTML = byid('metaConsoleDetailsExpires');
  if(expireHTML){
    expireHTML.innerText = expireHTML.textContent = expireDateStr;
  }
  var ownerStr = (!entryObj.owner) ? '-' : entryObj.owner;
  var ownerHTML = byid('metaConsoleDetailsProducer');
  if(ownerHTML){
    ownerHTML.innerText = ownerHTML.textContent = ownerStr;
  }
  var language = (!entryObj.language) ? '-' : entryObj.language.toUpperCase();
  var langHTML = byid('metaConsoleDetailsLang');
  if(langHTML){
    langHTML.innerText = langHTML.textContent = language;
  }
  var duration = (!entryObj.duration) ?  '-' : dateTime.msToShortTime(entryObj.duration);
  var durationHTML = byid('metaConsoleDetailsDuration');
  if(durationHTML) {
    durationHTML.innerText = durationHTML.textContent = duration;
  }
  var shoutHTML = byid('metaConsoleShoutCount');
  if(shoutHTML) {
    shoutHTML.innerText = shoutHTML.textContent = entryObj.shouts.count;
  }
  var shoutSeeAllHTML = byid('metaconsoleSeeAllShouts');
  if (shoutSeeAllHTML) {
    if (entryObj.shouts.count==0) {
      shoutSeeAllHTML.style.display="none";
    } else {
      shoutSeeAllHTML.style.display="";
    }
  }
  var commentHTML = byid('metaConsoleCommentsCount');
  if(commentHTML) {
    commentHTML.innerText = commentHTML.textContent = entryObj.commentsCount;
  }
  var commentSeeAllHTML = byid('metaconsoleSeeAllComments');
  if (commentSeeAllHTML) {
    if (entryObj.commentsCount==0) {
      commentSeeAllHTML.style.display="none";
    } else {
      commentSeeAllHTML.style.display="";
    }
  }

  var addToQueue = byid('metaConsoleAddToQueue');

  if(addToQueue){
    label=addToQueue.getElementsByTagName('span')[0];
    if (label) {
      if(entryObj.inPlaylist) {
        addToQueue.className = 'miniButton miniButtonQueueRemove16';
        addToQueue.title = 'Remove from My Queue';
        addToQueue.onclick=function(){removeFromPlaylist(entryObj.publicId,this); return false};
        label.innerHTML = "Remove from My Queue";
      } else {
        addToQueue.className = 'miniButton miniButtonQueueAdd16';
        addToQueue.title = 'Add to My Queue';
        addToQueue.onclick = function(){ addEntryToList('playlist', entryObj.publicId); return false};
        label.innerHTML = "Add to My Queue";
      }
    }
  }
  var subscribe = byid('metaConsoleSubscribe');

  if(curChannel) {
    label=subscribe.getElementsByTagName('span')[0];
    show("subscribeFrm", "inline");
    if (label) {
      if(curChannel.subscribed){
        subscribe.className = 'miniButton miniButtonQueueRemove16';
        subscribe.title = "Unsubscribe from Channel";
        subscribe.onclick=function(){MetaConsole.unsubscribe(curChannel.publicId); return false; };
        label.innerHTML = "Unsubscribe from Channel";
      } else {
        subscribe.className = 'miniButton miniButtonSub16';
        subscribe.title = "Subscribe to Channel";
        subscribe.onclick = function(){MetaConsole.subscribe(curChannel.publicId); return false; };
        label.innerHTML = "Subscribe to Channel";
      }
    }
  } else {
    if(subscribe){
      subscribe.onclick = function(){ return false; };
    }
    hide("subscribeFrm");
  }

  me.updateTags();
  me.updateShare(entryObj);
  me.updateRelatedChannels();
  me.updateThumbPercentages(entryObj);

  if(me.featureId == 'comments' || me.featureId == 'shouts' || me.featureId == 'tags' || me.featureId == 'share' || me.featureId == 'favorites') {
    byid('metaConsoleDrawer').innerHTML = "";
    var shareEmbed = byid('shareEmbed');
    if (shareEmbed) {
      shareEmbed.style.display = "none";
    }
    me.featureId = false;
    me.drawerOpen = true;
  }
};

MetaConsole.showMetadata=function(publicId) {
  if (publicId && publicId!="" && publicId!=MetaConsole.current.publicId) {
    MetaConsole.showWait();
    var url=MetaConsole.metadataProvider.replace(/%i/gm,publicId);
    if (window.MetadataRoot) {
      url=window.MetadataRoot+url;
    }
    jsonRequest(url);
  }
};

MetaConsole.toggleContainerDescription=function() {
  var metaConsoleContainerDescription = byid('metaConsoleContainerDescription');
  var metaConsoleContainerSummary = byid('metaConsoleContainerSummary');
  if(!metaConsoleContainerSummary || !metaConsoleContainerDescription) {
    return;
  }
  metaConsoleContainerDescription.style.display = 'none';
  metaConsoleContainerSummary.style.display = 'none';
  if (MetaConsole.current.descriptionToggle) {
    metaConsoleContainerDescription.style.display = 'block';
  } else {
    metaConsoleContainerSummary.style.display = 'block';
  }
  MetaConsole.current.descriptionToggle = !MetaConsole.current.descriptionToggle;
};

MetaConsole.updateThumbPercentages=function(obj) {
  if (obj && obj.thumbUpPercent && obj.thumbDownPercent) {
    var elUp=document.getElementById('thumbUpCount');
    if (elUp) {
      elUp.innerHTML=obj.thumbUpPercent+"%";
    }
    var elDown=document.getElementById('thumbDownCount');
    if (elDown) {
      elDown.innerHTML=obj.thumbDownPercent+"%";
    }
  }
};

/*
 * Event handler for the Subscribe button
 * @param publicId The publicId of the container to subscribe to
 * @param elem     The element that tripped the event
 */
MetaConsole.subscribe = function(publicId) {
  if (!User.loggedIn) {
    User.promptForLogin('<h1>Please login to Joost to complete your channel subscription</h1>',function() {MetaConsole.subscribe(publicId)});
  } else {
    jsonPost("/api/subscriptions/add/" + publicId, MetaConsole, MetaConsole.subscribed, byid("subscribeFrm"));
    byid("subscribeFrm").submit();
  }
};

MetaConsole.subscribed = function(msg) {
  var lblch = (msg.success && msg.body.channel.title) ? msg.body.channel.title : 'this';
  errorOrNote(msg && msg.success, "Oops, something went wrong! Please try again.", "You have subscribed to the "+ lblch + ".</p><br/><p><a href='/users/me/preferences/'>Check your email preferences</a> now to make sure you receive updates when new videos are added to this channel</p>");
  var subscribe = byid('metaConsoleSubscribe');
  if(!subscribe) return;
  if(msg && msg.success) {
    subscribe.className = 'miniButton miniButtonQueueRemove16';
    subscribe.title = "Unsubscribe from channel";
    subscribe.onclick=function(){MetaConsole.unsubscribe(msg.body.channel.publicId); return false};
    subscribe.lastChild.innerHTML = "Unsubscribe";
  }
  analyticsTrackEvent("metaconsole/subscribe");
};
/*
 * Event handler for the Unsubscribe button
 * @param publicId The publicID of the container to unsubscribe to
 * @param elem     The element that tripped the event
 */
MetaConsole.unsubscribe = function(publicId) {
  jsonPost("/api/subscriptions/remove/" + publicId, MetaConsole, MetaConsole.unsubscribed, byid("subscribeFrm"));
  byid("subscribeFrm").submit();
};

MetaConsole.unsubscribed = function(msg) {
  errorOrNote(msg && msg.success, "Oops, something went wrong! Please try again.", "You're no longer subscribed.");

  var subscribe = byid('metaConsoleSubscribe');
  if(!subscribe) retun;
  if(msg && msg.success) {
    subscribe.className = 'miniButton miniButtonSub16';
    subscribe.title = "Subscribe to Channel";
    subscribe.onclick = function(){MetaConsole.subscribe(msg.body.channel.publicId); return false};
    subscribe.lastChild.innerHTML = "Subscribe to Channel";
  }
  analyticsTrackEvent("metaconsole/unsubscribe");
};
Thumbs={
  overlay:null,
  ThumbsProvider:'/api/rate/thumbs/add/%{publicId}?type=%{type}&json_function=%{callback}',
  lastTime:0,
  types:["","THUMBSDOWN","THUMBSUP"]
};

Thumbs.handleResponse=function(obj) {
  if (obj.success) {
    Thumbs.currentRating=obj.rating;
    Thumbs.userRating=obj.userRating;
    if (window.core && core.notifier && core.notifier.addMsg) {
      core.notifier.addMsg("Your opinion was recorded, thanks!",{style:'success', duration:5});
      if (window.MetaConsole && window.MetaConsole.updateThumbPercentages) {
        window.MetaConsole.updateThumbPercentages(obj);
      }
    }
  } else {
    if (obj.resultCode==7002) {
      msg=obj.message;
    } else {
      msg="Failed to store your opinion, please try again latter.";
    }
    if (window.core && core.notifier && core.notifier.addMsg) {
      core.notifier.addMsg(msg, {style : 'error'});
    }
  }
  if (Thumbs.overlay && Thumbs.overlay.style) {
    if ((new Date().valueOf()-Thumbs.lastTime)>5000) {
      Thumbs.overlay.style.display="none";
    } else {
      setTimeout(function() {
                   if (Thumbs.overlay && Thumbs.overlay.style) {
                     Thumbs.overlay.style.display="none";
                   }
                 },5000-(new Date().valueOf()-Thumbs.lastTime));
    }
  }
};

Thumbs.doThumb=function(ratingType) {
  if (window.User && !User.loggedIn) {
    User.promptForLogin('<h1>To thumb a show, you must be logged in</h1>',		function(){Thumbs.doThumb(ratingType)});
    return;
  }
  if((window.Page && Page.publicId) || (window.core && core.plugin && core.plugin.getCurrentShow()!="")) {
	var ratingType=Thumbs.types[ratingType];
	var publicId=window.Page ? Page.publicId : "";
	if (window.core && core.plugin && core.plugin.getCurrentShow()!="") {
		publicId=core.plugin.getCurrentShow();
	}
	jsonRequest(substitute(Thumbs.ThumbsProvider, { publicId : publicId, type : ratingType, callback : 'Thumbs.handleResponse'}));
  } else {
	if (window.core && core.notifier && core.notifier.addMsg) {
		core.notifier.addMsg("You can't give that the thumb now, wait for a show", {style : 'error'});
    }
  }
}

var Register = {
    output: null,
    provider: '/api/registration',
    checkJoostnameProvider: '/api/auth/prevalid/joostname?prop=%{p}&json_function=Register.checkNameResponse',
    inRegFormText: {
        joostNameInputText: 'At least 4 letters or numbers, start it with a letter',
        pswdInputText: 'Must be at least 6 characters',
        emailInputText: 'We won\'t make this public', 
        zipInputText: 'Where are you?'
    },
    regTemplate: '<div class="overlayClose">' +
                 '<a title="close" class="miniButton miniButtonOverlayClose" onclick="User.hideOver(\'%{ovlcontext}\');return false;" id="overlayClose" href="#"><img alt="close" src="/static/transparent.gif"/></a>' +
                 '</div>',
    regHeaderTemp: '<div id="login_prompt_html" class="loginPrompt"></div>',
    regHeaderIntroTemp: '<div class="row"><h1 style="height: 28px"><img src="/static/overlay-signuplogo.gif" alt="Sign up for Joost" /></h1></div>',
    regColTemp: '<div class="payoff" id="payoff">%{content}</div>',
    regIntroTemp: '<div style="padding: 60px 0 0 0;"><h1 style="height: 28px"><img src="/static/overlay-signuplogo.gif" alt="Sign up for Joost" style="height: 28px" /></h1>' +
        '<h3 style="text-align:center">It\'s as easy as 1-2-3</h3></div>' +
        '<div style="padding: 20px 0 0 20px;">%{regIntroText} %{fbcon}</div>',
    regIntroTemp2: '<div>%{regIntroText}</div>',
    regIntroText: '<div class="whysignup">' +
        '<h3>What can I do with a Joost account?</h3>' +
        '<ul class="arrow">' +
        '<li><p>Save your favorite videos - and watch now or later</p></li>' +
        '<li><p>Share videos with friends with a single click</p></li>' +
        '<li><p>Subscribe to channels to find out when new videos are available</p></li>' +
        '<li><p>Comment on videos and share thoughts with your groups</p></li>' +
        '</ul>' +
        '</div>',
    regFormTemp: '<div class="brick brickB4"><div class="outerPadding">' +
        '<div class="outerBorder">' +
            '<div class="innerBorder">' +
               '<div class="innerPadding">' +
                    '<div class="content">' +
                    '<div id="register_prompt_html" />' +
                    '<div class="brickForm">' +
                    '<div class="registrationForm">' +
                    '<iframe name="register_frame" id="register_frame" src="" style="display: none;"></iframe>' +
                    '<form  onsubmit="return Register.register(this)" method="post" target="register_frame"  id="register_form">' +
                    '<input type="hidden" value="0" name="cohort"/><fieldset>' +
                    '<input type="hidden" value="true" name="iframe"></iframe>' +
                        '%{header}' +
                        '<div class="row" id="regjoostname">' +
                            '<div class="label"><label for="screenname">Choose your Joost Name</label></div>' +
                            '<div class="input">' +
                                '<input type="text" ' +
                                'onfocus="Register.changeLabels(this,\'joostNameInputText\',\'onfocus\')" ' +
                                'onblur="Register.checkJoostName(this);Register.changeLabels(this,\'joostNameInputText\',\'onblur\')" ' +
                                'value="At least 4 letters or numbers, start it with a letter" id="screenname" ' +
                                'name="screenname" class="inputText text"/>' +
                            '</div>' +
                            '<div style="display: none;" class="warning" id="warnjoostname">' +
                                '<p><span class="note"></span></p>' +
                            '</div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row" id="regpassword">' +
                        '<div class="label"><label for="password">Choose a Password</label></div>' +
                        '<div class="input">' +
                            '<input type="password" '+
                            'onblur="Register.matchPasswords(this,\'passwordconfirm\')"' +
                            'id="password" name="password"' +
                            'class="inputPassword text"/ >' +
                        '</div>' +
                        '<div style="display: none;" class="warning" id="warnpassword">' +
                            '<p><span class="note"></span></p>' +
                        '</div>' +                        
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row" id="regconfirmpassword">' +
                        '<div class="label"><label for="passwordconfirm">Confirm Password</label></div>' +
                        '<div class="input">' +
                            '<input type="password" onblur="Register.matchPasswords(this,\'password\')" ' +
                            'value="" id="passwordconfirm" name="passwordconfirm" ' +
                            'class="inputPassword required equal text" />' +
                        '</div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row" id="regemail">' +
                        '<div class="label"><label for="email">Email</label></div>' +
                        '<div class="input">' +
                        '<input type="text" ' +
                        'onfocus="Register.changeLabels(this,\'emailInputText\', \'onfocus\')" ' +
                        'onblur="Register.checkEmail(this);Register.changeLabels(this,\'emailInputText\',\'onblur\')" ' +
                        'value="We won\'t make this public" id="email" name="email" class="inputText required email text"/>' +
                        '</div>' +
                        '<div style="display: none;" class="warning" id="warnemail">' +
                            '<p><span class="note"></span></p>' +
                        '</div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row">' +
                        '<div class="label"><label for="firstname">First Name</label></div>' +
                        '<div class="input">' +
                            '<input type="text" value="" id="firstname" name="firstname" class="inputText text"/>' +
                        '</div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row">' +
                        '<div class="label"><label for="lastname">Last Name</label></div>' +
                        '<div class="input">' +
                            '<input type="text" value="" id="lastname" name="lastname" class="inputText text"/>' +
                        '</div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row" id="regzip">' +
                        '<div class="label"><label for="postal">Zip/Post Code</label></div>' +
                        '<div class="input">' +
                            '<input type="text" maxlength="16"' +
                            'onfocus="Register.changeLabels(this,\'zipInputText\',\'onfocus\')"' +
                            'onblur="Register.changeLabels(this,\'zipInputText\',\'onblur\');Register.clearErr(this,\'zip\')"' +
                            'value="Where are you?" id="postal" name="postal" ' +
                            'class="inputText required text" />' +
                        '</div>' +
                        '<div style="display: none;" class="warning" id="warnzip">' +
                            '<p><span class="note"></span></p>' +
                        '</div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row" id="reggender">' +
                        '<div class="label"><label>Gender</label></div>' +
                        '<div class="input">' +
                            '<ul class="horizontal">' +
                            '<li><input type="radio" value="MALE" id="gender_M" name="gender" class="inputRadio" onblur="Register.clearErr(this,\'gender\')" />' +
                            '<label for="gender_M">Male</label></li>' +
                            '<li><input type="radio" value="FEMALE" id="gender_F" name="gender" class="inputRadio" onblur="Register.clearErr(this,\'gender\')" />' +
                            '<label for="gender_F">Female</label></li>' +
                            '</ul>' +
                        '</div>' +
                        '<div style="display: none;" class="warning" id="warngender">' +
                            '<p><span class="note"></span></p>' +
                        '</div>' +                        
                        '<div class="break"></div>' +
                    '</div>' +
                    
                    '<div class="row" id="regdob">' +
                        '<div class="label"><label>Date of Birth</label></div>' +
                        '<div class="input">' +
                        '<div>' +
                            '<select id="dobmonth" name="dobmonth" class="selectNarrow" onblur="Register.clearErr(this,\'dob\')">' +
                            '<option value="0">Month</option><option value="1">January</option><option value="2">February</option><option value="3">March</option><option value="4">April</option><option value="5">May</option><option value="6">June</option><option value="7">July</option><option value="8">August</option><option value="9">September</option><option value="10">October</option><option value="11">November</option><option value="12">December</option></select> <select id="dobday" name="dobday" class="selectNarrow" onblur="Register.clearErr(this,\'dob\')"><option value="0">Day</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option></select> <select id="dobyear" name="dobyear" class="selectNarrow" onblur="Register.clearErr(this,\'dob\')"><option value="0">Year</option><option value="1996">1996</option><option value="1995">1995</option><option value="1994">1994</option><option value="1993">1993</option><option value="1992">1992</option><option value="1991">1991</option><option value="1990">1990</option><option value="1989">1989</option><option value="1988">1988</option><option value="1987">1987</option><option value="1986">1986</option><option value="1985">1985</option><option value="1984">1984</option><option value="1983">1983</option><option value="1982">1982</option><option value="1981">1981</option><option value="1980">1980</option><option value="1979">1979</option><option value="1978">1978</option><option value="1977">1977</option><option value="1976">1976</option><option value="1975">1975</option><option value="1974">1974</option><option value="1973">1973</option><option value="1972">1972</option><option value="1971">1971</option><option value="1970">1970</option><option value="1969">1969</option><option value="1968">1968</option><option value="1967">1967</option><option value="1966">1966</option><option value="1965">1965</option><option value="1964">1964</option><option value="1963">1963</option><option value="1962">1962</option><option value="1961">1961</option><option value="1960">1960</option><option value="1959">1959</option><option value="1958">1958</option><option value="1957">1957</option><option value="1956">1956</option><option value="1955">1955</option><option value="1954">1954</option><option value="1953">1953</option><option value="1952">1952</option><option value="1951">1951</option><option value="1950">1950</option><option value="1949">1949</option><option value="1948">1948</option><option value="1947">1947</option><option value="1946">1946</option><option value="1945">1945</option><option value="1944">1944</option><option value="1943">1943</option><option value="1942">1942</option><option value="1941">1941</option><option value="1940">1940</option><option value="1939">1939</option><option value="1938">1938</option><option value="1937">1937</option><option value="1936">1936</option><option value="1935">1935</option><option value="1934">1934</option><option value="1933">1933</option><option value="1932">1932</option><option value="1931">1931</option><option value="1930">1930</option><option value="1929">1929</option><option value="1928">1928</option><option value="1927">1927</option><option value="1926">1926</option><option value="1925">1925</option><option value="1924">1924</option><option value="1923">1923</option><option value="1922">1922</option><option value="1921">1921</option><option value="1920">1920</option><option value="1919">1919</option><option value="1918">1918</option><option value="1917">1917</option><option value="1916">1916</option><option value="1915">1915</option><option value="1914">1914</option><option value="1913">1913</option><option value="1912">1912</option><option value="1911">1911</option><option value="1910">1910</option><option value="1909">1909</option><option value="1908">1908</option><option value="1907">1907</option><option value="1906">1906</option><option value="1905">1905</option><option value="1904">1904</option><option value="1903">1903</option><option value="1902">1902</option><option value="1901">1901</option><option value="1900">1900</option></select>' +
                            '</div>' +
                        '</div>' +
                        '<div style="display: none;" class="warning" id="warndob">' +
                            '<p><span class="note"></span></p>' +
                        '</div>' +   
                        '<div class="break"></div>' +
                    '</div>' +                    
                    '<div class="row">' +
                        '<div class="label"></div>' +
                            '<div class="description"><p>By clicking <em>Okay</em>, you let us know that you are at least 13 and that you agree to our <a target="_blank" href="/privacy/">Privacy Policy</a> and <a target="_blank" href="/tos/">Terms of Service</a></p></div>' +
                        '<div class="break"></div>' +
                    '</div>' +
                    '<div class="row buttons">' +
                        '<div class="label"></div>' +
                        '<div class="input">' +
                            '<input type="hidden" id="tried" value="tried" name="tried" />' +
                            '<input type="hidden" value="parent.Register.result" name="json_function"/>' +
                            '<input type="submit" value="Okay" id="submit" name="submit" class="inputSubmit"/>' +
                        '</div>' +
                    '<div class="break"></div>' +
                    '</div>' +
                '</fieldset>' +
            '</form>' +
        '</div><!-- ends registrationForm div-->' +
        '</div>' +
        '<div class="break"></div>' +
        '</div>' +
        '</div></div></div></div></div>',
    regConfirmTemp: '<div class="pad01"><h2>Thanks for signing up!</h2>' +
            '<p style="margin:9px 0;">You\'re almost there. For your security, please verify your registered email address by clicking on the confirmation in your inbox now. </p>' +
            '<form onsubmit="if (parent.Register){parent.Register.completeRegister();return false; }" class="alignRight" target="_top" action="/"><p><input type="submit" value="Start Watching!" class="inputSubmit"/></p></form>' +
            '<div class="break"></div></div>',
    regSimpleSlurpTemp: '<h2>Find your Friends</h2>'+
                    '<p>See who you know that\'s already on Joost so you can start sharing videos with them or check out what they\'ve been watching. Or, you can also invite your friends if they\'re not already on Joost.</p>' +
                    '<form onsubmit="if (parent.Register){parent.Register.inviteFriends();return false; }" class="alignRight" target="_top" action="/"><p><input type="submit" value="Find Friends" class="inputSubmit"/></p></form>' +
                    '<div class="break"></div>',
    regLoginFormTemp: '<div class="brick brickB2"><div class="brickForm"><form action="/login" id="login_form" onsubmit="User.doLogin(); return false">' +
                                      '<fieldset class="big">' +
                                        '<div class="row">' +
                                          '<img src="/static/overlay-loginlogo.gif" alt="Log in to Joost" style="height: 28px" />' +
                                        '</div>' +
                                        '<div class="row">' +
                                          '<div class="label">' +
                                            '<label for="username">Joost Name (or Email)</label>' +
                                          '</div>' +
                                          '<div class="input"><input type="text" class="inputText" name="username" id="username" /></div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                        '<div class="row">' +
                                          '<div class="label"><label for="pswd">Password</label></div>' +
                                          '<div class="input"><input type="password" class="inputText" name="pswd" id="pswd" /></div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                        '<div class="row error" style="display:none" id="login_error_message_container">' +
                                          '<div class="label"></div>' +
                                          '<div class="warning" style="width:200px"><p id="login_error_message"></p></div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                        '<div class="row buttons">' +
                                          '<div class="label"></div>' +
                                          '<div class="input"><input type="submit" class="inputSubmit" value="Login" ></div>' +
                                          '<div class="break"></div>' +
                                        '</div>%{fbcon}' +
                                        '<div class="row buttons">' +
                                          '<div class="label"></div>' +
                                          '<div class="input">' +
                                            '<p><a href="/forgot/">Forgot your Joost Name or password?</a></p>' +
                                          '</div>' +
                                          '<div class="break"></div>' +
                                        '</div>' +
                                      '</fieldset>' +
                                    '</form></div></div>',
    showMultiForm: function() {
        var me = Register;
        var str = [];
        var ovlContext = 'login';
        str.push(substitute(me.regTemplate, {ovlcontext: ovlContext}));
        str.push(me.regHeaderTemp);
        var columnContent = [me.regLoginFormTemp,substitute(me.regIntroTemp2, {regIntroText: me.regIntroText})].join('');
        str.push(substitute(me.regColTemp, {content: columnContent}));
        str.push(substitute(me.regFormTemp, {header: me.regHeaderIntroTemp}));
        me.output = str.join('');        
        return me.output;
    },
    
    showRegForm: function() {
        var me = Register;
        var str = [];
        var ovlContext = 'registration';
        str.push(substitute(me.regTemplate, {ovlcontext: ovlContext}));
        var columnContent = substitute(me.regIntroTemp, {regIntroText: me.regIntroText, fbcon: '%{fbcon}'});
        str.push(substitute(me.regColTemp, {content: columnContent}));
        str.push(substitute(me.regFormTemp, {header: ""}));
        me.output = str.join('');
        return me.output;
    },
    
    register: function(form) {
        Register.clearLabels();
        var formSub = form.elements['submit'];
        formSub.disabled = true;
        form.action = Register.provider;
        if (!Register.loader) {
            var newImg=document.createElement('img');
            newImg.alt="Please Wait";
            newImg.src="/static/big-loader.gif";
            Register.loader=newImg;
            formSub.parentNode.insertBefore(newImg,formSub);
            Register.submitElement=formSub;
        }
    },
    matchPasswords: function(el,comp) { 
        if(el) {
            var regPswd = byid('regpassword');
            var regconfPswd = byid('regconfirmpassword');
            var warnPasswordBox = byid('warnpassword');
            var spans = warnPasswordBox.getElementsByTagName('span');
            var compare = byid(comp);
            if((el.value.length > 0 && el.value.length<6) || (compare.value.length > 0 && compare.value.length<6)){
                regPswd.className = 'row error';
                regconfPswd.className = 'row error';
                spans[0].innerHTML = 'Your password must be at least 6 characters';
                warnPasswordBox.style.display = 'block';
                return;
            } else {
                regPswd.className = 'row success';
                regconfPswd.className = 'row success';
                spans[0].innerHTML = '';
                warnPasswordBox.style.display = 'none';
            }
            if(compare && compare.value !== '' && compare.value !== Register.inRegFormText.pswdInputText) {
                spans.innerHTML = '';
                if(String(el.value) !== String(compare.value)) {
                        regPswd.className = 'row error';
                        regconfPswd.className = 'row error';
                        spans[0].innerHTML = 'Password does not match';
                        warnPasswordBox.style.display = 'block';
                } else {
                        regPswd.className = 'row success';
                        regconfPswd.className = 'row success';
                        spans[0].innerHTML = 'Passwords confirmed';
                        warnPasswordBox.style.display = 'block';
                }
            } else if (compare.value === Register.inRegFormText.pswdInputText && el.value.length > 0) {
                regPswd.className = 'row error';
                regconfPswd.className = 'row error';
                spans[0].innerHTML = 'Password does not match';
                warnPasswordBox.style.display = 'block';
            }
        }
    },
    checkNameResponse: function(response){
        var regJoostNameBox = byid('regjoostname');
        var warnJoostNameBox = byid('warnjoostname');
        if(response.success) {
            regJoostNameBox.className = 'row success';
            var spans = warnJoostNameBox.getElementsByTagName('span');
            spans[0].innerHTML = response.message;
            warnJoostNameBox.style.display = 'block';
        } else if (!response.success && response.resultCode=='2004' || response.resultCode=='2024' || response.resultCode=='2025') {
            regJoostNameBox.className = 'row error';
            var spans = warnJoostNameBox.getElementsByTagName('span');
            spans[0].innerHTML = response.message;
            warnJoostNameBox.style.display = 'block';
        } else {
            regJoostNameBox.className = 'row success';
            var spans = warnJoostNameBox.getElementsByTagName('span');
            spans[0].innerHTML = '';
            warnJoostNameBox.style.display = 'block';
        }
    },
    checkJoostName: function(el) {
        var joostnameptrn = /^[a-zA-Z][-_.a-z0-9]{2,}[a-z0-9]$/i;
        if(el && el.value.length > 3 && el.value.length < 128) {
            if(!joostnameptrn.test(el.value)) {
                Register.checkNameResponse({"success": false, resultCode: 2025, message: "Must start with a letter and have at least 4 letters or numbers"});
            } else {
                var url = Register.checkJoostnameProvider.replace(/%\{p\}/gim,el.value);
                jsonRequest(url);
            }
        } else if (el.value.length > 0) {
            Register.checkNameResponse({"success": false, resultCode: 2024, message: "Must start with a letter and have at least 4 letters or numbers"});
        } else {
            Register.checkNameResponse(true);
        }
    },
    checkEmail: function (el) {
        var emailBox = byid('regemail');
        var warnEmailBox = byid('warnemail');
        var spans = warnEmailBox.getElementsByTagName('span');
        if(el.value != '' && el.value != Register.inRegFormText.emailInputText) {
            var emailpat = /^(.{1,})+@(.)+\.(.){1,}$/;
            if(!emailpat.test(el.value)) {
                emailBox.className = 'row error';
                spans[0].innerHTML = 'Invalid email format';
                warnEmailBox.style.display = 'block';
            } else {
                emailBox.className = 'row';
                spans[0].innerHTML = '';
                warnEmailBox.style.display = 'none';
            }
        } else {
            emailBox.className = 'row';
            spans[0].innerHTML = '';
            warnEmailBox.style.display = 'none';
        }
    },
    clearErr: function (el,postfix) {
        var box = byid('reg'+postfix);
        var warnBox = byid('warn'+postfix);
        var spans = warnBox.getElementsByTagName('span');
        var msglbl = postfix+'InputText';
        if(el.value !== '' || el.value === Register.inRegFormText.msglbl) {
            box.className = 'row';
            spans[0].innerHTML = '';
            warnBox.style.display = 'none';
        } else if (postfix === 'gender' || postfix === 'dob') {
            box.className = 'row';
            spans[0].innerHTML = '';
            warnBox.style.display = 'none';
        }
    },
    changeLabels: function(el,type,action) {
        if(el.value === Register.inRegFormText[type] && action === 'onfocus') {
            el.value=''
        } else if (el.value === '' && action === 'onblur') {
            el.value=Register.inRegFormText[type]
        };
    },
    clearLabels: function() {
        var _pswd = byid('password');
        var _joostname = byid('screenname');
        var _email = byid('email');
        var _zip = byid('postal');
        if(_pswd && _pswd.value === Register.inRegFormText.pswdInputText) {
            _pswd.value = '';
        } else if (_pswd && _pswd.value === '') {_pswd.value = Register.inRegFormText.pswdInputText}
        if(_joostname && _joostname.value === Register.inRegFormText.joostNameInputText) {
            _joostname.value = '';
        }
         if(_email && _email.value === Register.inRegFormText.emailInputText) {
            _email.value = '';
        }
         if(_zip && _zip.value === Register.inRegFormText.zipInputText) {
            _zip.value = '';
        }
    },
    result: function(obj) {
        var el=byid("register_frame");
        if (el) {
            el.location = "/blank.html";
        }
        if (Register.submitElement) {
            Register.submitElement.disabled=false;
        }
        if (Register.loader) {
            Register.loader.parentNode.removeChild(Register.loader);
            Register.loader=null;
        }
        //clear 
        byid('regjoostname').className = 'row';
        var _warnjn = byid('warnjoostname');
        _warnjn.style.display = 'none';
        _warnjn.getElementsByTagName('span')[0].innerHTML = '';
        byid('regpassword').className = 'row';
        var _warnpswd = byid('warnpassword');
        _warnpswd.style.display = 'none';
        _warnpswd.getElementsByTagName('span')[0].innerHTML = '';
        byid('regconfirmpassword').className = 'row';
        byid('regzip').className = 'row';
        var warnzip = byid('warnzip');
        warnzip.style.display = 'none';
        warnzip.getElementsByTagName('span')[0].innerHTML = '';
        byid('reggender').className = 'row';
        var warngender = byid('warngender');
        warngender.style.display = 'none';
        warngender.getElementsByTagName('span')[0].innerHTML = '';
        byid('regdob').className = 'row';
        var warndob = byid('warndob');
        warndob.style.display = 'none';
        warndob.getElementsByTagName('span')[0].innerHTML = '';
        
        if(!obj.success) {
            if(obj.errors.length > 0) {
                for(var i=0; i<obj.errors.length;i+=1) {
                    var er = obj.errors[i];
                    var _erel = byid('reg'+er.subject);
                    if (_erel) {
                    _erel.className = "row error";
                    var _wrel = byid('warn'+er.subject);
                    var _wmsg = _wrel.getElementsByTagName('span');
                    _wmsg[0].innerHTML = er.message;
                    _wrel.style.display = 'block';
                    }
                }
            }
            if (window.analyticsTrackEvent) {
                analyticsTrackEvent("registration/error");
            }
           
        } else {
            var frm=document.forms['register_form'];
            var payoff = byid('payoff');
            var closelnk = byid('overlayClose');
            var frmparrent = frm.parentNode;
            removeNode(frm);
            frmparrent.innerHTML = Register.regSimpleSlurpTemp;
            payoff.innerHTML = Register.regConfirmTemp;
            closelnk.onclick = function() {window.location='/users/me/general/';};
            if (window.analyticsTrackEvent) {
                analyticsTrackEvent("registration/thankyou");
            }
        }
    },
    inviteFriends: function() {
        if (window.analyticsTrackEvent2)
        analyticsTrackEvent2("registration", "thankyou", "slurp");
        window.location='/people/invite/';
    },
    completeRegister: function() {
        if (window.analyticsTrackEvent2)
        analyticsTrackEvent2("registration", "thankyou", "watch");
        if (window.Page && Page.publicId) {
            window.location='/'+Page.publicId;
        } else {
            window.location='/home/';
        }
    }
}


Slurp={
  provider:"/api/slurp/slurp?user=%u&password=%p&type=%t&json_function=Slurp.handleResponse&a",
  makeProvider:"/api/friends/add/%u?json_function=Slurp.makeFriendRes%i&c",
  inviteProvider:"/api/invite?name=%n&email=%e&json_function=Slurp.inviteFriendRes%i",
  breakProvider:"/api/friends/remove/%u?json_function=Slurp.breakFriendRes%i&d",
  makeCounter:0,
  breakCounter:0,
  inviteCounter:0
};

Slurp.performSlurp=function(form) {
  document.getElementById('slurp_error_div').style.display="none";
  var user=form.elements['slurp_user'].value;
  var pass=form.elements['slurp_password'].value;
  var type=form.elements['slurp_type'].value;
  if (!type) {
    document.getElementById('slurp_error').innerHTML="<p>You must select which provider to slurp from</p>";
    document.getElementById('slurp_error_div').style.display="block";
    return;
  }
  if (!user || !pass) {
    document.getElementById('slurp_error').innerHTML="<p>You need to include a username or password</p>";
    document.getElementById('slurp_error_div').style.display="block";
    return;
  }

  if (type=="GMAIL") {
    if (user.indexOf('@')<0) {
      user=user+"@gmail.com";
      form.elements['slurp_user'].value=user;
    }
  }

  var formSub=form.elements['slurp_submit'];
  formSub.disabled=true;
  formSub.style.display="none";
  if (!Slurp.loader) {
    var newImg=document.createElement('img');
    newImg.alt="Please Wait";
    newImg.src="/static/big-progress.gif";
    Slurp.loader=newImg;
    formSub.parentNode.insertBefore(newImg,formSub);
    Slurp.submitElement=formSub;
  }
  Slurp.emailProvider = type;
  var url=Slurp.provider.replace(/%u/g,encodeURIComponent(user)).replace(/%p/g,encodeURIComponent(pass)).replace(/%t/g,encodeURIComponent(type));
  jsonRequest(url);
};

Slurp.enableForm = function(enable){
  if(enable) {
    var form = byid('slurp_form')
    for(var i = 0; i < form.elements.lenght; i++){
      form.elements[i].disabled = false;
    }
    byid('slurpForm').style.display = 'block';
    byid('slurp_output').style.display = 'none';
  } else {
    byid('slurpForm').style.display = 'none';
    byid('slurp_output').style.display = 'block';
  }

}

Slurp.handleResponse=function(obj) {
  if (Slurp.submitElement) {
    Slurp.submitElement.disabled=false;
    Slurp.submitElement.style.display="inline";
  }
  if (Slurp.loader) {
    Slurp.loader.parentNode.removeChild(Slurp.loader);
    Slurp.loader=null;
  }
  var outputList=[];
  if (!obj.success) {
    document.getElementById('slurp_error').innerHTML="<p>" + obj.message + "</p>";
    document.getElementById('slurp_error_div').style.display="block";
  } else {
    byid('slurpForm').style.display = 'none';
    byid('slurp_output').style.display = 'block';
    var i,description;
    var checkButtonTemplate='<input type="checkbox" checked="checked" class="inputCheckboxMini" value="JOOSTNAME">';
    var inactiveButtonTemplate=document.getElementById('inactive_button_template').innerHTML;
    Slurp.otherContractsArray = obj.unknown;
    var usersToAdd = false;
    for (i=0;i<obj.joostusers.length;i++) {
      var user=obj.joostusers[i];
      if (user.alreadyfriend=="true") {
        description = "Already friends";
      } else {
        if (user.alreadyfriend=="false") {
          usersToAdd = true;
          description = checkButtonTemplate.replace(/JOOSTNAME/g, escapeHTML(user.joostId));
        } else {
          if (user.alreadyfriend=="pending") {
            description = inactiveButtonTemplate.replace(/TITLE/g,"Pending").replace(/ICON/g,"miniButtonLess").replace(/void\(1\)/g,"return false");
          } else {
            description = ""; // What to show suspended people?
          }
        }
      }
      if (window.User_Details && user.joostId==User_Details.joostName) {
        description='<img src="/static/minilabel-you.png" class="minilabelYou" alt="You"/>';
      }
      var thumbnail='/static/joost_generic_t1.jpg';
      if (user.profileImage) {
        thumbnail=user.profileImage;
      }
      
      outputList.push( {title:escapeHTML(user.userName),thumbnail:thumbnail,
                        link:'users/'+user.joostId+"/",description:description});
    }

    if(!usersToAdd){
      if(Slurp.otherContractsArray && Slurp.otherContractsArray.length) {
        Slurp.inviteOtherContacts();
      } else {
        Slurp.enableForm(true);
        document.getElementById('slurp_error').innerHTML="<p>No contacts found, try another account!</p>";
        document.getElementById('slurp_error_div').style.display="block";
      }
      return;
    }

    var inviteList=[];
    var str="";
    if (obj.joostusers.length>0) {
      str += '<h2>People you know on Joost</h2> ';
      str += '<p>The following people from your ' + Slurp.emailProvider.toLowerCase() + ' address book are already on Joost. Become their Joost friend now.';
      str += '<br/><a href="#" onclick="Slurp.enableForm(true); return true;">Have another email account?</a> Find more friends using that email address.</p><br/>';
      str += '<div style="float: right;"><p><input type="button" class="inputSubmit" onclick="Slurp.invitePeople(true)" value="Next" id="inviteButton"></p></div>'
      str += '<div style="clear: right;"><p><input type="button" class="inputButton" onclick="Slurp.unSelectFriends(this)" value="Unselect All"></p></div>';
      str += '<div id="friendsOnJoost">' + renderThumbAndTextList(outputList) + '</div>';
    }

    if (str=="") {
      str="<h3>No friends found...</h3>";
    }

    document.getElementById('slurp_output').innerHTML=str;
    FBParseDom();
  }

};

Slurp.inviteOtherContacts = function(successMsg){
  var inactiveButtonTemplate=document.getElementById('inactive_button_template').innerHTML;
  var checkButtonTemplate='<input type="checkbox" checked="checked" class="inputCheckboxMini" value="JOOSTNAME">';

  var contacts = Slurp.otherContractsArray;
  var inviteList = [], str = '';
  for (i=0;i<contacts.length;i++) {
    var user=contacts[i];
    if (user.invited=="yes") {
      var description=inactiveButtonTemplate.replace(/TITLE/g,"Invited").replace(/ICON/g,"miniButtonLess").replace(/void\(1\)/g,"return false");
    } else {
      description=checkButtonTemplate.replace(/JOOSTNAME/g, escapeHTML(user.userName +"|s%"+ user.email).replace(/'/gim,"\'"));
    }
    inviteList.push( { title: escapeHTML(user.userName), thumbnail:'/static/joost_generic_t1.jpg',
                       type:'user', link:'#', description : description});
  }
  if (contacts.length > 0) {
    str += '<div id="friendsNotOnJoost"><h2>Invite people to Joost</h2>';

    if(successMsg) {
      str += "<p>Congratulations - you have just added " + Slurp.completeFriendCount + " Joost friends!"
      str += "Invite more people from your address book to be your friends on Joost";
      str += '<br/><a href="#" onclick="Slurp.enableForm(true); return true;">Have another email account?</a> Find more friends using that email address.</p><br/>';
    } else {
      str += '<p>We found the following people from your ' + Slurp.emailProvider.toLowerCase() + ' address book. Invite them to join you on Joost';
      str += '<br/><a href="#" onclick="Slurp.enableForm(true); return true;">Have another email account?</a> Find more friends using that email address.</p><br/>';
    }


    if (contacts.length > 0) {
      str += '<div style="float: right;"><p><input type="button" class="inputSubmit" onclick="Slurp.invitePeople(false)" value="Invite All Selected"></p></div>'
      str += '<div style="clear: right;"><p><input type="button" class="inputButton" onclick="Slurp.unSelectInvites(this)" value="Unselect All"></p></div>';
    }
    str += '<div>' + renderThumbAndTextList(inviteList,true) + '</div>';
    str += '</div>';
  }
  document.getElementById('slurp_output').innerHTML = str;
  FBParseDom();
}

Slurp.checkIfAnyToSelect=function(inputel) {
    var checker = false;
    for (i=0;i<inputel.length;i+=1) {
        if(inputel[i].alreadyfriend=="false") {
            var checker=true;
        }
    }
    return checker;
};

Slurp.unSelectFriends=function(inputel) {
  var mode=(inputel.value=="Select All");
  var el=document.getElementById("friendsOnJoost");
  if (el) {
    var cbs=el.getElementsByTagName('input');
    for (var i=0;i<cbs.length;i++) {
      cbs[i].checked=mode;
    }
  }
  inputel.value = mode ? "Unselect All" : "Select All";
};

Slurp.unSelectInvites=function(inputel) {
  var mode=(inputel.value=="Select All");
  var el=document.getElementById("friendsNotOnJoost");
  if (el) {
    var cbs=el.getElementsByTagName('input');
    for (var i=0;i<cbs.length;i++) {
      cbs[i].checked=mode;
    }
  }
  inputel.value = mode ? "Unselect All" : "Select All";
};

Slurp.invitePeople = function(fromJoostName) {

  if (!User.loggedIn && !(typeof Page == 'object' && Page.name == 'registration')) {
    User.promptForLogin('<h1>To use this feature, you must be logged in</h1>',
                        function(){Slurp.invitePeople(fromJoostName)});
    return;
  }
  var el= fromJoostName ? document.getElementById("friendsOnJoost") :
                          document.getElementById("friendsNotOnJoost");
  if (el) {
    var cbs=el.getElementsByTagName('input');
    Slurp.completeCount = -1;
    Slurp.completeFriendCount = 0;
    for (var i=0;i<cbs.length;i++) {
      if (cbs[i].checked) {
        Slurp.completeFriendCount++;
        Slurp.completeCount++;
        cbs[i].checked = true;
        cbs[i].disabled=true;
        if(fromJoostName) {
          Slurp.makeFriend(cbs[i].value, cbs[i].parentNode);
        } else {
          var str = cbs[i].value.split('|s%');
          Slurp.inviteFriend(str[0],str[1], cbs[i].parentNode);
        }
      }
    }
    if(!Slurp.completeFriendCount){
      Slurp.inviteOtherContacts();
    }
  }
}

Slurp.makeFriend=function(name, el) {
  var index=Slurp.breakCounter++;
  var url=Slurp.makeProvider.replace(/%u/g,name).replace(/%i/,index);
  el.innerHTML="Adding...";
  Slurp["makeFriendRes"+index]=function(obj) {
    if(Slurp.completeCount == 0) {
      Slurp.inviteOtherContacts (true);
    }
    el.innerHTML="Added!";
    Slurp.completeCount--;
  };
  jsonRequest(url);
};

Slurp.inviteFriend=function(name,email,el) {
  var index=Slurp.inviteCounter++;
  el.innerHTML="Inviting...";
  var url=Slurp.inviteProvider.replace(/%n/g,encodeURIComponent(name)).replace(/%i/,index).replace(/%e/,encodeURIComponent(email));
  Slurp["inviteFriendRes"+index]=function(obj) {
    el.innerHTML="Invited";
    el.onclick=function() { return false; };
  };
  jsonRequest(url);
};


var Subscriptions = {
  markAsWatchedProvider: '/api/subscriptions/removeFromUnseen/%{publicId}/?json_function=%{callback}',
  holdMarked: false
};

Subscriptions.hide=function(publicId) {
  byid('wrap-' + publicId).innerHTML = "";
};

Subscriptions.markAsWatched=function(publicId) {
    var me = Subscriptions;
    if(publicId) {
        me.holdMarked = publicId;
        //me.watchedResponse("success": true);
        jsonRequest(substitute(me.markAsWatchedProvider, { publicId : publicId, callback : 'Subscriptions.watchedResponse'}));	
    }
};

Subscriptions.watchedResponse=function(response) {
    if(response.success) {
        var boxtodo = byid('wrap-'+Subscriptions.holdMarked);
        var linktodo = 'subindic-'+Subscriptions.holdMarked;
        Subscriptions.holdMarked=false;
        if(boxtodo)
            boxtodo.className='brick brickB4 brickBordered';
        removeNode(linktodo);
    }
}

Subscriptions.isok=function(el) {
    if(el) {
        var span=el.getElementsByTagName('span')[0];
        var inn = (span.innerHTML == 'OK') ? 'New Video' : 'OK';
        setHtml(span,inn);
    }
};

var fbUtils = {
  templte_bundle_videocomment: 54479160940,
  templte_bundle_groupcomment: 64427990940,
  templte_bundle_videofav: 54818180940,
  templte_bundle_videoshout: 54818190940,
  comment_baton: null,
  shout_baton: null,
  addComment: function (publicId, comment) {
    if (FacebookConnect.active != 'NO') {
      FB.Connect.get_status().waitUntilReady(function(status) {
        if(status == FB.ConnectState.connected && window.User_Details && User_Details.fbid && User_Details.fbid != 'undefined') {
          showFBoverlay();
          fbUtils.commentNotification(publicId, comment);
        }
      });
    }
  },
  addGroupComment: function (groupId, groupName, comment) {
    if (FacebookConnect.active != 'NO') {
      FB.Connect.get_status().waitUntilReady(function(status) {
        if(status == FB.ConnectState.connected && window.User_Details && User_Details.fbid && User_Details.fbid != 'undefined') {
          showFBoverlay();
          fbUtils.handleGroupNotifications(groupId, groupName, comment);
        }
      });
    }
  },
  addFavorite: function (publicId) {
    if (FacebookConnect.active != 'NO') {
      FB.Connect.get_status().waitUntilReady(function(status) {
        if(status == FB.ConnectState.connected && window.User_Details && User_Details.fbid && User_Details.fbid != 'undefined') {
          showFBoverlay();
          fbUtils.favNotification(publicId);
        }
      });
    }
  },
  addShout: function (publicId, shout) {
    if (FacebookConnect.active != 'NO') {
      FB.Connect.get_status().waitUntilReady(function(status) {
        if(status == FB.ConnectState.connected && window.User_Details && User_Details.fbid && User_Details.fbid != 'undefined') {
          showFBoverlay();
          fbUtils.shoutNotification(publicId, shout);
        }
    });
  }
  },
  favNotification: function(publicId) {
    jsonRequest("/api/metadata/get/"+ publicId + "?json_function=fbUtils.doFavNotification");
  },
  commentNotification: function(publicId, comment) {
    fbUtils.comment_baton = comment;
    jsonRequest("/api/metadata/get/"+ publicId + "?json_function=fbUtils.doCommentNotification");
  },
  shoutNotification: function(publicId, shout) {
    fbUtils.shout_baton = shout;
    jsonRequest("/api/metadata/get/"+ publicId + "?json_function=fbUtils.doShoutNotification");
  },
  doFavNotification: function(data) {
    return fbUtils.handleNotifications("favorite", data, null);
  },
  doCommentNotification: function(data) {
    return fbUtils.handleNotifications("comment", data, fbUtils.comment_baton);
  },
  doShoutNotification: function(data) {
    return fbUtils.handleNotifications("shout", data, fbUtils.shout_baton);
  },
  handleNotifications: function(kind, data, comment) {
    if (data.success != true) {
      //alert("json thingy failed.");
      return;
    }

    var v = data.entry;
    var allowembedd = v.embeddable && v.type == "video";
    var video = {};
    var template_data = {};
    if(allowembedd) {
      video['video_src'] = "http://www.joost.com/embed/" + v.publicId;
      video['preview_img'] = v.thumbnail;
      video['video_title'] = v.title;
      video['video_link'] = joost_main_root + semanticURLize(v.publicId, v.title).substring(1);
      video['video_type'] = "application/x-shockwave-flash";
      template_data["video"] = video;
    }

    template_data["publicid"] = v.publicId;
    template_data["title"] = v.title;
    template_data["link"] = joost_main_root + semanticURLize(v.publicId, v.title).substring(1);
    template_data["description"] = (v.description || "").replace(/\\n/g, "\n");

    var story_size = FB.FeedStorySize.shortStory;
    var template_bundle_id = 0;

    if (kind == "favorite") {
      template_bundle_id = fbUtils.templte_bundle_videofav;
    }
    else if (kind == "comment") {
      template_bundle_id = fbUtils.templte_bundle_videocomment;
      template_data["comment"] = comment;
    }
    else if (kind == "shout") {
      template_bundle_id = fbUtils.templte_bundle_videoshout;
      template_data["shout"] = comment;
    }

    FB.Connect.showFeedDialog(template_bundle_id,
                              template_data,
                              null,
                              null,
                              story_size,
                              FB.RequireConnect.doNotRequire, null);
    FacebookConnect.startInterval();
  },
  handleGroupNotifications: function(groupId, groupName, comment) {
    var template_bundle_id = 0;
    var story_size = FB.FeedStorySize.shortStory;

    template_bundle_id = fbUtils.templte_bundle_groupcomment;

    var template_data = {};
    template_data["groupid"] = groupId;
    template_data["groupName"] = groupName;
    template_data["comment"] = comment;

    FB.Connect.showFeedDialog(template_bundle_id,
                              template_data,
                              null,
                              null,
                              story_size,
                              FB.RequireConnect.doNotRequire, null);
    FacebookConnect.startInterval();
  }
};