var shadowUrl= basedir+"border/shadow.png";

//raccourcis ----------------

function Id(elementId) { return document.getElementById(elementId); }
function cE(elem) { return document.createElement(elem); }
function aC(elem) { support.appendChild(elem); }
function iB(new_element,elem) { elem.parentNode.insertBefore(new_element,elem); }
function rC(new_element,elem) { elem.parentNode.replaceChild(new_element, elem); }

//objet Anim -----------------

function Anim()
{
 this.visible = true;
 this.paused = false;
 this.sustained = false;
 this.sustainTime = -1;
 this.loopMode = "None";
 this.finishing = false;
 this.time = 0;
 this.excludeList = [];
 this.elements = new Array();
}

Anim.prototype.Exclude = function(exclude)
{
 this.excludeList = exclude;
}

Anim.prototype.Sustain = function(attime)
{
 this.sustainTime = attime;
}

Anim.prototype.Toggle = function()
{
 if (!this.visible) this.Play(0); else
   this.Stop();
}

Anim.prototype.HideExclude = function()
{
 for (var i=0; i<this.excludeList.length; i++)
   eval("anim_"+this.excludeList[i]+".Stop();");
}

Anim.prototype.Play = function(fromtime)
{
 if (!this.visible||this.finishing)
 this.time = fromtime;
 this.visible = true;
 this.paused = false;
 this.sustained = (this.time==this.sustainTime);
 this.finishing = false;
 this.HideExclude();
}

Anim.prototype.Reset = function()
{
 this.visible = false;
 this.paused = true;
 this.sustained = false;
 this.finishing = false;
 this.time = 0;
}

Anim.prototype.Stop = function()
{
 if (!this.visible) return;
 if (this.sustainTime == -1)
  this.Reset(); else
 {
  this.finishing = true;
  this.sustained = false;
  this.paused = false;
 }
}

Anim.prototype.Hide = function()
{
 for (var i=0; i<this.elements.length; i++)
  HideElement(this.elements[i]);
}

Anim.prototype.Pause = function()
{
 if (this.sustainTime==-1||this.time>this.sustainTime)
  this.paused = true; else
 if (this.sustainTime!=-1&&this.time==this.sustainTime)
  this.sustained=true;
 this.finishing = false;
}

Anim.prototype.Resume = function()
{
 this.paused = false;
 this.visible = true;
 this.HideExclude();
}

Anim.prototype.Elapse = function(difftime)
{
 if (!this.paused) 
 {
  if ((this.time < this.sustainTime) && (this.time + difftime >= this.sustainTime) && !this.finishing)
  {
   this.sustained = true;
   this.time = this.sustainTime;
  }
  else 
  if (!this.sustained) this.time += difftime;
 }
}

Anim.prototype.LoopRepeat = function(starttime, endtime)
{
 this.loopMode = "Repeat";
 this.loopStart = starttime;
 this.loopEnd = endtime;
}

Anim.prototype.LoopBounce = function(starttime, endtime)
{
 this.loopMode = "Bounce";
 this.loopStart = starttime;
 this.loopEnd = endtime;
}

Anim.prototype.GetTime = function()
{
 if (this.time <= this.loopStart) return this.time; 
 else if (this.loopMode == "Repeat")
   return (this.time - this.loopStart)%(this.loopEnd - this.loopStart)+this.loopStart;
 else if (this.loopMode == "Bounce")
 {
   var loopLength = this.loopEnd - this.loopStart;
   var innerBounce = (this.time - this.loopStart)%(2*loopLength);
   return loopLength - Math.abs(innerBounce - loopLength) + this.loopStart;
 } else
 return this.time;
}

// Eléments : fonctions génériques ---------------

function ShowElement(elem)
{
if (elem.borderObject)
  elem.borderObject.style.visibility = "inherit";
if (elem.shadowObject)
  elem.shadowObject.style.visibility = "inherit";
if (elem.style.visibility=="hidden") elem.style.visibility = "inherit"; //opera fix
}

function ShowElements(elemList)
{
 for (var i=0; i<elemList.length; i++)
  ShowElement(elemList[i]);
}

function SetZIndex(elem, zIndex)
{
if (elem.borderObject)
  elem.borderObject.style.zIndex = zIndex;
if (elem.shadowObject)
  elem.shadowObject.style.zIndex = zIndex;
elem.style.zIndex = zIndex;
}

function HideElement(elem)
{
if (elem.borderObject)
  elem.borderObject.style.visibility = "hidden";
if (elem.shadowObject)
  elem.shadowObject.style.visibility = "hidden";
elem.style.visibility = "hidden";
}

function PrepareElement(elem)
{
  var byname=Id(elem.id+"_Border");
  if (byname) elem.borderObject=byname; else elem.borderObject = null;

  byname=Id(elem.id+"_Shadow");
  if (byname) elem.shadowObject=byname; else elem.shadowObject = null;
}

function RemoveAnchor(elem)
{  
  anchor=Id(elem.id+"_AnchorContainer");
  if (anchor) 
  {
    var top = anchor.style.top;
    var borderObject, shadowObject;
    anchor.removeChild(elem);
    DomRemove(anchor);

    elem.style.top = top;
    elem.style.position = "absolute";
    elem.style.left = elem.style.marginLeft;
    elem.style.width = (parseInt(elem.getAttribute("mywidth")) + support.myDeltaWidth) + "px"; 
    elem.style.marginLeft = "0px";
    elem.style.marginRight = "0px";    
    elem.removeAttribute("mywidth");
    aC(elem);
    
    if (elem.borderObject) PrepareElement(elem.borderObject);
    if (elem.shadowObject) PrepareElement(elem.shadowObject);
    return true;
  }  
  return false;
}

function SetOpacity(elem, o)
{
 if (elem) {
  if (elem.myOpacityRec)
  {
   var children = elem.childNodes;
   for (var i=0; i<children.length; i++)
    SetOpacity(children[i],o);
   return;
  }
  
  var opacityElem = elem;
  if (elem.myOpacityDiv) {
    opacityElem = elem.myOpacityDiv;
  }
  
  if (ie) {
   if (o<100) 
    opacityElem.style.filter = "Alpha(opacity=" + o + ")"; //Internet Explorer
    else opacityElem.style.filter = "";
  }
  //else if (firefox&&!chrome&&!safari) opacityElem.style.MozOpacity = (o/100); //mozilla
  else opacityElem.style.opacity = (o/100);   //CSS3

  if (elem.shadowObject)
  {
   if (ie)
   {
    if (elem.visibility=="hidden"||o<30) HideElement(elem.shadowObject); else
     elem.shadowObject.style.visibility = "inherit";
   }
   else SetOpacity(elem.shadowObject, o);  
  }
  if (elem.borderObject)
    SetOpacity(elem.borderObject, o);
 }
}

// Eléments rectangulaires ----------------

function _RectangularClearShadow()
{
 if (this.shadowObject)
 {
  DomRemove(this.shadowObject);
  this.shadowObject = null;
 }
}

function _RectangularClearBorder()
{
 if (this.borderObject)
 {
  DomRemove(this.borderObject);
  this.borderObject = null;
  if (this.shadowObject) this.SetShadow(0);
 }
}

function _RectangularSetShadow()
{
 var elem=this;
 var x = elem.myX, y = elem.myY;
 var x2 = elem.myX+elem.myWidth-1,y2 = elem.myY+elem.myHeight-1;
 var bordersize = 0;
 if (elem.borderObject&&elem.borderObject.mySize) bordersize = elem.borderObject.mySize;
 { x -= bordersize; x2 += bordersize;
 y -= bordersize; y2 += bordersize; }
 var size = 11;

 if (elem.shadowObject)
 {
   var div2 = elem.shadowObject;
   RemoveAnchor(div2);
   if ((div2.myWidth == x2 - x + 1) && (div2.myHeight == y2 - y+ 1) 
      && div2.mySize==size) 
   {
    if (div2.myX!=x || div2.myY!=y)
    {
     div2.myX = x;
     div2.myY = y;
     div2.style.left = (x-size)+"px";
     div2.style.top = (y-size)+"px"; 
    }
    return;
   }
 }
 var div = cE("div"), st=div.style;
 st.fontSize = 0;
 st.position = "absolute";
 st.left = (x-size)+"px";
 st.top = (y-size)+"px";
 st.width = (x2-x+1+2*size)+"px";
 st.height = (y2-y+1+2*size)+"px";
 st.zIndex = elem.style.zIndex;
 div.myX = x;
 div.myY = y;
 div.myWidth = x2-x+1;
 div.myHeight = y2-y+1;
 div.mySize = size;
 var old_support = support;
 support = div;
 RepeatImageRight(x2-x+1+size,size, x2-x+2*size, y2-y+size, shadowUrl);
 RepeatImageBottomLeft(size,y2-y+1+size,x2-x+size,y2-y+2*size, shadowUrl);
 RepeatImageBottomRight(x2-x+1+size,y2-y+1+size, x2-x+2*size,y2-y+2*size, shadowUrl);
 support = old_support;
 if (elem.shadowObject)
  rC(div,elem.shadowObject); else
  iB(div,elem);
 elem.shadowObject = div;
}

function _RectangularSetSolidBorder(size,color,shadow)
{
 var elem=this;
 var x = elem.myX, y = elem.myY;
 var x2 = elem.myX+elem.myWidth-1,y2 = elem.myY+elem.myHeight-1;

 if (elem.borderObject)
 {
   var div2 = elem.borderObject;
   RemoveAnchor(div2);
   if ((div2.myX2 - div2.myX == x2 - x) && (div2.myY2 - div2.myY == y2 - y) 
     && div2.myColor==color && div2.mySize==size) 
   {
    if (div2.myX!=x || div2.myY!=y)
    {
     div2.myX = x;
     div2.myY = y;
     div2.style.left = (x-size)+"px";
     div2.style.top = (y-size)+"px"; 
     if (shadow) this.SetShadow(size); else
      this.ClearShadow();
    }
    return;
   }
 }
 var div = cE("div"), st=div.style;
 div.myOpacityRec = true;
 st.fontSize = 0;
 st.position = "absolute";
 st.left = (x-size)+"px";
 st.top = (y-size)+"px";
 div.myX = x;
 div.myY = y;
 div.myX2 = x2;
 div.myY2 = y2;
 div.myColor = color;
 div.mySize = size;

 var old_support = support;
 support = div;
 FillRect(0,0,x2-x+2*size,size-1, color);
 FillRect(0,size,size-1,y2-y+size, color);
 FillRect(x2-x+size+1,size,x2-x+2*size,y2-y+size, color);
 FillRect(0,y2-y+size+1,x2-x+2*size,y2-y+2*size, color); 
 support = old_support;

 if (elem.borderObject)
 {
  DomRemove(elem.borderObject);
 }

 div.style.zIndex = elem.style.zIndex;
 iB(div,elem);
 elem.borderObject = div;
 
 if (shadow) this.SetShadow(size); else
  this.ClearShadow(); 
}

function _RectangularSetImageBorder(size,prefix,suffix,shadow,color)
{
 var elem=this;
 var x = elem.myX, y = elem.myY;
 var x2 = elem.myX+elem.myWidth-1,y2 = elem.myY+elem.myHeight-1;

 if (elem.borderObject)
 {
   var div2 = elem.borderObject;
   RemoveAnchor(div2);
   if ((div2.myX2 - div2.myX == x2 - x) && (div2.myY2 - div2.myY == y2 - y) 
     && div2.myPrefix==prefix && div2.mySuffix==suffix && div2.mySize==size) 
   {
    if (div2.myX!=x || div2.myY!=y)
    {
     div2.myX = x;
     div2.myY = y;
     div2.style.left = (x-size)+"px";
     div2.style.top = (y-size)+"px"; 

     if (shadow) this.SetShadow(); else
      this.ClearShadow();
    }
    return;
   }
 }
 var div = cE("div"), st = div.style;
 div.myOpacityRec = true;
 st.fontSize = 0;
 st.position = "absolute";
 st.left = (x-size)+"px";
 st.top = (y-size)+"px";
 div.myX = x;
 div.myY = y;
 div.myX2 = x2;
 div.myY2 = y2;
 div.myPrefix = prefix;
 div.mySuffix = suffix;
 div.mySize = size;

 var old_support = support;
 support = div;
 if (color)
 {
   FillRect(size,0,x2-x+size,size-1, color);
   FillRect(0,size, size-1,y2-y+size, color);
   FillRect(x2-x+1+size,size, x2-x+2*size, y2-y+size, color);
   FillRect(size,y2-y+1+size,x2-x+size,y2-y+2*size, color);
 } else
 {
   RepeatImage(size,0,x2-x+size,size-1,prefix+"horiz"+suffix,(-size)+"px 0px"); 
   RepeatImage(0,size, size-1,y2-y+size, prefix+"vert"+suffix,"0px "+(-size)+"px");
   RepeatImage(x2-x+1+size,size, x2-x+2*size, y2-y+size, prefix+"vert"+suffix, size+"px "+((y2-y+1)+size)+"px");
   RepeatImage(size,y2-y+1+size,x2-x+size,y2-y+2*size,prefix+"horiz"+suffix, ((x2-x+1)+size)+"px "+size+"px");
 }

 RepeatImage(0,0, size-1,size-1,prefix+"corner"+suffix); //upleft
 RepeatImageRight(x2-x+1+size,0, x2-x+2*size,size-1, prefix+"corner"+suffix); //upright
 RepeatImageBottomLeft(0,y2-y+1+size,size-1,y2-y+2*size, prefix+"corner"+suffix); //lowleft
 RepeatImageBottomRight(x2-x+1+size,y2-y+1+size, x2-x+2*size,y2-y+2*size, prefix+"corner"+suffix); //lowright
 support = old_support;

 if (elem.borderObject)
 {
  DomRemove(elem.borderObject);
 }

 div.style.zIndex = elem.style.zIndex;
 iB(div,elem);
 elem.borderObject = div;
 if (shadow) this.SetShadow(); else
  this.ClearShadow();
}

// Elément Image (Rectangulaire) ---------------

function InitImage(id,url,mode,sizex,sizey,alpha,anchor)
{
 if (alpha&&ie) return InitImageIE(id,url,mode,sizex,sizey,anchor);
 var obj = Id(id);
 PrepareElement(obj);
 
 obj.myImageMode = mode;
 obj.myAnchor = anchor;
 obj.myX = obj.offsetLeft;
 obj.myY = obj.offsetTop;
 obj.myWidth = obj.offsetWidth;
 obj.myHeight = obj.offsetHeight;
 obj.myUrl = (url?url:"");
 AddStateHandler(obj, obj);
 
 obj.Move = function(x,y,x2,y2,url)
 {
  if (RemoveAnchor(obj)) AddStateHandler(obj, obj);
  if (obj.myAnchor=="right") x += support.myDeltaWidth;
  if (obj.myAnchor=="right"||obj.myAnchor=="fill") x2 += support.myDeltaWidth;
  if (obj.myX != x) { obj.myX = x; obj.style.left = x+"px"; }
  if (obj.myY != y) { obj.myY = y; obj.style.top = y+"px"; }

  var newUrl = (url?url:"");

  if (obj.myUrl != newUrl&&newUrl!="*")
  {
   if (newUrl != "")
   {
    if (obj.tag == "DIV")
     obj.style.backgroundImage = "url(" + newUrl + ")"; else
      obj.setAttribute("src",newUrl);
    obj.myUrl = newUrl;
   }
  }
  
  if (obj.myImageMode != "normal")
  {
   var width = x2-x+1, height = y2-y+1;
   if ((obj.myWidth != width) || (obj.myHeight != height))
   {
    obj.myWidth = width;
    obj.myHeight = height;
    obj.style.width = obj.myWidth+"px";
    obj.style.height = obj.myHeight+"px";
   }
  } else
  {
     obj.myWidth = obj.offsetWidth;
     obj.myHeight = obj.offsetHeight;
  }
  
  ShowElement(obj);

 }
 
 obj.Preload = function(url)
 {
  if (url == "")
  {
   if (obj.tag == "DIV")
    obj.style.backgroundImage = "none"; else
     obj.setAttribute("src","");
  } else
  {
   if (obj.tag == "DIV")
    obj.style.backgroundImage = "url("+url+")"; else
     obj.setAttribute("src",url);
  }
 }
 
 obj.ClearShadow = _RectangularClearShadow;
 obj.ClearBorder = _RectangularClearBorder;
 obj.SetShadow = _RectangularSetShadow;
 obj.SolidBorder = _RectangularSetSolidBorder;
 obj.ImageBorder = _RectangularSetImageBorder;
  
 return obj;
}

// Elément Image cas IE (Rectangulaire) ---------------

function InitImageIE(id,url,mode,sizex,sizey,anchor)
{
 var obj = Id(id);
 PrepareElement(obj);
 
 myX = obj.offsetLeft;
 myY = obj.offsetTop;
 myWidth = obj.offsetWidth;
 myHeight = obj.offsetHeight;
 
 var div = cE("div");
 div.style.position = "absolute";
 div.style.overflow = "hidden";
 div.style.left = myX+"px";
 div.style.top = myY+"px";
 div.style.width = myWidth+"px";
 div.style.height = myHeight+"px";
 div.style.zIndex = obj.style.zIndex;
 
 div.myAnchor = anchor;
 div.myX = myX;
 div.myY = myY;
 div.myWidth = myWidth;
 div.myHeight = myHeight;
 div.myImageMode = mode;
 div.mySizeX = sizex;
 div.mySizeY = sizey;
 
 div.myUrl = (url?url:"");
 
 div.CreateImage = function()
 {
  var result;
  result = cE("div");  
  if (mode=="stretch") {
    result.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+div.myUrl+"', sizingMethod='scale')"; 
    result.style.width = div.myWidth;
    result.style.height = div.myHeight;
  } else
  if (mode=="center") {
    result.style.position = "relative";
    result.style.left = Math.round((div.myWidth-div.mySizeX)/2)+"px";
    result.style.top = Math.round((div.myHeight-div.mySizeY)/2)+"px";
    result.style.width = div.mySizeX;
    result.style.height = div.mySizeY;
    var sub = cE("div");   
    sub.style.width = div.mySizeX+"px";
    sub.style.height = div.mySizeY+"px";
    sub.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+div.myUrl+"', sizingMethod='crop')";
    result.appendChild(sub);
    div.myOpacityDiv = result;
  } else
  {
    result.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+div.myUrl+"', sizingMethod='crop')"; //normal, repeat non géré
    result.style.width = div.myWidth;
    result.style.height = div.myHeight;
  }
  return result;
 }
 
 div.myImage = div.CreateImage();
 div.appendChild(div.myImage);
 
 div.Move = function(x,y,x2,y2,url,sizex,sizey)
 {
  if (div.myAnchor=="right") x += support.myDeltaWidth;
  if (div.myAnchor=="right"||div.myAnchor=="fill") x2 += support.myDeltaWidth;
  if (div.myX != x) { div.myX = x; div.style.left = x+"px"; }
  if (div.myY != y) { div.myY = y; div.style.top = y+"px"; }

  var newUrl = (url?url:"");
  var newWidth = x2-x+1;
  var newHeight = y2-y+1;
  if (newUrl="*") newUrl = div.myUrl;

  if (div.myUrl != newUrl || div.myWidth != newWidth || div.myHeight != newHeight)
  {
   div.myUrl = newUrl;
   div.myWidth = newWidth;
   div.myHeight = newHeight;
   div.mySizeX = sizex;
   div.mySizeY = sizey;
   div.style.width = newWidth+"px";
   div.style.height = newHeight+"px";
   var newImage = div.CreateImage();
   rC(newImage,div.myImage);
   div.myImage = newImage;
  }
  
  ShowElement(div);
 }
 
 div.Preload = function(url)
 {
  if (url != "")
  {
    div.myUrl = url;
    var newImage = div.CreateImage();
    rC(newImage,div.myImage);
    div.myImage = newImage;
  }
 }
 
 div.ClearShadow = _RectangularClearShadow;
 div.ClearBorder = _RectangularClearBorder;
 div.SetShadow = _RectangularSetShadow;
 div.SolidBorder = _RectangularSetSolidBorder;
 div.ImageBorder = _RectangularSetImageBorder;
 
 div.id = obj.id; 
 rC(div,obj);
 
 AddStateHandler(div, div);
  
 return div;
}

// Eléments avec du texte ----------------

function SetFontSizeAndColor(container,fontsize,fontcolor)
{
 var div = container.myTextDiv, st=div.style;
 
 var innerDiv = getFirst(div.getElementsByTagName("div"));
 if (innerDiv) st = innerDiv.style;
  
 st.fontSize = fontsize+"px";
 st.color = fontcolor;
 
 /*var innerA = div.getElementsByTagName("a");
 for (var i=0; i<innerA.length; i++)
 {
   st = innerA[i].style;
   st.color = fontcolor;
 }*/
}

function getFirst(list)
{
 if (!list||list.length==0) return null; else return list[0];
}

function SetText(container,text,fontfamily,fontsize,fontcolor,fontstyle,horizalign,vertalign,margin)
{
 var div = container.myTextDiv, st = div.style;
 if (container.myState != container.myTextState)
 {
  if (!margin) margin = 0;

  var changetextValue;
  if (container.myTextState=="")
    changetextValue = true; else
    changetextValue = (container.myTextValue != text);
  container.myTextValue = text;
  container.myTextState = container.myState;
  st.fontFamily = fontfamily;

  var cssFontWeight, cssFontStyle;
  var cssTextDecoration = ""; 
  if (fontstyle.indexOf("B") != -1)
   cssFontWeight = "bold"; else cssFontWeight = "normal";
  if (fontstyle.indexOf("I") != -1)
   cssFontStyle = "italic"; else cssFontStyle = "normal";  
  if (fontstyle.indexOf("U") != -1) cssTextDecoration += "underline ";
  if (fontstyle.indexOf("O") != -1) cssTextDecoration += "overline ";
  if (fontstyle.indexOf("S") != -1) cssTextDecoration += "line-through ";
  if (cssTextDecoration == "") cssTextDecoration = "none";
  
  var innerTd = getFirst(div.getElementsByTagName("td"));
  if (innerTd)
  {
    innerTd.style.verticalAlign = vertalign;
    var innerDiv = getFirst(innerTd.getElementsByTagName("div"));
    if (innerDiv) {
      st = innerDiv.style;
      st.fontWeight = cssFontWeight;
      st.fontStyle = cssFontStyle;
      st.textDecoration = cssTextDecoration;
      st.textAlign = horizalign;
      st.padding = margin+"px";
      if (innerDiv.innerHTML!=text&&changetextValue) innerDiv.innerHTML = text;
    }
  }
  else
  {
    var innerDiv = getFirst(div.getElementsByTagName("div"));
    if (innerDiv) {
      st = innerDiv.style;
      var paddingDiv = getFirst(innerDiv.getElementsByTagName("div"));
      if (paddingDiv) {
        paddingDiv.margin = margin+"px";
        if (paddingDiv.innerHTML!=text&&changetextValue) paddingDiv.innerHTML = text;
      }
      else
      {
        if (innerDiv.innerHTML!=text&&changetextValue) innerDiv.innerHTML = text;
      }
    } else
      if (div.innerHTML!=text&&changetextValue) div.innerHTML = text;

    st.fontWeight = cssFontWeight;
    st.fontStyle = cssFontStyle;
    st.textDecoration = cssTextDecoration;
    st.textAlign = horizalign;
  }
  /*var innerA = div.getElementsByTagName("a");
  for (var i=0; i<innerA.length; i++)
  {
    st = innerA[i].style;
    st.textDecoration = cssTextDecoration;
  }*/

  
  AddStateHandler(div, container);
 }
  
 SetFontSizeAndColor(container, fontsize,fontcolor);
}

// Elément Rectangle (Rectangulaire + Texte) et Input (Rectangulaire) -------------------

function InitRect(id,anchor)
{
 var div = Id(id);
 if (!div) { alert(id+" not found"); return null; }
 PrepareElement(div); 
 
 div.myAnchor = anchor;
 div.myTextDiv = div;
 div.myX = div.offsetLeft;
 div.myY = div.offsetTop;
 div.myWidth = div.offsetWidth;
 div.myHeight = div.offsetHeight;
 AddStateHandler(div, div);

 div.Move = _MoveRectOrInput;
 div.SetBackground = _SetBackgroundRectOrInput; 
 div.ClearShadow = _RectangularClearShadow;
 div.ClearBorder = _RectangularClearBorder;
 div.SetShadow = _RectangularSetShadow;
 div.SolidBorder = _RectangularSetSolidBorder;
 div.ImageBorder = _RectangularSetImageBorder; 
 
 return div;
}

function InitInput(id,visible,x,y,anchor)
{
 var div = Id(id);
 PrepareElement(div); 

 div.myAnchor = anchor;
 if (div.myAnchor=="right") x += support.myDeltaWidth;
   
 if (!div.myWysiwyg)
 {
  div.myDX = x-div.offsetLeft;
  div.myDY = y-div.offsetTop;
 } else
 {
  div.myDX = 0;
  div.myDY = 0;
 }
 div.style.left = (x + div.myDX)+"px";
 div.style.top = (y + div.myDY)+"px";

 div.myTextDiv = div;
 div.myX = x;
 div.myY = y;
 div.myWidth = div.offsetWidth;
 div.myHeight = div.offsetHeight;

 div.Move = _MoveRectOrInput; 
 div.SetBackground = _SetBackgroundRectOrInput;
 div.ClearShadow = _RectangularClearShadow;
 div.ClearBorder = _RectangularClearBorder;
 div.SetShadow = _RectangularSetShadow;
 div.SolidBorder = _RectangularSetSolidBorder;
 div.ImageBorder = _RectangularSetImageBorder;
 
 AddStateHandler(div, div);
 return div;
}

function _MoveRectOrInput(x,y,x2,y2,c,bg)
{
 var div = this;
 if (RemoveAnchor(div)) AddStateHandler(div, div);
 if (div.myAnchor=="right") x += support.myDeltaWidth;
 if (div.myAnchor=="right"||div.myAnchor=="fill") x2 += support.myDeltaWidth;
  
 var st = div.style;
 if (div.myX != x) { div.myX = x; if (div.myDX) st.left = (x+div.myDX)+"px"; else st.left = x+"px"; }
 if (div.myY != y) { div.myY = y; if (div.myDY) st.top = (y+div.myDY)+"px"; else st.top = y+"px"; }

 var width = x2-x+1, height = y2-y+1;
 if ((div.myWidth != width) || (div.myHeight != height))
 {
  div.myWidth = width;
  div.myHeight = height;
  st.width = div.myWidth+"px";
  st.height = div.myHeight+"px";
  var td = div.getElementsByTagName("td");
  if (td.length > 0)
  {
   td[0].setAttribute("width",div.myWidth);
   td[0].setAttribute("height",div.myHeight);
  }
 }

 div.SetBackground(c,bg);

 ShowElement(div);
}

function _SetBackgroundRectOrInput(c,bg)
{
 var div = this;

 st = div.style;
 var innerDiv = getFirst(div.getElementsByTagName("div"));
 if (innerDiv) st = innerDiv.style;
 var innerTable = getFirst(div.getElementsByTagName("table"));
 if (innerTable) st = innerTable.style;
 
  if (bg && div.myBackgroundImage!=bg)
 {
  div.myBackgroundImage = bg;
  if (bg!="") st.backgroundImage = "url(" + bg + ")"; else st.backgroundImage = "none"; 
 }
 
 if (div.tag=='INPUT')
 {
  inputType = div.getAttribute('TYPE').toLowerCase;
  if (inputType!='radio'&&inputType!='checkbox'&&inputType!='hidden') st.backgroundColor = c;
 } else st.backgroundColor = c;
 ShowElement(div);
}

// Elément Table (Rectangulaire) ------------------

function InitTable(id,url,bw,anchor)
{
 var div = Id(id);
 PrepareElement(div); 
 RemoveAnchor(div);

 var st=div.style;

 div.myAnchor = anchor;
 div.myTargetURL = url;
 div.myTextDiv = div;
 div.myX = div.offsetLeft+bw;
 div.myY = div.offsetTop+bw;
 div.myWidth = div.offsetWidth-2*bw;
 div.myHeight = div.offsetHeight-2*bw;
 AddStateHandler(div, div);

 st.border = "none";
 st.left = div.myX+"px";
 st.top = div.myY+"px";
 st.width = div.myWidth+"px";

 div.Move = function(x,y,x2,y2,c)
 {
  if (div.myAnchor=="right") x += support.myDeltaWidth;
  if (div.myAnchor=="right"||div.myAnchor=="fill") x2 += support.myDeltaWidth;
  
  var st = div.style;
  if (div.myX != x) { div.myX = x; st.left = x+"px"; }
  if (div.myY != y) { div.myY = y; st.top = y+"px"; }

  var width = x2-x+1, height = div.offsetHeight;
  if ((div.myWidth != width) || (div.myHeight != height))
  {
   div.myWidth = width;
   div.myHeight = height;
   st.width = div.myWidth+"px";
  }

  st.backgroundColor = c;
  ShowElement(div);
 }
 
 div.ClearShadow = _RectangularClearShadow;
 div.ClearBorder = _RectangularClearBorder;
 div.SetShadow = _RectangularSetShadow;
 div.SolidBorder = _RectangularSetSolidBorder;
 div.ImageBorder = _RectangularSetImageBorder; 

 return div;
}

function selectRow(elem,c,textc,fs)
{
 var table = elem.parentNode.parentNode;
 UnselectRowOfTable(table);
 if (table.selectedRow)
  table.selectedRow.style.cursor = "default";
 table.selectedRow = elem;
 var st= elem.style;

 if (!fs) fs= "";
 var cssTextDecoration = "";
 var cssFontWeight, cssFontStyle;
 if (fs.indexOf("B") != -1)
 cssFontWeight = "bold"; else cssFontWeight = "normal";
 if (fs.indexOf("I") != -1)
 cssFontStyle = "italic"; else cssFontStyle = "normal";  
 if (fs.indexOf("U") != -1) cssTextDecoration += "underline ";
 if (fs.indexOf("O") != -1) cssTextDecoration += "overline ";
 if (fs.indexOf("S") != -1) cssTextDecoration += "line-through ";
 if (cssTextDecoration == "") cssTextDecoration = "none";

 table.saveCSS = {backgroundColor: st.backgroundColor,
    color: st.color, cursor: st.cursor, fontWeight: st.fontWeight,
    fontStyle: st.fontStyle, textDecoration: st.textDecoration};
 if (c != "") st.backgroundColor = c;
 st.color = textc;
 st.cursor = "pointer";
 st.fontWeight = cssFontWeight;
 st.fontStyle = cssFontStyle;
 st.textDecoration = cssTextDecoration;

 var anchors = elem.getElementsByTagName("a");
 for (var i=0; i<anchors.length; i++)
 {
  anchors[i].style.color = textc;
  anchors[i].style.textDecoration = cssTextDecoration;
 }

}

function clickRow(elem,where)
{
 var table = elem.parentNode.parentNode;
 if (where.length > 0)
 {
  if (table.myTargetURL.indexOf("?")==-1)
    window.location = table.myTargetURL+"?"+where; else
    window.location = table.myTargetURL+"&"+where;
 } else
  window.location = table.myTargetURL;
}

function UnselectRowOfTable(table)
{
 if (table.selectedRow) { 
  var st = table.selectedRow.style;
  var css = table.saveCSS;
  st.backgroundColor = css.backgroundColor;
  st.color = css.color; 
  st.fontWeight = css.fontWeight;
  st.fontStyle = css.fontStyle;
  st.textDecoration = css.textDecoration;
  st.cursor = css.cursor; 
  var anchors = table.selectedRow.getElementsByTagName("a");
  for (var i=0; i<anchors.length; i++)
  {
   anchors[i].style.color = css.color;
   anchors[i].style.textDecoration = css.textDecoration;
  } 
 }
table.selectedRow = null;
table.selectedWhere = "";
}

// Gestion de l'interaction avec la souris -------------

var currentHoverElement = null, newHoverElement = null, newDownElement = null, currentDownElement = null;
  
function HoverStateHandler(e)
{
 var elem, event;
 if (ie) 
 {
  event = window.event;
  elem = event.srcElement;
 } else
 {
  event = e;
  elem = event.target;
 }

 while (!elem.myMain&&elem.parentNode) elem = elem.parentNode;

 if (elem.myMain) newHoverElement = elem.myMain;
}

function DownStateHandler(e)
{
 var elem, event;
 var left;
 if (ie) 
 {
  event = window.event;
  elem = event.srcElement;
  left = (event.button==1);
 } else
 {
  event = e;
  elem = event.target;
  left = (event.button==0);
 }

 if (left) {
 while (!elem.myMain&&elem.parentNode) elem = elem.parentNode;
 if (elem.myMain) newDownElement = elem.myMain; }
}

function UpdateHover()
{
 if (newHoverElement!=currentHoverElement) newDownElement = null;

 if (newDownElement!=currentDownElement)
 {
  if (currentDownElement)
  {
   currentDownElement.myState = "Hover";
   RunAction(currentDownElement, "MouseDown"); 
  }
  currentDownElement = newDownElement;
  if (newDownElement)
  {
   newDownElement.myState = "Down";
   RunAction(newDownElement, "MouseUp");
  }
 }
 
 if (newHoverElement!=currentHoverElement)
 {
  if (currentHoverElement)
  {
   currentHoverElement.myState = "Normal";
   RunAction(currentHoverElement, "MouseOut");
  }
  currentHoverElement = newHoverElement;
  if (newHoverElement)
  {
   if (currentHoverElement==currentDownElement)
    currentHoverElement.myState = "Down"; else
     currentHoverElement.myState = "Hover";
   RunAction(newHoverElement, "MouseHover");
  }
 }
}

function OutStateHandler(e)
{
 var elem, event;
 if (ie) 
 {
  event = window.event;
  elem = event.srcElement;
 } else
 {
  event = e;
  elem = event.target;
 }

 while (!elem.myMain&&elem.parentNode) elem = elem.parentNode;
 if (elem.myMain) newHoverElement = null;
}

function UpStateHandler(e)
{
 var elem, event;
 var left;
 if (ie) 
 {
  event = window.event;
  elem = event.srcElement;
  left = (event.button==1);
 } else
 {
  event = e;
  elem = event.target;
  left = (event.button==0);
 }

 if (!left) return;
 while (!elem.myMain&&elem.parentNode) elem = elem.parentNode;
 if (elem.myMain) newDownElement = null;
}

function ClickHandler(e)
{
 var elem, event;
 if (ie) 
 {
  event = window.event;
  elem = event.srcElement;
 } else
 {
  event = e;
  elem = event.target;
 }

 event.cancelBubble = true;
 while (!elem.myMain&&elem.parentNode) elem = elem.parentNode;
 if (elem.myMain)
  RunAction(elem.myMain, "Click");
}

function RunAction(elem, eventname)
{ 
 if (!elem.myActions) return;
 for (var i=0; i<elem.myActions.length; i++)
  if (elem.myActions[i][0]==eventname)
  {
    var actionDef = elem.myActions[i];
    var action = actionDef[1], pStr = actionDef[2], pInt = actionDef[3];
    if (action=="Play")
     eval("anim_"+pStr+".Play("+pInt+");");
    else if (action=="OpenURL")
     window.location = pStr;
    else eval("anim_"+pStr+"."+action+"();");
  }
}

function AddAction(elem, action)
{
 if (!elem.myActions)
   elem.myActions = new Array();
 elem.myActions.push(action);
 if (action[0]=="Click")
 {    
   elem.style.cursor = "pointer";
   elem.onselectstart=new Function ("return false;");
 }
}

function AddStateHandler(elem, main)
{
 try
 {
  if (elem.tagName)
  { 
   elem.myMain = main;
   if (!elem.myHandlers)
   {
    if (elem.addEventListener)
    {
     elem.addEventListener("mouseover",HoverStateHandler, false); 
     elem.addEventListener("mouseout",OutStateHandler, false);
     elem.addEventListener("mousedown",DownStateHandler, false); 
     elem.addEventListener("mouseup",UpStateHandler, false);
     elem.addEventListener("click",ClickHandler, false);
    } else
    if (elem.attachEvent)
    {
     elem.attachEvent("onmouseover",HoverStateHandler); 
     elem.attachEvent("onmouseout",OutStateHandler);
     elem.attachEvent("onmousedown",DownStateHandler); 
     elem.attachEvent("onmouseup",UpStateHandler);
     elem.attachEvent("onclick",ClickHandler, false);
    }
    if (elem == main) 
    {
     if (!elem.myState)
     {
      main.myState = "Normal"; 
      main.myTextState = "";
     }
    }
    elem.myHandlers = true;
   }
  }
 }
 catch(err)
 {
  alert("AddStateHandler: Error on " + (elem?elem.tagName:"null object"));
 }
 if (elem.tagName != "TABLE")
 {
  var children = elem.childNodes;
  for (var i=0; i<children.length; i++)
   AddStateHandler(children[i], main);
 }
}

function GetState(elem)
{
 if (elem.myState) return elem.myState; else return "Normal";
}

// Fonctions diverses -----------

function min2(a,b)
{
 var min = a;
 if (b<min) min=b;
 return min;
}

function max2(a,b)
{
 var max = a;
 if (b>max) max=b;
 return max;
}

