$j = jQuery.noConflict();

var listener = 0;
var playlistLoaded = false;

playerReadyPlaylist = function(obj) {
  if(!playlistLoaded){
  	listener = setInterval(function(){checkPlaylistLoaded(obj)}, 100);
  }
}

function itemHandler(obj) {
	var item = obj['index'];
	var playlist = $j("#"+obj['id']).prev();
	var currentItem = 0;
	playlist.children().each(function(){
		if (currentItem == item) {
			$j(this).addClass("playing");
		} else {
			$j(this).removeClass("playing");
		}
		currentItem++;
	});
}

function checkPlaylistLoaded(obj) {
	var player = document.getElementById(obj['id']);
	var jsPlaylist = player.getPlaylist();
	if (jsPlaylist.length > 1) {
	  clearInterval(listener);
	  playlistLoaded = true;
	  
		var playlist = createPlaylist(obj);
		populatePlaylist(player, jsPlaylist, playlist);
		player.addControllerListener("PLAYLIST","playlistHandler");
		player.addControllerListener("ITEM","itemHandler");
	}
}

function createPlaylist(obj){
	var playerDiv = $j("#"+obj['id']);

	playerDiv.before("<div class='jw_playlist_playlist'></div>");
	playlistDiv = playerDiv.prev();
	
	cover_art = playerDiv.parent().siblings('.cover_art').html();
 	playerDiv.before('<div class="album_cover_art"><img src="'+cover_art+'"></div> ');    
	return playlistDiv;
}

function playlistHandler(obj){
	var player = document.getElementById(obj['id']);
	var jsPlaylist = player.getPlaylist();
	var playerDiv = $j("#"+obj['id']);
	var playlist = playerDiv.prev();
	populatePlaylist(player, jsPlaylist, playlist);
}

function populatePlaylist(player, jsPlaylist, playlist){
	playlist.empty();
	for (var i=0;i<jsPlaylist.length;i++) {
		var jsItem = jsPlaylist[i];
		var alternate = "even";
		if (i % 2) {
			alternate = "odd";
		}
		playlist.append("<div class='jw_playlist_item "+alternate+"'>"+dump(jsItem)+"</div>");
	}
	var playlistItem = 0;
	playlist.children().each(function(){
		var currentItem = playlistItem;
		$j(this).click(function () {
			player.sendEvent("ITEM", currentItem);
		});
		playlistItem++;
	});
}

function dump(arr) {
	var output = "<div class='jw_playlist_image_div'><img src='${image}' class='jw_playlist_image' /></div><div class='jw_playlist_title'>${title}</div><div class='jw_playlist_description'>${description}</div><div class='clear'></div>";
	var variables = getVars(output);
	for (var j=0; j<variables.length; j++) {
		var variable = variables[j];
		var varName = variable.replace('${','').replace('}','');
		var value = arr[varName];
		if (!value) {
			value = '';
		}
		output = output.replace(variable, value);
	}
	output = output.replace("<div class='jw_playlist_image_div'><img src='' class='jw_playlist_image' /></div>","");
	return output;
}

function dumpText(arr) {
	var dumped_text = "";
	if(typeof(arr) == 'object') {
		for(var item in arr) {
			var value = arr[item];		
			if(typeof(value) == 'object') {
				dumped_text += "<div class='"+item+"'>";
				dumped_text += dump(value);
				dumped_text += "</div>";
			} else {
				dumped_text += "<div class='"+item+"'>"+ value + "</div>";
			}
		}
	} else {
		dumped_text += arr+" ("+typeof(arr)+")";
	}
	return dumped_text;
}

function getVars(str){
	return str.match(/\$\{(.*?)\}/g);
}


function inspect(obj, maxLevels, level)
{
  var str = '', type, msg;

    // Start Input Validations
    // Don't touch, we start iterating at level zero
    if(level == null)  level = 0;

    // At least you want to show the first level
    if(maxLevels == null) maxLevels = 1;
    if(maxLevels < 1)     
        return '<font color="red">Error: Levels number must be > 0</font>';

    // We start with a non null object
    if(obj == null)
    return '<font color="red">Error: Object <b>NULL</b></font>';
    // End Input Validations

    // Each Iteration must be indented
    str += '<ul>';

    // Start iterations for all objects in obj
    for(property in obj)
    {
      try
      {
          // Show "property" and "type property"
          type =  typeof(obj[property]);
          str += '<li>(' + type + ') ' + property + 
                 ( (obj[property]==null)?(': <b>null</b>'):('')) + '</li>';

          // We keep iterating if this property is an Object, non null
          // and we are inside the required number of levels
          if((type == 'object') && (obj[property] != null) && (level+1 < maxLevels))
          str += inspect(obj[property], maxLevels, level+1);
      }
      catch(err)
      {
        // Is there some properties in obj we can't access? Print it red.
        if(typeof(err) == 'string') msg = err;
        else if(err.message)        msg = err.message;
        else if(err.description)    msg = err.description;
        else                        msg = 'Unknown';

        str += '<li><font color="red">(Error) ' + property + ': ' + msg +'</font></li>';
      }
    }

      // Close indent
      str += '</ul>';

    return str;
}