﻿/*
    @author MiRacLe <http://miracle.wordpress.com>
    @sinse 14.04.2006
    @version 0.7
    @see http://blog.deconcept.com/swfobject/
    @see http://miracle.wordpress.com/2006/04/14/flash-activex-ie-update/
     
     Что это такое:
        Это скрипт для "ленивых" - тех кто не хочет переписывать старый код,не может переписать "сто тыщ милёнов" "старых" файлов, не умеет в конце-концов пользовать swfobject для внедрения флешек в Html-код
     
     Для чего это нужно:   
        в IE появились "рамки" вокруг activeX элементов и тултип с предложением кликнуть на объект для того чтобы его активизировать. только после клика будут работать элементы управления в самой флешке.
        Именно для того чтобы эти рамки не появлялись был произведён на свёт этот скрипт
        
     Как это использовать:
      положить на сервер этот файл, положить на сервер файл swfobject.js (ссылка на него написана выше)
      добавить на страницу содержащую flash-ки код
      <script language="JavaScript1.2" type="text/javascript" src="/path/to/swfobject.js"></script>    
      <script language="JavaScript1.2" type="text/javascript" src="/path/to/flash_replacer.js"></script>    
       
       Как это  работает:
           Скрипт создаёт div перед тегом object, создаёт swfobject, переписывает большую часть параметров из "старого" object, "выдёргивает" flashvars из Embed, пишет вновь созданный object в
           ранее созданный div и удаляет из дерева DOM "старый" object
        
      Чем это лучше чем простой obj.outerHTML = obj.outerHTML:
        тем что сохраняются flashvars (пока только при наличии embed внутри object) ,
        тем что IE "падает" из-за утечки памяти в первом случае
        
    @changelog 21.04.2006
        в IE версий ниже 6-ой нет возможности получить objectObj.getElementsByTagName('param') }
        поэтому теперь flashvars извлекаются из objectObj.altHTML - свойство содержащее html с embed и добавляются только если они найдены (в v.0.1 добавлялись в любом случае)
    @changelog 24.04.2006
       обработчик навешивается только в IE 6 (в пятом рамки вокруг флеша мной не были замечены, но зато замечены падения браузера после переписывания outerHTML)
    @changelog 26.04.2006
        flashvars-ов может не быть ( object.altHTML.match(/flashvars/).length == undefined) 
    @changelog 27.04.2006
        добавил toLowerCase() - для getAttribute('classid')
        некоторые флешки вставляются с embed без object - добавил ещё один пробег по ним
    @changelog 11.05.2006
        исправил регулярку, с помощью которой искались flashvars ( может быть многострочный flashvars)
    @changelog 22.05.2006      
      появилась информация о том что рамки вокруг ActiveX появились только в WIN XP IE 6 - добавилась соответсвующая проверка 
      появился массив __FlashObjs (для того чтобы не перебирать заново все флешки в window.unload)
      повесил на window.unload удаление outerHTML у swf-ок ( ie иногда падал из-за memory leak ) 
      убрал функцию addOnLoadEvent
    @changelog 23.05.2006            
        Немного "оптимизировал" циклы и удалил переменные после использования
    @changelog 24.05.2006            
        workaround для flashvars, которые вставляются как src="movie.swf?param1=value&param2=value2"
    @changelog 30.06.2006
        Используем SWFObject для внедрения флешек, флешки с рамками просто удаляем из дерева DOM.
*/
if ('undefined' != typeof SWFObject) {
    var doggy = new Function();
    doggy.prototype.__init = function() {
        if (this.isIE6) {
            this.doReplace();
            return true;
        } else {
            return false;
        }
    }
    doggy.prototype.doReplace = function() {
      var objs = document.getElementsByTagName('object');
      if (objs && objs.length) {   
        var objs_length = objs.length; // слегка ускоряем работу
        for (var i = 0; i < objs_length; i++) {
            if (objs[i].getAttribute('classid').toLowerCase() == 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000') {
              var FlashVars = false;
              var params = (objs[i].altHtml) ? objs[i].altHtml : false;
              if (params.length) {
                var tmp = params.match(/flashvars="([^\"]+)"/i);
                if (tmp && tmp.length == 2) {
                  FlashVars = tmp[1];
                } else {
                    var tmp = params.match(/src="([^\"]+)"/i);
                    if (tmp && tmp.length == 2) {
                        var _tmp = tmp[1].split('?');
                        if (_tmp && _tmp.length == 2) {
                            FlashVars = _tmp[1];
                        }
                    }
                }
              }                   
              var __div = document.createElement('div');
              var __id = 'swf__' + i;
              __div.setAttribute('id',__id);
              var __ver = '7.0.0.0'; // по умолчанию можно и 7
              if (objs[i].codeBase) { // Выдёргиваем версию из codeBase
                var __tmp = objs[i].codeBase.split('=');               
                if (__tmp[1]) {
                    __ver = __tmp[1].replace(/\,/g,'.');
                }
              }
              var movie = new SWFObject(objs[i].Movie,__id,objs[i].width,objs[i].height,__ver,'#' + objs[i].BGColor);
              movie.addParam('FlashVars',FlashVars);
              movie.addParam('wmode',objs[i].WMode);
              movie.addParam('menu',objs[i].Menu);
              movie.addParam('loop',objs[i].Loop);
              movie.addParam('scale',objs[i].Scale);
              movie.addParam('AlignMode',objs[i].AlignMode);
              objs[i].insertAdjacentElement("beforeBegin",__div);
              objs[i].removeNode(true);                    
              movie.write(__id);          
            }
        }
      }
    
    }
    doggy.prototype.isIE6 = function() {
        // функцию нашёл тут -> http://forums.swishzone.com/index.php?showtopic=34521&view=findpost&p=153337  
          // only for Win IE 6+
          // But not in Windows 98, Me, NT 4.0, 2000
          var strBrwsr= navigator.userAgent.toLowerCase();
          if (strBrwsr.indexOf("msie") > -1 && strBrwsr.indexOf("mac") < 0) {
            if (parseInt(strBrwsr.charAt(strBrwsr.indexOf("msie")+5)) < 6) {
              return false;
            }
            if (strBrwsr.indexOf("win98") > -1 ||
               strBrwsr.indexOf("win 9x 4.90") > -1 ||
               strBrwsr.indexOf("winnt4.0") > -1 ||
               strBrwsr.indexOf("windows nt 5.0") > -1)
            {
              return false;
            }
            return true;
          } else {
            return false;
          }    
    }
  
if (typeof (window.__doggyWasInit) == 'undefined') {
    window.__doggyWasInit = true;  // Предупреждаем повторный запуск этой функции 
    if (typeof window.onload == 'function') {
        var __oldOnload = window.onload;
    }
    window.onload = function() {
        (new doggy).__init();
        if (typeof __oldOnload == 'function')    __oldOnload();    
    }
}

} else {
    function getSwfObject() {
        window.defaultStatus = 'please visit http://blog.deconcept.com/swfobject/ for downloading swfobject.js';
        window.setInterval('window.defaultStatus = " " + window.defaultStatus',145);
        window.setInterval("window.defaultStatus = 'please visit http://blog.deconcept.com/swfobject/ for downloading swfobject.js';", 10000);
    }   
    getSwfObject();    
}
	