///
/// For documentation, visit: http://development.morristechnology.com/wiki/universal_js/universal_rotator
///

function MediaItem(id, type, url, cutline, author, author2, misc) {
	this.id = id;
	this.type = type;
	this.url = url;
	if (cutline) this.cutline = cutline;
	if (author) this.author = author;
	if (author2) this.author2 = author2;
	this.thumbnail = null;	// assigned in assignThumbnails via init()

	if (misc)
		this.misc = misc;
	
	this.hasMiscAtr = function (x) {
		if (this.misc != null) {
			var test = this.misc[x];
			if (test==null)
				return false;
			else
				return true;
		}	
		else
			return false;
	};
}

SLIDE_OVERLAY 		= 1;
ACTION_NORMAL 		= 1;
ACTION_CENTERED 	= 3;
ACTION_SHIFT 		= 5;
ACTION_SHIFTPAGE 	= 7; 
ACTION_SHOWALL 		= 11;
	
function MediaRotator (v) {
	this.var_name = v;
	
	this.TYPE_IMG = 'Image';
	this.TYPE_VID = 'Video';
	this.TYPE_SWF = 'Flash';
	this.TYPE_AUD = 'Audio';
	this.TYPE_DOC = 'Doc';
	
	this.DOC_HELP_TEXT = 'Click this link instead to view the document in a new browser window.  This is especially useful when viewing PDFs.';
	
	this.fade_effect = false;
	
	this.customIMGHandler = null;
	this.customVIDHandler = null;
	this.customSWFHandler = null;
	this.customAUDHandler = null;
	this.customDOCHandler = null;
	
	this.tmb_action 	= ACTION_NORMAL;
	this.current 		= 0;
	this.leftmost 		= 0;
	this.num_visible 	= 4;
	
	this.item_list = null;
	
	this.img_url 		= '';
	this.prev_img 		= 'prev.jpg';
	this.next_img 		= 'next.jpg';
	this.current_img	= null;
	this.c_class 		= 'current';
	this.thumbnail_link = null;
	
	this.img_cont = null;
	this.cut_cont = null;
	this.tmb_cont = null;
	this.ssh_cont = null;
	
	this.slideshow = null;
	this.slideshow_time = 3000;
	this.slideshow_auto = false;
	this.slideshow_play = 'play.gif';
	this.slideshow_pause = 'pause.gif';
	
	this.assignThumbnails = function () {
		for (var i=0; i<this.item_list.length; i++) {
			if (this.item_list[i].type == this.TYPE_IMG) {
				if (this.item_list[i].hasMiscAtr('thumbnail'))
					this.item_list[i].thumbnail = this.item_list[i].misc.thumbnail;
				else
					this.item_list[i].thumbnail = this.item_list[i].url;
			}	
			else {
				if (this.item_list[i].hasMiscAtr('thumbnail'))
					this.item_list[i].thumbnail = this.item_list[i].misc.thumbnail;
				else
					this.item_list[i].thumbnail = this.img_url + 'video_icon.jpg';
			}
		}
	};
	
	this.init = function (data, img_url, options) {
		this.item_list = data;
		this.img_url = img_url;
		if (options) {
			// containers
			if (options.image_container) 		this.img_cont = options.image_container;
			if (options.cutline_container) 		this.cut_cont = options.cutline_container;
			if (options.thumbnails_container) 	this.tmb_cont = options.thumbnails_container;
			if (options.slideshow_container)	this.ssh_cont = options.slideshow_container;
			
			// thumbnail stuff
			if (options.thumbnail_behavior) 	this.tmb_action = options.thumbnail_behavior;
			if (options.first_thumbnail) 		this.current = options.first_thumbnail;
			if (options.num_thumbnails) 		this.num_visible = options.num_thumbnails;
			if (options.prev_img) 				this.prev_img = options.prev_img;
			if (options.next_img) 				this.next_img = options.next_img;
			if (options.current_img)			this.current_img = options.current_img;
			if (options.current_classname)		this.c_class = options.current_classname;
			if (options.thumbnail_link) 		this.thumbnail_link = options.thumbnail_link;
			
			if (options.doc_help_text) 			this.DOC_HELP_TEXT = options.doc_help_text;
			if (options.fade_effect) 			this.fade_effect = options.fade_effect;
			
			// slideshow
			if (options.rotate_time)			this.slideshow_time = options.rotate_time*1000;
			if (options.auto_rotate)			this.slideshow_auto = options.auto_rotate;
			if (options.play_img)				this.slideshow_play = options.play_img;
			if (options.pause_img)				this.slideshow_pause = options.pause_img;
			
			// Django media object filetype string overrides
			if (options.django_filetypes) {
				if (options.django_filetypes.image) 	this.TYPE_IMG = options.django_filetypes.image;
				if (options.django_filetypes.video) 	this.TYPE_VID = options.django_filetypes.video;
				if (options.django_filetypes.flash) 	this.TYPE_SWF = options.django_filetypes.flash;
				if (options.django_filetypes.audio) 	this.TYPE_AUD = options.django_filetypes.audio;
				if (options.django_filetypes.document) 	this.TYPE_DOC = options.django_filetypes.document;
			}
			
			// Custom filetype display handlers
			if (options.custom_img_handler) 	this.customIMGHandler = options.custom_img_handler;
			if (options.custom_vid_handler) 	this.customVIDHandler = options.custom_vid_handler;
			if (options.custom_swf_handler) 	this.customSWFHandler = options.custom_swf_handler;
			if (options.custom_aud_handler) 	this.customAUDHandler = options.custom_aud_handler;
			if (options.custom_doc_handler) 	this.customDOCHandler = options.custom_doc_handler;
		}
		this.assignThumbnails();
		this.showMediaItem(this.current);
		
		if (this.slideshow_auto)
			this.startSlideshow();
	};
	
	this.showMediaItem = function (x, pause) {
		this.current = x;
		if (pause)
			this.endSlideshow();
			
		if (this.img_cont) {
			///
			/// MediaItem display handling based on file type
			///
			var _i = document.getElementById(this.img_cont);
			if (this.item_list[x].type == this.TYPE_IMG) {
				if (this.customIMGHandler)
					this.customIMGHandler(_i, this.item_list[x]);
				else {
					var markup = '<img src="'+this.item_list[x].url+'" alt="'+(this.item_list[x].hasMiscAtr('alt') ? this.item_list[x].misc.alt : 'Article Image')+'" title="'+(this.item_list[x].hasMiscAtr('alt') ? this.item_list[x].misc.alt : 'Article Image')+'" />';
					if (this.item_list[this.current].hasMiscAtr('custom_image_link'))
						markup = '<a href="'+this.item_list[this.current].misc.custom_image_link()[0]+'" target="'+this.item_list[this.current].misc.custom_image_link()[1]+'">'+markup+'</a>';
					_i.innerHTML = markup;
					if (this.fade_effect) {
						// This requires effects.js, which is why its usage defaults to false
						_i.style.opacity = "0.0";
						_i.style.filter = "alpha(opacity=0)";
						Effect.Appear(this.img_cont, {duration:0.2});
					}
				}
			}
			else if (this.item_list[x].type == this.TYPE_VID) {
				if (this.customVIDHandler)
					this.customVIDHandler(_i, this.item_list[x]);
				else
					//_i.innerHTML = '<embed height="315" width="420" src="'+this.item_list[x].url+'"></embed>';
					_i.innerHTML = '<object width="420" height="315" style="position:relative;left:0;top:0;" classid="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-oleobject">' +
						'<param name="URL" VALUE="'+this.item_list[x].url+'" />' +
						'<param name="AutoStart" VALUE="True" />' +
						'<param name="stretchToFit" value="true" />' +
						'<embed height="315" width="420" src="'+this.item_list[x].url+'" stretchToFit="true"></embed>' +
						'</object>';
			}
			else if (this.item_list[x].type == this.TYPE_SWF) {
				if (this.customSWFHandler)
					this.customSWFHandler(_i, this.item_list[x]);
				else
					_i.innerHTML = '<embed height="291" src="'+this.item_list[x].url+'" wmode="transparent"></embed>';
			}
			else if (this.item_list[x].type == this.TYPE_DOC) {
				if (this.customDOCHandler)
					this.customDOCHandler(_i, this.item_list[x]);
				else {
					var markup = 	'<div><br /><a class="main" href="'+this.item_list[x].url+'">Download Document</a>' +
										'<p><a href="'+this.item_list[x].url+'" target="_blank">Open in New Window</a> &raquo;<br />'+this.DOC_HELP_TEXT+'</p>' +
									'</div>';
					_i.innerHTML = markup;
				}
			}
			else if (this.item_list[x].type == this.TYPE_AUD) {
				if (this.customAUDHandler)
					this.customAUDHandler(_i, this.item_list[x]);
				else
					_i.innerHTML = '<embed height="291" src="'+this.item_list[x].url+'"></embed>';
			}
			
			// if we want the slideshow controls to be an overlay,
			// render the container here in the image container.
			if (this.ssh_cont == SLIDE_OVERLAY) {
				_i.innerHTML += this.renderControls();
			}
		}
		
		if ((this.ssh_cont != SLIDE_OVERLAY) && (this.ssh_cont != null)) {
			var _ss = document.getElementById(this.ssh_cont);
			_ss.innerHTML = this.renderControls();
		}
		
		///
		/// Cutline
		///
		if (this.cut_cont) {
			var _c = document.getElementById(this.cut_cont);
			_c.innerHTML = (this.item_list[x].cutline ? this.item_list[x].cutline : '') + "<br /><span>" + (this.item_list[x].author ? this.item_list[x].author : '') + " " + (this.item_list[x].author2 ? this.item_list[x].author2 : '') + "</span>";
		}
		
		this.updateMediaThumbnails();
	};
	
	this.showNextMediaItem = function () {
		if (this.tmb_action == ACTION_NORMAL) {
			if (this.current < this.item_list.length-1)
				this.showMediaItem(this.current+1, true);
		}
		else if (this.tmb_action == ACTION_SHIFT) {
			if ((this.leftmost+this.num_visible) < this.item_list.length)
				this.leftmost++;
			else
				this.leftmost = this.item_list.length-this.num_visible;
			
			this.updateMediaThumbnails();
		}
	};
	
	this.showPreviousMediaItem = function () {
		if (this.tmb_action == ACTION_NORMAL) {
			if (this.current > 0)
				this.showMediaItem(this.current-1, true);
		}
		else if (this.tmb_action == ACTION_SHIFT) {
			if (this.leftmost > 0)
				this.leftmost--;
			else
				this.leftmost = 0;
			
			this.updateMediaThumbnails();
		}
	};
	
	this.updateMediaThumbnails = function () {
		var _t = document.getElementById(this.tmb_cont);
		var output = '';
		var prev_button = '<img class="control prev" src="'+this.img_url+this.prev_img+'" onclick="'+this.var_name+'.showPreviousMediaItem()" />';
		var next_button = '<img class="control next" src="'+this.img_url+this.next_img+'" onclick="'+this.var_name+'.showNextMediaItem()" />';
		
		if (this.tmb_action == ACTION_NORMAL) {
			if ((this.current == this.leftmost) && (this.leftmost > 0)) {
				this.leftmost -= 1;
				start = this.leftmost;
				if (start + this.num_visible < this.item_list.length)
					end = start + this.num_visible;
				else
					end = this.item_list.length;
			}
			else if ((this.current == this.leftmost+(this.num_visible-1)) && (this.leftmost+this.num_visible < this.item_list.length)) {
				this.leftmost += 1;
				start = this.leftmost;
				end = this.leftmost + this.num_visible;
			}
			else {
				start = this.leftmost;
				end = this.leftmost + this.num_visible;
			}
			
			if (end > this.item_list.length)
				end = this.item_list.length;
				
			for (var i=start; i<end; i++) {
				if (i == this.current) {
					style = 'class="current"';
				}
				else
					style = null;
				
				if (this.current_img!=null)
						output += '<div>';
						
				output += 	'<a href="'+(this.item_list[i].hasMiscAtr('custom_thumbnail_link') ? this.item_list[i].misc.custom_thumbnail_link()[0] : 'javascript:'+this.var_name+'.showMediaItem('+i+', true);' )+'" target="'+(this.item_list[i].hasMiscAtr('custom_thumbnail_link') ? this.item_list[i].misc.custom_thumbnail_link()[1] : '_parent')+'">' +
							'<img src="'+this.item_list[i].thumbnail+'" '+style+' alt="'+(this.item_list[i].hasMiscAtr('alt') ? this.item_list[i].misc.alt : 'Image Thumbnail')+'" title="'+(this.item_list[i].hasMiscAtr('alt') ? this.item_list[i].misc.alt : 'Image Thumbnail')+'" /></a>';
				
				if ((i == this.current) && (this.current_img!=null))
					output += '<br /><img class="current_arrow" src="'+this.img_url+this.current_img+'" />';
					
				if (this.current_img!=null)
					output += '</div>';
			}
			
			_t.innerHTML = prev_button + output + next_button;
		}
		else if (this.tmb_action == ACTION_SHIFT) {
			end = this.leftmost + this.num_visible;
			if (end > this.item_list.length)
				end = this.item_list.length;
				
			for (var i=this.leftmost; i<end; i++) {
				output += 	'<a href="'+(this.item_list[i].hasMiscAtr('custom_thumbnail_link') ? this.item_list[i].misc.custom_thumbnail_link()[0] : 'javascript:'+this.var_name+'.showMediaItem('+i+', true);' )+'" target="'+(this.item_list[i].hasMiscAtr('custom_thumbnail_link') ? this.item_list[i].misc.custom_thumbnail_link()[1] : '_parent')+'">' +
							'<img src="'+this.item_list[i].thumbnail+'" alt="'+(this.item_list[i].hasMiscAtr('alt') ? this.item_list[i].misc.alt : 'Image Thumbnail')+'" title="'+(this.item_list[i].hasMiscAtr('alt') ? this.item_list[i].misc.alt : 'Image Thumbnail')+'" /></a>';
			}
			
			_t.innerHTML = prev_button + output + next_button;
		}
		else if (this.tmb_action == ACTION_SHOWALL) {
			for (var i=0; i<this.item_list.length; i++) {
				if (i == this.current)
					var style = ' class="current"';
				else
					var style = '';
				output += 	'<a href="'+(this.item_list[i].hasMiscAtr('custom_thumbnail_link') ? this.item_list[i].misc.custom_thumbnail_link()[0] : 'javascript:'+this.var_name+'.showMediaItem('+i+', true);' )+'" target="'+(this.item_list[i].hasMiscAtr('custom_thumbnail_link') ? this.item_list[i].misc.custom_thumbnail_link()[1] : '_parent')+'">' +
							'<img'+style+' src="'+this.item_list[i].thumbnail+'" alt="'+(this.item_list[i].hasMiscAtr('alt') ? this.item_list[i].misc.alt : 'Image Thumbnail')+'" title="'+(this.item_list[i].hasMiscAtr('alt') ? this.item_list[i].misc.alt : 'Image Thumbnail')+'" /></a>';
			}
			
			_t.innerHTML = output;
		}
	};
	
	this.startSlideshow = function () {
		this.slideshow = setTimeout(this.var_name+'.nextSlide()', this.slideshow_time);
		if ((this.ssh_cont != SLIDE_OVERLAY) && (this.ssh_cont != null))
			var _c = document.getElementById(this.ssh_cont);
		else
			var _c = document.getElementById("sld_cntrls");
			
		if (_c)
			_c.innerHTML = this.renderControlText();
	};
	
	this.nextSlide = function () {
		if (this.current == this.item_list.length-1)
			var next = 0;
		else
			var next = this.current+1;
			
		this.showMediaItem(next);
		this.slideshow = setTimeout(this.var_name+'.nextSlide()', this.slideshow_time);
	};
	
	this.endSlideshow = function () {
		clearTimeout(this.slideshow);
		this.slideshow = null;
		if ((this.ssh_cont != SLIDE_OVERLAY) && (this.ssh_cont != null))
			var _c = document.getElementById(this.ssh_cont);
		else
			var _c = document.getElementById("sld_cntrls");
			
		if (_c)
			_c.innerHTML = this.renderControlText();
	};
	
	/// handles slideshow control HTML generation
	this.renderControls = function () {
		return '<div class="slide_controls_overlay"></div><div id="sld_cntrls" class="slide_controls">'+this.renderControlText()+'</div>';
	};
	
	/// this is nasty, I don't like it, but I'm trying to get this done.
	this.renderControlText = function () {
		if (this.slideshow)
			return '<a href="javascript:;" onclick="'+this.var_name+'.endSlideshow();"><img src="'+this.img_url+this.slideshow_pause+'" /> Pause Slideshow</a>';
		else
			return '<a href="javascript:;" onclick="'+this.var_name+'.startSlideshow();"><img src="'+this.img_url+this.slideshow_play+'" /> Play Slideshow</a>';
	};
}