/*transforme un lien normal en lien chargeant une partie de la page en ajax, en rajoutant un parametre a l'url de base*/
AjaxLinker = Class.create();
/**
 *_element : element "A" ou contenant l'�lement "A" (le premier element "A" du conteneur sera alors utilis�) faisant le lien
 *_targetElement : element dans lequel le contenu charg� sera ins�r�
 *_options(HashMap):
 *  urlPage: permet de changer la page appelee par le lien
 *  urlParameters: parametre � rajouter a l'url pour l'ajax (Hashmap). Par d�faut: $H({ajax:true})
 *  linkElement: la balise "A" contenant le lien si different de _element ou de son premier "A" contenu
 *  eventType: type d'evenement auquel s'inscrire pour le rechargement
 *  refreshFunction: fonction appelee apres le chargement ajax (permet par exemple de repasser en ajax les liens contenu dans ce que l'on vient de charger)
 **/
AjaxLinker.prototype = {
    initialize: function(_element,_targetElement,_options) {
        this.element=$(_element)||document.body;
        this.targetElement=$(_targetElement)||document.body;
        
        this.urlParameters=_options["urlParameters"]||$H({ajax:true});
        this.urlPage=_options["urlPage"];
        
        this.linkElement=_options["linkElement"]||this.findLinkElement();
        this.eventType=_options["eventType"]||"click";
        this.refreshFunction=_options["refreshFunction"]||Prototype.emptyFunction;
        
        this.setHandler();
    },
    
    findLinkElement: function() {
        if(this.element.tagName!="A")
            return this.element.getElementsByTagName("A")[0];
        else
            return this.element;
    },
    
    setHandler: function() { 
        
        var handler= function(event) { 
            
            var up= new UrlParser(this.element.href);
            up.parametersParams.merge(this.urlParameters);
            if(typeof(this.urlPage)=="string")
                up.page=this.urlPage;
 
            var parsedURL = up.getURL();
            // console.log("parametersParams: "+up.parametersParams.inspect());
    
            var params = up.parametersParams.toQueryString();
 
            // console.log("parsedURL: "+parsedURL+" / params: "+params);
            
            new Ajax.Updater(
                this.targetElement,
                parsedURL,
                { method: 'get', parameters: params, evalScripts: true, onComplete: this.refreshFunction}
            );
            // don't use the original behaviour:
            Event.stop(event);
            return false;
        }.bindAsEventListener(this);
        
        Event.observe(this.element,this.eventType,handler);
    }
}

/*Extensions des elements HTML pour plus de praticite*/
Element.addMethods( {

    setAjaxLink: function(e,_target,_options) {
        this._ajaxLinker = new AjaxLinker(e,_target,_options);
    }
});
