/* Jesse Ruderman * July 18, 2004 * * Remaining problems: * IE sometimes crashes on exit after using the this script. * In IE, it is a little ugly because IE doesn't support border-radius. * In IE, it does not work at standalone Flash URLs. * * Modified on September 3, 2006 by Phillip Bradbury to backport * changes from http://www.hrwiki.org/index.php/User:Phlip/Greasemonkey */ (function () { setTimeout(initFlashControls, 100); function initFlashControls() { var count = 0; function tt(elem) { if (typeof elem.TotalFrames != "undefined") /* do not coerce elem.StopPlay to bool, because that breaks IE */ { addFlashControls(elem); ++count; } } var i, x; for (i = 0; x = document.getElementsByTagName("object")[i]; ++i) tt(x); for (i = 0; x = document.getElementsByTagName("embed")[i]; ++i) tt(x); if (!count) alert ("No scriptable flash on this page."); } function addFlashControls(flash) { var controlsDiv = document.createElement("div"); /* Put the controls under the Flash. * * If the Flash is an in an , we do not want to touch the , because that would make * Mozilla re-test whether the is broken and reset the . So in that case, we put the controls * under the . */ var where = flash; while (where.parentNode.tagName.toLowerCase() == "object") where = where.parentNode; where.parentNode.insertBefore(controlsDiv, where.nextSibling); /* Construct controls using DOM2 instead of innerHTML. * In Mozilla, innerHTML= is like innerText= at standalone flash URLs. */ var table = document.createElement("table"); controlsDiv.appendChild(table); var row = table.insertRow(-1); var pauseButton = document.createElement("button"); pauseButton.appendChild(document.createTextNode("Pause")); var buttonCell = row.insertCell(-1); buttonCell.appendChild(pauseButton); var prevCell=row.insertCell(-1); var prevButton=document.createElement("button"); prevButton.appendChild(document.createTextNode("|<")); prevCell.appendChild(prevButton); var slider = row.insertCell(-1); slider.width = "100%"; var visibleSlider = document.createElement("div"); visibleSlider.style.position = "relative"; visibleSlider.style.height = "10px"; visibleSlider.style.width = "100%"; visibleSlider.style.MozBorderRadius = "4px"; visibleSlider.style.background = "#aaa"; slider.appendChild(visibleSlider); var thumb = document.createElement("div"); thumb.style.position = "absolute"; thumb.style.height = "20px"; thumb.style.width = "10px"; thumb.style.top = "-5px"; thumb.style.MozBorderRadius = "4px"; thumb.style.background = "#666"; visibleSlider.appendChild(thumb); var nextCell=row.insertCell(-1); var nextButton=document.createElement("button"); nextButton.appendChild(document.createTextNode(">|")); nextCell.appendChild(nextButton); var frameCell=row.insertCell(-1); var framecounter=document.createElement("div"); framecounter.style.background="#ccc"; framecounter.style.color="#000"; framecounter.style.fontWeight="bold"; frameCell.appendChild(framecounter); var framecountertext=document.createTextNode(""); framecounter.appendChild(framecountertext); var zoomOutCell=row.insertCell(-1); var zoomOutButton=document.createElement("button"); // \u2212 is − zoomOutButton.appendChild(document.createTextNode("\u2212")); zoomOutCell.appendChild(zoomOutButton); var zoomNormalCell=row.insertCell(-1); var zoomNormalButton=document.createElement("button"); zoomNormalButton.appendChild(document.createTextNode("0")); zoomNormalCell.appendChild(zoomNormalButton); var zoomInCell=row.insertCell(-1); var zoomInButton=document.createElement("button"); zoomInButton.appendChild(document.createTextNode("+")); zoomInCell.appendChild(zoomInButton); var sliderWidth; var paused = false; var dragging = false; table.width = Math.max(parseInt(flash.width) || 0, 400); addEvent(pauseButton, "click", pauseUnpause); addEvent(prevButton,"click",prevFrame); addEvent(nextButton,"click",nextFrame); addEvent(zoomOutButton,"click",zoomOut); addEvent(zoomNormalButton,"click",zoomNormal); addEvent(zoomInButton,"click",zoomIn); addEvent(slider, "mousedown", drag); addEvent(slider, "drag", function() { return false; }); /* For IE */ window.setInterval(update, 30); function pauseUnpause() { paused = !paused; pauseButton.style.borderStyle = paused ? "inset" : ""; if (paused) flash.StopPlay(); else flash.Play(); } function prevFrame(){flash.GotoFrame(flash.CurrentFrame()-1);} function nextFrame(){flash.GotoFrame(flash.CurrentFrame()+1);} function zoomIn(){flash.Zoom(67);} function zoomOut(){flash.Zoom(150);} function zoomNormal(){flash.Zoom(0);} function update() { sliderWidth=parseInt(getWidth(slider)-getWidth(thumb)); tot=totalFrames(); if (tot > 0) { frame=flash.CurrentFrame(); if (framecountertext) framecountertext.nodeValue="\xA0"+(frame+1)+"/"+tot+"\xA0"; if(!dragging) { thumb.style.left=parseInt(frame/tot*sliderWidth)+"px"; paused=!flash.IsPlaying(); pauseButton.style.borderStyle=paused?"inset":""; } } else if (framecountertext) { framecountertext.nodeValue="\xA0Loading...\xA0"; } } function dragMousemove(e) { var pageX = e.clientX + document.body.scrollLeft; /* cross-browser, unlike e.pageX, which IE does not support */ var pos = bounds(0, pageX - getX(slider) - 5, sliderWidth); var frame = bounds(1, Math.ceil(totalFrames() * pos / sliderWidth), totalFrames() - 2); thumb.style.left = pos + "px"; flash.GotoFrame(frame); } function release(e) { removeEvent(document, "mousemove", dragMousemove); removeEvent(document, "mouseup", release); if (!paused) flash.Play(); dragging = false; } function drag(e) { addEvent(document, "mousemove", dragMousemove); addEvent(document, "mouseup", release); dragging = true; dragMousemove(e); } /* Boring functions, some of which only exist to hide differences between IE and Mozilla. */ function bounds(min, val, max) { return Math.min(Math.max(min, val), max); } function totalFrames() { /* This is weird. TotalFrames differs between IE and Mozilla. CurrentFrame does not. */ if (typeof flash.TotalFrames == "number") return flash.TotalFrames; /* IE */ else if (typeof flash.TotalFrames == "function") return flash.TotalFrames(); /* Mozilla */ else return 1; /* Partially loaded Flash in IE? */ } function getWidth(elem) { if (document.defaultView && document.defaultView.getComputedStyle) return parseFloat(document.defaultView.getComputedStyle(elem,null).getPropertyValue("width")); /* Mozilla */ else return parseFloat(elem.offsetWidth); /* IE (currentStyle.width can be "auto" or "100%") */ } function getX(elem) { if (!elem) return 0; return (elem.offsetLeft) + getX(elem.offsetParent); } function addEvent(elem, eventName, fun) { if (elem.addEventListener) /* Mozilla */ elem.addEventListener(eventName, fun, false); else /* IE */ elem.attachEvent("on" + eventName, fun); } function removeEvent(elem, eventName, fun) { if (elem.addEventListener) elem.removeEventListener(eventName, fun, false); else elem.detachEvent("on" + eventName, fun); } } })()