SWFObject probably shouldn't be in the repo. On 3/15/14 6:00 PM, "jmcl...@apache.org" <jmcl...@apache.org> wrote:
>Repository: flex-flexunit >Updated Branches: > refs/heads/develop fede2751f -> 360e38257 > > >http://git-wip-us.apache.org/repos/asf/flex-flexunit/blob/64592fdd/FlexUni >t4Tutorials/Unit4/startx/FlexUnit4Training_wt3/html-template/swfobject.js >---------------------------------------------------------------------- >diff --git >a/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/html-template/swfo >bject.js >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/html-template/swfo >bject.js >new file mode 100644 >index 0000000..c862aae >--- /dev/null >+++ >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/html-template/swfo >bject.js >@@ -0,0 +1,793 @@ >+/* >+ * Licensed to the Apache Software Foundation (ASF) under one or more >+ * contributor license agreements. See the NOTICE file distributed with >+ * this work for additional information regarding copyright ownership. >+ * The ASF licenses this file to You under the Apache License, Version >2.0 >+ * (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * >+ * http://www.apache.org/licenses/LICENSE-2.0 >+ * >+ * Unless required by applicable law or agreed to in writing, software >+ * distributed under the License is distributed on an "AS IS" BASIS, >+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >implied. >+ * See the License for the specific language governing permissions and >+ * limitations under the License. >+ */ >+/*! SWFObject v2.2 <http://code.google.com/p/swfobject/> >+ is released under the MIT License ><http://www.opensource.org/licenses/mit-license.php> >+*/ >+ >+var swfobject = function() { >+ >+ var UNDEF = "undefined", >+ OBJECT = "object", >+ SHOCKWAVE_FLASH = "Shockwave Flash", >+ SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", >+ FLASH_MIME_TYPE = "application/x-shockwave-flash", >+ EXPRESS_INSTALL_ID = "SWFObjectExprInst", >+ ON_READY_STATE_CHANGE = "onreadystatechange", >+ >+ win = window, >+ doc = document, >+ nav = navigator, >+ >+ plugin = false, >+ domLoadFnArr = [main], >+ regObjArr = [], >+ objIdArr = [], >+ listenersArr = [], >+ storedAltContent, >+ storedAltContentId, >+ storedCallbackFn, >+ storedCallbackObj, >+ isDomLoaded = false, >+ isExpressInstallActive = false, >+ dynamicStylesheet, >+ dynamicStylesheetMedia, >+ autoHideShow = true, >+ >+ /* Centralized function for browser feature detection >+ - User agent string detection is only used when no good >alternative is >possible >+ - Is executed directly for optimal performance >+ */ >+ ua = function() { >+ var w3cdom = typeof doc.getElementById != UNDEF && typeof >doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, >+ u = nav.userAgent.toLowerCase(), >+ p = nav.platform.toLowerCase(), >+ windows = p ? /win/.test(p) : /win/.test(u), >+ mac = p ? /mac/.test(p) : /mac/.test(u), >+ webkit = /webkit/.test(u) ? >parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // >returns either the webkit version or false if not webkit >+ ie = !+"\v1", // feature detection based on Andrea >Giammarchi's >solution: >http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser >-is-ie.html >+ playerVersion = [0,0,0], >+ d = null; >+ if (typeof nav.plugins != UNDEF && typeof >nav.plugins[SHOCKWAVE_FLASH] >== OBJECT) { >+ d = nav.plugins[SHOCKWAVE_FLASH].description; >+ if (d && !(typeof nav.mimeTypes != UNDEF && >nav.mimeTypes[FLASH_MIME_TYPE] && >!nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // >navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin >indicates whether plug-ins are enabled or disabled in Safari 3+ >+ plugin = true; >+ ie = false; // cascaded feature detection for >Internet Explorer >+ d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); >+ playerVersion[0] = >parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); >+ playerVersion[1] = >parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); >+ playerVersion[2] = /[a-zA-Z]/.test(d) ? >parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; >+ } >+ } >+ else if (typeof win.ActiveXObject != UNDEF) { >+ try { >+ var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); >+ if (a) { // a will return null when ActiveX is >disabled >+ d = a.GetVariable("$version"); >+ if (d) { >+ ie = true; // cascaded feature >detection for Internet Explorer >+ d = d.split(" ")[1].split(","); >+ playerVersion = [parseInt(d[0], >10), parseInt(d[1], 10), >parseInt(d[2], 10)]; >+ } >+ } >+ } >+ catch(e) {} >+ } >+ return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, >win:windows, >mac:mac }; >+ }(), >+ >+ /* Cross-browser onDomLoad >+ - Will fire an event as soon as the DOM of a web page is loaded >+ - Internet Explorer workaround based on Diego Perini's solution: >http://javascript.nwbox.com/IEContentLoaded/ >+ - Regular onload serves as fallback >+ */ >+ onDomLoad = function() { >+ if (!ua.w3) { return; } >+ if ((typeof doc.readyState != UNDEF && doc.readyState == >"complete") >|| (typeof doc.readyState == UNDEF && >(doc.getElementsByTagName("body")[0] || doc.body))) { // function is >fired after onload, e.g. when script is inserted dynamically >+ callDomLoadFunctions(); >+ } >+ if (!isDomLoaded) { >+ if (typeof doc.addEventListener != UNDEF) { >+ doc.addEventListener("DOMContentLoaded", >callDomLoadFunctions, >false); >+ } >+ if (ua.ie && ua.win) { >+ doc.attachEvent(ON_READY_STATE_CHANGE, >function() { >+ if (doc.readyState == "complete") { >+ >doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); >+ callDomLoadFunctions(); >+ } >+ }); >+ if (win == top) { // if not inside an iframe >+ (function(){ >+ if (isDomLoaded) { return; } >+ try { >+ >doc.documentElement.doScroll("left"); >+ } >+ catch(e) { >+ >setTimeout(arguments.callee, 0); >+ return; >+ } >+ callDomLoadFunctions(); >+ })(); >+ } >+ } >+ if (ua.wk) { >+ (function(){ >+ if (isDomLoaded) { return; } >+ if >(!/loaded|complete/.test(doc.readyState)) { >+ setTimeout(arguments.callee, 0); >+ return; >+ } >+ callDomLoadFunctions(); >+ })(); >+ } >+ addLoadEvent(callDomLoadFunctions); >+ } >+ }(); >+ >+ function callDomLoadFunctions() { >+ if (isDomLoaded) { return; } >+ try { // test if we can really add/remove elements to/from the >DOM; we >don't want to fire it too early >+ var t = >doc.getElementsByTagName("body")[0].appendChild(createElement("span")); >+ t.parentNode.removeChild(t); >+ } >+ catch (e) { return; } >+ isDomLoaded = true; >+ var dl = domLoadFnArr.length; >+ for (var i = 0; i < dl; i++) { >+ domLoadFnArr[i](); >+ } >+ } >+ >+ function addDomLoadEvent(fn) { >+ if (isDomLoaded) { >+ fn(); >+ } >+ else { >+ domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() >is only >available in IE5.5+ >+ } >+ } >+ >+ /* Cross-browser onload >+ - Based on James Edwards' solution: >http://brothercake.com/site/resources/scripts/onload/ >+ - Will fire an event as soon as a web page including all of its >assets >are loaded >+ */ >+ function addLoadEvent(fn) { >+ if (typeof win.addEventListener != UNDEF) { >+ win.addEventListener("load", fn, false); >+ } >+ else if (typeof doc.addEventListener != UNDEF) { >+ doc.addEventListener("load", fn, false); >+ } >+ else if (typeof win.attachEvent != UNDEF) { >+ addListener(win, "onload", fn); >+ } >+ else if (typeof win.onload == "function") { >+ var fnOld = win.onload; >+ win.onload = function() { >+ fnOld(); >+ fn(); >+ }; >+ } >+ else { >+ win.onload = fn; >+ } >+ } >+ >+ /* Main function >+ - Will preferably execute onDomLoad, otherwise onload (as a >fallback) >+ */ >+ function main() { >+ if (plugin) { >+ testPlayerVersion(); >+ } >+ else { >+ matchVersions(); >+ } >+ } >+ >+ /* Detect the Flash Player version for non-Internet Explorer browsers >+ - Detecting the plug-in version via the object element is more >precise >than using the plugins collection item's description: >+ a. Both release and build numbers can be detected >+ b. Avoid wrong descriptions by corrupt installers provided by >Adobe >+ c. Avoid wrong descriptions by multiple Flash Player entries >in the >plugin Array, caused by incorrect browser imports >+ - Disadvantage of this method is that it depends on the >availability >of the DOM, while the plugins collection is immediately available >+ */ >+ function testPlayerVersion() { >+ var b = doc.getElementsByTagName("body")[0]; >+ var o = createElement(OBJECT); >+ o.setAttribute("type", FLASH_MIME_TYPE); >+ var t = b.appendChild(o); >+ if (t) { >+ var counter = 0; >+ (function(){ >+ if (typeof t.GetVariable != UNDEF) { >+ var d = t.GetVariable("$version"); >+ if (d) { >+ d = d.split(" ")[1].split(","); >+ ua.pv = [parseInt(d[0], 10), >parseInt(d[1], 10), parseInt(d[2], >10)]; >+ } >+ } >+ else if (counter < 10) { >+ counter++; >+ setTimeout(arguments.callee, 10); >+ return; >+ } >+ b.removeChild(o); >+ t = null; >+ matchVersions(); >+ })(); >+ } >+ else { >+ matchVersions(); >+ } >+ } >+ >+ /* Perform Flash Player and SWF version matching; static publishing only >+ */ >+ function matchVersions() { >+ var rl = regObjArr.length; >+ if (rl > 0) { >+ for (var i = 0; i < rl; i++) { // for each registered >object element >+ var id = regObjArr[i].id; >+ var cb = regObjArr[i].callbackFn; >+ var cbObj = {success:false, id:id}; >+ if (ua.pv[0] > 0) { >+ var obj = getElementById(id); >+ if (obj) { >+ if >(hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk >< 312)) { // Flash Player version >= published SWF version: Houston, we >have a match! >+ setVisibility(id, true); >+ if (cb) { >+ cbObj.success = >true; >+ cbObj.ref = >getObjectById(id); >+ cb(cbObj); >+ } >+ } >+ else if >(regObjArr[i].expressInstall && canExpressInstall()) { // >show the Adobe Express Install dialog if set by the web page author and >if supported >+ var att = {}; >+ att.data = >regObjArr[i].expressInstall; >+ att.width = >obj.getAttribute("width") || "0"; >+ att.height = >obj.getAttribute("height") || "0"; >+ if >(obj.getAttribute("class")) { att.styleclass = >obj.getAttribute("class"); } >+ if >(obj.getAttribute("align")) { att.align = >obj.getAttribute("align"); } >+ // parse HTML object >param element's name-value pairs >+ var par = {}; >+ var p = >obj.getElementsByTagName("param"); >+ var pl = p.length; >+ for (var j = 0; j < pl; >j++) { >+ if >(p[j].getAttribute("name").toLowerCase() != "movie") { >+ >par[p[j].getAttribute("name")] = p[j].getAttribute("value"); >+ } >+ } >+ showExpressInstall(att, >par, id, cb); >+ } >+ else { // Flash Player and SWF >version mismatch or an older Webkit >engine that ignores the HTML object element's nested param elements: >display alternative content instead of SWF >+ displayAltContent(obj); >+ if (cb) { cb(cbObj); } >+ } >+ } >+ } >+ else { // if no Flash Player is installed or >the fp version cannot >be detected we let the HTML object element do its job (either show a SWF >or alternative content) >+ setVisibility(id, true); >+ if (cb) { >+ var o = getObjectById(id); // >test whether there is an HTML object >element or not >+ if (o && typeof o.SetVariable >!= UNDEF) { >+ cbObj.success = true; >+ cbObj.ref = o; >+ } >+ cb(cbObj); >+ } >+ } >+ } >+ } >+ } >+ >+ function getObjectById(objectIdStr) { >+ var r = null; >+ var o = getElementById(objectIdStr); >+ if (o && o.nodeName == "OBJECT") { >+ if (typeof o.SetVariable != UNDEF) { >+ r = o; >+ } >+ else { >+ var n = o.getElementsByTagName(OBJECT)[0]; >+ if (n) { >+ r = n; >+ } >+ } >+ } >+ return r; >+ } >+ >+ /* Requirements for Adobe Express Install >+ - only one instance can be active at a time >+ - fp 6.0.65 or higher >+ - Win/Mac OS only >+ - no Webkit engines older than version 312 >+ */ >+ function canExpressInstall() { >+ return !isExpressInstallActive && hasPlayerVersion("6.0.65") && >(ua.win || ua.mac) && !(ua.wk && ua.wk < 312); >+ } >+ >+ /* Show the Adobe Express Install dialog >+ - Reference: >http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 >+ */ >+ function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { >+ isExpressInstallActive = true; >+ storedCallbackFn = callbackFn || null; >+ storedCallbackObj = {success:false, id:replaceElemIdStr}; >+ var obj = getElementById(replaceElemIdStr); >+ if (obj) { >+ if (obj.nodeName == "OBJECT") { // static publishing >+ storedAltContent = abstractAltContent(obj); >+ storedAltContentId = null; >+ } >+ else { // dynamic publishing >+ storedAltContent = obj; >+ storedAltContentId = replaceElemIdStr; >+ } >+ att.id = EXPRESS_INSTALL_ID; >+ if (typeof att.width == UNDEF || (!/%$/.test(att.width) >&& >parseInt(att.width, 10) < 310)) { att.width = "310"; } >+ if (typeof att.height == UNDEF || >(!/%$/.test(att.height) && >parseInt(att.height, 10) < 137)) { att.height = "137"; } >+ doc.title = doc.title.slice(0, 47) + " - Flash Player >Installation"; >+ var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", >+ fv = "MMredirectURL=" + >encodeURI(window.location).toString().replace(/&/g,"%26") + >"&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; >+ if (typeof par.flashvars != UNDEF) { >+ par.flashvars += "&" + fv; >+ } >+ else { >+ par.flashvars = fv; >+ } >+ // IE only: when a SWF is loading (AND: not available >in cache) wait >for the readyState of the object element to become 4 before removing it, >+ // because you cannot properly cancel a loading SWF >file without >breaking browser load references, also obj.onreadystatechange doesn't work >+ if (ua.ie && ua.win && obj.readyState != 4) { >+ var newObj = createElement("div"); >+ replaceElemIdStr += "SWFObjectNew"; >+ newObj.setAttribute("id", replaceElemIdStr); >+ obj.parentNode.insertBefore(newObj, obj); // >insert placeholder div >that will be replaced by the object element that loads expressinstall.swf >+ obj.style.display = "none"; >+ (function(){ >+ if (obj.readyState == 4) { >+ obj.parentNode.removeChild(obj); >+ } >+ else { >+ setTimeout(arguments.callee, >10); >+ } >+ })(); >+ } >+ createSWF(att, par, replaceElemIdStr); >+ } >+ } >+ >+ /* Functions to abstract and display alternative content >+ */ >+ function displayAltContent(obj) { >+ if (ua.ie && ua.win && obj.readyState != 4) { >+ // IE only: when a SWF is loading (AND: not available >in cache) wait >for the readyState of the object element to become 4 before removing it, >+ // because you cannot properly cancel a loading SWF >file without >breaking browser load references, also obj.onreadystatechange doesn't work >+ var el = createElement("div"); >+ obj.parentNode.insertBefore(el, obj); // insert >placeholder div that >will be replaced by the alternative content >+ el.parentNode.replaceChild(abstractAltContent(obj), el); >+ obj.style.display = "none"; >+ (function(){ >+ if (obj.readyState == 4) { >+ obj.parentNode.removeChild(obj); >+ } >+ else { >+ setTimeout(arguments.callee, 10); >+ } >+ })(); >+ } >+ else { >+ obj.parentNode.replaceChild(abstractAltContent(obj), >obj); >+ } >+ } >+ >+ function abstractAltContent(obj) { >+ var ac = createElement("div"); >+ if (ua.win && ua.ie) { >+ ac.innerHTML = obj.innerHTML; >+ } >+ else { >+ var nestedObj = obj.getElementsByTagName(OBJECT)[0]; >+ if (nestedObj) { >+ var c = nestedObj.childNodes; >+ if (c) { >+ var cl = c.length; >+ for (var i = 0; i < cl; i++) { >+ if (!(c[i].nodeType == 1 && >c[i].nodeName == "PARAM") && >!(c[i].nodeType == 8)) { >+ >ac.appendChild(c[i].cloneNode(true)); >+ } >+ } >+ } >+ } >+ } >+ return ac; >+ } >+ >+ /* Cross-browser dynamic SWF creation >+ */ >+ function createSWF(attObj, parObj, id) { >+ var r, el = getElementById(id); >+ if (ua.wk && ua.wk < 312) { return r; } >+ if (el) { >+ if (typeof attObj.id == UNDEF) { // if no 'id' is >defined for the >object element, it will inherit the 'id' from the alternative content >+ attObj.id = id; >+ } >+ if (ua.ie && ua.win) { // Internet Explorer + the HTML >object element >+ W3C DOM methods do not combine: fall back to outerHTML >+ var att = ""; >+ for (var i in attObj) { >+ if (attObj[i] != Object.prototype[i]) { >// filter out prototype >additions from other potential libraries >+ if (i.toLowerCase() == "data") { >+ parObj.movie = >attObj[i]; >+ } >+ else if (i.toLowerCase() == >"styleclass") { // 'class' is an ECMA4 >reserved keyword >+ att += ' class="' + >attObj[i] + '"'; >+ } >+ else if (i.toLowerCase() != >"classid") { >+ att += ' ' + i + '="' + >attObj[i] + '"'; >+ } >+ } >+ } >+ var par = ""; >+ for (var j in parObj) { >+ if (parObj[j] != Object.prototype[j]) { >// filter out prototype >additions from other potential libraries >+ par += '<param name="' + j + '" >value="' + parObj[j] + '" />'; >+ } >+ } >+ el.outerHTML = '<object >classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + >'</object>'; >+ objIdArr[objIdArr.length] = attObj.id; // >stored to fix object >'leaks' on unload (dynamic publishing only) >+ r = getElementById(attObj.id); >+ } >+ else { // well-behaving browsers >+ var o = createElement(OBJECT); >+ o.setAttribute("type", FLASH_MIME_TYPE); >+ for (var m in attObj) { >+ if (attObj[m] != Object.prototype[m]) { >// filter out prototype >additions from other potential libraries >+ if (m.toLowerCase() == >"styleclass") { // 'class' is an ECMA4 >reserved keyword >+ o.setAttribute("class", >attObj[m]); >+ } >+ else if (m.toLowerCase() != >"classid") { // filter out IE specific >attribute >+ o.setAttribute(m, >attObj[m]); >+ } >+ } >+ } >+ for (var n in parObj) { >+ if (parObj[n] != Object.prototype[n] && >n.toLowerCase() != "movie") >{ // filter out prototype additions from other potential libraries and IE >specific param element >+ createObjParam(o, n, parObj[n]); >+ } >+ } >+ el.parentNode.replaceChild(o, el); >+ r = o; >+ } >+ } >+ return r; >+ } >+ >+ function createObjParam(el, pName, pValue) { >+ var p = createElement("param"); >+ p.setAttribute("name", pName); >+ p.setAttribute("value", pValue); >+ el.appendChild(p); >+ } >+ >+ /* Cross-browser SWF removal >+ - Especially needed to safely and completely remove a SWF in >Internet >Explorer >+ */ >+ function removeSWF(id) { >+ var obj = getElementById(id); >+ if (obj && obj.nodeName == "OBJECT") { >+ if (ua.ie && ua.win) { >+ obj.style.display = "none"; >+ (function(){ >+ if (obj.readyState == 4) { >+ removeObjectInIE(id); >+ } >+ else { >+ setTimeout(arguments.callee, >10); >+ } >+ })(); >+ } >+ else { >+ obj.parentNode.removeChild(obj); >+ } >+ } >+ } >+ >+ function removeObjectInIE(id) { >+ var obj = getElementById(id); >+ if (obj) { >+ for (var i in obj) { >+ if (typeof obj[i] == "function") { >+ obj[i] = null; >+ } >+ } >+ obj.parentNode.removeChild(obj); >+ } >+ } >+ >+ /* Functions to optimize JavaScript compression >+ */ >+ function getElementById(id) { >+ var el = null; >+ try { >+ el = doc.getElementById(id); >+ } >+ catch (e) {} >+ return el; >+ } >+ >+ function createElement(el) { >+ return doc.createElement(el); >+ } >+ >+ /* Updated attachEvent function for Internet Explorer >+ - Stores attachEvent information in an Array, so on unload the >detachEvent functions can be called to avoid memory leaks >+ */ >+ function addListener(target, eventType, fn) { >+ target.attachEvent(eventType, fn); >+ listenersArr[listenersArr.length] = [target, eventType, fn]; >+ } >+ >+ /* Flash Player and SWF content version matching >+ */ >+ function hasPlayerVersion(rv) { >+ var pv = ua.pv, v = rv.split("."); >+ v[0] = parseInt(v[0], 10); >+ v[1] = parseInt(v[1], 10) || 0; // supports short notation, >e.g. "9" >instead of "9.0.0" >+ v[2] = parseInt(v[2], 10) || 0; >+ return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || >(pv[0] == >v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false; >+ } >+ >+ /* Cross-browser dynamic CSS creation >+ - Based on Bobby van der Sluis' solution: >http://www.bobbyvandersluis.com/articles/dynamicCSS.php >+ */ >+ function createCSS(sel, decl, media, newStyle) { >+ if (ua.ie && ua.mac) { return; } >+ var h = doc.getElementsByTagName("head")[0]; >+ if (!h) { return; } // to also support badly authored HTML >pages that >lack a head element >+ var m = (media && typeof media == "string") ? media : "screen"; >+ if (newStyle) { >+ dynamicStylesheet = null; >+ dynamicStylesheetMedia = null; >+ } >+ if (!dynamicStylesheet || dynamicStylesheetMedia != m) { >+ // create dynamic stylesheet + get a global reference >to it >+ var s = createElement("style"); >+ s.setAttribute("type", "text/css"); >+ s.setAttribute("media", m); >+ dynamicStylesheet = h.appendChild(s); >+ if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF >&& >doc.styleSheets.length > 0) { >+ dynamicStylesheet = >doc.styleSheets[doc.styleSheets.length - 1]; >+ } >+ dynamicStylesheetMedia = m; >+ } >+ // add style rule >+ if (ua.ie && ua.win) { >+ if (dynamicStylesheet && typeof >dynamicStylesheet.addRule == OBJECT) { >+ dynamicStylesheet.addRule(sel, decl); >+ } >+ } >+ else { >+ if (dynamicStylesheet && typeof doc.createTextNode != >UNDEF) { >+ >dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + >"}")); >+ } >+ } >+ } >+ >+ function setVisibility(id, isVisible) { >+ if (!autoHideShow) { return; } >+ var v = isVisible ? "visible" : "hidden"; >+ if (isDomLoaded && getElementById(id)) { >+ getElementById(id).style.visibility = v; >+ } >+ else { >+ createCSS("#" + id, "visibility:" + v); >+ } >+ } >+ >+ /* Filter to avoid XSS attacks >+ */ >+ function urlEncodeIfNecessary(s) { >+ var regex = /[\\\"<>\.;]/; >+ var hasBadChars = regex.exec(s) != null; >+ return hasBadChars && typeof encodeURIComponent != UNDEF ? >encodeURIComponent(s) : s; >+ } >+ >+ /* Release memory to avoid memory leaks caused by closures, fix hanging >audio/video threads and force open sockets/NetConnections to disconnect >(Internet Explorer only) >+ */ >+ var cleanup = function() { >+ if (ua.ie && ua.win) { >+ window.attachEvent("onunload", function() { >+ // remove listeners to avoid memory leaks >+ var ll = listenersArr.length; >+ for (var i = 0; i < ll; i++) { >+ >listenersArr[i][0].detachEvent(listenersArr[i][1], >listenersArr[i][2]); >+ } >+ // cleanup dynamically embedded objects to fix >audio/video threads >and force open sockets and NetConnections to disconnect >+ var il = objIdArr.length; >+ for (var j = 0; j < il; j++) { >+ removeSWF(objIdArr[j]); >+ } >+ // cleanup library's main closures to avoid >memory leaks >+ for (var k in ua) { >+ ua[k] = null; >+ } >+ ua = null; >+ for (var l in swfobject) { >+ swfobject[l] = null; >+ } >+ swfobject = null; >+ }); >+ } >+ }(); >+ >+ return { >+ /* Public API >+ - Reference: >http://code.google.com/p/swfobject/wiki/documentation >+ */ >+ registerObject: function(objectIdStr, swfVersionStr, >xiSwfUrlStr, >callbackFn) { >+ if (ua.w3 && objectIdStr && swfVersionStr) { >+ var regObj = {}; >+ regObj.id = objectIdStr; >+ regObj.swfVersion = swfVersionStr; >+ regObj.expressInstall = xiSwfUrlStr; >+ regObj.callbackFn = callbackFn; >+ regObjArr[regObjArr.length] = regObj; >+ setVisibility(objectIdStr, false); >+ } >+ else if (callbackFn) { >+ callbackFn({success:false, id:objectIdStr}); >+ } >+ }, >+ >+ getObjectById: function(objectIdStr) { >+ if (ua.w3) { >+ return getObjectById(objectIdStr); >+ } >+ }, >+ >+ embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, >heightStr, >swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { >+ var callbackObj = {success:false, id:replaceElemIdStr}; >+ if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && >replaceElemIdStr >&& widthStr && heightStr && swfVersionStr) { >+ setVisibility(replaceElemIdStr, false); >+ addDomLoadEvent(function() { >+ widthStr += ""; // auto-convert to >string >+ heightStr += ""; >+ var att = {}; >+ if (attObj && typeof attObj === OBJECT) >{ >+ for (var i in attObj) { // copy >object to avoid the use of >references, because web authors often reuse attObj for multiple SWFs >+ att[i] = attObj[i]; >+ } >+ } >+ att.data = swfUrlStr; >+ att.width = widthStr; >+ att.height = heightStr; >+ var par = {}; >+ if (parObj && typeof parObj === OBJECT) >{ >+ for (var j in parObj) { // copy >object to avoid the use of >references, because web authors often reuse parObj for multiple SWFs >+ par[j] = parObj[j]; >+ } >+ } >+ if (flashvarsObj && typeof flashvarsObj >=== OBJECT) { >+ for (var k in flashvarsObj) { >// copy object to avoid the use of >references, because web authors often reuse flashvarsObj for multiple SWFs >+ if (typeof >par.flashvars != UNDEF) { >+ par.flashvars >+= "&" + k + "=" + flashvarsObj[k]; >+ } >+ else { >+ par.flashvars = >k + "=" + flashvarsObj[k]; >+ } >+ } >+ } >+ if (hasPlayerVersion(swfVersionStr)) { >// create SWF >+ var obj = createSWF(att, par, >replaceElemIdStr); >+ if (att.id == replaceElemIdStr) >{ >+ >setVisibility(replaceElemIdStr, true); >+ } >+ callbackObj.success = true; >+ callbackObj.ref = obj; >+ } >+ else if (xiSwfUrlStr && >canExpressInstall()) { // show Adobe >Express Install >+ att.data = xiSwfUrlStr; >+ showExpressInstall(att, par, >replaceElemIdStr, callbackFn); >+ return; >+ } >+ else { // show alternative content >+ setVisibility(replaceElemIdStr, >true); >+ } >+ if (callbackFn) { >callbackFn(callbackObj); } >+ }); >+ } >+ else if (callbackFn) { callbackFn(callbackObj); } >+ }, >+ >+ switchOffAutoHideShow: function() { >+ autoHideShow = false; >+ }, >+ >+ ua: ua, >+ >+ getFlashPlayerVersion: function() { >+ return { major:ua.pv[0], minor:ua.pv[1], >release:ua.pv[2] }; >+ }, >+ >+ hasFlashPlayerVersion: hasPlayerVersion, >+ >+ createSWF: function(attObj, parObj, replaceElemIdStr) { >+ if (ua.w3) { >+ return createSWF(attObj, parObj, >replaceElemIdStr); >+ } >+ else { >+ return undefined; >+ } >+ }, >+ >+ showExpressInstall: function(att, par, replaceElemIdStr, >callbackFn) { >+ if (ua.w3 && canExpressInstall()) { >+ showExpressInstall(att, par, replaceElemIdStr, >callbackFn); >+ } >+ }, >+ >+ removeSWF: function(objElemIdStr) { >+ if (ua.w3) { >+ removeSWF(objElemIdStr); >+ } >+ }, >+ >+ createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) >{ >+ if (ua.w3) { >+ createCSS(selStr, declStr, mediaStr, >newStyleBoolean); >+ } >+ }, >+ >+ addDomLoadEvent: addDomLoadEvent, >+ >+ addLoadEvent: addLoadEvent, >+ >+ getQueryParamValue: function(param) { >+ var q = doc.location.search || doc.location.hash; >+ if (q) { >+ if (/\?/.test(q)) { q = q.split("?")[1]; } // >strip question mark >+ if (param == null) { >+ return urlEncodeIfNecessary(q); >+ } >+ var pairs = q.split("&"); >+ for (var i = 0; i < pairs.length; i++) { >+ if (pairs[i].substring(0, >pairs[i].indexOf("=")) == param) { >+ return >urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); >+ } >+ } >+ } >+ return ""; >+ }, >+ >+ // For internal usage only >+ expressInstallCallback: function() { >+ if (isExpressInstallActive) { >+ var obj = getElementById(EXPRESS_INSTALL_ID); >+ if (obj && storedAltContent) { >+ >obj.parentNode.replaceChild(storedAltContent, obj); >+ if (storedAltContentId) { >+ >setVisibility(storedAltContentId, true); >+ if (ua.ie && ua.win) { >storedAltContent.style.display = "block"; } >+ } >+ if (storedCallbackFn) { >storedCallbackFn(storedCallbackObj); } >+ } >+ isExpressInstallActive = false; >+ } >+ } >+ }; >+}(); > >http://git-wip-us.apache.org/repos/asf/flex-flexunit/blob/64592fdd/FlexUni >t4Tutorials/Unit4/startx/FlexUnit4Training_wt3/libs/flexUnitTasks-4.1.0.ja >r >---------------------------------------------------------------------- >diff --git >a/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/libs/flexUnitTasks >-4.1.0.jar >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/libs/flexUnitTasks >-4.1.0.jar >new file mode 100644 >index 0000000..e44ac0c >Binary files /dev/null and >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/libs/flexUnitTasks >-4.1.0.jar differ > >http://git-wip-us.apache.org/repos/asf/flex-flexunit/blob/64592fdd/FlexUni >t4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/FlexUnit4Training.mxml >---------------------------------------------------------------------- >diff --git >a/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/FlexUnit4Train >ing.mxml >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/FlexUnit4Train >ing.mxml >new file mode 100644 >index 0000000..ab8a7db >--- /dev/null >+++ >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/FlexUnit4Train >ing.mxml >@@ -0,0 +1,50 @@ >+<?xml version="1.0" encoding="utf-8"?> >+<!-- >+ Licensed to the Apache Software Foundation (ASF) under one or more >+ contributor license agreements. See the NOTICE file distributed with >+ this work for additional information regarding copyright ownership. >+ The ASF licenses this file to You under the Apache License, Version 2.0 >+ (the "License"); you may not use this file except in compliance with >+ the License. You may obtain a copy of the License at >+ >+ http://www.apache.org/licenses/LICENSE-2.0 >+ >+ Unless required by applicable law or agreed to in writing, software >+ distributed under the License is distributed on an "AS IS" BASIS, >+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >implied. >+ See the License for the specific language governing permissions and >+ limitations under the License. >+--> >+ >+<!-- This is an auto generated file and is not intended for >modification. --> >+ >+<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" >+ xmlns:s="library://ns.adobe.com/flex/spark" >+ xmlns:mx="library://ns.adobe.com/flex/mx" >minWidth="955" >minHeight="600" xmlns:flexui="flexunit.flexui.*" >creationComplete="onCreationComplete()"> >+ <fx:Script> >+ <![CDATA[ >+ import math.testcases.BasicCircleTest; >+ >+ import org.flexunit.runner.FlexUnitCore; >+ >+ public function currentRunTestSuite():Array >+ { >+ var testsToRun:Array = new Array(); >+ testsToRun.push( BasicCircleTest ); >+ return testsToRun; >+ } >+ >+ >+ private function onCreationComplete():void >+ { >+ >testRunner.runWithFlexUnit4Runner(currentRunTestSuite(), >"FlexUnit4Training"); >+ } >+ >+ ]]> >+ </fx:Script> >+ <fx:Declarations> >+ <!-- Place non-visual elements (e.g., services, value objects) >here --> >+ </fx:Declarations> >+ >+ <flexui:FlexUnitTestRunnerUI id="testRunner"/> >+</s:Application> >\ No newline at end of file > >http://git-wip-us.apache.org/repos/asf/flex-flexunit/blob/64592fdd/FlexUni >t4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/net/digitalprimates/mat >h/Circle.as >---------------------------------------------------------------------- >diff --git >a/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/net/digitalpri >mates/math/Circle.as >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/net/digitalpri >mates/math/Circle.as >new file mode 100644 >index 0000000..5f4978a >--- /dev/null >+++ >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/src/net/digitalpri >mates/math/Circle.as >@@ -0,0 +1,131 @@ >+/* >+ * Licensed to the Apache Software Foundation (ASF) under one or more >+ * contributor license agreements. See the NOTICE file distributed with >+ * this work for additional information regarding copyright ownership. >+ * The ASF licenses this file to You under the Apache License, Version >2.0 >+ * (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * >+ * http://www.apache.org/licenses/LICENSE-2.0 >+ * >+ * Unless required by applicable law or agreed to in writing, software >+ * distributed under the License is distributed on an "AS IS" BASIS, >+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >implied. >+ * See the License for the specific language governing permissions and >+ * limitations under the License. >+ */ >+package net.digitalprimates.math { >+ import flash.geom.Point; >+ >+ /** >+ * Class to represent a mathematical circle in addition to >circle-specific convenience methods. >+ * >+ * @author mlabriola >+ * >+ */ >+ public class Circle { >+ /** >+ * Constant representing the number of radians in a circle >+ */ >+ public static const RADIANS_PER_CIRCLE:Number = Math.PI * 2; >+ >+ private var _origin:Point = new Point( 0, 0 ); >+ private var _radius:Number; >+ >+ /** >+ * Returns the circle's origin point as a ><code>flash.geom.Point</code> object. >+ * The <code>origin</code> is a read only property supplied >during >the instantiation >+ * of the Circle. >+ * >+ * @return The circle's origin point. >+ * >+ */ >+ public function get origin():Point { >+ return _origin; >+ } >+ >+ /** >+ * Returns the circle's radius as a <code>Number</code>. >+ * The <code>radius</code> is a read only property supplied >during >the instantiation >+ * of the Circle. >+ * >+ * @return The circle's radius. >+ */ >+ public function get radius():Number { >+ return _radius; >+ } >+ >+ /** >+ * Returns the circle's diameter based on the ><code>radius</code> >property. >+ * The <code>diameter</code> is a read only property. >+ * >+ * @see #radius >+ * @return The circle's diameter. >+ */ >+ public function get diameter():Number { >+ return radius * 2; >+ } >+ >+ /** >+ * Returns a point on the circle at a given radian offset. >+ * >+ * @param t radian position along the circle. 0 is the top-most >point >of the circle. >+ * @return a Point object describing the cartesian coordinate >of the >point. >+ * >+ */ >+ public function getPointOnCircle( t:Number ):Point { >+ var x:Number = origin.x + ( radius * Math.cos( t ) ); >+ var y:Number = origin.y + ( radius * Math.sin( t ) ); >+ >+ return new Point( x, y ); >+ } >+ >+ /** >+ * >+ * Convenience method for converting radians to degrees. >+ * >+ * @param radians a radian offset from the top-most point of >the >circle. >+ * @return a corresponding angle represented in degrees. >+ * >+ */ >+ public function radiansToDegrees( radians:Number ):Number { >+ return ( ( radians - Math.PI/2 ) * 180 / Math.PI ); >+ } >+ >+ /** >+ * Comparison method to determine circle equivalence (same >center and >radius). >+ * >+ * @param circle a circle for comparison >+ * @return a boolean indicating if the circles are equivalent >+ * >+ */ >+ public function equals( circle:Circle ):Boolean { >+ var equal:Boolean = false; >+ >+ if ( ( circle ) && ( this.radius == circle.radius ) && >( this.origin >) && ( circle.origin ) ) { >+ if ( ( this.origin.x == circle.origin.x ) && ( >this.origin.y == >circle.origin.y ) ) { >+ equal = true; >+ } >+ } >+ >+ return equal; >+ } >+ >+ /** >+ * Creates a new circle >+ * >+ * @param origin the origin point of the new circle >+ * @param radius the radius of the new circle >+ * >+ */ >+ public function Circle( origin:Point, radius:Number ) { >+ >+ if ( ( radius <= 0 ) || isNaN( radius ) ) { >+ throw new RangeError("Radius must be a positive >Number"); >+ } >+ >+ this._origin = origin; >+ this._radius = radius; >+ } >+ } >+} >\ No newline at end of file > >http://git-wip-us.apache.org/repos/asf/flex-flexunit/blob/64592fdd/FlexUni >t4Tutorials/Unit4/startx/FlexUnit4Training_wt3/tests/math/testcases/BasicC >ircleTest.as >---------------------------------------------------------------------- >diff --git >a/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/tests/math/testcas >es/BasicCircleTest.as >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/tests/math/testcas >es/BasicCircleTest.as >new file mode 100644 >index 0000000..f85bf23 >--- /dev/null >+++ >b/FlexUnit4Tutorials/Unit4/startx/FlexUnit4Training_wt3/tests/math/testcas >es/BasicCircleTest.as >@@ -0,0 +1,94 @@ >+/* >+ * Licensed to the Apache Software Foundation (ASF) under one or more >+ * contributor license agreements. See the NOTICE file distributed with >+ * this work for additional information regarding copyright ownership. >+ * The ASF licenses this file to You under the Apache License, Version >2.0 >+ * (the "License"); you may not use this file except in compliance with >+ * the License. You may obtain a copy of the License at >+ * >+ * http://www.apache.org/licenses/LICENSE-2.0 >+ * >+ * Unless required by applicable law or agreed to in writing, software >+ * distributed under the License is distributed on an "AS IS" BASIS, >+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or >implied. >+ * See the License for the specific language governing permissions and >+ * limitations under the License. >+ */ >+package math.testcases { >+ import flash.geom.Point; >+ >+ import net.digitalprimates.math.Circle; >+ >+ import org.flexunit.asserts.assertEquals; >+ import org.flexunit.asserts.assertFalse; >+ import org.flexunit.asserts.assertTrue; >+ >+ public class BasicCircleTest { >+ >+ [Test] >+ public function shouldReturnProvidedRadius():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ assertEquals( 5, circle.radius ); >+ } >+ >+ [Test] >+ public function shouldComputeCorrectDiameter ():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ assertEquals( 10, circle.diameter ); >+ } >+ >+ [Test] >+ public function shouldReturnProvidedOrigin():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ assertEquals( 0, circle.origin.x ); >+ assertEquals( 0, circle.origin.y ); >+ } >+ >+ [Test] >+ public function shouldReturnTrueForEqualCircle():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ var circle2:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ >+ assertTrue( circle.equals( circle2 ) ); >+ } >+ >+ [Test] >+ public function shouldReturnFalseForUnequalOrigin():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ var circle2:Circle = new Circle( new Point( 0, 5 ), 5); >+ >+ assertFalse( circle.equals( circle2 ) ); >+ } >+ >+ [Test] >+ public function shouldReturnFalseForUnequalRadius():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ var circle2:Circle = new Circle( new Point( 0, 0 ), 7); >+ >+ assertFalse( circle.equals( circle2 ) ); >+ } >+ >+ [Test] >+ public function shouldGetPointsOnCircle():void { >+ var circle:Circle = new Circle( new Point( 0, 0 ), 5 ); >+ var point:Point; >+ >+ //top-most point of circle >+ point = circle.getPointOnCircle( 0 ); >+ assertEquals( 5, point.x ); >+ assertEquals( 0, point.y ); >+ >+ //bottom-most point of circle >+ point = circle.getPointOnCircle( Math.PI ); >+ assertEquals( -5, point.x ); >+ assertEquals( 0, point.y ); >+ } >+ >+ [Test] >+ public function shouldThrowRangeError():void { >+ >+ } >+ >+ >+ } >+} >\ No newline at end of file >