/*licence/ 

Module écrit, supporté par la société Alkante SAS <alkante@alkante.com>

Nom du module : Alkanet::Class::Form
Module fournissant les classes d'affichage Alkanet.
Ce module appartient au framework Alkanet.

Ce logiciel est régi par la licence CeCILL-C soumise au droit français et
respectant les principes de diffusion des logiciels libres. Vous pouvez
utiliser, modifier et/ou redistribuer ce programme sous les conditions
de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA
sur le site http://www.cecill.info.

En contrepartie de l'accessibilité au code source et des droits de copie,
de modification et de redistribution accordés par cette licence, il n'est
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
seule une responsabilité restreinte pèse sur l'auteur du programme, le
titulaire des droits patrimoniaux et les concédants successifs.

A cet égard l'attention de l'utilisateur est attirée sur les risques
associés au chargement, à l'utilisation, à la modification et/ou au
développement et à la reproduction du logiciel par l'utilisateur étant
donné sa spécificité de logiciel libre, qui peut le rendre complexe à
manipuler et qui le réserve donc à des développeurs et des professionnels
avertis possédant des connaissances informatiques approfondies. Les
utilisateurs sont donc invités à charger et tester l'adéquation du
logiciel à leurs besoins dans des conditions permettant d'assurer la
sécurité de leurs systèmes et ou de leurs données et, plus généralement,
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.

Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
pris connaissance de la licence CeCILL-C, et que vous en avez accepté les
termes.

/licence*/


/**
 * Fonction d'ajout de pièces jointes pour les upload dynamiques
 */
function AjouterPJ(formName, ctrlName, token){
  var oForm = eval('document.'+formName);
  var bSelect = false;
  var bSelectExists = false;
  if (oForm){
    var oCtrl = oForm.elements["files_"+ctrlName];
    if( oCtrl ) {
      bSelectExists = true;
      bSelect = ( oCtrl.selectedIndex > 0 );
    }
    if( !bSelect ) {
      oCtrl = oForm.elements["file_"+ctrlName];
    }
    if( oCtrl ) {
      var bVal = ( bSelect ? true : (oCtrl.value!='') );   
      var nbMaxPj = oForm.elements["nbMaxPj_"+ctrlName];
      var nbPJ = oForm.elements["nbPJ_"+ctrlName];
      if ( nbMaxPj && nbPJ ){
        if ( nbMaxPj.value==nbPJ.value ){
          alert("Nombre maximal de fichiers acceptés atteint.\nUtiliser la suppression pour substituer un fichier.");
          return;
        }
      }
      if( bVal ) {
        SupprimerPJ(formName, ctrlName, token, 1);
      } else {
        alert("Utilisez le bouton Parcourir pour sélectionner le fichier à ajouter"+
              ( bSelectExists 
                ? "\nou bien sélectionnez un fichier présent sur le FTP."
                : "" ));
      }
    }
  }
}

/**
 * Fonction de suppression de pièces jointes pour les upload dynamiques
 */
function SupprimerPJ(formName, ctrlName, token){
  var nbArgs = 3;
  var iMode = 2;
  if (arguments.length>nbArgs){
    iMode = arguments[nbArgs];
  }
  var oForm = eval('document.'+formName);
  if (oForm){
    if ( iMode==2 ){
      var bCheck = false;
      var nbPJ = oForm.elements["nbPJ_"+ctrlName].value;
      for (var i=0; i<nbPJ; i++){
        var oCheck = oForm.elements["suppj_"+i];
        bCheck = (oCheck && oCheck.checked);
        if (bCheck) break;
      }
      if ( !bCheck || !confirm("Confirmer la suppression des pièces jointes sélectionnées ?") ){
        var oCheckAll = oForm.elements["check_all_"+ctrlName];
        if ( oCheckAll ) {
          oCheckAll.checked = false;
          if ( oCheckAll.onclick )
            oCheckAll.onclick();
        }
        return;
      }
    }
    var strUrl = "alkanet_process.php?iMode="+iMode+"&token=" + token;
    var oldAction = oForm.action;
    var oldTarget = oForm.target;
    oForm.target = 'ifr_upload_'+ctrlName;
    oForm.action = strUrl;
    oForm.submit();
    oForm.target = oldTarget;
    oForm.action = oldAction;
    
    var oCheckAll = oForm.elements["check_all_"+ctrlName];
    if ( oCheckAll ) {
      oCheckAll.checked = false;
      if ( oCheckAll.onclick )
        oCheckAll.onclick();
    }
    
  }
}

function CheckAll(formName, ctrlName, oCheckAll){
  var oForm = eval('document.'+formName);
  if (oForm){
    var nbPJ = oForm.elements["nbPJ_"+ctrlName].value;
    for (var i=0; i<nbPJ; i++){
      var oCheck = oForm.elements["suppj_"+i];
      if (!oCheck) continue;
      oCheck.checked = oCheckAll.checked;
    }
  }
}

function OpenCloseMenu(oSrc, destName, action)
{
  var oDiv = document.getElementById(destName);
  if( oDiv ) {
    var oStyle = ( oDiv.style ? oDiv.style : oDiv );  
    oStyle.display = ( action=='over' ? 'block' : 'none' );
  }
}

function DownloadMedia(strToken)
{
  OpenWindow(ALK_ALKANET_DOWNLOAD+"?token="+strToken, "425", "600", "_pluginMultiMedia", "yes");
}
function Download(strToken)
{
  OpenFooterExec(ALK_ALKANET_DOWNLOAD+"?token="+strToken);
}
function DownloadAll(strToken)
{
  OpenFooterExec(ALK_ALKANET_DOWNLOAD+"?token="+strToken);
}


/**
 * Function appelée après qu'un upload swf s'est terminé avec succès
 * @param server_data retour de l'opération
 */
function AlkUploadSuccess(server_data)
{
  var layerName = ""; 
  var htmlContents = "";
  
  if( arguments.length == 2 ) {
    layerName    = arguments[1];
    htmlContents = server_data;
  } else {
    var oRes = eval("("+server_data+")");
    layerName     = oRes.layerName;
    htmlContents = oRes.htmlContents;
  }

  oDiv = document.getElementById(layerName);
  if( oDiv ) {
    oDiv.innerHTML = htmlContents;
  }
}

function AlkUploadSuccessByUrl(strUrl)
{
  var oAjax = new AlkAjax('updatePj', 'AlkUploadSuccess', ALK_FORM_METHOD_GET, strUrl, null);
}

function delPJ(formName, ctrlName, strToken)
{
  var oForm = eval('document.'+formName);
  if (oForm){
    var bCheck = false;
    var nbPJ = oForm.elements["nbPJ_"+ctrlName].value;
    for (var i=0; i<nbPJ; i++){
      var oCheck = oForm.elements["suppj_"+i];
      bCheck = (oCheck && oCheck.checked);
      if (bCheck) break;
    }
    if ( !bCheck || !confirm("Confirmer la suppression des pièces jointes sélectionnées ?") ){
      var oCheckAll = oForm.elements["check_all_"+ctrlName];
      if ( oCheckAll ) {
        oCheckAll.checked = false;
        if ( oCheckAll.onclick )
          oCheckAll.onclick();
      }
      return;
    }
  }
  var oAjax = new AlkAjax('delPj', 'AlkUploadSuccess', ALK_FORM_METHOD_POST, 
                          ALK_ALKANET_ROOT_URL+'scripts/alkanet/alkanet_process.php?iMode=6&token='+strToken, formName);
  var oCBAll = oForm.elements["check_all_"+ctrlName];
  oCBAll.checked = false; 
}

/**
 * Fonctions upload ajax, un seul téléchargement possible à la fois
 */
var alkHtmlUploadTabInfo = new Array();
var alkHtmlUploadStartTime = 0;

/**
 * Retourne la taille d'un fichier avec l'unité adéquate
 */
function getFilesizeFormat(num, space)
{
  var unit;
  if( num < 1024 ) { 
    unit = 'o';
  } else if( num < 1024*1024 ) { 
    num = Math.round((num*100)/1024);
    num = num/100;
    num = num.toString();
    unit = 'ko';
  } else { 
    num = Math.round((num*100)/(1024*1024));
    num = num/100;
    num = num.toString();
    unit = 'Mo';
  }
  return num + space + unit;
}

/**
 * Retourne le temps restant avec l'unité adéquate
 */
function getTimeFormat(num, space)
{
  var unit;
  if( num >= (60*60) ) {
    var secs_left = num % (60*60);
    var mins_left = secs_left / 60;
    mins_left = mins_left.toString();
    // note extra escaping necessary since we're printing this JS code from Perl...
    mins_left = mins_left.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.
    mins_left = mins_left.replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.

    num = num/(60*60);
    num = num.toString();
    // note extra escaping necessary since we're printing this JS code from Perl...
    num = num.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.

    num = num + space + 'h' + space + mins_left + space + 'mn';
    space = '';
    unit = '';
  }
  else if(num >= 60) {
    var secs_left = num % 60;
    secs_left = secs_left.toString().replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.

    num = num/60;
    num = num.toString();
    // note extra escaping necessary since we're printing this JS code from Perl...
    num = num.replace( /^(\d+)\..*/, '$1' ); // show no decimal places.
    num = num.replace( /^(\d)$/, '0$1' ); // for single-digits, prepend a zero.

    num = num + space + 'mn' + space + secs_left + space + 's';
    space = '';
    unit = '';
  }
  else {
    unit = 's';
  }
  return num + space + unit;
}

function alkHtmlUploadInfo()
{
  strUrl = alkHtmlUploadTabInfo["alkanetRootUrl"]+"scripts/alkanet/alkanet_process.php?iMode=9&token="+
    alkHtmlUploadTabInfo["token"]+"&ids=" + alkHtmlUploadTabInfo["session"];
  var oAjax = new AlkAjax("", "alkHtmlUploadUpdateProgress", "GET", strUrl, null);
}

function alkHtmlUploadUpdateProgress(strResponse)
{
  // mise à jour de la barre de progression, appel cyclique jusqu'à error ou fin de transfert
  var tabUpdate = new Array();
  tabUpdate = strResponse.split('|');

  var oDiv = document.getElementById(alkHtmlUploadTabInfo["divProgressBar"]);
  if( !oDiv ) return;
  var oStyle = ( oDiv.style ? oDiv.style : oDiv ); 

  var iStatus = tabUpdate[0];
  var strError = "";
  var completedUploadSize = 0;
  var totalUploadSize = 0;
  if( alkHtmlUploadStartTime == 0 ) {
    // transfert annulé, affichage durant 2s avant d'effacer la barre de progression
    oDiv.innerHTML = "Transfert annulé.";
    oStyle.backgroundPosition = "0px 0px";
    window.setTimeout("alkHtmlUploadEndProgress()", 2000);
    return;
  } else if( iStatus == 0 ) {
    // erreur détectée, affichage de l'erreur durant 2s avant d'effacer la barre de progression
    oDiv.innerHTML = tabUpdate[1];
    oStyle.backgroundPosition = "0px 0px";
    window.setTimeout("alkHtmlUploadHideProgress()", 2000);
    return;
  } else if( iStatus == 2 ) {
    // info non reçue, on réitère la progression
    oDiv.innerHTML = "Transfert en cours...";
    window.setTimeout("alkHtmlUploadInfo()", 1000);
    return;
  } else {
    totalUploadSize = tabUpdate[1];
    completedUploadSize = tabUpdate[2];
  }

  if( completedUploadSize == 0 && totalUploadSize == 0 ) {
    // transfert non démarré, réitère la progression
    window.setTimeout("alkHtmlUploadInfo()", 1000);
    return;
  } 
  if( totalUploadSize == completedUploadSize ) {
    // fin de transfert, appelle la phase d'enregistrement
    oDiv.innerHTML = 'Traitement serveur en cours...';
    oStyle.backgroundPosition = oStyle.width+" 0px"; 
    alkHtmlUploadEndProgress();
    return;
  }

  var d = new Date();
  var elapsedTime = parseInt(d.getTime()/1000) - alkHtmlUploadStartTime;

  var progressPercent = ( totalUploadSize>0 ? Math.ceil((completedUploadSize/totalUploadSize)*100) : 0 );
  var totalTime = (  totalUploadSize>0 ? parseInt( elapsedTime/(completedUploadSize/totalUploadSize) ) : 0 );
  var strTransferRate = getFilesizeFormat((elapsedTime>0 ? completedUploadSize/elapsedTime : 0), '&nbsp;');
  var strRemainingTime = getTimeFormat( (totalTime - elapsedTime), '&nbsp;');

  oDiv.innerHTML = "Transfert en cours... " +
    ( progressPercent > 0
      ? progressPercent + "% - " + strTransferRate + "/s - " + strRemainingTime + " restant"
      : "" );

  var iWidth = parseInt(oStyle.width);
  oStyle.backgroundPosition = Math.round(iWidth*progressPercent/100)+"px 0px"; 
  
  // transfert en cours, réitère la progression
  window.setTimeout("alkHtmlUploadInfo()", 1000);
}

function alkHtmlUploadStartProgress()
{
  var oDiv = document.getElementById(alkHtmlUploadTabInfo["divProgressBar"]);
  if( !oDiv ) return;
  var oStyle = ( oDiv.style ? oDiv.style : oDiv ); 
  oStyle.display = "block";
  oDiv.innerHTML = 'Envoi en cours... 0%';

  var d = new Date();
  alkHtmlUploadStartTime = parseInt(d.getTime()/1000);

  window.setTimeout("alkHtmlUploadInfo()", 1000);
}

function alkHtmlUploadEndProgress()
{
  // le transfert est terminé, phase de renommage et enregistrement en base
  strUrl = alkHtmlUploadTabInfo["alkanetRootUrl"]+"scripts/alkanet/alkanet_process.php?iMode=8&token="+
    alkHtmlUploadTabInfo["token"]+"&fn=" + alkHtmlUploadTabInfo["fileName"];
  var oAjax = new AlkAjax("", "alkHtmlUploadHideProgress", "GET", strUrl, null);
}

function alkHtmlUploadHideProgress(pj_id)
{
  // enregistrement terminé, cache la barre de progression
  var oDiv = document.getElementById(alkHtmlUploadTabInfo["divProgressBar"]);
  if( !oDiv ) return;
  var oStyle = ( oDiv.style ? oDiv.style : oDiv ); 
  oDiv.innerHTML = 'Terminé.';
  oStyle.display = "none";
  alkHtmlUploadStartTime = 0;
  AlkUploadSuccessByUrl(alkHtmlUploadTabInfo["urlRefreshList"]);
  
  var oCtrlFile = alkHtmlUploadTabInfo["ctrlFile"];
  if( !alkHtmlUploadTabInfo["bIE"] ) {
    var oTag = document.getElementById(alkHtmlUploadTabInfo["parentCtrlFileId"]);
    oTag.appendChild(oCtrlFile);
  }
  var oStyleF = ( oCtrlFile.style ? oCtrlFile.style : oCtrlFile ); 
  oStyleF.display = "";
  oCtrlFile.value = "";
  
  if( alkHtmlUploadTabInfo["ctrlPjId"] ) {
    alkHtmlUploadTabInfo["ctrlPjId"].value = pj_id;
  }
}

function getUploadForm(f)
{
  var d = document;
  var strNewName = f.name+"_send";
  var fu = d.forms[strNewName];
  if( fu ) {
    return fu;
  }
  
  var oParent = document.getElementById(f.parentNode.id);
  if( !oParent ) {
    oParent = document.getElementsByTagName("body")[0];
  }
  fu = d.createElement("FORM");
  fu.id = strNewName;
  fu.name = strNewName;
  fu.enctype = f.enctype;
  fu.method = f.method;
  var oStyle = ( fu.style ? fu.style : fu );
  oStyle.width = "0px";
  oStyle.height = "0px";
  oStyle.overflow = "hidden";
  oStyle.padding = "0px";
  oStyle.margin = "0px";
  
  oParent.appendChild(fu);
  
  return fu;
}

function doAjaxUpload(strFormName, strTarget, strParentCtrlFileId, strDivProgressBar, oCtrlFile, 
                                   strTokenSave, strSession, strTmpPath, strAlkanetRootUrl, strUrlRefreshList, strCtrlPjIdName)
{
  var bIE = ( navigator.appName.indexOf("Explorer") != -1 ? true : false );

  if( alkHtmlUploadStartTime > 0 ) return;
    
  var f = document.forms[strFormName];
  if( !f ) return;

  var nbMaxPj = f.elements["nbMaxPj_"+oCtrlFile.name.substr(5)];
  var nbPJ = f.elements["nbPJ_"+oCtrlFile.name.substr(5)];
  if ( nbMaxPj && nbPJ && nbMaxPj.value==nbPJ.value ) {
    alert("Nombre maximal de fichiers acceptés atteint.\nUtiliser la suppression pour substituer un fichier.");
    return;
  }

  var strFileName = oCtrlFile.value;
  if( strFileName == "" ) return;

  var iPos = strFileName.lastIndexOf("/");
  if( iPos == -1 ) {
    iPos = strFileName.lastIndexOf("\\");
  }
  if( iPos != -1 ) {
    strFileName = strFileName.substr(iPos+1);
  }

  // initialisation et démarrage de la phase de transfert
  alkHtmlUploadTabInfo["parentCtrlFileId"] = strParentCtrlFileId;
  alkHtmlUploadTabInfo["ctrlFile"]       = oCtrlFile;
  alkHtmlUploadTabInfo["token"]          = strTokenSave;
  alkHtmlUploadTabInfo["session"]        = strSession.substr(0, strSession.indexOf("_"));
  alkHtmlUploadTabInfo["fileName"]       = strFileName;
  alkHtmlUploadTabInfo["alkanetRootUrl"] = strAlkanetRootUrl;
  alkHtmlUploadTabInfo["divProgressBar"] = strDivProgressBar;
  alkHtmlUploadTabInfo["urlRefreshList"] = strUrlRefreshList;
  alkHtmlUploadTabInfo["bIE"]            = bIE;
  alkHtmlUploadTabInfo["ctrlPjId"]       = ( strCtrlPjIdName != "" ? f.elements[strCtrlPjIdName]: null );

  var fu = null;
  if( !bIE ) {
    fu = getUploadForm(f);
    fu.appendChild(oCtrlFile);
  } else {
    fu = f;
    var oStyle = ( oCtrlFile.style ? oCtrlFile.style : oCtrlFile );
    oStyle.display = "none"; 
  }

  fu.enctype = "multipart/form-data";
  fu.action = strAlkanetRootUrl+"scripts/alkanet/cgi-bin/alkanet_upload.cgi?ids="+strSession+"_"+oCtrlFile.name+"&dtmp="+strTmpPath;
  fu.targetOld = fu.target; 
  fu.target = strTarget;
  alkHtmlUploadStartProgress();
  fu.submit();
  fu.target = fu.targetOld;
}

function cancelAjaxUpload(strTarget)
{
  if( alkHtmlUploadStartTime > 0 ) {
    alkHtmlUploadStartTime = 0;
    var oIFrame = document.getElementById(strTarget);
    if( oIFrame ) {
      var oWind = oIFrame.contentWindow;
      if( oWind ) {
        if( oWind.stop ) 
          oWind.stop();
      }
    }
  }
}
