/* Now playing updates implemented with JSON and JQuery */

/*
DOM Structure:
    <div id="nowplaying">
      <div class="cover">album art</div>
      <div class="info">
        <div class="label">On air now:</div>
        <div class="show">foo</div>
        <div class="label">Now Playing:</div>
        <div class="artist">foo</div>
        <div class="label">Song:</div>
        <div class="song">foo</div>
        <div class="listen">LISTEN NOW</div>
      </div>
    </div>
*/

$.json = { callbacks: {} };

$.fn.json = function( url, callback ) {
    var _$_ = this;
    load( url.replace( /{callback}/, name(callback) ) );
    return this;

    function name( callback ) {
        var id = (new Date).getTime();
        var name = 'json_' + id;

        var cb = $.json.callbacks[id] = function( json ) {
            delete $.json.callbacks[id];
            eval( 'delete ' + name );
            _$_.each( function() { callback(json); } );
        };

        eval( name + ' = cb' );
        return name;
    }

    function load( url ) {
        var script = document.createElement( 'script' );
        script.type = 'text/javascript';
        script.src = url;
        $('head',document).append( script );
    }
};

var nowPlayingTimer;
var currentTitle = '';
var ERROR_WINDOW_SIZE = 4 * 60 * 1000;
var currentDuration = 0;

//IE is silly so:
//seems that ff crashes out if you reference nodevalues of childs that are null.  so this attempts to fix
function  getNodeValue(path,data,index){

  var v = $(path,data).text();
  return v;
}


var loadNowPlaying = function () {
  $('body').json('http://nowplaying.radio.astral.com.s3.amazonaws.com/'+SiteID+"?t="+(new Date()).getTime(), renderNowPlaying);
}


var renderNowPlaying = function (jsonData) {
	
	try {
     if (window.ActiveXObject) {
       var data=new ActiveXObject("Microsoft.XMLDOM");
       data.async="false";
       data.loadXML(jsonData.data);
    }
    else {
      var parser=new DOMParser();
      var data=parser.parseFromString(jsonData.data,"text/xml");
    }
  }catch(e){}
	
    var artist = getNodeValue("/nowplaying/artist/name", data, 0);
    var song = getNodeValue("/nowplaying/track/name", data, 0);
    var now = (new Date()).getTime();
    if(song != currentTitle){
      currentTitle = song;
    //  currentDuration = getNodeValue("/nowplaying/duration", data,0);
      lastUpdate = now;
    }
    else {
      if(  (now - lastUpdate) > ERROR_WINDOW_SIZE ){
        song = def_artist;
        artist = def_track;
      }
    }    
    var albumImage = getNodeValue("/nowplaying/album/image", data,0);
    var showImage = getNodeValue('/nowplaying/onair/now/image', data,0);
    var artistLink = getNodeValue("/nowplaying/artist/link", data, 0);
    var albumLink = getNodeValue("/nowplaying/album/link", data, 0);
    var albumName = getNodeValue("/nowplaying/album/name", data, 0);
    var showName = getNodeValue("/nowplaying/onair/now/showname", data, 0);
    var showStart = getNodeValue("/nowplaying/onair/now/start", data, 0);
    var showEnd = getNodeValue("/nowplaying/onair/now/end", data, 0);
    var showLink = getNodeValue('/nowplaying/onair/now/link', data,0);
   
    // return d if v is not set
    function def( v, d ){
      if( v == null || v == undefined || v == '' ){
        return d;
      }
      else{
        return v;
      }
    }

    showName = def(showName, 'n/a' );
    showName = showName.substring(0,35);
 
    $("#track-data").empty();
    $("#artist-data").empty();
    $('#show-data').empty();
    $('#show-time').empty();
    $("#track-data").append( def(song, 'n/a' ) );
    $("#artist-data").append( def(artist, 'n/a' ) );
    $('#show-data').append( def(showName, 'n/a' ) );
    $('#show-time').append( showStart + '-' + showEnd );
    
    var img = '';
    var content = '';

    var imageEl = $("#nowplaying-cover-container/div.cover");

    $( imageEl ).empty();
    var img = '';
    var content = '';
    if (showImage) {
      img = '<img src="' + showImage + '" alt="' + showName  + '" title="' + showName + '" />';
      if (showLink && SiteID !=102) { //For Flow 93.5 we do not link to the Show.
        content = '<a href="' + showLink  + '" target="_blank" onclick="openElPage(this.href);return false;">' + img  + '</a>';
      }
      else {
        content = img;
      }
    //W.w.W - 6/4/2009 - No player image for flow
    //   $( imageEl ).append('<div class="radioshow-hosts">' + content  + '</div>');
    }
    else {
    //W.w.W - 6/4/2009 - No player image for flow 
     //     $( imageEl ).append('<div><img src="/themes/sri2/images/audio_05_95x95.jpg" alt="" /></div>');
    }

    if (albumImage) {
      albumName = new String(albumName);
      albumName = albumName.replace(/\[[a-zA-Z ]*\]/,'');
      img = '<img src="' + albumImage + '" alt="' + albumName  + '" title="' + albumName + '" />';
      delete(albumName);
      if (albumLink) {
        content = '<a href="' + albumLink  + '" target="_blank" onclick="openElPage(this.href);return false;">' + img  + '</a>';
      }
      else {
        content = img;
      }
      $( imageEl ).append('<div style="display:none;" class="albumart">' + content + '</div>');
    }

    if (showImage && albumImage) {
      $( imageEl ).innerfade({
        speed: 0.01,
        timeout: 6000,
        type: 'sequence',
        containerheight: '102px'
      });
    }
    
    delete parser;
    parser = null;

    delete data;
    data = null; 
 
    clearTimeout(nowPlayingTimer);
    nowPlayingTimer = null;
 
    nowPlayingTimer = setTimeout(loadNowPlaying, 15000);
 // });
}

$(document).ready(loadNowPlaying);
