var memoryTries = 0;
var memoryField;
var memoryTimer;
var memoryImgPath = "/img/memory/";
var memoryImgPrefix = "kimus1_";
var memoryImgBg = "ic_pattern.jpg";
var memoryFieldCount = 20;
var memoryInputEnabled = true;
var memoryStatusWinSubtitle = "Du hast das Spiel geschafft!";
var memoryStatusDefaultTitle;
var memoryStatusDefaultSubtitle;

$(document).ready(function() {
	if (memoryFieldCount % 2 != 0) return;
	memoryStatusDefaultTitle = $("#content_memory strong").html();
	memoryStatusDefaultSubtitle = $("#content_memory span").html();
	
	//preloadImages
	$("#content_memory").append("<div id=\"memory_preload\"></div>");
	$("#memory_preload").css("display","none");
	for(var i = 0; i < memoryFieldCount / 2; i++) {
		$("#memory_preload").append("<img src=\"" + memoryImgPath + memoryImgPrefix + i + ".jpg" + "\" />");
	}
	$("#memory_preload").onImagesLoaded(function(_this){
		memoryInit();
		$("#content_memory_newgame").unbind("click");
		$('#content_memory_newgame').bind("click", function() {
			memoryInit();
		});
	});
});

function memoryInit() {
	var n;
	clearTimeout(memoryTimer);
	memoryTries = 0;
	memoryInputEnabled = true;
	//set array
	memoryField = new Array();
	for(var i = 0; i < memoryFieldCount; i++) {
		memoryField.push(new Array(-1,0));
	}
	//set images
	$("#content_memory ul li").detach();
	for(var i = 0; i < memoryField.length; i++) {
		n = memoryGetRandom(0,memoryField.length / 2 - 1);
		while(memoryFieldGetImageFieldOccurence(n) == 2) {
			n = memoryGetRandom(0,memoryField.length / 2 - 1);
		}
		$("#content_memory ul").append("<li id=\"memory_field_" + i + "\"><img src=\"\" /></li>");
		memoryFieldSetImage(i,n);
	}
	$("#content_memory ul li img").attr("src","");
	$("#content_memory ul li img").css("opacity","1");
	$("#content_memory ul li img").css("display","none");
	$("#content_memory ul li").unbind("click");
	$("#content_memory ul li").each(function(i) {
		$(this).bind("click",function() {
			memoryFieldClick(i);
		});
	});
	memoryFieldRefresh();
	$("#content_memory strong").html(memoryStatusDefaultTitle);
	$("#content_memory span").html(memoryStatusDefaultSubtitle);
	return false;
}

function memoryFieldClick(fieldId) {
	var status;
	var image;
	var fieldsOpened;
	var fieldOpened;
	if (!memoryInputEnabled) return;
	status = memoryFieldGetStatus(fieldId);
	image = memoryFieldGetImage(fieldId);
	if (status == 0) {
		fieldsOpened = memoryFieldGetImageFieldsOpened();
		//alert("FieldsOpened: " + fieldsOpened);
		if (fieldsOpened == 0) {
			memoryFieldSetStatus(fieldId,1);
		}
		else if (fieldsOpened == 1) {
			memoryFieldSetStatus(fieldId,1);
			memoryTries++;
			memorySetInput(false);
			memoryTimer = setTimeout("memoryResetFields()",1000);
		}
		else {
			//error
			alert("error");
		}
	}
	else if (status == 1) {
		//nothing
	}
	else if (status == 2) {
		//nothing
	}
	memoryFieldRefresh();
	return false;
}

function memoryResetFields() {
	fieldOpened = memoryFieldGetOpenedFields();
	if (typeof fieldOpened != "object" || fieldOpened.length != 2) {
		alert("error1");
		return;
	}
	//alert(fieldOpened[0] + "," + fieldOpened[1]);
	if (memoryFieldGetImage(fieldOpened[0]) == memoryFieldGetImage(fieldOpened[1])) {
		//equal images
		memoryFieldSetStatus(fieldOpened[0],2);
		memoryFieldSetStatus(fieldOpened[1],2);
	}
	else {
		//not equal
		memoryFieldSetStatus(fieldOpened[0],0);
		memoryFieldSetStatus(fieldOpened[1],0);
	}
	
	if (memoryFieldGetFieldsSolved() >= memoryField.length) {
		//win
		$("#content_memory strong").html(memoryGetStatusWin());
		$("#content_memory span").html(memoryStatusWinSubtitle);
		memorySetInput(false);
	}
	else memorySetInput(true);
	
	memoryFieldRefresh();
}

function memorySetInput(bInput) {
	for(var i = 0; i < memoryField.length; i++) {
		if (bInput) {
			status = memoryFieldGetStatus(i);
			if (status == 0) {
				if (!$("#memory_field_" + i).hasClass("clickable")) $("#memory_field_" + i).addClass("clickable");
			}
			else {
				if ($("#memory_field_" + i).hasClass("clickable")) $("#memory_field_" + i).removeClass("clickable");
			}
		}
		else {
			if ($("#memory_field_" + i).hasClass("clickable")) $("#memory_field_" + i).removeClass("clickable");
		}
	}
	memoryInputEnabled = bInput;
}

function memoryFieldGetImage(fieldId) {
	var objArrI;
	objArrI = memoryField[fieldId];
	return objArrI[0];
}

function memoryFieldSetImage(fieldId,newImageId) {
	memoryField[fieldId].splice(0,1,newImageId);
}

function memoryFieldGetStatus(fieldId) {
	var objArrI;
	objArrI = memoryField[fieldId];
	return objArrI[1];
}

function memoryFieldSetStatus(fieldId,newStatus) {
	memoryField[fieldId].splice(1,1,newStatus);
}

function memoryFieldGetDebug() {
	var output = "";
	for(var i = 0; i < memoryField.length; i++) {
		output = output + i + ": " + memoryField[i][0] + ", " + memoryField[i][1] + "<br />";
	}
	return output + "<br />" + memoryFieldGetFieldsSolved();
}

function memoryFieldGetFirstOpenedField() {
	var objArrI;
	for(var i = 0; i < memoryField.length; i++) {
		objArrI = memoryField[i];
		if (objArrI[1] == 1) return i;
	}
	return false;
}

function memoryFieldGetOpenedFields() {
	var objArrI;
	var arrOutput = new Array();
	for(var i = 0; i < memoryField.length; i++) {
		objArrI = memoryField[i];
		if (objArrI[1] == 1) arrOutput.push(i);
	}
	return arrOutput;
}

function memoryFieldGetImageFieldOccurence(imageId) {
	var fieldCount = 0;
	var objArrI;
	for(var i = 0; i < memoryField.length; i++) {
		objArrI = memoryField[i];
		if (objArrI[0] == imageId) fieldCount++;
	}
	return fieldCount;
}

function memoryFieldGetImageFieldsOpened() {
	var fieldCount = 0;
	var objArrI;
	for(var i = 0; i < memoryField.length; i++) {
		objArrI = memoryField[i];
		if (objArrI[1] == 1) fieldCount++;
	}
	return fieldCount;
}

function memoryFieldGetFieldsSolved() {
	var fieldCount = 0;
	var objArrI;
	for(var i = 0; i < memoryField.length; i++) {
		objArrI = memoryField[i];
		if (objArrI[1] == 2) fieldCount++;
	}
	return fieldCount;
}

function memoryFieldRefresh() {
	var status;
	var image;
	for(var i = 0; i < memoryField.length; i++) {
		status = memoryFieldGetStatus(i);
		image = memoryFieldGetImage(i);
		//alert("status: " + status + ", " + $("#memory_field_" + i + " img").attr("src"));
		if (status == 0) {
			//covered
			if (!$("#memory_field_" + i).hasClass("clickable")) $("#memory_field_" + i).addClass("clickable");
			//if ($("#memory_field_" + i).hasClass("selected")) $("#memory_field_" + i).removeClass("selected");
			memorySwitchToImage(i,memoryImgPath + memoryImgBg,"switchOff",false);
		}
		else if (status == 1) {
			//shown
			if ($("#memory_field_" + i).hasClass("clickable")) $("#memory_field_" + i).removeClass("clickable");
			//if (!$("#memory_field_" + i).hasClass("selected")) $("#memory_field_" + i).addClass("selected");
			//if ($("#memory_field_" + i + " img").attr("src") != memoryImgPath + memoryImgPrefix + image + ".jpg") $("#memory_field_" + i + " img").attr("src",memoryImgPath + memoryImgPrefix + image + ".jpg");
			memorySwitchToImage(i,memoryImgPath + memoryImgPrefix + image + ".jpg","switchOn",true);
		}
		else if (status == 2) {
			//solved
			if ($("#memory_field_" + i).hasClass("clickable")) $("#memory_field_" + i).removeClass("clickable");
			//if ($("#memory_field_" + i).hasClass("selected")) $("#memory_field_" + i).removeClass("selected");
			//if ($("#memory_field_" + i + " img").attr("src") != memoryImgPath + memoryImgPrefix + image + ".jpg") $("#memory_field_" + i + " img").attr("src",memoryImgPath + memoryImgPrefix + image + ".jpg");
			//if ($("#memory_field_" + i + " img").attr("src") != "") $("#memory_field_" + i + " img").attr("src","");
			memorySwitchToImage(i,"","take",false);
		}
	}
	//$("#debug").html(memoryFieldGetDebug());
}

function memorySwitchToImage(fieldId,newImgPath,animationStyle,bShowBorder) {
	var speed = 150;
	if ($("#memory_field_" + fieldId + " img").attr("src") == "") {
		speed = 1000;
	}
	if ($("#memory_field_" + fieldId + " img").attr("src") != newImgPath) {
		if (animationStyle == "switchOn") {
			//alert(fieldId + ":" + $("#memory_field_" + fieldId + " img").attr("src"));
			if ($("#memory_field_" + fieldId + " img").attr("src") != "") {
				$("#memory_field_" + fieldId + " img").animate({width: "0px",left: "45px"},speed,"swing",
				function() {
					$("#memory_field_" + fieldId + " img").attr("src",newImgPath);
				});
			}
			else {
				$("#memory_field_" + fieldId + " img").css({width: "0px",left: "45px",display: "block"});
				$("#memory_field_" + fieldId + " img").attr("src",newImgPath);
			}
			$("#memory_field_" + fieldId + " img").animate({width: "90px",left: "0px"},speed,"swing",
			function() {
				memorySwitchBorder(fieldId,bShowBorder);
			});
		}
		else if (animationStyle == "switchOff") {
			//alert(fieldId + ":" + $("#memory_field_" + fieldId + " img").attr("src"));
			memorySwitchBorder(fieldId,bShowBorder);
			if ($("#memory_field_" + fieldId + " img").attr("src") != "") {
				$("#memory_field_" + fieldId + " img").animate({width: "0px",left: "45px"},speed,"swing",
				function() {
					$("#memory_field_" + fieldId + " img").attr("src",newImgPath);
				});
			}
			else {
				$("#memory_field_" + fieldId + " img").css({width: "0px",left: "45px",display: "block"});
				$("#memory_field_" + fieldId + " img").attr("src",newImgPath);
			}
			$("#memory_field_" + fieldId + " img").animate({width: "90px",left: "0px"},speed,"swing");
		}
		else if (animationStyle == "take") {
			memorySwitchBorder(fieldId,false);
			$("#memory_field_" + fieldId + " img").animate({left: "-90px",top: "-30px",opacity: 0},speed,"swing",
			function() {
				$("#memory_field_" + fieldId + " img").css("display","none");
			});
		}
	}
}

function memorySwitchBorder(fieldId,bShowBorder) {
	var speed = 150;
	if (bShowBorder) {
		$("#memory_field_" + fieldId).css({borderWidth: "3px", margin: "2px"});
	}
	else {
		$("#memory_field_" + fieldId).css({borderWidth: "0px", margin: "5px"});
	}
}

function memoryGetStatusWin() {
	var output;
	if (memoryTries <= 15) output = "Meisterhaft!";
	else if (memoryTries > 15 && memoryTries <= 20) output = "Hervorragend!";
	else if (memoryTries > 20 && memoryTries <= 25) output = "Super!";
	else if (memoryTries > 25 && memoryTries <= 30) output = "Gut!";
	else output = "Das geht noch besser!";
	return output;
}

function memoryGetRandom(min,max) {
	if(min > max) return -1;
	if(min == max) return min;
	return min + parseInt(Math.random() * (max-min + 1));
}

jQuery.fn.onImagesLoaded = function(_cb) { 
  return this.each(function() {
 
    var $imgs = (this.tagName.toLowerCase()==='img')?$(this):$('img',this),
        _cont = this,
            i = 0,
    _done=function() {
      if( typeof _cb === 'function' ) _cb(_cont);
    };
 
    if( $imgs.length ) {
      $imgs.each(function() {
        var _img = this,
        _checki=function(e) {
          if((_img.complete) || (_img.readyState=='complete'&&e.type=='readystatechange') )
          {
            if( ++i===$imgs.length ) _done();
          }
          else if( _img.readyState === undefined ) // dont for IE
          {
            $(_img).attr('src',$(_img).attr('src')); // re-fire load event
          }
        }; // _checki \\
 
        $(_img).bind('load readystatechange', function(e){_checki(e);});
        _checki({type:'readystatechange'}); // bind to 'load' event...
      });
    } else _done();
  });
};
