Number.prototype.hexa = function() {
  if (isNaN(this)) return null;
  if ((this > Number.MAXINT) || (this < Number.MININT)) return null;
  if (arguments.length) var lim = parseInt(arguments[0]);
  else var lim = 0;
  var ch_hexa = "0123456789ABCDEF";
  var result = "";
  var nombre = this;
  var i = 0;
  while (nombre) {
     if (lim && (lim == i++)) break;
     result = ch_hexa.charAt(nombre & 15) + result;
     nombre >>= 4;
  }
  if (lim) {
     while (result.length < lim) result = "0" + result;
  }
  return result;
}


function rgb_of_hsv(h, s, v)
{
    var rgb = [0, 0, 0];

    var s = s/255;
    var i = Math.floor(h/60);
    var f = (h - 60*i)/60;
    var m = v*(1 - s);
    var n = v*(1 - s*f);
    var k = v*(1 - s*(1 - f));
    if(i == 0 || i == 6) { rgb = [v, k, m]; }
    else if(i == 1) { rgb = [n, v, m]; }
    else if(i == 2) { rgb = [m, v, k]; }
    else if(i == 3) { rgb = [m, n, v]; }
    else if(i == 4) { rgb = [k, m, v]; }
    else            { rgb = [v, m, n]; }

    return '#'+parseInt(rgb[0]).hexa(2)+parseInt(rgb[1]).hexa(2)+parseInt(rgb[2]).hexa(2);
}

function tirer_couleur()
{
    var h = parseInt(Math.random()*360);
    var s = 100+parseInt(Math.random()*100);
    var v = 150+parseInt(Math.random()*100);

    return rgb_of_hsv(h, s, v);
}



if(navigator.appName == "Microsoft Internet Explorer" || (navigator.userAgent).indexOf("MSIE") != -1)
{
    document.getElementById('IEWarning').style.display = 'block';
}

function epurer()
{
    var base = document.getElementById('elements');
    var childs = base.childNodes;
    var n = childs.length;

    for(i = n - 1; i >= 0; i--)
    {
        if(childs.item(i).nodeName == "#text")
        {
            base.removeChild(childs.item(i));
        }
    }
}

epurer();

function centrer()
{
    var base = document.getElementById('elements');
    var e = base.firstChild;

    while(e != null && e.nodeName.toLowerCase() != "div")
    {
        e = e.nextSibling;
    }

    var taille_totale = (e.offsetWidth + 20)*Math.floor(base.offsetWidth/(e.offsetWidth + 20));
    base.style.paddingLeft = Math.floor((base.offsetWidth - taille_totale)/2) + "px";

    document.getElementById('boutonCentrer').style.display = "none";
}

centrer();

window.onresize = function() {
    document.getElementById('boutonCentrer').style.display = "inline";
}



function nombre_blocs_par_ligne()
{
    var base = document.getElementById('elements');
    var e = base.firstChild;

    while(e != null && e.nodeName.toLowerCase() != "div")
    {
        e = e.nextSibling;
    }

    return Math.floor((base.offsetWidth - parseInt(base.style.paddingLeft))/(e.offsetWidth + 20));
}

function creerDiv()
{
    var base = document.getElementById('elements');

    var div = document.createElement('div');
    div.className = 'ajout';
    div.onclick = function() { div.style.background = tirer_couleur(); };

    var suppr = document.createElement('a');
    suppr.setAttribute('href', '#');
    suppr.onclick = function() { base.removeChild(div); return false; };
    suppr.appendChild(document.createTextNode('x'));

    var gauche = document.createElement('a');
    gauche.setAttribute('href', '#');
    gauche.onclick = function() {
        if(div.previousSibling == null) { return false; }
        base.insertBefore(div, div.previousSibling);
        return false; };
    gauche.appendChild(document.createTextNode('<'));

    var droite = document.createElement('a');
    droite.setAttribute('href', '#');
    droite.onclick = function() {
        if(div.nextSibling == null) { return false; }
        base.insertBefore(div, div.nextSibling.nextSibling);
        return false; };
    droite.appendChild(document.createTextNode('>'));

    div.appendChild(gauche);
    div.appendChild(document.createTextNode(' '));
    div.appendChild(suppr);
    div.appendChild(document.createTextNode(' '));
    div.appendChild(droite);

    return (div);
}

function nouveaubloc()
{
    document.getElementById('elements').appendChild(creerDiv());
}

function rond()
{
    var base = document.getElementById('elements');
    var divs = base.getElementsByTagName('div');
    var n = divs.length;

    var l = nombre_blocs_par_ligne();
    var i = l + 1;
    var j = 0;

    while(Math.floor(i/l) < Math.floor((n - 1)/l))
    {
        for(j = 0 ; j < l - 2 ; j++)
        {
            base.insertBefore(creerDiv(), divs.item(i));
        }
        i+= l;
        n+= l - 2;
    }
}

function damier()
{
    var base = document.getElementById('elements');
    var divs = base.getElementsByTagName('div');

    var l = nombre_blocs_par_ligne();
    var decalage = (l == 2*Math.floor(l/2));

    var n = 2*divs.length - 2;
    if(decalage && Math.floor(n/l) + 1 == 2*Math.floor((Math.floor(n/l) + 1)/2))
    {
        n++;
    }

    for(var i = 1 ; i < n ; i++)
    {
        base.insertBefore(creerDiv(), divs.item(i));
        i++;

        if(decalage && Math.floor(i/l) == i/l)
        {
            i--;
        }
        else if(decalage && Math.floor((i+1)/l) == (i+1)/l)
        {
            i++;
        }
    }
}

function trimier()
{
    var base = document.getElementById('elements');
    var divs = base.getElementsByTagName('div');
    var n = divs.length;

    for(var i = 2 ; i < parseInt(3*n/2) - 1 ; i+= 3)
    {
        base.insertBefore(creerDiv(), divs.item(i));
    }
}

function tablerase()
{
    var base = document.getElementById('elements');
    var divs = base.getElementsByTagName('div');
    var n = divs.length;

    for(var i = n - 1 ; i >= 0 ; i--)
    {
        if(divs.item(i).className == 'ajout')
        {
            base.removeChild(divs.item(i));
        }
    }
}

function echanger(e, f)
{
    var base = document.getElementById('elements');
    var p = e.nextSibling;

    if(f == p)
    {
        base.insertBefore(f, e);
    }
    else
    {
        base.replaceChild(e, f);
        base.insertBefore(f, p);
    }
}

function melanger()
{
    var base = document.getElementById('elements');
    var divs = base.getElementsByTagName('div');
    var n = divs.length;
    var timer = null;

    function recommencer(m)
    {
        if(m == 0)
        {
            clearTimeout(timer);
        }
        else
        {
            var i = Math.floor(Math.random()*n);
            var j = Math.floor(Math.random()*n);

            if(i != j)
            {
                echanger(divs.item(i), divs.item(j));
            }
            timer = setTimeout(function() { recommencer(m - 1); }, 120);
        }
    }

    recommencer(25);
}