/**
 * 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 += '<param name="wmode" value="opaque">';
		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);
					});
		};
	}
})();