/**
 Objektas, valdantis javascript'inį puslapiavimą
  
 Naudoja HashObject (document.hash) bei jQuery
 
 Perduodamas parametrų objektas:
{
	target: $(document), //elementas, kuriame yra visi likę puslapiavimo valdomi elementai
	page_count: 7, //puslapių kiekis
	page_load_fn: function(){}, //funkcija, paleidžiama per jQuery metodą each ant visų puslapių divų, kuriuos reikia rodyti
	//nebūtini parametrai
	hash_name: 'page', //kokį hash elementą naudoti aktyvaus puslapio saugojimui
	links_delta: 3, //kiek puslapiavimo linkų rodyti į abi puses nuo aktyvaus puslapio
	links_preserve_count: true, //ar padidinti rodomų puslapiavimo linkų skaičių į vieną pusę, jei kitoje jų rodoma mažiau, nei nurodyta
	watch_hash_changes: true //ar stebėti nurodyto hash elemento pasikeitimus ir pagal juos automatiškai keisti aktyvų puslapį
}

 Reikiama HTML struktūra (visiškai būtinas yra tik rel="page" elementas):
<target>
	<span id="*_first" rel="paging_button_first"><a rel="paging_link" href="#">|&lt;</a> | </span>
	<span id="*_prev" rel="paging_button_prev"><a rel="paging_link" href="#">&lt;</a> | </span>
	{foreach from=$pages item=page key=key}
		<span id="*_{$key}" rel="paging_button"><a rel="paging_link" href="#">{$page.num}</a><b rel="paging_number" style="display:none;">{$page.num}</b><span rel="paging_separator"> | </span></span>
	{/foreach}
	<span id="*_next" rel="paging_button_next"> | <a rel="paging_link" href="#">&gt;</a></span>
	<span id="*_last" rel="paging_button_last"> | <a rel="paging_link" href="#">&gt;|</a></span>
	{foreach from=$pages item=page key=key}
		<div id="*_{$key}" rel="page" style="display:none;">...</div>
	{/foreach}
	<a rel="paging_hide" href="#">-</a>
	<a rel="paging_show" href="#">+</a><br/>
</target>
 */
function PagingObject(options) {
	//būtini nustatymai
	this.target = options.target;
	this.page_count = options.page_count;
	this.page_load_fn = options.page_load_fn;

	//pagalbiniai nustatymai
	if (options.hash_name) {
		this.hash_name = options.hash_name;
	} else {
		this.hash_name = 'page';
	}
	if (options.links_delta) {
		this.links_delta = options.links_delta;
	} else {
		this.links_delta = 3;
	}
	if (options.links_preserve_count) {
		this.links_preserve_count = options.links_preserve_count;
	} else {
		this.links_preserve_count = true;
	}
	if (options.watch_hash_changes) {
		this.watch_hash_changes = options.watch_hash_changes;
	} else {
		this.watch_hash_changes = true;
	}

	//automatinis užpildymas
	this.hash = document.hash;

	//funkcijos
	/**
	 * Suaktyvina / išjungia reikiamus puslapiavimo linkus pagal dabartinę situaciją
	 */
	this.redraw_links = function() {
		var links_delta = this.links_delta;
		var page_range = this.page_range;
		if (this.links_preserve_count) {
			if (page_range[0] - links_delta < 0) {
				links_delta += links_delta - page_range[0];
			}
			if (page_range[1] + links_delta >= this.page_count) {
				links_delta += links_delta + page_range[1] - this.page_count + 1;
			}
		}
		var last_to_show = page_range[1]+links_delta;
		if (last_to_show > this.page_count) {
			last_to_show = this.page_count - 1;
		}
		
		//linkai i konkrecius psl
		$('[rel=\'paging_button\'] [rel=\'paging_separator\']', this.target).show();
		$('[rel=\'paging_button\']', this.target).each(function() {
			var num = parseInt(this.id.split('_').pop());
			
			if (page_range[0] < num && num < page_range[1]) {
				$(this).hide();
			} else if (page_range[0] == num || num == page_range[1]) {
				$(this).show();
				$('[rel=\'paging_link\']', this).hide();
				$('[rel=\'paging_number\']', this).show();
			} else if (page_range[0]-links_delta <= num && num <= page_range[1]+links_delta) {
				$(this).show();
				$('[rel=\'paging_number\']', this).hide();
				$('[rel=\'paging_link\']', this).show();
			} else {
				$(this).hide();
			}
			if (num == last_to_show) {
				$('[rel=\'paging_separator\']', this).hide();
			}
		});
		
		//sekantis / ankstesnis psl linkai
		if (page_range[0] <= 0) {
			$('[rel=\'paging_button_first\'], [rel=\'paging_button_prev\']').hide();
		} else {
			$('[rel=\'paging_button_first\'], [rel=\'paging_button_prev\']').show();
		}
		if (page_range[1] >= this.page_count - 1) {
			$('[rel=\'paging_button_next\'], [rel=\'paging_button_last\']').hide();
		} else {
			$('[rel=\'paging_button_next\'], [rel=\'paging_button_last\']').show();
		}

		//rodyti daugiau/mažiau
		if (page_range[1] >= this.page_count-1) {
			$('[rel=\'paging_show\']', this.target).hide();
		} else {
			$('[rel=\'paging_show\']', this.target).show();
		}
		if (page_range[1] <= page_range[0]) {
			$('[rel=\'paging_hide\']', this.target).hide();
		} else {
			$('[rel=\'paging_hide\']', this.target).show();
		}
	}

	/**
	 * Nustato aktyvų puslapį.
	 * Puslapis gali būti "next", "prev", "first", "last", "#" arba "#-#", kur # yra skaičius
	 * "#-#" atveju aktyvuojami visi puslapiai, kurių numeriai yra tarp nurodytų, imtinai.
	 * Jeigu parametras from_hash yra true, tada puslapio numeriai prasideda nuo 1, priešingu atveju nuo 0.
	 */
	this.set_page = function(page, from_hash) {
		if (page == 'next') {
			if (this.page_range[0] >= this.page_count - 1) {
				return;
			}
			page = this.page_range[0]+1;
		} else if (page == 'prev') {
			if (this.page_range[0] <= 0) {
				return;
			}
			page = this.page_range[0]-1;
		} else if (page == 'first') {
			page = 0;
		} else if (page == 'last') {
			page = this.page_count - 1;
		}
		if (page == '' || page == undefined) {
			page = 0;
			if (from_hash) {
				page++;
			}
		}
		if (typeof page != 'string') {
			page = page.toString();
		}
		this.page_range = page.split('-');
		if (this.page_range.length == 1) {
			this.page_range.push(this.page_range[0]);
		}
		this.page_range[0] = parseInt(this.page_range[0]);
		this.page_range[1] = parseInt(this.page_range[1]);
		if (from_hash) {
			this.page_range[0]--; this.page_range[1]--;
		}
		this.redraw();
	}

	/**
	 * Pageneruoja bei grąžina aktyvų puslapį identifikuojančią hash elemento reikšmę
	 */
	this.get_hash_part = function() {
		var page_range = [];
		page_range[0] = this.page_range[0] + 1;
		page_range[1] = this.page_range[1] + 1;
		if (page_range[0] == page_range[1]) {
			return page_range[0].toString();
		} else {
			return page_range.join('-');
		}
	}

	/**
	 * Atlieka visus pakeitimus html kode pagal pasikeitusius parametrus
	 */
	this.redraw = function() {
		var page_range = this.page_range;
		var $all_pages = $('div[rel=\'page\']', this.target);
		var $pages_to_show = $all_pages.filter(function() {
			var num = parseInt(this.id.split('_').pop());
			return page_range[0] <= num && num <= page_range[1];
		});

		$pages_to_show.each(this.page_load_fn);
		/*
		$('[rel=\'img\'] .img_insertion_point', $pages_to_show).each(function(){
			$(this).replaceWith('<img src="'+$(this).text()+'" />');
		});
		*/
		$all_pages.not($pages_to_show).hide();
		$pages_to_show.show();
		this.redraw_links();
		if (this.page_range[0] == 0 && this.page_range[1] == 0) {
			if (this.hash.current() == '') {
				//nieko daryti nereikia
			} else {
				this.hash.unset(this.hash_name, true); //kolkas neatnaujinti adreso
				if (this.hash.toString() == '') { //negalima nustatineti i tuscia stringa.
					this.hash.set(this.hash_name, this.get_hash_part());
				} else {
					this.hash.apply();
				}
			}
		} else {
			this.hash.set(this.hash_name, this.get_hash_part());
		}
	}

	/**
	 * Prie šiuo metu rodomų puslapių prideda sekantį
	 */
	this.reveal_next_page = function() {
		if (this.page_range[1] >= this.page_count) {
			return;
		}
		this.page_range[1]++;
		this.redraw();
	}

	/**
	 * Iš šiuo metu rodomų puslapių atima paskutinį
	 */
	this.hide_last_page = function() {
		if (this.page_range[0] >= this.page_range[1]) {
			return; //nothing to hide
		}
		this.page_range[1]--;
		this.redraw();
	}

	//initas
	var pager = this;
	$('[rel=\'paging_button\'], [rel^=\'paging_button_\']', this.target).each(function() {
		//čia this yra paging button'as
		var num = this.id.split('_').pop();
		$('[rel=\'paging_link\']', this).bind('click', {pager:pager}, function(e){e.data.pager.set_page(num); return false;});
	});
	$('[rel=\'paging_hide\']', this.target).bind('click', {pager:pager}, function(e){e.data.pager.hide_last_page(); return false;});
	$('[rel=\'paging_show\']', this.target).bind('click', {pager:pager}, function(e){e.data.pager.reveal_next_page(); return false;});
	
	this.set_page(this.hash[this.hash_name], true);
	
	if (this.watch_hash_changes) {
		document.hash.bind(this.hash_name, function(hash) {
			pager.set_page(hash.img_page, true);
		});
	}
}