<?xml version="1.0"?>
<!-- This provides a click-to-view capability to block flash 
     and java content in Firefox. Derived from:
     http://www.squarefree.com/userstyles/xbl.html
     and modified to allow different messages for flash and java
     by Steve Zobell. This can be placed in the rez directory in
     the Firefox install (e.g. C:\Program Files\Mozilla Firefox\res).
     
     The blocking capabilities are derived from this description:
     http://www.wlug.org.nz/MozillaNotes
     
     Add the following to userContent.css (in the chrome directory
     in the user profile):
     
/* Prevent flash animations from playing until you click on them. */
object[classid$=":D27CDB6E-AE6D-11cf-96B8-444553540000"],
object[codebase*="swflash.cab"],
object[type="application/x-shockwave-flash"],
embed[type="application/x-shockwave-flash"],
embed[src$=".swf"]
{ -moz-binding: url("resource:///res/clickToView.xml#flash"); }
 
/* Block java, with a click to load feature.  */
object[codebase*="java"],
object[type="application/java"],
embed[type="application/java"],
applet[code$=".class"]
{ -moz-binding: url("resource:///res/clickToView.xml#java"); }

-->

<bindings xmlns="http://www.mozilla.org/xbl" xmlns:html="http://www.w3.org/1999/xhtml">

<binding id="flash">
  <implementation>
    <constructor>
      <![CDATA[


var doomed = this;

// Check parent too (case of working EMBED inside broken OBJECT)
if (doomed.overrideCTV || doomed.parentNode.overrideCTV)
  return;
doomed.overrideCTV = true;

var placeholder = document.createElement("div");


// === Styling ===

var w = parseInt(doomed.width || doomed.style.width);
var h = parseInt(doomed.height || doomed.style.height);

if (!w || w < 32) w = 32; // !w catches e.g. NaN
if (!h || h < 32) h = 32;

placeholder.style.width = w + "px";
placeholder.style.height = h + "px";
placeholder.style.backgroundColor = "yellow";
placeholder.style.MozOutline = "1px solid red";
placeholder.style.textAlign = "center";
placeholder.style.color = "black";
placeholder.style.background = "white";
placeholder.style.opacity = 0.4;
placeholder.style.cursor = "pointer";
placeholder.style.overflow = "hidden";

var red = document.createElement("span");
red.style.fontWeight = "bold";
red.style.fontStyle = "italic";
red.style.color = "red";
red.appendChild(document.createTextNode("Flash"));

var text = document.createTextNode(" [[Click to play]] ");


// A button to dismiss the placeholder (instead of playing)
// Useful for those wonderful flash animations that cover
// the text on the page at the start.
var bye = document.createElement("bye");
bye.style.backgroundColor = "white";
bye.style.MozOutline = "2px solid red";
bye.style.textAlign = "center";
bye.style.color = "red";
bye.style.background = "white";
bye.style.cursor = "pointer";
bye.style.overflow = "hidden";
bye.appendChild(document.createTextNode("X"));

placeholder.appendChild(red);
placeholder.appendChild(text);
placeholder.appendChild(bye);

placeholder.onmouseover = function()
{
  this.style.MozOutline='3px outset white';
  this.style.opacity = 1.0;
  this.style.background='lightgrey'        
}
placeholder.onmouseout = function()
{
  this.style.background='white';
  this.style.opacity = 0.4;
  this.style.MozOutline='1px solid red';
}


// === Replacement ===

var p = doomed.parentNode;

// Do in a timeout to avoid bugginess
setTimeout ( function () 
{
  p.insertBefore(placeholder, doomed);
  p.removeChild(doomed); 
}, 0);

// I love closures
placeholder.onclick = function() 
{
  p.insertBefore(doomed, placeholder);
  p.removeChild(placeholder);
}

bye.onclick = function()
{
  p.removeChild(placeholder);
}

      ]]>
    </constructor>
  </implementation>
</binding>


<binding id="java">
  <implementation>
    <constructor>
      <![CDATA[


var doomed = this;

// Check parent too (case of working EMBED inside broken OBJECT)
if (doomed.overrideCTV || doomed.parentNode.overrideCTV)
  return;
doomed.overrideCTV = true;

var placeholder = document.createElement("div");


// === Styling ===

var w = parseInt(doomed.width || doomed.style.width);
var h = parseInt(doomed.height || doomed.style.height);

if (!w || w < 32) w = 32; // !w catches e.g. NaN
if (!h || h < 32) h = 32;

placeholder.style.width = w + "px";
placeholder.style.height = h + "px";
placeholder.style.backgroundColor = "yellow";
placeholder.style.MozOutline = "1px solid red";
placeholder.style.textAlign = "center";
placeholder.style.color = "black";
placeholder.style.background = "white";
placeholder.style.opacity = 0.4;
placeholder.style.cursor = "pointer";
placeholder.style.overflow = "hidden";

var red = document.createElement("span");
red.style.fontWeight = "bold";
red.style.fontStyle = "italic";
red.style.color = "red";
red.appendChild(document.createTextNode("Java"))

var text = document.createTextNode(" [[Click to play]] ");

placeholder.appendChild(red);
placeholder.appendChild(text);

// A button to dismiss the placeholder (instead of playing)
var bye = document.createElement("span");
bye.style.backgroundColor = "white";
bye.style.MozOutline = "2px solid red";
bye.style.textAlign = "center";
bye.style.color = "red";
bye.style.background = "white";
bye.style.cursor = "pointer";
bye.style.overflow = "hidden";
bye.appendChild(document.createTextNode("X"))
placeholder.appendChild(bye);

placeholder.onmouseover = function()
{
  this.style.MozOutline='3px outset white';
  this.style.opacity = 1.0;
  this.style.background='lightgrey'        
}
placeholder.onmouseout = function()
{
  this.style.background='white';
  this.style.opacity = 0.4;
  this.style.MozOutline='1px solid red';
}


// === Replacement ===

var p = doomed.parentNode;

// Do in a timeout to avoid bugginess
setTimeout ( function () 
{
  p.insertBefore(placeholder, doomed);
  p.removeChild(doomed); 
}, 0);

// I love closures
placeholder.onclick = function() 
{
  p.insertBefore(doomed, placeholder);
  p.removeChild(placeholder);
}


bye.onclick = function()
{
  p.removeChild(placeholder);
}

      ]]>
    </constructor>
  </implementation>
</binding>

</bindings>
