/**
 * flowplayer.js 3.0.6. The Flowplayer API
 * 
 * Copyright 2009 Flowplayer Oy
 * 
 * This file is part of Flowplayer.
 * 
 * Flowplayer is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or (at your option) any later
 * version.
 * 
 * Flowplayer is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with
 * Flowplayer. If not, see <http://www.gnu.org/licenses/>.
 * 
 * Version: 3.0.6 - Wed Feb 25 2009 21:56:07 GMT-0000 (GMT+00:00)
 */
( function() {
	function log(args) {
		console.log("$f.fireEvent", [].slice.call(args));
	}
	function clone(obj) {
		if (!obj || typeof obj != 'object') {
			return obj;
		}
		var temp = new obj.constructor();
		for ( var key in obj) {
			if (obj.hasOwnProperty(key)) {
				temp[key] = clone(obj[key]);
			}
		}
		return temp;
	}
	function each(obj, fn) {
		if (!obj) {
			return;
		}
		var name, i = 0, length = obj.length;
		if (length === undefined) {
			for (name in obj) {
				if (fn.call(obj[name], name, obj[name]) === false) {
					break;
				}
			}
		} else {
			for ( var value = obj[0]; i < length
					&& fn.call(value, i, value) !== false; value = obj[++i]) {
			}
		}
		return obj;
	}
	function el(id) {
		return document.getElementById(id);
	}
	function extend(to, from, skipFuncs) {
		if (to && from) {
			each(from, function(name, value) {
				if (!skipFuncs || typeof value != 'function') {
					to[name] = value;
				}
			});
		}
	}
	function select(query) {
		var index = query.indexOf(".");
		if (index != -1) {
			var tag = query.substring(0, index) || "*";
			var klass = query.substring(index + 1, query.length);
			var els = [];
			each(document.getElementsByTagName(tag), function() {
				if (this.className && this.className.indexOf(klass) != -1) {
					els.push(this);
				}
			});
			return els;
		}
	}
	function stopEvent(e) {
		e = e || window.event;
		if (e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		} else {
			e.returnValue = false;
			e.cancelBubble = true;
		}
		return false;
	}
	function bind(to, evt, fn) {
		to[evt] = to[evt] || [];
		to[evt].push(fn);
	}
	function makeId() {
		return "_" + ("" + Math.random()).substring(2, 10);
	}
	var Clip = function(json, index, player) {
		var self = this;
		var cuepoints = {};
		var listeners = {};
		self.index = index;
		if (typeof json == 'string') {
			json = {
				url : json
			};
		}
		extend(this, json, true);
		each(
				("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop")
						.split(","), function() {
					var evt = "on" + this;
					if (evt.indexOf("*") != -1) {
						evt = evt.substring(0, evt.length - 1);
						var before = "onBefore" + evt.substring(2);
						self[before] = function(fn) {
							bind(listeners, before, fn);
							return self;
						};
					}
					self[evt] = function(fn) {
						bind(listeners, evt, fn);
						return self;
					};
					if (index == -1) {
						if (self[before]) {
							player[before] = self[before];
						}
						if (self[evt]) {
							player[evt] = self[evt];
						}
					}
				});
		extend(this, {
			onCuepoint : function(points, fn) {
				if (arguments.length == 1) {
					cuepoints.embedded = [ null, points ];
					return self;
				}
				if (typeof points == 'number') {
					points = [ points ];
				}
				var fnId = makeId();
				cuepoints[fnId] = [ points, fn ];
				if (player.isLoaded()) {
					player._api().fp_addCuepoints(points, index, fnId);
				}
				return self;
			},
			update : function(json) {
				extend(self, json);
				if (player.isLoaded()) {
					player._api().fp_updateClip(json, index);
				}
				var conf = player.getConfig();
				var clip = (index == -1) ? conf.clip : conf.playlist[index];
				extend(clip, json, true);
			},
			_fireEvent : function(evt, arg1, arg2, target) {
				if (evt == 'onLoad') {
					each(cuepoints, function(key, val) {
						if (val[0]) {
							player._api().fp_addCuepoints(val[0], index, key);
						}
					});
					return false;
				}
				target = target || self;
				if (evt == 'onCuepoint') {
					var fn = cuepoints[arg1];
					if (fn) {
						return fn[1].call(player, target, arg2);
					}
				}
				if (evt == 'onStart' || evt == 'onUpdate') {
					extend(target, arg1);
					if (!target.duration) {
						target.duration = arg1.metaData.duration;
					} else {
						target.fullDuration = arg1.metaData.duration;
					}
				}
				var ret = true;
				each(listeners[evt], function() {
					ret = this.call(player, target, arg1, arg2);
				});
				return ret;
			}
		});
		if (json.onCuepoint) {
			var arg = json.onCuepoint;
			self.onCuepoint.apply(self, typeof arg == 'function' ? [ arg ]
					: arg);
			delete json.onCuepoint;
		}
		each(json, function(key, val) {
			if (typeof val == 'function') {
				bind(listeners, key, val);
				delete json[key];
			}
		});
		if (index == -1) {
			player.onCuepoint = this.onCuepoint;
		}
	};
	var Plugin = function(name, json, player, fn) {
		var listeners = {};
		var self = this;
		var hasMethods = false;
		if (fn) {
			extend(listeners, fn);
		}
		each(json, function(key, val) {
			if (typeof val == 'function') {
				listeners[key] = val;
				delete json[key];
			}
		});
		extend(this, {
			animate : function(props, speed, fn) {
				if (!props) {
					return self;
				}
				if (typeof speed == 'function') {
					fn = speed;
					speed = 500;
				}
				if (typeof props == 'string') {
					var key = props;
					props = {};
					props[key] = speed;
					speed = 500;
				}
				if (fn) {
					var fnId = makeId();
					listeners[fnId] = fn;
				}
				if (speed === undefined) {
					speed = 500;
				}
				json = player._api().fp_animate(name, props, speed, fnId);
				return self;
			},
			css : function(props, val) {
				if (val !== undefined) {
					var css = {};
					css[props] = val;
					props = css;
				}
				json = player._api().fp_css(name, props);
				extend(self, json);
				return self;
			},
			show : function() {
				this.display = 'block';
				player._api().fp_showPlugin(name);
				return self;
			},
			hide : function() {
				this.display = 'none';
				player._api().fp_hidePlugin(name);
				return self;
			},
			toggle : function() {
				this.display = player._api().fp_togglePlugin(name);
				return self;
			},
			fadeTo : function(o, speed, fn) {
				if (typeof speed == 'function') {
					fn = speed;
					speed = 500;
				}
				if (fn) {
					var fnId = makeId();
					listeners[fnId] = fn;
				}
				this.display = player._api().fp_fadeTo(name, o, speed, fnId);
				this.opacity = o;
				return self;
			},
			fadeIn : function(speed, fn) {
				return self.fadeTo(1, speed, fn);
			},
			fadeOut : function(speed, fn) {
				return self.fadeTo(0, speed, fn);
			},
			getName : function() {
				return name;
			},
			getPlayer : function() {
				return player;
			},
			_fireEvent : function(evt, arg, arg2) {
				if (evt == 'onUpdate') {
					var json = player._api().fp_getPlugin(name);
					if (!json) {
						return;
					}
					extend(self, json);
					delete self.methods;
					if (!hasMethods) {
						each(json.methods, function() {
							var method = "" + this;
							self[method] = function() {
								var a = [].slice.call(arguments);
								var ret = player._api().fp_invoke(name, method,
										a);
								return ret == 'undefined' ? self : ret;
							};
						});
						hasMethods = true;
					}
				}
				var fn = listeners[evt];
				if (fn) {
					fn.apply(self, arg);
					if (evt.substring(0, 1) == "_") {
						delete listeners[evt];
					}
				}
			}
		});
	};
	function Player(wrapper, params, conf) {
		var self = this, api = null, html, commonClip, playlist = [], plugins = {}, listeners = {}, playerId, apiId, playerIndex, activeIndex, swfHeight, wrapperHeight;
		extend(
				self,
				{
					id : function() {
						return playerId;
					},
					isLoaded : function() {
						return (api !== null);
					},
					getParent : function() {
						return wrapper;
					},
					hide : function(all) {
						if (all) {
							wrapper.style.height = "0px";
						}
						if (api) {
							api.style.height = "0px";
						}
						return self;
					},
					show : function() {
						wrapper.style.height = wrapperHeight + "px";
						if (api) {
							api.style.height = swfHeight + "px";
						}
						return self;
					},
					isHidden : function() {
						return api && parseInt(api.style.height, 10) === 0;
					},
					load : function(fn) {
						if (!api && self._fireEvent("onBeforeLoad") !== false) {
							each(players, function() {
								this.unload();
							});
							html = wrapper.innerHTML;
							flashembed(wrapper, params, {
								config : conf
							});
							if (fn) {
								fn.cached = true;
								bind(listeners, "onLoad", fn);
							}
						}
						return self;
					},
					unload : function() {
						try {
							if (!api || api.fp_isFullscreen()) {
								return self;
							}
						} catch (error) {
							return self;
						}
						if (self._fireEvent("onBeforeUnload") === false) {
							return false;
						}
						api.fp_close();
						api = null;
						if (html.replace(/\s/g, '') !== '') {
							wrapper.innerHTML = html;
						}
						self._fireEvent("onUnload");
						return self;
					},
					getClip : function(index) {
						if (index === undefined) {
							index = activeIndex;
						}
						return playlist[index];
					},
					getCommonClip : function() {
						return commonClip;
					},
					getPlaylist : function() {
						return playlist;
					},
					getPlugin : function(name) {
						var plugin = plugins[name];
						if (!plugin && self.isLoaded()) {
							var json = self._api().fp_getPlugin(name);
							if (json) {
								plugin = new Plugin(name, json, self);
								plugins[name] = plugin;
							}
						}
						return plugin;
					},
					getScreen : function() {
						return self.getPlugin("screen");
					},
					getControls : function() {
						return self.getPlugin("controls");
					},
					getConfig : function(copy) {
						return copy ? clone(conf) : conf;
					},
					getFlashParams : function() {
						return params;
					},
					loadPlugin : function(name, url, props, fn) {
						if (typeof props == 'function') {
							fn = props;
							props = {};
						}
						var fnId = fn ? makeId() : "_";
						self._api().fp_loadPlugin(name, url, props, fnId);
						var arg = {};
						arg[fnId] = fn;
						var p = new Plugin(name, null, self, arg);
						plugins[name] = p;
						return p;
					},
					getState : function() {
						return api ? api.fp_getState() : -1;
					},
					play : function(clip) {
						function play() {
							if (clip !== undefined) {
								self._api().fp_play(clip);
							} else {
								self._api().fp_play();
							}
						}
						if (api) {
							play();
						} else {
							self.load( function() {
								play();
							});
						}
						return self;
					},
					getVersion : function() {
						var js = "flowplayer.js 3.0.6";
						if (api) {
							var ver = api.fp_getVersion();
							ver.push(js);
							return ver;
						}
						return js;
					},
					_api : function() {
						if (!api) {
							throw "Flowplayer "
									+ self.id()
									+ " not loaded. Try moving your call to player's onLoad event";
						}
						return api;
					},
					_dump : function() {
						console.log(listeners);
					},
					setClip : function(clip) {
						self.setPlaylist( [ clip ]);
					},
					getIndex : function() {
						return playerIndex;
					}
				});
		each(
				("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,Fullscreen*,FullscreenExit,Error")
						.split(","), function() {
					var name = "on" + this;
					if (name.indexOf("*") != -1) {
						name = name.substring(0, name.length - 1);
						var name2 = "onBefore" + name.substring(2);
						self[name2] = function(fn) {
							bind(listeners, name2, fn);
							return self;
						};
					}
					self[name] = function(fn) {
						bind(listeners, name, fn);
						return self;
					};
				});
		each(
				("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,reset,close,setPlaylist")
						.split(","), function() {
					var name = this;
					self[name] = function(arg) {
						if (!api) {
							return self;
						}
						var ret = (arg === undefined) ? api["fp_" + name]()
								: api["fp_" + name](arg);
						return ret == 'undefined' ? self : ret;
					};
				});
		self._fireEvent = function(a) {
			if (typeof a == 'string') {
				a = [ a ];
			}
			var evt = a[0];
			var arg0 = a[1];
			var arg1 = a[2];
			var arg2 = a[3];
			if (conf.debug) {
				log(a);
			}
			if (!api && evt == 'onLoad' && arg0 == 'player') {
				api = api || el(apiId);
				swfHeight = api.clientHeight;
				each(playlist, function() {
					this._fireEvent("onLoad");
				});
				each(plugins, function(name, p) {
					p._fireEvent("onUpdate");
				});
				commonClip._fireEvent("onLoad");
			}
			if (evt == 'onLoad' && arg0 != 'player') {
				return;
			}
			if (evt == 'onError') {
				if (typeof arg0 == 'string'
						|| (typeof arg0 == 'number' && typeof arg1 == 'number')) {
					arg0 = arg1;
					arg1 = arg2;
				}
			}
			if (evt == 'onContextMenu') {
				each(conf.contextMenu[arg0], function(key, fn) {
					fn.call(self);
				});
				return;
			}
			if (evt == 'onPluginEvent') {
				var name = arg0.name || arg0;
				var p = plugins[name];
				if (p) {
					p._fireEvent("onUpdate", arg0);
					p._fireEvent(arg1, a.slice(3));
				}
				return;
			}
			if (evt == 'onPlaylistReplace') {
				playlist = [];
				var index = 0;
				each(arg0, function() {
					playlist.push(new Clip(this, index++, self));
				});
			}
			var ret = true;
			if (typeof arg0 == 'number' && arg0 < playlist.length) {
				activeIndex = arg0;
				var clip = playlist[arg0];
				if (clip) {
					ret = clip._fireEvent(evt, arg1, arg2);
				}
				if (!clip || ret !== false) {
					ret = commonClip._fireEvent(evt, arg1, arg2, clip);
				}
			}
			var i = 0;
			each(listeners[evt], function() {
				ret = this.call(self, arg0, arg1);
				if (this.cached) {
					listeners[evt].splice(i, 1);
				}
				if (ret === false) {
					return false;
				}
				i++;
			});
			return ret;
		};
		function init() {
			if ($f(wrapper)) {
				$f(wrapper).getParent().innerHTML = "";
				playerIndex = $f(wrapper).getIndex();
				players[playerIndex] = self;
			} else {
				players.push(self);
				playerIndex = players.length - 1;
			}
			wrapperHeight = parseInt(wrapper.style.height, 10)
					|| wrapper.clientHeight;
			if (typeof params == 'string') {
				params = {
					src : params
				};
			}
			playerId = wrapper.id || "fp" + makeId();
			apiId = params.id || playerId + "_api";
			params.id = apiId;
			conf.playerId = playerId;
			if (typeof conf == 'string') {
				conf = {
					clip : {
						url : conf
					}
				};
			}
			if (typeof conf.clip == 'string') {
				conf.clip = {
					url : conf.clip
				};
			}
			conf.clip = conf.clip || {};
			if (wrapper.getAttribute("href", 2) && !conf.clip.url) {
				conf.clip.url = wrapper.getAttribute("href", 2);
			}
			commonClip = new Clip(conf.clip, -1, self);
			conf.playlist = conf.playlist || [ conf.clip ];
			var index = 0;
			each(conf.playlist, function() {
				var clip = this;
				if (typeof clip == 'object' && clip.length) {
					clip = "" + clip;
				}
				if (typeof clip == 'string') {
					clip = {
						url : clip
					};
				}
				each(conf.clip, function(key, val) {
					if (conf.clip[key] !== undefined && clip[key] === undefined
							&& typeof val != 'function') {
						clip[key] = val;
					}
				});
				conf.playlist[index] = clip;
				clip = new Clip(clip, index, self);
				playlist.push(clip);
				index++;
			});
			each(conf, function(key, val) {
				if (typeof val == 'function') {
					bind(listeners, key, val);
					delete conf[key];
				}
			});
			each(conf.plugins, function(name, val) {
				if (val) {
					plugins[name] = new Plugin(name, val, self);
				}
			});
			if (!conf.plugins || conf.plugins.controls === undefined) {
				plugins.controls = new Plugin("controls", null, self);
			}
			params.bgcolor = params.bgcolor || "#000000";
			params.version = params.version || [ 9, 0 ];
			params.expressInstall = 'http://www.flowplayer.org/swf/expressinstall.swf';
			function doClick(e) {
				if (!self.isLoaded()
						&& self._fireEvent("onBeforeClick") !== false) {
					self.load();
				}
				return stopEvent(e);
			}
			html = wrapper.innerHTML;
			if (html.replace(/\s/g, '') !== '') {
				if (wrapper.addEventListener) {
					wrapper.addEventListener("click", doClick, false);
				} else if (wrapper.attachEvent) {
					wrapper.attachEvent("onclick", doClick);
				}
			} else {
				if (wrapper.addEventListener) {
					wrapper.addEventListener("click", stopEvent, false);
				}
				self.load();
			}
		}
		if (typeof wrapper == 'string') {
			flashembed.domReady( function() {
				var node = el(wrapper);
				if (!node) {
					throw "Flowplayer cannot access element: " + wrapper;
				} else {
					wrapper = node;
					init();
				}
			});
		} else {
			init();
		}
	}
	var players = [];
	function Iterator(arr) {
		this.length = arr.length;
		this.each = function(fn) {
			each(arr, fn);
		};
		this.size = function() {
			return arr.length;
		};
	}
	window.flowplayer = window.$f = function() {
		var instance = null;
		var arg = arguments[0];
		if (!arguments.length) {
			each(players, function() {
				if (this.isLoaded()) {
					instance = this;
					return false;
				}
			});
			return instance || players[0];
		}
		if (arguments.length == 1) {
			if (typeof arg == 'number') {
				return players[arg];
			} else {
				if (arg == '*') {
					return new Iterator(players);
				}
				each(players, function() {
					if (this.id() == arg.id || this.id() == arg
							|| this.getParent() == arg) {
						instance = this;
						return false;
					}
				});
				return instance;
			}
		}
		if (arguments.length > 1) {
			var swf = arguments[1];
			var conf = (arguments.length == 3) ? arguments[2] : {};
			if (typeof arg == 'string') {
				if (arg.indexOf(".") != -1) {
					var instances = [];
					each(select(arg),
							function() {
								instances.push(new Player(this, clone(swf),
										clone(conf)));
							});
					return new Iterator(instances);
				} else {
					var node = el(arg);
					return new Player(node !== null ? node : arg, swf, conf);
				}
			} else if (arg) {
				return new Player(arg, swf, conf);
			}
		}
		return null;
	};
	extend(window.$f, {
		fireEvent : function() {
			var a = [].slice.call(arguments);
			var p = $f(a[0]);
			return p ? p._fireEvent(a.slice(1)) : null;
		},
		addPlugin : function(name, fn) {
			Player.prototype[name] = fn;
			return $f;
		},
		each : each,
		extend : extend
	});
	if (document.all) {
		window.onbeforeunload = function() {
			$f("*").each( function() {
				if (this.isLoaded()) {
					this.close();
				}
			});
		};
	}
	if (typeof jQuery == 'function') {
		jQuery.prototype.flowplayer = function(params, conf) {
			if (!arguments.length || typeof arguments[0] == 'number') {
				var arr = [];
				this.each( function() {
					var p = $f(this);
					if (p) {
						arr.push(p);
					}
				});
				return arguments.length ? arr[arguments[0]] : new Iterator(arr);
			}
			return this.each( function() {
				$f(this, clone(params), conf ? clone(conf) : {});
			});
		};
	}
})();
( function() {
	var jQ = typeof jQuery == 'function';
	function isDomReady() {
		if (domReady.done) {
			return false;
		}
		var d = document;
		if (d && d.getElementsByTagName && d.getElementById && d.body) {
			clearInterval(domReady.timer);
			domReady.timer = null;
			for ( var i = 0; i < domReady.ready.length; i++) {
				domReady.ready[i].call();
			}
			domReady.ready = null;
			domReady.done = true;
		}
	}
	var domReady = jQ ? jQuery : function(f) {
		if (domReady.done) {
			return f();
		}
		if (domReady.timer) {
			domReady.ready.push(f);
		} else {
			domReady.ready = [ f ];
			domReady.timer = setInterval(isDomReady, 13);
		}
	};
	function extend(to, from) {
		if (from) {
			for (key in from) {
				if (from.hasOwnProperty(key)) {
					to[key] = from[key];
				}
			}
		}
		return to;
	}
	function asString(obj) {
		switch (typeOf(obj)) {
		case 'string':
			obj = obj.replace(new RegExp('(["\\\\])', 'g'), '\\$1');
			obj = obj.replace(/^\s?(\d+)%/, "$1pct");
			return '"' + obj + '"';
		case 'array':
			return '[' + map(obj, function(el) {
				return asString(el);
			}).join(',') + ']';
		case 'function':
			return '"function()"';
		case 'object':
			var str = [];
			for ( var prop in obj) {
				if (obj.hasOwnProperty(prop)) {
					str.push('"' + prop + '":' + asString(obj[prop]));
				}
			}
			return '{' + str.join(',') + '}';
		}
		return String(obj).replace(/\s/g, " ").replace(/\'/g, "\"");
	}
	function typeOf(obj) {
		if (obj === null || obj === undefined) {
			return false;
		}
		var type = typeof obj;
		return (type == 'object' && obj.push) ? 'array' : type;
	}
	if (window.attachEvent) {
		window.attachEvent("onbeforeunload", function() {
			__flash_unloadHandler = function() {
			};
			__flash_savedUnloadHandler = function() {
			};
		});
	}
	function map(arr, func) {
		var newArr = [];
		for ( var i in arr) {
			if (arr.hasOwnProperty(i)) {
				newArr[i] = func(arr[i]);
			}
		}
		return newArr;
	}
	function getHTML(p, c) {
		var ie = document.all;
		var html = '<object width="' + p.width + '" height="' + p.height + '"';
		if (ie && !p.id) {
			p.id = "_" + ("" + Math.random()).substring(9);
		}
		if (p.id) {
			html += ' id="' + p.id + '"';
		}
		if (p.w3c || !ie) {
			html += ' data="' + p.src + '" type="application/x-shockwave-flash"';
		} else {
			html += ' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';
		}
		html += '>';
		if (p.w3c || ie) {
			html += '<param name="movie" value="' + p.src + '" />';
		}
		var e = extend( {}, p);
		e.width = e.height = e.id = e.w3c = e.src = null;
		for ( var k in e) {
			if (e[k] !== null) {
				html += '<param name="' + k + '" value="' + e[k] + '" />';
			}
		}
		var vars = "";
		if (c) {
			for ( var key in c) {
				if (c[key] !== null) {
					vars += key
							+ '='
							+ (typeof c[key] == 'object' ? asString(c[key])
									: c[key]) + '&';
				}
			}
			vars = vars.substring(0, vars.length - 1);
			html += '<param name="flashvars" value=\'' + vars + '\' />';
		}
		html += "</object>";
		return html;
	}
	function Flash(root, opts, flashvars) {
		var version = flashembed.getVersion();
		extend(this, {
			getContainer : function() {
				return root;
			},
			getConf : function() {
				return conf;
			},
			getVersion : function() {
				return version;
			},
			getFlashvars : function() {
				return flashvars;
			},
			getApi : function() {
				return root.firstChild;
			},
			getHTML : function() {
				return getHTML(opts, flashvars);
			}
		});
		var required = opts.version;
		var express = opts.expressInstall;
		var ok = !required || flashembed.isSupported(required);
		if (ok) {
			opts.onFail = opts.version = opts.expressInstall = null;
			root.innerHTML = getHTML(opts, flashvars);
		} else if (required && express && flashembed.isSupported( [ 6, 65 ])) {
			extend(opts, {
				src : express
			});
			flashvars = {
				MMredirectURL : location.href,
				MMplayerType : 'PlugIn',
				MMdoctitle : document.title
			};
			root.innerHTML = getHTML(opts, flashvars);
		} else {
			if (root.innerHTML.replace(/\s/g, '') !== '') {
			} else {
				root.innerHTML = "<h2>Flash version "
						+ required
						+ " or greater is required</h2>"
						+ "<h3>"
						+ (version[0] > 0 ? "Your version is " + version
								: "You have no flash plugin installed")
						+ "</h3>"
						+ (root.tagName == 'A' ? "<p>Click here to download latest version</p>"
								: "<p>Download latest version from <a href='http://www.adobe.com/go/getflashplayer'>here</a></p>");
				if (root.tagName == 'A') {
					root.href = 'http://www.adobe.com/go/getflashplayer';
				}
			}
		}
		if (!ok && opts.onFail) {
			var ret = opts.onFail.call(this);
			if (typeof ret == 'string') {
				root.innerHTML = ret;
			}
		}
	}
	window.flashembed = function(root, conf, flashvars) {
		if (typeof root == 'string') {
			var el = document.getElementById(root);
			if (el) {
				root = el;
			} else {
				domReady( function() {
					flashembed(root, conf, flashvars);
				});
				return;
			}
		}
		if (!root) {
			return;
		}
		var opts = {
			width : '100%',
			height : '100%',
			allowfullscreen : true,
			allowscriptaccess : 'always',
			quality : 'high',
			version : null,
			onFail : null,
			expressInstall : null,
			w3c : false
		};
		if (typeof conf == 'string') {
			conf = {
				src : conf
			};
		}
		extend(opts, conf);
		return new Flash(root, opts, flashvars);
	};
	extend(
			window.flashembed,
			{
				getVersion : function() {
					var version = [ 0, 0 ];
					if (navigator.plugins
							&& typeof navigator.plugins["Shockwave Flash"] == "object") {
						var _d = navigator.plugins["Shockwave Flash"].description;
						if (typeof _d != "undefined") {
							_d = _d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
							var _m = parseInt(_d.replace(/^(.*)\..*$/, "$1"),
									10);
							var _r = /r/.test(_d) ? parseInt(_d.replace(
									/^.*r(.*)$/, "$1"), 10) : 0;
							version = [ _m, _r ];
						}
					} else if (window.ActiveXObject) {
						try {
							var _a = new ActiveXObject(
									"ShockwaveFlash.ShockwaveFlash.7");
						} catch (e) {
							try {
								_a = new ActiveXObject(
										"ShockwaveFlash.ShockwaveFlash.6");
								version = [ 6, 0 ];
								_a.AllowScriptAccess = "always";
							} catch (ee) {
								if (version[0] == 6) {
									return;
								}
							}
							try {
								_a = new ActiveXObject(
										"ShockwaveFlash.ShockwaveFlash");
							} catch (eee) {
							}
						}
						if (typeof _a == "object") {
							_d = _a.GetVariable("$version");
							if (typeof _d != "undefined") {
								_d = _d.replace(/^\S+\s+(.*)$/, "$1")
										.split(",");
								version = [ parseInt(_d[0], 10),
										parseInt(_d[2], 10) ];
							}
						}
					}
					return version;
				},
				isSupported : function(version) {
					var now = flashembed.getVersion();
					var ret = (now[0] > version[0])
							|| (now[0] == version[0] && now[1] >= version[1]);
					return ret;
				},
				domReady : domReady,
				asString : asString,
				getHTML : getHTML
			});
	if (jQ) {
		jQuery.prototype.flashembed = function(conf, flashvars) {
			return this.each( function() {
				flashembed(this, conf, flashvars);
			});
		};
	}
})();
