/* $Id: module-eadeac-basket.js 14669 2009-05-07 13:02:25Z jcwiklinski $ */
/**
Copyright (C) 2003-2008 AJLSM, Anaphore
Voir le fichier LICENCE
**/
/* Ce fichier de configuration fait partie de la distribution standard
de Pleade. Vous pouvez le modifier à votre guise. */
var tbls = new Array();// Les YUI DataTable

var _tblId = null;
//Il ne faut pas avoir une variable globale nommée _base ici, elle prend le dessus
//sur celle de module-ead-xslt.js
var _bbase = null;
var _isSortable = null;
var _sort_field = null;
var _sort_dir = null;

/**
 * Fonction gerant l'ajout de documents dans le porte-documents
 *
 * @param params {String} Les parametres qui seront passes avec l'URL.
 * @param target {String} L'objet HTML/DOM sur lequel on agira pour suivre le
 *                        processus.
 * @param base {String} L'identifiant de la base de documents. (optionel).
 */
function addToBasket( params, target, base, disables ) {
  if ( !params || !target ) return false;
  Element.extend( target );
  if (disables==null){
    disables = new Array();
    disables[0] = target;
  }
  var oInnerHTML = target.innerHTML;
  var url = 'functions/' + ((!base)?"ead/":base+"/") + 'addToBasket.json?';
  var ajax = new Ajax.Request( url, {
                               parameters: params,
                               onCreate: function(){
                                 target.innerHTML = "<span class=\"access\">Ajout en cours...</span>"; // TODO (MP) : i18n
                                 target.addClassName('pl-bskt-bttn-loading');
                               },
                               onFailure: function(){
                                 target.innerHTML = "<span class=\"access\">Echec...</span>"; // TODO (MP) : i18n
                                 target.removeClassName('pl-bskt-bttn-loading');
                               },
                               onSuccess: function(xhr){
                                 target.innerHTML = oInnerHTML;
                                 target.removeClassName('pl-bskt-bttn-loading');
                                 var success=false;
                                 var msgCode = "";
                                 if(xhr.responseText){
                                   var oJson = xhr.responseText.evalJSON();
                                   success = oJson.success;
                                   if(oJson.msgCode){
                                     msgCode = oJson.msgCode;
                                   }
                                 }
                                 if(success){
                                   if(disables){
                                     disables.each(function(o){
                                       if(o){
                                         o.disabled = true;
                                         o.addClassName("disabled");
                                         // o.style.visibility="hidden";
                                       }
                                     });
                                   }
                                 }
                                 else{
                                   if(!msgCode) msgCode = "basket_msg_addToBasket_ko";
                                 }

                                 var msg = eval( "_usersMessagesBasket."+msgCode );
                                 if(msg) {
                                  alert(msg);
                                 }
                                 else if(msg){
                                   alert(msg);
                                 }

                               }
                            });
}
/**
 * Fonction gerant l'ajout d'une page complete de documents dans le porte-
 * documents.
 *
 * @param params {String} Les parametres qui seront passes avec l'URL.
 * @param target {String} L'objet HTML/DOM sur lequel on agira pour suivre le
 *                        processus.
 * @param base {String} L'identifiant de la base de documents. (optionel).
 */
function addPageToBasket(params, target, base){
  return addToBasket(params, target, base);
  // TODO (MP) : Trouver moyen de desactiver les boutons d'une page de resultat.
}
/**
 * Fonction gerant l'ajout d'un resultat de recherche dans le porte-
 * documents.
 *
 * @param params {String} Les parametres qui seront passes avec l'URL.
 * @param target {String} L'objet HTML/DOM sur lequel on agira pour suivre le
 *                        processus.
 * @param base {String} L'identifiant de la base de documents. (optionel).
 */
function addResultsToBasket(params, target, base){
  return addToBasket(params, target, base/* , $$('button.pl-bskt-bttn') */);
  // TODO (MP) : Trouver moyen de desactiver les boutons d'un resultat.
}
/**
 * Fonction gerant l'ajout d'un document dans le porte-documents.
 *
 * @param params {String} Les parametres qui seront passes avec l'URL.
 * @param target {String} L'objet HTML/DOM sur lequel on agira pour suivre le
 *                        processus.
 * @param base {String} L'identifiant de la base de documents. (optionel).
 */
function addDocToBasket(params, target, base){
  return addToBasket(params, target, base);
}

/**
 * Fonction pour retirer des documents du panier
 *
 * @param params {String} Parametres d'URL a passer.
 * @param target {Node} L'objet XHTML/DOM a mettre a jour pour suivre
 *                      l'evolution du processus.
 * @param base {String} L'identifiant de la base de document (optionel)
 * @param fct {function()} La fonction utilisee en fin de processus. Si null, on
 *                         recharge la page.
 */
function deleteFromBasket( params, target, base, fct ) {
  if ( !params || !target ) return false;
  Element.extend( target );
  var oInnerHTML = target.innerHTML;
  var url = 'functions/' + ((!base)?"ead/":base+"/") + 'deleteFromBasket.json?';
  var ajax = new Ajax.Request( url, {
                               parameters: params,
                               onCreate: function(){
                                 target.innerHTML = "Traitement en cours...";
                               },
                               onFailure: function(){
                                 target.innerHTML = "Echec...";
                               },
                               onSuccess: function(xhr){
                                 target.innerHTML = oInnerHTML;
                                 var success=false;
                                 var msg = "Echec...";
                                 if(xhr.responseText){
                                   var oJson = xhr.responseText.evalJSON();
                                   success = oJson.success;
                                   msg = oJson.description;
                                 }
                                 if(msg) alert(msg);
                                 if(fct) fct();
                                 else window.location.reload();
                               }
                            });
}

/**
 * Pleade Plus:
 * Fonction pour retirer des documents du panier d'images
 *
 * @param params {String} Parametres d'URL a passer.
 * @param target {Node} L'objet XHTML/DOM a mettre a jour pour suivre
 *                      l'evolution du processus.
 * @param base {String} L'identifiant de la base de document (optionel)
 * @param fct {function()} La fonction utilisee en fin de processus. Si null, on
 *                         recharge la page.
 */
function deleteFromImageBasket( params, target, base, fct ) {
  if ( !params || !target ) return false;
  Element.extend( target );
  var oInnerHTML = target.innerHTML;
  var url = 'functions/';
	if( params == 'empty' ){
		url += 'emptyImageBasket';
	}else{
		url += 'removeImageFrombasket';	
	}
	url += '.json';
	//this.series.baselink + 'img-viewer/removefrombasket.json';
  var ajax = new Ajax.Request( url, {
                               parameters: params,
                               onCreate: function(){
                                 target.innerHTML = "Traitement en cours...";
                               },
                               onFailure: function(){
                                 target.innerHTML = "Echec...";
                               },
                               onSuccess: function(xhr){
                                 target.innerHTML = oInnerHTML;
                                 var success=false;
                                 var msg = "Echec...";
                                 if(xhr.responseText){
                                   var oJson = xhr.responseText.evalJSON();
                                   success = oJson.success;
                                   msg = oJson.description;
                                 }
                                 if(msg) alert(msg);
                                 if(fct) fct();
                                 else window.location.reload();
                               }
                            });
}

/**
 * Fonction de vidange complete du panier
 * @param target {Node} L'objet XHTML/DOM a mettre a jour pour suivre
 *                      l'evolution du processus.
 * @param base {String} L'identifiant de la base de document (optionel)
 */
function flushBasket(target, base){
  try{
		refreshDataTB = function(){
			if(tbls!=null){
				try{
					if(base && !base.blank() && tbls[tblId]){
						// on connait precisemment la dataTable que l'on veut rafraichir
						refreshDataTable(tlbs["pl-bskt-cnt-"+base]);
					}
					else if(selectedBases!=null && selectedBases.length>0){
						// on connait precisemment la/les dataTable(s) que l'on veut rafraichir
						var dt=null;
						$A(selectedBases).each(function(o,i){
							dt = tbls["pl-bskt-cnt-"+o];
							if(dt!=null && dt.sortable!=null){
								_tblId = "pl-bskt-cnt-"+o;
								_bbase = o;
								refreshDataTable(dt);
							}
						});
					}
					/* On ne connait pas precisemment la/les dataTable(s) que l'on veut
					 * rafraichir. On les rafraichit toutes.*/
          /* NOTE [JC] : il n'est visiblement pas possible d'itérer un tableau nommé !!! */
					else {
						window.location.reload();
						/*var dt=null;
						$A(tbls).each(function(o,i){
							dt = o;
							if(o!=null && o.sortable!=null){
								refreshDataTable(o);
							}
						});*/
					}
				} catch(e){
					window.location.reload();
				}
			}
			else
					window.location.reload();
		};

    deleteFromBasket('id=all', target, base, refreshDataTB);
		// FIXME [JC]: hack à la con... Il faut récrire proprement le rechargement des DT, ça pète avec le panier images
    /*deleteFromBasket('id=all', target, base, function(){ window.location.reload(); });*/
  } catch(e){}
}

/**
 * Pleade Plus:
 * Fonction de vidange complete du panier d'images
 * @param target {Node} L'objet XHTML/DOM a mettre a jour pour suivre
 *                      l'evolution du processus.
 * @param base {String} L'identifiant de la base de document (optionel)
 */
function flushImageBasket(target, base){
  try{
		refreshDataTB = function(){
			if(tbls!=null){
				try{
					if(base && !base.blank() && tbls[tblId]){
						// on connait precisemment la dataTable que l'on veut rafraichir
						refreshDataTable(tlbs["pl-bskt-cnt-"+base]);
					}
					else if(selectedBases!=null && selectedBases.length>0){
						// on connait precisemment la/les dataTable(s) que l'on veut rafraichir
						var dt=null;
						$A(selectedBases).each(function(o,i){
							dt = tbls["pl-bskt-cnt-"+o];
							if(dt!=null && dt.sortable!=null){
								_tblId = "pl-bskt-cnt-"+o;
								_bbase = o;
								refreshDataTable(dt);
							}
						});
					}
					/* On ne connait pas precisemment la/les dataTable(s) que l'on veut
					 * rafraichir. On les rafraichit toutes.*/
          /* NOTE [JC] : il n'est visiblement pas possible d'itérer un tableau nommé !!! */
					else {
						window.location.reload();
						/*var dt=null;
						$A(tbls).each(function(o,i){
							dt = o;
							if(o!=null && o.sortable!=null){
								refreshDataTable(o);
							}
						});*/
					}
				} catch(e){
					window.location.reload();
				}
			}
			else
					window.location.reload();
		};
    deleteFromImageBasket('empty', target, base, refreshDataTB);
  } catch(e){}
}

/**
 * Fonction pour retirer des documents du panier
 *
 * @param ids {String[]} Liste des identifiants des documents a retirer
 * @param target {Node} L'objet XHTML/DOM a mettre a jour pour suivre
 *                      l'evolution du processus.
 * @param base {String} L'identifiant de la base de document (optionel)
 */
function deleteSelectedFromBasket(ids, target, base){
  if(!ids || !target) return false;
  var slcts = $A(ids);
  var params = "";
  slcts.each(function(o){
    if(o && !o.blank())
    params += "&id=" + o;
  });
  refreshDataTB = function(){
    if(tbls!=null){
      try{
        if(base && !base.blank() && tbls[tblId]){
          // on connait precisemment la dataTable que l'on veut rafraichir
          refreshDataTable(tlbs["pl-bskt-cnt-"+base]);
        }
        else if(selectedBases!=null && selectedBases.length>0){
          // on connait precisemment la/les dataTable(s) que l'on veut rafraichir
          var dt=null;
          $A(selectedBases).each(function(o,i){
            dt = tbls["pl-bskt-cnt-"+o];
            if(dt!=null && dt.sortable!=null){
							_tblId = "pl-bskt-cnt-"+o;
							_bbase = o;
              refreshDataTable(dt);
            }
          });
        }
				/* On ne connait pas precisemment la/les dataTable(s) que l'on veut
				 * rafraichir. On les rafraichit toutes.*/
				/* NOTE [JC] : il n'est visiblement pas possible d'itérer un tableau nommé !!! */
        else {
					window.location.reload();
          /*var dt=null;
          $A(tbls).each(function(o,i){
          	dt = o;
            if(o!=null && o.sortable!=null){
            	refreshDataTable(o);
            }
          });*/
        }
      } catch(e){
        window.location.reload();
      }
    }
    else
        window.location.reload();
  };
  try{
    deleteFromBasket(params, target, base, refreshDataTB/*null*/);
  } catch(e){}
}

/**
 * Pleade Plus:
 * Fonction pour retirer des documents du panier d'images
 *
 * @param ids {String[]} Liste des identifiants des documents a retirer
 * @param target {Node} L'objet XHTML/DOM a mettre a jour pour suivre
 *                      l'evolution du processus.
 * @param base {String} L'identifiant de la base de document (optionel)
 */
function deleteSelectedFromImageBasket(ids, target, base){
  if(!ids || !target) return false;
  var slcts = $A(ids);
  var params = "";
  slcts.each(function(o){
    if(o && !o.blank())
    params += "&ids=" + o;
  });
  refreshDataTB = function(){
    if(tbls!=null){
      try{
        if(base && !base.blank() && tbls[tblId]){
          // on connait precisemment la dataTable que l'on veut rafraichir
					dt = tlbs["pl-bskt-cnt-"+base];
					if (dt!=null){
						/* FIXME [JC]: ici, on réinitialise la DataTable de zéro, la méthode de 
						rechargement perd ses jeunes à un moment... */
						var dtb = dt.getDataTable();
						/*var dsr = dt.getDataSource();
						dsr.sendRequest("page=1", dtb.onDataReturnInitializeTable, dtb);*/
						var __sort_field = _sort_field;
						var __sort_dir = _sort_dir;
						if(dtb._configs.sortedBy.key != null) __sort_field = dtb._configs.sortedBy.key;
						if(dtb._configs.sortedBy.dir != null) __sort_dir = dtb._configs.sortedBy.dir;
						initImagesBasketTable(_tblId, _bbase, _isSortable, __sort_field, __sort_dir);
					}

          //refreshDataTable(tlbs["pl-bskt-cnt-"+base]);
        }
        else if(selectedBases!=null && selectedBases.length>0){
          // on connait precisemment la/les dataTable(s) que l'on veut rafraichir
          var dt=null;
          $A(selectedBases).each(function(o,i){
            dt = tbls["pl-bskt-cnt-"+o];
            if(dt!=null && dt.sortable!=null){
							_tblId = "pl-bskt-cnt-"+o;
							_bbase = o;
							//dt = tlbs["pl-bskt-cnt-"+base];
							if (dt!=null){
								/* FIXME [JC]: ici, on réinitialise la DataTable de zéro, la méthode de 
								rechargement perd ses jeunes à un moment... */
								var dtb = dt.getDataTable();
								/*var dsr = dt.getDataSource();
								dsr.sendRequest("page=1", dtb.onDataReturnInitializeTable, dtb);*/
								var __sort_field = _sort_field;
								var __sort_dir = _sort_dir;
								if(dtb._configs.sortedBy.key != null) __sort_field = dtb._configs.sortedBy.key;
								if(dtb._configs.sortedBy.dir != null) __sort_dir = dtb._configs.sortedBy.dir;
								initImagesBasketTable(_tblId, _bbase, _isSortable, __sort_field, __sort_dir);
							}
              //refreshDataTable(dt);
            }
          });
        }
				/* On ne connait pas precisemment la/les dataTable(s) que l'on veut
				 * rafraichir. On les rafraichit toutes.*/
				/* NOTE [JC] : il n'est visiblement pas possible d'itérer un tableau nommé !!! */
        else {
					window.location.reload();
        }
      } catch(e){
        window.location.reload();
      }
    }
    else
        window.location.reload();
  };
  try{
    deleteFromImageBasket(params, target, base, refreshDataTB);
  } catch(e){}
}

/**
 * Fonction de rafraichissement d'une DataTable YUI
 *
 * @param dt {YAHOO.widget.DataTable} La DataTable YUI a rafraichir.
 */
function refreshDataTable(dt){
  if (dt!=null){
		/* FIXME [JC]: ici, on réinitialise la DataTable de zéro, la méthode de 
		rechargement perd ses jeunes à un moment... */
    var dtb = dt.getDataTable();
    /*var dsr = dt.getDataSource();
    dsr.sendRequest("page=1", dtb.onDataReturnInitializeTable, dtb);*/
		var __sort_field = _sort_field;
		var __sort_dir = _sort_dir;
		if(dtb._configs.sortedBy.key != null) __sort_field = dtb._configs.sortedBy.key;
		if(dtb._configs.sortedBy.dir != null) __sort_dir = dtb._configs.sortedBy.dir;
		initBasketTable(_tblId, _bbase, _isSortable, __sort_field, __sort_dir);
  }
}
/**
 * Fonction d'initialisation de la TabView YUI
 * @param tabSelector {String} La classe CSS utilisee pour selectionner les onglets
 * @param tabsSelector {String} L'identifiant ou l'objet HTML contenant la TabView
 * @param isSortable {String} Chaine indiquant que la DataTable est triable ou
 *                            non
 * @param sort_field {String} Nom du champ sur lequel le tri doit être fait au
 *														chargement de la page
 * @param sort_dir {String} Ordre du tri au chargement de la page
 */
function initBasketTabs(tabSelector, tabsSelector, isSortable, sort_field, sort_dir){
	_isSortable = isSortable;
	_sort_field = sort_field;
	_sort_dir = sort_dir;
  if(tabSelector==null || tabSelector.blank()){
    tabSelector = "div.tab";
  }
  if(tabsSelector==null || tabsSelector.blank()){
    tabsSelector = "pl-pg-tabs";
  }
  var mTabs = new YAHOO.widget.TabView(tabsSelector);
  initBasketTab();
  mTabs.on('activeTabChange', function(ev) {
    return initBasketTab();
  });
}
/**
 * Fonction d'initialisation d'un onglet du porte-documents
 * @param tabSelector {String} La classe CSS utilisee pour selectionner les onglets
 */
function initBasketTab(tabSelector){
  if(tabSelector==null || tabSelector.blank()){
    tabSelector = "div.tab";
  }
  $$(tabSelector).each(function(o,i){
    if(o!=null && o.id!=null & o.visible()){
			/* Pleade Plus */
			if(o.id != 'image-caddy') {
				initBasketTable("pl-bskt-cnt-"+o.id, o.id, _isSortable, _sort_field, _sort_dir);
			}else { //initialisation de l'affichage du panier d'images
				initImagesBasketTable("pl-bskt-cnt-"+o.id, o.id, _isSortable, _sort_field, _sort_dir);
			}
			/* Pleade Plus */
    }
  });
}

/*
 * Pleade Plus
 */
function initImagesBasketTable(tblId, base, isSortable, sort_field, sort_dir){
  if ( !tblId ) return false;

  tbls[tblId] = new function() {
		//boutons d'action
		var _btn_flush = new YAHOO.widget.Button('btn_flush-' + base, {type: 'push'});
		$('btn_flush-' + base + '-button').stopObserving('click');
		$('btn_pdf-' + base + '-button').stopObserving('click');
		//$('btn_update-' + base + '-button').stopObserving('click');
		$('btn_flush-' + base + '-button').observe(
			'click', 
			function(event){
				if(confirm(_usersMessagesBasket.basket_flush_basket_confirm)){
					flushImageBasket(this);
				}
				Event.stop(event); 
			}
		);
		$('btn_pdf-' + base + '-button').observe(
			'click', 
			function(event){
				window.open('img-server/imageBasket.pdf');
				Event.stop(event); 
			}
		);
		$('btn_update-' + base + '-button').observe(
			'click', 
			function(event){
				if(selecteds==null||selecteds.length==0){
					alert(_usersMessagesBasket.basket_delete_from_basket_no_selected);
				} else {
					deleteSelectedFromImageBasket(selecteds, this);
				}
				Event.stop(event); 
			}
		);


    var initXHR_JSON_DataTable = this;

    this.currentPage = 0;
    this.totalPages = 0;

    // Definition des colonnes de la DataTable
    this.sortable = (isSortable=="true") ? true:false;
		
		//Il faut mettre les valeurs de tri pour la session à 0
		if(!this.sortable){
			sort_field = "";
			sort_dir = "";
		}

    this.myColumnDefs = [
			{key:"id",
						label:"",
						formatter: formatImgid,
						sortable:this.sortable,
						resizeable:true,
						className:"pl-tbl-th"},
      {key:"path",
            label:_usersMessagesBasket.basket_results_col_title_intitule,
						formatter: formatImg,
            sortable:this.sortable,
            resizeable:true,
						className:"pl-tbl-th",
						minWidth: 300}
    ];

    // Initialisation de la DataSource
    this.myDataSource = new YAHOO.util.DataSource("functions/imageBasket.json?");
    this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
		this.myDataSource.maxCacheEntries = 0;
    this.myDataSource.responseSchema = {
        resultsList: "images",
        fields: ["id", "path", "name", "title"],
				metaFields:{
					totalRecords: "count"
				}
    };
		

		/*var myRequestBuilder = function(oState, oSelf) {
			// Get states or use defaults
			oState = oState || {pagination:null, sortedBy:null};
			var field = (oState.sortedBy) ? oState.sortedBy.key : "";
			var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? "desc" : "asc";
	    var startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0;
	    var results = (oState.pagination) ? oState.pagination.rowsPerPage : 100;

			// Build custom request
			return "sf=" + field + "&so=" + dir + "&pageStart=" + startIndex + 
	            "&pageEnd=" + (startIndex + results - 1);;
		};*/

		/*var paConfig = {
			rowsPerPage: 20,
			nextPageLinkLabel: _usersMessagesBasket.paginator_next_page,
			previousPageLinkLabel: _usersMessagesBasket.paginator_previous_page.replace(/</g, "&lt;"),
			firstPageLinkLabel: _usersMessagesBasket.paginator_first_page.replace(/</g, "&lt;"),
			lastPageLinkLabel: _usersMessagesBasket.paginator_last_page,
			containers: "pagination",
			template:
				'<span class="navpage">' + 
				'{FirstPageLink} {PreviousPageLink}' + 
				'</span>' +
				'<span id="nbpage">' + 
				_usersMessagesBasket.paginator_page + ' {CurrentPageReport}' +
				'</span>' +
				'<span class="navpage">' + 
				'{NextPageLink} {LastPageLink}' + 
				'</span>',
			pageReportTemplate: "<strong>{currentPage}</strong> " + _usersMessagesBasket.paginator_of_page + " {totalPages}"
		};*/
		/*var pa = new YAHOO.widget.Paginator( paConfig );*/

    this.myDataTable = new YAHOO.widget.DataTable( tblId, this.myColumnDefs,
                              this.myDataSource,
                              {
																initialRequest:"",
																dynamicData: true, // Enables dynamic server-driven data
                                summary:"Contenu du panier d'images", // FIXME (MP) : i18n,
																/*sortedBy: {key: sort_field, dir: sort_dir},*/
                                scrollable:true/*,
																generateRequest: myRequestBuilder,
																paginator: pa*/
                              }
                        );

		this.myDataTable.doBeforeSortColumn = function(){
			return (isSortable) ? true : false;
		};
		
		this.myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {
			if(oPayload != null)
				oPayload.totalRecords = oResponse.meta.totalRecords; 
			return oPayload; 
		};
		
    // Fonction de mise a jour de la navigation.
    this.myDataSource.doBeforeCallback = function(oRequest, oRawResponse, oParsedResponse)
    {
        var oSelf = initXHR_JSON_DataTable;
        var oDataTable = oSelf.myDataTable;

        // Retourne les valeurs courantes de navigation
        var recordsReturned = 0;
        var startIndex = 0;
        var endIndex = 0;
        var currentPage = 0;
        var totalPages = 0;
        var totalRecords = 0;
        var sortCol = "";
        var sortDir = "";
        var resultSet = oRawResponse.resultSet;
        if ( oRawResponse ) {
          //recordsReturned = oRawResponse.resultSet.returned;
          //startIndex = oRawResponse.resultSet.start;
          //endIndex = oRawResponse.resultSet.end;
          //currentPage = oRawResponse.resultSet.page;
          //totalPages = oRawResponse.resultSet.pages;
          totalRecords = oRawResponse.count;
          //sortCol =  oRawResponse.resultSet.sort;
          //sortDir =  oRawResponse.resultSet.dir;
        }

				// TODO mettre un paramètre configurable
				if( totalRecords > 100){
					isSortable = false;
					if( !$('pl-basket-warning') ){
						$('pl-pg-body-main-mcol').firstDescendant().insert('<div id="pl-basket-warning">' + _usersMessagesBasket.basket_sort_deactivated + '</div>');
					}
				}else{
					if( $('pl-basket-warning') ){
						$('pl-basket-warning').remove();
					}
					isSortable = true;
				}

        // Mise a jour du nombre total de documents
        $('total_'+base).innerHTML = totalRecords;

         if ( !resultSet ) {
          /* Le panier a ete vide : mise a jour du texte d'erreur pour indiquer
           * que le panier a ete vide et suppression de l'ensemble des enregistrements. */
          YAHOO.widget.DataTable.MSG_ERROR=_usersMessagesBasket.basket_msg_empty;
          oDataTable.deleteRows(0, oDataTable._oRecordSet._length);
        }

        // Let the DataSource parse the rest of the response
        return oParsedResponse;
    };

    this.getDataTable = function(){
      return this.myDataTable;
    };
    this.getDataSource = function(){
      return this.myDataSource;
    };
    this.getDomContainer = function(){
      return $(tblId);
    };
    this.getCurrentPage = function(){
      return this.currentPage;
    };
    this.getTotalPages = function(){
      return this.totalPages;
    };
  };
}

/**
 * Fonction initialisant la DataTable du panier
 *
 * @param tbdId {String} L'identifiant de l'objet HTML/DOM qui contiendra la
 *                       DataTable YUI
 * @param base {String} L'identifiant de la base de documents (optionel).
 * @param isSortable {String} Chaine indiquant que la DataTable est triable ou
 *                            non
 * @param sort_field {String} Nom du champ sur lequel le tri doit être fait au
 *														chargement de la page
 * @param sort_dir {String} Ordre du tri au chargement de la page
 * Travail un JSON correspondant au schema suivant :
 * {"resultSet":
      {"returned":{nombre de resultats courant},
        "total":{nombre total de resultats},
        "page":{page courante},
        "pages":{nombre total de pages},
        "start":{index du premier resultat dans la page courante},
        "end":{index du dernier resultat dans la page courante},
        "sort":{nom du champ sur lequel s'effectue le tri, peut etre nul},
        "dir":{ordre du tri, peut etre nul},
        "results":[
          {"id":"{sdxdocid}","rootId":{root-id},"ancestors":{ctitle > ctitle > [...]},"fucomptitle":{fucomptitle},"udate":{udate},"uunitid":{uunitid}},
          [...]
        ]
      }
    }
 */
function initBasketTable (tblId, base, isSortable, sort_field, sort_dir) {
  if ( !tblId ) return false;
  if (!base ||base.blank()) base = "ead";

	_tblId = tblId;
	_bbase = base;
	_isSortable = isSortable;
	_sort_field = sort_field;
	_sort_dir = sort_dir;
	
  /*TODO (MP) : trouver le moyen de definir une fonction formatTitle_{base} utilisable dans le porte-documents.
                La solution est-elle d'importer systematiquement un fichier theme/js/local/module-eadeac-basket.js ?
                Ou de definir un columndDefs propre a chaque base, un columnDefs
                serait ecrit dans la page HTML, recupere via un template cocoon
                interne ?
  */
  /* initXHR_JSON_DataTable = new function() { */
  tbls[tblId] = new function() {
		/* Pleade Plus ? */
		//boutons d'action
		var _btn_flush = new YAHOO.widget.Button('btn_flush-' + base, {type: 'push'});
		var _btn_pdf = new YAHOO.widget.Button('btn_pdf-' + base, {type: 'push'});
		var _btn_update = new YAHOO.widget.Button('btn_update-' + base, {type: 'push'});
		$('btn_flush-' + base + '-button').stopObserving('click');
		$('btn_pdf-' + base + '-button').stopObserving('click');
		$('btn_update-' + base + '-button').stopObserving('click');
		$('btn_flush-' + base + '-button').observe(
			'click', 
			function(event){
				if(confirm(_usersMessagesBasket.basket_flush_basket_confirm))
					flushBasket(this);
				Event.stop(event); 
			}
		);
		$('btn_pdf-' + base + '-button').observe(
			'click', 
			function(event){
				window.open('basket.pdf');
				Event.stop(event); 
			}
		);
		$('btn_update-' + base + '-button').observe(
			'click', 
			function(event){
				if(selecteds==null||selecteds.length==0){
					alert(_usersMessagesBasket.basket_delete_from_basket_no_selected);
				} else {
					deleteSelectedFromBasket(selecteds, this);
				}
				Event.stop(event); 
			}
		);
		/* /Pleade Plus ? */

    var initXHR_JSON_DataTable = this;

    this.currentPage = 0;
    this.totalPages = 0;

    // Definition des colonnes de la DataTable
    this.sortable = (isSortable=="true") ? true:false;
		
		//Il faut mettre les valeurs de tri pour la session à 0
		if(!this.sortable){
			sort_field = "";
			sort_dir = "";
		}

    this.myColumnDefs = [
			{key:"sdxdocid",
						label:"",
						formatter: formatDocid,
						sortable:this.sortable,
						resizeable:true,
						className:"pl-tbl-th"},
      {key:"fucomptitle",
            label:_usersMessagesBasket.basket_results_col_title_intitule,
            formatter: function(elCell, oRecord, oColumn, sData){
              var _t=false;
              try{ if(eval("formatTitle_"+base)) _t=true;  } catch(e){}
              if(_t){
                return (eval("formatTitle_"+base))(elCell, oRecord, oColumn, sData);
              }
              else{
                return YAHOO.widget.DataTable.formatText(elCell, oRecord, oColumn, sData);
              }
            },
            sortable:this.sortable,
            resizeable:true,
						className:"pl-tbl-th"},
      {key:"udate",
						label:_usersMessagesBasket.basket_results_col_title_date,
						sortable:this.sortable,
						resizeable:true,
						className:"pl-tbl-th"},
      {key:"uunitid",
						label:_usersMessagesBasket.basket_results_col_title_cote,
						sortable:this.sortable,
						resizeable:true,
						className:"pl-tbl-th"}
    ];

    // Initialisation de la DataSource
    this.myDataSource = new YAHOO.util.DataSource("functions/"+((base)?base+"/":"")+"getBasket.json?");
    this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
		this.myDataSource.maxCacheEntries = 0;
    this.myDataSource.responseSchema = {
        resultsList: "resultSet.results",
        fields: ["time", "sdxdbid","sdxdocid","rootId","ancestors","fucomptitle","udate","uunitid"],
				metaFields:{
					totalRecords: "resultSet.total"
				}
    };
		

		var myRequestBuilder = function(oState, oSelf) {
			// Get states or use defaults
			oState = oState || {pagination:null, sortedBy:null};
			var field = (oState.sortedBy) ? oState.sortedBy.key : "";
			var dir = (oState.sortedBy && oState.sortedBy.dir === YAHOO.widget.DataTable.CLASS_DESC) ? "desc" : "asc";
	    var startIndex = (oState.pagination) ? oState.pagination.recordOffset : 0;
	    var results = (oState.pagination) ? oState.pagination.rowsPerPage : 100;

			// Build custom request
			return "sf=" + field + "&so=" + dir + "&pageStart=" + startIndex + 
	            "&pageEnd=" + (startIndex + results - 1);;
		};

		var paConfig = {
			rowsPerPage: 20,
			nextPageLinkLabel: _usersMessagesBasket.paginator_next_page,
			previousPageLinkLabel: _usersMessagesBasket.paginator_previous_page.replace(/</g, "&lt;"),
			firstPageLinkLabel: _usersMessagesBasket.paginator_first_page.replace(/</g, "&lt;"),
			lastPageLinkLabel: _usersMessagesBasket.paginator_last_page,
			containers: "pagination",
			template:
				'<span class="navpage">' + 
				'{FirstPageLink} {PreviousPageLink}' + 
				'</span>' +
				'<span id="nbpage">' + 
				_usersMessagesBasket.paginator_page + ' {CurrentPageReport}' +
				'</span>' +
				'<span class="navpage">' + 
				'{NextPageLink} {LastPageLink}' + 
				'</span>',
			pageReportTemplate: "<strong>{currentPage}</strong> " + _usersMessagesBasket.paginator_of_page + " {totalPages}"
		};
		var pa = new YAHOO.widget.Paginator( paConfig );

    this.myDataTable = new YAHOO.widget.DataTable( tblId, this.myColumnDefs,
                              this.myDataSource,
                              {
																initialRequest:"sf=" + sort_field + "&so=" + sort_dir, // ici on pourrait definir le nombre de resultats par page, etc.
																dynamicData: true, // Enables dynamic server-driven data
                                summary:"Contenu du porte-document", // FIXME (MP) : i18n,
																sortedBy: {key: sort_field, dir: sort_dir},
                                scrollable:true,
																generateRequest: myRequestBuilder,
																paginator: pa
                              }
                        );

		this.myDataTable.doBeforeSortColumn = function(){
			return (isSortable) ? true : false;
		};
		
		this.myDataTable.handleDataReturnPayload = function(oRequest, oResponse, oPayload) {
			if(oPayload != null)
				oPayload.totalRecords = oResponse.meta.totalRecords; 
			return oPayload; 
		};
		
    // Fonction de mise a jour de la navigation.
    this.myDataSource.doBeforeCallback = function(oRequest, oRawResponse, oParsedResponse)
    {
        var oSelf = initXHR_JSON_DataTable;
        var oDataTable = oSelf.myDataTable;

        // Retourne les valeurs courantes de navigation
        var recordsReturned = 0;
        var startIndex = 0;
        var endIndex = 0;
        var currentPage = 0;
        var totalPages = 0;
        var totalRecords = 0;
        var sortCol = "";
        var sortDir = "";
        var resultSet = oRawResponse.resultSet;
        if ( resultSet ) {
          recordsReturned = oRawResponse.resultSet.returned;
          startIndex = oRawResponse.resultSet.start;
          endIndex = oRawResponse.resultSet.end;
          currentPage = oRawResponse.resultSet.page;
          totalPages = oRawResponse.resultSet.pages;
          totalRecords = oRawResponse.resultSet.total;
          sortCol =  oRawResponse.resultSet.sort;
          sortDir =  oRawResponse.resultSet.dir;
        }

				// TODO mettre un paramètre configurable
				if( totalRecords > 100){
					isSortable = false;
					if( !$('pl-basket-warning') ){
						$('pl-pg-body-main-mcol').firstDescendant().insert('<div id="pl-basket-warning">' + _usersMessagesBasket.basket_sort_deactivated + '</div>');
					}
				}else{
					if( $('pl-basket-warning') ){
						$('pl-basket-warning').remove();
					}
					isSortable = true;
				}

        // Mise a jour du nombre total de documents
        $('total_'+base).innerHTML = totalRecords;

         if ( !resultSet ) {
          /* Le panier a ete vide : mise a jour du texte d'erreur pour indiquer
           * que le panier a ete vide et suppression de l'ensemble des enregistrements. */
          YAHOO.widget.DataTable.MSG_ERROR=_usersMessagesBasket.basket_msg_empty;
          oDataTable.deleteRows(0, oDataTable._oRecordSet._length);
        }

        // Let the DataSource parse the rest of the response
        return oParsedResponse;
    };

    this.getDataTable = function(){
      return this.myDataTable;
    };
    this.getDataSource = function(){
      return this.myDataSource;
    };
    this.getDomContainer = function(){
      return $(tblId);
    };
    this.getCurrentPage = function(){
      return this.currentPage;
    };
    this.getTotalPages = function(){
      return this.totalPages;
    };
  };

}

/**
 * Fonction construisant le titre des documents EAD dans le panier
 * Le titre du document dans un lien hypertexte vers la visionneuse EAD
 * eventuellement precede de la liste des ancetres (au sens Pleade du terme).
 */
formatTitle_ead = function(elCell, oRecord, oColumn, sData) {

  // construction du lien vers la visionneuse EAD
  var rootId = oRecord.getData("rootId");
  var docId = oRecord.getData("sdxdocid");
  var href = "ead.html?id=" + rootId;
  if ( rootId!= docId )
      href += "&c=" + docId;

  // construction du titre
  var title = sData;
  if ( !title || title.blank() ) title = _usersMessagesBasket.basket_results_untitle_doc; // pas de titre

  // construction de la liste des ancetres
  var ancestors = oRecord.getData("ancestors");

  if ( ancestors && !ancestors.blank() ) {

    elCell.innerHTML = "<a href=\""+href+"\" onclick=\"return winFocus(this.href, 'docead');\">"+title+"</a>" +
		"<div class=\"pl-ancestors\"><a class=\"pl-ancestors\" style=\"display:inline;\" id=\""+docId+"\" onclick=\"$('"+docId+"c', '"+docId+"m1', '"+docId+"m2').invoke('toggle')\" style=\"cursor:pointer;\"><span class=\"pl-ancestors-on\" id=\""+docId+"m1\">"+_usersMessagesBasket.basket_results_context_show+"</span><span id=\""+docId+"m2\" class=\"pl-ancestors-off\" style=\"display:none;\">"+_usersMessagesBasket.basket_results_context_hide+"</span>&#160;</a>" +
                    "<span id=\""+docId+"c\" class=\"pl-ancestors-txt\" onclick =\"this.toggle();$('"+docId+"m1', '"+docId+"m2').invoke('toggle');\" style=\"display:none;\">"+ancestors+"</span></div>";
  }
  else {
    elCell.innerHTML = "<a href=\""+href+"\" onclick=\"return winFocus(this.href, 'docead');\">"+title+"</a>";
  }
};

/**
 * Fonction constuisant le case a cocher permettant de selectionner la notice
 * dans le panier.
 */
formatDocid = function(elCell, oRecord, oColumn, sData) {

  // construction du lien vers la visionneuse EAD
  var docId = oRecord.getData("sdxdocid");
  var fn = "entryChecked(this, '"+oRecord.getData("sdxdbid")+"');"; // la fonction activee lorsqu'on selectionne le document courant
  var onclick = " onclick=\""+fn+"\"";
  var onkeypress = " onkeypress=\""+fn+"\"";
  elCell.innerHTML = "<input type=\"checkbox\" value=\"" + docId +"\""+ onclick + onkeypress +
                      "class=\"" + YAHOO.widget.DataTable.CLASS_CHECKBOX + " pl-form-chckbx\">";

};

/**
 * Pleade Plus:
 * Fonction constuisant le case a cocher permettant de selectionner l'image
 * dans le panier.
 */
formatImgid = function(elCell, oRecord, oColumn, sData) {
  // construction du lien vers la visionneuse EAD
  var docId = oRecord.getData("id");
  var fn = "entryChecked(this, 'image-caddy');"; // la fonction activee lorsqu'on selectionne le document courant
  var onclick = " onclick=\""+fn+"\"";
  var onkeypress = " onkeypress=\""+fn+"\"";
  elCell.innerHTML = "<input type=\"checkbox\" value=\"" + docId +"\""+ onclick + onkeypress +
                      "class=\"" + YAHOO.widget.DataTable.CLASS_CHECKBOX + " pl-form-chckbx\">";

};

/**
 * Pleade Plus
 * Fonction qui récupère la taille de la miniature et affiche celle-ci
 */
formatImg = function(elCell, oRecord, oColumn, sData) {
	var _url = 'img-server/' + oRecord.getData("path") + "/dir.json?";

	var width = 0;
	var height = 0;
	var ajax = new Ajax.Request( _url, {
		parameters: {iname: oRecord.getData("name"), role: 'miniature'},
		onSuccess: function(r){
			var o = r.responseText.evalJSON();
			var v = o[0].versions;
			var t = 10;
			$A(v).each(function(n) {
				if(n.role == "miniature"){
					width = n.width;
					height = n.height;
				}
			});
			elCell.innerHTML = "<a href=\"img-viewer/" + oRecord.getData("path") + "/viewer.html?img=" + oRecord.getData("name") + "\"><img style=\"border:none;\" width=\"" + width + "\" height=\"" + height + "\" alt=\""+ oRecord.getData("name") +"\" src=\"img-server/" + oRecord.getData("path") + "/" + oRecord.getData("name") + "?w=" + width + "&h=" + height +"\"></a>" + oRecord.getData("title");
		}
	});

};

/*
 * Pleade Plus
 */
getDiplsayedImage = function(r){
			var o = r.responseText.evalJSON();
			var v = o[0].versions;
			var t = 10;
			$A(v).each(function(n) {
				if(n.role == "miniature"){
					t = n.width;
					height = n.height;
				}
			});
			return t;
};

/**
 * Formatage de la liste des ancetres Pleade
 */
plAncestorsFormatter = function(elCell, oRecord, oColumn, oData) {
  if ( !elCell || !oRecord ) return "";
  var cellId = oRecord.getId();
  var id1 = cellId + "l";
  var id2 = cellId + "c";
  elCell.innerHTML = "<div id=\""+id1+"\" style=\"display:block;\" onclick=\"$('"+id1+"').hide; $('"+id2+"').show\">[...]</div>" +
                     "<div id=\""+id2+"\" style=\"display:none;\" onclick=\"$('"+id2+"').hide; $('"+id1+"').show\">" + oData + "</div>";
}

/*
 * Gestion de la selection / deselection de notice dans le DataTable
 * Tenir a jour le tableau des identifiants de document selectionnes
 */
function entryChecked(o,b){
  if (o){
    var slct = $A(selecteds);
    var bs = $A(selectedBases);
    if (o){
      if ( o.value==null || o.value.blank() || !slct );
      else{
        if(o.checked==false){
          if ( slct.indexOf(o.value) != -1 ){
            selecteds = slct.without(o.value);
          }
          // TODO: Comment faire pour savoir si on doit supprimer la base courante de la liste des bases touchees ?
        }
        else{
          if(slct.indexOf(o.value)==-1){
            selecteds.push(o.value);
          }
          if(bs && b && bs.indexOf(b)==-1){
            selectedBases.push(b);
          }
        }
      }
    }
  }
}
