function coche_case(){
	
	var tt = document.formu.is_coche;
	var is_coche = tt.value;
	var tab = document.getElementsByName("id_msg_recu[]");
	
	if(is_coche=="0"){
		tt.value = "1";
		for (i = 0; i<tab.length; ++i) {
			tab[i].checked = true;
		}
		document.formu.btn_coche.value = "-";
	}else{
		tt.value = "0";
		for (i = 0; i<tab.length; ++i) {
			tab[i].checked = false;
		}
		document.formu.btn_coche.value = "X";
	}
}

function getHourMinSec(nb){
	min = Math.floor(nb / 60);
	sec = nb % 60;
	if (sec < 10){
		sec  = "0" + sec;
	}
	if (min < 60){
		return "" + min + ":" + sec;
	}
	hour = Math.floor(min/60);
	min = min % 60;
	if (min < 10 ) {
		min = "0" + min;
	}
	return "" + hour + ":" + min +":" + sec; 
	
}

function horloge(div1_name,nb){
	var div1;		
	
	div1 = document.getElementById(div1_name);
	
	div1.innerHTML = getHourMinSec(nb);
	nb = nb + 1;
	fonc = "horloge('" + div1_name + "'," + nb + ")";
	window.setTimeout(fonc,1000)
}

function getMinSec(nb){
	min = Math.floor(nb / 60);
	sec = nb % 60;
	if (sec < 10){
		sec  = "0" + sec;
	}
	return "" + min + ":" + sec;
}

function compte_a_rebours(div1_name,nb,url){
	var div1;		
	div1 = document.getElementById(div1_name);	
	div1.innerHTML = getMinSec(nb);
	
	nb = nb -1;
	if (nb < 0 && url != ''){
		document.location = url;
	}
	fonc = "compte_a_rebours('" + div1_name + "'," + nb + ",'"+ url+"')";
	
	window.setTimeout(fonc,1000)
}

function horloge_bidirectionnel(div1_name,nb,div_phrase_temps,phrase){
	var div1;		
	div1 = document.getElementById(div1_name);
	div1.innerHTML = getMinSec(Math.abs(nb));

	if (nb < 0 ) {
		div2 = document.getElementById(div_phrase_temps);
		div2.innerHTML = phrase;
	}
	
	nb = nb -1;
	
	fonc = "horloge_bidirectionnel('" + div1_name + "'," + nb + ",'"+div_phrase_temps+ "','"+phrase+"')";
	window.setTimeout(fonc,1000)
}

function createObjectAJAX() {
	var xhr_object = null;
	if(window.XMLHttpRequest) //Pour Firefox
	{xhr_object = new XMLHttpRequest();}
	else if(window.ActiveXObject){ // Internet Explorer 
		try {
			xhr_object = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) 
		{
			xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else {alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");return;}
		return xhr_object;
}


var div_refresh

function replace(id_r,url,server){
	div_refresh = document.getElementById(id_r);
	xhr_object = createObjectAJAX();
	
	xhr_object.onreadystatechange=function() {
		var response=null;
		var ready=xhr_object.readyState;
		
		if(ready == 4 ) {
			response=xhr_object.responseText;
			div_refresh.innerHTML=response;
		}
	};
	
	xhr_object.open("GET", url, true);
	xhr_object.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=latin1");
	
	xhr_object.send(server);
}



//Variables globales
var lastCaseClicked=-1;
var lastOK = false;

//Gestion des évenements
function stopEventPropagation(event){
	
	if ( event && event.stopPropagation ) {
		//Modèle d'évenement W3C
		event.stopPropagation();
	} else {
		//Modèle d'évenement Microsost
		var event = window.event;
		event.cancelBubble = true;
	}
}

//Récupération des élements
function getElement(element,i){
	return document.getElementById(element + '_' + i);
}

function getSelecteur(i){
	return  getElement('selecteur', i);
}

function getNote(i){
	return getElement('note', i);	
}

function getTd(i){
	return getElement('td', i);
}

function getSpan(i){
	return getElement('span', i);
}

function getCase(i){
	return getElement('case', i);
}

function getCaseNumber(i){
	if (testCaseNote(i)){
		return NaN;
	}
	return parseInt(getSpan(i).innerHTML);
}

function getStyleCoin(i){
	var style = "";
	if( i%27 <  9) style += ' shaut ';
	if (i%27 > 17) style +=  ' sbas ';
	if (i%3 == 0) style += ' sgauche ';
	if (i%3 == 2) style += ' sdroite ';
	return style;
}


function switchStyleCaseNote(num_case,numero){
	var note = getNote(num_case);	
	var as = note.getElementsByTagName("a");
	
	var a = as[numero-1];
	if (a.className == 'note_unselected'){
		a.className = 'note_selected';
	} else {
		a.className = 'note_unselected'; 
	}
}

//Fonction de la case 
function highlightTd(i){
	var td = getTd(i);
	var className = 'td_sudoku_selected';
	className += getStyleCoin(i); 
	td.className=className;		
	
}

function unHighlightTd(i){
	var td = getTd(i);
	var className = getStyleCoin(i); 	

	if (testCaseNote(i)){
		td.className='td_sudoku_note' + className;		
	} else if (getCase(i).value != 0 ) {
		td.className='td_sudoku_rempli' + className;
	} else  {
		td.className='td_sudoku_vide' + className;
	}	
}

//Fonction du selecteur
function afficheSelecteur(i){
	var selecteur = getSelecteur(i);
			
	if (selecteur == null){			
		var td = getTd(i);		
		selecteur = document.getElementById('selecteur').cloneNode(true);
		selecteur.id = 'selecteur_' + i;	
		td.appendChild(selecteur);
	}
	selecteur.style.display = 'block'
	highlightTd(i);
}

function cacheSelecteur(i){
	var selecteur = getSelecteur(i);
		
	if (selecteur){
		selecteur.style.display = 'none';
	}
	unHighlightTd(i);
}

//Fonction sur les notes
function afficheNote(i){
	var j;
	var note = getNote(i);
	if (note == null){
		var td = getTd(i);
		note = document.getElementById('note').cloneNode(true);
		note.id = 'note_' + lastCaseClicked;	
		td.appendChild(note);

		case_i = getCase(i);
		if (case_i.value[0] == 'n'){
			for (j=1; j<case_i.value.length; j++){
				switchStyleCaseNote(i,case_i.value[j]);					
			}
		}
	}
	note.style.display = 'block';		
	highlightTd(i);
}

function cacheNote(i){
	var note = getNote(i);
	

	if (note){
		note.style.display = 'none';
	}

	unHighlightTd(i);
}

function testCaseNote(i){
	var case_i = getCase(i);
	return (case_i.value.substring(0,1) == 'n');
}

function recupNote(i){
	var result = "";
	var note = getNote(i);
	if (note == null){
		return result;
	}
	var tds = note.getElementsByTagName("a");
	for (i=0; i<9; i++){
		
		if (tds[i].className == 'note_selected'){
			result += "" + (i+1);
		} else {
			result += "&nbsp;";
		}
		if (i%3 == 2) {
			result += "<br/>";
		}
	}
	return result;
}

function recupContentNote(i){
	var result = "";
	var note = getNote(i);
	if (note == null){
		return result;
	}
	var tds = note.getElementsByTagName("a");
	for (i=0; i<9; i++){
		if (tds[i].className == 'note_selected'){
			result += "" + (i+1);
		} 
	}
	if (result != ""){
		result = "n" + result;
	}

	return result;
}

//Les évènements
function onCaseClicked(i){
	if ( lastCaseClicked != i && lastCaseClicked != -1){
		cacheSelecteur(lastCaseClicked);		
		cacheNote(lastCaseClicked);	
	}	

	lastCaseClicked = i;
	
	/*if (testCaseNote(lastCaseClicked)){
		afficheNote(lastCaseClicked);		
	}  else {*/
		afficheSelecteur(lastCaseClicked);
	//}
}

function onContextClicked(event,i){
	if ( lastCaseClicked != i && lastCaseClicked != -1){
		cacheSelecteur(lastCaseClicked);		
		cacheNote(lastCaseClicked);	
	}	

	lastCaseClicked = i;
	afficheNote(lastCaseClicked);		
	stopEventPropagation(event);	
	return false;
}

function onNumeroSelection(event,num){

	var span = getSpan(lastCaseClicked );
	var case_i = getCase(lastCaseClicked );
	
	if (num == 0){
		span.innerHTML = "";
		case_i.value = "";
	} else {
		span.innerHTML  = num;
		case_i.value = num;
	}	
	cacheSelecteur(lastCaseClicked);	
	sendNumberToServer(lastCaseClicked);	
	
	verifFlash();
	
	stopEventPropagation(event);	
	return false;
}

function onNoteClicked(event){
	cacheSelecteur(lastCaseClicked);
	afficheNote(lastCaseClicked);
	stopEventPropagation(event);		
}

function onNumeroNoteClicked(event,i){
	switchStyleCaseNote(lastCaseClicked,i);	
	stopEventPropagation(event);
}

function onVideNoteClicked(event){
	var note = getNote(lastCaseClicked);
	if (note == null){
		return;
	}
	var tds = note.getElementsByTagName("a");
	for (i=0; i<9; i++){
		tds[i].className = 'note_unselected';
	}
	cacheNote(lastCaseClicked);
	var span = getSpan(lastCaseClicked);
	span.innerHTML = '';
	var case_i = getCase(lastCaseClicked);
	case_i.value= '';
	
	unHighlightTd(lastCaseClicked);
	afficheSelecteur(lastCaseClicked);
	stopEventPropagation(event);
}

function onNoteOkCliked(event){
	cacheNote(lastCaseClicked);
	
	var span_content = '';
	var case_content = '';
	var span;
	if (recupContentNote(lastCaseClicked)){	
		span_content = recupNote(lastCaseClicked);
		case_content = recupContentNote(lastCaseClicked);
	} 
	
	span = getSpan(lastCaseClicked);
	span.innerHTML = span_content;
	
	var case_i = getCase(lastCaseClicked);
	case_i.value= case_content;
	
	unHighlightTd(lastCaseClicked);
	sendNumberToServer(lastCaseClicked);		
	stopEventPropagation(event);	
}

function onCloseSelection(event){
	cacheSelecteur(lastCaseClicked);
	cacheNote(lastCaseClicked);
	stopEventPropagation(event);
}

function sendNumberToServer(i){
	var case_i = getCase(i).value;
	var xhr_object = null; 

	if(window.XMLHttpRequest) {
		// Firefox 
		xhr_object = new XMLHttpRequest(); 
	} else if(window.ActiveXObject) {
		// Internet Explorer 
		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		//pas pris en charge ...
		return;
	} 
	
	xhr_object.open("GET", "sudoku-save.php?case_number=" + i + "&value=" + case_i, false); 
	xhr_object.send(null); 

}

//Clignotement

var tableau_clignote = [];
var grille_sudoku = [];
var case_double = [];

function detect_doublon_in_case(array_case){
	var i;
	var doublon = [];
	
	for(i=0; i<9; i++){
		var case_num = array_case[i];
		if (isNaN(grille_sudoku[case_num])){
			continue;
		}
		if (doublon[grille_sudoku[case_num]] != undefined){
			case_double.push(doublon[grille_sudoku[case_num]]);
			case_double.push(case_num);
		}
		doublon[grille_sudoku[case_num]] = case_num;
	}
}

function detect_doublon_in_line(line_number){
	var i;
	var array_case = [];
	
	for(i=0; i<9; i++){
		array_case.push(i + line_number*9);
	}
	detect_doublon_in_case(array_case)
}

function detect_doublon_in_colonne(col_number){
	var i;
	var array_case = [];
	
	for(i=0; i<9; i++){
		array_case.push(9*i+col_number);
	}
	detect_doublon_in_case(array_case)
}

function detect_doublon_in_bloc(bloc_number){
	var i;
	var array_case = [];
	
	for(i=0; i<3; i++){
		for(j=0; j<3; j++){
			array_case.push((i + (bloc_number%3 * 3)+(j*9 + (Math.floor(bloc_number/3)) * 3*  9) ));
		}
	}
	detect_doublon_in_case(array_case)
	
}


function detect_error(){
	var i;
	setCaseColor("white");
	tableau_clignote = [];

	grille_sudoku = [];
	for (i=0; i<81; i++){
		grille_sudoku.push(getCaseNumber(i));
	}

	case_double = [];
	
	for (i=0; i < 9; i++){
		detect_doublon_in_line(i);
		detect_doublon_in_colonne(i);
		detect_doublon_in_bloc(i);
	}
	
	if (case_double.length == 0){
		return false;
	}
	
	tableau_clignote = [];

	for(i=0; i<case_double.length;i++){
		tableau_clignote.push( document.getElementById("td_"+case_double[i]));
	}
	setCaseColor("#F8CCF4");
	return true;
	
}


function verifFlash(){
	
	if (detect_error()){
		return;
	}
	tableau_clignote = [];

	
	if (isGrilleFini()){
		for (i=0; i<81; i++){
			tableau_clignote.push(document.getElementById("td_"+i));
		}
	}
	
	var number = getCaseNumber(lastCaseClicked);
	if (countNumber(number) == 9){
		flashNum(number);
	}
	
	var ligne = getLigneFromCase(lastCaseClicked);
	if (isLigneCompleted(ligne)){
		flashLigne(ligne);
	}
	
	var colone = getColonneFromCase(lastCaseClicked);
	if (isColonneCompleted(colone)){
		flashColonne(colone);
	}
	
	var bloc = getBlocFromCase(lastCaseClicked);
	if (isBlockCompleted(bloc)){
		flashGroupe(bloc);
	}
	
	flash();
}

function getLigneFromCase(caseNum){
	return Math.floor(caseNum/9);
}

function getColonneFromCase(caseNum){
	return caseNum % 9;
}

function getBlocFromCase(caseNum){
	return Math.floor(Math.floor(caseNum / 9)/3) * 3  + Math.floor(( caseNum % 9 ) / 3 ) ;
}

function isGrilleFini(){
	var nbNumber = 0;
	for(i=0; i<81; i++){
		if(! isNaN(getCaseNumber(i ))){
			nbNumber ++;
		}
	}
	return nbNumber == 81;
}

function isBlockCompleted(bloc){
	var nbNumber = 0;
	
	var col = Math.floor(bloc / 3);
	var ligne = bloc % 3;
	for(i=0; i<3; i++){
		for(j=0; j<3; j++){
			var casenumber = i + j*9 + ligne*3 + col*27;
			if(! isNaN(getCaseNumber(casenumber))){
				nbNumber ++;
			}
		}
	}
	return nbNumber == 9;
}

function isLigneCompleted(ligne){
	var nbNumber = 0;
	for(i=0; i<9; i++){
		if(! isNaN(getCaseNumber(i + ligne*9))){
			nbNumber ++;
		}
	}
	return nbNumber == 9;
}

function isColonneCompleted(colonne){
	var nbNumber = 0;
	for(i=0; i<9; i++){
		if(! isNaN(getCaseNumber(i*9 + colonne))){
			nbNumber ++;
		}
	}
	return nbNumber == 9;
}

function countNumber(number){
	var nbNumber = 0;
	for(i=0; i<81; i++){
		if(getCaseNumber(i) == number){
			nbNumber ++;
		}
	}
	return nbNumber;
}


function setCaseColor(backgroundcolor){
	for (i=0; i< tableau_clignote.length;i++){
		tableau_clignote[i].style.backgroundColor = backgroundcolor;
	}
}

function getIntermediatePrimaryColor(depart,arrive,total,pas){
	if (pas == total){
		return arrive;
	}
	depart = parseInt(depart,16);
	arrive = parseInt(arrive,16);
	value = depart + Math.ceil((arrive - depart) / total) * pas; 
	if (value < 16){
		return "0" + value.toString(16);
	}
	return value.toString(16);
}

function getIntermediateColor(color_depart,color_arrive,total,pas){

	RedDepart = color_depart.substring(0,2);
	GreenDepart = color_depart.substring(2,4);
	BlueDepart = color_depart.substring(4,6);

	RedArrive = color_arrive.substring(0,2);
	GreenArrive = color_arrive.substring(2,4);
	BlueArrive = color_arrive.substring(4,6);

	RedIntermediate = getIntermediatePrimaryColor(RedDepart,RedArrive,total,pas);
	GreenIntermediate = getIntermediatePrimaryColor(GreenDepart,GreenArrive,total,pas);
	BlueIntermediate = getIntermediatePrimaryColor(BlueDepart,BlueArrive,total,pas);
	
	return "#" + RedIntermediate + GreenIntermediate + BlueIntermediate;
	
}

function flash(){
	color_depart = "FFFFFF";
	color_arrive = "6633FF";

	time_interm = 100;
	
	nb_etape = 5;
	pas =  Math.ceil((color_arrive - color_depart)  / nb_etape);

	test = "";
	for (var i = 0; i <= nb_etape; i++){
		color = getIntermediateColor(color_depart,color_arrive,nb_etape,i)	
		fn = 'setCaseColor("'+color+'")';
		test += "  " + color;
		setTimeout(fn,time_interm*i);			
	}		
	for (var i = 0; i <= nb_etape; i++){
		color = getIntermediateColor(color_arrive,color_depart,nb_etape,i)	
		fn = 'setCaseColor("'+color+'")';
		test += "  " + color;
		setTimeout(fn,time_interm*nb_etape+time_interm*i);			
	}
}

function flashGrille(){
	for(i=0; i<81; i++){
		tableau_clignote.push( document.getElementById("td_"+i));
	}
}

function flashLigne(nb_ligne){
	
	for(i=0; i<9; i++){
		tableau_clignote.push( document.getElementById("td_"+(i+9*nb_ligne)));
	}
}


function flashColonne(nb_colonne){
	for(i=0; i<9; i++){
		tableau_clignote.push( document.getElementById("td_"+(9*i+nb_colonne)));
	}
}

function flashGroupe(nb_groupe){
	for(i=0; i<3; i++){
		for(j=0; j<3; j++){	
			tableau_clignote.push( document.getElementById("td_"+( (i + (nb_groupe%3 * 3)+(j*9 + (Math.floor(nb_groupe/3)) * 3*  9) )) ) );
		}
	}
}

function flashNum(num){
	for(i=0; i<81; i++){
		if (getCaseNumber(i) == num){
			tableau_clignote.push(document.getElementById("td_" + i));
		}
	}
}

function detect_error_if_needed(){
	ts = document.getElementById("tableau_sudoku");
	if (ts != undefined){
		detect_error();
	}
}

if ( document.addEventListener ) {
	document.addEventListener( "DOMContentLoaded", detect_error_if_needed, false );
} else if ( document.attachEvent ) {
	document.attachEvent("onreadystatechange", detect_error_if_needed);
}
		
