/**
 * Modèle MVC "abstrait" pour les fonctions de carto. Stocke les objets à
 * afficher, et fait les appels Ajax au serveur pour récupérer les données.
 * Implémente le Sujet du pattern Observer.
 *
 * @package carif_commun
 * @see ControleurCarto
 * @see Subject
 */
var ModeleCarto = Class.create(Subject, {

	/**
	 * Constructeur : initialise les attributs, et récupère la liste des types
	 * de zones que l'on peut afficher.
	 */
	initialize: function($super) {
		// appel constructeur Subject
		$super();
		// permet à la Vue de savoir si une requete ajax est en cours
		this.compteur_requetes = 0;
		// chemin d'accès sur le serveur aux fonctions Ajax : à spécifier
		// éventuellement lors de l'héritage. Se termine par un slash.
		this._chemin_ajax = '/obs/si/carto/';
	},


	/**
	 * Méthode interne pour les récupérations de données.
	 *
	 * @param {String} commande Précise l'URL à appeler.
	 * @param {Object} resultat Variable recevant le résultat obtenu.
	 * @param {String} contexte Facultatif, donne le contexte qui sera passé aux Observers.
	 */
	appel_ajax: function(commande, resultat, contexte) {
		this.debut_requete();
		new Ajax.Request(
			this._chemin_ajax + commande,
			{
				method:'get',
				onSuccess: function(transport) {
					resultat.length = 0;
					transport.responseText.evalJSON().each(function(el){
						resultat.push(el);
					});
					if (contexte != null) {
						// "this" pointe ici vers l'objet window, on appelle
						// le modèle explicitement.
						window['controleur']._modele.notifier(contexte);
					}
					window['controleur']._modele.fin_requete();
					return true;
				},
				onFailure: function() {
					window['controleur']._modele.fin_requete();
					return false;
				}
			}
		);
	},

	debut_requete: function() {
		++this.compteur_requetes;
		this.notifier('debut_requete');
	},

	fin_requete: function() {
		--this.compteur_requetes;
		this.notifier('fin_requete');
	}
});
