/*
 * ID         : $Id: afs-url.js,v 1.4 2008-06-23 15:17:59 mo Exp $
 * Description: Traitement des URLs
 * Auteur     : mo
 * Creation   : 2008-06-12 16:47:22
 * Version    : $Revision: 1.4 $
 * Historique : $Log: afs-url.js,v $
 * Historique : Revision 1.4  2008-06-23 15:17:59  mo
 */
if (!this.AFSQS) {
  AFSQS = new function() {
	this.Parameter = function(name) {
	  var values = [] ;
	  for (var i = 1; i < arguments.length ; ++i) {
		values[values.length] = arguments[i];
	  }

	  /**
	   * Retourne le nom du paramètre
	   */
	  this.getName = function() {
		return name;
	  }

	  /**
	   * Définit un nouveau nom pour le paramètre
	   *
	   * @param newName Le nouveau nom
	   */
	  this.setName = function(newName) {
		name = newName;
	  }

	  /**
	   * Retourne la valeur du paramètre
	   *
	   * @return la valeur du paramètre ou la première valeur du paramètre
	   *   s'il y en a plusieurs ou undefined s'il n'y en a pas
	   */
	  this.getValue = function() {
		return values[0];
	  }

	  this.addValue = function() {
		for (var i = 0 ; i < arguments.length ; ++i) {
		  values[values.length] = arguments[i];
		}
	  }

	  this.setValue = function() {
		values = arguments;
	  }

	  this.getValues = function() {
		return values;
	  }

	  this.setValues = function(newValues) {
		values = newValues;
	  }

	  this.toString = function() {
		var s = '';
		for (var i = 0 ; i < values.length ; ++i) {
		  if (i > 0) {
			s += '&';
		  }
		  en = encodeURIComponent(name);
		  ev = encodeURIComponent(values[i]);
		  s += en + '=' + ev;
		}
		return s;
	  }
	};

	this.Parameters = function()
	{
	  var params = {} ;

	  this.getParam = function(name) {
		return params[name];
	  }

	  this.setParam = function(param) {
		var old = params[param.getName()];
		params[param.getName()] = param;
		return old;
	  }

	  this.removeParam = function(name) {
		delete params[name];
	  }

	  this.mergeParam = function(param) {
		var old = this.getParam(param.getName());
		if (old) {
		  old.addValue.call(old, param.getValues());
		  return old;
		}
		
		this.setParam(param);
		return param;
	  }
	  
	  this.toString = function() {
		var s = '';
		for (var name in params) {
		  var param = params[name].toString();
		  if (param.length != 0) {
			if (s.length != 0) {
			  s += '&';
			}
			s += param;
		  }
		}
		return s;
	  }

	  /**
	   * Ajoute la liste des paramètres à l'URL
	   * @param params La liste des paramètres (aucun paramètre si omis)
	   * @param url L'URL de base (si non présent, utilise l'URL de la
	   *            fenêtre en cours)
	   * @return La nouvelle URL
	   */
	  this.toURL = function(url)
	  {
		if (typeof(url) != 'string') {
		  url = "" + window.location ;
		}
		
		// S'il y a une QueryString
		var i = url.indexOf('?') ;
		if (i != -1) {
		  url = url.substring(0, i) ;
		}
		
		// Ajoute la QueryString à l'URL au besoin
		var querystring = this.toString();
		if (querystring != '') {
		  url += '?' + querystring ;
		}
		
		// Retourne la nouvelle URL
		return url ;
	  }
	}

	
	/**
	 * Extrait la liste des paramètres d'une RUL
	 * @param url L'URL (si non présent, utilise l'URL de la
	 *            fenêtre en cours)
	 * @return La liste des paramètres sous la forme d'un Map
	 */
	this.parse = function(url)
	{
	  // Si l'URL n'est pas spécifié, on utilise celui de la page
	  if (typeof(url) != 'string') {
		url = '' + window.location ;
	  }

	  // On retire l'ancre...
	  if (url.indexOf('#') != -1) {
		url = url.substring(0, url.indexOf('#')) ;
	  }
	  
	  // Resultat
	  var res = new AFSQS.Parameters() ;
	  
	  // S'il y a une QueryString
	  var i = url.indexOf('?') ;
	  if (i != -1) {
		// On extrait les paramètres
		var query = url.substring(i + 1);
		var params = query.split('&') ;
		
		// Pour chaque paramètre
		for (var j = 0 ; j < params.length ; ++j) {
		  var param = params[j].split('=') ;
		  
		  // On extrait le nom et la valeur
		  var name = decodeURIComponent(param.shift()) ;
		  var value = decodeURIComponent(param.join('=')) ;
		  
		  // On ajoute le paramètre au résultat
		  var param = res.getParam(name);
		  if (param) {
			param.addValue(value);
		  }
		  else {
			res.setParameter(new AFSQS.Parameter(name, value)) ;
		  }
		}
	  }
	  
	  // On retourne la liste des paramètres
	  return res ;
	}


	/**
	 * Redirige vers l'URL en lui ajoutant les paramètres spécifiés
	 * @param params La liste des paramètres (aucun paramètre si omis)
	 * @param url L'URL de base (si non présent, utilise l'URL de la
	 *            fenêtre en cours)
	 * @return La nouvelle URL
	 */
	this.redirect = function(params, url)
	{
	  window.location = params.toURL(url) ;
	}
  }() ;
 }
