/**
* Avalon custom jquery plugins
*/
(function($){
	
	/**
	* News highlights
	*/
	var AVHighlight = function(){
		// Default options
		var _defaults = {
			delay : 5,
			autoStart : true,
			catchClick : true,
			catchMouseOver : false,
			contentItems : 'img',
			listItems : 'ul li'
		};
		
		// instance counter
		var _instance_counter = 0,
		// instance data
		_instance_data = new Array;
		
		// External command interface
		var _execute_command = function(){
			if (typeof arguments[0] == 'string'){
				switch (arguments[0]){
					case 'switch':
						var item_id = parseInt(arguments[1]);
						if (isFinite(item_id)){
							_switch_to(this, item_id);
						} else {
							_auto_switch_to_next(this);
						}
						break;
					case 'start':
						var delay = parseInt(arguments[1]);
						_start_auto_switch(this, delay);
						break;
					case 'stop':
						_stop_auto_switch(this);
						break;
					case 'next':
						_auto_switch_to_next(this);
						break;
					case 'prev':
						_auto_switch_to_prev(this);
						break;
				}
			} else {
				_init_object(this, arguments[0]||{});
			}
			return this;
		},
		// Initialize jquery plugin on DOM objects
		_init_object = function($target, options){
			options = $.extend({}, _defaults, options||{});
			
			return $target.each(function(i, item){
				var $_item = $(item);
				var instance_id = _instance_counter;
				if (!$(item).data('av_highlight')){
					$(item).data('instance_id', instance_id);
					$(item).data('av_highlight', true);
					_instance_counter ++;
				} else {
					instance_id = $(item).data('instance_id');
				}
				
				_instance_data[instance_id] = {
					options : options,
					timeout_run : false,
					timeout_ref : null,
					item_id : 0,
					item_count : $(item).find(options.listItems).length
				};
				if (options.catchClick){
					$_item.find(options.listItems).each(function(x, subitem){
						$(subitem).find('a').click(function(e){
							e.preventDefault();
							$_item.av_highlight('stop');
							$_item.av_highlight('switch', x);
							$_item.av_highlight('start', options.delay);
						});
					});
				}
				if (options.catchMouseOver){
					$_item.find(options.listItems).each(function(x, subitem){
						$(subitem).mouseover(function(e){
							$_item.av_highlight('stop');
							$_item.av_highlight('switch', x);
						});
					});
					$_item.find(options.listItems).mouseout(function(e){
						$_item.av_highlight('start', options.delay);
					});
				}
				$_item.find(options.contentItems).hide();
				$_item.find(options.contentItems).eq(0).show();
				$_item.find(options.listItems).removeClass('selected');
				$_item.find(options.listItems).eq(0).addClass('selected');
				if (options.autoStart){
					_start_auto_switch($_item, options.delay);
				}
			});
		},
		// Start auto switching on demand
		_start_auto_switch = function($target, delay){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
				if (isFinite(delay) && delay > 0){
					_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
						$target.av_highlight('next');
					}, (delay * 1000));
					_instance_data[instance_id]['timeout_run'] = true;
				} else {
					_auto_switch_to_next($target);
				}
			}
		},
		// Stop auto switching on demand
		_stop_auto_switch = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
				if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
			}
		},
		// Auto switch to next item
		_auto_switch_to_next = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
      	if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
      	var options = _instance_data[instance_id]['options'];
				var item_id = _instance_data[instance_id]['item_id'];
				item_id ++;
				if (item_id >= _instance_data[instance_id]['item_count']){
					item_id = 0;
				}
				$target.av_highlight('switch', item_id);
				_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
					$target.av_highlight('next');
				}, (options.delay * 1000));
				_instance_data[instance_id]['timeout_run'] = true;
			}
		},
		// Auto switch to previous item
		_auto_switch_to_prev = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
      	if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
      	var options = _instance_data[instance_id]['options'];
				var item_id = _instance_data[instance_id]['item_id'];
				item_id --;
				if (item_id < 0){
					item_id = _instance_data[instance_id]['item_count'] - 1;
				}
				$target.av_highlight('switch', item_id);
				_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
					$target.av_highlight('prev');
				}, (options.delay * 1000));
				_instance_data[instance_id]['timeout_run'] = true;
			}
		},
		// Auto switch to selected item
		_switch_to = function($target, item_id){
			var instance_id = $target.data('instance_id');
      if (typeof _instance_data[instance_id] != 'undefined'){
      	var options = _instance_data[instance_id]['options'];
				if (item_id < 0){
					item_id = 0;
				} else if (item_id >= _instance_data[instance_id]['item_count']){
					item_id = _instance_data[instance_id]['item_count'] - 1;
				}
				_instance_data[instance_id]['item_id'] = item_id;
				$target.find(options.contentItems).hide();
				$target.find(options.contentItems).eq(item_id).show();
				$target.find(options.listItems).removeClass('selected');
				$target.find(options.listItems).eq(item_id).addClass('selected');
			}
		};
		
		// Expose to public
		return {
			exec : _execute_command
		};
	}();
	
	/**
	* Advert switcher
	*/
	var AVAdSwitch = function(){
		// Default options
		var _defaults = {
			delay : 5,
			autoStart : true,
			catchMouseOver : false,
			contentItems : 'img'
		};
		
		// instance counter
		var _instance_counter = 0,
		// instance data
		_instance_data = new Array;
		
		// External command interface
		var _execute_command = function(){
			if (typeof arguments[0] == 'string'){
				switch (arguments[0]){
					case 'switch':
						var item_id = parseInt(arguments[1]);
						if (isFinite(item_id)){
							_switch_to(this, item_id);
						} else {
							_auto_switch_to_next(this);
						}
						break;
					case 'start':
						var delay = parseInt(arguments[1]);
						_start_auto_switch(this, delay);
						break;
					case 'stop':
						_stop_auto_switch(this);
						break;
					case 'next':
						_auto_switch_to_next(this);
						break;
					case 'prev':
						_auto_switch_to_prev(this);
						break;
				}
			} else {
				_init_object(this, arguments[0]||{});
			}
			return this;
		},
		// Initialize jquery plugin on DOM objects
		_init_object = function($target, options){
			options = $.extend({}, _defaults, options||{});
			
			return $target.each(function(i, item){
				var $_item = $(item);
				var instance_id = _instance_counter;
				if (!$(item).data('av_ad_switch')){
					$(item).data('instance_id', instance_id);
					$(item).data('av_ad_switch', true);
					_instance_counter ++;
				} else {
					instance_id = $(item).data('instance_id');
				}
				
				_instance_data[instance_id] = {
					options : options,
					timeout_run : false,
					timeout_ref : null,
					item_id : 0,
					item_count : $(item).find(options.contentItems).length
				};
				if (options.catchMouseOver){
					$_item.find(options.contentItems).mouseover(function(e){
						$_item.av_ad_switch('stop');
					});
					$_item.find(options.contentItems).mouseout(function(e){
						$_item.av_ad_switch('start', options.delay);
					});
				}
				$_item.find(options.contentItems).hide();
				$_item.find(options.contentItems).eq(0).show();
				if (options.autoStart){
					_start_auto_switch($_item, options.delay);
				}
			});
		},
		// Start auto switching on demand
		_start_auto_switch = function($target, delay){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
				if (isFinite(delay) && delay > 0){
					_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
						$target.av_ad_switch('next');
					}, (delay * 1000));
					_instance_data[instance_id]['timeout_run'] = true;
				} else {
					_auto_switch_to_next($target);
				}
			}
		},
		// Stop auto switching on demand
		_stop_auto_switch = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
				if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
			}
		},
		// Auto switch to next item
		_auto_switch_to_next = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
      	if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
      	var options = _instance_data[instance_id]['options'];
				var item_id = _instance_data[instance_id]['item_id'];
				item_id ++;
				if (item_id >= _instance_data[instance_id]['item_count']){
					item_id = 0;
				}
				$target.av_ad_switch('switch', item_id);
				_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
					$target.av_ad_switch('next');
				}, (options.delay * 1000));
				_instance_data[instance_id]['timeout_run'] = true;
			}
		},
		// Auto switch to previous item
		_auto_switch_to_prev = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
      	if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
      	var options = _instance_data[instance_id]['options'];
				var item_id = _instance_data[instance_id]['item_id'];
				item_id --;
				if (item_id < 0){
					item_id = _instance_data[instance_id]['item_count'] - 1;
				}
				$target.av_ad_switch('switch', item_id);
				_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
					$target.av_ad_switch('prev');
				}, (options.delay * 1000));
				_instance_data[instance_id]['timeout_run'] = true;
			}
		},
		// Auto switch to selected item
		_switch_to = function($target, item_id){
			var instance_id = $target.data('instance_id');
      if (typeof _instance_data[instance_id] != 'undefined'){
      	var options = _instance_data[instance_id]['options'];
				if (item_id < 0){
					item_id = 0;
				} else if (item_id >= _instance_data[instance_id]['item_count']){
					item_id = _instance_data[instance_id]['item_count'] - 1;
				}
				_instance_data[instance_id]['item_id'] = item_id;
				$target.find(options.contentItems).hide();
				$target.find(options.contentItems).eq(item_id).show();
			}
		};
		
		// Expose to public
		return {
			exec : _execute_command
		};
	}();
	
	/**
	* Moto text fader
	*/
	var AVMotoFade = function(){
		// Default options
		var _defaults = {
			delay : 5,
			fadeTime : 0.5,
			autoStart : true,
			contentItems : 'p'
		};
		
		// instance counter
		var _instance_counter = 0,
		// instance data
		_instance_data = new Array;
		
		// External command interface
		var _execute_command = function(){
			if (typeof arguments[0] == 'string'){
				switch (arguments[0]){
					case 'switch':
						var item_id = parseInt(arguments[1]);
						if (isFinite(item_id)){
							_switch_to(this, item_id);
						} else {
							_auto_switch_to_next(this);
						}
						break;
					case 'start':
						var delay = parseInt(arguments[1]);
						_start_auto_switch(this, delay);
						break;
					case 'stop':
						_stop_auto_switch(this);
						break;
					case 'next':
						_auto_switch_to_next(this);
						break;
					case 'prev':
						_auto_switch_to_prev(this);
						break;
				}
			} else {
				_init_object(this, arguments[0]||{});
			}
			return this;
		},
		// Initialize jquery plugin on DOM objects
		_init_object = function($target, options){
			options = $.extend({}, _defaults, options||{});
			
			return $target.each(function(i, item){
				var $_item = $(item);
				var instance_id = _instance_counter;
				if (!$(item).data('av_ad_switch')){
					$(item).data('instance_id', instance_id);
					$(item).data('av_ad_switch', true);
					_instance_counter ++;
				} else {
					instance_id = $(item).data('instance_id');
				}
				
				_instance_data[instance_id] = {
					options : options,
					timeout_run : false,
					timeout_ref : null,
					item_id : 0,
					item_count : $(item).find(options.contentItems).length
				};
				$_item.find(options.contentItems).hide();
				$_item.find(options.contentItems).eq(0).fadeIn((options.fadeTime * 1000));
				if (options.autoStart){
					_start_auto_switch($_item, options.delay);
				}
			});
		},
		// Start auto switching on demand
		_start_auto_switch = function($target, delay){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
				if (isFinite(delay) && delay > 0){
					_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
						$target.av_moto('next');
					}, (delay * 1000));
					_instance_data[instance_id]['timeout_run'] = true;
				} else {
					_auto_switch_to_next($target);
				}
			}
		},
		// Stop auto switching on demand
		_stop_auto_switch = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
				if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
			}
		},
		// Auto switch to next item
		_auto_switch_to_next = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
      	if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
      	var options = _instance_data[instance_id]['options'];
				var item_id = _instance_data[instance_id]['item_id'];
				item_id ++;
				if (item_id >= _instance_data[instance_id]['item_count']){
					item_id = 0;
				}
				$target.av_moto('switch', item_id);
				_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
					$target.av_moto('next');
				}, (options.delay * 1000));
				_instance_data[instance_id]['timeout_run'] = true;
			}
		},
		// Auto switch to previous item
		_auto_switch_to_prev = function($target){
			var instance_id = $target.data('instance_id');
			if (typeof _instance_data[instance_id] != 'undefined'){
      	if (_instance_data[instance_id]['timeout_run']){
      		clearTimeout(_instance_data[instance_id]['timeout_ref']);
      		_instance_data[instance_id]['timeout_ref'] = null;
      		_instance_data[instance_id]['timeout_run'] = false;
				}
      	var options = _instance_data[instance_id]['options'];
				var item_id = _instance_data[instance_id]['item_id'];
				item_id --;
				if (item_id < 0){
					item_id = _instance_data[instance_id]['item_count'] - 1;
				}
				$target.av_moto('switch', item_id);
				_instance_data[instance_id]['timeout_ref'] = setTimeout(function(){
					$target.av_moto('prev');
				}, (options.delay * 1000));
				_instance_data[instance_id]['timeout_run'] = true;
			}
		},
		// Auto switch to selected item
		_switch_to = function($target, item_id){
			var instance_id = $target.data('instance_id');
      if (typeof _instance_data[instance_id] != 'undefined'){
      	var options = _instance_data[instance_id]['options'];
      	if (item_id < 0){
					item_id = 0;
				} else if (item_id >= _instance_data[instance_id]['item_count']){
					item_id = _instance_data[instance_id]['item_count'] - 1;
				}
      	var prev_item_id = _instance_data[instance_id]['item_id'];
      	if (prev_item_id >= 0 && prev_item_id < _instance_data[instance_id]['item_count']){
					$target.find(options.contentItems).eq(prev_item_id).fadeOut((options.fadeTime * 1000), function(){
						$target.find(options.contentItems).eq(item_id).fadeIn((options.fadeTime * 1000));
					});
				} else {
					$target.find(options.contentItems).eq(item_id).fadeIn((options.fadeTime * 1000));
				}
				_instance_data[instance_id]['item_id'] = item_id;
			}
		};
		
		// Expose to public
		return {
			exec : _execute_command
		};
	}();
	
	$.fn.extend({
		av_highlight : AVHighlight.exec,
		av_ad_switch : AVAdSwitch.exec,
		av_moto : AVMotoFade.exec
	});
})(jQuery);
