Флеш перекрывает всплывающие окна и выпадающие менюшки — как решить проблему

Казалось, меня уже трудно удивить каким-то подводным камнем при разработке простого сайта: ставишь CMS, администратор через свою панель наполняет сайт — работы на два дня. Сайт содержал в себе галлереи фотографий, поэтому заморачиваться никто не стал и воспользовались готовым решением — fancybox, которое кстати позволяет еще не только картинки красиво показывать, но и любые всплывающие окна. Все были счастливы и довольны, пока заказчик не начал вставлять в текст ролики с youtube.com. Получалось, что при появлении всплывающего окна ролик все равно оказывался выше и мало того, он был кликабелен, что не есть гуд.
Решение более чем простое, как казалось, надо всего навсего роликам добавлять wmode=»opaque». Но тут первые сложности:
1) нельзя об этом забывать, а рано или поздно такое случится
2) придется вручную перебирать все уже существующие записи и добавлять это свойство.

Решения нашлось два:
Решаем эту проблему на javascript используя jquery:

$(document).ready(function(){
$("object").each(
function () {
$(this).append('<param name="wmode" value="transparent">');
}
);

$("embed").each(
function () {
$(this).attr("wmode", "transparent");
}
);
}

Казалось бы, все хорошо, даже firebug показывает что свойства применены и все круто, а проблема осталась. Почему?
Просто флеш рендерится сразу при загрузке и  использует те свойства что были изначально, дальше что ты с ним не делай — не поможет.

Решение нашлось такое — нам нужно в DOMе прибить элемент и создать его заново, но уже с нужными нам параметрами. Для этого к приведенному выше коду добавляем следующее:

$("object").each(
function () {
var cont = $(this).parent().html();
$(this).replaceWith(cont);
}
);

В принципе решение весьма работающее, даже в придурочном ИЕ, но есть один минус — мы нагружаем браузер. Для этого есть второй способ

Добавляем нужные нам свойства, используя php:

$sContent = mb_convert_encoding( $sContent, 'HTML-ENTITIES', 'utf-8');
$objDOM = new DOMDocument();
$objDOM->loadHTML( $sContent );

$objectsObject = $objDOM->getElementsByTagName('object');

foreach($objectsObject as $Object)
{
$isFound = false;
$isFoundEmbed = false;

$objectsParam = $Object->getElementsByTagName('param');
foreach( $objectsParam as $param)
{
/* @var $param DOMElement */
if( $param->getAttribute('name') == "wmode"){
$param->setAttribute('value', 'opaque');
$isFound= true;
}

}

if(!$isFound){
$paramElement = $objDOM->createElement('param');
$paramElement->setAttribute('name','wmode');
$paramElement->setAttribute('value','opaque');
$Object->appendChild($paramElement);
}

$objectsEmbed = $Object->getElementsByTagName('embed');
foreach( $objectsEmbed as $embed)
{
$embed->setAttribute('wmode', 'opaque');
}

}
$replaceedArray = array(
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">',
'<html><body>','</body></html>'
);
$sContent = str_replace($replaceedArray,'', html_entity_decode($objDOM->saveHTML(),ENT_COMPAT, 'UTF-8' ));

Как вы уже догадались, текст для вывода на страницу хранится в переменной $sContent. Код вряд ли оптимален, поэтому, если у кого есть пожелания и исправления милости прошу в комментарии.Вызвать эту функцию лучше при сохранении текста в базу, но можно и при выводе, что правда не лучшее решение. Еще, прошу заметить, что у меня сайт в кодировке utf-8, поэтому используя другую, не забудьте внести изменения в функцию. Для решения с помощью php возможно стоило бы применить Zend_Dom_Query о котором я писал уже ранее, но хватило вроде как и стандартных средств.
[ad name=»Adsense»]