	//// BEGIN HEADER ////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	////                                                                                          ////
	////    SWFHANDLER CLASS.                                                                     ////
	////                                                                                          ////
	////    Developer: Jose Cao-Garcia.                                                           ////
	////    HELP/INFO/DEVELOPER CONTACT: jose@jcao.com, http://jcao.com                           ////
	////                                                                                          ////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	////                                                                                          ////
	////    This is an easy to use class for detecting  embedding, and controlling flash movies.  ////
	////    movies. It is still in it's infancy.                                                  ////
	////                                                                                          ////
	////    currently, no documentation exists for this script. I will eventually post            ////
	////    documentation for this script (or a more mature release) at my website, along         ////
	////    with other scripts.                                                                   ////
	////                                                                                          ////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	////                                                                                          ////
	////    You are free to copy, use, and create derivative versions of this script as long      ////
	////    as the following conditions are met:                                                  ////
	////                                                                                          ////
	////    1. Any copy or derivative version of this script must retain this header, and all     ////
	////       the information within it.                                                         ////
	////    2. This header and all the information within it must remain intact, and unedited.    ////
	////    3. If you edit, or create a derivative version of this script, you must clearly       ////
	////       indicate that the script has been edited, by whom, and to what extent below        ////
	////       this header.                                                                       ////
	////    4. You may not attempt to sell, license, or otherwise claim the script as your        ////
	////       own work.                                                                          ////
	////                                                                                          ////
	////    If you find this script useful please let me know. Likewise, if you see ways in       ////
	////    which this script could be improved upon, I would love to hear your ideas.            ////
	////                                                                                          ////
	//////////////////////////////////////////////////////////////////////////////////////////////////
	//// END HEADER //////////////////////////////////////////////////////////////////////////////////




	//// OBJECT CLASS FOR WORKING WITH SHOCKWAVE FLASH FILES
		function swfHandler() {
		// root
			var root  = this;
		/// WE BEGIN BY DETECTING FOR FLASH, DETERMINING WHETHER OR NOT IT IS INSTALLED ON THE BROWSER,
		/// AND IF IT IS, WE FIGURE OUT WHAT VERSION IS INSTALLED. THERE ARE A FEW INSTANCES WHERE YOU
		/// MAY BE ABLE TO TELL THAT FLASH IS INSTALLED, BUT NOT WHICH VERSION (THIS IS RARE) IN THOSE
		/// SITUATIONS THIS SCRIPT REPORTS THAT FLASH IS NOT PRESENT (I BELIEVE IN PLAYING IT SAFE).
			var swfStr     = false;
			var swfValue   = false;
			// for msie:
			if (typeof(ActiveXObject) != 'undefined') { 
				for (var loop = 0; loop < 50; loop++){
					try {
						var swfAxObj = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + loop);
						swfValue = loop;
					} catch(e) {  }
				}
			// for standards-based browsers:
			} else {
			    if (navigator.plugins && navigator.plugins.length > 0) {
					if (navigator.plugins['Shockwave Flash 2.0'])  { swfValue = 2; }
					if (navigator.plugins['Shockwave Flash'])      {
						swfStr = navigator.plugins['Shockwave Flash'].description;
						swfValue = swfStr.split('.')[0].substring(swfStr.split('.')[0].lastIndexOf(' '));
					}
				}
			}
			root.rev = swfValue;
			if (document.location.href.indexOf('flash=false') != -1) { root.rev = false; }
		/// THIS FUNCTION WRITES OUT THE FLASH OBJECT. IT HAS FOUR REQUIRED ARGUMENTS. THE LAST THREE ARGS
		/// SHOULD BE PRETTY SELF-EXPLANATORY (swfFile, swfWidth, swfHeight). THE FIRST ARGUMENT (parentObj)
		/// MERITS SOME EXPLANATION. parentObj CONTROLS HOW THE SWF OBJECT GETS WRITTEN INTO YOUR DOCUMENT.
		/// IF YOU SEND IT AN DOM ELEMENT REFERENCE, IT WILL WRITE THE OBJECT INTO THAT ELEMENT VIA THE 
		/// innerHTML PROPERTY. IF IT IS A STRING, IT ASSUMES THIS IS AN ELEMENT ID, AND DOES THE SAME. IF IT
		/// IS SET TO BOOLEAN false IT USES document.writeln TO WRITE THE OBJECT INTO THE DOC SYNCHRONOUSLY
		/// DURING THE PAGE LOAD. IF YOU WOULD LIKE TO INCLUDE EXTRA PARAMETERS/PROPERTIES IN YOUR FLASH
		/// OBJECT'S OBJECT/EMBED/PARAM TAGS, SEND THEM AS ADDITIONAL ARGUMENTS IN THE FORM OF 'param=value'
		/// AND THEY WILL BE WRITTEN OUT AS OBJECT PROPERTIES, PARAM ELEMENTS AND IF NECESSARY, EMBED PROPERTIES.
		/// EXTRA ARGUMENTS BEGINNING IN 'id=' WILL BE WRITTEN AS 'name=' INTO THE EMBED ELEMENT FOR MSIE, SO THERE
		/// IS NO NEED TO SEND A SEPARATE 'name=' PROPERTY.
			root.write = function(swfFile, swfWidth, swfHeight, parentObj) {
				if (arguments.length >= 4) {
				// construct the flash object string (object with attributes, params and embed with attributes)
					var xtraAttrbsObj = ' ';
						for (var loop = 4; loop < arguments.length; loop++) { xtraAttrbsObj+= ' ' +  arguments[loop].split('=')[0] + '=\"' + arguments[loop].substring((arguments[loop].indexOf('=') + 1)) + '\"' };
						var xtraAttrbsEmb = (xtraAttrbsObj.indexOf(' id=\"') != -1 || xtraAttrbsObj.indexOf(' id=\"') == 0) ? xtraAttrbsObj.split(' id=').join(' name=') : xtraAttrbsObj;
					var xtraParams = '\t\t<param name=\"movie\" value=\"' + swfFile + '\" />\n\t\t<param name=\"width\" value=\"' + swfWidth + '\" />\n\t\t<param name=\"height\" value=\"' + swfWidth + '\" />\nt\t<param name=\"swLiveConnect\" value=\"true\" />\n';
						for (var loop = 4; loop < arguments.length; loop++) { if (arguments[loop].split('=')[0] != 'id') { xtraParams+= '\t\t<param name=\"' + arguments[loop].split('=')[0] + '\" value=\"' + arguments[loop].substring((arguments[loop].indexOf('=') + 1)) + '\" />\n'}};
					var embStr = '\t\t<embed src=\"' + swfFile + '\" width=\"' + swfWidth + '\" height=\"' + swfHeight + '\" type=\"application/x-shockwave-flash\" swLiveConnect=\"true\" '  + xtraAttrbsEmb +  ' />\n';
					var objStr = '\n<object data=\"' + swfFile + '\" width=\"' + swfWidth + '\" height=\"' + swfHeight + '\" type="application/x-shockwave-flash\" swLiveConnect=\"true\" '  + xtraAttrbsObj +  '>\n' + xtraParams + embStr + '</object>\n';
				// Write with innerHTML or document.write(), depending upon the type of parentObj.
					if (parentObj) {
						var objRef = (typeof(parentObj) == 'string') ? document.getElementById(parentObj) : parentObj;
						objRef.innerHTML = objStr;
					} else {
						document.writeln(objStr);
					}
				// if the rendering engine is MSIE, fix the display of the swf ...
					if (root.engine == 'msie') { 
						var allObjects = document.getElementsByTagName('object'); 
						for (var loop = 0; loop < allObjects.length; loop++) { 
							allObjects[loop].outerHTML = allObjects[loop].outerHTML; 
						}
					}
				}
			}
		/// THE FOLLOWING FUNCTIONS ALLOW YOU TO COMMUNICATE WITH AND MANIPULATE FLASH MOVIES LOADED ON
		/// YOUR SITE, VIA JAVASCRIPT. I HAVE NOT TESTED THESE EXTENSIVELY, SO USE THEM CAREFULLY.
		///
		/// THESE DO NOT WORK IN: OMNIWEB, ICAB OR OPERA 8.5 or less (OPERA 9.0+ is ok).
			// get value of a variable in a flash movie
			root.getVar = function(swfMovie, varName) {
				try {
					var swfObj = root.getObjRef(swfMovie);
					return swfObj.GetVariable(varName);
				} catch (e) { return false; }
			}
			// set value of a variable in a flash movie
			root.setVar = function(swfMovie, varName, varValue) {
				try {
					var swfObj = root.getObjRef(swfMovie);
					swfObj.SetVariable(varName, varValue);
					return true;
				} catch (e) { return false; }
			}
			// go to a frame number (or label) in a flash movie
			root.goFrame = function(swfMovie, swfFrame, swfLayer) {
				try {
					var swfObj = root.getObjRef(swfMovie);
					var movieLayer = (swfLayer) ? swfLayer : '_level0/';
					if (typeof(swfFrame) == 'string') {
						swfObj.TGotoLabel(movieLayer, swfFrame);
					} else {
						swfObj.TGotoFrame(movieLayer, swfFrame);
					}
					return true;
				} catch (e) { return false; }
			}
			// pause playback of a flash movie
			root.pause = function(swfMovie, swfLayer) {
				try {
					var swfObj = root.getObjRef(swfMovie);
					var movieLayer = (swfLayer) ? swfLayer : '_level0/';
					swfObj.TStopPlay(movieLayer);
					return true;
				} catch (e) { return false; }
			}
			// resume playback of a flash movie
			root.play = function(swfMovie, swfLayer) {
				try {
					var swfObj = root.getObjRef(swfMovie);
					var movieLayer = (swfLayer) ? swfLayer : '_level0/';
					swfObj.TPlay(movieLayer);
					return true;
				} catch (e) { return false; }
			}
			// go to the beginning of a flash movie and
			// rests all variables etc to original state
			// this essentially reloads the entire movie
			root.rewind = function(swfMovie) {
				try {
					var swfObj = root.getObjRef(swfMovie);
					swfObj.Rewind();
					return true;
				} catch (e) { return false; }
			}
			// load a separate flash movie into a layer of an existing movie
			// set 'newSwf' to false to unload a movie from a particular layer
			root.loadMov = function(swfMovie, layer, newSwf) {
				if (!newSwf) { newSwf = ''; }
				try {
					var swfObj = root.getObjRef(swfMovie);
					swfObj.LoadMovie(layer, newSwf);
					return true;
				} catch (e) { return false; }
			}
		/// THIS IS A CODE FORKING UTILITY THAT I USE TO SIMPLIFY THE SCRIPTS ABOVE THAT COMMUNICATE
		/// WITH .SWF MOVIES EMBEDDED IN A DOCUMENT. IT JUST RETURNS THE APPROPRIATE OBJECT REFERENCE
		/// FOR THE FLASH MOVIE THAT YOU WANT TO WORK WITH, GIVEN THE BROWSER THE PAGE IS RENDERED IN.
		///
		/// THESE NOT WORK IN: OMNIWEB, ICAB OR OPERA 8.5 or less (OPERA 9.0+ is ok).
			root.getObjRef = function(swfId) {
				var objRef = false;
				if (window.document[swfId])  { objRef = window.document[swfId]; }
				if (thisClient.engine == 'msie') {
					if (document.embeds && document.embeds[swfId]) { objRef =  document.embeds[swfId]; }
				} else {
					objRef = document.getElementById(swfId);
				}
				return objRef;
			}
		}

	// initialize swfHandler object
	var swf = new swfHandler();




//	REFERENCE MATERIAL:	
//	http://www.adobe.com/support/flash/publishexport/scriptingwithflash/scriptingwithflash_03.html