/*--------------------------------------------------------------------------
 *
 *  video.js
 *  $Id: video.js 16 2009-01-14 10:28:46Z tom $
 *  © 2008 upstruct berlin oslo
 *
 *--------------------------------------------------------------------------*/

var Video = Class.create({
	initialize: function(container,param) {
		
		this.container = container;
		this.preview = false;
		this.fallback = false;
		this.videos = {};
		this.priority = new Array();
		this.flashVersion = 0;
		this.html = '';
 		if($(this.container) == null){
			document.write('<div id="'+this.container+'"></div>');
		}

		if(param != undefined){
			$(this.container).setStyle({
				display:'block',
				width:param.width+'px',
				height:param.height+'px'
			})
		}
	},
	
	/**
	 * Add preview image to for the video
	 * @param  params:object -> {src [params:{width, height, etc}]}
	 **/
	addPreview: function(params){
		
		var attributes = '';
		if(params.attributes != undefined){
			for(var key in params.attributes) {
				attributes += ' '+key+'="'+params.attributes[key]+'"';
			}
		}
		attributes += (params.src != undefined) ? ' src="'+params.src+'"' : "";
		this.preview = '<img '+attributes+' />';
	},
	
	addFallback: function(params){
		this.fallback = params;
	},
	
	/**
	 * Add video to the the 
	 * @param  params:object -> {src [params:{width, height, etc}]}
	 **/
	addVideo: function(params){
		
		var node = '';			
		var nodeTagParams  = '';
		var nodeAttParams  = '';
		var nodeAttributes = '';
		
		for(var key in params.params) {
			nodeTagParams   += '<param name="'+ key +'" value="'+ params.params[key] +'" />';
			nodeAttParams += ' '+key+'="'+params.params[key]+'"';
		}
		
		for(var key in params.attributes){
			nodeAttributes += ' '+key+'="'+params.attributes[key]+'"';
		}
		
		if(params.format == 'quicktime'){
			
			this.videos.quicktime = {};	
			node += '<object type="video/quicktime" data="'+params.src+'" '+nodeAttributes+'>';
			node += 	'<param name="src" value="'+params.src+'">';
			node +=		nodeTagParams;
			node += '</object>';
			this.videos.quicktime.src = params.src;
			this.videos.quicktime.html = node;
			
		} else if(params.format == 'flash'){
			
			this.videos.flash = {};
			this.flashVersion = (params.version != undefined) ? parseFloat(params.version) : 0;
			node += '<object type="application/x-shockwave-flash" data="'+params.src+'" '+nodeAttributes+'>';
			node += 	'<param name="src" value="'+params.src+'">';
			node +=		nodeTagParams;
			node += '</object>';
			this.videos.flash.src = params.src;
			this.videos.flash.html = node;
			
		}
	},
	
	/**
	 * Sets the queue for in which order the movie should be played
	 * @param  arrays
	 **/
	queue: function(array){
		
		var priority = (array != undefined) ? array : ['flash','quicktime'];
		this.priority = priority;
		
	},
	
	buildObject: function(){
			
		var html = '';
					
		for(var i=0; i < this.priority.length; i++){
			switch(this.priority[i]){
				case 'flash':
					if(parseFloat(Browserdetect.flash.version) > this.flashVersion){
						html = this.videos.flash.html;
						i = this.priority.length;
						break;
					}
				case 'quicktime':
					if(Browserdetect.quicktime.installed){
						html = this.videos.quicktime.html;
						i = this.priority.length;
						break;
					}
			}
		}
		
		if(html == '' && this.fallback != true)
			html = this.fallback;
		
		this.html = html;
			
	},
	
	/**
	 * Updates the container-div with the correct video
	 **/
	video: function(){
	
		this.update(this.getHTML());
		
	},
	
	/**
	 * Updates the container-div
	 **/
	update: function(string){
		$(this.container).update(string);
	},
	
	/**
	 * Returns the HMTL for the of the correct video
	 **/
	getHTML: function(){
		if(this.html == '')
			this.buildObject();
		return this.html;
	},
	
	/**
	 * Updates the container-div with the requested html 
	 **/
	write: function(){
		
		this.buildObject();
		
		if(this.preview != false && Browserdetect.os != 'iPhone' && Browserdetect.os != 'iPod'){			
			this.update(this.preview);
			var listener = $(this.container).down().identify();
			$(listener).observe('click', this.video.bindAsEventListener(this));
		} else {
			this.video();
		}
		
	}
	
});
