/******************************************
 * Nom du script : picross.js             *
 * Version : 1.4                          *
 * Auteur : Antoine Bobin -= Bobinours =- *
 * URL: http://bobin.underlands.org       *
 * Creer : 07/01/2004                     *
 * Modif : 02/02/2004                     *
 ******************************************/


// Pre-chargement

var tPreloadImages = new Array("images/case.png", "images/case-contour.png", "images/case-creusee.png", "images/case-croix.png", "images/case-perdu.png", "images/pix.png");

function preloadImage()
{
    var tImg = new Array();
    for (i=0; i<tPreloadImages.length; i++) {
        tImg[i] = new Image();
        tImg[i].src = tPreloadImages[i];
    }
}



// Jeu Pic-Rose

function picRose(leForm)
{
    var grilleTaille = leForm["grilleDimension"].value;

    var casesNbLignes   = Number(grilleTaille);
    var casesNbColonnes = Number(grilleTaille);

    var chiffresNbLignes   = Math.ceil(casesNbLignes / 2);
    var chiffresNbColonnes = Math.ceil(casesNbColonnes / 2);

    var casesCreuses = 0;
    var casesCreusesDecouvertes = 0;

    var tCases = new Array();

    var oChrono;

    var toucheCodeAncien;


    function cCurseur (posX, posY)
    {
        this.posX = posX;
        this.posY = posY;
        this.posXancien = posX;
        this.posYancien = posX;
    }

    var oCurseur = new cCurseur(1, 1);



    // cChronometre

    function cChronometre(divChrono, divPenalite, minutes, secondes)
    {
        var divChrono = divChrono;
        var divPenalite = divPenalite;
        var minutes = minutes;
        var secondes = secondes;
        var penalites = new Array(2, 4, 8, 10, 12, 15, 20, 30, 60);

        this.timer;

        var self = this;


        this.demarrer = function()
        {
            // Initialisation du calque
            divChrono.innerHTML = this.temps();

            this.timer = setInterval("oPicRose.get_oChrono().decrementer()", 1000);
        }


        this.temps = function()
        {
            return (minutes < 10 ? "0" + minutes : minutes) + ":"+ (secondes < 10 ? "0" + secondes : secondes);
        }


        this.decrementer = function()
        {
            secondes--;

            if (secondes < 0 || minutes < 0) {
                if (minutes <= 0) {
                    divChrono.innerHTML = "00:00";

                    finDuTemps();
                    return;
                }

                minutes--;
                secondes = 59;
            }

            // Modification du calque
            divChrono.innerHTML = this.temps();
        }


        this.penaliser = function()
        {
            minutes -= penalites[0];
            divPenalite.innerHTML = "- " + penalites[0];
            divPenalite.style.visibility = "visible";
            setTimeout('oPicRose.get_oChrono().cacherPenalite()', 1500);
            penalites.shift();
        }

        this.cacherPenalite = function()
        {
            divPenalite.style.visibility = "hidden";
        }

        this.terminer = function() {
            minutes = 0;
            secondes = 0;
            clearInterval(this.timer);
        }
    }

    this.get_oChrono = function() {
        return oChrono;
    }


    // cCase

    function cCase(divCase, numLigne, numColonne, creuse)
    {
        this.divCase = divCase;
        this.numLigne = numLigne;
        this.numColonne = numColonne;
        this.creuse = creuse;
        this.etat = 'normale'; // "creusee", "marquee", "perdu", "normale"

        var self = this;


        this.ajoutEvenements = function()
        {
            if (document.addEventListener) { // DOM
                divCase.addEventListener('mouseup', quadrillageCaseClick, false);
                divCase.addEventListener('mouseover', quadrillageCaseMouseOver, false);
                divCase.addEventListener('mouseout', quadrillageCaseMouseOut, false);
                //this.addEventListener('contextmenu', Function("return false"), false);
            }
            else if (document.attachEvent) { // IE
        	    divCase.attachEvent('onmouseup', quadrillageCaseClick);
        	    divCase.attachEvent('onmouseover', quadrillageCaseMouseOver);
        	    divCase.attachEvent('onmouseout', quadrillageCaseMouseOut);
                divCase.attachEvent('oncontextmenu', Function("return false")); // IE - Context Menu
        	}
        }


        this.suppressionEvenements = function()
        {
            if (document.removeEventListener) { // DOM
                divCase.removeEventListener('mouseup', quadrillageCaseClick, false);
                divCase.removeEventListener('mouseover', quadrillageCaseMouseOver, false);
                divCase.removeEventListener('mouseout', quadrillageCaseMouseOut, false);
            }
            else if (document.detachEvent) { // IE
        	    divCase.detachEvent('onmouseup', quadrillageCaseClick);
        	    divCase.detachEvent('onmouseover', quadrillageCaseMouseOver);
        	    divCase.detachEvent('onmouseout', quadrillageCaseMouseOut);
        	}
        }


        this.creuser = function()
        {
            if (!this.creuse) {
                quadrillageCasePerdu(this);
            }
            else { // case vide : on creuse
                quadrillageCaseCreuserOK(this);
            }
        }


        this.marquer = function()
        {
            if (divCase.className == 'over' || divCase.className == 'defaut') {
                divCase.className = 'croixOver';
            }
            else if (divCase.className == 'croix' || divCase.className == 'croixOver') {
                divCase.className = 'over';
            }

            this.etat = 'marquee';
        }
    }


    function quadrillageCaseAjouter(oTd, numLigne, numColonne)
    {
        var rand;
        if (casesNbLignes < 10)
        {
            rand = Math.round(Math.random());
        }
        else if (casesNbLignes < 15)
        {
            rand = Math.random();
            if (rand < 0.4) {
                rand = 0;
            }
            else {
                rand = 1;
            }
        }
        else if (casesNbLignes < 20)
        {
            rand = Math.random();
            if (rand < 0.3) {
                rand = 0;
            }
            else {
                rand = 1;
            }
        }
        else
        {
            rand = Math.random();
            if (rand < 0.2) {
                rand = 0;
            }
            else {
                rand = 1;
            }
        }

        if (rand) {
            casesCreuses++;
        }

        var oCase = new cCase(oTd, numLigne, numColonne, rand);
        // Evenements
        oCase.ajoutEvenements();

        return oCase;
    }


    function get_caseEvenement(e)
    {
        if (!e) {
            if( window.event ) { // DOM
                e = window.event;
            } else { // ERREUR
                return false;
            }
        }
        return e;
    }


    function get_caseCible(e, oCible)
    {
        e = get_caseEvenement(e);

        if (!oCible) {
            if (e.currentTarget) {
                oCible = e.currentTarget;
            }
            else if (e.srcElement) {
                oCible = e.srcElement;
                if (oCible.nodeName && oCible.nodeName == 'IMG') {
                    oCible = oCible.parentNode;
                }
            } else { // ERREUR
                return false;
            }
        }
        return oCible;
    }

    function quadrillageCaseClick(e, oCible)
    {
        e = get_caseEvenement(e);
        if (!e) return false;
        oCible  = get_caseCible(e, oCible);
        if (!oCible) return false;

        if (typeof(e.which) == 'number') { //  Compatibles Netscape
            btn = e.which;
        } else {
            if (typeof(e.button) == 'number') { // DOM
                 btn = e.button;
             } else { // ERREUR
                return false;
             }
        }

        // Verification de la cellule
        var numLigne = oCible.parentNode.rowIndex + 1 - chiffresNbLignes; // Prise en compte des lignes des chiffres
        var numColonne = oCible.cellIndex + 1 - chiffresNbColonnes; // Prise en compte des colonnes des chiffres
        var oCase = tCases[numLigne][numColonne];

        if (btn == 1) {
            oCase.creuser();
        }
        else { // 2 pour IE ou 3 pour Moz
            oCase.marquer();
        }
    }


    function quadrillageCaseCreuserOK(oCase)
    {
        var oCible = oCase.divCase;

        if (oCible.className == 'over') {
            oCible.className = 'creusee';
            //oCible.innerHTML = "ok";
        }
        else if (oCible.className == 'croix' || oCible.className == 'croixOver') {
            if (!confirm(String.fromCharCode(202) +"tes vous s"+  String.fromCharCode(251) +"r de vouloir creuser cette case ?")) {
                return false;
            }
            oCible.className = 'creusee';
        }

        oCase.etat = 'creusee';
        casesCreusesDecouvertes++;
        if (casesCreusesDecouvertes == casesCreuses) {
            gagnerPartie();
        }

        // Suppression des evenements
        oCase.suppressionEvenements();
    }


    function quadrillageCasePerdu(oCase)
    {
        var oCible = oCase.divCase;

        if (oCible.className == 'croix' || oCible.className == 'croixOver') {
            if (!confirm(String.fromCharCode(202) +"tes vous s"+  String.fromCharCode(251) +"r de vouloir creuser cette case ?")) {
                return false;
            }
        }

        oCible.className = 'perdu';
        oCase.etat = 'perdu';

        // Decrementation du temps avec les penalites
        oChrono.penaliser();

        // Suppression des evenements
        oCase.suppressionEvenements();
    }


    function quadrillageCaseMouseOver(e, oCible)
    {
        e = get_caseEvenement(e);
        if (!e) return false;
        oCible  = get_caseCible(e, oCible);
        if (!oCible) return false;

        if (oCible.className == 'defaut') {
            oCible.className = 'over';
        }
        else if (oCible.className == 'croix') {
            oCible.className = 'croixOver';
        }
    }


    function quadrillageCaseMouseOut(e, oCible)
    {
        e = get_caseEvenement(e);
        if (!e) return false;
        oCible  = get_caseCible(e, oCible);
        if (!oCible) return false;

        if (oCible.className == 'over') {
            oCible.className = 'defaut';
        }
        else if (oCible.className == 'croixOver') {
            oCible.className = 'croix';
        }
    }


    function gagnerPartie()
    {
        clearInterval(oChrono.timer);

        alert("F"+  String.fromCharCode(233) +"licitations ! Vous avez gagn"+ String.fromCharCode(233) +" ! :-)\nTemps: "+ oChrono.temps());

        // Suppression des evenements
        for (i=1; i<=casesNbLignes; i++) {
            for (j=1; j<=casesNbColonnes; j++) {
                if (tCases[i][j].etat == "normale" || tCases[i][j].etat == "croix") {
                    tCases[i][j].suppressionEvenements();
                }
            }
        }
    }


    function finDuTemps()
    {
        alert("D"+  String.fromCharCode(233) +"sol"+  String.fromCharCode(233) +", vous avez perdu !\nLe temps s'est "+  String.fromCharCode(233) +"coul"+  String.fromCharCode(233) +".");

        // Suppression des evenements
        for (i=1; i<=casesNbLignes; i++) {
            for (j=1; j<=casesNbColonnes; j++) {
                if (tCases[i][j].etat == "normale" || tCases[i][j].etat == "croix") {
                    tCases[i][j].suppressionEvenements();
                }
            }
        }

        clearInterval(oChrono.timer);
    }


    function ChargementDuJeu()
    {
        var oDiv = document.getElementById('picross');
        oDiv.innerHTML = "";

        var oTable = document.createElement('table');
        oTable.id = 'quadrillage';
    	oTable.cellSpacing = 0;
    	//oTable.setAttribute("border","1");
    	oTable.setAttribute("align","center");
    	oTable.setAttribute("oncontextmenu", "return false;"); // Mozilla - Context Menu

        var oTbody = document.createElement("tbody");

        // Zone Haut
        for (i=1; i<=chiffresNbLignes; i++) {
            var oTr = document.createElement('tr');

            // Zone Vide
            for (j=1; j<=chiffresNbColonnes; j++) {
                var oTd = document.createElement('td');
                oTr.appendChild(oTd);
            }

            // Zone Chiffres
            for (j=1; j<=casesNbColonnes; j++) {
                var oTd = document.createElement('td');
                oTd.className = 'chiffre';
                var oTxt = document.createTextNode('');
                oTd.appendChild(oTxt);
                oTr.appendChild(oTd);
            }

        	oTbody.appendChild(oTr);
        }

        // Zone Bas
        for (i=1; i<=casesNbLignes; i++) {
            var oTr = document.createElement('tr');
            tCases[i] = new Array();

            // Zone Chiffres
            for (j=1; j<=chiffresNbColonnes; j++) {
                var oTd = document.createElement('td');
                oTd.className = 'chiffre';
                var oTxt = document.createTextNode('');
                oTd.appendChild(oTxt);
                oTr.appendChild(oTd);
            }

            // Zone quadrillage
            for (j=1; j<=casesNbColonnes; j++) {
                var oTd = document.createElement('td');
                oTd.className = 'defaut';

/*
                if ((j+4) % 5 == 0) {
                    oTd.className = 'defautBordee';
                }
*/

                var oImg = document.createElement('img');
                oImg.src = 'images/pix.png';
                oImg.className = 'imageCase';

                oTd.appendChild(oImg);
                oTr.appendChild(oTd);

                tCases[i][j] = quadrillageCaseAjouter(oTd, i, j);
            }
        	oTbody.appendChild(oTr);
        }

    	oTable.appendChild(oTbody);
        oDiv.appendChild(oTable);

        tCases[oCurseur.posY][oCurseur.posX].divCase.className = 'over';

        // HAUT
        //------


        // Initialisation du tableau des chiffres (Haut) a zero
        var tChiffresHaut = new Array(chiffresNbLignes);

        for (i=1; i<=chiffresNbLignes; i++) {
            tChiffresHaut[i] = new Array(casesNbColonnes);
            for (j=1; j<=casesNbColonnes; j++) {
                tChiffresHaut[i][j] = 0;
            }
        }


        // Calcule des chiffres Haut
        var indiceColonne = 1; // jusqu'a : casesNbColonnes;

        for (j=1; j<=casesNbColonnes; j++) {
            var indiceLigne = chiffresNbLignes;
            var ancienneValeur = "pleine";
            //tChiffresHaut[indiceLigne][indiceColonne] = 0;

            for (i=casesNbLignes; i>=1; i--) {
                if (tCases[i][j].creuse) {
                    tChiffresHaut[indiceLigne][indiceColonne]++;
                    ancienneValeur = "creuse";
                }
                else {
                    if (ancienneValeur == "creuse") {
                        indiceLigne--;
                    }
                    ancienneValeur = "pleine";
                }
            }
            indiceColonne++;
        }


        // Affichage des chiffres Haut
        for (i=0; i<chiffresNbLignes; i++) {
            var tCells = oTbody.rows[i].cells;
            for (j=chiffresNbColonnes; j<(chiffresNbColonnes+casesNbColonnes); j++) {
                var nombre = tChiffresHaut[i+1][j-chiffresNbColonnes+1];
                //if (nombre || nombre == 0) {
                if (nombre) {
                    var oTxt = document.createTextNode(nombre);
                    tCells[j].appendChild(oTxt);
                }
            }
        }


        // GAUCHE
        //--------


        // Initialisation du tableau des chiffres (Gauche) a zero
        var tChiffresGauche = new Array(casesNbLignes);

        for (i=1; i<=casesNbLignes; i++) {
            tChiffresGauche[i] = new Array(chiffresNbColonnes);
            for (j=1; j<=chiffresNbColonnes; j++) {
                tChiffresGauche[i][j] = 0;
            }
        }


        // Calcule des chiffres Gauche
        var indiceLigne = 1; // jusqu'a : casesNbLignes;

        for (i=1; i<=casesNbLignes; i++) {
            var indiceColonne = chiffresNbColonnes;
            var ancienneValeur = "pleine";
            //tChiffresGauche[indiceLigne][indiceColonne] = 0;

            for (j=casesNbColonnes; j>=1; j--) {
                if (tCases[i][j].creuse) {
                    tChiffresGauche[indiceLigne][indiceColonne]++;
                    ancienneValeur = "creuse";
                }
                else {
                    if (ancienneValeur == "creuse") {
                        indiceColonne--;
                    }
                    ancienneValeur = "pleine";
                }
            }
            indiceLigne++;
        }


        // Affichage des chiffres Gauche
        for (i=chiffresNbLignes; i<(chiffresNbLignes+casesNbLignes); i++) {
            var tCells = oTbody.rows[i].cells;
            for (j=0; j<chiffresNbColonnes; j++) {
                var nombre = tChiffresGauche[i-chiffresNbLignes+1][j+1];
                //if (nombre || nombre == 0) {
                if (nombre) {
                    var oTxt = document.createTextNode(nombre);
                    tCells[j].appendChild(oTxt);
                }
            }
        }

        // Gestion des Evenements
        if( document.captureEvents ) {
            //non IE
            if( Event.KEYDOWN ) {
                //NS 4, NS 6+, Mozilla 0.9+
                document.captureEvents( Event.KEYDOWN );
            }
        }

        document.onkeydown = toucheDown;
        document.onkeyup = toucheUp;


        // Debug
        //txt = '';
        //for (propriete in oChrono) {
        //    txt += propriete + ' : ' + oChrono[propriete] + "\n";
        //}
        //alert(txt);
    }


    // -------------------------------------------------------------------------


    function toucheDown(e)
    {
        toucheAppuyee(e);
    }


    function toucheUp(e)
    {
        //toucheAppuyee(e);
    }


    function toucheAppuyee_getCode(e)
    {
        if( !e ) {
            if( window.event ) {
                //DOM
                e = window.event;
            } else {
                //TOTAL FAILURE
                return false;
            }
        }

        var code;
        if( typeof( e.which ) == 'number' ) {
            //NS 4, NS 6+, Mozilla 0.9+, Opera
            code = e.which;
        } else if( typeof( e.keyCode ) == 'number'  ) {
            //IE, NS 6+, Mozilla 0.9+
            code = e.keyCode;
        } else if( typeof( e.charCode ) == 'number'  ) {
            //also NS 6+, Mozilla 0.9+
            code = e.charCode;
        } else {
            //TOTAL FAILURE
            return false;
        }
        return code;
    }

    function toucheAppuyee(e)
    {
        var code = toucheAppuyee_getCode(e);
        if (!code) { return false; }

        toucheCodeAncien;

        //var oDebug = document.getElementById("debuggeur");
        //oDebug.innerHTML += String.fromCharCode(code) + " - ";

        // Gauche
        if (code == 37) {
            oCurseur.posX--;
            if (oCurseur.posX < 1) {
                oCurseur.posX = 1;
            }
        }
        // Droite
        else if (code == 39) {
            oCurseur.posX++;
            if (oCurseur.posX > casesNbColonnes) {
                oCurseur.posX = casesNbColonnes;
            }
        }
        // Haut
        else if (code == 38) {
            oCurseur.posY--;
            if (oCurseur.posY < 1) {
                oCurseur.posY = 1;
            }
        }
        // Bas
        else if (code == 40) {
            oCurseur.posY++;
            if (oCurseur.posY > casesNbLignes) {
                oCurseur.posY = casesNbLignes;
            }
        }


        // Cases
        var oCase = tCases[oCurseur.posY][oCurseur.posX];
        var oCible = oCase.divCase;

        var oCaseAncien = tCases[oCurseur.posYancien][oCurseur.posXancien];
        var oCibleAncien = oCaseAncien.divCase;


        // Creuser
        if (code == 87) {
            if (oCase.etat == 'normale' || oCase.etat == 'marquee') {
                oCase.creuser();
            }
        }
        // Marquer
        else if (code == 88) {
            if (oCase.etat == 'normale' || oCase.etat == 'marquee') {
                oCase.marquer();
            }
        }


        // Focus sur la case
        if (oCible.className == 'defaut') {
            oCible.className = 'over';
        }
        else if (oCible.className == 'croix') {
            oCible.className = 'croixOver';
        }
        else if (oCible.className == 'perdu') {
            oCible.className = 'perduOver';
        }
        else if (oCible.className == 'creusee') {
            oCible.className = 'creuseeOver';
        }


        // Effacement du focus de l'ancienne case
        if (tCases[oCurseur.posYancien][oCurseur.posXancien].divCase && (oCurseur.posY != oCurseur.posYancien || oCurseur.posX  != oCurseur.posXancien))
        {
            if (oCibleAncien.className == 'over') {
                oCibleAncien.className = 'defaut';
            }
            else if (oCibleAncien.className == 'croixOver') {
                oCibleAncien.className = 'croix';
            }
            else if (oCibleAncien.className == 'perduOver') {
                oCibleAncien.className = 'perdu';
            }
            else if (oCibleAncien.className == 'creuseeOver') {
                oCibleAncien.className = 'creusee';
            }
        }

        oCurseur.posYancien = oCurseur.posY;
        oCurseur.posXancien = oCurseur.posX;

        return true;
    }

    ChargementDuJeu();

    // Chronometre
    oChrono = new cChronometre(document.getElementById("chronometre"), document.getElementById("chronometrePenalites"), 30, 0);
    oChrono.demarrer();

    // Bug Fixe
    if (casesNbColonnes > 15)
    {
        document.getElementById("chronometre").style.marginTop = '230px';
    }

 
    this.terminer = function() {
        oChrono.terminer();
    }
}