// dans les pages ajax , nombres de pages a afficher de part et d'autre de la barre de navigation
var g_page_display_range = 5;

// constructeur
function Paginator(main_display_area_id,page_nav_display_area_id,updater_url,nb_element_inpage,nb_element_total) {
    this.extra_parameters = new Hash();
    if($(main_display_area_id))
    {
        this.main_display_area = $(main_display_area_id);
    }
    else
    {
        //alert("zone d'affichage principale introuvable. id: " + main_display_area_id);
    }

    var nav_areas = page_nav_display_area_id.split(",");
    this.page_nav_display_area = new Array();
    for(i = 0; i < nav_areas.length; i++)
    {
        if(!$(nav_areas[i]))
        {
            //alert("zone de navigation " + i + " est introuvable");
            continue;
         }
        else
        {
            this.page_nav_display_area.push($(nav_areas[i]));
        }
    }
    this.updater_url = updater_url;

    // premiere barre de navigation
    this.nb_element_inpage = parseInt(nb_element_inpage, 10);
    this.nb_element_total = parseInt(nb_element_total, 10);
    this.drawNavigationArea();
}

// déclaration des variables
Paginator.prototype.main_display_area = null;
Paginator.prototype.page_nav_display_area = [];

Paginator.prototype.updater_url = null;
Paginator.prototype.ajax_loader = null;
Paginator.prototype.extra_parameters = null;

Paginator.prototype.offset = 0;
Paginator.prototype.need_count = true;
Paginator.prototype.nb_element_inpage = null;
Paginator.prototype.nb_element_total = null;

Paginator.prototype.callback = null;

/*
Paginator.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}
*/

Paginator.prototype.setFilter = function(params) {
        this.extra_parameters = $H(params.toQueryParams());
        this.need_count = true;
}

Paginator.prototype.addFilter = function(filter) {
    if(typeof(filter) == 'string')
        var to_add = filter.toQueryParams();
    else
        var to_add = filter;
        this.extra_parameters.update(to_add);
        this.need_count = true;
}

Paginator.prototype.removeFilter = function(filter_name) {
        this.extra_parameters.unset(filter_name);
        this.need_count = true;
}

Paginator.prototype.setFirstElementDisplayed = function(offset) {
        Paginator.prototype.offset = parseInt(offset, 10);
}

Paginator.prototype.clearNavigationArea = function() {
    // supprime le contenu
    for(var i = 0; i < this.page_nav_display_area.length; i++)
    {
        while(this.page_nav_display_area[i].hasChildNodes())
        {
            // enleve les listeners
            try {
                Event.observers.each(
                    function(observer)
                    {
                        if(this.page_nav_display_area[i].firstChild == observer[0])
                        {
                            Event.stopObserving(observer[0],observer[1],observer[2],observer[3]);
                        }
                    }.bind(this));
            }
            catch (e)
            {

            }
            this.page_nav_display_area[i].removeChild(this.page_nav_display_area[i].firstChild);
        }
    }
}

Paginator.prototype.addNavigationAreaElement = function(element,new_offset)
{
    var displayarealength=this.page_nav_display_area.length;
    for(var i = 0;i < displayarealength; i++)
    {
        temp_node = element.cloneNode(true);
        this.page_nav_display_area[i].appendChild(temp_node);
        if(new_offset != null)
        {
            //temp_node.observe('click',function(){this.updatePage(new_offset)}.bind(this));
            Event.observe(temp_node, 'click', function() {
                              this.updatePage(new_offset)
                          }.bind(this));
        }
    }
}


Paginator.prototype.drawNavigationArea = function() {
    this.clearNavigationArea();

    if(this.nb_element_total == 0)
    {
        var page_jump = Builder.node("span",{"class":"jump"},' ');
        this.addNavigationAreaElement(page_jump);
    }
    if(this.offset >= this.nb_element_inpage)
    {
        // lien "précédent"
        page_link = Builder.node("a",{"href":"javascript:void(0);"},"< Précédente");
        this.addNavigationAreaElement(page_link,this.offset - this.nb_element_inpage);
    }

    var j = 0;
    var jump = false;
    while(j * this.nb_element_inpage < this.nb_element_total)
    {
        // affiche les premieres, dernieres et/ou 5 pages en avant/arriere
        if((j * this.nb_element_inpage >= this.offset - this.nb_element_inpage * g_page_display_range && j * this.nb_element_inpage <= this.offset + (this.nb_element_inpage) * g_page_display_range) || j==0 || (j+1) * this.nb_element_inpage > this.nb_element_total)
        {
            jump = false;

            if(j * this.nb_element_inpage == this.offset)
            {
                var page_link = Builder.node("span",{"class":"active"},String(j+1));
                this.addNavigationAreaElement(page_link,null);
            }
            else
            {
                var page_link = Builder.node("a",{"href":"javascript:void(0);"},String(j+1));
                this.addNavigationAreaElement(page_link,j * this.nb_element_inpage);
            }

        }
        else if(jump==false)
        {
            var page_jump = Builder.node("span",{"class":"jump"},'...');
            this.addNavigationAreaElement(page_jump);
            jump = true;
        }
        j++;
     }

    if(this.offset < this.nb_element_total - this.nb_element_inpage)
    {
        // lien "suivant"
        page_link = Builder.node("a",{"href":"javascript:void(0);"},"Suivante >");
        this.addNavigationAreaElement(page_link,this.offset + this.nb_element_inpage);
    }
}

Paginator.prototype.updatePage = function(new_offset) {
    if(this.ajax_loader != null)
    {
        this.ajax_loader = null;
    }

    this.main_display_area.innerHTML = "<div class=\"searching\"><img src=\"/common_img/loader/loader_bar.gif\" /><br />Recherche en cours...</div>";

    var params = this.extra_parameters.merge({'offset': new_offset});

    if(this.need_count==true)
    {
        params.update({'getcount': 'true'});
    }

    this.ajax_loader = new Ajax.Updater({success: this.main_display_area}, this.updater_url, {
                                         asynchronous: true,
                                         method: 'get',
                                         encoding: 'UTF-8',
                                         parameters: params,
                onComplete: function(response,control_data) {
                    if (response.status != 200) {
                        $(this.main_display_area).update('<p>Aucun résutat</p>');
                        return;
                    }
                    this.offset = parseInt(response.getResponseHeader('New-Page-Offset'), 10);
                    if(response.getResponseHeader('New-Count')) {
                        this.nb_element_total = parseInt(response.getResponseHeader('New-Count'));
                        this.need_count = false;
                    }
                    this.drawNavigationArea();

                    if(this.callback!=null) {
                        this.execCallBack(control_data);
                    }

                }.bind(this)
        });

}


Paginator.prototype.registerCallBack = function(user_function) {
    this.callback = user_function;
}



Paginator.prototype.execCallBack = function(control_data) {
    this.callback();
}

