﻿//Copyright (c) 2008 SOLVEO Software Solutions

var ListElement = new Class({
	initialize: function(element) {		
		this.element = element;
		this.effect = new Fx.Styles(this.element,{duration:200,wait:false});
	},
	showProduct: function(url) {
		this.hide();
		this.sendRequest.pass(url, this).delay(200);
	},
	sendRequest: function(url) {
		if (this.request) this.request.cancel();
		this.request = new Ajax(url, {
			method: 'get',
			update: this.element,
			evalScripts: false,
			onComplete: this.handleResults.bind(this),
			onFailure: this.clearContent.bind(this)
		}).request();
	},
	hide: function() {
		this.effect.start({'opacity':0});
	},
	show: function() {
		this.effect.start({'opacity':1});
	},
	handleResults: function(response) {
		this.show();
	},
	clearContent: function() {
		this.element.innerHTML = '';
	}
});
ListElement.implement(new Events);

var ListElements = new Class({
	options: {
		selector: '.ListElementDefault',
		url: 'ListElement.axd?id='
	},
	initialize: function(elements, options) {
		this.setOptions(options);
		this.productId = elements;
		this.elements = $$(this.options.selector).map(function(el){
			return new ListElement(el);
		});
		this.itemsOnPage = this.elements.length;
	},
	getProductId: function(pageNo, index) {
		var i = this.itemsOnPage * (pageNo - 1) + index;
		return (i < this.productId.length) ? this.productId[i] : 0;
	},
	showPage: function(pageNo, addHistory) {
	    if (addHistory)
	        window.dhtmlHistory.add(pageNo, '');
		this.fireEvent('pagechanged', pageNo);
		this.elements.each(function(el,i){
			el.showProduct(this.options.url + this.getProductId(pageNo,i));
		}, this);
	},
	getPagesCount: function() {
		return Math.ceil(this.productId.length / this.itemsOnPage);
	}
});
ListElements.implement(new Events, new Options);

var NavigateBar = new Class({
	initialize: function(navBar, elements) {		
		this.elements = elements;
		this.prevLink = $E('a.NavPrev', navBar);
		this.nextLink = $E('a.NavNext', navBar);
		this.links = $ES('a.NavPage', navBar);
		this.linksCount = this.links.length;
		this.offset = (this.linksCount >> 1);
		this.pagesCount = elements.getPagesCount();
		if (this.pagesCount < 1) return;
		this.currPage = 1;
		this.bound = this.changePage.bindWithEvent(this);
		$ES('a', navBar).each(function(link) {
			link.addEvent('click', this.bound);
		}, this);
		this.elements.addEvent('pagechanged', this.setPageNo.bind(this));

	},
	changePage: function(event) {
		var link = $(event.target);
		if (link.hasClass('NavPrev')) {
			if (this.currPage > 1) 
			    this.changePageNo(this.currPage - 1);
		}
		else if (link.hasClass('NavNext')) {
			if (this.currPage < this.pagesCount) this.changePageNo(this.currPage + 1);
		}
		else if (link.hasClass('NavPage')) {
			this.changePageNo(parseInt(link.innerHTML));
		}
		event.preventDefault();
	},
	changePageNo: function(pageNo) {
		this.elements.showPage(pageNo, true);
	},
	setPageNo: function(pageNo, e) {
	    this.currPage = pageNo;
		var start = pageNo - this.offset;
		if (start < 1) start = 1;
		if (start + this.linksCount - 1 > this.pagesCount)
			start = this.pagesCount - this.linksCount + 1;
		this.links.each(function(link,i) {
			var no = start + i;
			link.innerHTML = no;
			if (no == pageNo) 
				link.addClass('NavSelected');
			else
				link.removeClass('NavSelected');
		});
		
	}
});
NavigateBar.implement(new Events);

var pageChangeListener = function(newLocation, historyData) {
    var pageNo = parseInt(newLocation);
    if (isNaN(pageNo)) pageNo = 1;
    elements.showPage(pageNo, false);
}

window.onload = function() {
        dhtmlHistory.initialize();
        dhtmlHistory.addListener(pageChangeListener);
        
        var currentLocation = dhtmlHistory.getCurrentLocation();
        if (currentLocation != '')
            pageChangeListener(dhtmlHistory.getCurrentLocation(), null);
};

