(function($){
		var primeNews = $.primeNews = {
			target: null,
			pointer: null,
			pointerTarget: null,
			descsTarget: null,
			thumbs: [],
			titles: [],
			descs: [],
			params: [],
			_current: 0,
			_isFading: false
		};
		
		primeNews.init = function() {
			if (arguments.length == 0 || typeof arguments[0] != "object") {
				return false;
			}
			this.target = $("#prime_news_thumb").empty();
			
			// getting the descriptions
			this.descsTarget = $('#prime_news_description').empty();
			
			// set params
			var params = arguments[0];
			$.extend(this.params, this.defaults, params);
			
			// image loading
			this._preload(params.baseUrl, params.filenames, function(){
				//set event handlers
				primeNews._initHandlers();
				primeNews._run();
			});
		};
		
		primeNews._initHandlers = function() {
			$('#prime_news_wrapper').mouseenter(function(){
				primeNews._stopRolling();
			}).mouseleave(function(){
				setTimeout(function(){primeNews._continueRolling();}, primeNews.params.speedPointer + 400);
			}).click(function(event){
				if (primeNews._isFading) {
					return false;
				}
				document.location.href = $('#prime_news_wrapper .current a').attr('href');
				return false;
			});
			
			$('#current_prime_news_wrapper li').mouseenter(function(event){
				primeNews._stopRolling();
				if (primeNews._isFading) {
					return false;
				}
				var index = $(event.target).closest('li').attr('id').slice(3) - 1;
				if (index == primeNews._current){
					return false;
				}
				primeNews._fadeTo(index, false);
				return false;
			});
		};
		
		primeNews._initDescriptions = function() {
			this.pointerTarget = $("#current_prime_news_wrapper li");
			var firstDescription = true;
			var liCounter = 0;
			this.pointerTarget.each(function(i, e){
				// mark list items
				$(e).attr('id', 'pn_' + (++liCounter));
				
				//get titles
				primeNews.titles[primeNews.titles.length] = $(e).find('span').text();
				
				// gen descs
				var desc = $('<div id="pn_desc' + (i + 1) + '" />').append($("<p />").text($("p.hidden", e).text()));
				if(!firstDescription) {
					desc.css('right', '-414px');
				} else {
					firstDescription = false;
				}
				primeNews.descsTarget.append(desc);
				primeNews.descs[primeNews.descs.length] = desc;
			});
		};
		
		primeNews._initPointer = function() {
			this.pointer = $('<div class="pointer"><div class="tr"></div></div>');
			this.pointerTarget.first().append(this.pointer).addClass('current');
		};
		
		primeNews._preload = function() {
			// Generate descriptions html
			this._initDescriptions();
			this._initPointer();
			
			// Preload images
			if (arguments.length != 3 ||  typeof arguments[0] != "string" || typeof arguments[1] != "object" || typeof arguments[2] != "function") {
				return false;
			}
			var baseUrl = arguments[0];
			var filenames = arguments[1];
			var callback = arguments[2];
			
			var counter = 0;
			var setFirstZIndex= false;
			var count = filenames.length;
			$.each(filenames, function(i, filename){
				var container = $("<div />").attr("id", "pn_thumb_" + (++counter)).appendTo(primeNews.target);
				if (!setFirstZIndex) {
					container.css('z-index', 3);
					setFirstZIndex = true;
				}
				var image = primeNews.thumbs[primeNews.thumbs.length] = $('<img width="414" height="271" />')/*.attr('alt', primeNews.titles[primeNews.thumbs.length])*/.appendTo(container).load(function(){
					if (!--count) {
						callback();
					}
				}).attr("src", '/' + baseUrl + filename);
			});
		};
		
		primeNews._slideDescription = function(itemNumber, animate) {
			if (typeof animate == 'undefined') {
				animate = true;
			}
			var nextDesc = null;
			var currentDesc = null;
			var complete = function() {
				currentDesc.css('right', '-414px');
				primeNews._current = itemNumber;
				primeNews._isFading = false;
			};
			if (animate) {
				nextDesc = this.descs[itemNumber].animate({right: 0}, {duration: primeNews.params.speed});
				currentDesc = this.descs[this._current].animate({right: '414px'}, {duration: primeNews.params.speed, complete: complete});
			} else {
				nextDesc = this.descs[itemNumber].css('right', 0);
				currentDesc = this.descs[this._current].css('right', '414px');
				complete();
			}
		};
		
		primeNews._slidePointer = function(itemNumber, animate) {
			if (typeof animate == 'undefined') {
				animate = true;
			}
			var complete = function(){
				// replace pointer
				primeNews.pointer.remove();
				primeNews.pointer = $('<div class="pointer"><div class="tr"></div></div>');
				primeNews.pointerTarget.eq(itemNumber).append(primeNews.pointer).addClass('current');
			};
			this.pointerTarget.eq(this._current).removeClass('current');
			// fade out
			if (animate) {
				this.pointer.animate({opacity: 0}, {duration: primeNews.params.speedPointer, complete: complete});
			} else {
				this.pointer.css('opacity', 0);
				complete();
			};
		};
		
		primeNews._fadeTo = function(itemNumber, animate) {
			if (typeof animate == 'undefined') {
				animate = true;
			}
			var currentThumb = null;
			var complete = function() {
				currentThumb.parent().css('z-index', 1);
				currentThumb.css('opacity', 1);
				nextThumb.parent().css('z-index', 3);
			};
			
			this._isFading = true;
			var nextThumb = this.thumbs[itemNumber];
			nextThumb.parent().css('z-index', 2);
			
			if (animate) {
				currentThumb = this.thumbs[this._current].animate({opacity: 0}, {duration: primeNews.params.speed, complete: complete});
			} else {
				currentThumb = this.thumbs[this._current].css('opacity', 0);
				complete();
			}
			this._slidePointer(itemNumber, animate);
			this._slideDescription(itemNumber, animate);
		};
		
		primeNews._rollFrom = function(itemNumber) {
			if (this._rolling || this.thumbs.length == 1) {
				return false;
			}
			var next = itemNumber;
			this._rolling = setInterval(function(){
				primeNews._fadeTo(next);
				next = primeNews.thumbs.length == next + 1 ? 0 : next + 1;
			}, this.params.delay);
		};
		
		primeNews._stopRolling = function() {
			if(this._rolling) {
				clearInterval(this._rolling);
				this._rolling = null;
			}
		};
		
		primeNews._continueRolling = function() {
			var next = primeNews.thumbs.length == primeNews._current + 1 ? 0 : primeNews._current + 1;
			primeNews._rollFrom(next);
		};
		
		primeNews._run = function() {
			if (this.thumbs.length == 1) {
				return false;
			}
			this._rollFrom(1);
		};
		
		primeNews.defaults = {
			delay: 6000,
			speed: 500,
			speedPointer: 250
		};
})(jQuery);
