/* $Id: module-img-viewer-class-series.js 16503 2009-10-01 08:48:43Z jcwiklinski $ */
/**
Copyright (C) 2003-2009 AJLSM, Anaphore
Voir le fichier LICENCE
**/
/* Ce fichier de configuration fait partie de la distribution standard
de Pleade. Vous pouvez le modifier à votre guise. */
/**
	Classe PivSeries.

	Cette classe représente une série d'images et permet de naviguer dans
	cette série.
*/

// Création de la classe
var PivSeries = Class.create();		// Utilitaire de la librairie Prototype
PivSeries.prototype = {

	/**
	* Crée une séries d'images.
	* @constructor
	* @param s {String} L'adresse de base du serveur d'images
	* @param p {String} Le chemin (path) de la série consultée
	* @param sz {int} La taille (nombre d'images) de la série
	* @param no {int} Le numéro de l'image à afficher
	* @param f  {int} Le numéro de la première image de la série à afficher
	* @param l  {int} Le numéro de la dernière image de la série à afficher
	* @param nf {String} Le nom de la première image de la série à afficher
	* @param nl {String} Le nom de la dernière image de la série à afficher
	*/
	initialize: function(s, p, sz, no, f, l, nf, nl) {
		this.serverUrl = s;
		this.path = p;
		this.size = sz;
		this.first = ( (f>=0) ? f : -1 );
		this.last = ( (l>=0 && l>=f) ? l : -1 );
		this.nameFirst = ( (nf) ? nf : null );
		this.nameLast = ( (nl) ? nl : null );
		this.setCurrentImage(no);
		this.sets = new Array();
		this.stepSize = 10; // TODO: préférences
	},

	/**
	* Va chercher des informations sur un jeu d'images.
	* @param n {int} Le numéro de l'image dans la série.
	* @paran fn {function} Une fonction à appeler une fois l'information arrivée
	*/
	fetchImageSet: function(n, fn) {
		if ( n > 0 && n <= this.getSize() ) {
			var handler = this._fetchImageHandler(n, fn);
			new Ajax.Request(this.getBaseUrl() + "/dir.json?" + ( (Object.isUndefined(this.getBaseParams())?'':this.getBaseParams()) ), {
				method: "GET",
				parameters: {n: n},
				onSuccess: handler
				//TODO: erreur?
			});
		}
	},

	/**
	* Va chercher des informations sur un jeu d'images.
	* @param n {string} Le nom de l'image.
	* @paran fn {function} Une fonction à appeler une fois l'information arrivée
	*/
	fetchNamedImageSet: function(n, fn) {
			var handler = this._fetchImageHandler(n, fn);
			new Ajax.Request(this.getBaseUrl() + "/dir.json?" + this.getBaseParams(), {
				method: "GET",
				parameters: {iname: n},
				onSuccess: handler
				//TODO: erreur?
			});
	},

	_fetchImageHandler: function(n, fn) {
		return function(r) {
			var tmpArray = r.responseText.evalJSON();
			/*var set = new PivImageSet(_pivSeries.getBaseUrl(), tmpArray[0]);*/
			var set = new PivImageSet(_pivSeries.serverUrl, tmpArray[0]);
			_pivSeries.addImageSet(set);
			_pivSeries.setCurrentImage(tmpArray[0].no);
			if (fn) fn(set, set.defaultVersion);
			_pivViewer._updateAfterChange();
		}
	},

	/**
	*	Ajoute une définition de jeu d'image.
	*/
	addImageSet: function(set) {
		if (set) {
			this.sets[set.no] = set;
		}
	},

	/**
	*	Retourne l'URL de base de la série.
	*/
	getBaseUrl: function() {
		if (this.baseUrl) return this.baseUrl;
		this.baseUrl = this.serverUrl + "/" + this.path;
		return this.baseUrl;
	},

	/**
	*	Retourne les paramètres de base de la série
	*/
	getBaseParams: function() {
		if (this.baseParams) return this.baseParams;
		if(this.first!=-1 || this.last!=-1 || this.nameFirst || this.nameLast){
			this.baseParams = (this.first!=-1) ? "&p="+this.first : "";
			this.baseParams += (this.last!=-1) ? "&d="+this.last : "";
			this.baseParams += (this.nameFirst) ? "&np="+this.nameFirst : "";
			this.baseParams += (this.nameLast!=-1) ? "&nd="+this.nameLast : "";
		}
		else this.baseParams==null;
		return this.baseParams;
	},

	setCurrentImage: function(n) {
		this.currentImageNo = n;
	},

	getCurrentImage: function() {
		return this.currentImageNo;
	},

	getCurrentImageSet: function() {
		return this.sets[this.currentImageNo];
	},

	init: function() {
	},

	getSize: function() {
		return this.size;
	},

	getStepSize: function() {
		return this.stepSize;
	},

	getFirst: function(){
		return this.first;
	},
	getLast: function(){
		return this.last;
	},

	/**
	*	Informations descriptives sur la série.
	*	TODO: à compléter.
	*/
	getSummary: function() {
		return this.path;
	},

	identify: function() {
		return "Classe PivSeries";
	}

};	// Fin de PivSeries.prototype

