/**
 * PROMO IMAGES
 * 
 * Main functionality of the Gutensite Promo Images
 * 
 * @author		Brett Fowle
 * @link		http://gutensite.com
 * @email		brett@gutensite.com
 * 
 * @file		promo_images.js
 * @version		1.0
 * @date		06/15/2010
 * 
 * Copyright (c) 2011 GutenSite
 *
 */
var PromoImages = new Class({

	Implements: [Options],

	el:		null,
	
	options: {
		id:				'',
		transition:		1,
		speed:			4,
		duration:		800,
		title_text:		'',
		link_text:		'',
		type:			'image',
		scaling:		0,
		tracker:		0,
		tracker_template:		null,
		tracker_digits:		1,
		item_count: 	0,
		item_titles:	[],
		item_title:		1,
		item_links:	[],
		item_targets:	[],
		item_link:		1,
		//
		max_width:	0,
		max_height:	0,
		horizontal_max_width: 0,
		horizontal_max_height:	0,
		horizontal_max_height_ratio: 0,
		item_width:		0,
		item_height:	0,
		use_set_size:	0,
		use_container_size: 0,
		//
		thumbs:			0,
		thumb_animate:	false,
		//
		pause:			null,
		pause_status: 	0,
		item:			null,
		old_item:		0,
		cur_item:		0,
		width:			0,
		height:			0,
		top:			'',
		left:			0,
		count:			null,
		ids:			[],
		timer:			null,
		timer_cnt:		null,
		static:		0
	},
	
	/**
	 * INITIALIZE
	 * 
	 * Initialize the entire class at load
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	initialize: function(options) {
		this.setOptions(options);
		
		this.el = $(this.options.id);
		
		if(this.el) {
			this.options.item_count = $$('.rotator_item').length;
			if(this.options.item_count > 0 && this.options.cur_item > this.options.item_count) {
				this.options.cur_item = 0;
			}
		}
		
		if(this.options.title_text) {
			$$('#' + this.options.id + '_item_title_1').setStyle('opacity', 0);
			$$('#' + this.options.id + '_item_title_2').setStyle('opacity', 0);
			$$('#' + this.options.id + '_item_title_1').setStyle('position', 'absolute');
			$$('#' + this.options.id + '_item_title_2').setStyle('position', 'absolute');
			this.update_title(this.options.cur_item);
		}
		
		
		if (this.el) {
			// If the width is not set, use container
			if(this.options.use_container_size == 1 || this.options.scaling == 3) {
				this.options.use_container_size = 1;
				this.options.scaling = 3;
				this.options.item_width = parseInt(this.el.getStyle('width'));
				if(this.options.horizontal_max_height_ratio > 0 
				&& this.options.horizontal_max_height > 0) {
					var max_height = this.options.item_width * this.options.horizontal_max_height_ratio;
					if(max_height < this.options.horizontal_max_height) {
						this.options.horizontal_max_height = max_height;
					}
				}
			}
			this.setup_transition();
			this.setup_tracking();
			this.setup_thumbs();
			//this.swap_image(0); // We dont' need to do this here, since we do it in timer_begin() which we call from finalize_transition(). In fact, this appears to break the rotator 1 out of 100 times for some odd reason.
		}
	},
	

	/**
	 * SETUP TRANSITION
	 * 
	 * Set up the transition options
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	setup_transition: function() {
		this.options.pause = false;
		this.options.item = 0;
		this.options.width = this.options.item_width;
		this.options.height = this.options.item_height;
		this.options.count = 0;
		this.options.ids = new Array();
		this.options.timer_cnt = parseInt(this.el.get('class').split('-')[1])*1000;
		
		switch (this.options.transition) {
			/*
			TRANSITION TYPE: 0 NONE
			*/
			case 0:
				break;
	
			/*
			TRANSITION TYPE: 1 FADE
			*/
			case 1:
				this.reset_items(false);
				
				switch (this.options.scaling) {
					/**
					 * SCALING: 0 STRETCH
					 */
					case 0:
						this.el.getElements('.rotator_item').each(function(el) {
							this.options.ids.push(el);
							$(el).setStyles({
								'top': 0,
								'left': 0,
								'opacity':	0,
								'width': 	this.options.width,
								'height':	this.options.height
							});
							this.options.count--;
						}.bind(this));
						
						break;
						
					/**
					 * SCALING: 1 - PROPORTIONAL FIT (LETTERBOX)
					 */
					case 1:
						this.el.getElements('.rotator_item').each(function(el) {
							$(el).setStyle('opacity', 0);
							
							var rotator_ratio = this.options.width / this.options.height;
							var image_size = $(el).measure(function() {
								image_size = this.getSize();
								return image_size;
							});
							var image_ratio = parseInt(image_size.x) / parseInt(image_size.y);
							
							if (image_ratio > rotator_ratio) {
								var new_dim = this.options.width / image_ratio;
								$(el).setStyles({
									'width':	this.options.width,
									'height':	new_dim,
									'top':		(this.options.height - new_dim) / 2
								});
							} else {
								var new_dim = this.options.height * image_ratio;
								$(el).setStyles({
									'width':	new_dim,
									'height':	this.options.height,
									'left':		(this.options.width - new_dim) / 2
								});
							}
							
							this.options.ids.push(el);
							this.options.count--;
						}.bind(this));
						
						break;
						
					/**
					 * SCALING: 2 - PROPORTIONAL FILL (CROP)
					 */
					case 2:
						this.el.getElements('.rotator_item').each(function(el) {
							$(el).set('opacity', 0);
							
							var rotator_ratio = this.options.width / this.options.height;
							var image_size = $(el).measure(function() {
								image_size = this.getSize();
								return image_size;
							});
							var image_ratio = parseInt(image_size.x) / parseInt(image_size.y);
							if (image_ratio < rotator_ratio) {
								var new_dim = this.options.width / image_ratio;
								$(el).setStyles({
									'width':	this.options.width,
									'height':	new_dim,
									'top':		(this.options.height - new_dim) / 2
								});
							} else {
								var new_dim = this.options.height * image_ratio;
								$(el).setStyles({
									'width':	new_dim,
									'height':	this.options.height,
									'left':		(this.options.width - new_dim) / 2
								});
							}
							
							this.options.ids.push(el);
							this.options.count--;
							
						}.bind(this));
						break;
					
					/**
					 * SCALING: 3 - MAX WIDTH (scale to container width and reset height to height of image)
					 for vertical images, set height to be height of tallest horizontal image
					 */
					case 3:
						var max_height = 0;
						this.el.getElements('.rotator_item').each(function(el) {
							
							var image_size = $(el).measure(function() {
								image_size = this.getSize();
								return image_size;
							});
							
							var image_height_ratio = parseInt(image_size.y) / parseInt(image_size.x);
							// horizontal images will be < 1
							if(image_height_ratio < 1) {
								var new_width = parseInt(this.options.width);
								var new_height = parseInt(this.options.width * image_height_ratio);
							} else if(this.options.horizontal_max_height > 0) {
								var image_width_ratio = parseInt(image_size.y) / parseInt(image_size.x);
								var new_height = parseInt(this.options.horizontal_max_height);
								var new_width = parseInt(new_height / image_width_ratio);
							}
							
							if(new_width > image_size.x) {
								new_width = image_size.x;
								new_height = image_size.y;
							}
							var top = 0;
							if(this.options.horizontal_max_height > 0) {
								top = (this.options.horizontal_max_height - new_height) / 2;
							}
							if(top < 0) {
								top = 0;
							}
							if(new_height > max_height) {
								max_height = new_height;
							}
							$(el).set('opacity', 0);
							$(el).setStyles({
								'width': new_width,
								'height': new_height,
								'left':		(this.options.width - new_width) / 2,
								'top': 	top
							});
							
							this.options.ids.push(el);
							this.options.count--;
						}.bind(this));
						
						if(this.options.item_height == 0 && max_height > 0) {
							this.options.item_height = max_height;
							this.options.height = this.options.item_height;
							$(this.options.id).setStyles({'height': this.options.height});
						}
						
						break;

				}
				
				this.finalize_transition();
				
				break;
			
			/*
			TRANSITION TYPE: 2 SCROLL UP
			*/
			case 2:
				this.reset_items(true);
				
				this.el.getElements('.rotator_item').each(function(el) {
					$(el).setStyles({
						'position':	'absolute',
						'display': 'block'
					});
					var coords = $(el).getPosition($(el).getParent());
					if (this.options.use_set_size == 0 && parseInt($(el).getStyle('width')) > this.options.width) {
						this.options.width = parseInt($(el).getStyle('width'));
					}
					if (this.options.use_set_size == 0 && parseInt($(el).getStyle('height')) > this.options.height) {
						this.options.height = parseInt($(el).getStyle('height'));
					}
					if (coords.y < this.options.top || this.options.top === '') {
						this.options.top = coords.y;
					}
				}.bind(this));
				
				this.el.getElements('.rotator_item').each(function(el, count) {
					this.options.ids.push(el);
					$(el).setStyles({
						'width':	this.options.width,
						'height':	this.options.height,
						'left':		this.options.left,
						'top':		(count == 0 ? this.options.top : this.options.top + this.options.height),
						'opacity': 1
					});
					this.options.count--;
				}.bind(this));
				
				this.finalize_transition();

				break;
		
			/*
			TRANSITION TYPE: 3 SCROLL DOWN
			*/
			case 3:
				this.reset_items(true);
				
				this.el.getElements('.rotator_item').each(function(el, count) {
					this.options.ids.push(el);
					$(el).setStyles({
						'width':	this.options.width,
						'height':	this.options.height,
						'left':		this.options.left,
						'top':		(count == 0 ? this.options.top : this.options.top - this.options.height),
						'opacity': 1
					});
					this.options.count--;
				}.bind(this));
				
				this.finalize_transition();

				break;
	
			/*
			TRANSITION TYPE: 4 SCROLL LEFT
			*/
			case 4:
				this.reset_items(true);
				
				this.el.getElements('.rotator_item').each(function(el, count) {
					this.options.ids.push(el);

					$(el).setStyles({
						'width':	this.options.width,
						'height':	this.options.height,
						'left':		(count == 0 ? this.options.left : this.options.left + this.options.width),
						'top':		this.options.top,
						'opacity': 1
					});
					this.options.count--;
				}.bind(this));
				
				this.finalize_transition();

				break;
	
			/*
			TRANSITION TYPE: 5 SCROLL RIGHT
			*/
			case 5:
				this.reset_items(true);
				
				this.el.getElements('.rotator_item').each(function(el, count) {
					this.options.ids.push(el);
					
					$(el).setStyles({
						'width':	this.options.width,
						'height':	this.options.height,
						'left':		(count == 0 ? this.options.left : this.options.left - this.options.width),
						'top':		this.options.top,
						'opacity': 1
					});
					this.options.count--;
				}.bind(this));
				
				this.finalize_transition();

				break;
		}

	},
	

	/**
	 * SETUP TRACKING
	 * 
	 * Set up the tracking options
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	setup_tracking: function() {
		switch (this.options.tracker) {
			case '4':
			case '6':
			case "custom text with controls":
				if ($(this.options.id + '_position')) {
					$(this.options.id + '_position').addEvents({
						/**
						 * mouseleave
						 */
						'mouseleave': function(e) {
							e.stop();
							this.pause('start', null);
						}.bind(this)
					});
				}
				
				for (var i = 0; i < this.options.ids.length; i++) {
					if ($(this.options.id + '_position_' + i)) {
						$(this.options.id + '_position_' + i).addEvents({
							/**
							 * click
							 */
							'click': function(e) {
								e.stop();
								
								var j = parseInt(e.target.id.replace(this.options.id + '_position_', ''));
								if (this.options.cur_item == j) return false;
								
								this.options.old_item = this.options.cur_item;
								this.options.cur_item = j;
								this.change_image();
								this.pause('stop', e);
							}.bind(this)
						});
					}
				}

				break;

			default:
				break;
		}
	},
	
	
	/**
	 * PLAY/PAUSE BUTTONS
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	setup_play_pause: function() {
		if(!$(this.options.id + '_play_pause_button')) {
			return false;
		}
		$(this.options.id + '_play_pause_button').addEvents({
			'click': function(e) {
				var action = $(this.options.id + '_play_pause_button').get('data-action');
				if(action == 'play') {
					e.stop();
					this.pause('start', null);
					this.options.pause_status = 0;
					$(this.options.id + '_play_pause_button').set('data-action', 'pause');
					$(this.options.id + '_play_pause_button').addClass('pause');
					$(this.options.id + '_play_pause_button').removeClass('play');
					if (this.options.thumb_animate) return false;
	
					if (this.options.cur_item < this.options.ids.length-1) {
						this.options.old_item = this.options.cur_item;
						this.options.cur_item = (this.options.cur_item + 1);
						this.change_image();
					}
				} else {
					e.stop();
					this.pause('stop', null);
					this.options.pause_status = 1;
					$(this.options.id + '_play_pause_button').set('data-action', 'play');
					$(this.options.id + '_play_pause_button').addClass('play');
					$(this.options.id + '_play_pause_button').removeClass('pause');
				}
			}.bind(this)
		});
	},

	/**
	 * HOVER PAUSE
	 * 
	 * Set up pause-on-hover
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	setup_hover_pause: function() {
		$(this.options.id).addEvents({
			/**
			 * mouseleave
			 */
			'mouseenter': function(e) {
				e.stop();
				this.pause('stop', null);
			}.bind(this)
		});
		
		$(this.options.id).addEvents({
			/**
			 * mouseleave
			 */
			'mouseleave': function(e) {
				e.stop();
				this.pause('start', null);
			}.bind(this)
		});
	},
	
	
	

	/**
	 * UPDATE TRACKER
	 * 
	 * Updates the tracker
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	update_tracker: function(cur) {
		switch (this.options.tracker) {
			case '0':
				break;

			case '1':
			case '2':
				setTimeout(function() {
					if ($(this.options.id + '_position')) {
						$(this.options.id + '_position').set('text', (this.options.cur_item + 1) + '/' + this.options.ids.length);
					}
				}.bind(this), parseInt(this.options.duration / 2));
				break;

			case '3':
			case '4':
			case '5':
			case '6':
					$$('*[id^=' + this.options.id + '_position_]').removeClass('content_rotator_position_handle_active');
					setTimeout(function() {
						$(this.options.id + '_position_' + this.options.cur_item).addClass('content_rotator_position_handle_active');
					}.bind(this), parseInt(this.options.duration / 2));
				break;

			case "custom text":
			case "custom text with controls":
				setTimeout(function() {
					if ($(this.options.id + '_position')) {
						var trackerCurrent = this.options.cur_item + 1;
						var trackerTotal = this.options.ids.length;
						
						if ((""+trackerCurrent).length < this.options.tracker_digits) {
							trackerCurrent = "" + Array((parseInt(this.options.tracker_digits)+1) - (""+trackerCurrent).length).join("0") + trackerCurrent;
						}
						
						if ((""+trackerTotal).length < this.options.tracker_digits) {
							trackerTotal = "" + Array((parseInt(this.options.tracker_digits)+1) - (""+trackerTotal).length).join("0") + trackerTotal;
						}
						
						var trackerHTML = this.options.tracker_template.replace('{current}', trackerCurrent).replace('{total}', trackerTotal);
						
						$(this.options.id + '_position').set('html', trackerHTML);
					}
				}.bind(this), parseInt(this.options.duration / 2));
				break;
		}
	},
	
	
	/**
	 * SETUP THUMBS
	 * 
	 * Set up the thumbs options
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	setup_thumbs: function() {
		if (!this.options.thumbs) return false;

		$(this.options.id + '_thumb_list').setStyles({
			'position':	'absolute',
			'display':	'block',
			'left':		0
		});
	
		for (var i = 0; i < this.options.ids.length; i++) {
			if ($(this.options.id + '_thumb_' + i)) {
				$(this.options.id + '_thumb_' + i).addEvents({
					/**
					 * click
					 */
					'click': function(e) {
						e.stop();

						var j = parseInt(e.target.getParent().id.replace(this.options.id + '_thumb_', ''));
						if (this.options.cur_item == j) return false;
						
						this.options.old_item = this.options.cur_item;
						this.options.cur_item = j;
						this.change_image();
					}.bind(this)
				});
			}
		}

		$(this.options.id + '_thumb-prev').addEvents({
			/** 
			 * click
			 */
			'click': function() {
				if (this.options.thumb_animate) return false;
				
				if (this.options.cur_item > 0) {
					this.options.old_item = this.options.cur_item;
					this.options.cur_item = (this.options.cur_item - 1);
					this.change_image();
				}
			}.bind(this)
		});

		$(this.options.id + '_thumb-next').addEvents({
			/** 
			 * click
			 */
			'click': function() {
				if (this.options.thumb_animate) return false;

				if (this.options.cur_item < this.options.ids.length-1) {
					this.options.old_item = this.options.cur_item;
					this.options.cur_item = (this.options.cur_item + 1);
					this.change_image();
				}
			}.bind(this)
		});
	},

	
	/**
	 * UPDATE THUMB
	 * 
	 * Updates the thumbs
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	update_thumbs: function(cur) {
		if (!this.options.thumbs) return false;
		
		var tween = new Fx.Tween($(this.options.id + '_thumb_list'), {duration: this.options.duration});

		for (var i = 0; i < this.options.ids.length; i++) {
			$$('*[id^=' + this.options.id + '_thumb_]').removeClass('content_rotator_thumb_handle_active');
			
			$(this.options.id + '_thumb_' + cur).setStyle('display', '');

			if ($(this.options.id + '_thumb_' + i)) {
				if (i == cur) {
					setTimeout(function() {
						$(this.options.id + '_thumb_' + cur).addClass('content_rotator_thumb_handle_active');
						this.options.thumb_animate = false;
					}.bind(this), parseInt(this.options.duration / 2));
					
					var dim = $(this.options.id + '_thumb_' + cur).getCoordinates($(this.options.id + '_thumb_' + cur).getParent());
					var dim_abs = $(this.options.id + '_thumb_' + cur).getCoordinates($(this.options.id + '_thumb_' + cur).getParent().getParent());
					var coords = $(this.options.id + '_thumb_' + cur).getElement('img').getCoordinates($(this.options.id + '_thumb_' + cur).getParent());
					var list_coords = $(this.options.id + '_thumbs').getCoordinates($(this.options.id + '_thumbs').getParent());
					
					var l_offset = Math.abs(parseInt($(this.options.id + '_thumb_list').getStyle('left')));
					
					if (coords.left >= (list_coords.right + l_offset)) {
						tween.start('left', -((coords.left - list_coords.right) + dim.width) + 'px');
					} else if (coords.right <= (list_coords.left + l_offset)) {
						tween.start('left', -(l_offset - Math.abs(dim_abs.left)) + 'px');
					}
				}
			}
		}
	},
	
	
	/**
	 * SETUP BUTTON EVENTS
	 * 
	 * Set up button events
	 *
	 * @params		mode: 'start', 'stop', or 'auto'
	 *        		e: event or null
	 *
	 * @returns		null
	 */
	pause: function(mode, e) {
		//console.log('pause: '+mode);
		var do_action = true;
		
		if (mode == 'stop') {
			if (this.options.pause) {
				do_action = false;
			} else {
				this.options.pause = true;
			}
		} else if (mode == 'start') {			
			if (!this.options.pause || this.options.pause_status == 0) {
				do_action = false;
			} else {
				this.options.pause = false;
			}
		} else {
			this.options.pause = !this.options.pause;
		}
		
		if (do_action) {
			if (!this.options.pause) {
				this.timer_begin(this.options.cur_item);
				if (typeOf(e) == 'event') {
					e.target.removeClass('active');
				}
			} else {
				if (typeOf(e) == 'event') {
					e.target.addClass('active');
				}
				clearTimeout(this.options.timer);
				clearInterval(this.options.timer);
			}
		}
	},
	
	/**
	 * SETUP BUTTON EVENTS
	 * 
	 * Set up button events
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	setup_button_events: function() {
		if ($(this.options.id + '_pause')) {
			$(this.options.id + '_pause').addEvents({
				/**
				 * click
				 */
				'click': function(e) {
					e.stop();
					this.pause('auto', e);
				}.bind(this)
			});
		}
		if ($(this.options.id + '_prev')) {
			$(this.options.id + '_prev').addEvents({
				/**
				 * click
				 */
				'click': function(e) {
					e.stop();
					this.options.old_item = this.options.cur_item;
					if ((this.options.cur_item - 1) < 0 ? this.options.cur_item = (this.options.ids.length - 1) : this.options.cur_item--);
					this.change_image();
				}.bind(this)
			});
		}
		if ($(this.options.id + '_next')) {
			$(this.options.id + '_next').addEvents({
				/**
				 * click
				 */
				'click': function(e) {
					e.stop();
					this.options.old_item = this.options.cur_item;
					if ((this.options.cur_item + 1) == this.options.ids.length ? this.options.cur_item = 0 : this.options.cur_item++);
					this.change_image();
				}.bind(this)
			});
		}
	},


	/**
	 * SWAP IMAGE
	 * 
	 * Swap the image with a new one
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	swap_image: function(i, j) {
		if (!this.options.ids[i] || !this.options.ids[j]) {
			return false;
		}
		
		var tween = new Fx.Tween(this.options.ids[i], {duration: this.options.duration});
		var tween2 = new Fx.Tween(this.options.ids[j], {duration: this.options.duration});

		switch (this.options.transition) {
			case 1:
				tween2.start('opacity', 1);
				tween.start('opacity', 0);
				break;

			case 2:
				this.options.ids[i].setStyles({
					'left':	this.options.left,
					'top':	this.options.top
				});
				this.options.ids[j].setStyles({
					'left':	this.options.left,
					'top':	this.options.top + this.options.height
				});
				
				tween2.start('top', this.options.top);
				tween.start('top', this.options.top - this.options.height);
				break;
			
			case 3:
				this.options.ids[i].setStyles({
					'left':	this.options.left,
					'top':	this.options.top
				});
				this.options.ids[j].setStyles({
					'left':	this.options.left,
					'top':	this.options.top - this.options.height
				});

				tween2.start('top', this.options.top);
				tween.start('top', this.options.top + this.options.height);
				break;
			
			case 4:
				this.options.ids[i].setStyles({
					'left':	this.options.left,
					'top':	this.options.top
				});
				this.options.ids[j].setStyles({
					'left':	this.options.left + this.options.width,
					'top':	this.options.top
				});

				tween2.start('left', this.options.left);
				tween.start('left', this.options.left - this.options.width);
				break;
			
			case 5:
				this.options.ids[i].setStyles({
					'left':	this.options.left,
					'top':	this.options.top
				});
				this.options.ids[j].setStyles({
					'left':	this.options.left - this.options.width,
					'top':	this.options.top
				});

				tween2.start('left', this.options.left);
				tween.start('left', this.options.left + this.options.width);
				break;
		}

		this.update_tracker(j);
		this.update_thumbs(j);
		this.update_title(j);
		this.update_link(j);
	},
	

	/**
	 * CHANGE IMAGE
	 * 
	 * Change the image, reset timer
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	change_image: function() {
		if (this.options.thumbs) {
			this.options.thumb_animate = true;
		}

		this.swap_image(this.options.old_item, this.options.cur_item);
		if (!this.options.pause) {
			clearTimeout(this.options.timer);
			clearInterval(this.options.timer);
			this.timer_begin(this.options.cur_item);
		}
	},


	/**
	 * TIMER BEGIN
	 * 
	 * Begin the timer
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	timer_begin: function(cur, timeout) {
		this.options.pause = false;
		if (this.options.static) {
			//this.update_tracker();
		} else {
			this.options.cur_item = cur;
			this.options.timer = (function() {
				this.options.old_item = this.options.cur_item;
				if ((this.options.cur_item + 1) >= this.options.ids.length ? this.options.cur_item = 0 : this.options.cur_item++);
				this.swap_image(this.options.old_item, this.options.cur_item);
			}.bind(this)).periodical(this.options.timer_cnt);
		}
	},


	/**
	 * UPDATE TITLE
	 * 
	 * Update the specified title
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	update_title: function(id) {
		if (!this.options.title_text) return false;
	
		var el = $(this.options.id + '_item_title_' + this.options.item_title);
		if(el) {
			el.set('html', this.options.item_titles[id]);
		
			var tween = new Fx.Tween(el, {duration: this.options.transition});
			el.fade('in');
			this.options.item_title = (this.options.item_title === 1 ? 2 : 1);
			// DO NOT remove this line!! We need to switch to the currently displayed title before we tell it to fade OUT!!
		}
		var el = $(this.options.id + '_item_title_' + this.options.item_title);
		if(el) {
			var tween2 = new Fx.Tween(el, {duration: this.options.transition});
			el.fade('out');
		}
		
		//tween.start('opacity', 1);
		//tween2.start('opacity', 0);
	},


	/**
	 * UPDATE LINK
	 * 
	 * Update the specified link
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	update_link: function(id) {
		if (!this.options.link_text) return false;
	
		var el = $(this.options.id + '_link_text');
		el.set('href', this.options.item_links[id]);
		el.set('target', this.options.item_targets[id]);
		
	},


	/**
	 * RESET ITEMS
	 * 
	 * Reset the item styles
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	reset_items: function(flag) {
		this.el.getElements('.rotator_item').each(function(el) {
			$(el).setStyles({
				'display':	'block',
				'position':	'absolute',
				'top':		0,
				'left': 0
			});

			var coords = $(el).getPosition($(el).getParent());
			if (this.options.use_container_size == 1) {
				this.options.width = this.options.item_width;
			} else if (this.options.use_set_size == 0 && parseInt($(el).getStyle('width')) > this.options.width) {
				this.options.width = parseInt($(el).getStyle('width'));
			}
			if (this.options.use_set_size == 0 && parseInt($(el).getStyle('height')) > this.options.height) {
				this.options.height = parseInt($(el).getStyle('height'));
			}

			if (flag) {
				if (coords.y < this.options.top || this.options.top === '') {
					this.options.top = coords.y;
				}
			}

		}.bind(this));
	},
	

	/**
	 * FINALIZE TRANSITION
	 * 
	 * Finalize the transitions
	 *
	 * @params		null
	 *
	 * @returns		null
	 */
	finalize_transition: function() {
		this.update_tracker(this.options.cur_item);
		
		this.el.setStyles({
			'width':	this.options.width,
			'height':	this.options.height
		});

		this.options.ids[this.options.cur_item].setStyle('opacity', 1);
		
		this.setup_button_events();
		this.setup_hover_pause();
		this.setup_play_pause();

		this.timer_begin(this.options.cur_item);
	}

});
