<?xml version="1.0"?>

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

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


function flashblockCreatePlaceholder(isStandalone) {
	// Create placeholder
	var flashblockCreateElement;
	var placeholder;
	placeholder = document.createElementNS( "http://www.w3.org/1999/xhtml", "div"); 
	
	placeholder.isStandalone = isStandalone;
	return placeholder;
}

// Substitute the animation with a placeholder
function flashblockShowPlaceholder() {
	// Just in case the object has been moved away from under our feet during
	// the timeout, re-assign the parent node. See bug 13680
	// parent = current.parentNode;
	var newParent = current.parentNode;
	parent = newParent ? newParent : parent;

	// Fix for Flashblock Bug 22168 (Node was not found" code: "8").
	// if the LSB is 1, it means the nodes are unrelated (e.g. different window).
	if (current.compareDocumentPosition(parent)&1)
		return;

	parent.insertBefore(placeholder, current);
	if(placeholder.isStandalone) {
		placeholder.flashblock = "frame";
		if ("StopPlay" in current)
			current.StopPlay();
		if ("LoadMovie" in current)
			current.LoadMovie(0, "");
		current.prevWidth = current.width;
		current.prevHeight = current.height;
		current.width = current.height = 0;
	} else {
		placeholder.flashblock = "normal";
		parent.removeChild(current); 
	}
}

// Show the original animation
function flashblockShowFlash(event) {
	if( event.type == "keypress" && event.keyCode != KeyEvent.DOM_VK_RETURN)
		return false;
	event.stopPropagation();
	var parent = placeholder.parentNode;
	if(placeholder.flashblock == "frame") {
		current.height = current.prevHeight;
		current.width = current.prevWidth;
		current.src = placeholder.title;
		if ("LoadMovie" in current)
			current.LoadMovie(0, current.src);
	} else {
		parent.insertBefore(current, placeholder);
		if (placeholder.hasAttribute("srcAttribute")) {
			current.setAttribute("src", placeholder.getAttribute("srcAttribute"));
		}
		if (placeholder.hasAttribute("movieAttribute")) {
			current.setAttribute("movie", placeholder.getAttribute("movieAttribute"));
		}
		if (placeholder.hasAttribute("dataAttribute")) {
			current.setAttribute("data", placeholder.getAttribute("dataAttribute"));
		}
		if (placeholder.movieParam) {
			var mparam = placeholder.movieParam;
			mparam[0].value = mparam[1];
		}
		if (placeholder.srcParam) {
			var mparam = placeholder.srcParam;
			mparam[0].value = mparam[1];
		}
		if (placeholder.sourceParam) {
			var mparam = placeholder.sourceParam;
			mparam[0].value = mparam[1];
		}
	}
	parent.removeChild(placeholder);
}

function flashblockIsWhitelisted(node, type) {
	// Check if the page that loaded the Flash site is whitelisted
	// Thanks to Neil on #mozilla for suggesting this method, I would never have
	// thought of it on my own. :-)
	// Lor 20041215: Use "UIEvents" to make it work in post-1.0 FF
	// (thanks to Neil again)
	document.QueryInterface(Components.interfaces.nsIDOMDocument);
	var flashblockEvent = document.createEvent("UIEvents");
	if(flashblockEvent) {
		var evt = type == "silverlight" ? "silverblockCheckLoad" : "flashblockCheckLoad";
		flashblockEvent.initEvent(evt, true, true);
		node.dispatchEvent(flashblockEvent);
		if(flashblockEvent.getPreventDefault() == true) {
			// Whitelisted
			return true;
		}
	}
	return false;
}

function flashblockSetImage(placeholder, type) {
	var inactiveurl = "url(chrome://flashblock/content/" + type + ".png) no-repeat center";
	var playimage = "url(chrome://flashblock/content/flashplay.png)";
	switch (type) {
		case "silverlight":
			playimage = "url(chrome://flashblock/content/silverplay.png)";
			break;
		default:
			break;
	}
	var activeurl = playimage + " no-repeat center";
	placeholder.setAttribute("bgInactive", inactiveurl);
	placeholder.setAttribute("bgActive", activeurl);
	placeholder.style.setProperty("background", inactiveurl, "important");
}

function flashblockStylePlaceholder(flash, placeholder, isStandalone) {
	// If object's size was relative, use that.
	// Otherwise, set size to minimum 32x32 px
	placeholder.style.setProperty("min-width", "32px", "important");
	placeholder.style.setProperty("min-height", "32px", "important");
	// The size and positioning may come from a class
	var fClass = flash.getAttribute("class");
	if (fClass)
		placeholder.setAttribute("class", fClass);

	var fStyle = window.getComputedStyle(flash, "");

	var fWidth = fStyle.getPropertyValue("width");
	var width = parseInt(flash.width || flash.style.width);
	if (fWidth && parseInt(fWidth) > 32)
		width = fWidth;
	else if(flash.width.match("%$"))
		width = flash.width;
	else if (width)
			width = Math.max(width,32) + "px";
	else
		width = "32px"
	placeholder.style.width = width;

	var fHeight = fStyle.getPropertyValue("height");
	var height = parseInt(flash.height || flash.style.height);
	if (fHeight && parseInt(fHeight) > 32)
		height = fHeight;
	else if(flash.height.match("%$"))
		height = flash.height;
	else if (height)
		height = Math.max(height,32) + "px";
	else 
		height = "32px"
	placeholder.style.height = height;

	// Add styling rules to placeholder div.
	placeholder.style.border = "1px solid #dfdfdf";
	placeholder.style.cursor = "pointer";
	placeholder.style.overflow = "hidden";
	var disp = fStyle.getPropertyValue("display");
	placeholder.style.display = disp == "block" ? "block" : "inline-block";
	placeholder.style.setProperty("visibility", "visible", "important");
	placeholder.style.setProperty("opacity", "100", "important");

	// The size of the placeholder should include borders too,
	// otherwise scrollbars appear for blocked standalone objects
	placeholder.style.MozBoxSizing = "border-box";

	// Make some style adjustments since the placeholder is a <div>
	// element instead of a <embed>, <object>, ... element.
	// An <embed> will be centered if the parent has
	// 'text-align: center' but a <div> will not. This code fixes that.
	var parentStyle = window.getComputedStyle(flash.parentNode, "");
	if (parentStyle.getPropertyValue("text-align") == "center") {
		placeholder.style.marginRight = "auto";
		placeholder.style.marginLeft = "auto";
	}
}

function flashblockSetTitle(current, placeholder, isStandalone) {
	// non-null "about:blank" value to prevent OS/2 crashing
	var fakeURI = "about:blank";
	if (isStandalone) {
		placeholder.title = current.src;
		current.src = fakeURI;
	}
	else if (current.hasAttribute("src") ||
			(current.hasAttribute("data") && !/application\/x-silverlight/.test(current.getAttribute("data"))) ||
			current.hasAttribute("movie") ) {
		var srcURI = current.getAttribute("src") ||
			current.getAttribute("movie") ||
			current.getAttribute("data") ;
		placeholder.title = srcURI;
		if (current.hasAttribute("src")) {
			placeholder.setAttribute("srcAttribute", current.getAttribute("src"));
			current.setAttribute("src", fakeURI);
		}
		if (current.hasAttribute("data")) {
			placeholder.setAttribute("dataAttribute", current.getAttribute("data"));
			current.setAttribute("data", fakeURI);
		}
		if (current.hasAttribute("movie")) {
			placeholder.setAttribute("movieAttribute", current.getAttribute("movie"));
			current.setAttribute("movie", fakeURI);
		}
	}
	else {
		var params = current.getElementsByTagName("param");
		for (var ii = 0; ii < params.length; ii++) {
			if (params[ii].getAttribute("name") == "movie" &&
				params[ii].hasAttribute("value")) {
				placeholder.title = params[ii].value;
				placeholder.movieParam = [ params[ii], placeholder.title ];
				params[ii].value = fakeURI;
				break;
			}
			if (params[ii].getAttribute("name") == "src" &&
				params[ii].hasAttribute("value")) {
				placeholder.title = params[ii].value;
				placeholder.srcParam = [ params[ii], placeholder.title ];
				params[ii].value = fakeURI;
				break;
			}
			if (params[ii].getAttribute("name") == "source" &&
				params[ii].hasAttribute("value")) {
				placeholder.title = params[ii].value;
				placeholder.sourceParam = [ params[ii], placeholder.title ];
				params[ii].value = fakeURI;
				break;
			}
		}
	}
}

var type = this.flashblockType ? this.flashblockType : "flash"
if (/silverlight|ag-plugin/i.test(this.getAttribute("type")) ||
    /32C73088-76AE-40F7-AC40-81F62CB2C1DA/i.test(this.getAttribute("classid")) ) {
  type = "silverlight";
}

if(flashblockIsWhitelisted(this, type))
    return;

var current = this;
var parent = current.parentNode;

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

// Flowplayer specific workaround.
var flow = parent.getAttribute("href");
if (flow) {
    var prevDef = function (event) {
        event.preventDefault();
        event.currentTarget.removeEventListener("load", arguments.callee, true);
    }
    parent.addEventListener("click", prevDef , true)
}

// Create placeholder div
var isStandalone = ("src" in current && current.src == current.ownerDocument.location);
var placeholder = flashblockCreatePlaceholder(isStandalone);

// Set placeholder image
flashblockSetImage(placeholder, type);

flashblockStylePlaceholder(current, placeholder, isStandalone);

flashblockSetTitle(current, placeholder, isStandalone);

// Replace the flash document with a placeholder.
window.setTimeout(flashblockShowPlaceholder, 0);


// Change the placeholder background when the mouse enters/exits the div.
placeholder.addEventListener("mouseover",
function(event) {event.target.style.setProperty("background",
                                                 event.target.getAttribute("bgActive"),
                                                 "important"); },
"false"
);
placeholder.addEventListener("mouseout",
function(event) {event.target.style.setProperty("background",
                                                 event.target.getAttribute("bgInactive"),
                                                 "important"); },
"false"
);

// Replace the placeholder with the flash document.
placeholder.addEventListener("click", flashblockShowFlash, "false");

// Accessibility
placeholder.setAttribute("tabindex", "0");
placeholder.setAttribute("role", "button");
placeholder.addEventListener("keypress", flashblockShowFlash, "false");

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

<binding id="director" extends="#flash">
  <implementation>
    <field name="flashblockType">"director"</field>
  </implementation>
</binding>

<binding id="authorware" extends="#flash">
  <implementation>
    <field name="flashblockType">"authorware"</field>
  </implementation>
</binding>

<binding id="silverlight" extends="#flash">
  <implementation>
    <field name="flashblockType">"silverlight"</field>
  </implementation>
</binding>

<binding id="brokenobject">
  <implementation>

    <field name="brokenObject">"yes"</field>

    <constructor>
        <![CDATA[

function flashblockCreatePlaceholder(isStandalone) {
	// Create placeholder
	var flashblockCreateElement;
	var placeholder;
	placeholder = document.createElementNS( "http://www.w3.org/1999/xhtml", "div"); 
	
	placeholder.isStandalone = isStandalone;
	return placeholder;
}

// Substitute the animation with a placeholder
function flashblockShowPlaceholder() {
	// Just in case the object has been moved away from under our feet during
	// the timeout, re-assign the parent node. See bug 13680
	// parent = current.parentNode;
	var newParent = current.parentNode;
	parent = newParent ? newParent : parent;

	// Fix for Flashblock Bug 22168 (Node was not found" code: "8").
	// if the LSB is 1, it means the nodes are unrelated (e.g. different window).
	if (current.compareDocumentPosition(parent)&1)
		return;

	parent.insertBefore(placeholder, current);
	if(placeholder.isStandalone) {
		placeholder.flashblock = "frame";
		if ("StopPlay" in current)
			current.StopPlay();
		if ("LoadMovie" in current)
			current.LoadMovie(0, "");
		current.prevWidth = current.width;
		current.prevHeight = current.height;
		current.width = current.height = 0;
	} else {
		placeholder.flashblock = "normal";
		parent.removeChild(current); 
	}
}

// Show the original animation
function flashblockShowFlash(event) {
	if( event.type == "keypress" && event.keyCode != KeyEvent.DOM_VK_RETURN)
		return false;
	event.stopPropagation();
	var parent = placeholder.parentNode;
	if(placeholder.flashblock == "frame") {
		current.height = current.prevHeight;
		current.width = current.prevWidth;
		current.src = placeholder.title;
		if ("LoadMovie" in current)
			current.LoadMovie(0, current.src);
	} else {
		parent.insertBefore(current, placeholder);
		if (placeholder.hasAttribute("srcAttribute")) {
			current.setAttribute("src", placeholder.getAttribute("srcAttribute"));
		}
		if (placeholder.hasAttribute("movieAttribute")) {
			current.setAttribute("movie", placeholder.getAttribute("movieAttribute"));
		}
		if (placeholder.hasAttribute("dataAttribute")) {
			current.setAttribute("data", placeholder.getAttribute("dataAttribute"));
		}
		if (placeholder.movieParam) {
			var mparam = placeholder.movieParam;
			mparam[0].value = mparam[1];
		}
		if (placeholder.srcParam) {
			var mparam = placeholder.srcParam;
			mparam[0].value = mparam[1];
		}
		if (placeholder.sourceParam) {
			var mparam = placeholder.sourceParam;
			mparam[0].value = mparam[1];
		}
	}
	parent.removeChild(placeholder);
}

function flashblockIsWhitelisted(node, type) {
	// Check if the page that loaded the Flash site is whitelisted
	// Thanks to Neil on #mozilla for suggesting this method, I would never have
	// thought of it on my own. :-)
	// Lor 20041215: Use "UIEvents" to make it work in post-1.0 FF
	// (thanks to Neil again)
	document.QueryInterface(Components.interfaces.nsIDOMDocument);
	var flashblockEvent = document.createEvent("UIEvents");
	if(flashblockEvent) {
		var evt = type == "silverlight" ? "silverblockCheckLoad" : "flashblockCheckLoad";
		flashblockEvent.initEvent(evt, true, true);
		node.dispatchEvent(flashblockEvent);
		if(flashblockEvent.getPreventDefault() == true) {
			// Whitelisted
			return true;
		}
	}
	return false;
}

function flashblockSetImage(placeholder, type) {
	var inactiveurl = "url(chrome://flashblock/content/" + type + ".png) no-repeat center";
	var playimage = "url(chrome://flashblock/content/flashplay.png)";
	switch (type) {
		case "silverlight":
			playimage = "url(chrome://flashblock/content/silverplay.png)";
			break;
		default:
			break;
	}
	var activeurl = playimage + " no-repeat center";
	placeholder.setAttribute("bgInactive", inactiveurl);
	placeholder.setAttribute("bgActive", activeurl);
	placeholder.style.setProperty("background", inactiveurl, "important");
}

function flashblockStylePlaceholder(flash, placeholder, isStandalone) {
	// If object's size was relative, use that.
	// Otherwise, set size to minimum 32x32 px
	placeholder.style.setProperty("min-width", "32px", "important");
	placeholder.style.setProperty("min-height", "32px", "important");
	// The size and positioning may come from a class
	var fClass = flash.getAttribute("class");
	if (fClass)
		placeholder.setAttribute("class", fClass);

	var fStyle = window.getComputedStyle(flash, "");

	var fWidth = fStyle.getPropertyValue("width");
	var width = parseInt(flash.width || flash.style.width);
	if (fWidth && parseInt(fWidth) > 32)
		width = fWidth;
	else if(flash.width.match("%$"))
		width = flash.width;
	else if (width)
			width = Math.max(width,32) + "px";
	else
		width = "32px"
	placeholder.style.width = width;

	var fHeight = fStyle.getPropertyValue("height");
	var height = parseInt(flash.height || flash.style.height);
	if (fHeight && parseInt(fHeight) > 32)
		height = fHeight;
	else if(flash.height.match("%$"))
		height = flash.height;
	else if (height)
		height = Math.max(height,32) + "px";
	else 
		height = "32px"
	placeholder.style.height = height;

	// Add styling rules to placeholder div.
	placeholder.style.border = "1px solid #dfdfdf";
	placeholder.style.cursor = "pointer";
	placeholder.style.overflow = "hidden";
	var disp = fStyle.getPropertyValue("display");
	placeholder.style.display = disp == "block" ? "block" : "inline-block";
	placeholder.style.setProperty("visibility", "visible", "important");
	placeholder.style.setProperty("opacity", "100", "important");

	// The size of the placeholder should include borders too,
	// otherwise scrollbars appear for blocked standalone objects
	placeholder.style.MozBoxSizing = "border-box";

	// Make some style adjustments since the placeholder is a <div>
	// element instead of a <embed>, <object>, ... element.
	// An <embed> will be centered if the parent has
	// 'text-align: center' but a <div> will not. This code fixes that.
	var parentStyle = window.getComputedStyle(flash.parentNode, "");
	if (parentStyle.getPropertyValue("text-align") == "center") {
		placeholder.style.marginRight = "auto";
		placeholder.style.marginLeft = "auto";
	}
}

function flashblockSetTitle(current, placeholder, isStandalone) {
	// non-null "about:blank" value to prevent OS/2 crashing
	var fakeURI = "about:blank";
	if (isStandalone) {
		placeholder.title = current.src;
		current.src = fakeURI;
	}
	else if (current.hasAttribute("src") ||
			(current.hasAttribute("data") && !/application\/x-silverlight/.test(current.getAttribute("data"))) ||
			current.hasAttribute("movie") ) {
		var srcURI = current.getAttribute("src") ||
			current.getAttribute("movie") ||
			current.getAttribute("data") ;
		placeholder.title = srcURI;
		if (current.hasAttribute("src")) {
			placeholder.setAttribute("srcAttribute", current.getAttribute("src"));
			current.setAttribute("src", fakeURI);
		}
		if (current.hasAttribute("data")) {
			placeholder.setAttribute("dataAttribute", current.getAttribute("data"));
			current.setAttribute("data", fakeURI);
		}
		if (current.hasAttribute("movie")) {
			placeholder.setAttribute("movieAttribute", current.getAttribute("movie"));
			current.setAttribute("movie", fakeURI);
		}
	}
	else {
		var params = current.getElementsByTagName("param");
		for (var ii = 0; ii < params.length; ii++) {
			if (params[ii].getAttribute("name") == "movie" &&
				params[ii].hasAttribute("value")) {
				placeholder.title = params[ii].value;
				placeholder.movieParam = [ params[ii], placeholder.title ];
				params[ii].value = fakeURI;
				break;
			}
			if (params[ii].getAttribute("name") == "src" &&
				params[ii].hasAttribute("value")) {
				placeholder.title = params[ii].value;
				placeholder.srcParam = [ params[ii], placeholder.title ];
				params[ii].value = fakeURI;
				break;
			}
			if (params[ii].getAttribute("name") == "source" &&
				params[ii].hasAttribute("value")) {
				placeholder.title = params[ii].value;
				placeholder.sourceParam = [ params[ii], placeholder.title ];
				params[ii].value = fakeURI;
				break;
			}
		}
	}
}

function isBrokenFlash(element) {
	var params = element.getElementsByTagName("param");
	var isFlash = false;
	for (var ii = 0; ii < params.length; ii++) {
		var pvalue = params[ii].getAttribute("value");
		if (/\.swf/i.test(pvalue))
			return true;
		var pname = params[ii].getAttribute("name");
		if (/movie/i.test(pname))
			return true;
	}
	var embeds = element.getElementsByTagName("embed");
	for (var jj = 0; jj < embeds.length; jj++) {
		var embed = embeds[jj];
		if (/x-shockwave-flash/i.test(embed.getAttribute("type")) ||
			/\.swf/i.test(embed.getAttribute("src"))) {
			return true;
		}
	}
	return false;
}

var type = this.flashblockType ? this.flashblockType : "flash"
if (/silverlight|ag-plugin/i.test(this.getAttribute("type")) ||
    /32C73088-76AE-40F7-AC40-81F62CB2C1DA/i.test(this.getAttribute("classid")) ) {
  type = "silverlight";
}

if(flashblockIsWhitelisted(this, type))
    return;

if (!isBrokenFlash(this))
    return;

var current = this;
var parent = current.parentNode;

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

// Flowplayer specific workaround.
var flow = parent.getAttribute("href");
if (flow) {
	var prevDef = function (event) {
		event.preventDefault();
		event.currentTarget.removeEventListener("load", arguments.callee, true);
	}
	parent.addEventListener("click", prevDef , true)
}

// Create placeholder div
var isStandalone = ("src" in current && current.src == current.ownerDocument.location);
var placeholder = flashblockCreatePlaceholder(isStandalone);

// Set placeholder image
flashblockSetImage(placeholder, type);

flashblockStylePlaceholder(current, placeholder, isStandalone);

flashblockSetTitle(current, placeholder, isStandalone);

// Replace the flash document with a placeholder.
window.setTimeout(flashblockShowPlaceholder, 0, placeholder, current, parent);


// Change the placeholder background when the mouse enters/exits the div.
placeholder.addEventListener("mouseover",
function(event) {event.target.style.setProperty("background",
                                                 event.target.getAttribute("bgActive"),
                                                 "important"); },
"false"
);
placeholder.addEventListener("mouseout",
function(event) {event.target.style.setProperty("background",
                                                 event.target.getAttribute("bgInactive"),
                                                 "important"); },
"false"
);

// Replace the placeholder with the flash document.
placeholder.addEventListener("click", flashblockShowFlash, "false");

// Accessibility
placeholder.setAttribute("tabindex", "0");
placeholder.setAttribute("role", "button");
placeholder.addEventListener("keypress", flashblockShowFlash, "false");

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

<binding id="sifr-replaced">
  <implementation>
    <constructor>
        <![CDATA[

document.QueryInterface(Components.interfaces.nsIDOMDocument);
event = document.createEvent("UIEvents");

if(event) {
	event.initEvent("flashblockCheckLoad", true, true);
	this.dispatchEvent(event);
	if(event.getPreventDefault() == true) {
		// Whitelisted
		return;
	}
}

this.style.height = 0;
this.style.width = 0;
this.style.setProperty("display", "none", "important");
this.style.position ="absolute";
this.style.overflow ="hidden";
        ]]>
    </constructor>
  </implementation>
</binding>

<binding id="sifr-alternate">
  <implementation>
    <constructor>
        <![CDATA[

document.QueryInterface(Components.interfaces.nsIDOMDocument);
var event = document.createEvent("UIEvents");

if(event) {
	event.initEvent("flashblockCheckLoad", true, true);
	this.dispatchEvent(event);
	if(event.getPreventDefault() == true) {
		// Whitelisted
		return;
	}
}

this.style.setProperty("visibility", "visible", "important");
placeholder.style.setProperty("opacity", "100", "important");
this.style.setProperty("display", "block", "important");
this.style.setProperty("left", "auto", "important");
this.style.setProperty("top", "auto", "important");
this.style.setProperty("height", "auto", "important");
this.style.setProperty("width", "auto", "important");
//this.style.position = "static";
this.style.setProperty("position", "static", "important");
        ]]>
    </constructor>
  </implementation>
</binding>

</bindings>
