/* am.js

   Ambigram maker or ambigram generator
   (générateur évolué d'ambigrammes)

   (C) Jean-Paul Davalan 2006 <jpdvl@wanadoo.fr>
   All rights reserved worldwide.

   program location
   http://perso.wanadoo.fr/jean-paul.davalan/jeux/alpha/inv/am.js
   web page
   http://perso.wanadoo.fr/jean-paul.davalan/jeux/alpha/inv/index.html
   home page
   http://perso.wanadoo.fr/jean-paul.davalan/index.html
*/   

var WIDTH=24, HEIGHT=30, WIDTH2=12;
var Width=new Array(10, 12, 16, 20, 24, 30, 30);
var Height=new Array(16, 18, 20, 24, 30, 30, 40);
var Width2=new Array(6, 7, 8, 10, 12, 15, 15);
 
var tabCples = new Array();
var prefix="images/"

function whichChecked() {
  for (i=0;i<document.frm.taille.length;i++){
	if (document.frm.taille[i].checked){
          return i;
	}
  }
  return 3;
}

function setTaille() {
  var n = whichChecked();
   WIDTH=Width[n];
   HEIGHT=Height[n];
   WIDTH2=Width2[n];
}
function setCples() {
  alpha="abcdefghijklmnopqrstuvwxyz";
  for(var i=0; i<26;i++)
    for(var j=0; j<26;j++)
      tabCples[alpha.charAt(i)+"-"+alpha.charAt(j)]=1;
  for(var i=0; i< multi.length;i++)
    tabCples[multi[i]]=1;
/*
  var s="";
  for(var u in tabCples) {
     s += u+" ";
  }
  alert(s);
*/
//  alert(tabCples["o-er"]);
}

setCples();


function rev(s) {
  if(s==null) return null;
  var t="";
  for(var i=0;i<s.length;i++)
    t = s.charAt(i)+t;
  return t;
}

function solutions(orig, s0, s1, nb) {
   this.orig = orig;
   this.n=0;
   this.nb=nb;
   this.sols=new Array();
   for(var i=0;i<2;i++) this.sols[i]=new Array();
   var t0=new Array();
   var t1=new Array();
   this.s0=s0;
   this.lg0 = this.s0.length;
   this.s1a = s1;
   this.s1=rev(s1);
   this.lg1 = this.s1.length;
  
  function resolv(a, b, t0, t1) {
    //alert(a+" "+b+"\n"+t0+"\n"+t1)
  //  alert(this.s0);
    if(a>= this.lg0 && b>= this.lg1 && t0 !=null) { // solution
      this.sols[0].push(t0);
      this.sols[1].push(t1);
      this.n++;
      return;
    } else if(a>=this.s0.length || b>=this.s1.length) { // pas de solution
      //alert(t0);
      return;
    } else  if(this.s0.charAt(a)==" ") {
    // alert("/// "+a);
      var tt0=new Array();
      for(var i=0;i<t0.length;i++) tt0[i]=t0[i];
      tt0.push("B");
      this.resolv(a+1, b, tt0, t1);
      //t0.push("B");this.resolv(a+1, b, t0, t1);
    } else if(this.s1.charAt(b)==" ") {
      var tt1=new Array()
      for(var i=0;i<t1.length;i++) tt1[i]=t1[i];
      tt1.push("B");
      //this.resolv(a, b+1, t0, tt1);
//     alert("+++ "+b);
      t1.push("B");this.resolv(a, b+1, t0, t1);
    } else {
     
      var u0=this.s0.charAt(a);
      var v0= this.s1.charAt(b);
      var u1=null, v1=null;
      var tt0=new Array(), tt1=new Array();
      var l0=t0.length, l1=t1.length;

      for(var i=0;i<l0;i++) tt0[i]=t0[i];
      for(var i=0;i<l1;i++) tt1[i]=t1[i];
      if(a+1< this.lg0 && this.s0.charAt(a+1)!=" ") {
         u1= this.s0.charAt(a+1);
      }
      if(b+1<this.lg1 && this.s1.charAt(b+1)!=" ") {
         v1= this.s1.charAt(b+1);
      }
      if(u1 !=null && v1 !=null) {
        var s0=u0+u1+"-"+v1+v0;
        var s1=v1+v0+"-"+u0+u1;
        //alert("1) "+s0+" "+s1);
        if(tabCples[s0]==1) {
          tt0[l0]=s0;
          tt1[l1]=s1;
          this.resolv(a+2, b+2, tt0, tt1);
        }
      }
      if(u1 !=null) {
        var s0=u0+u1+"-"+v0, s1=v0+"-"+u0+u1;
        //alert("2) "+s0+" "+s1);
        if(tabCples[s0]==1) {
          tt0[l0]=s0;
          tt1[l1]=s1;
          this.resolv(a+2, b+1, tt0, tt1);
        }
      }
      if(v1 !=null) {
        var s0=u0+"-"+v1+v0;
        var s1=v1+v0+"-"+u0;
        //alert("3) "+s0+" "+s1);
        if(tabCples[s0]==1) {
          tt0[l0]=s0;
          tt1[l1]=s1;
          this.resolv(a+1, b+2, tt0, tt1);
        }
      }
      if(1) {
        var s0=u0+"-"+v0, s1=v0+"-"+u0;
        //alert("4) "+s0+" "+s1);
        if(tabCples[s0]==1) {
          tt0[l0]=s0;
          tt1[l1]=s1;
          this.resolv(a+1, b+1, tt0, tt1);
        }
      }
    }
  }
  this.resolv=resolv;
  
  this.resolv(0, 0, t0, t1);
//  alert(this.sols[0].length)
  function affiche(dv, n) {
    setTaille();
    var sA="<br /><hr><br />",s="", k=0;
    sA += this.orig+"<br />";
   // alert(this.sols[0][n]);
    if(this.sols[0].length>1) {
      sA += "<br /><span class='b' onclick='nextsol(\""+dv+"\",1)'>[CLIQUEZ] Solution "+(n+1)+" /"+this.sols[0].length+"</span><br />";
    }
    sA +='<div style="background:#eeeeff;"><br />'
    var coeff=1
    //var WIDTH=30, HEIGHT=30, WIDTH2=15;

    for(var i=0; i<this.sols[0][n].length; i++) {
       if(this.sols[0][n][i] != "B")
       s += '<img src="'+prefix+this.sols[0][n][i]+'.png" width="'+WIDTH+'" height="'+HEIGHT+'" alt="">'
       else
       s += '<img src="'+prefix+this.sols[0][n][i]+'.png" width="'+WIDTH2+'" height="'+HEIGHT+'" alt="">'
       k++;
       if(k>12&&this.sols[0][n][i]=="B") {
        // s +='<br />';
         k=0;
       }
    }
    s +="<br />";
    if(this.nb==2) {
      s +="<br />";
      k=0;
      for(var i=this.sols[1][n].length-1; i>=0; i--) {
        if(this.sols[1][n][i] != "B") {
        s += '<img src="'+prefix+this.sols[1][n][i]+'.png" width="'+WIDTH+'" height="'+HEIGHT+'" alt="">'
      } else {
        s += '<img src="'+prefix+'B.png" width="'+WIDTH2+'" height="'+HEIGHT+'" alt="">'
      }
      k++;
      if(k>12&&this.sols[1][n][i]=="B") {
        // s +='<br />';
         k=0;
      }
    }
    s +="<br />";

    }
    sA +=s;
    sA += '<br /></div>'+this.s0+"<br />";
    if(this.s1a != null && this.s1a!="" && this.s1a!=this.s0)
      sA += this.s1a+"<br />";
    sA += '<hr /><br />'
    document.getElementById(dv).innerHTML=sA;
    writeExtern(s);
  }
  this.affiche=affiche;

}

function change(u) {
     var s=u, v;
     do {
     v=s;
     s=s.replace(/\!\?\$/g," ");
     s = s.replace(/[´¸]/ig,"z");
     s=s.replace(/[×]/ig,"x");
     s=s.toLowerCase();
     s=s.replace(/\s+/g," ");
     s=s.replace(/^\s+/g,"");
     s=s.replace(/\s+$/g,"");
     s=s.replace(/[éèêë]/ig,"e");
     s=s.replace(/[ìîï]/ig,"i");
     s=s.replace(/[àâäãäå]/ig,"a");
     s=s.replace(/[æ]/ig,"ae");
     s=s.replace(/[½]/ig,"oe");
     s=s.replace(/[ùûü]/ig,"u");
     s=s.replace(/[ðôöõ]/ig,"o");
     s=s.replace(/[ð]/ig,"d");
     s=s.replace(/[ñ]/ig,"n");
     s=s.replace(/[ç]/ig,"c");
     s=s.replace(/[ýÿ]/ig,"y");
     s=s.replace(/[^\sa-z]+/g,"");
     }while(s!=v);
     //alert(s);
     do {
       v=s;
       s = s.replace(/[^a-z]/g," ");
       s = s.replace(/[\s+]/g," ");
     }while(s!=v);
     //alert(s);
     return s;
}

var ambig=null;

var nosol=-1;

function cherche(dv) {
  document.getElementById(dv).innerHTML="";
  var u,sa=document.frm.ar.value, sorig;
  do {
    u=sa;
    sa=sa.replace(/\n/g," ");
    sa=sa.replace(/\s+/g," ");
    sa=sa.replace(/^\s+/g,"");
    sa=sa.replace(/\s+$/g,"");
  } while(u!=sa);
  sorig=sa;
  var stab=sa.split(/[-;]{3,}/g);
  if(stab.length==0) return;
  for(var i=0; i<stab.length;i++) {
    stab[i]=change(stab[i]);
 //   alert(stab[i]);
  }
  var nb=2 ; 
  if(stab.length==1 || stab[1]==null || stab[1]=="") {
    stab[1]=stab[0];
    nb=1;
  }
  if(ambig!=null) delete ambig;
  ambig=new solutions(sorig,stab[0],stab[1], nb);
/*
  for(var i=0 ; i< ambig.sols.length; i++) {
     ambig.affiche(i);
     alert(ambig.sols[0][i]);
  }
 */
  if(ambig.sols[0].length>0) {
    ambig.affiche(dv,0);
    nosol=0;
  } else {
    nosol=-1;
  }
}

function efface(dv) {
  document.getElementById(dv).innerHTML="";
  document.frm.ar.value="";
}

function nextsol(dv, k) {
  if(nosol==-1) {
    if(ambig==null) cherche(dv);
    return;
  }
  nosol +=k;
  //alert(nosol+"-"+ambig.sols[0].length);
  if(nosol>=ambig.sols[0].length) nosol=0;
  else if(nosol<0) nosol=ambig.sols[0].length-1;
  ambig.affiche(dv, nosol);
}

var exStrS= new Array(
"Bis repetita placent", "Les choses répétées plaisent",
"De minimis non curat praetor", "le prêteur ne s'occupe pas de petites affaires",
"Errare humanum est", "Il est dans la nature de l'homme de se tromper",
"Ex nihilo nihil", "Rien [ne vient] de rien",
"Fiat lux", "Que la lumière soit",
"Fluctuat nec mergitur", "Il est battu par les flots, mais ne sombre pas",
"Homo hominis lupus", "L'homme est un loup pour l'homme",
"In vino veritas", "La vérité dans le vin",
"Ira furor brevis est","La fureur est une courte folie",
"Jus est ars boni et aequi", "Le droit est l'art du bien et du juste",
"Labor omnia vincit improbus", "Le travail opiniâtre vient à bout de tout",
"Mens sana in corpore sano", "Âme saine dans un corps sain",
"Natura non facit saltus", "La nature ne fait pas de sauts",
"Nolens, volens", "Ne voulant pas, voulant",
"Non bis in idem", "Non deux fois pour la même chose",
"Non licet omnibus adire Corinthum", "Il n'est pas donné à tout le monde d'aller à Corinthe",
"Non nova, sed nove", "Non pas des choses nouvelles, mais d'une manière nouvelle",
"Nunc est bibendum", "C'est maintenant qu'il faut boire",
"Oderint, dum metuant", "Qu'ils me haïssent,"+" pourvu qu'ils me craignent",
"O fortunatos nimium,"+" sua si bona norint,"+" agricolas !", "Trop heureux les hommes des champs s'ils connaissent leur bonheur !",
"Omnia vincit amor", "L'amour triomphe de tout",
"O tempora ! o mores !", "Ô temps, ô moeurs !",
"Panem et circenses", "Du pain et des jeux",

"A beau mentir qui vient de loin",
"À bon chat, bon rat",
"Abondance de biens ne nuit pas",
"À chaque jour suffit sa peine",
"À coeur vaillant rien d'impossible",
"L'air ne fait pas la chanson",
"À l'impossibilité nul n'est tenu",
"À l'oeuvre on connaît l'ouvrier",
"À l'oeuvre on connaît l'artisan",
"À méchant ouvrier, point de bon outil",
"À père avare, fils prodigue",
"L'appétit vient en mangeant",
"Après la pluie, le beau temps",
"À quelque chose malheur est bon",
"L'argent n'a pas d'odeur",
"À tout seigneur, tout honneur",
"Au royaume des aveugles, les borgnes sont rois",
"Autant en emporte le vent",
"Aux grands maux les grands remèdes",
"Bien faire et laisser dire",
"Bien mal acquis ne profite jamais",
"Bon sang ne saurait mentir",
"Charité bien ordonnée commence par soi même",
"Les bons comptes font les bons amis",
"C'est en forgeant qu'on devient forgeron",
"C'est l'hôpital qui se moque de la Charité",
"Charité bien ordonnée commence par soi-même",
"Chat échaudé craint l'eau froide",
"Le chat parti, les souris dansent",
"Les chiens aboient, la caravane passe",
"Chose promise, chose due",
"Comme on fait son lit, on se couche",
"Les conseilleurs ne sont pas les payeurs",
"Les cordonniers sont les plus mal chaussés",
"De la discussion jaillit la lumière",
"Deux avis valent mieux qu'un",
"L'exception confirme la règle",
"Faute de grives, on mange des merles\n---\nVous attraperez la grippe aviaire",
"La fin justifie les moyens",
"La fortune vient en dormant",
"Fais ce que dois, advienne que pourra",
"Les grandes douleurs sont muettes",
"L'habit ne fait pas le moine",
"Il n'y a pas de sot métier",
"Les jours se suivent et ne se ressemblent pas",
"La nuit porte conseil",
"Pas de nouvelles, bonnes nouvelles",
"Pierre qui roule n'amasse pas mousse",
"Qui sème le vent récolte la tempête",
"Qui va à la chasse perd sa place",
"Rira bien qui rira le dernier",
"Tant va la cruche à l'eau qu'à la fin elle se casse",
"Tout les goûts sont dans la nature",
"Toute peine mérite salaire",
"Toute vérité n'est pas bonne à dire",
"Un de perdu, dix de retrouvés",
"Une hirondelle ne fait pas le printemps",
"Un homme averti en vaut deux",
"Un mauvais arrangement vaut mieux qu'un bon procès",
"Un tiens vaut mieux que deux tu l'auras",
"Ventre affamé n'a point d'oreilles");

var nexo=0;
function exoS(dv, k) {
  k = parseInt(k);
  if(k==0) {
    nexo = Math.floor(exStrS.length*Math.random());
  } else {
    var u = exStrS.length;
    nexo = (nexo+u+k)% u;
  }
  document.frm.ar.value=exStrS[nexo];
  cherche(dv);
  //document.frm.ar.value += "\n"+nexo+" "+exStrS.length;
}


// writeExtern(s);

function writeExtern(s) {
 if(!document.frm.cb.checked) return;
 top.externRef=window.open('','pop',
     'width=660'
   +',height=300'
   +',menubar=1'
   +',toolbar=0'
   +',status=0'
   +',scrollbars=1'
   +',resizable=1')
 top.externRef.document.writeln(
  '<html><head><title>Ambigramme</title></head>'
   +'<body bgcolor=white onLoad="self.focus()">'
   + s
   +'</body></html>'
 )
 top.externRef.document.close()
}

