/*
 * Copyrights/Wszelkie prawa zastrzeżone Łukasz Jedynak
 * 
 * Thanks to mmodata team for idea and some code. Parts of code in
 * updateRequirements function are from You. I hope You are ok with this.
 */

$.fn.opacity = function(_value) {
	return $(this).css('opacity',_value);//filter: alpha(opacity=40);-moz-opacity:0.5;
//	if(_value == 1) return $(this).css({opacity: 1,filter: alpha(opacity=100)});
//	else return $(this).css({opacity: 0.5});
};

$.fn.log = function (msg) {
	console.log("%s: %o", msg, this);
	return this;
};

var pointsNeeded = 0;
var MAX_SKILL_LEVEL = 5;

function checkControlsImages(li, id, skill_rank)
{
//	console.log("reg for " + id + " is " + checkReq(id))
	if(checkReq(id))
	{
		if(skill_rank == "0")
		{
			 li.find(".dec").attr("src", "assets/images/minus_gray.png").css("cursor", "auto");
			 li.find(".add").attr("src", "assets/images/plus.png").css("cursor", "pointer");
		}
		else if(skill_rank >= "5")
		{
			li.find(".add").attr("src", "assets/images/plus_gray.png").css("cursor", "auto");
		}
		else
		{
			li.find(".dec").attr("src", "assets/images/minus.png").css("cursor", "pointer");
			li.find(".add").attr("src", "assets/images/plus.png").css("cursor", "pointer");
		}
	}
	else
	{
		li.find(".dec").attr("src", "assets/images/minus_gray.png").css("cursor", "auto");
		li.find(".add").attr("src", "assets/images/plus_gray.png").css("cursor", "auto");
		var $divRank = li.find('div.rank')
		if(skill_rank != "0")
		{
			pointsNeeded -= Number(skill_rank);
//			console.log("pointsNeeded: " + pointsNeeded + " po odjeciu " +Number(skill_rank));
		}
		$divRank.text( '0/' + MAX_SKILL_LEVEL);
		li.find(".skill_image").opacity(0.50);
	}
}

function update(isUpdateOnStart) //do all in one function faster performance
{
	var $link = "";
	var $tmpLink = "";
	$('#link').text("");
	var count = 0;
	var summary = "";

//	var lvl = 0;

	$('#summary_menu').text("");

	$(".item").each(function (index, domEle)
	{
		var $skill_rank = $(this).find('div.rank').text().split('/')[0];
		var $skillName = $(this).find('p.skill_name').text();
		var $id = $(domEle).attr('id');

		checkControlsImages($(this), $id, $skill_rank);
		if(isUpdateOnStart)
		{
			pointsNeeded += Number($skill_rank);
			//hide or show skill image
			var $image = $(this).find('img.skill_image');
			if($skill_rank == "0")
			{
				 $image.opacity(0.50);
			}
		}

		//req. section
//		var needed = level_needed[$id][$skill_rank - 1];
//		if (needed > lvl) lvl = needed;
		
		//generate link section
		$tmpLink += $skill_rank; // prepare token
		if(++count == 10) // if token has length=10 add to link
		{
			$link += Number($tmpLink).toString(36) + '-'; // encode it and add to link
			count = 0;
			$tmpLink = '';
		}

		//summary section
		if($skill_rank != "" && $skill_rank != "0")
		{
			summary += "<li>" + $skillName + " " + $skill_rank + "/" + MAX_SKILL_LEVEL + "</li>";
		}
	});

	//req. section
	$('#points_needed').text(pointsNeeded);
	updateRequirements();

	//generate link section
	while($tmpLink.length < 10) // temporary fill up to have full 10; only last token can be shorten then 10
	{
			$tmpLink += '9';
	}
	$link += Number($tmpLink).toString(36); // encode it and add
	$('#link').text(base_url + "show/" + race_class + "/" + $link);

	//summary section
	$('#summary_menu').html(summary);
}

function updateRequirements()
{
	var lvl = 0;
	$(".item").each(function (index, domEle)
	{
		var $skill_rank = $(this).find('div.rank').text().split('/')[0];
		var $id = $(domEle).attr('id');
		var needed = level_needed[$id][$skill_rank - 1];
		if (needed > lvl) lvl = needed;
	});

	var lvlforpoints = 0;
	var pointsforlvl = 0;
	if (pointsNeeded > 49)
	{
		if (pointsNeeded > 91)
		{
			lvlforpoints = (pointsNeeded - 49 - 42) + 70;
		}
		else
		{
			lvlforpoints = Math.ceil((pointsNeeded - 49)/2) + 49;
		}
	}
	else if (pointsNeeded >= lvl)
	{
		lvlforpoints = pointsNeeded;
	}
	if (lvl >= lvlforpoints) lvlforpoints = lvl;
	if (lvlforpoints > 49)
	{
		if (lvlforpoints > 70)
		{
			pointsforlvl = 49 + 42 + (lvl-70);
		}
		else
		{
			pointsforlvl = ((lvlforpoints-49)*2) + 49;
		}
	}
	else
	{
		pointsforlvl = lvlforpoints;
	}
	if (pointsforlvl > pointsNeeded)
	{
		$('#points_needed').append(' <span id="pointsleft">(' + (pointsforlvl - pointsNeeded) + ' points left)</span>');
	}

	$('#max_level_skill').text(lvl);
	$('#min_level_needed').text(lvlforpoints);
}

function initListeners()
{
	$("img.skill_image").click( function(e)
	{
		var $skillImage = $(e.target);
		var $id = $skillImage.parent('').attr('id');
		var $rankDiv = $skillImage.parent('').find('div.rank');
		if(checkReq($id))
		{
			addSP($id, $skillImage, $rankDiv);
		}
	});

	$("img.skill_image").rightClick( function(e)
	{
		var $skillImage = $(e.target);
		var $id = $skillImage.parent('').attr('id');
		var $rankDiv = $skillImage.parent('').find('div.rank');
		if(checkReq($id))
		{
			decSP($id, $skillImage, $rankDiv);
		}
	});

	$("img.add").click( function(e)
	{
		var $target = $(e.target);
		var $id = $target.parent('').parent('').attr('id');
		var $rankDiv = $target.parent('').parent('').find('div.rank');
		var $skillImage = $target.parent('').parent('').find('img.skill_image');
		if(checkReq($id))
		{
			addSP($id, $skillImage, $rankDiv);
		}
	});

	$("img.dec").click( function(e)
	{
		var $target = $(e.target);
		var $id = $target.parent('').parent('').attr('id');
		var $rankDiv = $target.parent('').parent('').find('div.rank');
		var $skillImage = $target.parent('').parent('').find('img.skill_image');
		if(checkReq($id))
		{
			decSP($id, $skillImage, $rankDiv);
		}
	});

	$("#reset").click(function(e) {
		$(".item").each(function (index, domEle)
		{
			e.preventDefault();
			pointsNeeded = 0;
			var $skill_rank = $(this).find('.rank');
			var $id = $(domEle).attr('id');
			$skill_rank.text('0/' + MAX_SKILL_LEVEL);
			$(this).find(".skill_image").opacity(0.50);
			
//			checkControlsImages($(this), $id, $skill_rank)
			
		});
		update();
	});
}

function checkReq(id)
{
	for(var i in req_skills[id])
	{
//		console.log('req for '+id + ' is [' + i + ']=' + req_skills[id][i] + ' val: ' + $('#' + i + " div.rank").text().split('/')[0]);
//		checkReq(i);
		if(Number($('#' + i).find("div.rank").text().split('/')[0]) < req_skills[id][i])
		{
			return false;
		}
	}
//	console.log('no req');
	return true;
}

function addSP(id, skillImage, rankDiv)
{
	var $skill_count = Number(rankDiv.text().split('/')[0]);
//	console.log('$skill_count: ' + $skill_count)
	if($skill_count == 0) skillImage.opacity(1.0);
	$skill_count++;

	if($skill_count > MAX_SKILL_LEVEL)
	{
		$skill_count = MAX_SKILL_LEVEL
		rankDiv.text(MAX_SKILL_LEVEL + '/' + MAX_SKILL_LEVEL);
	}
	else
	{
		rankDiv.text($skill_count + '/' + MAX_SKILL_LEVEL);
		pointsNeeded++;
	}

	update();
}

function decSP(id, skillImage, rankDiv)
{
	var $skill_count = Number(rankDiv.text().split('/')[0]);

	--$skill_count;
	if($skill_count <= 0)
	{
		if($skill_count == 0) pointsNeeded--;
		$skill_count = 0;
		skillImage.opacity(0.50);
	}
	else
	{
		pointsNeeded--;
	}
	rankDiv.text($skill_count + '/' + MAX_SKILL_LEVEL);

	update();
}

function setupMenu()
{
	var currentOpen;
	var over = false;
	$("a.link").click(function(e) {
//		console.log("l: " + $(e.target).parent().parent().find('.submenu:hidden').length);
		if($(e.target).parent().parent().find('.submenu:hidden')) {
			var $a = $(e.target).parent();
			var $submenu = $(e.target).parent().parent().find('.submenu');

			if(currentOpen)
			{
				$(".submenu").not($submenu).hide();
				$("a.link").not($a).removeClass("menu-open");
			}

			e.preventDefault();
	//		console.log($submenu.attr('id'));
			if($submenu.attr('id') == 'link_menu')
			{

			}
			$submenu.toggle();
			$a.toggleClass("menu-open");

			currentOpen = $submenu;
		}
	});
	$(".submenu").mouseover(function(){
		over = true;
	});
	$(".submenu").mouseout(function(){
		over = false;
	});

	$(document).mouseup(function(e) {
		if($(e.target).parent("a.link").length == 0 && !over)
		{
			$("a.link").removeClass("menu-open");
			$(".submenu").hide();
		}
	});
}

/*****************************************************************************/
/* DOM ready - start
/*****************************************************************************/
$('html').addClass('js');
$(document).ready( function()
{
//	console.profile('Measuring time');
	
	initListeners();
	update(true);
	$('#wrapper').show();
	setupMenu();

	$('img.skill_image').cluetip({
		width:				445,
		attribute:			'longdesc',
		arrows:				false,
		cluetipClass:		'jtip',
		positionBy:			'mouse',
		titleAttribute:		'alt',
		mouseOutClose:		true
	});
	
//	console.profileEnd();
});
$(function(){$(document).pngFix();});
