/*
 * xSlider 1.0 - Plugin for jQuery
 * 
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Depends:
 *   jquery.js
 *
 *  Copyright (c) 2008 Oleg Slobodskoi (ajaxsoft.de)
 */

;(function($){

$.fn.xSlider = function( options ) {
	var	args = Array.prototype.slice.call(arguments, 1);

	return this.each(function() {
		var method = (typeof options == 'string') ? options : 'init',
			instance = $.data(this, 'xSlider') || $.data( this, 'xSlider', new xSlider(this, options));
		instance[method].apply(instance, args);
	});
};

$.fn.xSlider.defaults = {
	slider: '.x-slider',
	duration: 500,
	value: 1,
	axis: 'x',
	cycle: true,
	next: null,
	prev: null,
    slide: function(){},
    afterSlide: function(){}
};

function xSlider ( elem, options )
{
	var self = this,
        s = $.extend({}, $.fn.xSlider.defaults, options),
		$elem = $(elem),
		sliderSize = getParentSize(),
		$slider = $elem.find(s.slider),
		$sliderWrapper,
        $next, $prev,
        animating;

	self.value = sliderToNum(s.value);
        
        
	this.init = function ()
	{
		if ( $slider.length < 1 ) return;
		
		$elem.addClass('x-slider-wrapper').wrapInner('<div class="x-slider-scroll-sections"/>')
        /* prevent scrolling if not with xSlider, e.g. chrome issue by tabbing or hash values */
        .bind('scroll', function(){
            !animating && $elem.scrollLeft(self.value*sliderSize.width); 
        })
        .bind('resize', function(e,size){self.resize(size)});

		$slider.css(sliderSize);
		
		//if start slider is not the first one
		if (self.value != 0){
			var slider  = self.value;
			self.value = 0;
			self.slide( slider+1 );
		};

        		
        if ( s.next ) 
            $next = $(s.next).bind('click', function(){
                self.slide('next');
                return false;
            });
        if ( s.prev ) 
            $prev = $(s.prev).bind('click', function(){
                self.slide('prev');
                return false;
            });

	};
	
	
	this.slide = function ( slider, duration, c )
	{
		if ( typeof duration == 'function' ) {
			c = duration;
			duration = null;
		};
		

		slider = sliderToNum(slider);

		if (slider == self.value) return;


		if (!s.cycle) {
            if (slider < 0 || slider >= $slider.length) {
                callback('afterSlide', c);
                return false;
            };
        } else 
            slider = slider < 0 ? $slider.length - 1 : slider >= $slider.length ? 0 : slider;
            

        callback('slide');
        animating = true;
		$elem.addClass('sliding').animate({scrollLeft: slider*sliderSize.width}, duration || s.duration, function(){
			$elem.removeClass('sliding');
            callback('afterSlide', c);
            animating = false;
        });
		self.value = slider;

		
	};
	
	this.resize = function( size ) {	
        sliderSize = size || getParentSize();
		
		$slider.css(sliderSize);
		
		//timeout because of ie6 bug
		setTimeout(function(){
			$elem.scrollLeft(self.value*sliderSize.width);
		},10);
	};
    
    this.destroy = function() {
        $next && $next.unbind('click');
        $prev && $prev.unbind('click');
        $elem.unbind('scroll resize').removeData('xSlider');
    };

	function sliderToNum ( slider )
	{
		//translate user slider number to 0 based list
		if ( typeof slider == 'number' )
				return slider-1;	
		
		//thats selector string or "prev" || "next"
		else if (typeof slider == 'string')
		{
			var $activeSlider = $slider.filter( slider );
			if ( $activeSlider.length>0 )
				return $slider.index($activeSlider[0]) ; 		
			else if ( slider == 'prev' || slider == 'next'){
				return slider == 'prev' ? self.value-1 : self.value+1;
			} else
				return 0;
		} 
		//thats dom elem	
		else 
			return $slider.index(slider);
		
	};

	function getParentSize ()
	{
		var width = $elem.width();

		/* Ist noch nicht ganz klar geloest*/
		//if ( $elem.css('overflow') != 'hidden' &&  $.scrollbarWidth)
		//	width = $elem.width()+$.scrollbarWidth();

		return { width: width, height: $elem.height() };
	};
    
    function callback( eName, c ) {
        $elem.trigger(eName, [self]);
        s[eName].apply(elem, [$.Event(eName),self]);
        c && c.apply(elem,[$.Event(eName), self]);        
    };
    

	
};



})(jQuery);		
