/**
 * jQuery ulSlide plugin
 * @name jquery-ulslide.js
 * @author Kotelnitskiy Evgeniy - http://4coder.info
 * @version 1.32
 * @date Feb 08, 2010
 * @category jQuery plugin
 * @copyright (c) 2010 Kotelnitskiy Evgeniy (http://4coder.info)
 * @license GPL
 * @example Visit http://4coder.info/jquery-ulslide/ for more informations about this jQuery plugin
 */
ulslide_last_id = 0;
(function(jQuery) {
	jQuery.fn.ulslide = function(settings) {		
		var thisObj = this;
		if (thisObj.length == 0) return false;
		var thisEl = thisObj[0];
		if (! jQuery(thisEl).attr('id')) {
			ulslide_last_id ++;
			jQuery(thisEl).attr('id', 'ulslide-' + ulslide_last_id);
		}
		var id = jQuery(thisEl).attr('id');
		
		// Settings 
		settings = jQuery.extend({
			axis: 'x', // x, y
			direction: 'f', // f, b
			affect: 'slide', // slide, fade
			duration: 600,
			width: thisObj.width(), 
			height: 'auto', // auto
			statusbar: false,
			padding: 20, 
			lionpage: 1, 
			autoslide: false, 
			current: 0,
			bnext: false,
			bprev: false,
			onAnimate: function(settings, thisEl){}
		},settings);
			
			
		settings['prev'] = settings['current'];
		settings['count'] = jQuery('> li', thisObj).length;
		jQuery('> li', thisObj).each(function(i){
			var liel = jQuery(this);
			liel.addClass('slide-node slide-node-'+i);	
			liel.css("position", 'absolute');
			liel.css("margin", '0');
			liel.css("padding", '0');
			liel.css("width", settings['width']);
			liel.css("overflow", "hidden");
			if (i == settings['current']){
				liel.css("top", '0');
				liel.css("left", '0');
			}
			else{
				liel.css("top", '0');
				liel.css("left", -(settings['width'] + settings['padding']));
			}
		});
		
		thisObj.css("list-style", "none");
		thisObj.css("padding", "0");
		thisObj.css("position", "relative");
		thisObj.css("overflow", "hidden");
		thisObj.css("width", settings['width']);
		if (settings['height'] == 'auto'){
			thisObj.css("height", jQuery('> li:eq('+settings['current']+')', thisObj).height());
		}
		else thisObj.css("height", settings['height']);
		settings['prevHeight'] = settings['height'];
		
		// statusbar
		if (settings['statusbar']){
			settings['img_count'] = this.find('img').length;
			if (settings['img_count']){
				thisObj.append('<li class="ulslide-statusbar" id="'+id+'-statusbar" style="position: absolute; padding:0; margin:0; width:'+settings['width']+'px; height:'+thisObj.css("height")+'; "><span>Loading...</span></li>');
			}			
			settings['img_loaded'] = 0;
			this.find('img').bind('load',function(){
				settings['img_loaded'] ++;
				//alert(settings['img_loaded'] + ' of ' + settings['img_count']);
				//jQuery('#'+id+'-statusbar').html('Loading... (' + settings['img_loaded'] + ' of ' + settings['img_count'] + ')');
				if (settings['img_loaded'] == settings['img_count']){
					jQuery('#'+id+'-statusbar').remove();
					thisEl.ready = true;
				}
			});
		}
		

		function getSlide(num) {
			return jQuery('> li:eq('+num+')', thisObj);
		}
		
		if (settings['height'] == 'auto')
			 thisEl.currentHeight = getSlide(settings['current']).height();
		else thisEl.currentHeight = settings['height'];
		
		thisEl.uslCurrent = function(new_value){
			if (new_value == undefined){
				return settings['current'];
			}
			else{
				settings['current'] = new_value;
				return new_value;
			}			
		}
			
		thisEl.autoslideNext = function(){
			if (settings['current'] < settings['count'] - 1) settings['current'] ++; 
			else settings['current'] = 0;
			this.uslRefresh();
		};
	
		thisEl.initAutoslide = function(){
			if (settings['TimeoutID']) clearTimeout(settings['TimeoutID']);
			settings['TimeoutID'] = setTimeout("jQuery('#"+jQuery(thisEl).attr('id')+"')[0].autoslideNext()", settings['autoslide']);
		};
		
		thisEl.clearAutoslide = function(){
			if (settings['TimeoutID']) {
				clearTimeout(settings['TimeoutID']);
			}
		};
		
		thisEl.uslRefresh = function(){
			if (! thisEl.ready) {
				setTimeout("jQuery('#"+jQuery(thisEl).attr('id')+"')[0].uslRefresh()", 200);
				return;
			}
			thisEl.ready = false;
			
			thisEl.clearAutoslide();
			var prev = getSlide(settings['prev']);
			var current = getSlide(settings['current']);	
			
			if (settings['height'] == 'auto') {
				thisEl.currentHeight = getSlide(settings['current']).height();
				settings['prevHeight'] = getSlide(settings['prev']).height();
			}	
			
			if (settings['affect'] == 'slide'){
				jQuery('> li', thisObj).each(function(i){
					if (settings['direction'] == 'f') jQuery(this).css('z-index', i);
					else jQuery(this).css('z-index', settings['count'] + settings['current'] - i);
				});	
			
				if (settings['axis'] == 'x'){	
					if (settings['prev'] != settings['current']){
						if (settings['direction'] == 'f'){
							prev.animate({'left': -(settings['width'] + settings['padding'])}, settings['duration']);
							current.css('left', settings['width'] + settings['padding']);
						}				
						else{
							prev.animate({'left': settings['width'] + settings['padding']}, settings['duration']);
							current.css('left', -(settings['width'] + settings['padding']));
						}
					}
					current.animate({'left': 0}, settings['duration'], function(){ 
						thisEl.ready = true;
					});
				}
				else {
					if (settings['prev'] != settings['current']){
						if (settings['direction'] == 'f'){
							prev.animate({'top': thisEl.currentHeight + settings['padding']}, settings['duration'], function(){
								prev.css('left', -(settings['width'] + settings['padding']));
							});
							current.css('top', -(settings['prevHeight'] + settings['padding']));
						}
						else{
							prev.animate({'top': -(thisEl.currentHeight + settings['padding'])}, settings['duration'], function(){
								prev.css('left', -(settings['width'] + settings['padding']));
							});
							current.css('top', settings['prevHeight'] + settings['padding']);
						}
					}
					current.css('left', 0);
					current.animate({'top': 0}, settings['duration'], function(){ 
						thisEl.ready = true;
					});
				}
			}
			else if (settings['affect'] == 'fade'){
				if (settings['prev'] != settings['current']){
					current.css('display', 'none');
					current.css('z-index', 2);
					current.css('left', 0);
					current.css('top', 0);
					prev.css('z-index', 1);
					current.fadeIn(settings['duration'], function(){
						prev.css('display', 'none');
						thisEl.ready = true;
					});
				}
				else thisEl.ready = true;
			}
			
			if (settings['height'] == 'auto') {
				thisObj.animate({'height': thisEl.currentHeight}, settings['duration']);
			}
			
			settings['prev'] = settings['current'];
			if (settings['autoslide']) thisEl.initAutoslide();				
			settings['onAnimate'](settings, thisEl);
			thisEl.uslRefreshClasses();
			//settings['affect'] = (settings['affect'] == 'slide') ? 'fade' : 'slide'; // slide, fade
		};
		
		thisEl.uslRefreshClasses = function(){
			if (settings['count'] > 1){
				if (settings['bnext']) jQuery(settings['bnext']).addClass('active');
				if (settings['bprev']) jQuery(settings['bprev']).addClass('active');
			}

			if (settings['navigator']){
				var navigator = jQuery(settings['navigator']).removeClass('usl-current');
				jQuery(settings['navigator'] + '.usl-navigator-'+thisEl.uslCurrent()).addClass('usl-current');
			}
		};
		
		if (settings['bnext']){
			jQuery(settings['bnext']).click(function(){
				settings['direction'] = 'f';
				var c = thisEl.uslCurrent();
				if (c + 1 < settings['count']) thisEl.uslCurrent(c + 1);
				else thisEl.uslCurrent(0);
				thisEl.uslRefresh();
				return false;
			});
		}
		
		if (settings['bprev']){
			jQuery(settings['bprev']).click(function(){
				settings['direction'] = 'b';
				var c = thisEl.uslCurrent();
				if (c > 0) thisEl.uslCurrent(c - 1);
				else thisEl.uslCurrent(settings['count'] - 1);
				thisEl.uslRefresh();
				return false;
			});
		}

		if (settings['navigator']){
                        var navigator = jQuery(settings['navigator']);
                        navigator.each(function(index){
                            this.usl_navigator_index = index;
                            jQuery(this).addClass('usl-navigator-' + index);
                        });
			navigator.click(function(){
				var c = this.usl_navigator_index;
				if ((c < settings['count']) && (c != thisEl.uslCurrent())) {
                                    thisEl.uslCurrent(c);
                                    thisEl.uslRefresh();
                                }
				return false;
			});
		}
		
		if (! settings['statusbar']) thisEl.ready = true;
		thisEl.uslRefresh();
		
	};
})(jQuery); 