var MAG = Object.extend({}, MAG || {});
MAG.dpp = Class.create({

	paging_el: null,
	lis: null,

	initialize: function(options)
	{
		this.options = Object.extend({
			tr: 0,
			current_page: 1,
			tpl: null,
			max_visible_elements: 5
		}, options || {});

		this.updatePaging();
	},

	updatePaging: function()
	{
		if(!this.paging_el)
		{
			this.paging_el = new Element('span', {style: "padding: 0 5px;", id: 'dpp_pages'});
			var next = (new Element('ins', {style: "cursor: pointer;", id: 'dpp_paging_next'}).update('&raquo;'));
			var prev = (new Element('ins', {style: "cursor: pointer;", id: 'dpp_paging_prev'}).update('&laquo;'));
			var paging = (new Element('div', {style: "padding: 10px"})).insert(prev).insert(this.paging_el).insert(next);
			document.write((new Element('div')).insert(paging).innerHTML);
			this.paging_el = $('dpp_pages');
			this.lis = $(this.paging_el.parentNode).previous(2).select('li');
			this.options.tp = Math.ceil(this.lis.length / this.options.max_visible_elements);
			this.lis[this.options.max_visible_elements-1].addClassName('last');
			$('dpp_paging_next').observe('click', this.next.bind(this));
			$('dpp_paging_prev').observe('click', this.prev.bind(this));
		}

		this.paging_el.update(this.options.tpl.evaluate({page: this.options.current_page, total: this.options.tp}));
	},

	next: function()
	{
		if(this.options.current_page != this.options.tp)
		{
			this._doIt(1);
		}
	},

	prev: function()
	{
		if(this.options.current_page > 1) {
			this._doIt(-1);
		}
	},

	_doIt: function(offset)
	{
		var fl = this._getFirstAndLastIndexes();
		if(this.lis[fl[1]]) this.lis[fl[1]].toggleClassName('last');
		this._showOrHide(fl);
		this.options.current_page = this.options.current_page + offset;
		fl = this._getFirstAndLastIndexes();
		this._showOrHide(this._getFirstAndLastIndexes());
		if(this.lis[fl[1]]) this.lis[fl[1]].toggleClassName('last');
		this.updatePaging();
	},

	_getFirstAndLastIndexes: function()
	{
		var fi = this.options.max_visible_elements * (this.options.current_page - 1);
		var li = fi + this.options.max_visible_elements - 1;
		return [fi, li];
	},

	_showOrHide: function(range)
	{
		$R(range[0], range[1]).each(function(ind){
			if(this.lis[ind]) this.lis[ind].toggle();
		}.bind(this));
	}
});

var dpp = new MAG.dpp({tpl: page_text_template});