var formFields = "#query,#searchbutton,#username,#auto,#custom";
var searched = false, firstDrop = true, resultSet, resultStart;
var hasCookie = false, autoMode = true, maxJam = 15, lengthVal = 18, transitionVal = 6;
	  
// what happens on page load
$(document).ready(function() {
	initLoginStatus();
	
	tb_init("a#fmBox", function() {
		$("#lastfm").keypress(function (e) { if (e.which == 13) { lastfm(); } }).focus();
		$("#TB_ajaxContent input[type=button]").click(lastfm);
	});
	
	tb_init("a#settingsBox", function() {
		$("#transitionLabel").text("Transition length: " + transitionVal + "s");
		$("#transitionSlider").slider({
			handle: ".ui-slider-handle",
			minValue: 2,
			maxValue: 10,
			slide: function(e, ui) {
				transitionVal = ui.value;
				if (!restrictTransitionSlider()) {
					transitionVal = Math.floor(ui.value);
					$("#transitionLabel").text("Transition length: " + transitionVal + "s");
				}
			},
			startValue: transitionVal
		});
		
		$("#lengthLabel").text("Track length: " + lengthVal + "s");
	    $("#lengthSlider").slider({
			minValue: 10,
			maxValue: 20,
			slide: function(e, ui) {
				lengthVal = Math.floor(ui.value);
				$("#lengthLabel").text("Track length: " + lengthVal + "s");
			},
			startValue: lengthVal,
			stop: function(e, ui) {
				restrictTransitionSlider();
				updateRestrictBack();
			}
		});
		
		updateRestrictBack();
	});
	
	$("#update a").click(function() {
		$("#update").slideUp(250);
		return false;
	});
	
	$("#query").keypress(function (e) {
		setSearch();
		if (e.which == 13) { search(); }
	}).focus(function() {
		if ($(this).val() == "artist names or song titles") { $(this).val(""); }
	});
	$("#searchbutton").click(search);
	$("#auto").click(function() { capsule(true); });
	$("#custom").click(function() { capsule(false); });
	
	// re-enable elements in case of page refresh
	$(formFields).attr("disabled", "");
	
	// lock #username
	if ($.cookie("name") != null) {
		$("#username").val($.cookie("name")).attr("disabled", "true");
		hasCookie = true;
	}
	
	$("a#action-login").unbind("click").click(function() {
		tb_login(function() { $("#username").val($.cookie("name")).attr("disabled", "true"); }, "What's your username and password?");
		hasCookie = true;
		return false;
	});
	
	$("a#action-logout").click(function() {
		$("#username").val("").attr("disabled", "");
		hasCookie = false;
	});
	
	$("#droparea").droppable({
		accept: ".track",
		activeClass: "active",
		drop: dropTrack
	});
	
	// if starting from existing jam
	if ($("#droparea img").size() > 0) { refreshSortable(); }
	
	$("#droparea img,#history img").tooltip();
	
	// this gets the random 3 images in the search box
	$.getJSON("proxy/amzn/fetch.php?k=" + escape(String.fromCharCode(Math.random() * 26 + 65)), getAmazon);
});

function restrictTransitionSlider() {
	if (transitionVal > lengthVal / 2) {
		transitionVal = Math.floor(lengthVal / 2);
		$("#transitionSlider").slider("moveTo", transitionVal, 0);
		$("#transitionLabel").text("Transition length: " + transitionVal + "s");
		return true;
	} else {
		return false;
	}
}

function updateRestrictBack() {
	$("#transitionSlider").slider("moveTo", Math.floor(lengthVal / 2), 1);
	
	var offset = $("#transitionSlider div.ui-slider-handle:last").css("left");
	$("#transitionRestrict").css({
		backgroundPosition: "-" + offset + " center",
		left: offset
	});
}

// render the detail view of a single jam
function renderThisJam(data) {
    var items = data.response.docs;
	if (items != null) {
		if (!items.length) { items = [items]; }
		if (items.length > 0) {
		    var $thisjam = $("#jamdetail");
		    for (var j = 0; j < items[0].imageURLs.length; j++) {
                // build amazon link out of asin
				url = "http://www.amazon.com/dp/"+items[0].foreignIDs[j]+"/?tag=thisismyjam-20";
				$thisjam.append('<a href="' + url + '" target="_blank"></a>');
			    var $oldjam = $("#jamdetail a:last");
			    var artist = items[0].artists[j];
			    var title = items[0].titles[j];
			    $oldjam.append("<img class=\"track\" src=\"" + items[0].imageURLs[j] + "\" title=\"" + title + "|" + artist + "\">");
			    if (j == 5 || j == 11) { $oldjam.after("<br/>"); }
			}
        }
		$("#jamdetail img").tooltip();
    }
}

function isUsableTrack(i) {
	return	i.ItemAttributes && i.ItemAttributes.ProductGroup && i.ItemAttributes.ProductGroup == "Digital Music Track" &&
			i.ItemAttributes.Creator && i.ItemAttributes.Title && i.ASIN && i.MediumImage && i.MediumImage.URL;
}

function errorNone() {
	$("#results").html("<p><em>No songs found.</em></p>");
}

// this has been known to crash safari leopard
function getLastFM(data) {
	var items = data.toptracks.track;
	var lastFMList = [];
	
	if (items != null) {
		$("#droparea").html("");
		if (!items.length) { items = [items]; }
		for (var i = 0; i < items.length && i < 35; i++) {
		    lastFMList.push(items[i].artist + " " + items[i].name); 
        }
		(function(data) {
			if (data == null) {
				$.getJSON("proxy/amzn/fetch.php?urchin=0&k=" + escape(lastFMList[0]), arguments.callee);
			} else {
				var items = data.ItemSearchResponse.Items.Item;
				if (items != null) {
					for (var i = 0; i < items.length; i++) {
						if (isUsableTrack(items[i])) {
							$("#droparea").append("<img class='track' id='" + items[i].ASIN + "' width='150' height='150' src='" + items[i].MediumImage.URL + "'/>");
							$("#droparea img:last").attr("title", items[i].ItemAttributes.Creator + " - " + items[i].ItemAttributes.Title).tooltip();
							refreshSortable();
							break;
						}
					}
				}
				if (data.urchin == lastFMList.length - 1 || $("#droparea .track").size() == maxJam) {
					tb_remove();
				} else {
					data.urchin++;
					$.getJSON("proxy/amzn/fetch.php?urchin=" + data.urchin + "&k=" + escape(lastFMList[data.urchin]), arguments.callee);
				}
			}
		})(null);
	} else {
		errorNone();
	}
}

function clearResults() {
   $("#results").html("").addClass("load");
}

function getAmazon(data) {
	$("#results").removeClass("load");
	
	resultSet = data.ItemSearchResponse.Items.Item;
	if (resultSet != null) {		
		if (!resultSet.length) { resultSet = [resultSet]; }
		renderResults(0);
	} else {
		errorNone();	
	}
}

// parse the amazon json to show the pic results
function renderResults(start) {
	var limit = 3;
	resultStart = start;
	$("#results").html("");
	for (var rendered = 0; resultStart < resultSet.length && rendered < limit; resultStart++) {
		if (isUsableTrack(resultSet[resultStart])) {
			$("#results").append("<img class='track' id='" + resultSet[resultStart].ASIN + "' src='" + resultSet[resultStart].MediumImage.URL + "'/>");
			$("#results img:last").attr("title", resultSet[resultStart].ItemAttributes.Title + "|" + resultSet[resultStart].ItemAttributes.Creator);
			rendered++;
		}
	}
	$("#results img").draggable({
		cursor: "arrow",
		helper: "clone",
		opacity: 0.65,
		zIndex: 999
	}).tooltip();
	
	if (searched && hasMoreResults()) {
		setMore();
	} else if (searched && start != 0) {
		setMore();
		resultStart = 0;
	} else {
		setSearch();
	}
}

function setSearch() { $("#searchbutton").removeClass("alt").val("Search"); }
function setMore() { $("#searchbutton").addClass("alt").val("More"); }

function hasMoreResults() {
	if (resultStart < resultSet.length) {
		for (var i = resultStart; i < resultSet.length; i++) {
			if (isUsableTrack(resultSet[i])) {
				return true;
			}
		}
	}
	
	return false;
}

function tb_register(msg, email) {
	tb_show(null, "register.html", false, function() {
		if (msg)   { $("#TB_ajaxContent p").text(msg); }
		if (email) { $("#email").val(email); }
		
		$("#login").val($("#username").val());
		$("#email,#password").keypress(function (e) { if (e.which == 13) { register(); } });
		$("#email").focus();
		$("#TB_ajaxContent input[type=button]").click(function() { register(); });
	});
}

// call the capsule CGI
function capsule(auto) {
	autoMode = auto;
	
	var name = $("#username").val().toLowerCase();
	var $clicked = $(autoMode ? "#auto" : "#custom");
	var origVal = $clicked.val();
	
	if ($("#droparea .track").size() < 3) {
		$clicked.val("Need at least 3!");
		$.timer(4000, function(timer) {
			$clicked.val(origVal);
			timer.stop();
		});
	} else {
		if (name.length == 0) {
			$clicked.val("Need your name!");
			$("#username").focus();
			$.timer(4000, function(timer) {
				$clicked.val(origVal);
				timer.stop();
			});
		} else {
			// If cookie exists, make request
			if ($.cookie("name") != null) {
				capsuleIt();
			} else {
				// See if password exists
				$.getJSON("isuser.php", {name: escape(name)}, function(data) {
					if (data.status == false) {
						// new user!
						tb_register();
					} else {
						// show the need-your-password box
						tb_login(capsuleIt, "Someone is already making jams with this name. If it's you, tell me your password. Otherwise, please pick a new name.", name, true);
					}
				});
			}
		}
	}
}

function register() {
	var em = $("#email").val(), pw = $("#password").val();
	$("#TB_ajaxContent td").text("").addClass("load");
	
	$.post(
		"adduser.php",
		{name: escape($("#username").val()), email: escape(em), pass: escape(pw)},
		function(data) {
			if (data.status == true) {
				tb_remove();
				
				$.cookie("name", data.name);
				$.cookie("hash", data.hash);
				initLoginStatus();
				
				capsuleIt();
			} else {
				// something failed server-side, redo prompt
				tb_register(data.msg, em);
			}
		},
		"json"
	);
}


function capsuleIt() {
	$(autoMode ? "#custom" : "#auto").slideUp();
	$(autoMode ? "#auto" : "#custom").val("Wait a minute...");
	disableUI();
	
	var trackString = "";
	$("#droparea .track").each(function() { trackString += this.id + ";"; });
	
	var params = {name: escape($.cookie("name")), hash: escape($.cookie("hash")), track: lengthVal, transition: transitionVal, tracks: trackString, auto: autoMode ? "yes" : "no"};
	if ($("#editstamp").size() != 0) { params.timestamp = $("#editstamp").val(); }
	
	$.post("capsule.php", params, capsuleDone, "json");
}

var iveWaited = 0;
var tooLong = 120;
var checkInterval = 5;
var key = "";
function capsuleDone(data) {
	if (data.status == true) {
		// Start checking jam readiness
		$(autoMode ? "#auto" : "#custom").val("Wait a minute...");
		$.timer(checkInterval * 1000, function(timer) {
			timer.stop();
			iveWaited = 0;
			$.post("checkjam", {name: escape(data.name), tstamp: data.timestamp}, jamCheckDone);
		});
	} else {
		$(autoMode ? "#auto" : "#custom").val("A problem. Try again.");
		enableUI();
	}
}

function jamCheckDone(data, textStatus) {
	// Parse data
	var matches = (new RegExp("(.*?) ### (.*?) ### (.*)")).exec(data);
	var username = trim(matches[1]), tstamp = trim(matches[2]), ready = trim(matches[3]);
	
	if(ready == "yes") {
		// Latest Jam is done.
		window.location.href = "http://" + username + ".thisismyjam.com/?"+tstamp;
	} else {
		// not ready yet. set off the timer again or see if it has been too long.
		if(iveWaited > tooLong) {
			$(autoMode ? "#auto" : "#custom").val("A problem. Try again.");
			enableUI();
		} else {
			$(autoMode ? "#auto" : "#custom").val("Wait a minute...");
			$.timer(checkInterval * 1000, function(timer) {
				iveWaited = iveWaited + checkInterval;
				timer.stop();
				$.post("checkjam", {name: escape(username), tstamp: tstamp}, jamCheckDone);
			});     
		}
	}
}

function dropareaOver(e) {
	var t = $("#droparea"), o = t.offset();
	return (e.pageX > o.left && e.pageX < o.left + t.width() && e.pageY > o.top && e.pageY < o.top + t.height());
}

function refreshSortable() {
	if (firstDrop) {
		$("#droparea").sortable({
			cursor: "arrow",
			items: "img",
			sort: function(e, ui) {
				if (!dropareaOver(e)) {
					$("#jam,#droparea").addClass("trash");
				} else {
					$("#jam,#droparea").removeClass("trash");
				}
			},
			stop: function(e, ui) {
				if (!dropareaOver(e)) {
					$(ui.helper.prevObject).remove();
					$("#jam,#droparea").removeClass("trash");
				}
			},
			zIndex: 9999
		});
		firstDrop = false;
	} else {
		$("#droparea").sortable("refresh");
	}
}

function dropTrack(e, ui) {
	if ($("#droparea .track").size() < maxJam) {
		var $metadata = $(ui.draggable).next();
		$(ui.draggable).clone().appendTo(this).attr("title", $(ui.draggable).getTooltip()).tooltip();
		
		refreshSortable();
	} else {
		var $da = $("#droparea"), bg = $da.css("background-color");
		$da.animate( { backgroundColor:"red"}, 200, "swing" ).animate( { backgroundColor:bg}, 200, "swing" );
	}
}

function lastfm() {
	searched = true;
	
	var username = $("#lastfm").val();
	if (username) {
		$("#TB_ajaxContent td").text("").addClass("load");
		$("#username").val(username.substring(0, 10));
		$.getJSON("proxy/lastfm/fetch.php?u="+escape(username), getLastFM);
	}
}

function search() {
	if ($("#searchbutton").hasClass("alt")) {
		$("#results").fadeOut("fast", function() {
			renderResults(resultStart);
			$("#results").fadeIn();
		});
	} else {
		searched = true;
		
		var searchTerm = $("#query").val();
		if (searchTerm.length > 0) {
			clearResults();
			$.getJSON("proxy/amzn/fetch.php?k=" + escape(searchTerm), getAmazon);
		}
	}
}

function disableUI() {
	$(formFields).attr("disabled", "true");
	$("#results img").draggable("disable");
	if (!firstDrop) { $("#droparea").sortable("disable"); }
}

function enableUI() {
	$(formFields).attr("disabled", "");
	$("#results img").draggable("enable");
	if (!firstDrop) { $("#droparea").sortable("enable"); }
	
	if (hasCookie) { $("#username").attr("disabled", "true"); }
}

function trim(stringToTrim)		{ return stringToTrim.replace(/^\s+|\s+$/g,""); }
function ltrim(stringToTrim)	{ return stringToTrim.replace(/^\s+/,""); }
function rtrim(stringToTrim)	{ return stringToTrim.replace(/\s+$/,""); }

function findSingleString(re,st) {
	var matches = (new RegExp(re)).exec(st);
	return matches == null ? null : matches[1];
}