var currentBtn = null;
var currentButton = null;
var debug = false;
var currentIndex = 0;
var currentTrueIndex = 0;

var isGenerating = false;

var currentSquareId = -1;
var version = 0;
var activeDD = 0;
var cookiePrefix = "dckg20_values";
var navigationCookie = "dckg20_navigation";
var fieldType = 'text';
var cookieSize = 1000;

var currentId = null;
var shortName = null;

var nameArray = new Array();
var idArray = new Array();
var patternIdArray = new Array();
var squareTitleArray = new Array();
var keyPressMode = 0;

var visibleItems = null;

var currentPool = null;
var currentType = null;
var allItems = null;

var activeTab = null;

var activeSubTab = null;

var dragActive = false;

var inventory = false;

var loadingFlags = Array();
var loadTicks = 0;
function output(txt) {
	$("#debug").append(txt);
}

function clearOutput() {
	$("#debug").html("");
}

function outputLine(txt) {
	$("#debug").append(txt+"<br>");
}

function getIconClass(fullClass) {
	fullClass = fullClass.replace("btn_icon","");
	var parts = fullClass.split(" ");
	for(i=0;i<parts.length;i++) {
		if(parts[i].indexOf("btn_icon")>=0)
			return parts[i];
	}
}

function getPosClass(fullClass) {
	var parts = fullClass.split(" ");
	for(i=0;i<parts.length;i++) {
		if(parts[i].indexOf("btn_pos")>=0)
			return parts[i];
	}
}

function replacePosClass(fullClass, newPosClass) {
	var parts = fullClass.split(" ");
	for(i=0;i<parts.length;i++) {
		if(parts[i].indexOf("btn_pos")>=0)
			parts[i] = newPosClass;
	}
	
	var newFullClass = "";
	for(i=0;i<parts.length;i++) {
		newFullClass += parts[i]+" ";
	}
	return newFullClass;
}

function changeTab(tab, subtab, type, newPool, btn) {
	
	var tabId = "";
	var subTabId = "";
	if(tab != null)
		tabId = tab.id;
	if(subtab != null)
		subTabId = subtab.id;


	//setNavigationCookie(tabId,subTabId,type,newPool,"","chageTab");	

	/*
	if(activeTab == null)
		activeTab = document.getElementById('pattern_tab');
	if(activeSubTab == null)
		activeSubTab = document.getElementById('hero_subtab');
	*/
	if(tab != null) {
		activeTab.className = '';
		activeTab = tab;
		tab.className = 'active';
		var firstsub = document.getElementById(tab.id.split("_")[0]+"_subtab");
		if(firstsub != null) {
			if(activeSubTab != null) {
				activeSubTab.className = '';
			}
			activeSubTab = firstsub;
			firstsub.className = 'active';
		}
	}
	if(subtab != null) {
		activeSubTab.className = '';
		activeSubTab = subtab;
		subtab.className = 'active';
	}
	
	setPool(type, newPool, btn);
}


function setPool(type, newPool, btn) {
	currentPool = newPool;
	currentType = type;
	//var allBtn = document.getElementById('all_btn');
	if(type == 'patterns') {
		document.getElementById('shop_subs').style.display = 'none';
		document.getElementById('hero_subs').style.display = 'none';
		document.getElementById('inventory').style.display = 'none';
		document.getElementById('heroes_shops').style.display = 'block';
		//currentPattern = "";
		//currentPrefix = "";		
	}
	if(type == 'shops') {
		document.getElementById('shop_subs').style.display = 'block';
		document.getElementById('hero_subs').style.display = 'none';
		document.getElementById('inventory').style.display = 'none';
		document.getElementById('heroes_shops').style.display = 'block';
		//currentPattern = "shop";
		//currentPrefix = "sh";
	}
	else if(type=='heroes') {
		allItems = $("#allHeroes > a");		
		document.getElementById('shop_subs').style.display = 'none';
		document.getElementById('inventory').style.display = 'none';
		document.getElementById('heroes_shops').style.display = 'block';
		document.getElementById('hero_subs').style.display = 'block';
		//currentPattern = "hero";
		//currentPrefix = "he";
	}
	else if(type=='inventory') {
		document.getElementById('shop_subs').style.display = 'none';
		document.getElementById('heroes_shops').style.display = 'none';
		document.getElementById('hero_subs').style.display = 'none';
		document.getElementById('inventory').style.display = 'block';
		//currentPattern = "inventory";
		//currentPrefix = "in";
				
	}
	
	if(type!='inventory') {
		var ic = $("#menu > a").css("display","none").filter(function(index) {
			if($(this).hasClass(newPool)) {
				return true; 
			}
			return false;
		})
		
		var menuItemCount = ic.css("display","block").length;
		
		if(btn == null)
			currentBtn = ic[0];
		
		$(currentBtn).trigger('click');
		
		initMenu(menuItemCount);		
	}

}

function setNavigationCookie() {
	var values = new Array();
	var cookie = readCookie(navigationCookie);
	if(cookie != null) {
		values = cookie.split(",");
	}
	for(i=0;i<arguments.length;i++) {
		var val = arguments[i];
		if(i>=values.length) {
			values.push(val);
		}
		else {
			if(val != "")
				values[i] = val;
		}
	}
	/*
	outputLine("-----SETTING COOKIE-----");
	var headers = new Array("tab: ","stab: ","type: ","pool: ","btn: ")
	for(i=0;i<values.length;i++) 
		outputLine(headers[i]+values[i]);
	*/
	createCookie(navigationCookie,values.toString(),365);
}

function toggleHeroPattern(btn) {
	toggleSquare(btn, 'hero', 'Hero Patterns', 'he-pattern', '', 'img/new/Abilities/all.jpg', 'Hero Pattern','move','stop','hold','attack','patrol','Special skill 1','Special skill 2','selectskill','Standard skill 1','Standard skill 2','Standard skill 3','Standard skill 4','re-pattern','','img/new/Research/all_research.jpg', 'Hero Learn Pattern','Learn Skill 1','Learn Skill 2','Learn Skill 3','Learn Skill 4','Learn Attribute bonus','','','','','','','Cancel');	
}

function toggleShopPattern(btn) {
	toggleSquare(btn, 'shop','Shop Patterns', 'sh-pattern', '', '', 'Shop Pattern', 'Purchase Item 1', 'Purchase Item 2','Purchase Item 3','Purchase Item 4','Purchase Item 5','Purchase Item 6','Purchase Item 7','Purchase Item 8','Purchase Item 9','Purchase Item 10','Purchase Item 11','Purchase Item 12');
}

function clearAll() {
	if(confirm("Are you sure you want to delete all mappings?")) {
		eraseCookie(navigationCookie);
		deleteCookies();	
		window.location.href = window.location.href.replace('#','');
	}
}

function clearCurrent() {
	var fieldName = "key"+currentPrefix+"-"+currentId;
	var paraName = "para"+currentPrefix+"-"+currentId;
	$("#"+fieldName).remove();
	$("#"+paraName).remove();
	save();
	$(currentButton).trigger('click');
}

function deleteCookies() {
	
	for(i=1;i<10;i++) {
		eraseCookie(cookiePrefix+"_"+i);
	}	
}

function testCookie() {
	createCookie('drjones','ABCD',1);
	var val = readCookie('drjones');
	if(val != 'ABCD') {
		document.getElementById('cookie_warning').className = 'shown';	
		return false;
	}
	return true;
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function getElementPosition(offsetTrail){
	var offsetLeft = 0;
	var offsetTop = 0;
	while (offsetTrail){
		offsetLeft += offsetTrail.offsetLeft;
		offsetTop += offsetTrail.offsetTop;
		offsetTrail = offsetTrail.offsetParent;
	}
	if (navigator.userAgent.indexOf('Mac') != -1 && typeof document.body.leftMargin != 'undefined'){
		offsetLeft += document.body.leftMargin;
		offsetTop += document.body.topMargin;
	}
	return {left:offsetLeft,top:offsetTop};
}

function getKeyValue(e, extendedMode) {
	var keyvalue = '#';
	if(extendedMode) {
		if(e.which >= 48 && e.which <=57)
			keyvalue = (e.which-48)+"";
	}
	if(e.which >= 65 && e.which <=122)
		keyvalue = String.fromCharCode(e.which);
	
	switch(e.which) {
		//space
		case 32:
			keyvalue = 'DELETE'
		break;
	}
	
	switch(e.keyCode) {
		//esc
		case 27:
			if(extendedMode)
				keyvalue = 'esc';
			else
				keyvalue = '512';
		break;
	}
	return keyvalue;
}

$(document).keypress(function (e) {
	var activiate = $("#popup:visible").length > 0;
	
	if(activiate) {
		if(currentId.indexOf("in-")>=0) {
			var keyvalue = getKeyValue(e, true);
			if(keyvalue != '#')
				bindDropDownInventory(keyvalue);
		}
		else {			
			var keyvalue = getKeyValue(e, false);
			if(keyvalue != '#')
				bindDropDown(keyvalue);
		}
		return false;	
	}	
});

function setDep(pos, hotkey) {
	var skills = document.getElementById('data').getElementsByTagName('input');
	for(i=0;i<skills.length;i++) {
		if(skills[i].type == fieldType && skills[i].name.indexOf("std") != 0) {
			if(skills[i].className == pos) {
				//alert('removing child: '+skills[i].id);	
				document.getElementById('data').removeChild(skills[i]);
				
			}
		}
	}
}

function getSubFix(index) {
	var subfix = '_key';
	if(index >= 12 && index <= 23)
		subfix = '_rkey';	
	return subfix;
}

function createSubKeyString(index, hotkey) {
	var subKeyString = "";

	for(i=0;i<12;i++) {
		if(subKeyString.length > 0)
			subKeyString += ":";
		if((i+1) == index)
			subKeyString += hotkey+","+"#";
		else
			subKeyString += "#,#";
	}
	return subKeyString;
}

function outputVars() {
	var str = "";
	for(i=0;i<arguments.length;i++) {
		if(str.length > 0)
			str += ", ";
		str += i+": "+arguments[i];
	}
	output(str);
}

function createKeyString(index, hotkey, position) {
	var keyString = "";
	var count = (parseInt(index / 13) * 12) + 12;
	for(i=0;i<count;i++) {
		if(keyString.length > 0)
			keyString += ":";
		if((i+1) == index)
			keyString += getKey(hotkey)+","+position;
		else
			keyString += "#,#";
	}
	return keyString;
}

function extractValues(part) {
	if(part.indexOf("(") >= 0 || part.indexOf(")") >= 0) {
		outputLine("Can extract values. String contains '(' or ')': "+part);
	}
	else if(part != null && part.length > 0) {
		var bits = part.split(",");
		if(bits.length > 1) {
			
			var hotkey = bits[0];
			var position = bits[1];
			
			if(position != "#") {
				position = parseInt(position);
			}
			
			return {hotkey: hotkey, position:position};
		}
	}
	return {hotkey: "#", position: "#"};
}

function insertIntoKeyString(index, hotkey, keyString) {
	var parts = keyString.split(":");

	var values = extractValues(parts[index-1]);
	if(hotkey.indexOf("#")>=0)
		hotkey = values.hotkey;
	if(hotkey == 'DELETE')
		hotkey = '#';
	parts[index-1] = hotkey + ","+values.position
		
	var newKeyString = "";
	for(i=0;i<parts.length;i++) {
		if(newKeyString.length > 0)
			newKeyString += ":";	
		newKeyString += parts[i];
	}
	
	return newKeyString;
}

function setKey(hotkey, position) {		
	hotkey = hotkey.toUpperCase();

	var fieldName = "key"+idArray[currentSquareId];
	var patternFieldName = "key"+patternIdArray[currentSquareId];
	
	name = getCurrentName(currentSquareId,currentIndex);
	if(isSharedAbility(currentIndex, name, fieldName) && fieldName.indexOf("pattern") < 0) {
		
		fieldName = patternFieldName;
	}
	

	var keyfield = $("#"+fieldName);
	
	//$($(currentBtn).find(".key_div")).html(getKey(hotkey));
	
	if(keyfield.length == 0) {
		var keyString = createKeyString(currentIndex, hotkey, position);
		if(debug)
			$("#data").append('<p id="'+fieldName.replace("key","para")+'">'+fieldName+'</p>');
		$("#data").append('<input id="'+fieldName+'" name="'+fieldName+'" type="'+fieldType+'" value="'+keyString+'">');
	}
	else {
		var keyString = keyfield.val();
		keyString = insertIntoKeyString(currentIndex, hotkey, keyString);
		keyfield.val(keyString);
	}
	save();
	
	
	$(currentButton).trigger('click');
}

function loadDataFromCookies() {
	
	var monsterCookie = "";
	for(i=1;i<100;i++) {
		var cookie = readCookie(cookiePrefix+"_"+i);
		if(cookie == null)
			break;
		monsterCookie += cookie;
	}
	
	//alert(monsterCookie);
	if(monsterCookie.length > 0) {
		var cookieParts = monsterCookie.split("key");
				
		for(j=0;j<cookieParts.length;j++) {
			
			if(cookieParts[j].length > 0) {
				var bigparts = cookieParts[j];//.split("-");
				var parts = bigparts.split("(");
				if(parts.length == 2) {
					var fieldName = "key"+parts[0];
					var keyString = parts[1].replace(")","");
	
					if(true) {
						if(debug)
							$("#data").append('<p id="'+fieldName.replace("key","para")+'">'+fieldName+'</p>');
						$("#data").append('<input id="'+fieldName+'" name="'+fieldName+'" type="'+fieldType+'" value="'+keyString+'">');
					}
				}
			}
		}
	}
	
	
}

function alertCookies() {
	for(i=1;i<100;i++) {
		var cookie = readCookie(cookiePrefix+"_"+i);
		if(cookie == null)
			break;
		alert('lengt: '+cookie.length+"\n"+cookie);	
	}
}

function save() {
	deleteCookies();
	var mappings = document.getElementById('data').getElementsByTagName('input');
	
	var cookieList = new Array();
	var str = "";
	for(i=0;i<mappings.length;i++) {
		//alert(mappings[i].value);
		if(mappings[i].type == fieldType) {
			if(str.length > cookieSize) {
				cookieList.push(str);
				str = "";
			}
			if(mappings[i].value.length > 0)
				var val = mappings[i].value.split("(")[0];
				str += mappings[i].id + "("+val+")";
		}
	}
	cookieList.push(str);

	for(i=1;i<=cookieList.length;i++) {
		createCookie(cookiePrefix+"_"+i,cookieList[i-1],365);
	}
}

function initialize(v,d) {
	
	//setTimeout("loader()", 1000);
	
	//startPreloadingImages();
	
	debug = d;
	if(debug)  {
		fieldType = "text";
		$("#debug").show();
	}
	else {
		fieldType = "hidden";
		$("#debug").hide();	
	}
	version = v;
	//activeTab = document.getElementById("pattern_tab");
	//activeSubTab = document.getElementById("hero_subtab");
	/*
	var ic = $("#menu > a")
		.filter(function() {
			if($(this).css("display") == "block")
				return true;
			return false;
	    }).length;
	initMenu(ic);
	
	$("#scroll_right").click(function() {
		scroll(1);
	});
	$("#scroll_left").click(function() {
		scroll(-1);
	});
	$("#slider").bind("mousedown", sliderMouseDown);
	*/
	
	
	
	var skills = document.getElementById('data').getElementsByTagName('input');

	var result = testCookie();
	
	if(result) {
		loadDataFromCookies();
	}
	
	try {
		var cur = readCookie(navigationCookie);
		if(cur != null) {
			var para = cur.split(",");
			var tab = document.getElementById(para[0]);
			var subTab = document.getElementById(para[1]);
			if(subTab != null && subTab.id.indexOf("_subtab")>=0) {
				var main = subTab.id.split("_")[0]+"_tab";
				tab = document.getElementById(main);
				if(activeTab != null) {
					activeTab.className = '';
					activeTab = tab;
				}
				tab.className = 'active';			
				activeSubTab = subTab
				activeTab = tab;
			}
			else {
				activeTab = tab;
			}
			currentBtn = document.getElementById(para[4]);
			changeTab(activeTab, activeSubTab, para[2], para[3], currentBtn);

		}
		else {
			activeTab = document.getElementById('pattern_tab');
			currentBtn = document.getElementById('he_pattern_btn');
			changeTab(activeTab, null, "patterns", "allpatterns", currentBtn);
		}
	}
	catch(ex) {}	


		
	
	//Init inventory
	var fieldName = "keyin-pattern";
	var keyfield = $("#"+fieldName);
	if(keyfield.length > 0) {
		var values = keyfield.val().split(",");
		for(i=0;i<values.length;i++) {
			if(values[i] != "#")
				$("#inventory"+(i+1)).find(".item_key_div").text(values[i]);
		}
	}

	showGenerator()
	//loadingFlags.push("loading version data");
}

function startPreloadingImages() {
	var i1 = document.createElement("img");
	i1.src = "/imagemanager/Menu_Icons.jpg";
	i1.onload = function() {
		loadingFlags.push("Preloading menu icons");	
		document.body.removeChild(this);
	}
	document.body.appendChild(i1);
}


function loader() {
	loadTicks++;
	var text = "<h6>Loading...</h6><br />";
	for(i=0;i<loadingFlags.length;i++) {
		text += loadingFlags[i] + " - done!<br />";	
	}
	document.getElementById("loader").innerHTML = text;
	
	if(loadingFlags.length >= 2 || loadTicks >= 15)
		setTimeout("showGenerator()",3000);				
	else {
		setTimeout("loader()", 1000);
	}
	
}



function showGenerator() {
	document.getElementById('loader').style.display = 'none';
	document.getElementById('main_container').style.display = 'block';
}

function bindDropDownInventory(hotkey) {
	if(hotkey == null)
		hotkey = document.getElementById('hotkey_inventory').options[document.getElementById('hotkey_inventory').selectedIndex].value;
	
	hotkey = getKey(hotkey.toUpperCase());
	var fieldName = "keyin-pattern";
	var keyfield = $("#"+fieldName);

	if(keyfield.length == 0) {
		var values = new Array("#","#","#","#","#","#");
		values[currentIndex-1] = hotkey;
		if(debug)
			$("#data").append('<p id="'+fieldName.replace("key","para")+'">'+fieldName+'</p>');
		$("#data").append('<input id="'+fieldName+'" name="'+fieldName+'" type="'+fieldType+'" value="'+values.toString()+'" />');
	}
	else {
		var values = keyfield.val().split(",");
		values[currentIndex-1] = hotkey;
		keyfield.val(values.toString());
	}
	
	$("#inventory"+currentIndex).find(".item_key_div").text(hotkey);
	
	$("#filter").toggle();
	$("#popup").toggle();
	
	save();
	return false;
}

function toggleInventoryPopUp(btn, cu) {
	$("#inventory_view").show();
	$("#normal_view").hide();
	//TODO: POPUP POSITION
	var left = ($(document).width()/2) - 200;
	var top = 200;
	
	$("#popup").css("left",left+"px");
	$("#popup").css("top",top+"px");
	
	$("#filter").toggle();
	$("#popup").show();
	
	var prefix = "Inventory slot ";
	var index = parseInt(cu.replace("in-",""));
	currentIndex = index;
	currentBtn = btn;
	currentId = cu;
	
	$("#skill_text").text(prefix+currentIndex);
	
	var mappings = new Array();
	
	if($("#in-pattern").length>0) {
		mappings = $("#in-pattern").val().split(":");
	}
	
	if(mappings.length>0) {
		var value = mappings[index-1];
		$("#hotkey").val(value);
	}
	
	$("#skill_picture").attr("class","inventory_button"+index);
	$("#skill_picture").css("background-image","url(img/inventory_background.jpg)");	
}

function togglePopUp(btn) {
	$("#inventory_view").hide();
	$("#normal_view").show();
	if(!dragActive) {
		var squareId = -1;
		var index = -1;
		
		var classes = $(btn).attr("class").split(" ");
		for(i=0;i<classes.length;i++) {
			if(classes[i].indexOf("btn_icon")>=0) {
				index = parseInt(classes[i].replace("btn_icon",""));
			}
		}
		
		var squareId = parseInt($(btn).parent().attr("id").replace("square",""));
		currentSquareId = squareId;
		if(squareId > -1 && index > -1) {
			currentBtn = btn;
			currentIndex = index;
			currentTrueIndex = (squareId*12)+index;
	
			var skillName = nameArray[currentTrueIndex-1];
				
			//TODO: POPUP POSITION
			var left = ($(document).width()/2) - 200;
			var top = 200;
			
			$("#popup").css("left",left+"px");
			$("#popup").css("top",top+"px");
			
			$("#filter").toggle();
			$("#popup").show();
			
			$("#skill_text").text(skillName);
			
			var mappedValues = getMappedValues(idArray[squareId], patternIdArray[squareId], squareId);

			if(mappedValues.length > 0) {
				var current = extractValues(mappedValues[index-1]);
				$("#hotkey").val(current.hotkey);
			}
	
			$("#skill_picture").attr("class","skill_icon btn_icon"+index);
			$("#skill_picture").css("background-image",$(btn).css("background-image"));
		}
	}
	else
		dragActive = false;
}

function isNumber(x) 
{ 
  return ( (typeof x === typeof 1) && (null !== x) && isFinite(x) );
}

function getCurrentName(square,index) {
	var nameArrayIndex = (square*12)+index-1;
	return nameArray[nameArrayIndex];
}

function findPosIndex(position, array) {
	for(i=0;i<array.length;i++) {
		if(array[i] == position)
			return i;
	}
	return 0;
}

function mergeWithPattern(unique, pattern, square, fieldName) {
	//return the other if only one is set
	if(unique == null || unique.length == 0)
		return pattern;
	if(pattern == null || pattern.length == 0)
		return unique;
	
	var length = 12;
	//The easy part. The keys. The unique wins unless it is a shared ability
	var mergedKeys = new Array();
	for(i=0;i<length;i++) {
		var keyU = extractValues(unique[i]).hotkey;
		var keyP = extractValues(pattern[i]).hotkey;

		var sharedAbility = isSharedAbility(i+1, getCurrentName(square,i+1), fieldName);
		if(sharedAbility || keyU == "#")
			mergedKeys.push(keyP);
		else
			mergedKeys.push(keyU);
	}

	//step 2 the positions. Prefer the uniquevalues and determine the position conflicts
	var sharedConflicts = new Array();
	var mergedPositions = new Array(1,2,3,4,5,6,7,8,9,10,11,12);
	for(i=0;i<length;i++) {
		var posU = extractValues(unique[i]).position;
		var posP = extractValues(pattern[i]).position;

		//start with the unique values... We resolve the conflicting indexes later on
		mergedPositions[i] = posU;
		
		//conflict add to shareConflicts array

		if(posP != "#" && posU != posP) {
			var sharedAbility = isSharedAbility(i+1, getCurrentName(square,i+1), fieldName);
			if(sharedAbility) {
				sharedConflicts.push(i+1);
			}
		}
	}

	//solve conflict by swapping the pattern value to its original position
	for(j=0;j<sharedConflicts.length;j++) {
		var conflictingIndex = sharedConflicts[j]-1;
		var posP = extractValues(pattern[conflictingIndex]).position;
		
		var swapIndex1 = conflictingIndex;
		var swapIndex2 = findPosIndex(posP, mergedPositions);
				
		var temp = mergedPositions[swapIndex1];
		//outputLine(mergedPositions[swapIndex2]);
		mergedPositions[swapIndex1] = mergedPositions[swapIndex2];
		mergedPositions[swapIndex2] = temp;
	}
	//alert(mergedPositions);
	//Mix and return the computed values
	var mergedValues = new Array();
	for(i=0;i<length;i++) {
		mergedValues.push(mergedKeys[i]+","+mergedPositions[i]);

	}
	return mergedValues;
}

function printTest(arr) {
	
	for(i=0;i<arr.length;i++) {
		var bits = arr[i].split(",");
		output(bits[1]+"-");
		//output(c(arr[i])+",");
	}	
	outputLine("");
}

function sortingFunction(obj1, obj2) {
	var bits1 = obj1.split(",");
	var bits2 = obj2.split(",");
	var number1 = parseInt(bits1[0]);
	var number2 = parseInt(bits2[0]);
	if(number1 > number2)
		return 1;
	else
		return -1;
}

function getEqualPatternIndex(pattern, pos) {
	var index;
	for (index = 0; index < pattern.length; index++) {  
		var currentVal = parseInt(pattern[index].split(",")[1]);
		if (currentVal == pos) {    
			return index;
		} 
	}
	return index;
}


function getClosestPatternIndex(pattern, pos, squareId) {
	var nearest = -1;
	var bestDistanceFoundYet = 12;
	var bestIndex = 0;
	var index=0;
	for (index = 0; index < pattern.length; index++) {  
		var currentVal = pattern[index];
		if (currentVal == pos) {    
			return index;
		} 
		else {    
			var d = Math.abs(pos - currentVal);    
			if (d < bestDistanceFoundYet) {          
				nearest = index;
			}  
		}
	}
	return nearest;
}

function isSharedAbility(index, name, id) {
	var names = new Array("move","stop","attack","hold","patrol","selectskill","Attribute bonus","cancel");
	for(kaffe=0;kaffe<names.length;kaffe++) {
		
		if(names[kaffe] == name)
			return true;
	}
	return false;
	/*
	//alert(index+", "+name+", "+id);
	if(id.indexOf("he")>=0 || id.indexOf("cr")>=0 || id.indexOf("su")>=0) {
		if(name.length > 0) {
			switch(index) {
				case 1:	case 2:	case 3:	case 4:	case 5:	case 8:
					return true;
				break;
			}
		}
	}
	else if(id.indexOf("re")>=0) {
		if(name.length > 0) {
			switch(index) {
				case 5: case 12:
					return true;
				break;
			}		
		}
	}
	return false;
	*/
}

function printSqaure(square)
{
	outputLine("+--+--+--+--+");	
	for(i=1;i<13;i++)
	{
		output("|" + c(square[i - 1]));
		if (i % 4 == 0 && i != 0)
		{
			output("|");
			outputLine("");
			outputLine("+--+--+--+--+");
		}
	}
}

function c(field)
{
	var str = field.toString();
	if (str == null)
		return "&nbsp;&nbsp;";
	if (str.length == 1)
		return "&nbsp;" + str+ "&nbsp;";
	return str;
}

function getKey(keyvalue) {
	
	var key = keyvalue.replace("#","");
	if(key == 512)
		return "ESC";
	if(key == 'DELETE')
		return "";
	return key;
}

function getMappedValues(fieldId, patternId, squareId) {
	mappedValues = new Array();

	var patternField = "";
	var uniqueField = "";
	if(patternId != null && patternId.length > 0) 
		patternField = $("#key"+patternId);
	if(fieldId != null && fieldId.length > 0)
		uniqueField = $("#key"+fieldId);

	if(patternField.length > 0 && uniqueField.length > 0) {
		uv = uniqueField.val();
		if(uniqueField.val().indexOf("(") > 0)
			uv = uniqueField.val().split("(")[0];
		pv = patternField.val();											  									  
		if(patternField.val().indexOf("(") > 0)
			pv = patternField.val().split("(")[0];											  
		mappedValues = mergeWithPattern(uv.split(":"), pv.split(":"), squareId,  fieldId);
	}
	else if(uniqueField.length > 0) {
		uv = uniqueField.val();
		if(uniqueField.val().indexOf("(") > 0)
			uv = uniqueField.val().split("(")[0];

		mappedValues = uv.split(":");
	}
	else if(patternField.length > 0) {
		mappedValues = patternField.val().split(":");
	}
	else {
		mappedValues = new Array("#,#","#,#","#,#","#,#","#,#","#,#","#,#","#,#","#,#","#,#","#,#","#,#");	
	}
	
	return mappedValues;
}

function toggleSquare() {
	//"btn","id","masterName",
	//"square1ID","square1Pattern","square1Image","square1Name","ability1-12"
	//"square2ID","square2Pattern","square2Image","square2Name","ability1-12"
	var start = 0;

	if(!isGenerating) {
		$("#square_div").empty();
		start = new Date().getTime();
	}
	var clone = null;

	currentButton = arguments[0];
	
	var ct = "";
	if(activeTab != null)
		ct = activeTab.id;
	var cst = "";
	if(activeSubTab != null)
		cst = activeSubTab.id;
	
	if(!isGenerating)
		setNavigationCookie(ct,cst,currentType,currentPool,currentButton.id);
	currentId = arguments[1];
	masterName = arguments[2];
	
	var args = jQuery.makeArray(arguments).splice(3,arguments.length-3);
	var squareCount = parseInt((args.length-3)/16)
	var squareArray = new Array(squareCount);
	var i = 0;
	do {
		squareArray[i] = args.splice(0,16);
		i++;
	}
	while(args.length >= 16)
	
	nameArray = new Array();

	//setMergedValues(i);
	//var mappedValues = currentMergedValues;
	idArray = new Array();
	patternIdArray = new Array();	
	
	for(i=0;i<squareArray.length;i++) {
		for(j=4;j<squareArray[i].length;j++) {
			nameArray.push(squareArray[i][j]);
		}		
		
		clone = $("#square_template").clone(true);
		clone.attr("id","square"+i);
		clone.css({'display' : 'block'});

		var fieldId = squareArray[i][0];
		var patternId = squareArray[i][1];
		var imageUrl = squareArray[i][2];
		var squareTitle = squareArray[i][3];
		var imageLeftPos = 0;

		idArray.push(fieldId);
		patternIdArray.push(patternId);
		squareTitleArray.push(squareTitle);
		
		//var titleField = $($((clone).children()[0]).children()[0]);
		var titleField = $(clone).find(".square_title");
		
		titleField.html(squareTitle);
		
		
		var useImageManager = false;
		var writeNames = false;
		
		if(imageUrl.indexOf(",") > 0) {
			var parts = imageUrl.split(",");
			imageUrl = parts[0];
			imageLeftPos = parseInt(parts[1]);
			useImageManager = true;
		}
		
		if(imageUrl.length == 0) {
			imageUrl = "img/skills/allblank.jpg";
			writeNames = true;
		}
		
		//alert(fieldId+" - "+patternId);
		var mappedValues = getMappedValues(fieldId, patternId, i);
		
		if(isGenerating) {
			var uniqueField = $("#key"+fieldId); 
			if(uniqueField.length > 0 && fieldId.indexOf("pattern") < 0) {
				var val = uniqueField.val();
				
				if(val.indexOf("("))
					val = val.split("(")[0];
				
				uniqueField.val(val+"("+arrayToCommaString(mappedValues)+")");
				
			}
			continue;
		}
		//alert(mappedValues);
		
		
		clone.children().filter("a").filter(function (index) {
			var trueIndex = (i*12)+(index);
			var sharedAbility = isSharedAbility(index+1, nameArray[trueIndex] ,fieldId);
			if(useImageManager) {
				
				$(this).css("background-image","url("+imageUrl+")");
				topArray = Array(0,55,110);
				leftArray = Array(0,57,112,167);
				var left = (index)%4;
				var top = parseInt((index)/4);
				var l = parseInt(imageLeftPos+leftArray[left]);
				var t = parseInt(topArray[top]);
				var backgroundString = "-"+l+"px -"+t+"px";
				//outputLine(backgroundString);
				$(this).css("background-position",backgroundString);
				
			}
			else
				$(this).css({'background-image' : "url("+imageUrl+")"});
			
			if(currentType == "heroes" && sharedAbility && nameArray[trueIndex] != "") {
				$(this).append('<div style="margin:1px 0px 0px 1px; width:45px; height:44px; border:2px dotted Yellow;"></div>');
			}
			hotkey = "";
			position = index+1;

			var val = extractValues(mappedValues[index]);
			hotkey = getKey(val.hotkey);
			position = val.position;
			
			var iconPos = parseInt(getPosClass($(this).attr("class")).replace("btn_pos",""));
			if(position != "#") {
				
				var newClass = replacePosClass($(this).attr("class"), "btn_pos"+position);
				$(this).attr("class", newClass);
			}
			if(nameArray[trueIndex] != null && nameArray[trueIndex].length > 0) {
				$(this).append('<span class="key_div">'+hotkey+'</span>');
				$(this).click = togglePopUp;	
			}
			else {
				$(this).removeAttr("onclick");
				$(this).css({'cursor' : "default"});
			}
			if(writeNames || (imageUrl == "img/skills/blank.jpg" && !sharedAbility))
				$(this).append('<span class="skill_name">'+nameArray[trueIndex]+'</span>');							
		});
		
		clone.appendTo($("#square_div"));

		if(currentId == 2 && i == 2) {
		
		}
		else {
			clone.children().filter("a").draggable({ 
				//grid: [55, 55], 
				distance: 10,
				containment: 'parent', 
				start: function(event, ui) {
					$(this).parent().append('<a id="ghost" style="z-index:2700;"></a>');
					$(this).css("z-index","3000");
					dragActive = true;
				},
				stop: function() {
					var styles = $(this).attr("style").split(";");
					var newStyleString = ""; 
					for(i=0;i<styles.length;i++) {
						var s = styles[i].toUpperCase();
						if(s.length > 0 && s.indexOf("TOP:")<0 && s.indexOf("LEFT:")<0 && s.indexOf("Z-INDEX:")<0) {
							newStyleString += styles[i]+"; ";
						}
					}
					
					$(this).attr("style",newStyleString);
					$("#ghost").remove();
					
					$(currentButton).trigger('click');
				}
			});
			clone.children().filter("a").droppable({ 
				over: function(event, ui) {
					var dragPosClass = getPosClass(ui.draggable.attr("class"));
					var result = replacePosClass($(this).attr("class"),dragPosClass);
					$("#ghost").css("background-image",$(this).css("background-image"));
					$("#ghost").html($(this).html());
					$("#ghost").attr("class",result);
					$(this).css("display","none");
				},
				out: function(event, ui) {
					$(this).css("display","block");
				},
				drop: function(event, ui) {
					$(this).css("display","block");
					var swapClass1 = $(this).attr("class");
					var swapClass2 = $(ui.draggable).attr("class");
					var swapPosClass1 = getPosClass(swapClass1);
					var swapPosClass2 = getPosClass(swapClass2);
					$(this).attr("class",replacePosClass(swapClass1,swapPosClass2));
					$(ui.draggable).attr("class",replacePosClass(swapClass2,swapPosClass1));
	
					//do the rest
					var squareId = parseInt($(this).parent().attr("id").replace("square",""));
					
					var index1 = parseInt(getIconClass(swapClass1).replace("btn_icon",""));
					var index2 = parseInt(getIconClass(swapClass2).replace("btn_icon",""))
					var trueIndex1 = index1+(squareId*12);
					var trueIndex2 = index2+(squareId*12);
					var name1 = nameArray[trueIndex1-1];
					var name2 = nameArray[trueIndex2-1];
					
					var children = $("#square"+squareId+" > a").filter(function() {return $(this).attr("id") == ""});
					var startPos = 0;
	
					var positions = new Array();
					
					for(i=0;i<children.length;i++) {
						var index = parseInt(getIconClass($(children[i]).attr("class")).replace("btn_icon",""))-1;
						var pos = parseInt(getPosClass($(children[i]).attr("class")).replace("btn_pos",""));
						positions[index] = pos;
					}
					
					var fieldName = "key"+idArray[squareId];
					var patternFieldName = "key"+patternIdArray[squareId];
					var name = squareTitleArray[squareId];
					
					sharedAbility = isSharedAbility(index1, name1, fieldName);
					if(!sharedAbility)
						sharedAbility = isSharedAbility(index2, name2, fieldName);
													
					var keyField = $("#"+fieldName);
					var keyString = "";
					
					if(keyField.length == 0) {
						keyString = createKeyStringFromPositions(positions);
						
						if(debug)
							$("#data").append('<p id="'+fieldName.replace("key","para")+'">'+fieldName+'</p>');
						$("#data").append('<input id="'+fieldName+'" name="'+fieldName+'" type="'+fieldType+'" value="'+keyString+'">');
					}
					else {
						keyString = swapPositionsInKeyString(keyField.val(), positions);
						keyField.val(keyString);
					}
						
					if(sharedAbility && fieldName.indexOf("pattern")<0 && patternFieldName != "key") {
						updatePatternField(patternFieldName, index1, index2);
					}
					save();
					
				}
			});
		}
	}

	if(!isGenerating) {
		var end = new Date().getTime();
		var time = end - start;
		outputLine("exec time: "+time);	
	}
}

function arrayToCommaString(arr) {
	var str = "";
	for(l=0;l<arr.length;l++) {
		if(str.length > 0)
			str += 	":";	
		str += arr[l]	
	}
	return str;
}

function updatePatternField(patternId, index1, index2) {
	var field = $("#"+patternId);
	if(field.length == 0) {
		var keyString = "";
		for(i=1;i<=12;i++) {
			if(keyString.length != 0)
				keyString += ":";
			if(i==index1)
				keyString += "#,"+index2;
			else if(i==index2)
				keyString += "#,"+index1;
			else
				keyString += "#,"+i;
		}
		if(debug)
			$("#data").append('<p id="'+patternId.replace("key","para")+'">'+patternId+'</p>');
		$("#data").append('<input id="'+patternId+'" name="'+patternId+'" type="'+fieldType+'" value="'+keyString+'">');						
	}
	else {
		var keyString = field.val();
		var values = keyString.split(":");
		var temp = values[index1-1];
		values[index1-1] = values[index2-1];
		values[index2-1] = temp;
		
		keyString = "";
		for(i=0;i<12;i++) {
			if(keyString.length != 0)
				keyString += ":";
			keyString += values[i];
		}
		field.val(keyString);
	}	
}

function createKeyStringFromPositions(positions) {
	var keyString = "";
	for(j=0;j<positions.length;j++) {
		if(keyString.length > 0)
			keyString += ":";
		keyString += "#,"+positions[j];
	}
	return keyString;
}

function swapPositionsInKeyString(keyString, positions) {
	var newKeyString = "";
	var arr = keyString.split(":");
	
	for(j=0;j<positions.length;j++) {
		var val = extractValues(arr[j]);
		if(newKeyString.length > 0)
			newKeyString += ":";
		newKeyString += val.hotkey+","+positions[j];	
	}
	return newKeyString;
}

function bindDropDown(hotkey) {
	if(hotkey == null)
		hotkey = document.getElementById('hotkey').options[document.getElementById('hotkey').selectedIndex].value;
	setKey(hotkey, '#');
	$("#filter").toggle();
	$("#popup").toggle();
	return false;
}

function getPosition(e) {
	if (!e) 
		var e = window.event;	
	if (e.pageX || e.pageY) {
		posx = e.pageX;		
		posy = e.pageY;	
	} 
	else if (e.clientX || e.clientY) {		
		posx = e.clientX + document.body.scrollLeft	+ document.documentElement.scrollLeft;		
		posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;	
	}
	var height = document.getElementById('mouse_over_div').offsetHeight+20;
	return {x:posx+10,y:posy-height};
}
function showToolTip(e, tooltip) {
	document.getElementById('uniqueToolTip').className = 'hidden';
	document.getElementById('forceAllToolTip').className = 'hidden';
	document.getElementById(tooltip).className = 'shown';
	document.getElementById('mouse_over_div').className = 'shown';
	var pos = getPosition(e);
	x = pos.x;
	y = pos.y;
	document.getElementById('mouse_over_div').style.left = x+'px';
	document.getElementById('mouse_over_div').style.top = y+'px';

}
function moveToolTip(e) {
	var pos = getPosition(e);
	x = pos.x;
	y = pos.y;
	if(document.getElementById('mouse_over_div').className == 'shown') {
		document.getElementById('mouse_over_div').style.left = x+'px';
		document.getElementById('mouse_over_div').style.top = y+'px';
	}
}
function hideToolTip() {
	document.getElementById('mouse_over_div').className = 'hidden';
}

function getNameArrayFromBtn(btnID) {
	var button = $("#"+btnID);

	var onclickString = button.attr("onclick").toString();
	var cleanString = onclickString.match(/toggleSquare\([\S ]*/);																	
	cleanString = cleanString[0].replace("toggleSquare(","").replace(");","");
	var arr = cleanString.split(",");
	
	arr.splice(0,7);
	if(arr.length > 12)
		arr.splice(13,3);
	if(arr.length > 24)
		arr.splice(25,3);
	if(arr.length > 36)
		arr.splice(37,3);
	if(arr.length > 48)
		arr.splice(49,3);
	if(arr.length > 60)
		arr.splice(61,3);
	if(arr.length > 72)
		arr.splice(73,3);
	
	//remove unnessesary indexes
	var nameArray = new Array();
				
	for(j=0;j<arr.length;j++) {
		var value = arr[j].replace(/\"/g,"").replace(/\'/g,"")
		value = trim12(value);
		nameArray.push(value);
	}

	for(j=0;j<nameArray.length;j++) {
		outputLine(nameArray[j]);	
	}
	

	return nameArray;	
}

function trim12 (str) {
	var	str = str.replace(/^\s\s*/, ''),
		ws = /\s/,
		i = str.length;
	while (ws.test(str.charAt(--i)));
	return str.slice(0, i + 1);
}

function prepForGeneration() {
	try {
		var lastPushedButton = currentButton;
		if(lastPushedButton == null)
			lastPushedButton = $("#he_pattern_btn");
		isGenerating = true;
		$($("#menu_container").find("a")).trigger("click");
		isGenerating = false;
		$(lastPushedButton).trigger("click");
	}
	catch(ex) {
		return false;	
	}
	return true;
}

function validate() {
	var error = "You havnt mapped a key for the following abilities\n\n";
	var miss = false;
	var mappings = document.getElementById('data').getElementsByTagName('input');
	for(i=0;i<mappings.length;i++) {
		if(mappings[i].type == 'hidden' || mappings[i].type == fieldType ) {
			if(mappings[i].value.length == 0) {
				error += document.getElementById(mappings[i].id.replace("_key","_text")).innerHTML+"\n";
				miss = true;
			}
		}
	}

	if(miss) {
		alert(error);

	}
	return true;
}

//Meeeeeeeeeeeeeeeeeeeeeeennuuuuuuuuuuuu

var visibleItems = 0;
var itemCount = 0;
var dragScroll = false;
var stepWidth = 0;
var index = 0;

function sliderMouseDown(e) {
	var clickPos = e.clientX-$("#slider").offset().left;
	var clickIndex = parseInt(clickPos/stepWidth);
	scroll(clickIndex-index);
}

function initMenu(ic) {
	visibleItems = 12;
	itemCount = ic;
	dragScroll = false;
	stepWidth = (730-10) / (itemCount-visibleItems);
	index = 0;	

	$("#dot").css("left",0+"px");
	$("#menu").css("margin-left",0);
	
	if(itemCount > visibleItems) {
		$("#scroll_right").show();
		$("#scroll_left").show();
		$("#slider").show();
		$("#dot").show();
	
		$("#dot").draggable( 'destroy' )
		$("#dot").draggable({ axis: 'x', grid: [stepWidth, 0], containment: 'parent', drag: function(event, ui) 
			{ 
				var scr = (parseFloat((ui.position.left) / stepWidth)-index);
				scroll(scr);
			}
		});
		
		$("#slider").unbind("mousedown", sliderMouseDown);
		$("#slider").bind("mousedown", sliderMouseDown);

		
		$("#scroll_right").unbind("click", scrollRight);
		$("#scroll_right").bind("click", scrollRight);
			
		$("#scroll_left").unbind("click", scrollLeft);
		$("#scroll_left").bind("click", scrollLeft);
	}
	else {
		$("#slider").hide();
		$("#dot").hide();
		$("#scroll_right").hide();
		$("#scroll_left").hide();
	}
}

function scrollLeft() {
	scroll(-1);
}

function scrollRight() {
	scroll(1);
}

function scroll(dir) {

	var newIndex = index+dir;
	if(newIndex >= 0 && (newIndex+visibleItems) <= itemCount) {
		var val = (61*newIndex*-1)+"px";
		var x = stepWidth * newIndex;
		
		$("#dot").css("left",x+"px");
		$("#menu").css("margin-left",val);
		index = newIndex;
	}
}

function toggleSquareDD(btn) {
	var el = $(btn).find("ul");
	if(el.css("display") == "block")
		el.css("display","none");
	else
		el.css("display","block");
}

function resetCurrent(btn) {
	var parents = $(btn).parents();	
	for(i=0;i<parents.length;i++) {
		if($(parents[i]).hasClass("skill_menu")) {
			var squareId = parseInt($(parents[i]).attr("id").replace("square",""));
			var id = idArray[squareId];
			$("#key"+id).remove();	
			$("#para"+id).remove();	
			save();
			//refresh
			$(currentButton).trigger("click");
			break;
		}
	}
}