/**
 * $URL:$
 * $Date:$
 * $Revision:$
 * $Author:$
 *
 * Copyright (C) 2009 seso media group <www.seso.at>
 * 
 * This program is free software; you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by the 
 * Free Software Foundation; either version 2 of the License, or 
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but 
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
 * for more details: <http://www.gnu.org/licenses/>
 * 
 * powered by Prototype JavaScript framework <http://www.prototypejs.org/>
 * powered by scriptaculous <http://script.aculo.us/>
 * 
 * @author: gg@seso.at
 */

/*******************************************************************************
	SLIDER
*******************************************************************************/

var sliderObserver = Class.create(Observer, {

	
	startUp : function() {

		for (var i=0; i<this.cache.length; i++) {
			
			this.prepeareItem(this.cache[i]);
		}
	},
	
	
	getDefaultConfig : function() {

		var item = {};
			item.cid = null;

			item.itemContainer = 'sliderItemContainer';
			item.pageCounter = null;
			item.pageCounterInfo = null;
			item.slideLeft = 'slideLeft';
			item.slideRight = 'slideRight';
			
			item.viewportSize = 3;
			item.itemWidth = 200;
			item.jumpSize = 1;
			
			item.counter = 0;
			item.actPosition = 1;
			item.pageIndex = 0;
			item.active = false;

		return item;
	},
	
	
	
	prepeareItem : function(item) {
		
		item.itemContainer = $(item.itemContainer);
		
		if (!item.itemContainer) {
			
			log("["+item.cid+"] itemContainer not found", 3, this.name);
			return;
		}
		
		item.counter = item.itemContainer.childElements().size() - 1; // clear-div
		item.itemContainer.style.width = item.counter * item.itemWidth + 'px';

		
		item.slideLeft = $(item.slideLeft);
		
		if (item.slideLeft) {

			Event.observe(item.slideLeft, 'click', util.slider.slideLeft);
			item.slideLeft.setAttribute('cid', item.cid); 

		} else {
			
			log("slideLeft not found", 2, this.name);
		}
		
		
		item.slideRight = $(item.slideRight);
		
		if (item.slideRight) {

			Event.observe(item.slideRight, 'click', util.slider.slideRight);
			item.slideRight.setAttribute('cid', item.cid);
			
		} else {
			
			log("slideRight not found", 2, this.name);
		}
		
		
		if (item.pageCounter !== null && item.pageIndex >= 0) {

			item.pageCounter = $(item.pageCounter);
			
			if (item.pageCounter) {
				
				var list = [];
				var pages = Math.ceil((item.counter-item.viewportSize) / item.jumpSize)+1;

				for (var i=0; i<pages; i++) {
					
					list[i] = new Element('DIV');
					item.pageCounter.appendChild(list[i]);
				}
				
				if (item.pageCounter.firstChild) {
					
					var m = pages * item.pageCounter.firstChild.getWidth() * (-1);
					item.pageCounter.style.marginLeft = Math.round(m) + 'px';
					item.pageCounter = list;
					
				} else {
					
					item.pageCounter = null;
				}
				
			} else {
				
				log("["+item.cid+"] pageCounter not found", 2, this.name);
				item.pageCounter = null;
			}
		}
		
		if (item.pageCounterInfo !== null) {
			
			if (item.pageIndex >= 0) {
			
				var pId = item.pageCounterInfo+'_page';
				var oId = item.pageCounterInfo+'_of';

				if ($(item.pageCounterInfo)) {

					$(oId).innerHTML = item.counter;
					$(pId).innerHTML = item.pageIndex+1;
					
					item.pageCounterInfo = $(pId); 
				}
				
			} else {
				
				$(item.pageCounterInfo).style.display = 'none';
			}
		}
		
		util.slider.checkArrows(item);
	},

	
	update : function() {},

	remove : function() {},
	
	
	
	checkArrows : function(item) {

		var max = item.counter - item.viewportSize + 1;

		if (item.actPosition >= max) {
			
			item.slideRight.style.display = 'none';
			
		} else {
			
			item.slideRight.style.display = 'block';
		}
		
		
		if (item.actPosition <= 1) {
			
			item.slideLeft.style.display = 'none';
			
		} else {
			
			item.slideLeft.style.display = 'block';
		}
		
		// check page-count

		if (item.pageCounterInfo) {
		
			item.pageCounterInfo.innerHTML = item.pageIndex+1;
		}
		
		if (item.pageCounter === null) {
			return;
		}
		
		for (var i=0; i<item.pageCounter.length; i++) {
			
			item.pageCounter[i].className = '';
		}

		item.pageCounter[item.pageIndex].className = 'act';
	},

	
	slideRight : function(event) {

		event.stop();
		
		var e = event.element();

		if (e.nodeName == 'IMG') {
			e = e.parentNode;
		}
		
		e.blur();

		var cid = parseInt(e.getAttribute('cid'));
		var item = util.slider.cache[cid];

		if (!item) {
			
			log("slideRight - invalid cid: "+cid, 2, this.name);
			return false;
		}
		
		
		if (item.active == false) {
			
			item.active = true;

			var j = item.jumpSize;
			var t = item.actPosition + j;
	
			var max = item.counter - item.viewportSize + 1;
	
			if (t > max) {
				
				t = max;
				j = max - item.actPosition;
			}
	
			item.actPosition = t;
			
			item.pageIndex++;
			util.slider.checkArrows(item);
			
			var x = item.itemWidth * j * (-1);
			util.slider.slide(item, x, 0);
		}
	},
	
	
	
	slideLeft : function(event) {
		
		event.stop();
		
		var e = event.element();			
		
		if (e.nodeName == 'IMG') {
			e = e.parentNode;
		}
		
		e.blur();

		var cid = parseInt(e.getAttribute('cid'));
		var item = util.slider.cache[cid];

		if (!item) {
			
			log("slideLeft - invalid cid: "+cid, 2, this.name);
			return false;
		}
		
		
		if (item.active == false) {
			
			item.active = true;
		
			var j = item.jumpSize;
			var t = item.actPosition - j;
	
			var max = item.counter - item.viewPortSize + 1;
	
			if (t < 1) {
				
				t = 1;
				j = item.actPosition - 1;
			}
	
			item.actPosition = t;
			
			item.pageIndex--;
			util.slider.checkArrows(item);
			
			var x = item.itemWidth * j;
			util.slider.slide(item, x, 0);
		}
	},
	
	
	slide : function(item, x, y) {

		new Effect.Move(item.itemContainer, {
			x: x,
			y: y,
			mode: 'relative',
			transition: Effect.Transitions[util.slider.p.transition],
			duration: util.slider.p.duration,
			afterFinish : function() {
			
				item.active = false;
			}
		});
	}
	


});

util.prototype.slider = new sliderObserver('slider');




