
/*
 * Fonction de clonage
 * @author Keith Devens
 * @see http://keithdevens.com/weblog/archive/2007/Jun/07/javascript.clone
 */
function clone(srcInstance) {

  /*Si l'instance source n'est pas un objet ou qu'elle ne vaut rien c'est une feuille donc on la retourne*/
  if(typeof(srcInstance) != 'object' || srcInstance == null) {
    return srcInstance;
  }
  /*On appel le constructeur de l'instance source pour crée une nouvelle instance de la même classe*/
  var newInstance = srcInstance.constructor();
  
  /*On parcourt les propriétés de l'objet et on les recopies dans la nouvelle instance*/
  for(var i in srcInstance) {
    newInstance[i] = clone(srcInstance[i]);
  }
  return newInstance;
}

/// CLASS Suiveur
function Suiveur(id, posX, posY, largeur, hauteur, rayonMvt, defaut) {
  
  this.id = (id == undefined) ? '' : id;
  this.urlImg = (defaut == undefined) ? '' : defaut.urlImg;
  this.urlFondImg = (defaut == undefined) ? '' : defaut.urlFondImg;
  this.rayonMouvement = (rayonMvt == undefined) ? 0 : rayonMvt;
  this.posX = (posX == undefined) ? 0 : posX;
  this.posY = (posY == undefined) ? 0 : posY;
  this.decalageX = (defaut == undefined) ? '' : defaut.decalageX;
  this.decalageY = (defaut == undefined) ? '' : defaut.decalageY;
  this.largeur = (largeur == undefined) ? 0 : largeur;
  this.hauteur = (hauteur == undefined) ? 0 : hauteur;
  this.divParentId = (defaut == undefined) ? '' : defaut.divParentId;
  this.overflow = (defaut == undefined) ? 'hidden' : defaut.overflow;
  
  // pour optimiser les calculs
  this.div = null;
  this.divContenant = null;
  this.divParent = null;
}

var suiveurs = new Array();

// create reference to common "body" across doctypes
var standardbody = (document.compatMode=="CSS1Compat") ? document.documentElement : document.body;


// ###################################
function trouveObj(id) {
  
  var x = document[id];
  if (!x && document.getElementById) {
    x = document.getElementById(id);
  }
  return x;
}


// ###################################
function vasYSuis(mouseX, mouseY, suiveur) {

  var decaX = suiveur.rayonMouvement - suiveur.largeur/2;
  var decaY = suiveur.rayonMouvement - suiveur.hauteur/2;
  var ex = suiveur.divContenant.offsetLeft + suiveur.rayonMouvement; 
  var ey = suiveur.divContenant.offsetTop  + suiveur.rayonMouvement;
  if(suiveur.divParent) {
    ex += suiveur.divParent.offsetLeft;
    ey += suiveur.divParent.offsetTop;
  }
  var dx = mouseX - ex; 
  var dy = mouseY - ey;
  var r = 1;
  var rayonMvtInt = suiveur.rayonMouvement - suiveur.largeur/2;
  var rayonCarre = rayonMvtInt * rayonMvtInt;
  if(((dx*dx+dy*dy)/rayonCarre) >= 1) {
    r = Math.sqrt(rayonCarre*rayonCarre / (rayonCarre * (dx*dx+dy*dy)));
  }
  suiveur.div.style.left = decaX + r*dx + suiveur.decalageX +'px'; 
  suiveur.div.style.top  = decaY + r*dy + suiveur.decalageY +'px';
}


// ###################################
function suiviSouris(suiveur) {

  var decaX = suiveur.rayonMouvement - suiveur.largeur/2;
  var decaY = suiveur.rayonMouvement - suiveur.hauteur/2;
  var left = suiveur.posX - suiveur.rayonMouvement;
  var top  = suiveur.posY - suiveur.rayonMouvement ;
  var diametreMouvement = 2 * suiveur.rayonMouvement;
  
  var cssOverFlow = '';
  if (suiveur.overflow != '') {
    cssOverFlow = 'overflow:'+suiveur.overflow+';'; 
  }

  var imgFond = '';
  if (suiveur.urlFondImg != '') {
    imgFond = '<div id="'+suiveur.id+'fond" style="position:absolute; left:0; top:0; z-index:5; width:'+diametreMouvement+'px; height:'+diametreMouvement+'px;font-size:1px;line-height:1px;"><img style="border:none;line-height:1px;" src="'+suiveur.urlFondImg+'" width="'+diametreMouvement+'" height="'+diametreMouvement+'" alt="" \></div>';
  }

  document.write('<div id="'+suiveur.id+'contenant" style="position:absolute; left:'+left+'px; top:'+top+'px; z-index:4; width:'+diametreMouvement+'px; height:'+diametreMouvement+'px;font-size:1px;line-height:1px;'+ cssOverFlow + '/*opacity:0.5;*/">'+
             imgFond +
             '<div id="'+suiveur.id+'" style="position:absolute; left:'+decaX+'px; top:'+decaY+'px; z-index:6; width:'+suiveur.largeur+'px; height:'+suiveur.hauteur+'px;font-size:1px;line-height:1px;"><img style="border:none;line-height:1px;" src="'+suiveur.urlImg+'" width="'+suiveur.largeur+'" height="'+suiveur.hauteur+'" alt="" \></div>'+
         '</div>');
  suiveur.divContenant = trouveObj(suiveur.id+'contenant');
  suiveur.div = trouveObj(suiveur.id);
  suiveurs.push(suiveur);
  if (suiveur.divContenant && suiveur.div && suiveur.divContenant.style) {
    document.onmousemove = suiviMouseMove;
  }
  
  suiveur.divParent = trouveObj(suiveur.divParentId);
}


// ###################################
function suiviMouseMove(e) {
  var mouseX=(e)? e.pageX : event.clientX+standardbody.scrollLeft;
  var mouseY=(e)? e.pageY : event.clientY+standardbody.scrollTop;

  for(var i=0; i < suiveurs.length; i++) {
    vasYSuis(mouseX, mouseY, suiveurs[i]);
  }
//   trouveObj('ecrit').innerHTML = (mouseX - trouveObj('coucou').offsetLeft) +' x '+ (mouseY - trouveObj('coucou').offsetTop);
}

