
/**
 * @classDescription Controls a scroller.
 * @return {Object}	Returns a new object.
 * @projectDescription
 * It extends Scroller and manages single page pagination for it (prev/next).
 */
 var SinglePagingScroller = Class.create(Scroller, {
	initialize: function($super, slideFrame, scrollerOptions, elPrevTrigger, elNextTrigger, controlOptions) {
		
		// set control options
		this.controlOptions = Object.extend({
			itemsPerGroup: 2,
			initialGroupIndex: 0
		}, controlOptions || {});
		
		// construction tasks
		$super(slideFrame, scrollerOptions); // initialize parent class
		
		this.elPrevTrigger = $(elPrevTrigger);
		this.elNextTrigger = $(elNextTrigger);

		// attach paging control events
		this.elPrevTrigger.observe('click', this.__movePreviousClick.bindAsEventListener(this));
		this.elNextTrigger.observe('click', this.__moveNextClick.bindAsEventListener(this));
		
		this._adjustControlClasses();
		
		this.jumpToGroup(this.controlOptions.initialGroupIndex);
		
	},

	// event handlers
	__movePreviousClick: function(e) {
		Event.stop(e);
		this.moveToPreviousGroup();
	},

	__moveNextClick: function(e) {
		Event.stop(e);
		this.moveToNextGroup();
	},
	
	// methods
	moveToNextGroup: function() {
		if (this.currentGroupIndex < (this.getGroupCount() - 1)) {
			this.moveToGroup(this.currentGroupIndex + 1);
		}
	},

	moveToPreviousGroup: function() {
		if (this.currentGroupIndex > 0) {
			this.moveToGroup(this.currentGroupIndex - 1);
		}		
	},
	
	moveToFirstGroup: function() {
		this.moveToGroup(0);
	},

	moveToLastGroup: function() {
		this.moveToGroup(this.getGroupCount() - 1);
	},
	
	moveToGroup: function(groupIndex) {
		if ((groupIndex < this.getGroupCount()) && (groupIndex > -1) && groupIndex != this.currentGroupIndex) {
			this.currentGroupIndex = groupIndex;
			this.moveTo(groupIndex * this.controlOptions.itemsPerGroup);
			
			this._adjustControlClasses();
		}
	},

	jumpToGroup: function(groupIndex) {
		this.currentGroupIndex = groupIndex;
		this.jumpTo(groupIndex * this.controlOptions.itemsPerGroup);

		this._adjustControlClasses();
	},
	
	getGroupCount: function() {
		return Math.ceil(this.getSlideCount() / this.controlOptions.itemsPerGroup);
	},
	
	_adjustControlClasses: function(){
		// adjust disabled class on next/previous 
		var groupCount = this.getGroupCount();
		(this.currentGroupIndex  > 0) ? this.elPrevTrigger.removeClassName('disabled') :this.elPrevTrigger.addClassName('disabled');
		(this.currentGroupIndex < (groupCount-1)) ? this.elNextTrigger.removeClassName('disabled') : this.elNextTrigger.addClassName('disabled');
	}

});
