/****************************************************************************
Accessible News Slider

Author:
Brian Reindel, modified and adapted by Andrea Ferracani

Author URL:
http://blog.reindel.com, http://www.micc.unifi.it/ferracani

License:
Unrestricted. This script is free for both personal and commercial use.
*****************************************************************************/
(function( $ ){
	$.fn.accessNews = function(settings){
		var defaults = {
			title: "TODAY NEWS:",
			subtitle: "",
			slideBy: 4,
			speed: "slow",
			slideShowInterval: 5000,
			slideShowDelay: 5000,
			theme: "TOPSTR"
		};
		
		return this.each(function(){
			settings = jQuery.extend(defaults, settings);
			var _this = jQuery(this);
			var stories = _this.children();
			var intervalId = null; 
			var container = {
				_wrapper: "<div class=\"newsslder " + settings.theme + "\"></div>",
				_container: "<div class=\"container\"></div>",
				_content: jQuery("<div class='content'></div>"),
				_first: jQuery(stories[0]),

				init: function(){
					_this.wrap(this._wrapper);
					_this.before(this._container);
					_this.css("width", ((stories.length ) * (this._first.width() + 20)));
					//this.append(this._headline);
					this.append(this._content);
					this.set(this._first);
				},
				
				append: function(content){
					this.get().append(content);
				},
				
				get: function(){
					return _this.prev("div.container");
				},
				set: function(story){
					var container = this.get();
					var _content = jQuery("div.content", container);
					var para = jQuery('<div></div>');
					var title = jQuery('h6', story);
					title = title.attr('title') || title.text();
					para.html( "<p class='paraText'>" + jQuery('p', story).html() + "</p>");
					stories.removeClass('selected');
					story.addClass('selected');
					_content.empty();
					_content.append(para);
				}
				
			};
			
			var pagination = {
				loaded: false,
				_animating: false,
				_totalPages: 0,
				_currentPage: 1,
				_storyWidth: 0,
				_slideByWidth: 0,
				_totalWidth: 0,

				init: function(){
					if (stories.length > settings.slideBy) {
						this._totalPages = Math.ceil((stories.length) / settings.slideBy);
						this._storyWidth = jQuery(stories[0]).width();
						this._slideByWidth = 350; //( this._storyWidth ) * settings.slideBy;
						this._totalWidth = this._storyWidth * (stories.length);
						this.draw();
						this.loaded = true;
					}
				},
				
				draw: function(){
					var _viewAll = jQuery("<div class=\"view_all\"></div>").html(["<div class=\"count\"><span class=\"startAt\">1</span> - <span class=\"endAt\">", settings.slideBy, "</span> of ", stories.length , "</span></div><div class=\"controls\"><span class=\"back\"><a href=\"#\" title=\"Back\">&lt;&lt; Back</a></span><span class=\"next\"><a href=\"#\" title=\"Next\">Next &gt;&gt;</a></span></div>"].join(""));
					_this.after(_viewAll);
					var _next = jQuery(".next > a", _viewAll);
					var _back = jQuery(".back > a", _viewAll);
					
					_next.click(function(){
						var page = pagination._currentPage + 1;
						pagination.to(page);
						return false;
					});
					
					_back.click(function(){
						var page = pagination._currentPage - 1;
						pagination.to(page);
						return false;
					});
				},
				
				to: function(page){
					if(this._animating){
						return;
					}
					var viewAll = _this.next(".view_all");
					var startAt = jQuery(".startAt", viewAll);
					var endAt = jQuery(".endAt", viewAll);
					this._animating = true;
					if(page >= this._totalPages )
					{
						page = this._totalPages;
					}
					
					if (page <= 1)
					{
						page = 1;
					}
					var _startAt = (page * settings.slideBy) - settings.slideBy;
					var _left = parseInt(_this.css("left"));
					var _offset = (page * this._slideByWidth) - this._slideByWidth;
					startAt.html(_startAt + 1);
					if ( page * settings.slideBy > stories.length)
					    endAt.html(stories.length);
					else
					    endAt.html(page * settings.slideBy);
					    
					_left = (_offset * -1);
					_this.animate({
						left: _left
					}, settings.speed);
					
					// when paginating set the active story to the first
					// story on the page
					
					container.set(jQuery(stories[_startAt]));
					this._currentPage = page;
					this._animating = false;
				}
			};
			
			var slideshow = {
				
				init: function(){
					this.attach();
					setTimeout(function(){
						intervalId = "";
						slideshow.on();
					}, settings.slideShowDelay);
				},
				
				on: function(){
					if (!intervalId) {
						intervalId = setInterval(function(){
							slideshow.slide();
						}, settings.slideShowInterval);
					}
				},
				
				off: function(){
					if (intervalId) {
						clearInterval(intervalId);
						intervalId = null;
					}
				},
				
				slide: function(){
					var current = jQuery("li.selected", _this);
					var next = current.next("li");
					var page = 0;
					var storyIndex = 0;
					var storyMod = 0;
                    var slen = 0;
                    slen = stories.length ;
                        
					storyIndex = stories.index(next);
                    if ( storyIndex == slen )  
                    {
					    next = jQuery(stories[0]);
					    page = 1;
					    pagination.to(page)
                    }

					if (!(next.length))
					{
						next = jQuery(stories[0]);
						page = 1;
					}
					
					container.set(next);
					if (pagination.loaded) {
						storyIndex = stories.index(next);
						storyMod = (storyIndex) % settings.slideBy;
						if (storyMod === 0) {
							page = (Math.ceil(storyIndex / settings.slideBy)) + 1;
						}
						
						if (page > 0) {
							pagination.to(page);
						}
						
					var viewAll = _this.next(".view_all");
					var startAt = jQuery(".startAt", viewAll);
					startAt.html(storyIndex+1);

					}
				},
				
				attach: function(){
					
					var that = jQuery(_this).parent("div.newsslder");
					that.hover(function(){
						// pause the slideshow on hover
						slideshow.off();
					}, function (){
						// resume slideshow on mouseout
						slideshow.on();
					});
				}
			};
			
			//setup the container
			container.init();
			// pagination setup
			pagination.init();
			// slideshow setup
			slideshow.init();
			// append hover every to each element to update container content
			stories.hover(function(){
				// set container contect to hovered li
				container.set(jQuery(this));
			}, function(){
				// do nothing
			});
		});
	};
})( jQuery );
