// Scroller globals
var scrollDuration = 6000;
var scrollSpeed = 1000;
var scrollEase = "easeOutBounce";

$.fn.wait = function(time, type) {
	time = time || 1000;
	type = type || "fx";
	return this.queue(type, function() {
		var self = this;
		setTimeout(function() {
			$(self).dequeue();
		}, time);
	});
};

$.fn.insertAtCaret = function(myValue)
{
	if (document.selection)
	{
		this.focus();
		sel = document.selection.createRange();
		sel.text = myValue;
		this.focus();

		alert("Selection in document");
	}
	else if (this.selectionStart || this.selectionStart == '0')
	{
		var startPos = this.selectionStart;
		var endPos = this.selectionEnd;
		var scrollTop = this.scrollTop;
		this.text = this.text.substring(0, startPos)+myValue+this.text.substring(endPos,this.text.length);
		this.focus();
		this.selectionStart = startPos + myValue.length;
		this.selectionEnd = startPos + myValue.length;
		this.scrollTop = scrollTop;
		alert("Selection in text area");
	}
	else
	{
		this.text += myValue;
		this.focus();

		alert("In text area no text");
	}
}

$.fn.enableCheckboxRangeSelection = function() {

	var lastCheck = null;
	var self = this;

	self.unbind("click.checkboxrange");

	self.bind("click.checkboxrange", function(e)
	{
		if (lastCheck != null && (e.shiftKey || e.metaKey))
		{
			self.slice(
				Math.min(self.index(lastCheck), self.index(e.target)),
				Math.max(self.index(lastCheck), self.index(e.target)) + 1).attr({checked: e.target.checked ? "checked" : ""});
		}

		lastCheck = e.target;
	});
};

function showMessage(msg, where, good)
{
	var name = "pup" + String(Math.floor(Math.random()*1000));
	var idname = String("#" + name);

	if (good==null)
		good = true;

	if (good)
		$(where).append("<div class='message-good' id='"+ name +"'>"+ String(msg) +"</div>");
	else
		$(where).append("<div class='message-bad' id='"+ name +"'>"+ String(msg) +"</div>");

	var ob = $(idname);

	ob.css("right", "100%")

	ob.animate({right: "50%"}, 500, "swing")
		.wait()
		.animate({left: "100%"}, 500, "swing", function(){ob.remove()});
}

function GetFormPostString(form_name)
{
	var post_data = "";
	var form = document.forms[form_name];
	var elements = form.elements;

	for(var i=0; i<form.length; i++)
	{
		if (i) post_data += "&";

		post_data += elements[i].name + "="

		fieldType = elements[i].type.toLowerCase();

		switch(fieldType)
		{
		case "radio":
		case "checkbox":
			post_data += elements[i].checked?"true":"false";
			break;

		default:
			post_data += elements[i].value;
			break;
		}
	}

	return post_data;
}

function submitIncoming(form, res)
{
	$.ajax({
		type:"POST",
		url:"dooblab_ajax.php",
		data:GetFormPostString(form),
		success:function(msg){
			var data = $.json.decode(msg);
			showMessage(data.results, "body", data.good);
			$(res).html(data.message);
		}
	});

	return false;
}

function submitReorder(form, res)
{
	$.ajax({
		type:"POST",
		url:"dooblab_ajax.php",
		data:GetFormPostString(form),
		success:function(msg){
			var data = $.json.decode(msg);
/*			showMessage(data.results, "body", data.good);
			$(res).html(data.message);*/

			alert(data.message);
		}
	});

	return false;
}

function deleteGame(id)
{
	$.ajax({
		type:"POST",
		url:"dooblab_ajax.php",
		data:"delete="+id,
		success:function(msg){
			var data = $.json.decode(msg);
			showMessage(data.results, "body", data.good);
			$("#game-table").html(data.message);
		}
	});

	return false;
}

function guess(argOriginal, argInput, argSelect)
{
	var original = $(argOriginal);
	var input = $(argInput);
	var select = $(argSelect);

	if (!input || !select || !original)
		return;

	var arr = original.val().split("-");
	var text = arr[0].toLowerCase();
	var children = select.children();

	children.each(function(i, el){
		var e = $(el);

		if (e.val() == text) {
			e.attr("selected", "1");
		} else
			e.attr("selected", "");
	});

	arr.shift();

	input.val(arr.join("-").trim());
}

function guessAll()
{
	$(".solution-item").each(function(e){
		var original = $("input[type='hidden'].original-name", this).attr("id");
		var input = $("input[type='text']", this).attr("id");
		var select = $("select", this).attr("id");

		guess("#"+original, "#"+input, "#"+select);
	});
}

function showSolutions(game, element)
{
	var e = $(element);

	if (e.html().length==0)
	{
		e.append("loading solutions <img style='vertical-align: middle;' src='images/throbber.gif' />");

		$.ajax({
			type:"POST",
			url:"dooblab_ajax.php",
			data:"show_solutions="+game,
			success:function(msg){
				$(element).html(msg).hide();
				$(element).slideDown(1000);

				$("#sortable").sortable();
				$("#sortable").disableSelection();
			}
		});

		return false;
	}

	if (e.is(":hidden"))
		e.slideDown(1000);
	else
		e.slideUp(1000);

	return false;
}

function forceLowerCase(element)
{
	var elementType = element.type.toLowerCase();

	switch (elementType)
	{
		case "text":
			$(element).val($(element).val().toLowerCase());
			break;
		default:
			$(element).text($(element).text().toLowerCase());
			break;
	}
}

function checkPermalinkValidity(element, id, instance)
{
	var self = $(element);
	var parent = self.parent();

	if ($(".permalink-checker").length == 0)
		parent.append("<span class='permalink-checker' style='padding: 2px;'></span>");

	var span = $(".permalink-checker");
	span.css({color: "#f80", border: "1px #840 solid", background: "#fea"})
		.append("checking validity <img style='vertical-align: middle;' src='images/throbber.gif' />");

	$.ajax({
		type:"POST",
		url:"dooblab_ajax.php",
		data:"valid_permalink="+self.val()+"&id="+$(id).val(),
		success:function(msg){

			var str = msg.trim();

			if (str == "0")
				span.text("valid permalink").css({color: "green", border: "1px #080 solid", background: "#8f8"});
			else
				span.text("invalid permalink, try another" + str).css({color: "red", border: "1px #800 solid", background: "#f88"});

			$(instance).html(self.val());
		}
	});
}

function clearEmptySolutions(game, element)
{
	$.ajax(
	{
		type:"POST",
		url:"dooblab_ajax.php",
		data:"clear_empty_solutions="+game,
		success:function(msg)
		{
			var data = $.json.decode(msg);

			$(element).html(data.msg).hide();
			$(element).slideDown(1000);

			showMessage(data.alert, "body", true);
		}
	});

	return false;
}

function selectImage(self, input, img, path, filename, pickedClass)
{
	$(img).attr("src", path + filename);
	$(input).val(filename);

	$(self).siblings().removeClass(pickedClass);

	$(self).addClass(pickedClass);
}

function fixSortables()
{
	$("ul, li").disableSelection();
}

function insertPresetHTML(element)
{
	var el = $(element);

	el.text("<div class='feature-[[STATUS]]'></div><div class='feature-container'><div class='feature-back'></div><div class='feature-text'><h1>Title</h1>Info</div></div>");

	return false;
}

function slideFade(time) {
	var active = $(".feature-block a.active");
	active = active.length?active:$(".feature-block a:first");

	var next = active.next("a");
	next = next.length?next:$(".feature-block a:first");

	active.addClass("last-active");

	next.css({opacity: 0.0})
		.addClass("active")
		.animate({opacity: 1.0}, time, function() {
			active.removeClass("active last-active");
		});
}

function slideScroll()
{
	var count = $(".feature-scroller").children().length - 1;

	var slider = $(".feature-slider");

	if ((count < 2) || (slider.hasClass("scrolling")))
	{
		return;
	}

	var idx = Math.floor(slider.slider("value") / 100.0 + 0.5);

	var active = $(".feature-scroller");

	var start = idx;
	var end = Math.min(count, (idx+1));

	if (end < count)
		slider.slider("value", end*100);
	else
		slider.slider("value", 0);

	active_start = {left: "-" + (start*570) + "px"};
	active_end = {left: "-" + (end*570) + "px"};

	active.css(active_start)
		.animate(active_end, scrollSpeed, scrollEase,
		function()
		{
			if (end >= count)
			{
				active.css({"left": "0px"});
				slider.slider("value", 0);
			}
		});
}

var scrollerID;

function EndScroller()
{
	if (scrollerID)
		clearInterval(scrollerID);

	scrollerID = null;
}

function StartScroller()
{
	EndScroller();

	scrollerID = setInterval("slideScroll()", scrollDuration);
}

StartScroller();

$(document).ready(function(){
	/// check all
	$("#check-all").live("click", function()
	{
		$(".process-check").each(function()
		{
			this.checked = true;
		});
	});

	/// uncheck all
	$("#uncheck-all").live("click", function()
	{
		$(".process-check").each(function()
		{
			this.checked = false;
		});
	});

	/// check invert
	$("#check-invert").live("click", function()
	{
		$(".process-check").each(function()
		{
			this.checked = !this.checked;
		});
	});

	/// incoming header
	$(".incoming-header").live("click", function()
	{
		var next = $(this).next()

		if (next.is(":hidden"))
			next.slideDown();
		else
			next.slideUp();
	});

	$("#game_progress_inp").keypress(function(event)
	{
		if (((event.charCode >= 48) && (event.charCode <= 57)) ||
			(event.keyCode == 37) ||	// left
			(event.keyCode == 39) ||	// right
			(event.keyCode == 8) ||		// backspace
			(event.keyCode == 46) ||	// delete
			(event.keyCode == 36) ||	// home
			(event.keyCode == 35))	// end
			return true;

		event.preventDefault();
	});

	$("#game_progress_inp").keyup(function(event)
	{
		$("#game_progress_img").attr("src", "doobProgress.php?"+$(this).val());
	});

	$("#tabs").tabs();

	$("#game_progress_img").attr("src", "doobProgress.php?"+$("#game_progress_inp").val());

	$("div.games-compact div a, div.games div a").hover(function()
	{
		$("img.progress", this).stop().animate({height: "16px"}, 150);
	},
	function()
	{
		$("img.progress", this).stop().animate({height: "0px"}, 150);
	});

	$(".game-row .manage", this).addClass("dooblab-hidden");

	/// mouse over manager
	$(".game-row").live("mouseover", function()
	{
		$(".manage", this).removeClass("dooblab-hidden");
	});

	/// mouse out manager
	$(".game-row").live("mouseout", function()
	{
		$(".manage", this).addClass("dooblab-hidden");
	});

	$("input.process-check").enableCheckboxRangeSelection();

	$(".expand-next").live("click",
		function()
		{
			$(this).next().toggle("fast");
		}
	);

	$(".expand-next").next().hide();

	// featured games dnd
	$(".drag-game").draggable({
		revert: true,
		revertDuration: 50,
		zIndex:2700,
		helper: "clone"
		//,connectToSortable: "#dropped-games"
	});

	$(".drop-game").droppable({accept: ".drag-game", tolerance: "pointer", zIndex:2700,
		hoverClass:"drop-game-over",
		drop: function(event, ui)
		{
			var id = $(ui.draggable).attr("id");

			if ($("#feature-"+id).length)
			{
				return;
			}

			var drop = $("<li><img src='"+ $(ui.draggable).attr("src") +"' alt='' id='feature-"+ id +"' class='drag-feature' /><input type='hidden' name='features[]' value='"+ id +"' /></li>");
			$("#dropped-games").append(drop);
			fixSortables();

			/*$(".drag-feature").draggable({revert:true, revertDuration: 500, zIndex: 2700});*/
		}
	});

	//$(".drag-feature").draggable({revert:"invalid", revertDuration: 500, zIndex: 2700});

	$(".drop-feature").droppable({accept: "#dropped-games li", tolerance: "pointer",
		hoverClass:"drop-feature-over",
		drop: function(event, ui)
		{
			$(ui.draggable).remove();
		}
	});

	$("#dropped-games").sortable({
		revert: true,
		revertDuration: 10
	});

	$(function() {
		var slidercount = ($(".feature-scroller").children().length - 2);

		$(".feature-slider").slider({
			max: slidercount * 100,
			animate: "slow",
			start: function(event, ui)
			{
				$(".feature-slider").addClass("scrolling");
				EndScroller();
			},
			slide: function(event, ui)
			{
				var val = (ui.value / 100.0) * 570;

				$(".feature-scroller").css({"left" : -val+"px"})
			},
			stop: function(event, ui)
			{
				var count = $(".feature-block").children().length;
				var pos = ui.value / 100.0;
				var subpos = pos % 1.0;
				pos = Math.floor(pos + 0.5);

				$(this).slider("value", pos*100);

				$(".feature-scroller").animate({"left":-pos*570+"px"}, subpos * scrollSpeed, scrollEase, function()
				{
					$(".feature-slider").removeClass("scrolling")
					StartScroller();
				});
			}
		});

		/*var slidernum = slidercount+1;
		var slider = $(".feature-slider").parent();
		var width = slider.width();
		var height = slider.height();
		var hw = -70;
		var w = (width - hw) / slidernum;
		
		for (var i=0; i<slidernum; i+=2)
		{
			var html = "<div style='height: "+ height +"px; width: "+ (i+2>=slidernum?w:w+hw/2) +"px; background-color: #333; margin-left:"+ (!i?w:w+hw/2) +"px; float:left;'></div>";
			slider.prepend(html);
		}*/
	});

	fixSortables();

});
