/* API ajout */
AI.utils.forOwn = function(obj, callback, scope)
{
 var k, i = 0;
 for ( k in obj )
 {
 // sur les élément SVG, firefox pleure quand on fait SVGElement.hasOwnProperty
 // Erreur : uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object"  nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)"  location: "JS frame :: http://dev.internet-ai.com/js/ai/includer.js :: anonymous :: line 463"  data: no]
  if ( k && obj.hasOwnProperty(k) )
  {
//   scope || this ou alors scope || callback ???
   callback.call(scope || this, obj, k, obj[k], i++);
  }
 }
};

/* matrice */

function checkIE(val)
{
 document.forms.simform.elements.action.value=val;
 return true;
}

var matrice = function()
{

var
 frm,
 totalesurface,
 totalpersonne,
 assistant,
 datas = {},

vignette = function()
{
 var
  width, height,
  previsu, imgprevisu, lblprevisu, titleprevisu;
 function set(w,h) { width = intval(w); height = intval(h); }
 function show(elt, vig, m2, linkedlabel)
 {
  var X,Y,h, ll;
  if ( !vig || vig === "") { return false; }
  if ( !previsu )
  {
   imgprevisu = $E("img", {src:"/images/simulation/" + vig, width:width, height:height, border:0});
   lblprevisu = $E("span");
   titleprevisu = $E("span");
   previsu = $E("div", {id:"simprevisu", className:"cacher"}, {position:"absolute"}, [titleprevisu, imgprevisu, lblprevisu]);
   document.body.appendChild(previsu);
  }
  X = DOM.getX(elt);
  Y = DOM.getY(elt);
  h = intval((height / 2) + (elt.offsetHeight / 2) );
  $style(previsu, {left:(X+elt.offsetWidth) + "px", top:(Y-h)+"px"});
  imgprevisu.src = "/images/simulation/" + vig;
  lblprevisu.innerHTML = m2 > 0 ? "surface recommandée : " + m2 + " m²" : '';
  DOM.hide(titleprevisu);
  ll = $(linkedlabel);
  if ( ll )
  {
   titleprevisu.innerHTML = ll.innerHTML;
   DOM.show(titleprevisu);
  }
  DOM.show(previsu);
  return true;
 }
 function hide() { DOM.hide(previsu); }
 return { set:set, show:show, hide:hide };
}(),

knownBFI = {}, // BFI == BureauFromId
getBureauFromId = function(id)
{
 var b;
 if ( knownBFI[id] ) { return knownBFI[id]; }
 AI.utils.forOwn(datas, function(o,k,v) { if ( v.id == id ) { b = v; } });
 knownBFI[id] = b;
 return b;
},

knownBFS = {}, // BFS = BureauFromString
getBureauFromString = function(str)
{
 var tmp, r;
 if ( knownBFS[str] ) { return knownBFS[str]; }
 tmp = str.match(/^[a-zA-Z]+([0-9]+)$/);
 if ( tmp && tmp[1] ) { r = getBureauFromId(tmp[1]); }
 knownBFS[str] = r;
 return r;
},

currentTR = function()
{
 var cur, originalTxt, toid;
 function back() { cur = null; assistant.innerHTML = originalTxt; }
 function setOri(txt) { originalTxt = txt; }
 function set(tr)
 {
  var html = originalTxt;
  if ( cur != tr )
  {
   if ( toid ) { clearTimeout(toid); }
   if ( cur ) { DOM.removeCSS(cur, 'hover'); }
   if ( tr )
   {
    if ( IS.IE6 )
    {
     for ( var x = 0; x < tr.parentNode.childNodes.length; x++ )
     {
      tr.parentNode.childNodes[x].className = '';
     }
     DOM.addCSS(tr, 'hover');
    }
//    toid = setTimeout(function()
//    {
     cur = tr;
     assistant.innerHTML = getBureauFromString(tr.id).contenu;
//    }, 150);
   } else { back(); }
  }
 }
 return { set:set, setOri:setOri, back:back };
}(),

calculs =
{
 /*
  m2      = piece * surface * coef
  mL      = si piece > 0 { (piece * coef 1) * coef 2 }
            sinon        { surface * coef 2 }
  misc    = surface * coef
  ouvert  = personne * surface * coef
  reunion = piece * personne * 1.5 * coef
  attente = surface * coef
 */
 m2:function(b)
 {
  var
   piece = frm.elements['piece' + b.id],
   surface = frm.elements['surface' + b.id],
   tr = piece;
  while ( tr && tr.tagName != 'TR' ) { tr = tr.parentNode; }
  tr.totSurface = Math.ceil(intval(piece.value) * floatval(surface.value) * floatval(b.coef));
  calculTotaux();
  return true;
 },
 mL:function(b, eltSource)
 {
  var
   piece = frm.elements['piece' + b.id],
   surface = frm.elements['surface' + b.id],
   tmp = b.coef.split(';'),
   coef = floatval(tmp[0]),
   coefLineaire = floatval(tmp[1]),
   piece_val = intval(piece.value),
   surface_val = floatval(surface.value),
   val = surface_val * coef,
   tr = piece;
  while ( tr && tr.tagName != 'TR' ) { tr = tr.parentNode; }
  // synchro des valeurs piece mL <=> surface m2
  if ( eltSource == piece && piece_val > 0 )
  {
   val = floatval(piece_val * coefLineaire);
   surface.value = intval(val);
   val = val * coef;
  }
  else if ( eltSource == surface && surface_val > 0 )
  {
   piece.value = intval(surface_val / coefLineaire);
  }
  tr.totSurface = Math.ceil(val);
  calculTotaux();
  return true;
 },
 misc:function(b)
 {
  var
   surface = frm.elements['surface' + b.id];
   tr = surface;
  while ( tr && tr.tagName != 'TR' ) { tr = tr.parentNode; }
//  span.innerHTML = Math.ceil(floatval(surface.value) * floatval(b.coef));
  tr.totSurface = Math.ceil(floatval(surface.value) * floatval(b.coef));
  calculTotaux();
  return true;
 },
 ouvert:function(b)
 {
  var
   personne = frm.elements['personne' + b.id],
   surface = frm.elements['surface' + b.id],
   tr = personne;
  while ( tr && tr.tagName != 'TR' ) { tr = tr.parentNode; }
  tr.totSurface = Math.ceil(intval(personne.value) * floatval(surface.value) * floatval(b.coef));
  calculTotaux();
  return true;
 },
 attente:function(b)
 {
  var
   personne = frm.elements['personne' + b.id],
   surface = frm.elements['surface' + b.id],
   tr = personne;
  while ( tr && tr.tagName != 'TR' ) { tr = tr.parentNode; }
  tr.totSurface = Math.ceil(floatval(surface.value) * floatval(b.coef));
  calculTotaux();
  return true;
 },
 reunion:function(b)
 {
  var
   piece = frm.elements['piece' + b.id],
   personne = frm.elements['personne' + b.id],
   tr = piece;
  while ( tr && tr.tagName != 'TR' ) { tr = tr.parentNode; }
  tr.totSurface = Math.ceil(intval(piece.value) * intval(personne.value) * 1.5 * floatval(b.coef));
  calculTotaux();
  return true;
 }
},

linkers =
{
 /* linker m2 */
 m2:function(b)
 {
  var
   piece = frm.elements['piece' + b.id],
   surface = frm.elements['surface' + b.id];
  piece.onchange = surface.onchange = piece.onkeyup = surface.onkeyup = function(e) { return calculs.m2(b); };
  calculs.m2(b);
 },

 /* linker mL */
 mL:function(b)
 {
  var
   piece = frm.elements['piece' + b.id],
   surface = frm.elements['surface' + b.id];
  piece.onchange = surface.onchange = piece.onkeyup = surface.onkeyup = function(e) { return calculs.mL(b, this); };
  calculs.mL(b, piece);
 },

 /* linker misc */
 misc:function(b)
 {
  var
   surface = frm.elements['surface' + b.id];
  surface.onchange = surface.onkeyup = function(e) { return calculs.misc(b); };
  calculs.misc(b);
 },

 /* linker ouvert */
 ouvert:function(b)
 {
  var
   personne = frm.elements['personne' + b.id],
   surface = frm.elements['surface' + b.id];
  personne.onchange = surface.onchange = personne.onkeyup = surface.onkeyup = function(e) { return calculs.ouvert(b); };
  calculs.ouvert(b);
 },

 /* linker attente */
 attente:function(b)
 {
  var
   personne = frm.elements['personne' + b.id],
   surface = frm.elements['surface' + b.id];
  personne.onchange = surface.onchange = personne.onkeyup = surface.onkeyup = function(e) { return calculs.attente(b); };
  calculs.attente(b);
 },

 /* linker reunion */
 reunion:function(b)
 {
  var
   piece = frm.elements['piece' + b.id],
   personne = frm.elements['personne' + b.id];
  personne.onchange = piece.onchange = personne.onkeyup = piece.onkeyup = function(e) { return calculs.reunion(b); };
  calculs.reunion(b);
 }
};

function calculTotaux()
{
 var
  i, type,
  all = $('simul').tBodies[0].rows,
  totPersonne = 0, totSurface = 0.00;

 function getNbPersonne(tr)
 {
  var r, el = tr.cells[2].firstChild;
  if ( !el ) { return 0; }
  r = intval(el.value || el.nodeValue || el.textContent || el.innerHTML);
  return isNaN(r) ? 0 : r;
 }
 
 function getNbPiece(tr)
 {
  var r, el = tr.cells[3].firstChild;
  if ( !el ) { return 0; }
  r = intval(el.value || el.nodeValue || el.textContent || el.innerHTML);
  return isNaN(r) ? 0 : r;
 }

 function getNbSurface(tr)
 {
/*
  var r, el = tr.cells[5].firstChild;
  if ( !el ) { return 0.00; }
  r = parseFloat(el.nodeValue || el.textContent || el.innerHTML);
  return isNaN(r) ? 0.00 : r;
*/
  var r;
  if ( !tr ) { return 0.00; }
  r = parseFloat(tr.totSurface);
  return isNaN(r) ? 0.00 : r;
 }

 for ( i = 0; i < all.length; i++ )
 {
  type = getBureauFromString(all[i].id).type;
  if ( type == 'm2' || type == 'ouvert' || type == 'attente' )
  {
   totPersonne = totPersonne + getNbPersonne(all[i]) * getNbPiece(all[i]);
  }
  totSurface = totSurface + getNbSurface(all[i]);
 }
 totalesurface.innerHTML = Math.ceil(totSurface);
 totalpersonne.innerHTML = parseInt(totPersonne, 10);
}

function init(d, originalTxt)
{
 var i, allInput = $tags('input', $('simul').tBodies[0]);
 
 function onFocus(e) { if ( intval(this.value) === 0 ) { this.value = ''; } }
 function onBlur(e) { var v = intval(this.value); if ( isNaN(v) || v <= 0 ) { this.value = '0'; } }
 
 datas = d;

 assistant = $('simassistcontent');
 frm = $('simform');
 totalesurface = $('totalesurface');
 totalpersonne = $('totalpersonne');

 AI.utils.forOwn(datas, function(o,k,v) { linkers[v.type](v); });

 for ( i = allInput.length; i--; )
 {
  if ( allInput[i].type == 'text' )
  {
   allInput[i].onfocus = onFocus;
   allInput[i].onblur = onBlur;
  }
 }

// $("simul").tBodies[0].onmousemove = function(e)
// $("simul").onmousemove = function(e)
// $('simform').onmousemove = function(e)
 document.body.onmousemove = function(e)
 {
  var
   E = EVT.fix(e),
   T = EVT.getTarget(E);
  if ( !T ) { return false; }
  while ( T && T.tagName && T.tagName.toUpperCase() != 'TR' ) { T = T.parentNode; }
  if ( T && T.parentNode && T.parentNode.parentNode && T.parentNode.parentNode.id == 'simul' && T.parentNode.tagName.toUpperCase() == 'TBODY' ) { currentTR.set(T); }
  else { currentTR.back(); }
  return true;
 };

/*
 $("simul").onmouseout = function(e)
 {
  var
   E = EVT.fix(e),
   T = EVT.getTarget(E);
  if ( !T ) { return false; }
  while ( T && T.tagName && T.tagName.toUpperCase() != 'TABLE' ) { T = T.parentNode; }
  if ( T ) { currentTR.setOri(originalTxt); }
  return true;
 };
*/

 currentTR.setOri(originalTxt);
}

function calculFromSpinner()
{
 var
  i, tmp, bureau,
  reg = /^\w+([0-9]+)$/;
 if ( frm && datas )
 {
  bureau = getBureauFromString(this.name);
  calculs[bureau.type](bureau);
 }
 return true;
}

return { init:init, calculFromSpinner:calculFromSpinner, vignette:vignette };
}();