(function (){ //Début du cloisonnement

//Décalages: 
var dX, dY;
var dragged = null;

//--Fonctions pour les fenêtres--

//Fonction au début du déplacement
function start_drag(objet,event)
{
	if( objet.max) return;
  dragged = objet;
	
	event.returnValue = false;
	if( event.preventDefault ) event.preventDefault();
	
  var x = event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
  var y = event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	
  var eX = 0;
  var eY = 0;
  var element = objet;
  do
  {
    eX += element.offsetLeft;
    eY += element.offsetTop;
    element = element.offsetParent;
	} while( element && getCssStyleValue(element, 'position') != 'absolute');

  dX = x - eX;
  dY = y - eY;
}

//En cas de maximisation/restauration
function min_max(fenetre)
{
  if( ! fenetre.max )
  {
    fenetre.max = true;
    fenetre.oldTop = fenetre.style.top;
    fenetre.oldLeft = fenetre.style.left;
    fenetre.oldWidth = fenetre.style.width;
    fenetre.oldHeight = fenetre.style.height;
     
    fenetre.style.top = 0;
    fenetre.style.left = 0;
    fenetre.style.width = '100%';
    fenetre.style.height = '100%';
  }
  else
  {
    fenetre.max = false;
    fenetre.style.top = fenetre.oldTop;
    fenetre.style.left = fenetre.oldLeft;
    fenetre.style.width = fenetre.oldWidth;
    fenetre.style.height = fenetre.oldHeight;
  }
}

//En cas de fermeture
function close(fenetre)
{
  fenetre.style.visibility="hidden";
}

//--Fonctions qui gèrent les évènements souris--

//Lors de la pression du bouton de la souris
function drag_onmousedown (event)
{
  var target = event.target || event.srcElement;
  
  var fenetre = target;
  while( fenetre)
  {
    if( fenetre.className && fenetre.className.match(/\bwindow-base\b/g) )
    {
       break;
    }
		fenetre = fenetre.parentNode;
  }
  if( !fenetre)
    return;

  var element = target;
  while(element)
  {
    if( element.className)
    {
      if( element.className.match(/\bwindow-close\b/g))
      {
        close(fenetre);
        break;
      }
      else if( element.className.match(/\bwindow-min-max\b/g) )
      {
        min_max(fenetre);
        break;
			}
      else if( element.className.match(/\bwindow-move\b/g) )
      {
        start_drag(fenetre, event);
        break;
      }
    }
		element = element.parentNode;
  }

	var elements = document.getElementsByTagName('*');
	var zIndex = 0;
	for( var i=0; i < elements.length; i++)
	{
					zIndex = Math.max(zIndex,elements[i].style.zIndex);
	}
	fenetre.style.zIndex = zIndex + 1; 
}

//Lors du mouvement de la souris
function drag_onmousemove(event) 
{
  if( dragged ) 
  {
    var x = event.clientX + (document.documentElement.scrollLeft + document.body.scrollLeft);
    var y = event.clientY + (document.documentElement.scrollTop + document.body.scrollTop);
		
		//On applique le décalage
		x -= dX;
		y -= dY;

    dragged.style.position = 'absolute';
    dragged.style.left = x + 'px';
    dragged.style.top = y + 'px';
  }
}

//Lors du relâchement de la souris
function drag_onmouseup(event) 
{
  dragged = null;
}

//--Fonctions Magiques--
//Ajouter un évènement
function addEvent(obj,event,fct)
{
  if( obj.attachEvent)
     obj.attachEvent('on' + event,fct);
  else
     obj.addEventListener(event,fct,true);
}

//Récupérer la vraie valeur de style d'une balise
function getCssStyleValue(element /*element html*/, style/*style recherché*/)
{
  if( element.currentStyle )
  {
    return element.currentStyle[style];
  }
  else
  {
    return window.getComputedStyle(element,null).getPropertyValue(style);
  }
}

//--Ajouts des évènements à la page--
addEvent(document,'mousedown',drag_onmousedown);
addEvent(document,'mousemove',drag_onmousemove);
addEvent(document,'mouseup',drag_onmouseup);

})(); //Fin du cloisonnement

