/**
 * @author sjorek
 */

(function($){

	application.factory.Teaser = function(ctrlId,ctrlOpts){

		var app = function(id,opts){
			this.id=application.control(id,this);
			if (typeof(opts)=='object') {
				this.options = $.extend(1,this.options,opts);
			}
			var obj = this;
			$(document).ready(function(){
				var indicators = obj.options.getAllIndicators(
					obj.options.getContainerItems(( obj.options.autoplay && !obj.options.autoplayonmouseover ) ?
						obj.options.getContainer().mouseover(function(){obj.options.autoplay=false;}).mouseout(function(){obj.options.autoplay=true;})
						: obj.options.getContainer()
					)
				);
				if (obj.options.toggleonmouseover) {
					indicators.mouseover(function(e){
						var li = obj.options.getIndicatorItem($(this));
						if (li.size() && !obj.options.isActiveItem(li)) {
							obj.stopAllMedia();
							obj.options.toogleActiveItem(obj.options.getActiveParent(li),li);
						}
					});
				} else {
					indicators.click(function(e){
						var li = obj.options.getIndicatorItem($(this));
						if (li.size() && !obj.options.isActiveItem(li)) {
							obj.stopAllMedia();
							obj.options.toogleActiveItem(obj.options.getActiveParent(li),li);
							e.preventDefault();
							e.stopPropagation();
							return false;
						}
					});
				}
				obj._startActivity();
			});
			$(application).bind('user.active',function(){obj.onUserActivity()});
			$(application).bind('user.inactive',function(){obj.onUserInactivity()});
		};
		app.prototype.options={
			autoplay: true,
			autoplayonmouseover: false,
			toggleonmouseover: true,
			rotationinterval:6000,
			getContainer: function(){return $('ul.article_tabbed_teaser_list');},
			getContainerItems: function(container){return container.children('li.article_tabbed_teaser_list_item'); },
			getAllIndicators: function(items){ return items.children('h3').children('a.indicator'); },
			getIndicatorItem: function(indicator){return indicator.parent().parent();},
			isActiveItem: function(el){return el.hasClass('article_tabbed_teaser_list_item_active');},
			getActiveItem: function(container){return container.children('li.article_tabbed_teaser_list_item_active');},
			getActiveParent: function(el){return el.parent().children('li.article_tabbed_teaser_list_item_active');},
			toogleActiveItem: function(prev,next){prev.removeClass('article_tabbed_teaser_list_item_active');next.addClass('article_tabbed_teaser_list_item_active');}
		};
		app.prototype._media={};
		app.prototype.media = function(id,obj){
			if (id) {
				if (obj) {
					application.debug('adding media id: ' + id, obj);
					this._media[id]=obj;
					return id;
				}
				return this._media[id];
			}
			return this._media;
		};
		app.prototype.stopAllMedia = function(){
			for (var id in this._media) {
				if (this._media[id] && typeof(this._media[id].stop)=='function') {
					application.debug('attempt to stop media id: ' + id);
					this._media[id].stop();
				} else {
					application.debug('could not stop media id: ' + id);
				}
			}
		}
		app.prototype.onUserActivity = function(){
			this._blocked = true;
		};
		app.prototype.onUserInactivity = function(){
			this._startActivity();
		};
		app.prototype._interval=false;
		app.prototype._blocked=false;
		app.prototype._stopActivity=function(force){
			if ((!this._blocked || force) && this._interval != false) {
				window.clearInterval(this._interval);
				this._interval=false;
			}
			if (force) {
				this._blocked=true;
			}
		};
		app.prototype._startActivity=function(force){
			if ((!this._blocked || force) && this._interval == false) {
				var obj = this;
				this._interval = window.setInterval(function(){
					obj._updateActivity();
				}, this.options.rotationinterval);
			}
			if (force) {
				this._blocked=false;
			}
		};
		app.prototype._updateActivity=function(){
			if (this._blocked) {
				this._blocked = false;
			} else if(this.options.autoplay && this.options.getContainerItems(this.options.getContainer()).size()) {
				for (var id in this._media) {
					if (this._media[id] && typeof(this._media[id].busy)=='function' && this._media[id].busy()) {
						return ;
					}
				}
				var prev = this.options.getActiveItem(this.options.getContainer());
				var next = prev.next();
				if (!next.size()) {
					next = prev.parent().children('li').eq(0);
				}
				this.options.toogleActiveItem(prev,next,false);
			}
		};

		return new app(ctrlId,ctrlOpts);
	};

})(jQuery);

