﻿// ======================================================================================
// Script responsável por embedar flash contornando erros e incompatibilidades conhecidos
// Autor: Cassiano Coria Neto
// ======================================================================================

function SWFUtil()
{
    this.isIE  = (navigator.appVersion.toLowerCase().indexOf("msie") > -1) ? true : false;
    this.isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
    //this.useOuter = (document.documentElement.outerHTML ? true : false);

    /**************************************************
    
    Parametros:
        - swfPath: Caminho do arquivo flash 
            ex: "../movies/MeuFlash.swf"
        - requiredVersion: versão do flash necessária
            ex: "9,0,115" ou "8,0,0"
        - name: nome a ser colocado na tag <embed> 
            ex: "MeuFlash"
        - id: id a ser colocado na tag <object> 
            ex: "MeuFlash"
        - flashVars: objeto com as variáveis flash 
            ex: var myflashvars = {exibitionName:"Cassiano", age: 25};
        - flashParams: parametros do flash
            ex: var myflashparams = {menu: "false",allowFullScreen: "true",allowscriptaccess: "always"};
            
    OBS: Os ÚNICOs parametros adicionados automaticamente são: classid
    */
	/**
	 * Método Embed: Escreve o flash na tela de acordo com os parametros preenchidos
	 * @param {string} swfPath
	 * @param {string} width
	 * @param {string} height
	 * @param {Object} divId
	 * @param {string} requiredVersion
	 * @param {string} name
	 * @param {string} id
	 * @param {Object} flashVars
	 * @param {Object} flashParams
	 */
    this.Embed = function(swfPath, width, height, divId, requiredVersion, name, id, flashVars, flashParams)
    {
        //capturando o div
        var divToWrite = document.getElementById(divId);
        
        //verificando se o div existe
        if(!divToWrite)
        {
            alert("Div Não encontrado: " + divId);
            
            return;
        }
        
        //verifica se possui a versão requirida
        this.requiredVersion = requiredVersion;
        this.hasRequiredVersion = this.HasVersionOrMajor(requiredVersion);
        
        /* variável que conterá o embed ou object */
        var stringEmbed;
        if(this.isIE && this.isWin)
        {
            stringEmbed = this.CreateObject(swfPath, width, height, id, flashVars, flashParams);
        }
        else
        {
            stringEmbed = this.CreateEmbbed(swfPath, width, height, name, flashVars, flashParams);
        }
        
        //verificando se foi preenchido e escrevendo de acordo com o parametro do construtor
        if(stringEmbed != null)
        {
            if(this.isIE)
            {                
                divToWrite.outerHTML = "<div id="+divId+">" + stringEmbed + "</div>";
                
                window.onunload = function() {
                    if (document.getElementsByTagName) {
                        var objectsTAG = document.getElementsByTagName("object");
                        for (i=0; i<objectsTAG.length; i++) {
                            objectsTAG[i].outerHTML = "";
                        }
                    }
                };
            }
            else
                divToWrite.innerHTML = stringEmbed;
        }
    };
    
    //Cria uma tag embed
    this.CreateEmbbed = function(swfPath, width, height, name, flashVars, flashParams)
    {
        var embbedTag = '<embed \n src="'+swfPath+'" \n name="'+name+'" ';
        embbedTag += '\n width="'+width+'" \n height="'+height+'" ';
        
        //percorrendo os campos
        for(param in flashParams)
        {
            if(IsValidParam(param))
            {   
                embbedTag += '\n';
                embbedTag += ' ' + param;
                embbedTag += '="';
                embbedTag += GetFieldValue(flashParams, param);
                embbedTag += '"';
            }
        }
        
        //adicionando as flashvars
        var flashVarsStr = '\n flashvars="';
        flashVarsStr += GetFlashVars(flashVars);
        flashVarsStr += '" ';
                
        embbedTag += flashVarsStr;
        embbedTag += " />";
        
        return embbedTag;
    };
    
    //Cria uma tag object
    this.CreateObject = function(swfPath, width, height, id, flashVars, flashParams)
    {
        //tentativa de embed sem classid.. o type seria usado no lugar dele
        var objectTag = '<object id="'+id+'" \n classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" '
                        + '\n width="'+width+'"\n height="'+height+'"\n id="'+id+'"';
        
        //caso possua uma versão menor do que a requirida
        if(this.hasRequiredVersion == false)
            objectTag += '\n codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version='
                                    + this.requiredVersion + '"';
        
        objectTag += '>';
        
        objectTag += '\n <param name="movie" value="';
        objectTag += swfPath;
        objectTag += '" />';
        
        //percorrendo os campos
        for(param in flashParams)
        {
            if(IsValidParam(param))
            {   
                objectTag += '\n <param name="' + param;
                objectTag += '" value="';
                objectTag += GetFieldValue(flashParams, param);
                objectTag += '" />';
            }
        }
        
        //adicionando as flashvars
        objectTag += '\n <param name="flashvars" value="';
        objectTag += GetFlashVars(flashVars);
        objectTag += '" /></object>';     
        
        return objectTag;
    };
    
    //======================================================
    // Métodos de suporte embed e object
    
    //captura o falor de um campo do objeto
    var GetFieldValue = function(object, param)
    {
        return eval('object.'+param);
    };
    
    //cria a "querystring" de flashvars
    var GetFlashVars = function(flashVarsObject)
    {
        var flashVars = "";
        
        //percorrendo o array de vars
        for(fvar in flashVarsObject)
        {
            if(IsValidParam(fvar))
            {
                flashVars += fvar + "=";
                flashVars += GetFieldValue(flashVarsObject, fvar);
                flashVars += "&";
            }
        }
        // retirando o último &
        flashVars = flashVars.substr(0,flashVars.length-1);
        
        return flashVars;
    };
    
    //verfivica se o parametro não é uma função do objeto
    var IsValidParam = function(param)
    {
        return( param != "getType" 
                && param != "toJSON"
                && param != "serverSerializer");
    };
    //======================================================
    
    //verifica se o usuário possui uma versão igual ou maior à requirida
    this.HasVersionOrMajor = function(requiredVersion)
    {
        var reqVersions = requiredVersion.indexOf(".") > -1 ? 
                                            requiredVersion.split(".") : requiredVersion.split(",");
        
        //capturando o array de versões instaladas no cliente
        var actualVersions = this.GetPluginVersion;
        
        //comparando as versões                        
        if(parseInt(reqVersions[0]) > parseInt(actualVersions[0]))
            return false;
        else if(parseInt(reqVersions[1]) > parseInt(actualVersions[1]))
            return false;
        else if(parseInt(reqVersions[2]) > parseInt(actualVersions[2]))
            return false;
        
        return true;
    };
    
    this.GetPluginVersion = function()
    {
        var versionArray;
         
        if (navigator.plugins != null && navigator.plugins.length > 0) 
	    {
	        versionArray = GetMozilaVersion();
	    }
	    else if(this.isIE && this.isWin)
	    {
	        versionArray = GetIEVersion();
	    }
	    
	    //alert(versionArray[0] + "," + versionArray[1] + "," + versionArray[2]);
	    return versionArray;
    };
    
    var GetIEVersion = function()
    {
        try 
        {
            var versionArray = new Array();
            
	        var objActiveX = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
	        var localVersion = objActiveX.GetVariable("$version");
	        var versions = localVersion.split(",");
	        
	        versionArray[0] = versions[0].split(" ")[1]; // Versão
		    versionArray[1] = versions[1]; // Versão da Versão
		    versionArray[2] = versions[2]; // Revisão

		    return versionArray;
        }
        catch (err) 
        {
            alert("Erro ao detectar versão do flash. " + err);
            
            return null;
        }
    };
    
    var GetMozilaVersion = function()
    {
        var versionArray = new Array();
        var description;
	        
	    if (navigator.plugins["Shockwave Flash 2.0"]) 
	        description = navigator.plugins["Shockwave Flash 2.0"].description;
	    else if ( navigator.plugins["Shockwave Flash"]) 
	        description = navigator.plugins["Shockwave Flash"].description;
	    
        //verificando se a versão foi detectada
        if(description != null)
        {
            var descriptions = description.split(" ");
            var versions = descriptions[2].split(".");
            versionArray[0] = versions[0]; //Versão
		    versionArray[1] = versions[1]; //Versão da Versão
		    
		    //Detectando a Revisão correta
		    versionArray[2] = descriptions[3] == "" ? descriptions[4] : descriptions[3];
		    if (versionArray[2][0] == "d") {
			    versionArray[2] = versionArray[2].substring(1);
		    } else if (versionArray[2][0] == "r") {
			    versionArray[2] = versionArray[2].substring(1);
			    if (versionArray[2].indexOf("d") > 0) {
				    versionArray[2] = versionArray[2].substring(0, versionArray[2].indexOf("d"));
			    }
		    }
	    }
	    else
	    {
	        alert("Erro ao detectar versão");
	        
	        return null;
	    }
	    
	    return versionArray;
    };
};