// v1.7
// Flash Player Version Detection
// Detect Client Browser type
// Copyright 2005-2008 Adobe Systems Incorporated.  All rights reserved.

// Синтаксис 
//	$flash( movie:String, setting:Object ).isVersion( 9, 2 ).write();
//	$flash( movie:String, setting:Object ).isVersion( 9, 2 ).attach('player');

var $flash = window.$flash = function( movie, setting, type ) 
{ 
	var self = this;
	
	this.defaultFlashSettings = {
		codebase 	: 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0',
		quality 	: 'high',
		pluginspage : 'http://www.adobe.com/go/getflashplayer',
		align 		: 'middle',
		play 		: 'true',
		loop 		: 'true',
		scale 		: 'showall',
		wmode 		: 'transparent',
		devicefont 	: 'false',
		bgcolor 	: '#ffffff',
		menu 		: 'true',
		salign 		: '',
		allowFullScreen 	: 'false',
		allowScriptAccess 	: 'sameDomain'
	},
	
	this.init = function()
	{
		self.isIE 		= (navigator.appVersion.indexOf("MSIE") != -1) ? true : false,
		self.isWin 		= (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false,
		self.isOpera 	= (navigator.userAgent.indexOf("Opera") != -1) ? true : false,
		self.fversion 	= self.GetSwfVer(),
		self.inited 	= true;
	},
	
	this.ControlVersion = function()
	{
		var version, axo, e;
		
		// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
		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");
				
				// installed player is some revision of 6.0
				// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
				// so we have to be careful. 
				
				// default to the first public version
				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;
	},
	
	// JavaScript helper required to detect Flash Player PlugIn version information
	this.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" : "",
					flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description,
					descArray = flashDescription.split(" "),
					tempArrayMajor = descArray[2].split("."),		
					versionMajor = tempArrayMajor[0],
					versionMinor = tempArrayMajor[1],
					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 ( self.isIE && self.isWin && ! self.isOpera ) flashVer = self.ControlVersion();
		
		return flashVer;
	},
	
	this.DetectFlashVer = function( reqMajorVer, reqMinorVer, reqRevision )
	{
		var versionArray = [];
		
		if ( self.fversion == -1 ) return false;
		else if ( self.fversion != 0 ) 
		{
			if( self.isIE && self.isWin && ! self.isOpera ) 
			{
				// Given "WIN 2,0,0,11"
				tempArray         = self.fversion.split(" "); 	// ["WIN", "2,0,0,11"]
				tempString        = tempArray[1];			// "2,0,0,11"
				versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
			} 
			else versionArray      = self.fversion.split(".");
			
			var versionMajor      = versionArray[0],
				versionMinor      = versionArray[1],
				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;
	},
	
	this.AC_AddExtension = function( src, ext )
	{
	  if ( src.indexOf('?') != -1 ) return src.replace( /\?/, ext + '?' ); 
	  else return src + ext;
	},
	
	this.AC_Generateobj = function( objAttrs, params, embedAttrs ) 
	{
		var str = '';
		if ( self.isIE && self.isWin && !self.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;
	},
	
	this.AC_FL_RunContent = function( n, arg )
	{
		var ret = self.AC_GetArgs( self.createAttributtes( n, arg ), ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000", "application/x-shockwave-flash" );
		return self.AC_Generateobj( ret.objAttrs, ret.params, ret.embedAttrs );
	},
	
	this.AC_SW_RunContent = function( n, arg )
	{
		var ret = self.AC_GetArgs( self.createAttributtes( n, arg ), ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000", null );
		return self.AC_Generateobj( ret.objAttrs, ret.params, ret.embedAttrs );
	},
	
	this.AC_GetArgs = function( args, ext, srcParamName, cid, mimeType )
	{
		var ret = { embedAttrs : {}, params : {}, objAttrs : { classid : cid } }, currArg;
		
		for ( var i in args )
		{
			currArg = i.toLowerCase();

			if( currArg == 'classid' ) 
				continue;
			else if( currArg == 'pluginspage' ) 
				ret.embedAttrs[i] = args[i];
			else if( /^(src|movie)$/.test( currArg ) ) 
				args[i] = self.AC_AddExtension(args[i], ext), 
				ret.embedAttrs["src"] = args[i], 
				ret.params[srcParamName] = args[i];
			else if ( /^(on[a-z]+|type|codebase|id)$/.test( currArg ) ) 
				ret.objAttrs[i] = args[i];
			else if ( /^(width|height|align|vspace|hspace|class|title|accesskey|name|tabindex)$/.test( currArg ) ) 
				ret.embedAttrs[i] = ret.objAttrs[i] = args[i];
			else 
				ret.embedAttrs[i] = ret.params[i] = args[i];
		}
		
		if ( mimeType ) ret.embedAttrs["type"] = mimeType;
		
		return ret;
	},
	
	this.createAttributtes = function( n, arg )
	{
		for( var i in self.defaultFlashSettings )
		{
			if( ! arg[i] ) arg[i] = self.defaultFlashSettings[i];
		}
		
		arg.src = arg.movie = n;
		
		return arg;
	},
	
	this.fnGetSwf = function( c )
	{
		var 
			html = c, 
			vers = true,
			nopl = '<span class="no-flash-player">Для&nbsp;просмотра мультимедийного \
					содержимого на&nbsp;странице&nbsp;— необходим \
					<a href="' + self.defaultFlashSettings.pluginspage + 
					'" target="_blank">Adobe Flash Player</a> последней версии.</span>';
		
		return {
			write : function()
			{
				document.write( vers ? html : nopl );
			},
			attach : function(elementId)
			{
				document.getElementById(elementId).innerHTML = vers ? html : nopl;
			},
			isVersion : function( f1, f2, f3 )
			{
				vers = self.DetectFlashVer( f1, f2, f3 );
				return this;
			},
			isNoPlayer : function( str )
			{
				if( ! str ) str = '';
				nopl = str;
				return this;
			}
		}
	};
	
	if( ! this.inited ) this.init(); 
	
	var getf = ( ! type || type.toLowerCase() == 'fl' )  ? this.AC_FL_RunContent : this.AC_SW_RunContent;
	
	return new this.fnGetSwf( getf( movie, setting ) );
};
