/*
 * xSlider 1.1 - 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),
        ret = this;
    this.each(function() {
        instance = $.data(this, 'xSlider') || $.data( this, 'xSlider', new xSlider(this, options));
        ret = instance[ typeof options == 'string' ? options : 'init' ].apply(instance, args) || ret;
    });
    return ret;
};

$.fn.xSlider.defaults = {
	slider: '.x-slider',
	speed: 300,
	value: 0,
	axis: 'x',
	cycle: false,
	next: null,
	prev: null,
    slide: function(){},
    afterSlide: function(){}
};

function xSlider ( elem, options )
{
	var self = this,
        s = $.extend({}, $.fn.xSlider.defaults, options),
		$elem = $(elem),
		sliderSize = getElemSize(),
		$sliderWrapper,
        $next, $prev,
        animating;

    self.value = 0;
        
	this.init = function()
	{
        self.update();

		if ( self.$slider.length < 1 ) return;
		
        var value = valueToNum(s.value);
		$elem.addClass('x-slider-wrapper').wrapInner('<div class="x-slider-scroll-sections"></div>')
        // prevent scrolling if not with xSlider, e.g. chrome issue by tabbing or hash values
        .bind('scroll', function(){
            !animating && $elem.scrollLeft(self.value*$elem.innerWidth()); 
        })
        .bind('resize', function(e, size){
            self.resize(size);    
        });

		// scroll to the initial slider
		self.slide( value );
        
        // add active class
        self.$slider.eq(value).addClass('x-slider-active');
        		
        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( value, c )
	{
		value = valueToNum(value);

		if (value == self.value || animating) return;
        

        if ( s.cycle ) {
            value = value<0 ? self.$slider.length-1 : value>= self.$slider.length ? 0 : value;   
        } else {
            if ( value<0 || value >= self.$slider.length ) {
                callback('afterSlide', c);
                return;
            };
        };

        // set class to active slider
        self.$slider.removeClass('x-slider-active').eq(value).addClass('x-slider-active');

        callback('slide');
        animating = true;
		$elem.addClass('x-slider-sliding').animate({scrollLeft: value*$elem.innerWidth()}, s.speed, function(){
			$elem.removeClass('x-slider-sliding');
            animating = false;
            callback('afterSlide', c);
        });
		self.value = value;

		
	};
	
	this.resize = function( size ) {	
        sliderSize = size || getElemSize();
		self.$slider.css(sliderSize);
		
		//timeout because of ie6 bug
		setTimeout(function(){
			$elem.scrollLeft(self.value*$elem.innerWidth());
		},10);
	};
    
    this.destroy = function() {
        $next && $next.unbind('click');
        $prev && $prev.unbind('click');
        $elem.removeClass('x-slider-wrapper').unbind('scroll resize').removeData('xSlider');
        
    };
    
    this.update = function() {
        self.$slider = $elem.find(s.slider).css(sliderSize);       
    };
    
    // add a new slider, insert it at the end, and scroll if callback is setted
    this.add = function( slider, callback ) {
        var $slider = $(slider).addClass('x-slider').css(sliderSize).appendTo( $('.x-slider-scroll-sections', elem) );
        self.$slider = self.$slider.add($slider);    
        callback && self.slide($slider[0], callback);
    };
    
    // get the content of any slider
    this.get = function( value ) {
        return self.$slider.eq( valueToNum(value) ).html();
    };

	function valueToNum( value ) {
		//thats selector string or "prev" || "next"
		if (typeof value == 'string')
		{
			var $slider = self.$slider.filter( value );
            
			if ( $slider.length>0 )
				value = valueToNum( $slider[0] );	
            else if ( value == 'prev')
                value = self.value-1;
            else if ( value == 'next' )    
                value = self.value+1;
			else
				value = 0;
		} 
		//thats a dom elem	
		else if (typeof value == 'object')
			value = self.$slider.index(value);
		return value;
	};

	function getElemSize() {
		return { width: $elem.width(), height: $elem.height() };
	};
    
    function callback( name, c ) {
        $elem.trigger(name, [self]);
        s[name].apply(elem, [$.Event(name),self]);
        $.isFunction(c) && c.apply(elem,[$.Event(name), self]);        
    };
    

	
};

})(jQuery);		
	
