// UTF-8 Encoding / Decoding
    // public method for url encoding
    function utf8encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext.replace("'","\'").replace('"','\"');
    }

    function utf8decode(utftext) {
        var string = "";
        var i = 0;
        var c = 0;
        var c1 = 0;
        var c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }
        return string;
    }
    
// Retrieves the value of an parameter in the current url
// From : http://www.netlobo.com/url_query_string_javascript.html
function get_url_parametervalue_by_name( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS , "i");
  var results = regex.exec( window.location.href );
  if( results === null )
  {
    return "";
  }
  else
  {
    return results[1];
  }
}


// Determine if a string is a valid email
function validateEmail(elementValue){
    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; 
    return emailPattern.test(elementValue); 
}

// Determine if a string is a valid url
function validateUrl(elementValue) {
    var urlPattern = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
    return urlPattern.test(elementValue);
}


/////////////////////////////////////////////////////
// FUNCTIONS FOR Cookies
/////////////////////////////////////////////////////
function SetCookie(c_name,value,expiredays){
    var exdate=new Date();
    exdate.setDate(exdate.getDate()+expiredays);
    document.cookie=c_name+ "=" +escape(value)+((expiredays===null) ? "" : "; expires="+exdate.toGMTString()) + "; path=/";
}

function GetCookie(c_name)
{
    if (document.cookie.length>0)
    {
        c_start=document.cookie.indexOf(c_name + "=");
        if (c_start!=-1)
        { 
            c_start=c_start + c_name.length+1; 
            c_end=document.cookie.indexOf(";",c_start);
            if (c_end == -1)
                { c_end = document.cookie.length; }
            return unescape(document.cookie.substring(c_start,c_end));
        } 
    }
    return "";
}

// hasCookies determines if there are support for cookies
function CookiesEnabled()
{
    var cookieName = "TestTrackCookie";
    SetCookie(cookieName, "xyz", 1);
    if(GetCookie(cookieName)=="xyz")
    {
        SetCookie(cookieName, "xyz", -2);
        return true;
    }
    return false;
}
/////////////////////////////////////////////////////
// END FUNCTIONS FOR FOR Cookies
/////////////////////////////////////////////////////


/////////////////////////////////////////////////////
// FUNCTIONS FOR Initializing frontpage
/////////////////////////////////////////////////////


// Init frontpage
function initDropDownFrontpage()
{
      var browser_msie = jQuery.browser.msie && jQuery.browser.version < 8;
      if(browser_msie)
      {
        var zIndexNumber = 10000;
        
        // Put your target element(s) in the selector below!
        jQuery("#header div, #recommended_list div, #recommended_list span.icon").each(function() {
           jQuery(this).css('zIndex', zIndexNumber);
           zIndexNumber -= 10;
           });
      }
}

function initConcertGuideFrontpage()
{

    updateFrontPageConcertGuide('Alle');
	                            
    jQuery(".place_expanded ul li a").each(function() {
        jQuery(this).click(function() {
            updateFrontPageConcertGuide(jQuery(this).text());
        });
    });
   
}

function updateFrontPageConcertGuide(location)
{
        // Set content of dropdownbox  
        jQuery("#place_dropdown").text(location);
        var bgcolor = "#0000FF";
        var backcolor = "0xFFFFFF"; // bg liste + player controller
        var frontcolor = "0x666666"; // titler + playersymbol
        var lightcolor = "0xcbcbcb"; // hilite scroll + playersymbol + aktive titler
        var screencolor = "0x000000"; // vet ikke... BG bak bildet, opp til player v 4.3
        var skinurl = baseUri + "automat/dangdang_konsertguide.swf";
        var so = new SWFObject(baseUri + 'automat/player-4.3.swf','swfkonsertplayer','704','280','8');                  //var so = new SWFObject('','swfkonsertplayer','704','300','8');
        so.addParam("allowfullscreen","true");
        so.addParam("bgcolor", bgcolor);
        so.addParam('wmode','transparent');
        if(location == 'Alle')
            location = '';
        var rss = baseUri + "search/gigfeed.aspx?location="+location;
        so.addVariable("file", rss);
        so.addVariable("enablejs","false");
        so.addVariable("backcolor", backcolor);
        so.addVariable("frontcolor", frontcolor);
        so.addVariable("lightcolor", lightcolor);
        so.addVariable("screencolor", screencolor);
        so.addVariable("playlistsize","464");
        so.addVariable("skin", skinurl);
        so.addVariable("playlist","right");
        so.addVariable("thumbsinplaylist","true");
        so.addVariable("plthumbs","true");
        so.addVariable('shuffle','false');
        so.addVariable('repeat','true');
        so.write('konsertplayer');
        jQuery(".place_expanded").hide();
}


function initFrontPage()
{
        initDropDownFrontpage();
        initConcertGuideFrontpage();
}

/////////////////////////////////////////////////////
// END FUNCTIONS FOR Initializing frontpage
/////////////////////////////////////////////////////


/////////////////////////////////////////////////////
// FUNCTIONS FOR Comment-Track page
/////////////////////////////////////////////////////
    function commentTrackThumbsUpDown(updown, thumbsupid, thumbsdownid, hiddenfieldid)
    {
        if(updown=='up')
        {
            jQuery('#'+thumbsdownid).removeClass('clickeddown').addClass('notclickeddown');
            jQuery('#'+thumbsupid).addClass('clickedup').removeClass('notclickedup');
        }
        else if(updown=='down')
        {
            jQuery('#'+thumbsupid).removeClass('clickedup').addClass('notclickedup');
            jQuery('#'+thumbsdownid).addClass('clickeddown').removeClass('notclickeddown');
        }

        jQuery('#'+hiddenfieldid).val(updown);
        
    }

    function UpdateCommentUsernameEmailHomepageCookie(username, email, homepage) {
        SetCookie("UEHCommentCookie", JSON.stringify({ username:  username , email:  email, homepage: homepage }), 365);
   }

    function GetCommentUsernameEmailHomepageCookie(username, email, homepage) {
        var cookie = GetCookie("UEHCommentCookie");
        if (cookie === '') {
            return { username: '', email: '', homepage: '' };
        }
        return JSON.parse(cookie);
    }



    function updateAndShowEmbeddedPlayerTrackCommentBox(userid, mmmid) {
        // Hide mixtape markup
        jQuery(".np_content_mixtapes").hide();
    
        var url = baseUri + "search/GetTracks.ashx?type=singletrack&q=" + mmmid;
        jQuery.getJSON(url, null,
                            function(data) {
                                if (data.length) {
                                    var iurl = unescape(data[0].imageurl);
                                    var artist = unescape(decodeURIComponent(data[0].alias));
                                    var title = unescape(decodeURIComponent(data[0].trackname));
                                    var rec = data[0].recommended;
                                    var mmmid = data[0].mmmid;
                                    var mmiid = data[0].mmiid;
                                    var userid = data[0].userid;
                                    var ip = data[0].ip;

                                    // Get cookie values
                                    var cookie = GetCommentUsernameEmailHomepageCookie();

                                    // Tekst:
                                    jQuery(".np_header_pre").text("Kommenter:")

                                    // Bilder
                                    jQuery(".np_header_image").empty().append("<img alt='" + artist +"' src='" + iurl + "'/>");

                                    // Navn på band / låt
                                    jQuery(".np_header_title_artist").text(artist);
                                    jQuery(".np_header_title_title").text(title);

                                    // Oppdater submit
                                    jQuery("#np_submit").unbind("click").removeClass('no_hover').click(function() { validateEmbeddedPlayerTrackComment(userid, mmmid); });

                                    // Nullstill input-bokser
                                    jQuery("#np_feedback").html("");
                                    jQuery("#nowplaying_comment_input").removeClass("sending_comment").removeAttr("readonly").val('');

                                    // Skjul inputbokser om pålogget
                                    if (userid < 0) {
                                        jQuery(".np_content_right").removeClass('hide');
                                        jQuery(".np_content_left").removeClass('loggedin');
                                        jQuery(".nowplaying_comment_singleinput").removeAttr("readonly");
                                        if (cookie.username.length > 0)                                        
                                            jQuery("#nowplaying_comment_name").val(cookie.username);

                                        if (cookie.email.length > 0)
                                            jQuery("#nowplaying_comment_email").val(cookie.email);

                                        if (cookie.homepage.length > 0)
                                            jQuery("#nowplaying_comment_homepage").val(cookie.homepage);
                                    } else {
                                        jQuery(".np_content_right").addClass('hide');
                                        jQuery(".np_content_left").addClass('loggedin');
                                        jQuery("#nowplaying_comment_submit").show();
                                        jQuery(".nowplaying_comment_singleinput").attr("readonly", "readonly");
                                    }
                                    
                                    // Update footer 
                                    jQuery(".np_wrapper").removeClass("np_wrapper_mixtape").addClass("np_wrapper_comment");                                    

                                    // Show box
                                    jQuery(".np_wrapper").show();
                                    jQuery(".np_content").show(); 
                                    jQuery("#nowplaying_comment_input").focus()

                                }
                            }
                        );
    
    }


    function updateAndShowEmbeddedPlayerMixtapeBox(mmmid) {
        var userContext = mmmid;
        Nrk.Untouched.WebService.MixtapeService.GetMixtapeInfoForMiniautomat(mmmid, onUpdateAndShowEmbeddedPlayerMixtapeBox, onEmbeddedPlayerMixtapError, userContext);
    }
     
    function  displayEmbeddedPlayerMixtapeBoxMessage(msg) {
        jQuery("#np_feedback_mixtape").hide().text(msg).fadeIn("slow");
    }
        
    function onEmbeddedPlayerMixtapError(error, context, methodName)
    {
        displayEmbeddedPlayerMixtapeBoxMessage("Det oppstod en feil. (" + error._message + ")");
    }

    function showMixtapeBoxHeaderAddNew()
    {
        // Slett gamle meldinger
        displayEmbeddedPlayerMixtapeBoxMessage('');
    
        // Sett klasser for å aktivere / deaktivere
        jQuery("#np_content_mt_header_add").addClass('active');
        jQuery("#np_content_mt_header_existing").removeClass('active');

        // Juster overskrift
        jQuery("#np_content_mt_header_existing .headertext").text('Legg til eksisterende');
        jQuery("#np_content_mt_header_existing #np_mt_users").hide();

        // Vis og skjul korrekte headere
        jQuery('#np_content_mt_list').hide();
        jQuery('#np_content_new_mt').show()
    }

    function showMixtapeBoxHeaderAddExisting()
    {
        // Slett gamle meldinger
        displayEmbeddedPlayerMixtapeBoxMessage('');

        // Sett klasser for å aktivere / deaktivere
        jQuery("#np_content_mt_header_add").removeClass('active');
        jQuery("#np_content_mt_header_existing").addClass('active');

        // Juster overskrift
        jQuery("#np_content_mt_header_existing .headertext").text('Legg til for ');
        jQuery("#np_content_mt_header_existing #np_mt_users").show();

        // Vis og skjul korrekte headere
        jQuery('#np_content_new_mt').hide()
        jQuery('#np_content_mt_list').show();
    }


    function onUpdateAndShowEmbeddedPlayerMixtapeBox(result, userContext) {
        var mmmid = userContext;
        var result = JSON.parse(result);
        if(result.returncode != 0)
        {
           displayEmbeddedPlayerMixtapeBoxMessage(result.returnmessage);
           return;
        }            
         
        // Slett gamle tekster
        displayEmbeddedPlayerMixtapeBoxMessage(''); 
            
        var iurl = result.imageurl;
        var artist = result.alias;
        var title = result.trackname;
        var userid = result.userid;
        // Vis tab i tilfelle den ble skjult forrige gang
        jQuery("#np_content_mt_header_existing").show(); 
        
        // Bilder
        jQuery(".np_header_image").empty().append("<img alt='" + artist +"' src='" + iurl + "'/>");

        // Navn på band / låt
        jQuery(".np_header_title_artist").text(artist);
        jQuery(".np_header_title_title").text(title);

        // Tekst:
        jQuery(".np_header_pre").text("Legg låt til miksteip:")

        // Oppdater submit
        jQuery("#np_content_new_mt_submit").unbind("click").removeClass('no_hover').click(function() { addNewMixtapeAndEmbeddedTrackToMixtape(userid, mmmid);});

        // Nullstill input-bokser
        jQuery("#mt_new_name, #mt_new_description").removeAttr('readonly');
        jQuery("#mt_new_name, #mt_new_description").val('');
        

        // Lag dropdown for person og artister. Om ingen band, lag bare en div
        var foundAnyMixtapes = false;
        var onlyUser = false;
        // TODO: OnClick på span - vis dropdownlist
        var dropdownhtml = "<br/><ul id='np_mt_users_dropdown' style='display:none'>";
        var userid = result.subjects[0].subjectid;
        if(result.subjects.length == 1) {
            jQuery("#np_mt_users").text(result.subjects[0].alias);
        }
        else 
        {
            var img = '<img alt="Mer" src="' + baseUri + 'app_themes/Haltenbanken/graphics/login-more.gif" style="display: inline;"/>';
            jQuery("#np_mt_users").html("<span onclick='jQuery(\"#np_mt_users_dropdown\").toggle();'>" + result.subjects[0].alias +  img + "</span>");
        }

        var mtList = '';
        for(var i=0; i < result.subjects.length; i++)
        {           
            var alias = result.subjects[i].alias;
            var newAlias = alias;
            if(alias.length > 17)
                newAlias = alias.substring(0,17) + "..";
            var id = result.subjects[i].subjectid;
            var mixtapesCnt = " (" + result.subjects[i].numberofmixtapes + ")";
            var main = "";
            if(i == 0) main = " main";
            var onclick = ' onclick=\"setActiveMixtapeSubject(' + id + ','+mmmid+');jQuery(\'#np_mt_users_dropdown\').hide();\"';
            dropdownhtml = dropdownhtml + "<li title='"+ alias +"' class='subjectid_" + id + main + "'"+ onclick+">" + newAlias + mixtapesCnt + "</li>";                 

            // Append mtList
            var tmp = '';            
            if(result.subjects[i].mixtapes)
            {
                tmp = getMixtapeUlList(id, mmmid, result.subjects[i].mixtapes);                        
            }
            if(tmp != '') foundAnyMixtapes = true;
            mtList = mtList + tmp;    
        
        }        
        dropdownhtml = dropdownhtml + "</ul>";
        jQuery("#np_mt_users").append(dropdownhtml);
        jQuery("#np_content_mt_list").html(mtList);            
        
        // Om ingen miksteips, skjul den ene tabben og vis legg til 
        if(foundAnyMixtapes == false)
        {
            jQuery("#np_content_mt_header_existing").hide();
            showMixtapeBoxHeaderAddNew();
        }
        // Om cookie er satt, forsøk å velge riktig person/artists og miksteip
        else
        {
            var subjectid = getLatestSubjectIdFromCookie();
            if(subjectid != '' && subjectid != -1)
            {
                setActiveMixtapeSubject(subjectid, mmmid);
            }
            else
                setActiveMixtapeSubject(userid, mmmid); 
                
           showMixtapeBoxHeaderAddExisting();                                                   
        }

        // Update footer 
        jQuery(".np_wrapper").removeClass("np_wrapper_comment").addClass("np_wrapper_mixtape");

        // Vis bokser
        jQuery(".np_content").hide();        
        if(foundAnyMixtapes == true)
        {
            jQuery("#np_content_new_mt").hide();
            jQuery("#np_content_mt_list").show();
        }
        else{
            jQuery("#np_content_new_mt").show();
            jQuery("#np_content_mt_list").hide();
        }
        jQuery(".np_content_mixtapes").show();
        jQuery(".np_wrapper").show();   
        


    
    }

    function setActiveMixtapeSubject(userid, mmmid)
    {
        // Sett riktig subject i header
        var alias = jQuery("#np_mt_users_dropdown .subjectid_"+userid).text();
        var img = '<img alt="Dine artister" src="' + baseUri + 'app_themes/Haltenbanken/graphics/login-more.gif" style="display: inline;"/>';
        jQuery("#np_mt_users span").html(alias + img);
        
        // Skjul alle miksteip-lister bortsett fra den aktive
        jQuery(".mixtapeslist").hide();
        jQuery(".mixtapeslist div.scrollcontainer").removeClass('scrollable');
        jQuery(".mixtapeslist_" + userid + " div.scrollcontainer").addClass('scrollable');
        jQuery(".mixtapeslist_"+userid).show();
                
        // Oppdater submit i mixtape
        jQuery("#np_content_new_mt_submit").unbind("click").removeClass('no_hover').click(function() { addNewMixtapeAndEmbeddedTrackToMixtape(userid, mmmid);});
        
        // Oppdater cookie
        setLatestSubjectIdInCookie(userid);
        
        jQuery("div.scrollable").scrollable({ 
            vertical:true,  
            size: 4,
            item: "li"                   
        });
        jQuery("div.scrollable").navigator({navi:'ul.navi'});
    }

    function getMixtapeUlList(id, mmmid, mixtapes)
    {
        var res = '';
        if(!mixtapes || mixtapes.length == 0)        
        {
            return res;
        }        
        res = res + "<div class='mixtapeslist mixtapeslist_" + id + "'><div class='scrollcontainer'><ul class='items'>";
        for(var i=0; i < mixtapes.length; i++)
        {
            var title =  "Legg til: " + unescape(mixtapes[i].title);
            var description = 'title = \"Legg låta til denne miksteipen\"';
            var listid = mixtapes[i].listid;                           
            var numberoftracks = mixtapes[i].numberoftracks;
            
            var shorttitle = title;
            if(title.length > 40)
                shorttitle = title.substring(0,40) + "..";
            shorttitle = shorttitle + " (<span class='mttrackcnt'>" + numberoftracks + "</span>)";
        
            var playLink = "";
            if(numberoftracks > 0)
            {
                var onclick =  "popPlayer(\"" + baseUri +  "search/mixtapefeed.ashx?listid=" + listid + "\");return false;"
                playLink = "<a href='javascript:;' class='mixtape_play' title='Lytt på miksteipen' onclick='"+onclick+"'>Lytt</a>";                  
            }
        
            var addClick = ' onclick="addEmbeddedTrackToMixtape(' + id + ',' + mmmid + ',' + listid + ');" ';  
        
            var editLink = "<a class='mixtape_edit' href='"+ baseUri + "myuser2/editMixtapes.aspx?listid="+listid+"&amp;id=" + id +"'>Rediger</a>"
            res = res + "<li><a class='mixtape_entry mixtape_"+listid+"' href='javascript:;'"+addClick +description+">"+ shorttitle + "</a>" + 
                            playLink + editLink + "</li>";     
        
        }
        
        // Build navi links        
        var navi = getNavigationList(mixtapes.length, 4);
                
        res = res + "</ul></div>"+ navi +"</div>";
        
        return res;            
    }

    function getNavigationList(totalSize, itemsPerPage)
    {
        var navi = "";
        var pages = (totalSize / itemsPerPage) + 0.49; /* Casts from double to int, 4 items per page */
        pages = Math.round(pages);
        if(pages > 1)
        {
            navi = "<ul class='navi'>";
            for(var i=1;i <= pages;i++)
            {
              var hash = 'first';
              if(i==2) hash = 'second';
              if(i==3) hash = 'third';
              if(i==4) hash = 'fourth';
              if(i==5) hash = 'fifth';
              if(i==6) hash = 'sixth';
              if(i==7) hash = 'seventh';
              if(i==8) hash = 'eigth';
            
              navi = navi + "<li><a href='"+hash+"'>" + i + "</a></li>";
            }
            navi = navi + "</ul>";
        }
        return navi;
    }

    function addNewMixtapeAndEmbeddedTrackToMixtape(userid, mmmid)
    {
        var userContext = [];
        userContext[1] = userid;
        userContext[0] = mmmid;
        
        var title = jQuery("#mt_new_name").val();
        if(title.trim().length == 0)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Du må gi den nye miksteipen en tittel!");   
            return false;
        }

        if(title.trim().length > 200)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Tittelen på miksteipen er for lang. Maks 200 tegn.");   
            return false;
        }
        
        var description = jQuery("#mt_new_description").val().trim();
        if(description.trim().length > 500)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Beskrivelsen av miksteipen er for lang. Maks 500 tegn.");   
            return false;
        }

        displayEmbeddedPlayerMixtapeBoxMessage("Vent litt..");   
        jQuery("#np_content_new_mt_submit").hide();
            
        // Add new mixtape + track
        Nrk.Untouched.WebService.MixtapeService.AddNewMixtape(userid, title, description, mmmid, addNewMixtapeAndEmbeddedTrackToMixtapeSucceeded, addNewMixtapeAndEmbeddedTrackToMixtapeError, userContext);
    }
    
    function addNewMixtapeAndEmbeddedTrackToMixtapeSucceeded(result, userContext) 
    {
        var subjectid = userContext[0];
        var retval = result[0];
        if(retval == -2)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Du har for mange miksteiper. Slett en teip vel å klikke på 'Rediger' i miksteiplista");   
            return;
        }

        if(retval < 0)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Klarte ikke å opprette mixteipen. Prøv igjen senere.");   
            return;
        }
                    
        // Store previous used cookie            
        setLatestListIdInCookie(subjectid, retval);

        // Hide tab for other mixtapes
        jQuery("#np_content_mt_header_existing").hide();    
        jQuery("#mt_new_name, #mt_new_description").attr('readonly','readonly');

        displayEmbeddedPlayerMixtapeBoxMessage("Ny mixteip oppretta og låt lagt til!");   

    }

    function addNewMixtapeAndEmbeddedTrackToMixtapeError(error, context, methodName)
    {
        jQuery("#np_content_new_mt_submit").show();
        jQuery("#np_content_mt_header_existing").show();            
        displayEmbeddedPlayerMixtapeBoxMessage("Det oppstod en feil. Du kan forsøke igjen. (" + error._message + ")");
    }


    function addEmbeddedTrackToMixtape(userid, mmmid, listid)
    {
        var userContext = {};
        userContext[0] = userid;
        userContext[1] = mmmid;
        userContext[2] = listid;

        jQuery(".mixtape_"+listid).removeAttr('onclick');    
        displayEmbeddedPlayerMixtapeBoxMessage("Vent litt..");   
        Nrk.Untouched.WebService.MixtapeService.AddTrackToMixtape(userid, listid, mmmid, onAddEmbeddedTrackToMixtape, onAddEmbeddedTrackToMixtapeError, userContext);
    }

    function onAddEmbeddedTrackToMixtapeError(error, context, methodName)
    {
        var userid = context[0];
        var mmmid = context[1];
        var listid = context[2];
        var addClick = 'addEmbeddedTrackToMixtape(' + id + ',' + mmmid + ',' + listid + ')';          
        jQuery(".mixtape_"+listid).addAttr('onclick', addClick); 
        
        displayEmbeddedPlayerMixtapeBoxMessage("Det oppstod en feil. Du kan forsøke igjen. (" + error._message + ")");
    }

    function onAddEmbeddedTrackToMixtape(result, userContext) 
    {
        var retval = result[0];
        if(retval == -2)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Låta finnes allerede i miksteipen.");   
            return;
        }

        if(retval < 0)
        {
            displayEmbeddedPlayerMixtapeBoxMessage("Klarte ikke å legge til låta i miksteipen. Prøv igjen senere.");   
            return;
        }
        var listid = userContext[2];
                    
        // Legg til ny klasse og fjern klikk for lista som den er lagt til
        jQuery(".mixtape_"+listid).addClass('trackadded');
        jQuery(".mixtape_"+listid+ " .mttrackcnt").text(retval);
                       
        // Legg til tekst
        displayEmbeddedPlayerMixtapeBoxMessage("Låta er lagt til miksteipen. Du har nå " + retval + " låt(er) i teipen.");        
    }

    function validateEmbeddedPlayerTrackComment(userid, mmmid) {
        var comment = jQuery("#nowplaying_comment_input").val().trim();
        if (comment === '' || comment.length < 2 ) {
            jQuery("#np_feedback").text("Du må skrive noe i kommentarfeltet");
            return false;
        }

        // Anon user
        var email = '';
        var name = '';
        var homepage = '';
        if (userid < 1) {
            name = jQuery("#nowplaying_comment_name").val().trim(); 
            if ( name === '') {
                jQuery("#np_feedback").text("Du må skrive inn navnet ditt");
                return false;
            }

            email = jQuery("#nowplaying_comment_email").val().trim();
            if (email === '') {
                jQuery("#np_feedback").text("Du må skrive inn din e-post");
                return false;
            }

            if (!validateEmail(email)) {
                jQuery("#np_feedback").text("Du må skrive inn en gyldig e-postadresse");
                return false;
            }

            homepage = jQuery("#nowplaying_comment_homepage").val().trim();
            if (homepage != '') {
                if (!validateUrl(homepage)) {
                    jQuery("#np_feedback").text("Hjemmeside må oppgis på formen http://min.adresse/erher");
                    return false;
                }
            }        
        }

        var userContext = mmmid;
    
        // Add loading image + disable send button
        jQuery("#np_submit").attr("disabled","disabled");        
        jQuery("#nowplaying_comment_input").addClass("sending_comment");

        // Store info in cookie
        UpdateCommentUsernameEmailHomepageCookie(name, email, homepage);

        // Post to webservice
        Nrk.Untouched.WebService.TrackReview.AddTrackReview2(userid,
                                                           mmmid,
                                                           comment,
                                                           name,
                                                           email,
                                                           homepage,
                                                           OnAddEmbeddedPlayerTrackCommentSucceeded,
                                                           OnAddEmbeddedPlayerTrackCommentError, 
                                                           userContext);    
    }

    function OnAddEmbeddedPlayerTrackCommentError(error, context, methodName) {
        var err = "Det oppstod en feil. ";
        err+= "[" + error._message + "]";
        
        jQuery("#np_feedback").text(err);
        jQuery("#np_submit").removeAttr("disabled")
        jQuery("#nowplaying_comment_input").removeClass("sending_comment"); 

    }


    function OnAddEmbeddedPlayerTrackCommentSucceeded(result, userContext) {
        var res = result[0];
        var mmmid = userContext;
        if (res > 0) {
            jQuery("#np_feedback").html("<a href='" + baseUri + "Laat/" + mmmid + "'>Din kommentar er sendt. Klikk her for å se den og andre.</a>");
            jQuery("#np_submit").removeAttr("disabled").unbind('click').addClass("hide");
            jQuery("#nowplaying_comment_input").removeClass("sending_comment").attr("readonly", "readonly");
            jQuery(".nowplaying_comment_singleinput").attr("readonly", "readonly");
        }
        else {
            var err = "Klarte ikke å legge til kommentar. ";
            if (res == -2) { 
                err += "Problem ved autentisering (-2).";
             }
            else if (res == -3) { 
             err += "Problem med brukerid (-3).";}
            else if (res == -4) { 
             err += "Kommentaren var for kort (-4).";}
            else if (res == -5) { 
             err += "Det oppstod et problem når vi skulle lete opp låta (-5).";}
            else if (res == -6) { 
             err += "Klarte ikke å lagre kommentaren (-6).";}
            else {
                err+= "Ukjent feil (" + res + ")";
            }            
            jQuery("#np_feedback").text(err);
            jQuery("#nowplaying_comment_input").removeClass("sending_comment").removeAttr("readonly") ;
            jQuery("#nowplaying_comment_singleinput").removeAttr("readonly");
        }
        
        
    }



    function validateTrackComment()
    {
        if(jQuery(".commenttracktextbox").val().trim() === '')
        {
            jQuery("#validatetrackcommentmessage").text("Du må skrive noe i kommentarfeltet");
            return false;
        }
        
        

       
       // If not on, pop login and return
       var ssa = Sys.Services.AuthenticationService;
       if (!ssa.get_isLoggedIn()) {
            if(jQuery(".commenttracknametextbox").val().trim() === '')
            {
                jQuery("#validatetrackcommentmessage").text("Du må skrive inn ett navn");
                return false;
            }

            if(jQuery(".commenttrackemailtextbox").val().trim() === '')
            {
                jQuery("#validatetrackcommentmessage").text("Du må skrive inn din email");
                return false;
            }

            var email = jQuery(".commenttrackemailtextbox").val().trim();
            if(email === '')
            {
                jQuery("#validatetrackcommentmessage").text("Du må skrive inn din email");
                return false;
            }
            
            if(!validateEmail(email))
            {
                jQuery("#validatetrackcommentmessage").text("Du må skrive inn en gyldig email-adresse");
                return false;
            }
            
       }

        jQuery("#validatetrackcommentmessage").text("");
        return true;    
    }
    

/////////////////////////////////////////////////////
// END FUNCTIONS FOR Comment-Track page
/////////////////////////////////////////////////////

/////////////////////////////////////////////////////
// FUNCTIONS FOR Laater and Mixtape page.
/////////////////////////////////////////////////////

    /*** GLOBALS ***/
    var laaterPageContainingId = '';
    var laaterPageTrackContainerPrefix='#';

    function laaterPushToPlayList(playlist, ids) {
        var mmmid = -1;
        var mmiid = -1;
        var bandname = "";
        var trackname = "";
        for (var i in ids) {
            mmmid = ids[i].mmmid;
            mmiid = ids[i].mmiid;
            bandname = ids[i].bandname;
            trackname = ids[i].trackname;
            
            id_to_player = "idtype:laater|mmmid:" + mmmid + "|mmiid:" + mmiid;

            trackpath = baseUri + "1.0/track/listen/" + mmiid + ".mp3";

            // addTheItem("miniautomat", { file: "" + trackpath + "", author: "" + bandname + "", title: "" + trackname + "", id: "" + id_to_player + "" });
            playlist.push({ file: "" + trackpath + "", author: "" + bandname + "", title: "" + trackname + "", tags: "" + id_to_player + "" });
        }
    }
    
    function laaterMarkPlaying(mmmid,mmiid){
        if (laaterPageContainingId !== '' && 0 !== laaterPageContainingId.indexOf('#')) {
            laaterPageContainingId = '#' + laaterPageContainingId + ' ';
        }
        
        jQuery(".playing .thetime").text("");
        jQuery(".paused .thetime").text("");
        jQuery(".track").removeClass("playing").removeClass("paused");

        jQuery(laaterPageContainingId + laaterPageTrackContainerPrefix + "track_" + mmmid + "_" + mmiid).addClass("playing");
        jQuery(laaterPageContainingId + laaterPageTrackContainerPrefix + "track_" + mmmid + "_" + mmiid + ":visible .thetime").text("0:00");
    }

    function laaterAddTracksToPlayList(playlist, mmmid) {
        if (laaterPageContainingId !== '' && laaterPageContainingId.indexOf('#')!==0)
        {
            laaterPageContainingId = '#' + laaterPageContainingId + ' ';
        }
        var sel = laaterPageContainingId + ".track:visible";
        var ids_before = [];
        var ids_after = [];
        var before = true;
        jQuery(sel).each(function () {
            var id = this.id;
            // FIND THE CLASSNAME STARTING WITH "TRACK_"
            if (laaterPageTrackContainerPrefix == '.') {
                var classString = jQuery(this).attr('class');
                var classes = classString.split(' ');
                for (var c in classes) {
                    if (classes[c].indexOf('track_') === 0) {
                        id = classes[c];
                        break;
                    }
                }
            }
            var parts = id.split("_");
            var curr_bandname = jQuery(laaterPageTrackContainerPrefix + id + " .alias").text();
            var curr_trackname = jQuery(laaterPageTrackContainerPrefix + id + " .trackname").text();
            var curr_mmmid = parts[1];
            var curr_mmiid = parts[2];
            if (curr_mmmid == mmmid) {
                before = false;
                return;
            }
            if (before) {
                ids_before.push({ mmmid: "" + curr_mmmid + "",
                    mmiid: "" + curr_mmiid + "",
                    bandname: "" + curr_bandname + "",
                    trackname: "" + curr_trackname + ""
                });
            } else {
                ids_after.push({ mmmid: "" + curr_mmmid + "",
                    mmiid: "" + curr_mmiid + "",
                    bandname: "" + curr_bandname + "",
                    trackname: "" + curr_trackname + ""
                });

            }
        });
        laaterPushToPlayList(playlist, ids_after);
        laaterPushToPlayList(playlist, ids_before);
    }

    // Play a single track on a page, and queue the rest of the track
    function laaterPlayTrack(mmmid, mmiid, bandname, trackname) {
        // If already playing, set pause
        if (jQuery(laaterPageTrackContainerPrefix + "track_" + mmmid + "_" + mmiid).hasClass("playing")) {
            jQuery(laaterPageTrackContainerPrefix + "track_" + mmmid + "_" + mmiid).removeClass("playing").addClass("paused");
            sendEvent("miniautomat", "PLAY","TRUE");
            return;
        }

        // If already paused, set playing
        if (jQuery(laaterPageTrackContainerPrefix + "track_" + mmmid + "_" + mmiid).hasClass("paused")) {
            jQuery(laaterPageTrackContainerPrefix + "track_" + mmmid + "_" + mmiid).removeClass("paused").addClass("playing");
            sendEvent("miniautomat", "PLAY", "TRUE");
            return;
        }
                
        // Mark Track
        laaterMarkPlaying( mmmid, mmiid);
        

        // Start first track
        var trackpath = baseUri + "1.0/track/listen/" + mmiid + ".mp3";
        var id_to_player = "idtype:laater|mmmid:" + mmmid + "|mmiid:" + mmiid;
        //loadTheFile("miniautomat", { file: "" + trackpath + "", author: "" + bandname + "", title: "" + trackname + "", tags: "" + id_to_player + "" });

        var playlist = new Array();
        playlist.push({ file: "" + trackpath + "", author: "" + bandname + "", title: "" + trackname + "", tags: "" + id_to_player + "" });

        // Enqueue the rest of the tracks in this list
        laaterAddTracksToPlayList(playlist, mmmid);

        loadTheFile("miniautomat", playlist);
        // loadTheFile("miniautomat", { file: "" + trackpath + "", author: "" + bandname + "", title: "" + trackname + "", tags: "" + id_to_player + "" });
        return false;
    
    }


    

    // IDLE, BUFFERING, PLAYING, PAUSED, COMPLETED
    function laaterUpdateState(state)
    {
        if(state === "PAUSED")
        {
            jQuery('.playing').removeClass('playing').addClass('paused');
        }
        else if (state == "PLAYING")
        {
            jQuery('.paused').removeClass('paused').addClass('playing');
        }
    }

    
    function laaterSetTime(currentTime)
    {
        var minutes = Math.floor(currentTime/60);
        var secs = currentTime % 60;
        if (secs < 10) {
            secs = "0" + secs;
        }
        jQuery(".playing .thetime").text(minutes + ":" + secs);
    }

    function updateBrowseMixtapeZIndexForIE7(){
              var browser_msie = jQuery.browser.msie && jQuery.browser.version < 8;
              if(browser_msie)
              {
                var zIndexNumber = 10000;
                
                // Put your target element(s) in the selector below!
                jQuery("div").each(function() {
                   jQuery(this).css('zIndex', zIndexNumber);
                   zIndexNumber -= 10;
                   });
                
                jQuery("#addTrackToMixtapeOverlay").css('zIndex', 15000);
                   
                zIndexNumber = 20000;
                // Put your target element(s) in the selector below!
                jQuery("#addTrackToMixtape").each(function() {
                   jQuery(this).css('zIndex', zIndexNumber);
                   zIndexNumber -= 10;
                   });

              }
    }

/////////////////////////////////////////////////////
// END FUNCTIONS FOR Laater and Mixtape page.
/////////////////////////////////////////////////////

// Cancels event bubbling
function stopEventBubbling(e) 
{
    if (typeof (e) == "undefined" && typeof (window.event) != "undefined")
    { e = window.event; }

    if (typeof( window.event ) != "undefined" ) { 
        // IE  
        e.cancelBubble=true;
    } 
    else { 
        // Firefox  
        e.stopPropagation(); 
    } 
}


/////////////////////////////////////////////////////
// FUNCTIONS FOR Facebook share and such
/////////////////////////////////////////////////////
function facebookShareTrack(mmmid) { u = baseUri + "Laat/"+mmmid; t = document.title; window.open('http://www.facebook.com/sharer.php?u=' + encodeURIComponent(u) + '&t=' + encodeURIComponent(t), 'sharer', 'toolbar=0,status=0,width=626,height=436'); return false; }

function facebookShareBandTracks(nicealias) {u = baseUri + "Artist/" + nicealias; t = document.title; window.open('http://www.facebook.com/sharer.php?u=' + encodeURIComponent(u) + '&t=' + encodeURIComponent(t), 'sharer', 'toolbar=0,status=0,width=626,height=436'); return false; }

/////////////////////////////////////////////////////
// END FUNCTIONS FOR Facebook share and such
/////////////////////////////////////////////////////


/******************************************
* Simple watermark
*******************************************/
function clickclear(thisfield, defaulttext, color) {
    if (thisfield.value == defaulttext) {
        thisfield.value = "";
        if (!color) {
            color = "000000";
        }
        thisfield.style.color = "#" + color;
    }
}
function clickrecall(thisfield, defaulttext, color) {
    if (thisfield.value == "") {
        thisfield.value = defaulttext;
        if (!color) {
            color = "cccccc";
        }
        thisfield.style.color = "#" + color;
    }
}
/******************************************
* End simple watermark
*******************************************/

