/**
 * swfworks
 * 
 * script to embed swfs dynamically into page
 * dervied from orginal AC_RunActiveContent Script
 * 
 * @author Klaus Mikosch
 * @date   09/03/09
 * @modifed 11/03/09
 * 
 * now with loadOnClick
 */

swfWorks = {
		
		argList : { width:				'100%',
					height: 			'100%',
					src:				'',
					wmode:				'window',
					id:					'flashContent',
					bgcolor:			'#ffffff',
					name:				'flashContent',
					menu:				'false',
					allowScriptAccess:	'sameDomain',
					allowFullScreen:	'false',
					movie:				'',
					flashvars:			'',
					align:				'middle'
					
		},
		aSWFlist: new Array ()
		,
		isIE:(navigator.appVersion.indexOf("MSIE") != -1) ? true : false,
		isWin:(navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false,	
		isOpera:(navigator.userAgent.indexOf("Opera") != -1) ? true : false
		,
		/**
		 * loadOnClick
		 * create a placeholder div an place a placeholder image inside
		 * 
		 * @param oArguments [argument list for swf object]
		 * @param playerVersion needed Player Version
		 * @param [optional] clickImage 
		 * @param [optional] width of the click Image
		 * @param [optional] height of the click Image
		 */
		loadOnClick: function (oArguments, playerVersion) {
			
			
			var clickImage = 'media/images/clickToActivate.png';
			var cImageWidth = 128;
			var cImageHeight = 30;
			if (swfWorks.loadOnClick.arguments[3]!=undefined) cImageWidth = swfWorks.loadOnClick.arguments[3];
			if (swfWorks.loadOnClick.arguments[4]!=undefined) cImageHeight = swfWorks.loadOnClick.arguments[4];
			if (swfWorks.loadOnClick.arguments[2]!=undefined) clickImage = swfWorks.loadOnClick.arguments[2];
			
			this.aSWFlist[oArguments.id] = {args:oArguments, plV:playerVersion, clickImage:clickImage, cWidth:cImageWidth, cHeight:cImageHeight};
			
			document.write (this.createDiv (oArguments.id, oArguments.width, oArguments.height,oArguments.bgcolor, clickImage, cImageWidth, cImageHeight));
		},
		/**
		 * createDiv
		 * creates a placeholder object for the swf
		 * @param	id 
		 * @param 	width
		 * @param	height
		 * @param	bgcolor
		 * @param 	cImage
		 * @param	cWidth
		 * @param	cHeight
		 */
		createDiv: function (id, width, height, bgcolor, cImage, cWidth, cHeight) {
			var sContent = "<div id=\"swfBox_" + id + "\" onclick=\"javascript:swfWorks.load ( '"+id+"');\" style=\"width:"+width + "; height:" + height+"; background-color:"+bgcolor+"; cursor:pointer;\">";
			sContent+='<div title="clickToActivate" style="width:100%; height:100%; background-image:url(\''+cImage+'\'); background-repeat:no-repeat;background-position:center center;">';
			sContent+='</div></div>';
			return sContent;
		}
		,
		/**
		 * load
		 * fill the placeholder div with life
		 * @param	id 
		 */
		load: function (id) {
			var targetContainer = document.getElementById ("swfBox_"+ id);
			targetContainer.innerHTML = this.create (this.aSWFlist[id].args, this.aSWFlist[id].plV, true);
		},
		/**
		 * reset all SWFs on this side to onClick
		 */
		resetToLoadOnClickAll: function () {
			
			for (var p in this.aSWFlist) {
				this.resetToLoadOnClick (p);
			}
			
		},
		/**
		 * reset a single SWF on this side to on Click behaviour
		 * @param  	id
		 */
		resetToLoadOnClick: function (id) {
			
			var targetContaniner = document.getElementById ('swfBox_' + id);
			var oSWF = this.aSWFlist[id];
			targetContaniner.innerHTML = this.createDiv (oSWF.args.id, oSWF.args.width, oSWF.args.height,oSWF.args.bgcolor, oSWF.clickImage, oSWF.cWidth, oSWF.cHeight);
			
		}
		,
		/**
		 * create
		 * @param 	oArguments
		 * @param	playerVersin
		 */
		create: function (oArguments, playerVersion) {
			
			var argCopy = this.argList;
			
			for (var p in oArguments) {
				if (argCopy[p]!=undefined) {
					argCopy[p] =oArguments[p];
				}
			}
			
			var plVersionComa = playerVersion.split (".").join (",");
			var sContent;
			if (this.flashPlayerVersion (playerVersion)) {
				
				sContent = this.FlashContent ('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='.plVersionComa,
								  'width', argCopy.width,
								  'height', argCopy.height,
								  'src', argCopy.src,
								  'quality', 'high',
								  'pluginspace',  'http://www.macromedia.com/go/getflashplayer',
								  'align', argCopy.align,
								  'play', 'true',
								  'loop', 'true',
								  'scale', 'showall',
								  'wmode', argCopy.wmode,
								  'id',    argCopy.id,
								  'bgcolor', argCopy.bgcolor,
								  'name', argCopy.name,
								  'menu', argCopy.menu,
								  'allowScriptAccess', argCopy.allowScriptAccess,
								  'allowFullScreen', argCopy.allowFullScreen,
								  'flashvars', argCopy.flashvars);
				
			} else {
				sContent = '<a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a>';
				
			}
			
			if (swfWorks.create.arguments.length==3) {
				if (swfWorks.create.arguments[2]==true) return sContent;
				
			}
			else document.write (sContent);
		}
		,
		FlashContent:function (){
		
			var ret = this.AC_GetArgs
			    (  this.FlashContent.arguments, "", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
			     , "application/x-shockwave-flash"
			);
			return this.AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
		},
		AC_AddExtension: function (src, ext) {
		  
			if (src.indexOf('?') != -1) return src.replace(/\?/, ext+'?'); 
			else return src + ext;
		},
		AC_GetArgs: function (args, ext, srcParamName, classid, mimeType){
			  
			var ret = new Object();
			ret.embedAttrs = new Object();
			ret.params = new Object();
			ret.objAttrs = new Object();
			for (var i=0; i < args.length; i=i+2){
			   var currArg = args[i].toLowerCase();    
			   switch (currArg){	
			   case "classid":
			   break;
			   case "pluginspage":
			   ret.embedAttrs[args[i]] = args[i+1];
			   break;
			   case "src":
			   case "movie":	
			        args[i+1] = this.AC_AddExtension(args[i+1], ext);
			        ret.embedAttrs["src"] = args[i+1];
			        ret.params[srcParamName] = args[i+1];
			        break;
			      case "onafterupdate":
			      case "onbeforeupdate":
			      case "onblur":
			      case "oncellchange":
			      case "onclick":
			      case "ondblclick":
			      case "ondrag":
			      case "ondragend":
			      case "ondragenter":
			      case "ondragleave":
			      case "ondragover":
			      case "ondrop":
			      case "onfinish":
			      case "onfocus":
			      case "onhelp":
			      case "onmousedown":
			      case "onmouseup":
			      case "onmouseover":
			      case "onmousemove":
			      case "onmouseout":
			      case "onkeypress":
			      case "onkeydown":
			      case "onkeyup":
			      case "onload":
			      case "onlosecapture":
			      case "onpropertychange":
			      case "onreadystatechange":
			      case "onrowsdelete":
			      case "onrowenter":
			      case "onrowexit":
			      case "onrowsinserted":
			      case "onstart":
			      case "onscroll":
			      case "onbeforeeditfocus":
			      case "onactivate":
			      case "onbeforedeactivate":
			      case "ondeactivate":
			      case "type":
			      case "codebase":
			      case "id":
			        ret.objAttrs[args[i]] = args[i+1];
			        break;
			      case "width":
			      case "height":
			      case "align":
			      case "vspace": 
			      case "hspace":
			      case "class":
			      case "title":
			      case "accesskey":
			      case "name":
			      case "tabindex":
			        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
			        break;
			      default:
			        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
			    }
			  }
			  ret.objAttrs["classid"] = classid;
			  if (mimeType) ret.embedAttrs["type"] = mimeType;
			  return ret;
			},

			AC_Generateobj: function (objAttrs, params, embedAttrs) 
			{ 
			  var str = '';
			  if (this.isIE && this.isWin && !this.isOpera)
			  {
			    str += '<object ';
			    for (var i in objAttrs)
			    {
			      str += i + '="' + objAttrs[i] + '" ';
			    }
			    str += '>';
			    for (var i in params)
			    {
			      str += '<param name="' + i + '" value="' + params[i] + '" /> ';
			    }
			    str += '</object>';
			  }
			  else
			  {
			    str += '<embed ';
			    for (var i in embedAttrs)
			    {
			    	
			      str += i + '="' + embedAttrs[i] + '" ';
			    }
			    str += '> </embed>';
			  }
			  return str;
			 
			},

			flashPlayerVersion:function  (fMinVersion)
			{
				var vSplit = fMinVersion.split (".");
				
				var reqMajorVer= vSplit[0];
				var reqMinorVer= vSplit[1];
				var reqRevision= vSplit[2];
				
				versionStr = this.GetSwfVer();
				if (versionStr == -1 ) {
					return false;
				} else if (versionStr != 0) {
					if(this.isIE && this.isWin && !this.isOpera) {
						// Given "WIN 2,0,0,11"
						tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
						tempString        = tempArray[1];			// "2,0,0,11"
						versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
					} else {
						versionArray      = versionStr.split(".");
					}
					var versionMajor      = versionArray[0];
					var versionMinor      = versionArray[1];
					var versionRevision   = versionArray[2];

			        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
					if (versionMajor > parseFloat(reqMajorVer)) {
						return true;
					} else if (versionMajor == parseFloat(reqMajorVer)) {
						if (versionMinor > parseFloat(reqMinorVer))
							return true;
						else if (versionMinor == parseFloat(reqMinorVer)) {
							if (versionRevision >= parseFloat(reqRevision))
								return true;
						}
					}
					return false;
				}
			}
			,
			GetSwfVer: function (){
				// NS/Opera version >= 3 check for Flash plugin in plugin array
				var flashVer = -1;
				
				if (navigator.plugins != null && navigator.plugins.length > 0) {
					if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
						var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
						var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
						var descArray = flashDescription.split(" ");
						var tempArrayMajor = descArray[2].split(".");			
						var versionMajor = tempArrayMajor[0];
						var versionMinor = tempArrayMajor[1];
						var versionRevision = descArray[3];
						if (versionRevision == "") {
							versionRevision = descArray[4];
						}
						if (versionRevision[0] == "d") {
							versionRevision = versionRevision.substring(1);
						} else if (versionRevision[0] == "r") {
							versionRevision = versionRevision.substring(1);
							if (versionRevision.indexOf("d") > 0) {
								versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
							}
						}
						var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
					}
				}
				// MSN/WebTV 2.6 supports Flash 4
				else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
				// WebTV 2.5 supports Flash 3
				else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
				// older WebTV supports Flash 2
				else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
				else if ( this.isIE && this.isWin && !this.isOpera ) {
					flashVer = this.ControlVersion();
				}	
				return flashVer;
			}
			,
			ControlVersion: function ()
			{
				var version;
				var axo;
				var e;

				try {
					// version will be set for 7.X or greater players
					axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
					version = axo.GetVariable("$version");
				} catch (e) {
				}

				if (!version)
				{
					try {
						// version will be set for 6.X players only
						axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
						
						version = "WIN 6,0,21,0";

						// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
						axo.AllowScriptAccess = "always";

						// safe to call for 6.0r47 or greater
						version = axo.GetVariable("$version");

					} catch (e) {
					}
				}

				if (!version)
				{
					try {
						// version will be set for 4.X or 5.X player
						axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
						version = axo.GetVariable("$version");
					} catch (e) {
					}
				}

				if (!version)
				{
					try {
						// version will be set for 3.X player
						axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
						version = "WIN 3,0,18,0";
					} catch (e) {
					}
				}

				if (!version)
				{
					try {
						// version will be set for 2.X player
						axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
						version = "WIN 2,0,0,11";
					} catch (e) {
						version = -1;
					}
				}
				
				return version;
			}
}


