/*
Copyright (c) 2008, Ankama. All rights reserved.
version: 1.0.1.A
*/
var sExt = "com";
var sLinkerLanguage = "fr";

var sItemUrl = "http://www.dofus." + sExt + "/fr/apidofus/item.html";
var sTemplateUrl = "/js/dofus_item_template.js";

var aItems = new Array();
var yuiPath = "";
var DofusLinker = function()
{
  self = this;
}

/************************************/
/******        CONNEXION     ********/
/************************************/

var callbackjson =
{
  success:SuccessHandlerJSON,
  failure:FailureHandlerJSON,
  timeout: 5000 
};

//Fonction executée si la connexion a réussi JSON
function SuccessHandlerJSON(oData)
{
  bLoading = false;
  try 
  {
    var message = oData;
    var messages = YAHOO.lang.JSON.parse(message.responseText);
  
    sCurrentTemplate = ProcessItemData(messages, sCallbackType);
  } 
  catch (x)
  {
    sCurrentTemplate = "JSON Parse failed! " + x
  }
  
  if(div[iCount] != undefined)
  {
    div[iCount].style.display = "";
    div[iCount].innerHTML = sCurrentTemplate;
  }
}

//Fonction executée si la connexion a échoué JSON
function FailureHandlerJSON(o)
{
  div[iCount].innerHTML = o.status + " " + o.statusText; 
}


var callbackxml =
{
  success:SuccessHandlerXML,
  failure:FailureHandlerXML,
  timeout: 5000 
};

//Fonction executée si la connexion a réussi XML
function SuccessHandlerXML(oData)
{
  bLoading = false;
  var oRoot = oData.responseXML;
  sCurrentTemplate = ProcessItemData(oRoot, sCallbackType);

  if(div[iCount] != undefined)
  {
	  div[iCount].style.display = "";
	  div[iCount].innerHTML = sCurrentTemplate;
  }
}

//Fonction executée si la connexion a échoué XML
function FailureHandlerXML(o)
{
  div[iCount].innerHTML = o.status + " " + o.statusText; 
}

//Fonction executée si la connexion a réussi JSONP
function SuccessHandlerJSONP(oData)
{
  bLoading = false;
  try 
  {
    sCurrentTemplate = ProcessItemData(jsonDofusItem, sCallbackType);
  } 
  catch (x)
  {
    sCurrentTemplate = "JSONP Parse failed! " + x;
  }
  if(div[iCount] != undefined)
  {
	  div[iCount].style.display = "";
	  div[iCount].innerHTML = sCurrentTemplate;
  }
}

//Fonction executée si la connexion a échoué JSONP
function FailureHandlerJSONP(o)
{
  div[iCount].innerHTML = o.status + " " + o.statusText; 
}

/************************************/
/******        FUNCTIONS      ********/
/************************************/

var iState = new Array();
var iBlock = new Array();
var aLinkerPosition = new Array();
var fCoordX = 0;
var fCoordY = 0;
var iCount = 0;
var iMaxCount = 3;
var bLoading = false;
for(i=iCount;i<=iMaxCount;i++)
{
  iState[i] = 0;
  iBlock[i] = 0;
  aLinkerPosition[i] = "start";
}
var div = new Array();

function mouseposition(e)
{
  if (!e) var e = window.event;
  if (e.pageX || e.pageY)
  {
    fCoordX = e.pageX;
    fCoordY = e.pageY;
  }
  else if (e.clientX || e.clientY)
  {
    fCoordX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    fCoordY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
  }

  fCurrentX = fCoordX;
  if(aLinkerPosition[iCount] == "start")
  {
    if((ScreenWidth() / 2) > fCurrentX)
    { fCoordX = fCoordX + 15;}
    else 
    {fCoordX = fCoordX - 515;}
  }
  else
  {
    switch(aLinkerPosition[iCount])
    {
      case "left":
        fCoordX = fCoordX - 510; 
      break;
      case "right":
        fCoordX = fCoordX + 15;;
      break;
    }
  }
  fCoordY = fCoordY + 10;
  if(iState[iCount] == 1 && iBlock[iCount] == 0 && div[iCount] != null || bLoading)
  {
    if(aLinkerPosition[iCount] == "start")
    {
      if((ScreenWidth() / 2) > fCurrentX)
      { aLinkerPosition[iCount] = "right";}
      else {aLinkerPosition[iCount] = "left";}
    }
    
    div[iCount].style.left = fCoordX  + "px";
    div[iCount].style.top = fCoordY + "px";
  }
}

function ScreenWidth()
{
  var largeur = 0, hauteur = 0;
  if(typeof(window.innerWidth) == 'number')
  {
    largeur = window.innerWidth;
    hauteur = window.innerHeight;
  }
  else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
  {
    largeur = document.documentElement.clientWidth;
    hauteur = document.documentElement.clientHeight;
  }
  else if(document.body && (document.body.clientWidth || document.body.clientHeight))
  {
    largeur = document.body.clientWidth;
    hauteur = document.body.clientHeight;
  }
  else
  {
    largeur = -1;
    hauteur = -1;
  }
  
  return largeur;
}

var eventLoader = new YAHOO.util.YUILoader(
{ 
  require: ["event"],
  loadOptional: false,
  onSuccess: function(o)
  {
    YAHOO.util.Event.addListener(document, 'mousemove', mouseposition);
  }
})
eventLoader.insert();

//Détruit la popup courante
function CloseItem()
{
  if(iState[iCount] == 1 && iBlock[iCount] == 0)
  {
    aLinkerPosition[iCount] = "start";
    document.body.removeChild(div[iCount]);
    iState[iCount] = 0;
  }
}
//Détruit une popup définir
function CloseItemByNumber(iNumber)
{
  if(iState[iNumber] == 1 && iBlock[iNumber] == 0)
  {
    aLinkerPosition[iNumber] = "start";
    document.body.removeChild(div[iNumber]);
    div[iNumber] = null;
    iState[iNumber] = 0;
  }
}
//Laisse une popup affichée
function BlockItem()
{
  if(bLoading == false)
  {
	  if(iCount < iMaxCount)
	  {
		  iBlock[iCount] = 1;
		  SetCurrentItem();
	  }
  }
  return 0;
}
//Referme une popup bloquée
function UnBlockItem(iNumber)
{
  iBlock[iNumber] = 0;
  CloseItemByNumber(iNumber);
  SetCurrentItem();
}
//Recherche la première instance du bloc à utiliser
function SetCurrentItem()
{
  i = 0;
  while(i < iMaxCount && div[i] != null)
  {
    i++;
  }
  iCount = i;
}
//Insère le contenu du template dans la popup en remplacant les champs
function ProcessItemData(messages, sType)
{
  var sCurrentTemplate = sTemplate;
  
  switch(sType)
  {
    case "json":
    case "jsonp":
      sCurrentTemplate = sCurrentTemplate.replace(/\[ITEM_NAME\]/g, messages["item"]["name"]);
      sCurrentTemplate = sCurrentTemplate.replace(/\[ITEM_LVL\]/g, messages["item"]["lvl"]);
      if(messages["item"]["typeid"] != null)
        sCurrentTemplate = sCurrentTemplate.replace(/\[TYPE_ID\]/g, messages["item"]["typeid"]);
      else if(messages["item"]["supertypeid"] != null)
        sCurrentTemplate = sCurrentTemplate.replace(/\[TYPE_ID\]/g, messages["item"]["supertypeid"]);
      else sCurrentTemplate = sCurrentTemplate.replace(/\[TYPE_ID\]/g, "");
      if(messages["item"]["typename"] != null)
        sCurrentTemplate = sCurrentTemplate.replace(/\[TYPE_NAME\]/g, messages["item"]["typename"]);
      else sCurrentTemplate = sCurrentTemplate.replace(/\[TYPE_NAME\]/g, "");
      sCurrentTemplate = sCurrentTemplate.replace(/\[GFXID\]/g, messages["item"]["gfxid"]);
      sCurrentTemplate = sCurrentTemplate.replace(/\[SUPERTYPE_ID\]/g, messages["item"]["supertypeid"]);
      sCurrentTemplate = sCurrentTemplate.replace(/\[ITEM_NAME_URL\]/g, encodeURI(messages["item"]["name"]));
      
      if(messages["item"]["typeid"] == -1)
        sCurrentTemplate = sCurrentTemplate.replace(/\[PRINTKNOWMORE\]/g, 'style="display:none;"');
      else
        sCurrentTemplate = sCurrentTemplate.replace(/\[PRINTKNOWMORE\]/g, '');
      var bDescription = true;
      var sEffectsStyle = "display:none;";
      if(messages["item"]["effectslist"] != undefined)
      {
        if(messages["item"]["effectslist"].length > 0 && messages["item"]["typeid"] != 18)
        {
          sEffectsStyle = "";
          bDescription = false;
        }
      }
      sCurrentTemplate = sCurrentTemplate.replace(/\[EFFECTSLISTSTYLE\]/g, sEffectsStyle);
      var sCaracsStyle = "display:none;";
      if(messages["item"]["carac"] != undefined && messages["item"]["typeid"] != 18)
      {
        sCaracsStyle = "";
        bDescription = false;
      }
      
      sCurrentTemplate = sCurrentTemplate.replace(/\[CARACSLISTSTYLE\]/g, sCaracsStyle);
      
      var sConditionsStyle = "display:none;";
      if(messages["item"]["conditionslist"] != undefined && messages["item"]["typeid"] != 18)
      {
        if(messages["item"]["carac"] == undefined){
          sConditionsStyle = "";
        }
        else
        {
          sConditionsStyle = "float:right;width:140px;padding:0;position:relative;left:-5px;";
        }
        bDescription = false;
      }
      
      sCurrentTemplate = sCurrentTemplate.replace(/\[CONDITIONSLISTSTYLE\]/g, sConditionsStyle);
      
      if(bDescription)
      {
        sCurrentTemplate = sCurrentTemplate.replace(/\[SUMMARY\]/g, messages["item"]["summary"]);
      }
      else
      {
        sCurrentTemplate = sCurrentTemplate.replace(/\[SUMMARY\]/g, "");
      }
      
      var sCraftStyle = "display:none;";
      var sCraftTitleStyle = "display:none;";
      if(messages["item"]["craftslist"] != undefined)
      {
        if(messages["item"]["craftslist"].length > 0)
        {
          var iCraftHeight = 0;
          if(messages["item"]["craftslist"].length%5 == 0)
            iCraftHeight = messages["item"]["craftslist"].length/5;
          else
            iCraftHeight = Math.floor(messages["item"]["craftslist"].length/5) + 1;
          if(iCraftHeight == 0)
            iCraftHeight = 1;
          sCraftStyle = "height:" + iCraftHeight*90 + "px;";
          sCraftTitleStyle = "";
        }
      }
      
      sCurrentTemplate = sCurrentTemplate.replace(/\[CRAFTLISTSTYLE\]/g, sCraftStyle);
      sCurrentTemplate = sCurrentTemplate.replace(/\[CRAFTLISTTITLESTYLE\]/g, sCraftTitleStyle);
      sEffects = "";
      if(messages["item"]["effectslist"] != undefined)
      {
	      sEffects += "<ul id=\"dofusitem_effects\">";
	      for(i=0;i<messages["item"]["effectslist"].length;i++)
	      {
	        sEffects += "<li>" + messages["item"]["effectslist"][i]["value"] + "</li>";
	      }
	      sEffects += "</ul>";
      }
      sCurrentTemplate = sCurrentTemplate.replace(/\[EFFECTSLIST\]/g, sEffects);
      // liste des conditions
      sConditions = "";
      if(messages["item"]["conditionslist"] != undefined)
      {
	      sConditions += "<ul id=\"dofusitem_conditions\">";
	      for(i=0;i<messages["item"]["conditionslist"].length;i++)
	      {
	        sConditions += "<li>" + messages["item"]["conditionslist"][i] + "</li>";
	      }
	      sConditions += "</ul>";
      }
      sCurrentTemplate = sCurrentTemplate.replace(/\[CONDITIONSLIST\]/g, sConditions);
      // fin liste des conditions
      sCaracs = "";
      if(messages["item"]["carac"] != undefined)
      {
        sCaracs = sCaracRow;
        sCaracs = sCaracs.replace(/\[PA\]/g, messages["item"]["carac"]["pa"]);
        sCaracs = sCaracs.replace(/\[PO\]/g, messages["item"]["carac"]["po"]);
        sCaracs = sCaracs.replace(/\[CC\]/g, messages["item"]["carac"]["cc"]);
        sCaracs = sCaracs.replace(/\[EC\]/g, messages["item"]["carac"]["ec"]);
      }
      sCurrentTemplate = sCurrentTemplate.replace(/\[CARACSLIST\]/g, sCaracs);
      sCrafts = "";
      if(messages["item"]["craftslist"] != undefined)
      {
        sCrafts += "<ul id=\"dofusitem_craftlist\">";
        for(i=0;i<messages["item"]["craftslist"].length;i++)
        {
          sCurrentRow = sCraftRow;
          sCurrentRow = sCurrentRow.replace(/\[TYPE_ID\]/g, messages["item"]["craftslist"][i]["typeid"]);
          sCurrentRow = sCurrentRow.replace(/\[GFXID\]/g, messages["item"]["craftslist"][i]["gfxid"]);
          if(messages["item"]["craftslist"][i]["quantity"] != undefined)
            sCurrentRow = sCurrentRow.replace(/\[QUANTITY\]/g, messages["item"]["craftslist"][i]["quantity"]);
          else sCurrentRow = sCurrentRow.replace(/\[QUANTITY\]/g, "1");
          sCurrentRow = sCurrentRow.replace(/\[NAME\]/g, messages["item"]["craftslist"][i]["name"]);
          sCrafts += "<li>" + sCurrentRow + "</li>";
        }
        sCrafts += "</ul>";
      }
      sCurrentTemplate = sCurrentTemplate.replace(/\[CRAFTLIST\]/g, sCrafts);
      //On savegarde le contenu sans avoir changer les count
      aItems[messages["item"]["id"]] = sCurrentTemplate;
      //On termine les remplacement
      sCurrentTemplate = sCurrentTemplate.replace(/\[ITEMHEADER\]/g, "itemHeader_" + iCount);
      sCurrentTemplate = sCurrentTemplate.replace(/\[NUMBER\]/g, iCount);
    break;
    case "xml" :
      var sPages = messages.getElementsByTagName('page');
      for (i = 0; i < sPages.length; i++)
      {
        var item = sPages[0].getElementsByTagName('item')[i];
        
        var itemId = item.attributes.getNamedItem('id').value;
        var itemName = item.attributes.getNamedItem('name').value;
        var itemSuperTypeId = '';
        if(item.attributes.getNamedItem('supertypeid') != undefined)
          itemSuperTypeId = item.attributes.getNamedItem('supertypeid').value;
        var itemTypeId = '';
        if(item.attributes.getNamedItem('typeid') != undefined)
          itemTypeId = item.attributes.getNamedItem('typeid').value;
        var itemGfxId = item.attributes.getNamedItem('gfxid').value;
        var itemLvl = item.attributes.getNamedItem('lvl').value;
        var itemUrl = item.attributes.getNamedItem('url').value;
        
        sCurrentTemplate = sCurrentTemplate.replace(/\[ITEM_NAME]/g, itemName);
        sCurrentTemplate = sCurrentTemplate.replace(/\[ITEM_LVL]/g, itemLvl);
        sCurrentTemplate = sCurrentTemplate.replace(/\[TYPE_ID]/g, itemTypeId);
        sCurrentTemplate = sCurrentTemplate.replace(/\[GFXID]/g, itemGfxId);
        
        for (j = 0; j < item.length; j++)
        {
          var aEffectsList = item[0].getElementsByTagName('effectslist')[j].firstChild.nodeValue
          var sSummary = item[0].getElementsByTagName('effectslist')[j].firstChild.nodeValue
          var sCraftslist = item[0].getElementsByTagName('effectslist')[j].firstChild.nodeValue
          var sSet = item[0].getElementsByTagName('effectslist')[j].firstChild.nodeValue
        }
      }
      aItems[item.attributes.getNamedItem('id').value] = sCurrentTemplate;
      //On remplace les count après avoir savgarder, afin de pour conserver la possibilité de la changer d'instance
      sCurrentTemplate = sCurrentTemplate.replace(/\[ITEMHEADER]/g, "itemHeader_" + iCount);
      sCurrentTemplate = sCurrentTemplate.replace(/\[NUMBER]/g, iCount);
    break;
    default:
      sCurrentTemplate = "";
    break;
  }
  
  return sCurrentTemplate;
  return "";
}

//Fonction d'affichage d'une valeure existante 
function ProcessExistingData(itemId)
{
  bLoading = false;
  sCurrentTemplate = aItems[itemId];
  //On remplace les count par ceux de la nouvelle instance
  sCurrentTemplate = sCurrentTemplate.replace(/\[ITEMHEADER\]/g, "itemHeader_" + iCount);
  sCurrentTemplate = sCurrentTemplate.replace(/\[NUMBER\]/g, iCount);
  if(div[iCount] != undefined)
  {
	  div[iCount].style.display = "";
	  div[iCount].innerHTML = sCurrentTemplate;
  }
}

function OpenCloseIlContent(id, titleId)
{
  var oContent = document.getElementById(id);
  var oTitleId = document.getElementById(titleId);
  if(oContent != undefined)
  {
    if(oContent.style.display == "")
    {
      oTitleId.className = "il_spec_btn_title_left il_spec_title_rec_close";
      oContent.style.display = "none";
    }
    else
    {
      oTitleId.className = "il_spec_btn_title_left il_spec_title_rec_open";
      oContent.style.display = "";
    }
  }
}

/************************************/
/******        LOADER             ********/
/************************************/
//Affichage de la popup
DofusLinker.ShowItem = function (currentObject, itemId, lang, sCallbackType)
{
  if(lang == null)
    lang = 'fr';
  if(sCallbackType == null)
    sCallbackType = 'jsonp';
   
  if(iState[iCount] == 0 && iBlock[iCount] == 0)
  {
   bLoading = true;
   //On créé la div pour le chargement
   div[iCount] = document.createElement("div");
   div[iCount].setAttribute('id', 'dofusitem_' + iCount);
   div[iCount].style.position = 'absolute';
   div[iCount].style.display = '';
   document.body.appendChild(div[iCount]);

  div[iCount].innerHTML = "<img src='/img/ajax-loader.gif' alt='' title=''>";
  var loader = new YAHOO.util.YUILoader(
  { 
    require: ["connection", "dragdrop", "animation", "json", "get"],
    loadOptional: false,
    onSuccess: function(o)
    {
      div[iCount].style.left = fCoordX + "px";
      div[iCount].style.top = fCoordY + "px";
      div[iCount].style.zIndex = "5001";
      
      if(aItems[itemId] == null)
       {
         var bResult = true;
         switch(sCallbackType)
         {
          case "json":
            var sPostData = 'itemid=' + itemId + '&lang=' + lang + '&type=' + sCallbackType;
            var request = YAHOO.util.Connect.asyncRequest('POST', sItemUrl, callbackjson, sPostData);
          break;
          case "jsonp":
            sCurrentUrl = sItemUrl + '?itemid=' + itemId + '&lang=' + lang + '&type=' + sCallbackType;
            YAHOO.util.Get.script(sCurrentUrl, { onSuccess: SuccessHandlerJSONP, onFailure: FailureHandlerJSONP});
          break;
          case "xml":
             var sPostData = 'itemid=' + itemId + '&lang=' + lang + '&type=' + sCallbackType;
             var request = YAHOO.util.Connect.asyncRequest('POST', sItemUrl, callbackxml, sPostData);
           break;
           default:
             bResult = false;
           break;
          }
        }
        else
        {
          ProcessExistingData(itemId);
          bResult = true;
        }

      if(bResult)
      {
        iState[iCount] = 1;
              
        //Permet de faire du drag and drop sur la popup
        (function() 
        { 
          var ddDofusItem; 
          // Configure one or more child element as a drag handle 
          ddDofusItem = new YAHOO.util.DD("dofusitem_" + iCount); 
          ddDofusItem.setHandleElId("itemHeader_" + iCount);
        })();
       }
       else
       {
        //Si on est pas dans un des cas possible on supprime la div
        document.body.removeChild(div[iCount]);
       }
    },
    onFailure: function(o)
    {
      document.body.removeChild(div[iCount]);
    }
  });
   //Si la variable sTemplate n'est pas définie on en charge une par défaut
    if(!is_defined('sTemplate'))
    {
      loader.addModule({
          name: "template",
          type: "js",
          fullpath: sTemplateUrl
      });
      loader.require("template");
    }
    loader.insert();
  }
}

DofusLinker.Item = function (currentObject, itemId, lang)
{
  if(lang == null)
    lang = 'fr';

  currentObject.style.cursor = "pointer";
  currentObject.onclick = function(){BlockItem();};
  currentObject.onmouseout = function(){CloseItem();};
  currentObject.removeAttribute("href");
  DofusLinker.ShowItem(currentObject, itemId, lang);
}

function is_defined(mVar)
{
  return(typeof(window[mVar]) == "undefined")?  false: true;
}
