// JavaScript Document


var number_rows = new Array();
var eraser_on= false;
var current_number;
var lang = "en";
var tile_width = 32;
var stage_width = 0;
var stage_height = 0;

var gDoneButton;
var gInfoButton;

var gameWidth = 9;
var gameHeight = 9;

// clock
var cSec = 0;
var cMin = 0
var clockInterval;

// counts
var joker_count = 0;
var check_count = 0;

//advanced
var lang = "en";

var numbers_to_solve = 0;

var vertical_sums = new Array();
var horizontal_sums = new Array();

function changeHeight(value, parent) {
	setSelection(value, parent);
	gameHeight = value;
	newGame();
}

function changeWidth(value, parent) {
	setSelection(value, parent);
	gameWidth = value;
	newGame();
}

function setSelection(value, parent){
	var selected = document.getElementsByClassName('s_o_s', parent);
	selected[0].className = 's_o';
	var selectable_nodes = document.getElementById(parent).childNodes;
	for( var i = 0; i < selectable_nodes.length; i++ ) {
		if( selectable_nodes[i].id == value ){
			selectable_nodes[i].className = 's_o_s';
		}
	}	
}

function newGame() {
	init();
	numbers_to_solve = 0;
	
	stage_height = gameHeight * tile_width;
	stage_width = gameWidth * tile_width;
	
	var game_width = 123 + gameWidth * 32;
	var game_height = 123 + gameHeight * 32;
	document.getElementById("kakuro").style.width = game_width + 'px' ;
	document.getElementById("kakuro").style.height = game_height + 'px' ;
	
	document.getElementById("top").style.width = stage_width+ 'px';
	document.getElementById("stage_container").style.width = stage_width+'px';
	document.getElementById("bottom").style.width = stage_width+'px';
	
	document.getElementById("left").style.height = stage_height+'px';
	document.getElementById("stage_container").style.height = stage_height+'px';
	document.getElementById("right").style.height = stage_height+'px';
	
	var numbers = document.getElementById("numbers_container");
	numbers.innerHTML = createNumbers();
	
	var stage = document.getElementById("stage_container");
	stage.innerHTML = createStage();
	
	document.getElementById("top").innerHTML = createVerticalSums();
	document.getElementById("left").innerHTML = createHorizontalSums();
	
	vertical_sums = new Array();
	horizontal_sums = new Array();
	
	cSec = 0;
	cMin = 0;
	joker_count = 0;
	check_count = 0;
	
	clearInterval( clockInterval );
	clockInterval = setInterval("clockTik()", 1000);
};

function changeStyle(style) {
	document.getElementById('game_style').href = 'game_' + style.value + '.css';	
}

function clockTik() {
	
	if( cMin == 60 ) {
		clearInterval( clockInterval );	
	} else {
		var csMin = cMin < 10 ? "0" + cMin : cMin;
		var csSec = cSec < 10 ? "0" + cSec : cSec;
		document.getElementById("clock").innerHTML = csMin + ":" + csSec;
		
		cSec++;
		if( cSec == 60 ){
			cSec = 0;
			cMin++;
		}
	}
}

function createStage() {
	number_rows = new Array();
	
	var debug_s ="";
	for( var i = 0; i < gameHeight; i++ ) {
		var row = new Array();
		/*
		 * Never ask whats going on here!!
		 */
			do{
				var max;
				
				var offset;
				if( row.length == 0 ) {
					offset = getRandom( 0, 1 );
				} else {
					offset = 1;	
				}
				
				for( var j=0; j < offset; j++ ){
					row.push( 0 );	
				}
				
				var snippetMax = 3;
				var snippetLength = getRandom( 1, snippetMax  );
				
				// prevent closed cells
				
				var not_to_use_row = new Array();
				
				for( var j = row.length - 1; j >= 0;j-- ) { 
					if ( row[j] > 0 ) {
						not_to_use_row.push( row[j] ) ;
					}
				}
				
				for( var j = 0; j < snippetLength; j++ ) {
					var not_to_use = new Array();
					var not_to_use_column = new Array();
					if( number_rows.length > 0 ) {
						for( var k = number_rows.length - 1; k >= 0; k--){ 
							if ( number_rows[k][ row.length ] > 0 ) {
								not_to_use_column.push( number_rows[k][ row.length ] );
							}
						}
					}
					
					not_to_use = not_to_use_column.concat( not_to_use_row );
					
					var newSnippet = getRandom( 1, 9, not_to_use );
						not_to_use_row.push( newSnippet );
						if( row.length < gameWidth ) { row.push( newSnippet ); }
				}
				
			} while ( row.length < gameWidth );
		number_rows.push(row);
	}
	
	var table = "<table id=\"stage\" width=\"" + stage_width +  "\" height=\"" + stage_height + "\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
	
	for( var i = 0; i < number_rows.length; i++ ) {
		var row = "<tr>";
		var horizontal_tmp = 0;
		var tmp_horizontal_sums = new Array();
		
		for	( var j = 0; j < number_rows[i].length; j++ ) {
			row += "<td><div class=\"place\" onClick=\"javascript:getNumber(this);\" id=\"" + i + "-" + j + "\">" + /*number_rows[i][j] + */"</div></td>";
			
			if( number_rows[i][j] == 0 && horizontal_tmp > 0 ) {
				tmp_horizontal_sums.push( horizontal_tmp );
				horizontal_tmp = 0;
			} else {
				horizontal_tmp += number_rows[i][j];
			}
			
			if( number_rows[i][j] != 0 ) {
				numbers_to_solve++;	
			}
		}
		if( horizontal_tmp > 0 ) {
			tmp_horizontal_sums.push( horizontal_tmp );
		}
		
		horizontal_sums.push( tmp_horizontal_sums );
		table += row + "</td>";
	}
	
	for( var i = 0; i < number_rows[0].length; i++ ) {
		var vertical_tmp = 0;
		var tmp_vertical_sums = new Array();
		
		for	( var j = 0; j < number_rows.length; j++ ) {
			if( number_rows[j][i] == 0 && vertical_tmp > 0 ) {
				tmp_vertical_sums.push( vertical_tmp );
				vertical_tmp = 0;
			} else {
				vertical_tmp += number_rows[j][i];	 
			}
		}
		if( vertical_tmp > 0 ) {
			tmp_vertical_sums.push( vertical_tmp );
		}
		
		vertical_sums.push( tmp_vertical_sums );
	}
	
	return table;
}


function createVerticalSums(){
	var vdivs = "";
	for( var i = 0; i < vertical_sums.length; i++ ){
		vdivs += "<div id=\"vs_container\">";
		for( var j = 0; j < vertical_sums[i].length ; j++ ){
			vdivs += "<div id=\"vs\">" + vertical_sums[i][j];
			vdivs += vertical_sums[i].length - 1 == j ? "" : ",";
			vdivs += "</div>"; 
		}
		vdivs += "</div>";
	}
	
	return vdivs;
}

function createHorizontalSums(){
 	var hdivs = "";
	for( var i = 0; i < horizontal_sums.length; i++ ){
		hdivs += "<div id=\"hs_container\">";
		for( var j = 0; j < horizontal_sums[i].length ; j++ ){
			hdivs += "<div id=\"hs\">" + horizontal_sums[i][j];
			hdivs += horizontal_sums[i].length - 1 == j ? "" : ",";
			hdivs += "</div>"; 
		}
		hdivs += "</div>";
	}
	
	return hdivs;
}

function getNumber (obj) {
	if( current_number > 0 ) {
		obj.parentNode.innerHTML = "<div class=\"number\" onClick=\"javascript:deleteThis(this);\" id=\"" +obj.id + "\">" + current_number + "</div>";
	}
}

function deleteThis(element){
	element.parentNode.innerHTML = "<div class=\"place\" onClick=\"javascript:getNumber(this);\" id=\"" +element.id + "\">" + /*number_rows[i][j] + */"</div>";		
}

function giveMeAHint() {
	var stage_table = document.getElementById("stage");
	
	var divs = document.getElementsByClassName("place", stage_table);	
	
	var theHint = 0;
	var randDiv = getRandom( 0, divs.length );
	var numberIndex = divs[randDiv].id.split("-");
	theHint = number_rows[ numberIndex[0] ][ numberIndex[1] ];
	if( theHint == 0 ) {
		divs[randDiv].parentNode.innerHTML = "<div class=\"joker_empty\" onClick=\"javascript:deleteThis(this);\" id=\"" +divs[randDiv].id + "\"></div>";
	} else {
		divs[randDiv].parentNode.innerHTML = "<div class=\"joker_number\" onClick=\"javascript:deleteThis(this);\" id=\"" +divs[randDiv].id + "\">" + theHint + "</div>";
	}
	
	joker_count++;
}


	/*
	// old check
	} else {
	// standard check
		
	}
	*/

function check(sums) {
	var stage_table = document.getElementById("stage");
	var numbers = document.getElementsByClassName("number", stage_table);
	var jokers = document.getElementsByClassName("joker_number", stage_table);
	
	var solved_total =  jokers.length + numbers.length; 
	for( var i = 0; i < numbers.length; i++ ) {
		var numberIndex = numbers[i].id.split("-");
		if( number_rows[ numberIndex[0] ][ numberIndex[1] ] != numbers[i].innerHTML ) {
			numbers[i].className = "wrong";
		} 
	} 
	
	var wrongs = document.getElementsByClassName("wrong", stage_table);	
	if( wrongs == 0 && solved_total == numbers_to_solve ) {
		var congrat = "";
			
			if( lang == "en" ){
				congrat = "<div id='congratulations'><h1>Congratulations!</h1><p>You solved the puzzle using "+joker_count+" joker and "+check_count+" times the check button in ";
			} else if ( lang == "ge" ){
				congrat = "<div id='congratulations'><h1>Gratulation!</h1><p>Sie haben das Spiel mit "+joker_count+" joker(n) und mit "+check_count+" mal verwendetem kontollieren button in ";
			} else if ( lang == "tr" ){
				congrat = "<div id='congratulations'><h1>Tebrikler!</h1><p>Oyunu "+joker_count+" key jokere ve "+check_count+" kez kontrole basarak ";
			}
			
			if( cMin >= 60 ){
				if( lang == "en" ){ congrat += "more than a hour (poor performance).</p></div>"; }
				else if( lang == "ge" ){  congrat += "mehr als einer Stunde gelöst (schwache Leistung).</p></div>"; }
				else if( lang == "tr" ){  congrat += "bir saatden fazla olan bir süreçte anca bitirebildiniz (pek hızlı sayılmaz).</p></div>"; }
			} else {
				if( lang == "en" ){ congrat += cMin + " min. and " + cSec + " sec.</p></div>"; }
				else if( lang == "ge" ){  congrat += cMin + " min. und " + cSec + " sec. gelöst,</p></div>"; }
				else if( lang == "tr" ){ congrat += cMin + " dak. ve " + cSec + " san. içinde bitirdiniz.</p></div>"; }
				
			}
			
			document.getElementById("stage_container").innerHTML = congrat;
			document.getElementById("congratulations").style.width = stage_width + 'px';
			document.getElementById("congratulations").style.height = stage_height  + 'px';
	}
}

function getRandom(min, max, except){
	var factor = max - min + 1;
	var rand = Math.floor( Math.random() * factor ) + min;
	//if( except != null && except.length > 5 ) { return 0; }
	
	if( except != null && except.length > 0 ) {
		except = removeDuplicates( except );
		//debug( except.length +" : " + except.join( ", " ));
		
		if( except.length >= 9 ) {
			return 0;
		}
		
		var found = false;
		for( var i = 0; i < except.length; i++ ) {
			if( except[i] == rand ) {
				found = true;
				break;
			}
		}
		if( found == true ) {
			rand = getRandom(min, max, except);	
		}
	}
	return rand;
}

function removeDuplicates(nums){
	nums.sort();
	var newNums = new Array();
	for( var i = 0; i < nums.length; i++ ){
		var found = false;
		for( var j = 0; j < newNums.length; j++){
			if( newNums[j] == nums[i] ){
				found = true;
				break;
			}
		}
		
		if( found == false ) {
			newNums.push(nums[i]);	
		}
	}
	return newNums;
}


function createNumbers() {
	var table = "";
	for( var i = 1; i < 10; i++ ) {
		table += "<div class=\"number_selectable\" id=\"" + i + "\" onClick=\"markNumber(this)\">" + i + "</div>";
	}
	return table;
}

function markNumber(obj){
	var number_table = document.getElementById("numbers");
	var divs = document.getElementsByClassName("number_selected", number_table);
	for( var i = 0; i < divs.length; i++){
		divs[i].className = "number_selectable";
	}
	current_number = obj.innerHTML;
	obj.className = "number_selected";	
}

function eraser(){
	if( eraser_on == false ) {
		document.getElementById('menu_eraser').innerHTML = "rubber on";
		eraser_on = true;
	} else {
		document.getElementById('menu_eraser').innerHTML = "rubber off";
		eraser_on = false;
	}
}

function debug(text){
	document.getElementById('debug').innerHTML += "<pre>" + text + "</pre>";
}

function add_divs(table, tag, classname)
{
	var items = table.getElementsByTagName(tag);
	for (var i = 0; i < items.length; i++)
		items[i].innerHTML =
			"<div class='" + classname + "'>" + items[i].innerHTML + "</div>";
}
