/*
---
description: MooTools wrapper to embed QuickTime movies.

license: MIT-style

authors:
- Jose Prado

requires:
  core/1.2.4: [Browser, Class.Extras, Array, Hash, Element, Element.Event]

provides:
  Quickie
  Browser.Plugins.QuickTime

...
*/
(function() {
	var qtEvents = ['begin', 'loadedmetadata', 'loadedfirstframe', 'canplay', 'canplaythrough',
	'durationchange', 'load', 'ended', 'error', 'pause', 'play', 'progress', 'waiting', 'stalled',
	'timechanged', 'volumechange'];
	
	Quickie = new Class({
			
		Implements: [Options, Events],
		version: '2.1',
		options: {/*
			onPlay: $empty,
			onStop: $empty,*/
			id: null,
			height: 1,
			width: 1,
			container: null,
			attributes: {
				controller: "true",
				postdomevents: "true"
			}
		},
		
		initialize: function(path, options){
			this.setOptions(options);
			options = this.options;
			this.id = this.options.id || 'Quickie_' + $time();
			this.path = path;
			var container = options.container;
			
			// Extra attributes
			options.attributes = $H(options.attributes);
			options.attributes.src = path;
			
			// Get Browser appropriate HTML code
			this.html = this.toHTML();
			
			if (Browser.Engine.trident) {
				document.getElementById(container).innerHTML = this.html;
				this.quickie = document.getElementById(this.id);
				this.ieFix.delay(10, this);
			} else {
				var wrapper = document.createElement('div');
				wrapper.innerHTML = this.html;
				this.quickie = wrapper.firstChild;
				this.transferEvents();
				document.id(container).empty();
				document.getElementById(container).appendChild(this.quickie);
			}
		},
		
		toHTML: function() {
			if (!this.html) {
				var attributes = this.options.attributes,
				    height     = (attributes.controller == "true") ? this.options.height + 16 : this.options.height,
				    width      = this.options.width,
				    element    = '';
					  
				if (Browser.Engine.trident) {					
					element = '<object id="'+this.id+'" ';
					element += 'width="'+width+'" ';
					element += 'height="'+height+'" ';
					element += 'classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" ';
					element += 'style="behavior:url(#qt_event_source);" ';
					element += 'codebase="http://www.apple.com/qtactivex/qtplugin.cab">';
					
					attributes.each(function(value, key) {
						element += '<param name="'+key+'" value="'+value+'" />';
					});
					
					element += '</object>';
				} else {
					element = '<embed id="'+this.id+'" ';
					element += 'width="'+width+'" ';
					element += 'height="'+height+'" ';
					element += 'pluginspage="http://www.apple.com/quicktime/download/" ';
					
					attributes.each(function(value, key) {
						element += key+'="'+value+'" ';
					});
					
					element += '/>';
				}
				this.html = element;
			}
			return this.html;
		},
		
		ieFix: function() {
			document.getElementById(this.id).SetResetPropertiesOnReload(false);
			document.getElementById(this.id).SetURL(this.path);
			this.transferEvents.delay(10, this);
		},
		
		transferEvents: function() {
			var element = this.quickie;
			
			qtEvents.each(function(evType) {
				addQTEvent(element, evType, this.fireEvent.pass(evType, this));
			}.bind(this));
		}
		
	});

	function addQTEvent(el, evType, fn, useCapture) {
		evType = 'qt_' + evType;
		if (el.addEventListener) {
			el.addEventListener(evType, fn, useCapture);
			return true;
		} else if (el.attachEvent) {
			var r = el.attachEvent('on' + evType, fn);
			return r;
		} else {
			el[evType] = fn;
		}
	}

})();

Browser.Plugins.QuickTime = (function(){
	if (navigator.plugins) {
		for (var i = 0, l = navigator.plugins.length; i < l; i++) {
			if (navigator.plugins[i].name.indexOf('QuickTime') >= 0) {
				return true;
			}
		}
	} else {
		try { var test = new ActiveXObject('QuickTime.QuickTime'); }
		catch(e) {}
		
		if (test) { return true; }
	}
	return false;
})();
