/*

	Playlist
	Copyright 2007 Wimbomedia.com

*/


/* Function to get the index of an array */
Array.prototype.findIndex = function(value)
{
	var err = -1;
	for (var i=0; i<this.length; i++)
	{
		if (this[i] == value)
		{
			return i;
		}
	}
	return err;
}


/* Playlist array */
var playlist = new Array();


/* playlist object */
var _pl = {

	/* CURRENT PLAYLIST ITEM YOU ARE OPERATING */
	ops_item : "null",

	/* IS THE PLAYLIST PANEL OPEN OR CLOSED? */
	state : "open",

	/* PLAY MODE (NORMAL REPEAT RANDOM) */
	playmode : "all",

	/* CURRENT TRACK PLAYING */
	currentTrack : null,

	/* CURRENT PLAYLIST TITLE */
	current_title : "",

	/* CURRENT PLAYLIST ID */
	current_id : "",

	/* CAN WE DO TOGGLING */
	toggleable : true,

	/* PLAY TIMER */
	playFirstTrack_timer : null,

	/* TIMER */
	timer : null
}


_pl.init = function()
{
	return;
}


/* Add single track to playlist */
_pl.add = function(obj)
{
	var track_id = _pl.getTrackId(obj);

	if(playlist.findIndex(track_id) == -1)
	{
		playlist.push(track_id);

		document.getElementById("pl_panel").innerHTML	+= "<div id='pl_item_" + track_id + "' class='pl_item_container'>"
								+  	"<div class='pl_item_loading'><div class='pl_item_title' style='text-align:center; font-weight:bold; color:#0099ff;'>"
								+	"&nbsp;&nbsp;Loading track</div></div>"
								+  "</div>";


		var call = "fetch_track.php?track_id="+track_id;

		AjaxEngine._call(AjaxEngine._print, call, "pl_item_"+track_id, false, false);

		if(_pl.state == "open")
		{
			_pl.expand();
		}

		_pl.update(playlist.length);
	}
}


/* Add multiple tracks to playlist */
_pl.load = function(method, pl_title, pl_id, list)
{
	if(!list)
	{
		alert("This playlist is empty!");
		return;
	}

	pl_title = decodeURI(pl_title);

	var oldPlLength = playlist.length;

	var loaded = list.split("_");

	var call = "fetch_list.php?pl="+pl_id;

	switch(method)
	{
		case "playlist" :
			AjaxEngine._call(AjaxEngine._print, call, "pl_panel");

			playlist.splice(0, playlist.length);

			for(var i=0; i<loaded.length; i++)
			{
				playlist.push(loaded[i]);
			}

			_pl.update();
			_pl.updateTitleAndId(pl_title, pl_id);
		break;

		case "list" :
			call = "fetch_list.php?input_list="+list;

			AjaxEngine._call(AjaxEngine._print, call, "pl_panel");

			playlist.splice(0, playlist.length);

			for(var i=0; i<loaded.length; i++)
			{
				playlist.push(loaded[i]);
			}

			setTimeout("_pl.update(" + playlist.length + ")", 3000);
		break;
	}

	if(_pl.state == "open")
	{
		try
		{
			_pl.resetTimer();
			var cl = (oldPlLength*30)+25;
			var tl = (playlist.length*30)+25;

			if(tl < cl)
			{
				_pl.timer = setInterval("_pl.close_panel("+tl+")", 10);
			}
			else
			{
				_pl.timer = setInterval("_pl.open_panel("+tl+")", 10);
			}
		}
		catch(err) { }
	}

	var timerCall = "_pl.click('play'," + playlist[0] + ")";
	window.clearTimeout(_pl.playFirstTrack_timer);
	_pl.playFirstTrack_timer = setTimeout(timerCall, 2000);
}



/* Playlist operations */
_pl.click = function(action, obj, playAgain)
{
	var track_id = _pl.getTrackId(obj);

	switch(action)
	{
		case "play":
			try
			{
				if(_pl.playFirstTrack_timer) { window.clearTimeout(_pl.playFirstTrack_timer); }

				var pl_item = document.getElementById("pl_item_"+track_id);

				with(document.getElementById("pl_indtr").style)
				{
					top = pl_item.offsetTop + 2 + "px";
					left = "-4px";
					opacity = "1.0";
					filter = "alpha(opacity=100)";
				}

				if(playAgain == true)
				{
					_pl.currentTrack = track_id;
					WimboPlayer.play(track_id);
				}

				if(_pl.currentTrack != track_id)
				{
					_pl.currentTrack = track_id;
					WimboPlayer.play(track_id);
				}
			}
			catch(err)
			{
				/* try again */
				setTimeout("_pl.click('play'," + track_id + ")", 2000);
			}
		break;
		case "favor":
			var call = "favor.php?track="+track_id;
			AjaxEngine._call(AjaxEngine._print, call, AlertBox.name, true, false);
		break;
		case "info":
			explore(track_id, 'track');
		break;
		case "move":
			/* _pl.move(obj); */
		break;
		case "remove":
			_pl.remove(track_id);

			if(playlist.findIndex(_pl.currentTrack) == -1)
			{
				with(document.getElementById("pl_indtr").style)
				{
					top = "-50px";
					left = "-4px";
					opacity = "0";
					filter = "alpha(opacity=0)";
				}
			}
			else
			{
				var pl_item = document.getElementById("pl_item_"+_pl.currentTrack);

				with(document.getElementById("pl_indtr").style)
				{
					top = pl_item.offsetTop + 2 + "px";
					left = "-4px";
				}
			}
		break;
		case "clip":
			var holder = document.getElementById("pl_item_" + track_id);
			var item = sweepFor("pl_item_title", holder)[0];
			var track_title = item.innerHTML;
			Clippings.add("track", track_id, track_title);
		break;
	}
}


_pl.play = function(id)
{
	_pl.add(id, true);
	_pl.click("play", id);
}


_pl.remove = function(id)
{
	var item_index = playlist.findIndex(id);
	playlist.splice(item_index, 1);

	var pl_item = document.getElementById("pl_item_"+id);
	pl_item.parentNode.removeChild(pl_item);

	_pl.update(playlist.length);

	with(document.getElementById("ops").style)
	{
		top	= -50 + "px";
		left	= 0 + "px";
		display = "none";
		opacity = "0";
		filter	= "alpha(opacity=0)";
	}

	var pl = document.getElementById("playlist");
	var l =  (playlist.length*30)+25;

	if(_pl.state == "open")
	{
		pl.style.height = l + "px";
	}
}


_pl.mode = function(mode)
{
	switch(mode)
	{
		case "normal":
			_pl.playmode = "normal";

			document.getElementById("pl_panel_modes").innerHTML = ""
				+ "<b>Normal</b> | "
				+ "<a href=javascript:_pl.mode('all')>Repeat All</a> | "
				+ "<a href=javascript:_pl.mode('one')>Repeat One</a> | "
				+ "<a href=javascript:_pl.mode('random')>Random</a>"
				+ "";
		break;

		case "all":
			_pl.playmode = "all";

			document.getElementById("pl_panel_modes").innerHTML = ""
				+ "<a href=javascript:_pl.mode('normal')>Normal</a> | "
				+ "<b>Repeat All</b> | "
				+ "<a href=javascript:_pl.mode('one')>Repeat One</a> | "
				+ "<a href=javascript:_pl.mode('random')>Random</a>"
				+ "";
		break;

		case "one":
			_pl.playmode = "one";

			document.getElementById("pl_panel_modes").innerHTML = ""
				+ "<a href=javascript:_pl.mode('normal')>Normal</a> | "
				+ "<a href=javascript:_pl.mode('all')>Repeat All</a> | "
				+ "<b>Repeat One</b> | "
				+ "<a href=javascript:_pl.mode('random')>Random</a>"
				+ "";
		break;

		case "random":
			_pl.playmode = "random";

			document.getElementById("pl_panel_modes").innerHTML = ""
				+ "<a href=javascript:_pl.mode('normal')>Normal</a> | "
				+ "<a href=javascript:_pl.mode('all')>Repeat All</a> | "
				+ "<a href=javascript:_pl.mode('one')>Repeat One</a> | "
				+ "<b>Random</b>"
				+ "";
		break;
	}
}


_pl.empty = function()
{
	_pl.resetTimer();
	_pl.timer = setInterval("_pl.close_panel(25)", 10);

	playlist.splice(0, playlist.length);

	document.getElementById("pl_panel").innerHTML = "";
	document.getElementById("playlist_title").innerHTML = "Playlist&nbsp;[0]";

	_pl.current_title = "";
	_pl.current_id = "";

	_pl.update(playlist.length);

	with(document.getElementById("ops").style)
	{
		top	= -50 + "px";
		left	= 0 + "px";
		display = "none";
		opacity = "0";
		filter	= "alpha(opacity=0)";
	}

	with(document.getElementById("pl_indtr").style)
	{
		top	= "-50px";
		left	= "-4px";
		opacity = "0";
		filter	= "alpha(opacity=0)";
	}
}


_pl.changeTrack = function(current)
{
	var current_track = playlist.findIndex(current);

	switch(_pl.playmode)
	{
		case "normal":
			return;
		break;

		case "all":
			if(current_track+1 < playlist.length)
			{
				var next_track = current_track+1;
			}
			else
			{
				var next_track = 0;
			}
		break;

		case "one":
			var new_track = current_track;
		break;

		case "random":
			if(playlist.length == 1)
			{
				next_track = current_track;
			}
			else
			{
				var next_track = current_track;
				while(next_track == current_track)
				{
					next_track = Math.round(Math.random()*playlist.length);
				}
			}
		break;
	}

	_pl.click("play", playlist[next_track], true);
}


_pl.brokenLink = function(current)
{
	if(playlist.findIndex(current) == -1) { return; }
	var pl_item_container = document.getElementById("pl_item_" + current);

	var pl_item = sweepFor("pl_item", pl_item_container)[0];
	var pl_item_title = sweepFor("pl_item_title", pl_item_container)[0];

	/* Already broken*/
	if(!pl_item)
	{
		pl_item = sweepFor("pl_item-broken", pl_item_container)[0];
		pl_item_title = sweepFor("pl_item_title-broken", pl_item_container)[0];
	}

	/* Break */
	pl_item.className = "pl_item-broken";
	pl_item_title.className = "pl_item_title-broken";

	_pl.changeTrack(current);
}


/* Show item ops */
_pl.ops_over = function(src)
{
	if(isDragging) { return; }

	var obj = src.parentNode;
	var opDiv = document.getElementById("ops");

	with(opDiv.style)
	{
		top = obj.offsetTop + "px";
		left = obj.offsetLeft + "px";
		display = "block";
		opacity = "1.0";
		filter = "alpha(opacity=100)";
	}

	_pl.ops_item = src;
}


/* Hide item ops */
_pl.ops_out = function(src)
{
	if(isDragging) { return; }

	src.style.display = "block";
}


/* Get the id of a playlist item */
_pl.getTrackId = function(obj)
{
	if(parseInt(obj))
	{
		return obj;
	}

	var object = obj;

	while(!(object.className == "ex_item" || object.className == "pl_item-broken" || object.className == "pl_item"))
	{
		object = object.parentNode;
	}

	var track_id = sweepFor("track_id", object)[0].getAttribute("id");

	if(track_id.indexOf("pl_") > -1)
	{
		return track_id.substring(3, track_id.length);
	}
	else
	{
		return track_id;
	}
}


_pl.resetTimer = function()
{
	if(_pl.timer)
	{
		clearInterval(_pl.timer);
		_pl.timer = null;
	}
}


/* Expand playlist panel */
_pl.expand = function()
{
	var l = (playlist.length*30)+25;
	_pl.resetTimer();
	_pl.timer = setInterval("_pl.open_panel("+l+")", 10);
}


/* Toggle panel */
_pl.toggle = function(e)
{
	if(!_pl.toggleable)
	{
		return;
	}

	/* As a guy once said: IE is retarded and doesn't pass the event object */

	var src = e.target ? e.target : window.event.srcElement;

	if(_pl.state == "open")
	{
		_pl.resetTimer();
		_pl.timer = setInterval("_pl.close_panel(25)", 10);
		_pl.state = "close";
		src.className = "r_panel_btn_opened";

	}
	else
	{
		_pl.resetTimer();
		_pl.expand();
		_pl.state = "open";
		src.className = "r_panel_btn";
	}
}


/* Open panel */
_pl.open_panel = function(target)
{
	var obj = document.getElementById("playlist");
	var h = obj.style.height.replace("px", "");
	
	if(h < target)
	{
		h++;
		h+=((target-h)/10);
		obj.style.height = h + "px";
	}
	else
	{
		h = target;
		_pl.resetTimer();
	}
}


/* Close panel */
_pl.close_panel = function(target)
{
	var obj = document.getElementById("playlist");
	var h = obj.style.height.replace("px", "");

	if(h > target)
	{
		h*=0.8;
		obj.style.height = h + "px";
	}
	else
	{
		h = target;
		_pl.resetTimer();
		_pl.timer = setInterval("_pl.open_panel("+h+")", 10);
	}
}











/*
	FUNCTION TO UPDATE THE TITLE OF THE PLAYLIST PANEL
	AND THE SESSION PLAYLIST
*/

_pl.update = function(text)
{
	if(text && _pl.current_id == "")
	{
		var title = document.getElementById("playlist_title")
		title.innerHTML = "Playlist&nbsp;[" + text + "]";

		_pl.current_title = title.innerHTML;
	}

	var call = "session_playlist.php?list="+playlist;
	AjaxEngine._call(AjaxEngine._print, call, "blackhole");
}

_pl.updateTitleAndId = function(text, id)
{
	if(!text) { return; }

	var title = document.getElementById("playlist_title");

	title.innerHTML = "<a href=javascript:explore('" + id + "','playlist') title='" + text + "' style='padding:2px; color:#333333'; onmouseover=this.style.background='#111111';this.style.color='#ffaa00;' onmouseout=this.style.background='';this.style.color='#333333;'>" + text + "</a>";
	_pl.current_title = title.innerHTML;
	_pl.current_id = id;
}


_pl.cannot_save = function()
{
	_pl.open_save((6*30)+25);

	/* ---------- START FOG BOX ---------- */

	var fog_name = "pl_save_box";
	var fog_content	= ""
			+ "<b style='color:#ffaa00;'>Can't save an empty playlist.</b><br /><br />"
			+ "<div style='border-top:1px #0099ff dotted; padding-top:10px;'>"
			+	"<center>"
			+	"<input type='button' value='OK' class='submit_btn' onmouseover='mouseFx.over(event)' onmouseout='mouseFx.out(event)'  onClick=fogBox.destroy('" + fog_name + "','_pl.close_save()') />"
			+	"</center>"
			+ "</div>"
			+ "</form>"
			+ "";
	var fog_box = fogBox.create(fog_name, fog_content, 244, 50, 230);
	document.getElementById("pl_panel").parentNode.parentNode.innerHTML += fog_box;

	/* ---------- END FOG BOX ---------- */
}


_pl.save_as = function()
{
	if(playlist.length == 0) { _pl.cannot_save(); return; }

	/* Get datestamp */

	var months = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
	var currentTime = new Date();
	var month = months[currentTime.getMonth()];
	var day = currentTime.getDate();
	var year = currentTime.getFullYear()
	var hours = currentTime.getHours();
	var mins = currentTime.getMinutes();
	var ampm = (hours >= 12) ? "pm" : "am";
	hours = (hours > 12) ? hours-12 : hours;
	hours = (hours < 10) ? "0" + hours : hours;
	mins = (mins >= 10) ? mins : "0" + mins;

	var dateStamp = month + " " + day + " " + year + " " + hours + ":" + mins + " " + ampm;

	/* --------------------------------------------------- */

	var filter = /^playlist\&nbsp;\[[0-9]*\]$/i;
	var isDefaultTitle = filter.test(_pl.current_title);

	if(isDefaultTitle)
	{
		var save_title = _pl.current_title + " - " + dateStamp;
	}
	else
	{ 
		var save_title = _pl.current_title.replace(/<.*?>/g, '');;
	}

	/* ---------- START FOG BOX ---------- */

	var fog_name = "pl_save_box";
	var fog_content	= ""
			+ "<form name='save_as_form' action='../scripts/submit_save_as.php' method='post' target='save_frame'>"
			+ "<b style='color:#ffaa00;'>Save playlist as...</b><br />"
			+ "<input type='text' size='35' maxlength='60' name='field_save_as_title' onFocus='this.select()' value='" + save_title + "' style='font:bold 11px Arial; color:#0099ff;' />"
			+ "<br /><br />"
			+ "<div style='border-top:1px #0099ff dotted; padding-top:10px;'>"
			+ "<center>"
			+	"<input type='submit' value='Save' class='submit_btn' onmouseover='mouseFx.over(event)' onmouseout='mouseFx.out(event)' />"
			+	"&nbsp;&nbsp;"
			+	"<input type='submit' value='Cancel' class='submit_btn' onmouseover='mouseFx.over(event)' onmouseout='mouseFx.out(event)'  onClick=fogBox.destroy('" + fog_name + "','_pl.close_save()') />"
			+ "</center>"
			+ "</div>"
			+ "</form>"
			+ "";
	var fog_box = fogBox.create(fog_name, fog_content, 244, 50, 230);
	document.getElementById("pl_panel").parentNode.parentNode.innerHTML += fog_box;

	/* ---------- END FOG BOX ---------- */

	/* Auto-select input field */
	document.save_as_form[1].field_save_as_title.select();

	_pl.open_save((6*30)+25);
}


_pl.save = function()
{
	if(playlist.length == 0) { _pl.cannot_save(); return; }

	if(!_pl.toggleable) { return; }

	if(_pl.current_id == "")
	{
		_pl.save_as();
		return;
	}

	/* ---------- START FOG BOX ---------- */

	var fog_name = "pl_save_box";
	var fog_content	= ""
			+ "<form name='save_form' action='../scripts/submit_save.php' method='post' target='save_frame'>"
			+ 	"<b style='color:#ffaa00;'>Saving playlist..."
			+ 	"<input type='hidden' size='1' maxlength='4' name='field_save_id' value='" + _pl.current_id + "' />"
			+ "</form>"
			+ "";
	var fog_box = fogBox.create(fog_name, fog_content, 244, 5, 230);
	document.getElementById("pl_panel").parentNode.parentNode.innerHTML += fog_box;

	/* ---------- END FOG BOX ---------- */

	document.save_form[1].submit();
}


_pl.open_save = function(h)
{
	/* Open the playlist panel */

	var l_current = (playlist.length*30)+25;
	var l_target = h

	_pl.resetTimer();
	if(l_current > l_target && _pl.state == "open")
	{
		_pl.timer = setInterval("_pl.close_panel("+l_target+")", 10);
	}
	else
	{
		_pl.timer = setInterval("_pl.open_panel("+l_target+")", 10);
	}

	_pl.toggleable = false;
}


_pl.close_save = function()
{
	_pl.resetTimer();
	if(_pl.state == "open")
	{
		var l =  (playlist.length*30)+25;
		if(l < (6*30)+25)
		{
			_pl.timer = setInterval("_pl.close_panel("+l+")", 10);
		}
		else
		{
			_pl.timer = setInterval("_pl.open_panel("+l+")", 10);
		}
	}
	else
	{
		var l = 25;
		_pl.timer = setInterval("_pl.close_panel("+l+")", 10);
	}

	_pl.toggleable = true;
}


/* ---------- Dragging functions ---------- */

var ie  = document.all;
var nn6 = document.getElementById && !document.all;


var isDragging = false;
var dragX, dragY, tx, ty;
var dragObj = null;
var dragItem = null;
var dragTrack;


function movemouse(e)
{
	if (isDragging)
	{
		var left = nn6 ? tx + e.clientX - dragX : tx + event.clientX - dragX;
		var top  = nn6 ? ty + e.clientY - dragY : ty + event.clientY - dragY;
		dragObj.style.top = top + "px";
		isDragging = true;

		dragItem.style.top = top + "px";

		return false;
	}
}


function selectmouse(e) 
{
	var fObj       = nn6 ? e.target : event.srcElement;
	var topElement = nn6 ? "HTML"	: "BODY";

	try
	{
		while (fObj.tagName != topElement && fObj.className != "pl_item_btn")
		{
			fObj = nn6 ? fObj.parentNode : fObj.parentElement;
		}
	}
	catch(e)
	{
		return;
	}

	if (fObj.getAttribute('id') == "pl_item_move_btn")
	{
		isDragging = true;
		dragObj = fObj;
		tx = parseInt(dragObj.style.left+0);
		ty = parseInt(dragObj.style.top+0);
		dragX = nn6 ? e.clientX : event.clientX;
		dragY = nn6 ? e.clientY : event.clientY;
		document.onmousemove = movemouse;

		dragTrack = _pl.getTrackId(_pl.ops_item);
		dragItem = document.getElementById("pl_item_" + dragTrack);

		with(dragItem.style)
		{
			opacity = "0.5";
			filter = "alpha(opacity=50)";
			zIndex = "2";
		}

		opDiv = document.getElementById("ops");
		opDiv.style.display = "none";

		return false;
	}
}


function releasemouse(e)
{
	isDragging = false;

	if(dragObj != null)
	{
		dragObj.style.top = "0px";

		with(dragItem.style)
		{
			opacity = "1.0";
			filter = "alpha(opacity=100)"
			zIndex = "1";
		}

		var dragPos = Math.round(dragItem.offsetTop/30);

		if(dragPos < 0)
		{
			dragPos = 0;
		}

		if(dragPos >= playlist.length)
		{
			dragPos = playlist.length-1;
		}

		var overItem = document.getElementById("pl_item_" + playlist[dragPos]);

		playlist.splice(playlist.findIndex(dragTrack), 1);
		playlist.splice(dragPos, 0, dragTrack);

		var newNode = dragItem;
		var p = overItem.parentNode;

		try
		{
			p.removeChild(dragItem);
			p.insertBefore(newNode, overItem);

			newNode.style.top = "0px";
		}
		catch(e)
		{
			playlist.splice(playlist.findIndex(dragTrack), 1);
			playlist.splice(playlist.length-1, 0, dragTrack);

			p.appendChild(newNode);
			newNode.style.top = "0px";
		}

		_pl.update(playlist.length);
	}

	dragObj = null;

	try
	{
		var pl_item = document.getElementById("pl_item_" + _pl.currentTrack);

		with(document.getElementById("pl_indtr").style)
		{
			top = pl_item.offsetTop + 2 + "px";
			left = "-4px";
			opacity = "1.0";
			filter = "alpha(opacity=100)";
		}
	}
	catch(e)
	{
		return;
	}
}


document.onmousedown = selectmouse;
document.onmouseup = releasemouse;