正在显示
23 个修改的文件
包含
3597 行增加
和
0 行删除
trunk/research/SrsBW/.actionScriptProperties
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | +<actionScriptProperties analytics="false" mainApplicationPath="SrsBW.as" projectUUID="b75da3de-ec2d-4a7b-ba89-d35496849e78" version="10"> | ||
| 3 | + <compiler additionalCompilerArguments="-locale en_US" autoRSLOrdering="true" copyDependentFiles="true" fteInMXComponents="false" generateAccessible="true" htmlExpressInstall="true" htmlGenerate="true" htmlHistoryManagement="true" htmlPlayerVersionCheck="true" includeNetmonSwc="false" outputFolderPath="bin-debug" removeUnusedRSL="true" sourceFolderPath="src" strict="true" targetPlayerVersion="0.0.0" useApolloConfig="false" useDebugRSLSwfs="true" verifyDigests="true" warn="true"> | ||
| 4 | + <compilerSourcePath/> | ||
| 5 | + <libraryPath defaultLinkType="0"> | ||
| 6 | + <libraryPathEntry kind="4" path=""> | ||
| 7 | + <excludedEntries> | ||
| 8 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_charts.swc" useDefaultLinkType="false"/> | ||
| 9 | + <libraryPathEntry kind="1" linkType="1" path="${PROJECT_FRAMEWORKS}/locale/{locale}"/> | ||
| 10 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/advancedgrids.swc" useDefaultLinkType="false"/> | ||
| 11 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp.swc" useDefaultLinkType="false"/> | ||
| 12 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_air.swc" useDefaultLinkType="false"/> | ||
| 13 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/charts.swc" useDefaultLinkType="false"/> | ||
| 14 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/framework.swc" useDefaultLinkType="false"/> | ||
| 15 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/mx/mx.swc" useDefaultLinkType="false"/> | ||
| 16 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/netmon.swc" useDefaultLinkType="false"/> | ||
| 17 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark.swc" useDefaultLinkType="false"/> | ||
| 18 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/sparkskins.swc" useDefaultLinkType="false"/> | ||
| 19 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/rpc.swc" useDefaultLinkType="false"/> | ||
| 20 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/datavisualization.swc" useDefaultLinkType="false"/> | ||
| 21 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/qtp_air.swc" useDefaultLinkType="false"/> | ||
| 22 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/videoPlayer.swc" useDefaultLinkType="false"/> | ||
| 23 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/spark_dmv.swc" useDefaultLinkType="false"/> | ||
| 24 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation.swc" useDefaultLinkType="false"/> | ||
| 25 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_dmv.swc" useDefaultLinkType="false"/> | ||
| 26 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/flash-integration.swc" useDefaultLinkType="false"/> | ||
| 27 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_flashflexkit.swc" useDefaultLinkType="false"/> | ||
| 28 | + <libraryPathEntry kind="3" linkType="1" path="${PROJECT_FRAMEWORKS}/libs/automation_agent.swc" useDefaultLinkType="false"/> | ||
| 29 | + </excludedEntries> | ||
| 30 | + </libraryPathEntry> | ||
| 31 | + <libraryPathEntry kind="3" linkType="1" path="FlashCS5UI.swc" useDefaultLinkType="false"/> | ||
| 32 | + <libraryPathEntry kind="3" linkType="1" path="Video.swc" useDefaultLinkType="false"/> | ||
| 33 | + </libraryPath> | ||
| 34 | + <sourceAttachmentPath/> | ||
| 35 | + </compiler> | ||
| 36 | + <applications> | ||
| 37 | + <application path="SrsBW.as"/> | ||
| 38 | + </applications> | ||
| 39 | + <modules/> | ||
| 40 | + <buildCSSFiles/> | ||
| 41 | + <flashCatalyst validateFlashCatalystCompatibility="false"/> | ||
| 42 | +</actionScriptProperties> |
trunk/research/SrsBW/.project
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<projectDescription> | ||
| 3 | + <name>SrsBW</name> | ||
| 4 | + <comment></comment> | ||
| 5 | + <projects> | ||
| 6 | + </projects> | ||
| 7 | + <buildSpec> | ||
| 8 | + <buildCommand> | ||
| 9 | + <name>com.adobe.flexbuilder.project.flexbuilder</name> | ||
| 10 | + <arguments> | ||
| 11 | + </arguments> | ||
| 12 | + </buildCommand> | ||
| 13 | + </buildSpec> | ||
| 14 | + <natures> | ||
| 15 | + <nature>com.adobe.flexbuilder.project.actionscriptnature</nature> | ||
| 16 | + </natures> | ||
| 17 | +</projectDescription> |
trunk/research/SrsBW/FlashCS5UI.swc
0 → 100644
不能预览此文件类型
trunk/research/SrsBW/Video.swc
0 → 100644
不能预览此文件类型
trunk/research/SrsBW/bin-debug/SrsBW.html
0 → 100644
| 1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||
| 2 | +<!-- saved from url=(0014)about:internet --> | ||
| 3 | +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> | ||
| 4 | + <!-- | ||
| 5 | + Smart developers always View Source. | ||
| 6 | + | ||
| 7 | + This application was built using Adobe Flex, an open source framework | ||
| 8 | + for building rich Internet applications that get delivered via the | ||
| 9 | + Flash Player or to desktops via Adobe AIR. | ||
| 10 | + | ||
| 11 | + Learn more about Flex at http://flex.org | ||
| 12 | + // --> | ||
| 13 | + <head> | ||
| 14 | + <title></title> | ||
| 15 | + <meta name="google" value="notranslate" /> | ||
| 16 | + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | ||
| 17 | + <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and | ||
| 18 | + the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as | ||
| 19 | + the percentage of the height of its parent container, which has to be set explicitly. Fix for | ||
| 20 | + Firefox 3.6 focus border issues. Initially, don't display flashContent div so it won't show | ||
| 21 | + if JavaScript disabled. | ||
| 22 | + --> | ||
| 23 | + <style type="text/css" media="screen"> | ||
| 24 | + html, body { height:100%; } | ||
| 25 | + body { margin:0; padding:0; overflow:auto; text-align:center; | ||
| 26 | + background-color: #ffffff; } | ||
| 27 | + object:focus { outline:none; } | ||
| 28 | + #flashContent { display:none; } | ||
| 29 | + </style> | ||
| 30 | + | ||
| 31 | + <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens --> | ||
| 32 | + <!-- BEGIN Browser History required section --> | ||
| 33 | + <link rel="stylesheet" type="text/css" href="history/history.css" /> | ||
| 34 | + <script type="text/javascript" src="history/history.js"></script> | ||
| 35 | + <!-- END Browser History required section --> | ||
| 36 | + | ||
| 37 | + <script type="text/javascript" src="swfobject.js"></script> | ||
| 38 | + <script type="text/javascript"> | ||
| 39 | + // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. | ||
| 40 | + var swfVersionStr = "11.1.0"; | ||
| 41 | + // To use express install, set to playerProductInstall.swf, otherwise the empty string. | ||
| 42 | + var xiSwfUrlStr = "playerProductInstall.swf"; | ||
| 43 | + var flashvars = {}; | ||
| 44 | + var params = {}; | ||
| 45 | + params.quality = "high"; | ||
| 46 | + params.bgcolor = "#ffffff"; | ||
| 47 | + params.allowscriptaccess = "sameDomain"; | ||
| 48 | + params.allowfullscreen = "true"; | ||
| 49 | + var attributes = {}; | ||
| 50 | + attributes.id = "SrsBW"; | ||
| 51 | + attributes.name = "SrsBW"; | ||
| 52 | + attributes.align = "middle"; | ||
| 53 | + swfobject.embedSWF( | ||
| 54 | + "SrsBW.swf", "flashContent", | ||
| 55 | + "100%", "100%", | ||
| 56 | + swfVersionStr, xiSwfUrlStr, | ||
| 57 | + flashvars, params, attributes); | ||
| 58 | + // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. | ||
| 59 | + swfobject.createCSS("#flashContent", "display:block;text-align:left;"); | ||
| 60 | + </script> | ||
| 61 | + </head> | ||
| 62 | + <body> | ||
| 63 | + <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough | ||
| 64 | + JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show | ||
| 65 | + when JavaScript is disabled. | ||
| 66 | + --> | ||
| 67 | + <div id="flashContent"> | ||
| 68 | + <p> | ||
| 69 | + To view this page ensure that Adobe Flash Player version | ||
| 70 | + 11.1.0 or greater is installed. | ||
| 71 | + </p> | ||
| 72 | + <script type="text/javascript"> | ||
| 73 | + var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); | ||
| 74 | + document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" | ||
| 75 | + + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); | ||
| 76 | + </script> | ||
| 77 | + </div> | ||
| 78 | + | ||
| 79 | + <noscript> | ||
| 80 | + <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="SrsBW"> | ||
| 81 | + <param name="movie" value="SrsBW.swf" /> | ||
| 82 | + <param name="quality" value="high" /> | ||
| 83 | + <param name="bgcolor" value="#ffffff" /> | ||
| 84 | + <param name="allowScriptAccess" value="sameDomain" /> | ||
| 85 | + <param name="allowFullScreen" value="true" /> | ||
| 86 | + <!--[if !IE]>--> | ||
| 87 | + <object type="application/x-shockwave-flash" data="SrsBW.swf" width="100%" height="100%"> | ||
| 88 | + <param name="quality" value="high" /> | ||
| 89 | + <param name="bgcolor" value="#ffffff" /> | ||
| 90 | + <param name="allowScriptAccess" value="sameDomain" /> | ||
| 91 | + <param name="allowFullScreen" value="true" /> | ||
| 92 | + <!--<![endif]--> | ||
| 93 | + <!--[if gte IE 6]>--> | ||
| 94 | + <p> | ||
| 95 | + Either scripts and active content are not permitted to run or Adobe Flash Player version | ||
| 96 | + 11.1.0 or greater is not installed. | ||
| 97 | + </p> | ||
| 98 | + <!--<![endif]--> | ||
| 99 | + <a href="http://www.adobe.com/go/getflashplayer"> | ||
| 100 | + <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" /> | ||
| 101 | + </a> | ||
| 102 | + <!--[if !IE]>--> | ||
| 103 | + </object> | ||
| 104 | + <!--<![endif]--> | ||
| 105 | + </object> | ||
| 106 | + </noscript> | ||
| 107 | + </body> | ||
| 108 | +</html> |
trunk/research/SrsBW/bin-debug/SrsBW.swf
0 → 100644
不能预览此文件类型
| 1 | +/* This CSS stylesheet defines styles used by required elements in a flex application page that supports browser history */ | ||
| 2 | + | ||
| 3 | +#ie_historyFrame { width: 0px; height: 0px; display:none } | ||
| 4 | +#firefox_anchorDiv { width: 0px; height: 0px; display:none } | ||
| 5 | +#safari_formDiv { width: 0px; height: 0px; display:none } | ||
| 6 | +#safari_rememberDiv { width: 0px; height: 0px; display:none } |
| 1 | +BrowserHistoryUtils = { | ||
| 2 | + addEvent: function(elm, evType, fn, useCapture) { | ||
| 3 | + useCapture = useCapture || false; | ||
| 4 | + if (elm.addEventListener) { | ||
| 5 | + elm.addEventListener(evType, fn, useCapture); | ||
| 6 | + return true; | ||
| 7 | + } | ||
| 8 | + else if (elm.attachEvent) { | ||
| 9 | + var r = elm.attachEvent('on' + evType, fn); | ||
| 10 | + return r; | ||
| 11 | + } | ||
| 12 | + else { | ||
| 13 | + elm['on' + evType] = fn; | ||
| 14 | + } | ||
| 15 | + } | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +BrowserHistory = (function() { | ||
| 19 | + // type of browser | ||
| 20 | + var browser = { | ||
| 21 | + ie: false, | ||
| 22 | + ie8: false, | ||
| 23 | + firefox: false, | ||
| 24 | + safari: false, | ||
| 25 | + opera: false, | ||
| 26 | + version: -1 | ||
| 27 | + }; | ||
| 28 | + | ||
| 29 | + // Default app state URL to use when no fragment ID present | ||
| 30 | + var defaultHash = ''; | ||
| 31 | + | ||
| 32 | + // Last-known app state URL | ||
| 33 | + var currentHref = document.location.href; | ||
| 34 | + | ||
| 35 | + // Initial URL (used only by IE) | ||
| 36 | + var initialHref = document.location.href; | ||
| 37 | + | ||
| 38 | + // Initial URL (used only by IE) | ||
| 39 | + var initialHash = document.location.hash; | ||
| 40 | + | ||
| 41 | + // History frame source URL prefix (used only by IE) | ||
| 42 | + var historyFrameSourcePrefix = 'history/historyFrame.html?'; | ||
| 43 | + | ||
| 44 | + // History maintenance (used only by Safari) | ||
| 45 | + var currentHistoryLength = -1; | ||
| 46 | + | ||
| 47 | + // Flag to denote the existence of onhashchange | ||
| 48 | + var browserHasHashChange = false; | ||
| 49 | + | ||
| 50 | + var historyHash = []; | ||
| 51 | + | ||
| 52 | + var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash); | ||
| 53 | + | ||
| 54 | + var backStack = []; | ||
| 55 | + var forwardStack = []; | ||
| 56 | + | ||
| 57 | + var currentObjectId = null; | ||
| 58 | + | ||
| 59 | + //UserAgent detection | ||
| 60 | + var useragent = navigator.userAgent.toLowerCase(); | ||
| 61 | + | ||
| 62 | + if (useragent.indexOf("opera") != -1) { | ||
| 63 | + browser.opera = true; | ||
| 64 | + } else if (useragent.indexOf("msie") != -1) { | ||
| 65 | + browser.ie = true; | ||
| 66 | + browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4)); | ||
| 67 | + if (browser.version == 8) | ||
| 68 | + { | ||
| 69 | + browser.ie = false; | ||
| 70 | + browser.ie8 = true; | ||
| 71 | + } | ||
| 72 | + } else if (useragent.indexOf("safari") != -1) { | ||
| 73 | + browser.safari = true; | ||
| 74 | + browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7)); | ||
| 75 | + } else if (useragent.indexOf("gecko") != -1) { | ||
| 76 | + browser.firefox = true; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + if (browser.ie == true && browser.version == 7) { | ||
| 80 | + window["_ie_firstload"] = false; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + function hashChangeHandler() | ||
| 84 | + { | ||
| 85 | + currentHref = document.location.href; | ||
| 86 | + var flexAppUrl = getHash(); | ||
| 87 | + //ADR: to fix multiple | ||
| 88 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 89 | + var pl = getPlayers(); | ||
| 90 | + for (var i = 0; i < pl.length; i++) { | ||
| 91 | + pl[i].browserURLChange(flexAppUrl); | ||
| 92 | + } | ||
| 93 | + } else { | ||
| 94 | + getPlayer().browserURLChange(flexAppUrl); | ||
| 95 | + } | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + // Accessor functions for obtaining specific elements of the page. | ||
| 99 | + function getHistoryFrame() | ||
| 100 | + { | ||
| 101 | + return document.getElementById('ie_historyFrame'); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + function getFormElement() | ||
| 105 | + { | ||
| 106 | + return document.getElementById('safari_formDiv'); | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + function getRememberElement() | ||
| 110 | + { | ||
| 111 | + return document.getElementById("safari_remember_field"); | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + // Get the Flash player object for performing ExternalInterface callbacks. | ||
| 115 | + // Updated for changes to SWFObject2. | ||
| 116 | + function getPlayer(id) { | ||
| 117 | + var i; | ||
| 118 | + | ||
| 119 | + if (id && document.getElementById(id)) { | ||
| 120 | + var r = document.getElementById(id); | ||
| 121 | + if (typeof r.SetVariable != "undefined") { | ||
| 122 | + return r; | ||
| 123 | + } | ||
| 124 | + else { | ||
| 125 | + var o = r.getElementsByTagName("object"); | ||
| 126 | + var e = r.getElementsByTagName("embed"); | ||
| 127 | + for (i = 0; i < o.length; i++) { | ||
| 128 | + if (typeof o[i].browserURLChange != "undefined") | ||
| 129 | + return o[i]; | ||
| 130 | + } | ||
| 131 | + for (i = 0; i < e.length; i++) { | ||
| 132 | + if (typeof e[i].browserURLChange != "undefined") | ||
| 133 | + return e[i]; | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | + } | ||
| 137 | + else { | ||
| 138 | + var o = document.getElementsByTagName("object"); | ||
| 139 | + var e = document.getElementsByTagName("embed"); | ||
| 140 | + for (i = 0; i < e.length; i++) { | ||
| 141 | + if (typeof e[i].browserURLChange != "undefined") | ||
| 142 | + { | ||
| 143 | + return e[i]; | ||
| 144 | + } | ||
| 145 | + } | ||
| 146 | + for (i = 0; i < o.length; i++) { | ||
| 147 | + if (typeof o[i].browserURLChange != "undefined") | ||
| 148 | + { | ||
| 149 | + return o[i]; | ||
| 150 | + } | ||
| 151 | + } | ||
| 152 | + } | ||
| 153 | + return undefined; | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + function getPlayers() { | ||
| 157 | + var i; | ||
| 158 | + var players = []; | ||
| 159 | + if (players.length == 0) { | ||
| 160 | + var tmp = document.getElementsByTagName('object'); | ||
| 161 | + for (i = 0; i < tmp.length; i++) | ||
| 162 | + { | ||
| 163 | + if (typeof tmp[i].browserURLChange != "undefined") | ||
| 164 | + players.push(tmp[i]); | ||
| 165 | + } | ||
| 166 | + } | ||
| 167 | + if (players.length == 0 || players[0].object == null) { | ||
| 168 | + var tmp = document.getElementsByTagName('embed'); | ||
| 169 | + for (i = 0; i < tmp.length; i++) | ||
| 170 | + { | ||
| 171 | + if (typeof tmp[i].browserURLChange != "undefined") | ||
| 172 | + players.push(tmp[i]); | ||
| 173 | + } | ||
| 174 | + } | ||
| 175 | + return players; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + function getIframeHash() { | ||
| 179 | + var doc = getHistoryFrame().contentWindow.document; | ||
| 180 | + var hash = String(doc.location.search); | ||
| 181 | + if (hash.length == 1 && hash.charAt(0) == "?") { | ||
| 182 | + hash = ""; | ||
| 183 | + } | ||
| 184 | + else if (hash.length >= 2 && hash.charAt(0) == "?") { | ||
| 185 | + hash = hash.substring(1); | ||
| 186 | + } | ||
| 187 | + return hash; | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + /* Get the current location hash excluding the '#' symbol. */ | ||
| 191 | + function getHash() { | ||
| 192 | + // It would be nice if we could use document.location.hash here, | ||
| 193 | + // but it's faulty sometimes. | ||
| 194 | + var idx = document.location.href.indexOf('#'); | ||
| 195 | + return (idx >= 0) ? document.location.href.substr(idx+1) : ''; | ||
| 196 | + } | ||
| 197 | + | ||
| 198 | + /* Get the current location hash excluding the '#' symbol. */ | ||
| 199 | + function setHash(hash) { | ||
| 200 | + // It would be nice if we could use document.location.hash here, | ||
| 201 | + // but it's faulty sometimes. | ||
| 202 | + if (hash == '') hash = '#' | ||
| 203 | + document.location.hash = hash; | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + function createState(baseUrl, newUrl, flexAppUrl) { | ||
| 207 | + return { 'baseUrl': baseUrl, 'newUrl': newUrl, 'flexAppUrl': flexAppUrl, 'title': null }; | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | + /* Add a history entry to the browser. | ||
| 211 | + * baseUrl: the portion of the location prior to the '#' | ||
| 212 | + * newUrl: the entire new URL, including '#' and following fragment | ||
| 213 | + * flexAppUrl: the portion of the location following the '#' only | ||
| 214 | + */ | ||
| 215 | + function addHistoryEntry(baseUrl, newUrl, flexAppUrl) { | ||
| 216 | + | ||
| 217 | + //delete all the history entries | ||
| 218 | + forwardStack = []; | ||
| 219 | + | ||
| 220 | + if (browser.ie) { | ||
| 221 | + //Check to see if we are being asked to do a navigate for the first | ||
| 222 | + //history entry, and if so ignore, because it's coming from the creation | ||
| 223 | + //of the history iframe | ||
| 224 | + if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) { | ||
| 225 | + currentHref = initialHref; | ||
| 226 | + return; | ||
| 227 | + } | ||
| 228 | + if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) { | ||
| 229 | + newUrl = baseUrl + '#' + defaultHash; | ||
| 230 | + flexAppUrl = defaultHash; | ||
| 231 | + } else { | ||
| 232 | + // for IE, tell the history frame to go somewhere without a '#' | ||
| 233 | + // in order to get this entry into the browser history. | ||
| 234 | + getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl; | ||
| 235 | + } | ||
| 236 | + setHash(flexAppUrl); | ||
| 237 | + } else { | ||
| 238 | + | ||
| 239 | + //ADR | ||
| 240 | + if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) { | ||
| 241 | + initialState = createState(baseUrl, newUrl, flexAppUrl); | ||
| 242 | + } else if(backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) { | ||
| 243 | + backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl); | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + if (browser.safari && !browserHasHashChange) { | ||
| 247 | + // for Safari, submit a form whose action points to the desired URL | ||
| 248 | + if (browser.version <= 419.3) { | ||
| 249 | + var file = window.location.pathname.toString(); | ||
| 250 | + file = file.substring(file.lastIndexOf("/")+1); | ||
| 251 | + getFormElement().innerHTML = '<form name="historyForm" action="'+file+'#' + flexAppUrl + '" method="GET"></form>'; | ||
| 252 | + //get the current elements and add them to the form | ||
| 253 | + var qs = window.location.search.substring(1); | ||
| 254 | + var qs_arr = qs.split("&"); | ||
| 255 | + for (var i = 0; i < qs_arr.length; i++) { | ||
| 256 | + var tmp = qs_arr[i].split("="); | ||
| 257 | + var elem = document.createElement("input"); | ||
| 258 | + elem.type = "hidden"; | ||
| 259 | + elem.name = tmp[0]; | ||
| 260 | + elem.value = tmp[1]; | ||
| 261 | + document.forms.historyForm.appendChild(elem); | ||
| 262 | + } | ||
| 263 | + document.forms.historyForm.submit(); | ||
| 264 | + } else { | ||
| 265 | + top.location.hash = flexAppUrl; | ||
| 266 | + } | ||
| 267 | + // We also have to maintain the history by hand for Safari | ||
| 268 | + historyHash[history.length] = flexAppUrl; | ||
| 269 | + _storeStates(); | ||
| 270 | + } else { | ||
| 271 | + // Otherwise, just tell the browser to go there | ||
| 272 | + setHash(flexAppUrl); | ||
| 273 | + } | ||
| 274 | + } | ||
| 275 | + backStack.push(createState(baseUrl, newUrl, flexAppUrl)); | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + function _storeStates() { | ||
| 279 | + if (browser.safari) { | ||
| 280 | + getRememberElement().value = historyHash.join(","); | ||
| 281 | + } | ||
| 282 | + } | ||
| 283 | + | ||
| 284 | + function handleBackButton() { | ||
| 285 | + //The "current" page is always at the top of the history stack. | ||
| 286 | + var current = backStack.pop(); | ||
| 287 | + if (!current) { return; } | ||
| 288 | + var last = backStack[backStack.length - 1]; | ||
| 289 | + if (!last && backStack.length == 0){ | ||
| 290 | + last = initialState; | ||
| 291 | + } | ||
| 292 | + forwardStack.push(current); | ||
| 293 | + } | ||
| 294 | + | ||
| 295 | + function handleForwardButton() { | ||
| 296 | + //summary: private method. Do not call this directly. | ||
| 297 | + | ||
| 298 | + var last = forwardStack.pop(); | ||
| 299 | + if (!last) { return; } | ||
| 300 | + backStack.push(last); | ||
| 301 | + } | ||
| 302 | + | ||
| 303 | + function handleArbitraryUrl() { | ||
| 304 | + //delete all the history entries | ||
| 305 | + forwardStack = []; | ||
| 306 | + } | ||
| 307 | + | ||
| 308 | + /* Called periodically to poll to see if we need to detect navigation that has occurred */ | ||
| 309 | + function checkForUrlChange() { | ||
| 310 | + | ||
| 311 | + if (browser.ie) { | ||
| 312 | + if (currentHref != document.location.href && currentHref + '#' != document.location.href) { | ||
| 313 | + //This occurs when the user has navigated to a specific URL | ||
| 314 | + //within the app, and didn't use browser back/forward | ||
| 315 | + //IE seems to have a bug where it stops updating the URL it | ||
| 316 | + //shows the end-user at this point, but programatically it | ||
| 317 | + //appears to be correct. Do a full app reload to get around | ||
| 318 | + //this issue. | ||
| 319 | + if (browser.version < 7) { | ||
| 320 | + currentHref = document.location.href; | ||
| 321 | + document.location.reload(); | ||
| 322 | + } else { | ||
| 323 | + if (getHash() != getIframeHash()) { | ||
| 324 | + // this.iframe.src = this.blankURL + hash; | ||
| 325 | + var sourceToSet = historyFrameSourcePrefix + getHash(); | ||
| 326 | + getHistoryFrame().src = sourceToSet; | ||
| 327 | + currentHref = document.location.href; | ||
| 328 | + } | ||
| 329 | + } | ||
| 330 | + } | ||
| 331 | + } | ||
| 332 | + | ||
| 333 | + if (browser.safari && !browserHasHashChange) { | ||
| 334 | + // For Safari, we have to check to see if history.length changed. | ||
| 335 | + if (currentHistoryLength >= 0 && history.length != currentHistoryLength) { | ||
| 336 | + //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|")); | ||
| 337 | + var flexAppUrl = getHash(); | ||
| 338 | + if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */) | ||
| 339 | + { | ||
| 340 | + // If it did change and we're running Safari 3.x or earlier, | ||
| 341 | + // then we have to look the old state up in our hand-maintained | ||
| 342 | + // array since document.location.hash won't have changed, | ||
| 343 | + // then call back into BrowserManager. | ||
| 344 | + currentHistoryLength = history.length; | ||
| 345 | + flexAppUrl = historyHash[currentHistoryLength]; | ||
| 346 | + } | ||
| 347 | + | ||
| 348 | + //ADR: to fix multiple | ||
| 349 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 350 | + var pl = getPlayers(); | ||
| 351 | + for (var i = 0; i < pl.length; i++) { | ||
| 352 | + pl[i].browserURLChange(flexAppUrl); | ||
| 353 | + } | ||
| 354 | + } else { | ||
| 355 | + getPlayer().browserURLChange(flexAppUrl); | ||
| 356 | + } | ||
| 357 | + _storeStates(); | ||
| 358 | + } | ||
| 359 | + } | ||
| 360 | + if (browser.firefox && !browserHasHashChange) { | ||
| 361 | + if (currentHref != document.location.href) { | ||
| 362 | + var bsl = backStack.length; | ||
| 363 | + | ||
| 364 | + var urlActions = { | ||
| 365 | + back: false, | ||
| 366 | + forward: false, | ||
| 367 | + set: false | ||
| 368 | + } | ||
| 369 | + | ||
| 370 | + if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) { | ||
| 371 | + urlActions.back = true; | ||
| 372 | + // FIXME: could this ever be a forward button? | ||
| 373 | + // we can't clear it because we still need to check for forwards. Ugg. | ||
| 374 | + // clearInterval(this.locationTimer); | ||
| 375 | + handleBackButton(); | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + // first check to see if we could have gone forward. We always halt on | ||
| 379 | + // a no-hash item. | ||
| 380 | + if (forwardStack.length > 0) { | ||
| 381 | + if (forwardStack[forwardStack.length-1].flexAppUrl == getHash()) { | ||
| 382 | + urlActions.forward = true; | ||
| 383 | + handleForwardButton(); | ||
| 384 | + } | ||
| 385 | + } | ||
| 386 | + | ||
| 387 | + // ok, that didn't work, try someplace back in the history stack | ||
| 388 | + if ((bsl >= 2) && (backStack[bsl - 2])) { | ||
| 389 | + if (backStack[bsl - 2].flexAppUrl == getHash()) { | ||
| 390 | + urlActions.back = true; | ||
| 391 | + handleBackButton(); | ||
| 392 | + } | ||
| 393 | + } | ||
| 394 | + | ||
| 395 | + if (!urlActions.back && !urlActions.forward) { | ||
| 396 | + var foundInStacks = { | ||
| 397 | + back: -1, | ||
| 398 | + forward: -1 | ||
| 399 | + } | ||
| 400 | + | ||
| 401 | + for (var i = 0; i < backStack.length; i++) { | ||
| 402 | + if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { | ||
| 403 | + arbitraryUrl = true; | ||
| 404 | + foundInStacks.back = i; | ||
| 405 | + } | ||
| 406 | + } | ||
| 407 | + for (var i = 0; i < forwardStack.length; i++) { | ||
| 408 | + if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { | ||
| 409 | + arbitraryUrl = true; | ||
| 410 | + foundInStacks.forward = i; | ||
| 411 | + } | ||
| 412 | + } | ||
| 413 | + handleArbitraryUrl(); | ||
| 414 | + } | ||
| 415 | + | ||
| 416 | + // Firefox changed; do a callback into BrowserManager to tell it. | ||
| 417 | + currentHref = document.location.href; | ||
| 418 | + var flexAppUrl = getHash(); | ||
| 419 | + //ADR: to fix multiple | ||
| 420 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 421 | + var pl = getPlayers(); | ||
| 422 | + for (var i = 0; i < pl.length; i++) { | ||
| 423 | + pl[i].browserURLChange(flexAppUrl); | ||
| 424 | + } | ||
| 425 | + } else { | ||
| 426 | + getPlayer().browserURLChange(flexAppUrl); | ||
| 427 | + } | ||
| 428 | + } | ||
| 429 | + } | ||
| 430 | + } | ||
| 431 | + | ||
| 432 | + var _initialize = function () { | ||
| 433 | + | ||
| 434 | + browserHasHashChange = ("onhashchange" in document.body); | ||
| 435 | + | ||
| 436 | + if (browser.ie) | ||
| 437 | + { | ||
| 438 | + var scripts = document.getElementsByTagName('script'); | ||
| 439 | + for (var i = 0, s; s = scripts[i]; i++) { | ||
| 440 | + if (s.src.indexOf("history.js") > -1) { | ||
| 441 | + var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html"); | ||
| 442 | + } | ||
| 443 | + } | ||
| 444 | + historyFrameSourcePrefix = iframe_location + "?"; | ||
| 445 | + var src = historyFrameSourcePrefix; | ||
| 446 | + | ||
| 447 | + var iframe = document.createElement("iframe"); | ||
| 448 | + iframe.id = 'ie_historyFrame'; | ||
| 449 | + iframe.name = 'ie_historyFrame'; | ||
| 450 | + iframe.src = 'javascript:false;'; | ||
| 451 | + | ||
| 452 | + try { | ||
| 453 | + document.body.appendChild(iframe); | ||
| 454 | + } catch(e) { | ||
| 455 | + setTimeout(function() { | ||
| 456 | + document.body.appendChild(iframe); | ||
| 457 | + }, 0); | ||
| 458 | + } | ||
| 459 | + } | ||
| 460 | + | ||
| 461 | + if (browser.safari && !browserHasHashChange) | ||
| 462 | + { | ||
| 463 | + var rememberDiv = document.createElement("div"); | ||
| 464 | + rememberDiv.id = 'safari_rememberDiv'; | ||
| 465 | + document.body.appendChild(rememberDiv); | ||
| 466 | + rememberDiv.innerHTML = '<input type="text" id="safari_remember_field" style="width: 500px;">'; | ||
| 467 | + | ||
| 468 | + var formDiv = document.createElement("div"); | ||
| 469 | + formDiv.id = 'safari_formDiv'; | ||
| 470 | + document.body.appendChild(formDiv); | ||
| 471 | + | ||
| 472 | + var reloader_content = document.createElement('div'); | ||
| 473 | + reloader_content.id = 'safarireloader'; | ||
| 474 | + var scripts = document.getElementsByTagName('script'); | ||
| 475 | + for (var i = 0, s; s = scripts[i]; i++) { | ||
| 476 | + if (s.src.indexOf("history.js") > -1) { | ||
| 477 | + html = (new String(s.src)).replace(".js", ".html"); | ||
| 478 | + } | ||
| 479 | + } | ||
| 480 | + reloader_content.innerHTML = '<iframe id="safarireloader-iframe" src="about:blank" frameborder="no" scrolling="no"></iframe>'; | ||
| 481 | + document.body.appendChild(reloader_content); | ||
| 482 | + reloader_content.style.position = 'absolute'; | ||
| 483 | + reloader_content.style.left = reloader_content.style.top = '-9999px'; | ||
| 484 | + iframe = reloader_content.getElementsByTagName('iframe')[0]; | ||
| 485 | + | ||
| 486 | + if (document.getElementById("safari_remember_field").value != "" ) { | ||
| 487 | + historyHash = document.getElementById("safari_remember_field").value.split(","); | ||
| 488 | + } | ||
| 489 | + } | ||
| 490 | + | ||
| 491 | + if (browserHasHashChange) | ||
| 492 | + document.body.onhashchange = hashChangeHandler; | ||
| 493 | + } | ||
| 494 | + | ||
| 495 | + return { | ||
| 496 | + historyHash: historyHash, | ||
| 497 | + backStack: function() { return backStack; }, | ||
| 498 | + forwardStack: function() { return forwardStack }, | ||
| 499 | + getPlayer: getPlayer, | ||
| 500 | + initialize: function(src) { | ||
| 501 | + _initialize(src); | ||
| 502 | + }, | ||
| 503 | + setURL: function(url) { | ||
| 504 | + document.location.href = url; | ||
| 505 | + }, | ||
| 506 | + getURL: function() { | ||
| 507 | + return document.location.href; | ||
| 508 | + }, | ||
| 509 | + getTitle: function() { | ||
| 510 | + return document.title; | ||
| 511 | + }, | ||
| 512 | + setTitle: function(title) { | ||
| 513 | + try { | ||
| 514 | + backStack[backStack.length - 1].title = title; | ||
| 515 | + } catch(e) { } | ||
| 516 | + //if on safari, set the title to be the empty string. | ||
| 517 | + if (browser.safari) { | ||
| 518 | + if (title == "") { | ||
| 519 | + try { | ||
| 520 | + var tmp = window.location.href.toString(); | ||
| 521 | + title = tmp.substring((tmp.lastIndexOf("/")+1), tmp.lastIndexOf("#")); | ||
| 522 | + } catch(e) { | ||
| 523 | + title = ""; | ||
| 524 | + } | ||
| 525 | + } | ||
| 526 | + } | ||
| 527 | + document.title = title; | ||
| 528 | + }, | ||
| 529 | + setDefaultURL: function(def) | ||
| 530 | + { | ||
| 531 | + defaultHash = def; | ||
| 532 | + def = getHash(); | ||
| 533 | + //trailing ? is important else an extra frame gets added to the history | ||
| 534 | + //when navigating back to the first page. Alternatively could check | ||
| 535 | + //in history frame navigation to compare # and ?. | ||
| 536 | + if (browser.ie) | ||
| 537 | + { | ||
| 538 | + window['_ie_firstload'] = true; | ||
| 539 | + var sourceToSet = historyFrameSourcePrefix + def; | ||
| 540 | + var func = function() { | ||
| 541 | + getHistoryFrame().src = sourceToSet; | ||
| 542 | + window.location.replace("#" + def); | ||
| 543 | + setInterval(checkForUrlChange, 50); | ||
| 544 | + } | ||
| 545 | + try { | ||
| 546 | + func(); | ||
| 547 | + } catch(e) { | ||
| 548 | + window.setTimeout(function() { func(); }, 0); | ||
| 549 | + } | ||
| 550 | + } | ||
| 551 | + | ||
| 552 | + if (browser.safari) | ||
| 553 | + { | ||
| 554 | + currentHistoryLength = history.length; | ||
| 555 | + if (historyHash.length == 0) { | ||
| 556 | + historyHash[currentHistoryLength] = def; | ||
| 557 | + var newloc = "#" + def; | ||
| 558 | + window.location.replace(newloc); | ||
| 559 | + } else { | ||
| 560 | + //alert(historyHash[historyHash.length-1]); | ||
| 561 | + } | ||
| 562 | + setInterval(checkForUrlChange, 50); | ||
| 563 | + } | ||
| 564 | + | ||
| 565 | + | ||
| 566 | + if (browser.firefox || browser.opera) | ||
| 567 | + { | ||
| 568 | + var reg = new RegExp("#" + def + "$"); | ||
| 569 | + if (window.location.toString().match(reg)) { | ||
| 570 | + } else { | ||
| 571 | + var newloc ="#" + def; | ||
| 572 | + window.location.replace(newloc); | ||
| 573 | + } | ||
| 574 | + setInterval(checkForUrlChange, 50); | ||
| 575 | + } | ||
| 576 | + | ||
| 577 | + }, | ||
| 578 | + | ||
| 579 | + /* Set the current browser URL; called from inside BrowserManager to propagate | ||
| 580 | + * the application state out to the container. | ||
| 581 | + */ | ||
| 582 | + setBrowserURL: function(flexAppUrl, objectId) { | ||
| 583 | + if (browser.ie && typeof objectId != "undefined") { | ||
| 584 | + currentObjectId = objectId; | ||
| 585 | + } | ||
| 586 | + //fromIframe = fromIframe || false; | ||
| 587 | + //fromFlex = fromFlex || false; | ||
| 588 | + //alert("setBrowserURL: " + flexAppUrl); | ||
| 589 | + //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ; | ||
| 590 | + | ||
| 591 | + var pos = document.location.href.indexOf('#'); | ||
| 592 | + var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href; | ||
| 593 | + var newUrl = baseUrl + '#' + flexAppUrl; | ||
| 594 | + | ||
| 595 | + if (document.location.href != newUrl && document.location.href + '#' != newUrl) { | ||
| 596 | + currentHref = newUrl; | ||
| 597 | + addHistoryEntry(baseUrl, newUrl, flexAppUrl); | ||
| 598 | + currentHistoryLength = history.length; | ||
| 599 | + } | ||
| 600 | + }, | ||
| 601 | + | ||
| 602 | + browserURLChange: function(flexAppUrl) { | ||
| 603 | + var objectId = null; | ||
| 604 | + if (browser.ie && currentObjectId != null) { | ||
| 605 | + objectId = currentObjectId; | ||
| 606 | + } | ||
| 607 | + | ||
| 608 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 609 | + var pl = getPlayers(); | ||
| 610 | + for (var i = 0; i < pl.length; i++) { | ||
| 611 | + try { | ||
| 612 | + pl[i].browserURLChange(flexAppUrl); | ||
| 613 | + } catch(e) { } | ||
| 614 | + } | ||
| 615 | + } else { | ||
| 616 | + try { | ||
| 617 | + getPlayer(objectId).browserURLChange(flexAppUrl); | ||
| 618 | + } catch(e) { } | ||
| 619 | + } | ||
| 620 | + | ||
| 621 | + currentObjectId = null; | ||
| 622 | + }, | ||
| 623 | + getUserAgent: function() { | ||
| 624 | + return navigator.userAgent; | ||
| 625 | + }, | ||
| 626 | + getPlatform: function() { | ||
| 627 | + return navigator.platform; | ||
| 628 | + } | ||
| 629 | + | ||
| 630 | + } | ||
| 631 | + | ||
| 632 | +})(); | ||
| 633 | + | ||
| 634 | +// Initialization | ||
| 635 | + | ||
| 636 | +// Automated unit testing and other diagnostics | ||
| 637 | + | ||
| 638 | +function setURL(url) | ||
| 639 | +{ | ||
| 640 | + document.location.href = url; | ||
| 641 | +} | ||
| 642 | + | ||
| 643 | +function backButton() | ||
| 644 | +{ | ||
| 645 | + history.back(); | ||
| 646 | +} | ||
| 647 | + | ||
| 648 | +function forwardButton() | ||
| 649 | +{ | ||
| 650 | + history.forward(); | ||
| 651 | +} | ||
| 652 | + | ||
| 653 | +function goForwardOrBackInHistory(step) | ||
| 654 | +{ | ||
| 655 | + history.go(step); | ||
| 656 | +} | ||
| 657 | + | ||
| 658 | +//BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); }); | ||
| 659 | +(function(i) { | ||
| 660 | + var u =navigator.userAgent;var e=/*@cc_on!@*/false; | ||
| 661 | + var st = setTimeout; | ||
| 662 | + if(/webkit/i.test(u)){ | ||
| 663 | + st(function(){ | ||
| 664 | + var dr=document.readyState; | ||
| 665 | + if(dr=="loaded"||dr=="complete"){i()} | ||
| 666 | + else{st(arguments.callee,10);}},10); | ||
| 667 | + } else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){ | ||
| 668 | + document.addEventListener("DOMContentLoaded",i,false); | ||
| 669 | + } else if(e){ | ||
| 670 | + (function(){ | ||
| 671 | + var t=document.createElement('doc:rdy'); | ||
| 672 | + try{t.doScroll('left'); | ||
| 673 | + i();t=null; | ||
| 674 | + }catch(e){st(arguments.callee,0);}})(); | ||
| 675 | + } else{ | ||
| 676 | + window.onload=i; | ||
| 677 | + } | ||
| 678 | +})( function() {BrowserHistory.initialize();} ); |
| 1 | +<html> | ||
| 2 | + <head> | ||
| 3 | + <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> | ||
| 4 | + <META HTTP-EQUIV="Expires" CONTENT="-1"> | ||
| 5 | + </head> | ||
| 6 | + <body> | ||
| 7 | + <script> | ||
| 8 | + function processUrl() | ||
| 9 | + { | ||
| 10 | + | ||
| 11 | + var pos = url.indexOf("?"); | ||
| 12 | + url = pos != -1 ? url.substr(pos + 1) : ""; | ||
| 13 | + if (!parent._ie_firstload) { | ||
| 14 | + parent.BrowserHistory.setBrowserURL(url); | ||
| 15 | + try { | ||
| 16 | + parent.BrowserHistory.browserURLChange(url); | ||
| 17 | + } catch(e) { } | ||
| 18 | + } else { | ||
| 19 | + parent._ie_firstload = false; | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | + | ||
| 23 | + var url = document.location.href; | ||
| 24 | + processUrl(); | ||
| 25 | + document.write(encodeURIComponent(url)); | ||
| 26 | + </script> | ||
| 27 | + Hidden frame for Browser History support. | ||
| 28 | + </body> | ||
| 29 | +</html> |
不能预览此文件类型
trunk/research/SrsBW/bin-debug/swfobject.js
0 → 100644
| 1 | +/*! SWFObject v2.2 <http://code.google.com/p/swfobject/> | ||
| 2 | + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> | ||
| 3 | +*/ | ||
| 4 | + | ||
| 5 | +var swfobject = function() { | ||
| 6 | + | ||
| 7 | + var UNDEF = "undefined", | ||
| 8 | + OBJECT = "object", | ||
| 9 | + SHOCKWAVE_FLASH = "Shockwave Flash", | ||
| 10 | + SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", | ||
| 11 | + FLASH_MIME_TYPE = "application/x-shockwave-flash", | ||
| 12 | + EXPRESS_INSTALL_ID = "SWFObjectExprInst", | ||
| 13 | + ON_READY_STATE_CHANGE = "onreadystatechange", | ||
| 14 | + | ||
| 15 | + win = window, | ||
| 16 | + doc = document, | ||
| 17 | + nav = navigator, | ||
| 18 | + | ||
| 19 | + plugin = false, | ||
| 20 | + domLoadFnArr = [main], | ||
| 21 | + regObjArr = [], | ||
| 22 | + objIdArr = [], | ||
| 23 | + listenersArr = [], | ||
| 24 | + storedAltContent, | ||
| 25 | + storedAltContentId, | ||
| 26 | + storedCallbackFn, | ||
| 27 | + storedCallbackObj, | ||
| 28 | + isDomLoaded = false, | ||
| 29 | + isExpressInstallActive = false, | ||
| 30 | + dynamicStylesheet, | ||
| 31 | + dynamicStylesheetMedia, | ||
| 32 | + autoHideShow = true, | ||
| 33 | + | ||
| 34 | + /* Centralized function for browser feature detection | ||
| 35 | + - User agent string detection is only used when no good alternative is possible | ||
| 36 | + - Is executed directly for optimal performance | ||
| 37 | + */ | ||
| 38 | + ua = function() { | ||
| 39 | + var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, | ||
| 40 | + u = nav.userAgent.toLowerCase(), | ||
| 41 | + p = nav.platform.toLowerCase(), | ||
| 42 | + windows = p ? /win/.test(p) : /win/.test(u), | ||
| 43 | + mac = p ? /mac/.test(p) : /mac/.test(u), | ||
| 44 | + webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit | ||
| 45 | + 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 | ||
| 46 | + playerVersion = [0,0,0], | ||
| 47 | + d = null; | ||
| 48 | + if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { | ||
| 49 | + d = nav.plugins[SHOCKWAVE_FLASH].description; | ||
| 50 | + 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+ | ||
| 51 | + plugin = true; | ||
| 52 | + ie = false; // cascaded feature detection for Internet Explorer | ||
| 53 | + d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); | ||
| 54 | + playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); | ||
| 55 | + playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); | ||
| 56 | + playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + else if (typeof win.ActiveXObject != UNDEF) { | ||
| 60 | + try { | ||
| 61 | + var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); | ||
| 62 | + if (a) { // a will return null when ActiveX is disabled | ||
| 63 | + d = a.GetVariable("$version"); | ||
| 64 | + if (d) { | ||
| 65 | + ie = true; // cascaded feature detection for Internet Explorer | ||
| 66 | + d = d.split(" ")[1].split(","); | ||
| 67 | + playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + catch(e) {} | ||
| 72 | + } | ||
| 73 | + return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; | ||
| 74 | + }(), | ||
| 75 | + | ||
| 76 | + /* Cross-browser onDomLoad | ||
| 77 | + - Will fire an event as soon as the DOM of a web page is loaded | ||
| 78 | + - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/ | ||
| 79 | + - Regular onload serves as fallback | ||
| 80 | + */ | ||
| 81 | + onDomLoad = function() { | ||
| 82 | + if (!ua.w3) { return; } | ||
| 83 | + 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 | ||
| 84 | + callDomLoadFunctions(); | ||
| 85 | + } | ||
| 86 | + if (!isDomLoaded) { | ||
| 87 | + if (typeof doc.addEventListener != UNDEF) { | ||
| 88 | + doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false); | ||
| 89 | + } | ||
| 90 | + if (ua.ie && ua.win) { | ||
| 91 | + doc.attachEvent(ON_READY_STATE_CHANGE, function() { | ||
| 92 | + if (doc.readyState == "complete") { | ||
| 93 | + doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); | ||
| 94 | + callDomLoadFunctions(); | ||
| 95 | + } | ||
| 96 | + }); | ||
| 97 | + if (win == top) { // if not inside an iframe | ||
| 98 | + (function(){ | ||
| 99 | + if (isDomLoaded) { return; } | ||
| 100 | + try { | ||
| 101 | + doc.documentElement.doScroll("left"); | ||
| 102 | + } | ||
| 103 | + catch(e) { | ||
| 104 | + setTimeout(arguments.callee, 0); | ||
| 105 | + return; | ||
| 106 | + } | ||
| 107 | + callDomLoadFunctions(); | ||
| 108 | + })(); | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | + if (ua.wk) { | ||
| 112 | + (function(){ | ||
| 113 | + if (isDomLoaded) { return; } | ||
| 114 | + if (!/loaded|complete/.test(doc.readyState)) { | ||
| 115 | + setTimeout(arguments.callee, 0); | ||
| 116 | + return; | ||
| 117 | + } | ||
| 118 | + callDomLoadFunctions(); | ||
| 119 | + })(); | ||
| 120 | + } | ||
| 121 | + addLoadEvent(callDomLoadFunctions); | ||
| 122 | + } | ||
| 123 | + }(); | ||
| 124 | + | ||
| 125 | + function callDomLoadFunctions() { | ||
| 126 | + if (isDomLoaded) { return; } | ||
| 127 | + try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early | ||
| 128 | + var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); | ||
| 129 | + t.parentNode.removeChild(t); | ||
| 130 | + } | ||
| 131 | + catch (e) { return; } | ||
| 132 | + isDomLoaded = true; | ||
| 133 | + var dl = domLoadFnArr.length; | ||
| 134 | + for (var i = 0; i < dl; i++) { | ||
| 135 | + domLoadFnArr[i](); | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + function addDomLoadEvent(fn) { | ||
| 140 | + if (isDomLoaded) { | ||
| 141 | + fn(); | ||
| 142 | + } | ||
| 143 | + else { | ||
| 144 | + domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + /* Cross-browser onload | ||
| 149 | + - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ | ||
| 150 | + - Will fire an event as soon as a web page including all of its assets are loaded | ||
| 151 | + */ | ||
| 152 | + function addLoadEvent(fn) { | ||
| 153 | + if (typeof win.addEventListener != UNDEF) { | ||
| 154 | + win.addEventListener("load", fn, false); | ||
| 155 | + } | ||
| 156 | + else if (typeof doc.addEventListener != UNDEF) { | ||
| 157 | + doc.addEventListener("load", fn, false); | ||
| 158 | + } | ||
| 159 | + else if (typeof win.attachEvent != UNDEF) { | ||
| 160 | + addListener(win, "onload", fn); | ||
| 161 | + } | ||
| 162 | + else if (typeof win.onload == "function") { | ||
| 163 | + var fnOld = win.onload; | ||
| 164 | + win.onload = function() { | ||
| 165 | + fnOld(); | ||
| 166 | + fn(); | ||
| 167 | + }; | ||
| 168 | + } | ||
| 169 | + else { | ||
| 170 | + win.onload = fn; | ||
| 171 | + } | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + /* Main function | ||
| 175 | + - Will preferably execute onDomLoad, otherwise onload (as a fallback) | ||
| 176 | + */ | ||
| 177 | + function main() { | ||
| 178 | + if (plugin) { | ||
| 179 | + testPlayerVersion(); | ||
| 180 | + } | ||
| 181 | + else { | ||
| 182 | + matchVersions(); | ||
| 183 | + } | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + /* Detect the Flash Player version for non-Internet Explorer browsers | ||
| 187 | + - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: | ||
| 188 | + a. Both release and build numbers can be detected | ||
| 189 | + b. Avoid wrong descriptions by corrupt installers provided by Adobe | ||
| 190 | + c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports | ||
| 191 | + - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available | ||
| 192 | + */ | ||
| 193 | + function testPlayerVersion() { | ||
| 194 | + var b = doc.getElementsByTagName("body")[0]; | ||
| 195 | + var o = createElement(OBJECT); | ||
| 196 | + o.setAttribute("type", FLASH_MIME_TYPE); | ||
| 197 | + var t = b.appendChild(o); | ||
| 198 | + if (t) { | ||
| 199 | + var counter = 0; | ||
| 200 | + (function(){ | ||
| 201 | + if (typeof t.GetVariable != UNDEF) { | ||
| 202 | + var d = t.GetVariable("$version"); | ||
| 203 | + if (d) { | ||
| 204 | + d = d.split(" ")[1].split(","); | ||
| 205 | + ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; | ||
| 206 | + } | ||
| 207 | + } | ||
| 208 | + else if (counter < 10) { | ||
| 209 | + counter++; | ||
| 210 | + setTimeout(arguments.callee, 10); | ||
| 211 | + return; | ||
| 212 | + } | ||
| 213 | + b.removeChild(o); | ||
| 214 | + t = null; | ||
| 215 | + matchVersions(); | ||
| 216 | + })(); | ||
| 217 | + } | ||
| 218 | + else { | ||
| 219 | + matchVersions(); | ||
| 220 | + } | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + /* Perform Flash Player and SWF version matching; static publishing only | ||
| 224 | + */ | ||
| 225 | + function matchVersions() { | ||
| 226 | + var rl = regObjArr.length; | ||
| 227 | + if (rl > 0) { | ||
| 228 | + for (var i = 0; i < rl; i++) { // for each registered object element | ||
| 229 | + var id = regObjArr[i].id; | ||
| 230 | + var cb = regObjArr[i].callbackFn; | ||
| 231 | + var cbObj = {success:false, id:id}; | ||
| 232 | + if (ua.pv[0] > 0) { | ||
| 233 | + var obj = getElementById(id); | ||
| 234 | + if (obj) { | ||
| 235 | + if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match! | ||
| 236 | + setVisibility(id, true); | ||
| 237 | + if (cb) { | ||
| 238 | + cbObj.success = true; | ||
| 239 | + cbObj.ref = getObjectById(id); | ||
| 240 | + cb(cbObj); | ||
| 241 | + } | ||
| 242 | + } | ||
| 243 | + else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported | ||
| 244 | + var att = {}; | ||
| 245 | + att.data = regObjArr[i].expressInstall; | ||
| 246 | + att.width = obj.getAttribute("width") || "0"; | ||
| 247 | + att.height = obj.getAttribute("height") || "0"; | ||
| 248 | + if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); } | ||
| 249 | + if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); } | ||
| 250 | + // parse HTML object param element's name-value pairs | ||
| 251 | + var par = {}; | ||
| 252 | + var p = obj.getElementsByTagName("param"); | ||
| 253 | + var pl = p.length; | ||
| 254 | + for (var j = 0; j < pl; j++) { | ||
| 255 | + if (p[j].getAttribute("name").toLowerCase() != "movie") { | ||
| 256 | + par[p[j].getAttribute("name")] = p[j].getAttribute("value"); | ||
| 257 | + } | ||
| 258 | + } | ||
| 259 | + showExpressInstall(att, par, id, cb); | ||
| 260 | + } | ||
| 261 | + 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 | ||
| 262 | + displayAltContent(obj); | ||
| 263 | + if (cb) { cb(cbObj); } | ||
| 264 | + } | ||
| 265 | + } | ||
| 266 | + } | ||
| 267 | + 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) | ||
| 268 | + setVisibility(id, true); | ||
| 269 | + if (cb) { | ||
| 270 | + var o = getObjectById(id); // test whether there is an HTML object element or not | ||
| 271 | + if (o && typeof o.SetVariable != UNDEF) { | ||
| 272 | + cbObj.success = true; | ||
| 273 | + cbObj.ref = o; | ||
| 274 | + } | ||
| 275 | + cb(cbObj); | ||
| 276 | + } | ||
| 277 | + } | ||
| 278 | + } | ||
| 279 | + } | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + function getObjectById(objectIdStr) { | ||
| 283 | + var r = null; | ||
| 284 | + var o = getElementById(objectIdStr); | ||
| 285 | + if (o && o.nodeName == "OBJECT") { | ||
| 286 | + if (typeof o.SetVariable != UNDEF) { | ||
| 287 | + r = o; | ||
| 288 | + } | ||
| 289 | + else { | ||
| 290 | + var n = o.getElementsByTagName(OBJECT)[0]; | ||
| 291 | + if (n) { | ||
| 292 | + r = n; | ||
| 293 | + } | ||
| 294 | + } | ||
| 295 | + } | ||
| 296 | + return r; | ||
| 297 | + } | ||
| 298 | + | ||
| 299 | + /* Requirements for Adobe Express Install | ||
| 300 | + - only one instance can be active at a time | ||
| 301 | + - fp 6.0.65 or higher | ||
| 302 | + - Win/Mac OS only | ||
| 303 | + - no Webkit engines older than version 312 | ||
| 304 | + */ | ||
| 305 | + function canExpressInstall() { | ||
| 306 | + return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312); | ||
| 307 | + } | ||
| 308 | + | ||
| 309 | + /* Show the Adobe Express Install dialog | ||
| 310 | + - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 | ||
| 311 | + */ | ||
| 312 | + function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { | ||
| 313 | + isExpressInstallActive = true; | ||
| 314 | + storedCallbackFn = callbackFn || null; | ||
| 315 | + storedCallbackObj = {success:false, id:replaceElemIdStr}; | ||
| 316 | + var obj = getElementById(replaceElemIdStr); | ||
| 317 | + if (obj) { | ||
| 318 | + if (obj.nodeName == "OBJECT") { // static publishing | ||
| 319 | + storedAltContent = abstractAltContent(obj); | ||
| 320 | + storedAltContentId = null; | ||
| 321 | + } | ||
| 322 | + else { // dynamic publishing | ||
| 323 | + storedAltContent = obj; | ||
| 324 | + storedAltContentId = replaceElemIdStr; | ||
| 325 | + } | ||
| 326 | + att.id = EXPRESS_INSTALL_ID; | ||
| 327 | + if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; } | ||
| 328 | + if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; } | ||
| 329 | + doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; | ||
| 330 | + var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", | ||
| 331 | + fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; | ||
| 332 | + if (typeof par.flashvars != UNDEF) { | ||
| 333 | + par.flashvars += "&" + fv; | ||
| 334 | + } | ||
| 335 | + else { | ||
| 336 | + par.flashvars = fv; | ||
| 337 | + } | ||
| 338 | + // 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, | ||
| 339 | + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work | ||
| 340 | + if (ua.ie && ua.win && obj.readyState != 4) { | ||
| 341 | + var newObj = createElement("div"); | ||
| 342 | + replaceElemIdStr += "SWFObjectNew"; | ||
| 343 | + newObj.setAttribute("id", replaceElemIdStr); | ||
| 344 | + obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf | ||
| 345 | + obj.style.display = "none"; | ||
| 346 | + (function(){ | ||
| 347 | + if (obj.readyState == 4) { | ||
| 348 | + obj.parentNode.removeChild(obj); | ||
| 349 | + } | ||
| 350 | + else { | ||
| 351 | + setTimeout(arguments.callee, 10); | ||
| 352 | + } | ||
| 353 | + })(); | ||
| 354 | + } | ||
| 355 | + createSWF(att, par, replaceElemIdStr); | ||
| 356 | + } | ||
| 357 | + } | ||
| 358 | + | ||
| 359 | + /* Functions to abstract and display alternative content | ||
| 360 | + */ | ||
| 361 | + function displayAltContent(obj) { | ||
| 362 | + if (ua.ie && ua.win && obj.readyState != 4) { | ||
| 363 | + // 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, | ||
| 364 | + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work | ||
| 365 | + var el = createElement("div"); | ||
| 366 | + obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content | ||
| 367 | + el.parentNode.replaceChild(abstractAltContent(obj), el); | ||
| 368 | + obj.style.display = "none"; | ||
| 369 | + (function(){ | ||
| 370 | + if (obj.readyState == 4) { | ||
| 371 | + obj.parentNode.removeChild(obj); | ||
| 372 | + } | ||
| 373 | + else { | ||
| 374 | + setTimeout(arguments.callee, 10); | ||
| 375 | + } | ||
| 376 | + })(); | ||
| 377 | + } | ||
| 378 | + else { | ||
| 379 | + obj.parentNode.replaceChild(abstractAltContent(obj), obj); | ||
| 380 | + } | ||
| 381 | + } | ||
| 382 | + | ||
| 383 | + function abstractAltContent(obj) { | ||
| 384 | + var ac = createElement("div"); | ||
| 385 | + if (ua.win && ua.ie) { | ||
| 386 | + ac.innerHTML = obj.innerHTML; | ||
| 387 | + } | ||
| 388 | + else { | ||
| 389 | + var nestedObj = obj.getElementsByTagName(OBJECT)[0]; | ||
| 390 | + if (nestedObj) { | ||
| 391 | + var c = nestedObj.childNodes; | ||
| 392 | + if (c) { | ||
| 393 | + var cl = c.length; | ||
| 394 | + for (var i = 0; i < cl; i++) { | ||
| 395 | + if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { | ||
| 396 | + ac.appendChild(c[i].cloneNode(true)); | ||
| 397 | + } | ||
| 398 | + } | ||
| 399 | + } | ||
| 400 | + } | ||
| 401 | + } | ||
| 402 | + return ac; | ||
| 403 | + } | ||
| 404 | + | ||
| 405 | + /* Cross-browser dynamic SWF creation | ||
| 406 | + */ | ||
| 407 | + function createSWF(attObj, parObj, id) { | ||
| 408 | + var r, el = getElementById(id); | ||
| 409 | + if (ua.wk && ua.wk < 312) { return r; } | ||
| 410 | + if (el) { | ||
| 411 | + if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content | ||
| 412 | + attObj.id = id; | ||
| 413 | + } | ||
| 414 | + if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML | ||
| 415 | + var att = ""; | ||
| 416 | + for (var i in attObj) { | ||
| 417 | + if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries | ||
| 418 | + if (i.toLowerCase() == "data") { | ||
| 419 | + parObj.movie = attObj[i]; | ||
| 420 | + } | ||
| 421 | + else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword | ||
| 422 | + att += ' class="' + attObj[i] + '"'; | ||
| 423 | + } | ||
| 424 | + else if (i.toLowerCase() != "classid") { | ||
| 425 | + att += ' ' + i + '="' + attObj[i] + '"'; | ||
| 426 | + } | ||
| 427 | + } | ||
| 428 | + } | ||
| 429 | + var par = ""; | ||
| 430 | + for (var j in parObj) { | ||
| 431 | + if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries | ||
| 432 | + par += '<param name="' + j + '" value="' + parObj[j] + '" />'; | ||
| 433 | + } | ||
| 434 | + } | ||
| 435 | + el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>'; | ||
| 436 | + objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only) | ||
| 437 | + r = getElementById(attObj.id); | ||
| 438 | + } | ||
| 439 | + else { // well-behaving browsers | ||
| 440 | + var o = createElement(OBJECT); | ||
| 441 | + o.setAttribute("type", FLASH_MIME_TYPE); | ||
| 442 | + for (var m in attObj) { | ||
| 443 | + if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries | ||
| 444 | + if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword | ||
| 445 | + o.setAttribute("class", attObj[m]); | ||
| 446 | + } | ||
| 447 | + else if (m.toLowerCase() != "classid") { // filter out IE specific attribute | ||
| 448 | + o.setAttribute(m, attObj[m]); | ||
| 449 | + } | ||
| 450 | + } | ||
| 451 | + } | ||
| 452 | + for (var n in parObj) { | ||
| 453 | + if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element | ||
| 454 | + createObjParam(o, n, parObj[n]); | ||
| 455 | + } | ||
| 456 | + } | ||
| 457 | + el.parentNode.replaceChild(o, el); | ||
| 458 | + r = o; | ||
| 459 | + } | ||
| 460 | + } | ||
| 461 | + return r; | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + function createObjParam(el, pName, pValue) { | ||
| 465 | + var p = createElement("param"); | ||
| 466 | + p.setAttribute("name", pName); | ||
| 467 | + p.setAttribute("value", pValue); | ||
| 468 | + el.appendChild(p); | ||
| 469 | + } | ||
| 470 | + | ||
| 471 | + /* Cross-browser SWF removal | ||
| 472 | + - Especially needed to safely and completely remove a SWF in Internet Explorer | ||
| 473 | + */ | ||
| 474 | + function removeSWF(id) { | ||
| 475 | + var obj = getElementById(id); | ||
| 476 | + if (obj && obj.nodeName == "OBJECT") { | ||
| 477 | + if (ua.ie && ua.win) { | ||
| 478 | + obj.style.display = "none"; | ||
| 479 | + (function(){ | ||
| 480 | + if (obj.readyState == 4) { | ||
| 481 | + removeObjectInIE(id); | ||
| 482 | + } | ||
| 483 | + else { | ||
| 484 | + setTimeout(arguments.callee, 10); | ||
| 485 | + } | ||
| 486 | + })(); | ||
| 487 | + } | ||
| 488 | + else { | ||
| 489 | + obj.parentNode.removeChild(obj); | ||
| 490 | + } | ||
| 491 | + } | ||
| 492 | + } | ||
| 493 | + | ||
| 494 | + function removeObjectInIE(id) { | ||
| 495 | + var obj = getElementById(id); | ||
| 496 | + if (obj) { | ||
| 497 | + for (var i in obj) { | ||
| 498 | + if (typeof obj[i] == "function") { | ||
| 499 | + obj[i] = null; | ||
| 500 | + } | ||
| 501 | + } | ||
| 502 | + obj.parentNode.removeChild(obj); | ||
| 503 | + } | ||
| 504 | + } | ||
| 505 | + | ||
| 506 | + /* Functions to optimize JavaScript compression | ||
| 507 | + */ | ||
| 508 | + function getElementById(id) { | ||
| 509 | + var el = null; | ||
| 510 | + try { | ||
| 511 | + el = doc.getElementById(id); | ||
| 512 | + } | ||
| 513 | + catch (e) {} | ||
| 514 | + return el; | ||
| 515 | + } | ||
| 516 | + | ||
| 517 | + function createElement(el) { | ||
| 518 | + return doc.createElement(el); | ||
| 519 | + } | ||
| 520 | + | ||
| 521 | + /* Updated attachEvent function for Internet Explorer | ||
| 522 | + - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks | ||
| 523 | + */ | ||
| 524 | + function addListener(target, eventType, fn) { | ||
| 525 | + target.attachEvent(eventType, fn); | ||
| 526 | + listenersArr[listenersArr.length] = [target, eventType, fn]; | ||
| 527 | + } | ||
| 528 | + | ||
| 529 | + /* Flash Player and SWF content version matching | ||
| 530 | + */ | ||
| 531 | + function hasPlayerVersion(rv) { | ||
| 532 | + var pv = ua.pv, v = rv.split("."); | ||
| 533 | + v[0] = parseInt(v[0], 10); | ||
| 534 | + v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0" | ||
| 535 | + v[2] = parseInt(v[2], 10) || 0; | ||
| 536 | + 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; | ||
| 537 | + } | ||
| 538 | + | ||
| 539 | + /* Cross-browser dynamic CSS creation | ||
| 540 | + - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php | ||
| 541 | + */ | ||
| 542 | + function createCSS(sel, decl, media, newStyle) { | ||
| 543 | + if (ua.ie && ua.mac) { return; } | ||
| 544 | + var h = doc.getElementsByTagName("head")[0]; | ||
| 545 | + if (!h) { return; } // to also support badly authored HTML pages that lack a head element | ||
| 546 | + var m = (media && typeof media == "string") ? media : "screen"; | ||
| 547 | + if (newStyle) { | ||
| 548 | + dynamicStylesheet = null; | ||
| 549 | + dynamicStylesheetMedia = null; | ||
| 550 | + } | ||
| 551 | + if (!dynamicStylesheet || dynamicStylesheetMedia != m) { | ||
| 552 | + // create dynamic stylesheet + get a global reference to it | ||
| 553 | + var s = createElement("style"); | ||
| 554 | + s.setAttribute("type", "text/css"); | ||
| 555 | + s.setAttribute("media", m); | ||
| 556 | + dynamicStylesheet = h.appendChild(s); | ||
| 557 | + if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { | ||
| 558 | + dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; | ||
| 559 | + } | ||
| 560 | + dynamicStylesheetMedia = m; | ||
| 561 | + } | ||
| 562 | + // add style rule | ||
| 563 | + if (ua.ie && ua.win) { | ||
| 564 | + if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { | ||
| 565 | + dynamicStylesheet.addRule(sel, decl); | ||
| 566 | + } | ||
| 567 | + } | ||
| 568 | + else { | ||
| 569 | + if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { | ||
| 570 | + dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}")); | ||
| 571 | + } | ||
| 572 | + } | ||
| 573 | + } | ||
| 574 | + | ||
| 575 | + function setVisibility(id, isVisible) { | ||
| 576 | + if (!autoHideShow) { return; } | ||
| 577 | + var v = isVisible ? "visible" : "hidden"; | ||
| 578 | + if (isDomLoaded && getElementById(id)) { | ||
| 579 | + getElementById(id).style.visibility = v; | ||
| 580 | + } | ||
| 581 | + else { | ||
| 582 | + createCSS("#" + id, "visibility:" + v); | ||
| 583 | + } | ||
| 584 | + } | ||
| 585 | + | ||
| 586 | + /* Filter to avoid XSS attacks | ||
| 587 | + */ | ||
| 588 | + function urlEncodeIfNecessary(s) { | ||
| 589 | + var regex = /[\\\"<>\.;]/; | ||
| 590 | + var hasBadChars = regex.exec(s) != null; | ||
| 591 | + return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; | ||
| 592 | + } | ||
| 593 | + | ||
| 594 | + /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only) | ||
| 595 | + */ | ||
| 596 | + var cleanup = function() { | ||
| 597 | + if (ua.ie && ua.win) { | ||
| 598 | + window.attachEvent("onunload", function() { | ||
| 599 | + // remove listeners to avoid memory leaks | ||
| 600 | + var ll = listenersArr.length; | ||
| 601 | + for (var i = 0; i < ll; i++) { | ||
| 602 | + listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); | ||
| 603 | + } | ||
| 604 | + // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect | ||
| 605 | + var il = objIdArr.length; | ||
| 606 | + for (var j = 0; j < il; j++) { | ||
| 607 | + removeSWF(objIdArr[j]); | ||
| 608 | + } | ||
| 609 | + // cleanup library's main closures to avoid memory leaks | ||
| 610 | + for (var k in ua) { | ||
| 611 | + ua[k] = null; | ||
| 612 | + } | ||
| 613 | + ua = null; | ||
| 614 | + for (var l in swfobject) { | ||
| 615 | + swfobject[l] = null; | ||
| 616 | + } | ||
| 617 | + swfobject = null; | ||
| 618 | + }); | ||
| 619 | + } | ||
| 620 | + }(); | ||
| 621 | + | ||
| 622 | + return { | ||
| 623 | + /* Public API | ||
| 624 | + - Reference: http://code.google.com/p/swfobject/wiki/documentation | ||
| 625 | + */ | ||
| 626 | + registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) { | ||
| 627 | + if (ua.w3 && objectIdStr && swfVersionStr) { | ||
| 628 | + var regObj = {}; | ||
| 629 | + regObj.id = objectIdStr; | ||
| 630 | + regObj.swfVersion = swfVersionStr; | ||
| 631 | + regObj.expressInstall = xiSwfUrlStr; | ||
| 632 | + regObj.callbackFn = callbackFn; | ||
| 633 | + regObjArr[regObjArr.length] = regObj; | ||
| 634 | + setVisibility(objectIdStr, false); | ||
| 635 | + } | ||
| 636 | + else if (callbackFn) { | ||
| 637 | + callbackFn({success:false, id:objectIdStr}); | ||
| 638 | + } | ||
| 639 | + }, | ||
| 640 | + | ||
| 641 | + getObjectById: function(objectIdStr) { | ||
| 642 | + if (ua.w3) { | ||
| 643 | + return getObjectById(objectIdStr); | ||
| 644 | + } | ||
| 645 | + }, | ||
| 646 | + | ||
| 647 | + embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { | ||
| 648 | + var callbackObj = {success:false, id:replaceElemIdStr}; | ||
| 649 | + if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { | ||
| 650 | + setVisibility(replaceElemIdStr, false); | ||
| 651 | + addDomLoadEvent(function() { | ||
| 652 | + widthStr += ""; // auto-convert to string | ||
| 653 | + heightStr += ""; | ||
| 654 | + var att = {}; | ||
| 655 | + if (attObj && typeof attObj === OBJECT) { | ||
| 656 | + for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs | ||
| 657 | + att[i] = attObj[i]; | ||
| 658 | + } | ||
| 659 | + } | ||
| 660 | + att.data = swfUrlStr; | ||
| 661 | + att.width = widthStr; | ||
| 662 | + att.height = heightStr; | ||
| 663 | + var par = {}; | ||
| 664 | + if (parObj && typeof parObj === OBJECT) { | ||
| 665 | + for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs | ||
| 666 | + par[j] = parObj[j]; | ||
| 667 | + } | ||
| 668 | + } | ||
| 669 | + if (flashvarsObj && typeof flashvarsObj === OBJECT) { | ||
| 670 | + for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs | ||
| 671 | + if (typeof par.flashvars != UNDEF) { | ||
| 672 | + par.flashvars += "&" + k + "=" + flashvarsObj[k]; | ||
| 673 | + } | ||
| 674 | + else { | ||
| 675 | + par.flashvars = k + "=" + flashvarsObj[k]; | ||
| 676 | + } | ||
| 677 | + } | ||
| 678 | + } | ||
| 679 | + if (hasPlayerVersion(swfVersionStr)) { // create SWF | ||
| 680 | + var obj = createSWF(att, par, replaceElemIdStr); | ||
| 681 | + if (att.id == replaceElemIdStr) { | ||
| 682 | + setVisibility(replaceElemIdStr, true); | ||
| 683 | + } | ||
| 684 | + callbackObj.success = true; | ||
| 685 | + callbackObj.ref = obj; | ||
| 686 | + } | ||
| 687 | + else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install | ||
| 688 | + att.data = xiSwfUrlStr; | ||
| 689 | + showExpressInstall(att, par, replaceElemIdStr, callbackFn); | ||
| 690 | + return; | ||
| 691 | + } | ||
| 692 | + else { // show alternative content | ||
| 693 | + setVisibility(replaceElemIdStr, true); | ||
| 694 | + } | ||
| 695 | + if (callbackFn) { callbackFn(callbackObj); } | ||
| 696 | + }); | ||
| 697 | + } | ||
| 698 | + else if (callbackFn) { callbackFn(callbackObj); } | ||
| 699 | + }, | ||
| 700 | + | ||
| 701 | + switchOffAutoHideShow: function() { | ||
| 702 | + autoHideShow = false; | ||
| 703 | + }, | ||
| 704 | + | ||
| 705 | + ua: ua, | ||
| 706 | + | ||
| 707 | + getFlashPlayerVersion: function() { | ||
| 708 | + return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; | ||
| 709 | + }, | ||
| 710 | + | ||
| 711 | + hasFlashPlayerVersion: hasPlayerVersion, | ||
| 712 | + | ||
| 713 | + createSWF: function(attObj, parObj, replaceElemIdStr) { | ||
| 714 | + if (ua.w3) { | ||
| 715 | + return createSWF(attObj, parObj, replaceElemIdStr); | ||
| 716 | + } | ||
| 717 | + else { | ||
| 718 | + return undefined; | ||
| 719 | + } | ||
| 720 | + }, | ||
| 721 | + | ||
| 722 | + showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { | ||
| 723 | + if (ua.w3 && canExpressInstall()) { | ||
| 724 | + showExpressInstall(att, par, replaceElemIdStr, callbackFn); | ||
| 725 | + } | ||
| 726 | + }, | ||
| 727 | + | ||
| 728 | + removeSWF: function(objElemIdStr) { | ||
| 729 | + if (ua.w3) { | ||
| 730 | + removeSWF(objElemIdStr); | ||
| 731 | + } | ||
| 732 | + }, | ||
| 733 | + | ||
| 734 | + createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { | ||
| 735 | + if (ua.w3) { | ||
| 736 | + createCSS(selStr, declStr, mediaStr, newStyleBoolean); | ||
| 737 | + } | ||
| 738 | + }, | ||
| 739 | + | ||
| 740 | + addDomLoadEvent: addDomLoadEvent, | ||
| 741 | + | ||
| 742 | + addLoadEvent: addLoadEvent, | ||
| 743 | + | ||
| 744 | + getQueryParamValue: function(param) { | ||
| 745 | + var q = doc.location.search || doc.location.hash; | ||
| 746 | + if (q) { | ||
| 747 | + if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark | ||
| 748 | + if (param == null) { | ||
| 749 | + return urlEncodeIfNecessary(q); | ||
| 750 | + } | ||
| 751 | + var pairs = q.split("&"); | ||
| 752 | + for (var i = 0; i < pairs.length; i++) { | ||
| 753 | + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { | ||
| 754 | + return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); | ||
| 755 | + } | ||
| 756 | + } | ||
| 757 | + } | ||
| 758 | + return ""; | ||
| 759 | + }, | ||
| 760 | + | ||
| 761 | + // For internal usage only | ||
| 762 | + expressInstallCallback: function() { | ||
| 763 | + if (isExpressInstallActive) { | ||
| 764 | + var obj = getElementById(EXPRESS_INSTALL_ID); | ||
| 765 | + if (obj && storedAltContent) { | ||
| 766 | + obj.parentNode.replaceChild(storedAltContent, obj); | ||
| 767 | + if (storedAltContentId) { | ||
| 768 | + setVisibility(storedAltContentId, true); | ||
| 769 | + if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } | ||
| 770 | + } | ||
| 771 | + if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } | ||
| 772 | + } | ||
| 773 | + isExpressInstallActive = false; | ||
| 774 | + } | ||
| 775 | + } | ||
| 776 | + }; | ||
| 777 | +}(); |
trunk/research/SrsBW/bin-debug/ui.swf
0 → 100644
不能预览此文件类型
| 1 | +/* This CSS stylesheet defines styles used by required elements in a flex application page that supports browser history */ | ||
| 2 | + | ||
| 3 | +#ie_historyFrame { width: 0px; height: 0px; display:none } | ||
| 4 | +#firefox_anchorDiv { width: 0px; height: 0px; display:none } | ||
| 5 | +#safari_formDiv { width: 0px; height: 0px; display:none } | ||
| 6 | +#safari_rememberDiv { width: 0px; height: 0px; display:none } |
| 1 | +BrowserHistoryUtils = { | ||
| 2 | + addEvent: function(elm, evType, fn, useCapture) { | ||
| 3 | + useCapture = useCapture || false; | ||
| 4 | + if (elm.addEventListener) { | ||
| 5 | + elm.addEventListener(evType, fn, useCapture); | ||
| 6 | + return true; | ||
| 7 | + } | ||
| 8 | + else if (elm.attachEvent) { | ||
| 9 | + var r = elm.attachEvent('on' + evType, fn); | ||
| 10 | + return r; | ||
| 11 | + } | ||
| 12 | + else { | ||
| 13 | + elm['on' + evType] = fn; | ||
| 14 | + } | ||
| 15 | + } | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | +BrowserHistory = (function() { | ||
| 19 | + // type of browser | ||
| 20 | + var browser = { | ||
| 21 | + ie: false, | ||
| 22 | + ie8: false, | ||
| 23 | + firefox: false, | ||
| 24 | + safari: false, | ||
| 25 | + opera: false, | ||
| 26 | + version: -1 | ||
| 27 | + }; | ||
| 28 | + | ||
| 29 | + // Default app state URL to use when no fragment ID present | ||
| 30 | + var defaultHash = ''; | ||
| 31 | + | ||
| 32 | + // Last-known app state URL | ||
| 33 | + var currentHref = document.location.href; | ||
| 34 | + | ||
| 35 | + // Initial URL (used only by IE) | ||
| 36 | + var initialHref = document.location.href; | ||
| 37 | + | ||
| 38 | + // Initial URL (used only by IE) | ||
| 39 | + var initialHash = document.location.hash; | ||
| 40 | + | ||
| 41 | + // History frame source URL prefix (used only by IE) | ||
| 42 | + var historyFrameSourcePrefix = 'history/historyFrame.html?'; | ||
| 43 | + | ||
| 44 | + // History maintenance (used only by Safari) | ||
| 45 | + var currentHistoryLength = -1; | ||
| 46 | + | ||
| 47 | + // Flag to denote the existence of onhashchange | ||
| 48 | + var browserHasHashChange = false; | ||
| 49 | + | ||
| 50 | + var historyHash = []; | ||
| 51 | + | ||
| 52 | + var initialState = createState(initialHref, initialHref + '#' + initialHash, initialHash); | ||
| 53 | + | ||
| 54 | + var backStack = []; | ||
| 55 | + var forwardStack = []; | ||
| 56 | + | ||
| 57 | + var currentObjectId = null; | ||
| 58 | + | ||
| 59 | + //UserAgent detection | ||
| 60 | + var useragent = navigator.userAgent.toLowerCase(); | ||
| 61 | + | ||
| 62 | + if (useragent.indexOf("opera") != -1) { | ||
| 63 | + browser.opera = true; | ||
| 64 | + } else if (useragent.indexOf("msie") != -1) { | ||
| 65 | + browser.ie = true; | ||
| 66 | + browser.version = parseFloat(useragent.substring(useragent.indexOf('msie') + 4)); | ||
| 67 | + if (browser.version == 8) | ||
| 68 | + { | ||
| 69 | + browser.ie = false; | ||
| 70 | + browser.ie8 = true; | ||
| 71 | + } | ||
| 72 | + } else if (useragent.indexOf("safari") != -1) { | ||
| 73 | + browser.safari = true; | ||
| 74 | + browser.version = parseFloat(useragent.substring(useragent.indexOf('safari') + 7)); | ||
| 75 | + } else if (useragent.indexOf("gecko") != -1) { | ||
| 76 | + browser.firefox = true; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + if (browser.ie == true && browser.version == 7) { | ||
| 80 | + window["_ie_firstload"] = false; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + function hashChangeHandler() | ||
| 84 | + { | ||
| 85 | + currentHref = document.location.href; | ||
| 86 | + var flexAppUrl = getHash(); | ||
| 87 | + //ADR: to fix multiple | ||
| 88 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 89 | + var pl = getPlayers(); | ||
| 90 | + for (var i = 0; i < pl.length; i++) { | ||
| 91 | + pl[i].browserURLChange(flexAppUrl); | ||
| 92 | + } | ||
| 93 | + } else { | ||
| 94 | + getPlayer().browserURLChange(flexAppUrl); | ||
| 95 | + } | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + // Accessor functions for obtaining specific elements of the page. | ||
| 99 | + function getHistoryFrame() | ||
| 100 | + { | ||
| 101 | + return document.getElementById('ie_historyFrame'); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + function getFormElement() | ||
| 105 | + { | ||
| 106 | + return document.getElementById('safari_formDiv'); | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + function getRememberElement() | ||
| 110 | + { | ||
| 111 | + return document.getElementById("safari_remember_field"); | ||
| 112 | + } | ||
| 113 | + | ||
| 114 | + // Get the Flash player object for performing ExternalInterface callbacks. | ||
| 115 | + // Updated for changes to SWFObject2. | ||
| 116 | + function getPlayer(id) { | ||
| 117 | + var i; | ||
| 118 | + | ||
| 119 | + if (id && document.getElementById(id)) { | ||
| 120 | + var r = document.getElementById(id); | ||
| 121 | + if (typeof r.SetVariable != "undefined") { | ||
| 122 | + return r; | ||
| 123 | + } | ||
| 124 | + else { | ||
| 125 | + var o = r.getElementsByTagName("object"); | ||
| 126 | + var e = r.getElementsByTagName("embed"); | ||
| 127 | + for (i = 0; i < o.length; i++) { | ||
| 128 | + if (typeof o[i].browserURLChange != "undefined") | ||
| 129 | + return o[i]; | ||
| 130 | + } | ||
| 131 | + for (i = 0; i < e.length; i++) { | ||
| 132 | + if (typeof e[i].browserURLChange != "undefined") | ||
| 133 | + return e[i]; | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | + } | ||
| 137 | + else { | ||
| 138 | + var o = document.getElementsByTagName("object"); | ||
| 139 | + var e = document.getElementsByTagName("embed"); | ||
| 140 | + for (i = 0; i < e.length; i++) { | ||
| 141 | + if (typeof e[i].browserURLChange != "undefined") | ||
| 142 | + { | ||
| 143 | + return e[i]; | ||
| 144 | + } | ||
| 145 | + } | ||
| 146 | + for (i = 0; i < o.length; i++) { | ||
| 147 | + if (typeof o[i].browserURLChange != "undefined") | ||
| 148 | + { | ||
| 149 | + return o[i]; | ||
| 150 | + } | ||
| 151 | + } | ||
| 152 | + } | ||
| 153 | + return undefined; | ||
| 154 | + } | ||
| 155 | + | ||
| 156 | + function getPlayers() { | ||
| 157 | + var i; | ||
| 158 | + var players = []; | ||
| 159 | + if (players.length == 0) { | ||
| 160 | + var tmp = document.getElementsByTagName('object'); | ||
| 161 | + for (i = 0; i < tmp.length; i++) | ||
| 162 | + { | ||
| 163 | + if (typeof tmp[i].browserURLChange != "undefined") | ||
| 164 | + players.push(tmp[i]); | ||
| 165 | + } | ||
| 166 | + } | ||
| 167 | + if (players.length == 0 || players[0].object == null) { | ||
| 168 | + var tmp = document.getElementsByTagName('embed'); | ||
| 169 | + for (i = 0; i < tmp.length; i++) | ||
| 170 | + { | ||
| 171 | + if (typeof tmp[i].browserURLChange != "undefined") | ||
| 172 | + players.push(tmp[i]); | ||
| 173 | + } | ||
| 174 | + } | ||
| 175 | + return players; | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + function getIframeHash() { | ||
| 179 | + var doc = getHistoryFrame().contentWindow.document; | ||
| 180 | + var hash = String(doc.location.search); | ||
| 181 | + if (hash.length == 1 && hash.charAt(0) == "?") { | ||
| 182 | + hash = ""; | ||
| 183 | + } | ||
| 184 | + else if (hash.length >= 2 && hash.charAt(0) == "?") { | ||
| 185 | + hash = hash.substring(1); | ||
| 186 | + } | ||
| 187 | + return hash; | ||
| 188 | + } | ||
| 189 | + | ||
| 190 | + /* Get the current location hash excluding the '#' symbol. */ | ||
| 191 | + function getHash() { | ||
| 192 | + // It would be nice if we could use document.location.hash here, | ||
| 193 | + // but it's faulty sometimes. | ||
| 194 | + var idx = document.location.href.indexOf('#'); | ||
| 195 | + return (idx >= 0) ? document.location.href.substr(idx+1) : ''; | ||
| 196 | + } | ||
| 197 | + | ||
| 198 | + /* Get the current location hash excluding the '#' symbol. */ | ||
| 199 | + function setHash(hash) { | ||
| 200 | + // It would be nice if we could use document.location.hash here, | ||
| 201 | + // but it's faulty sometimes. | ||
| 202 | + if (hash == '') hash = '#' | ||
| 203 | + document.location.hash = hash; | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + function createState(baseUrl, newUrl, flexAppUrl) { | ||
| 207 | + return { 'baseUrl': baseUrl, 'newUrl': newUrl, 'flexAppUrl': flexAppUrl, 'title': null }; | ||
| 208 | + } | ||
| 209 | + | ||
| 210 | + /* Add a history entry to the browser. | ||
| 211 | + * baseUrl: the portion of the location prior to the '#' | ||
| 212 | + * newUrl: the entire new URL, including '#' and following fragment | ||
| 213 | + * flexAppUrl: the portion of the location following the '#' only | ||
| 214 | + */ | ||
| 215 | + function addHistoryEntry(baseUrl, newUrl, flexAppUrl) { | ||
| 216 | + | ||
| 217 | + //delete all the history entries | ||
| 218 | + forwardStack = []; | ||
| 219 | + | ||
| 220 | + if (browser.ie) { | ||
| 221 | + //Check to see if we are being asked to do a navigate for the first | ||
| 222 | + //history entry, and if so ignore, because it's coming from the creation | ||
| 223 | + //of the history iframe | ||
| 224 | + if (flexAppUrl == defaultHash && document.location.href == initialHref && window['_ie_firstload']) { | ||
| 225 | + currentHref = initialHref; | ||
| 226 | + return; | ||
| 227 | + } | ||
| 228 | + if ((!flexAppUrl || flexAppUrl == defaultHash) && window['_ie_firstload']) { | ||
| 229 | + newUrl = baseUrl + '#' + defaultHash; | ||
| 230 | + flexAppUrl = defaultHash; | ||
| 231 | + } else { | ||
| 232 | + // for IE, tell the history frame to go somewhere without a '#' | ||
| 233 | + // in order to get this entry into the browser history. | ||
| 234 | + getHistoryFrame().src = historyFrameSourcePrefix + flexAppUrl; | ||
| 235 | + } | ||
| 236 | + setHash(flexAppUrl); | ||
| 237 | + } else { | ||
| 238 | + | ||
| 239 | + //ADR | ||
| 240 | + if (backStack.length == 0 && initialState.flexAppUrl == flexAppUrl) { | ||
| 241 | + initialState = createState(baseUrl, newUrl, flexAppUrl); | ||
| 242 | + } else if(backStack.length > 0 && backStack[backStack.length - 1].flexAppUrl == flexAppUrl) { | ||
| 243 | + backStack[backStack.length - 1] = createState(baseUrl, newUrl, flexAppUrl); | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + if (browser.safari && !browserHasHashChange) { | ||
| 247 | + // for Safari, submit a form whose action points to the desired URL | ||
| 248 | + if (browser.version <= 419.3) { | ||
| 249 | + var file = window.location.pathname.toString(); | ||
| 250 | + file = file.substring(file.lastIndexOf("/")+1); | ||
| 251 | + getFormElement().innerHTML = '<form name="historyForm" action="'+file+'#' + flexAppUrl + '" method="GET"></form>'; | ||
| 252 | + //get the current elements and add them to the form | ||
| 253 | + var qs = window.location.search.substring(1); | ||
| 254 | + var qs_arr = qs.split("&"); | ||
| 255 | + for (var i = 0; i < qs_arr.length; i++) { | ||
| 256 | + var tmp = qs_arr[i].split("="); | ||
| 257 | + var elem = document.createElement("input"); | ||
| 258 | + elem.type = "hidden"; | ||
| 259 | + elem.name = tmp[0]; | ||
| 260 | + elem.value = tmp[1]; | ||
| 261 | + document.forms.historyForm.appendChild(elem); | ||
| 262 | + } | ||
| 263 | + document.forms.historyForm.submit(); | ||
| 264 | + } else { | ||
| 265 | + top.location.hash = flexAppUrl; | ||
| 266 | + } | ||
| 267 | + // We also have to maintain the history by hand for Safari | ||
| 268 | + historyHash[history.length] = flexAppUrl; | ||
| 269 | + _storeStates(); | ||
| 270 | + } else { | ||
| 271 | + // Otherwise, just tell the browser to go there | ||
| 272 | + setHash(flexAppUrl); | ||
| 273 | + } | ||
| 274 | + } | ||
| 275 | + backStack.push(createState(baseUrl, newUrl, flexAppUrl)); | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + function _storeStates() { | ||
| 279 | + if (browser.safari) { | ||
| 280 | + getRememberElement().value = historyHash.join(","); | ||
| 281 | + } | ||
| 282 | + } | ||
| 283 | + | ||
| 284 | + function handleBackButton() { | ||
| 285 | + //The "current" page is always at the top of the history stack. | ||
| 286 | + var current = backStack.pop(); | ||
| 287 | + if (!current) { return; } | ||
| 288 | + var last = backStack[backStack.length - 1]; | ||
| 289 | + if (!last && backStack.length == 0){ | ||
| 290 | + last = initialState; | ||
| 291 | + } | ||
| 292 | + forwardStack.push(current); | ||
| 293 | + } | ||
| 294 | + | ||
| 295 | + function handleForwardButton() { | ||
| 296 | + //summary: private method. Do not call this directly. | ||
| 297 | + | ||
| 298 | + var last = forwardStack.pop(); | ||
| 299 | + if (!last) { return; } | ||
| 300 | + backStack.push(last); | ||
| 301 | + } | ||
| 302 | + | ||
| 303 | + function handleArbitraryUrl() { | ||
| 304 | + //delete all the history entries | ||
| 305 | + forwardStack = []; | ||
| 306 | + } | ||
| 307 | + | ||
| 308 | + /* Called periodically to poll to see if we need to detect navigation that has occurred */ | ||
| 309 | + function checkForUrlChange() { | ||
| 310 | + | ||
| 311 | + if (browser.ie) { | ||
| 312 | + if (currentHref != document.location.href && currentHref + '#' != document.location.href) { | ||
| 313 | + //This occurs when the user has navigated to a specific URL | ||
| 314 | + //within the app, and didn't use browser back/forward | ||
| 315 | + //IE seems to have a bug where it stops updating the URL it | ||
| 316 | + //shows the end-user at this point, but programatically it | ||
| 317 | + //appears to be correct. Do a full app reload to get around | ||
| 318 | + //this issue. | ||
| 319 | + if (browser.version < 7) { | ||
| 320 | + currentHref = document.location.href; | ||
| 321 | + document.location.reload(); | ||
| 322 | + } else { | ||
| 323 | + if (getHash() != getIframeHash()) { | ||
| 324 | + // this.iframe.src = this.blankURL + hash; | ||
| 325 | + var sourceToSet = historyFrameSourcePrefix + getHash(); | ||
| 326 | + getHistoryFrame().src = sourceToSet; | ||
| 327 | + currentHref = document.location.href; | ||
| 328 | + } | ||
| 329 | + } | ||
| 330 | + } | ||
| 331 | + } | ||
| 332 | + | ||
| 333 | + if (browser.safari && !browserHasHashChange) { | ||
| 334 | + // For Safari, we have to check to see if history.length changed. | ||
| 335 | + if (currentHistoryLength >= 0 && history.length != currentHistoryLength) { | ||
| 336 | + //alert("did change: " + history.length + ", " + historyHash.length + "|" + historyHash[history.length] + "|>" + historyHash.join("|")); | ||
| 337 | + var flexAppUrl = getHash(); | ||
| 338 | + if (browser.version < 528.16 /* Anything earlier than Safari 4.0 */) | ||
| 339 | + { | ||
| 340 | + // If it did change and we're running Safari 3.x or earlier, | ||
| 341 | + // then we have to look the old state up in our hand-maintained | ||
| 342 | + // array since document.location.hash won't have changed, | ||
| 343 | + // then call back into BrowserManager. | ||
| 344 | + currentHistoryLength = history.length; | ||
| 345 | + flexAppUrl = historyHash[currentHistoryLength]; | ||
| 346 | + } | ||
| 347 | + | ||
| 348 | + //ADR: to fix multiple | ||
| 349 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 350 | + var pl = getPlayers(); | ||
| 351 | + for (var i = 0; i < pl.length; i++) { | ||
| 352 | + pl[i].browserURLChange(flexAppUrl); | ||
| 353 | + } | ||
| 354 | + } else { | ||
| 355 | + getPlayer().browserURLChange(flexAppUrl); | ||
| 356 | + } | ||
| 357 | + _storeStates(); | ||
| 358 | + } | ||
| 359 | + } | ||
| 360 | + if (browser.firefox && !browserHasHashChange) { | ||
| 361 | + if (currentHref != document.location.href) { | ||
| 362 | + var bsl = backStack.length; | ||
| 363 | + | ||
| 364 | + var urlActions = { | ||
| 365 | + back: false, | ||
| 366 | + forward: false, | ||
| 367 | + set: false | ||
| 368 | + } | ||
| 369 | + | ||
| 370 | + if ((window.location.hash == initialHash || window.location.href == initialHref) && (bsl == 1)) { | ||
| 371 | + urlActions.back = true; | ||
| 372 | + // FIXME: could this ever be a forward button? | ||
| 373 | + // we can't clear it because we still need to check for forwards. Ugg. | ||
| 374 | + // clearInterval(this.locationTimer); | ||
| 375 | + handleBackButton(); | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + // first check to see if we could have gone forward. We always halt on | ||
| 379 | + // a no-hash item. | ||
| 380 | + if (forwardStack.length > 0) { | ||
| 381 | + if (forwardStack[forwardStack.length-1].flexAppUrl == getHash()) { | ||
| 382 | + urlActions.forward = true; | ||
| 383 | + handleForwardButton(); | ||
| 384 | + } | ||
| 385 | + } | ||
| 386 | + | ||
| 387 | + // ok, that didn't work, try someplace back in the history stack | ||
| 388 | + if ((bsl >= 2) && (backStack[bsl - 2])) { | ||
| 389 | + if (backStack[bsl - 2].flexAppUrl == getHash()) { | ||
| 390 | + urlActions.back = true; | ||
| 391 | + handleBackButton(); | ||
| 392 | + } | ||
| 393 | + } | ||
| 394 | + | ||
| 395 | + if (!urlActions.back && !urlActions.forward) { | ||
| 396 | + var foundInStacks = { | ||
| 397 | + back: -1, | ||
| 398 | + forward: -1 | ||
| 399 | + } | ||
| 400 | + | ||
| 401 | + for (var i = 0; i < backStack.length; i++) { | ||
| 402 | + if (backStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { | ||
| 403 | + arbitraryUrl = true; | ||
| 404 | + foundInStacks.back = i; | ||
| 405 | + } | ||
| 406 | + } | ||
| 407 | + for (var i = 0; i < forwardStack.length; i++) { | ||
| 408 | + if (forwardStack[i].flexAppUrl == getHash() && i != (bsl - 2)) { | ||
| 409 | + arbitraryUrl = true; | ||
| 410 | + foundInStacks.forward = i; | ||
| 411 | + } | ||
| 412 | + } | ||
| 413 | + handleArbitraryUrl(); | ||
| 414 | + } | ||
| 415 | + | ||
| 416 | + // Firefox changed; do a callback into BrowserManager to tell it. | ||
| 417 | + currentHref = document.location.href; | ||
| 418 | + var flexAppUrl = getHash(); | ||
| 419 | + //ADR: to fix multiple | ||
| 420 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 421 | + var pl = getPlayers(); | ||
| 422 | + for (var i = 0; i < pl.length; i++) { | ||
| 423 | + pl[i].browserURLChange(flexAppUrl); | ||
| 424 | + } | ||
| 425 | + } else { | ||
| 426 | + getPlayer().browserURLChange(flexAppUrl); | ||
| 427 | + } | ||
| 428 | + } | ||
| 429 | + } | ||
| 430 | + } | ||
| 431 | + | ||
| 432 | + var _initialize = function () { | ||
| 433 | + | ||
| 434 | + browserHasHashChange = ("onhashchange" in document.body); | ||
| 435 | + | ||
| 436 | + if (browser.ie) | ||
| 437 | + { | ||
| 438 | + var scripts = document.getElementsByTagName('script'); | ||
| 439 | + for (var i = 0, s; s = scripts[i]; i++) { | ||
| 440 | + if (s.src.indexOf("history.js") > -1) { | ||
| 441 | + var iframe_location = (new String(s.src)).replace("history.js", "historyFrame.html"); | ||
| 442 | + } | ||
| 443 | + } | ||
| 444 | + historyFrameSourcePrefix = iframe_location + "?"; | ||
| 445 | + var src = historyFrameSourcePrefix; | ||
| 446 | + | ||
| 447 | + var iframe = document.createElement("iframe"); | ||
| 448 | + iframe.id = 'ie_historyFrame'; | ||
| 449 | + iframe.name = 'ie_historyFrame'; | ||
| 450 | + iframe.src = 'javascript:false;'; | ||
| 451 | + | ||
| 452 | + try { | ||
| 453 | + document.body.appendChild(iframe); | ||
| 454 | + } catch(e) { | ||
| 455 | + setTimeout(function() { | ||
| 456 | + document.body.appendChild(iframe); | ||
| 457 | + }, 0); | ||
| 458 | + } | ||
| 459 | + } | ||
| 460 | + | ||
| 461 | + if (browser.safari && !browserHasHashChange) | ||
| 462 | + { | ||
| 463 | + var rememberDiv = document.createElement("div"); | ||
| 464 | + rememberDiv.id = 'safari_rememberDiv'; | ||
| 465 | + document.body.appendChild(rememberDiv); | ||
| 466 | + rememberDiv.innerHTML = '<input type="text" id="safari_remember_field" style="width: 500px;">'; | ||
| 467 | + | ||
| 468 | + var formDiv = document.createElement("div"); | ||
| 469 | + formDiv.id = 'safari_formDiv'; | ||
| 470 | + document.body.appendChild(formDiv); | ||
| 471 | + | ||
| 472 | + var reloader_content = document.createElement('div'); | ||
| 473 | + reloader_content.id = 'safarireloader'; | ||
| 474 | + var scripts = document.getElementsByTagName('script'); | ||
| 475 | + for (var i = 0, s; s = scripts[i]; i++) { | ||
| 476 | + if (s.src.indexOf("history.js") > -1) { | ||
| 477 | + html = (new String(s.src)).replace(".js", ".html"); | ||
| 478 | + } | ||
| 479 | + } | ||
| 480 | + reloader_content.innerHTML = '<iframe id="safarireloader-iframe" src="about:blank" frameborder="no" scrolling="no"></iframe>'; | ||
| 481 | + document.body.appendChild(reloader_content); | ||
| 482 | + reloader_content.style.position = 'absolute'; | ||
| 483 | + reloader_content.style.left = reloader_content.style.top = '-9999px'; | ||
| 484 | + iframe = reloader_content.getElementsByTagName('iframe')[0]; | ||
| 485 | + | ||
| 486 | + if (document.getElementById("safari_remember_field").value != "" ) { | ||
| 487 | + historyHash = document.getElementById("safari_remember_field").value.split(","); | ||
| 488 | + } | ||
| 489 | + } | ||
| 490 | + | ||
| 491 | + if (browserHasHashChange) | ||
| 492 | + document.body.onhashchange = hashChangeHandler; | ||
| 493 | + } | ||
| 494 | + | ||
| 495 | + return { | ||
| 496 | + historyHash: historyHash, | ||
| 497 | + backStack: function() { return backStack; }, | ||
| 498 | + forwardStack: function() { return forwardStack }, | ||
| 499 | + getPlayer: getPlayer, | ||
| 500 | + initialize: function(src) { | ||
| 501 | + _initialize(src); | ||
| 502 | + }, | ||
| 503 | + setURL: function(url) { | ||
| 504 | + document.location.href = url; | ||
| 505 | + }, | ||
| 506 | + getURL: function() { | ||
| 507 | + return document.location.href; | ||
| 508 | + }, | ||
| 509 | + getTitle: function() { | ||
| 510 | + return document.title; | ||
| 511 | + }, | ||
| 512 | + setTitle: function(title) { | ||
| 513 | + try { | ||
| 514 | + backStack[backStack.length - 1].title = title; | ||
| 515 | + } catch(e) { } | ||
| 516 | + //if on safari, set the title to be the empty string. | ||
| 517 | + if (browser.safari) { | ||
| 518 | + if (title == "") { | ||
| 519 | + try { | ||
| 520 | + var tmp = window.location.href.toString(); | ||
| 521 | + title = tmp.substring((tmp.lastIndexOf("/")+1), tmp.lastIndexOf("#")); | ||
| 522 | + } catch(e) { | ||
| 523 | + title = ""; | ||
| 524 | + } | ||
| 525 | + } | ||
| 526 | + } | ||
| 527 | + document.title = title; | ||
| 528 | + }, | ||
| 529 | + setDefaultURL: function(def) | ||
| 530 | + { | ||
| 531 | + defaultHash = def; | ||
| 532 | + def = getHash(); | ||
| 533 | + //trailing ? is important else an extra frame gets added to the history | ||
| 534 | + //when navigating back to the first page. Alternatively could check | ||
| 535 | + //in history frame navigation to compare # and ?. | ||
| 536 | + if (browser.ie) | ||
| 537 | + { | ||
| 538 | + window['_ie_firstload'] = true; | ||
| 539 | + var sourceToSet = historyFrameSourcePrefix + def; | ||
| 540 | + var func = function() { | ||
| 541 | + getHistoryFrame().src = sourceToSet; | ||
| 542 | + window.location.replace("#" + def); | ||
| 543 | + setInterval(checkForUrlChange, 50); | ||
| 544 | + } | ||
| 545 | + try { | ||
| 546 | + func(); | ||
| 547 | + } catch(e) { | ||
| 548 | + window.setTimeout(function() { func(); }, 0); | ||
| 549 | + } | ||
| 550 | + } | ||
| 551 | + | ||
| 552 | + if (browser.safari) | ||
| 553 | + { | ||
| 554 | + currentHistoryLength = history.length; | ||
| 555 | + if (historyHash.length == 0) { | ||
| 556 | + historyHash[currentHistoryLength] = def; | ||
| 557 | + var newloc = "#" + def; | ||
| 558 | + window.location.replace(newloc); | ||
| 559 | + } else { | ||
| 560 | + //alert(historyHash[historyHash.length-1]); | ||
| 561 | + } | ||
| 562 | + setInterval(checkForUrlChange, 50); | ||
| 563 | + } | ||
| 564 | + | ||
| 565 | + | ||
| 566 | + if (browser.firefox || browser.opera) | ||
| 567 | + { | ||
| 568 | + var reg = new RegExp("#" + def + "$"); | ||
| 569 | + if (window.location.toString().match(reg)) { | ||
| 570 | + } else { | ||
| 571 | + var newloc ="#" + def; | ||
| 572 | + window.location.replace(newloc); | ||
| 573 | + } | ||
| 574 | + setInterval(checkForUrlChange, 50); | ||
| 575 | + } | ||
| 576 | + | ||
| 577 | + }, | ||
| 578 | + | ||
| 579 | + /* Set the current browser URL; called from inside BrowserManager to propagate | ||
| 580 | + * the application state out to the container. | ||
| 581 | + */ | ||
| 582 | + setBrowserURL: function(flexAppUrl, objectId) { | ||
| 583 | + if (browser.ie && typeof objectId != "undefined") { | ||
| 584 | + currentObjectId = objectId; | ||
| 585 | + } | ||
| 586 | + //fromIframe = fromIframe || false; | ||
| 587 | + //fromFlex = fromFlex || false; | ||
| 588 | + //alert("setBrowserURL: " + flexAppUrl); | ||
| 589 | + //flexAppUrl = (flexAppUrl == "") ? defaultHash : flexAppUrl ; | ||
| 590 | + | ||
| 591 | + var pos = document.location.href.indexOf('#'); | ||
| 592 | + var baseUrl = pos != -1 ? document.location.href.substr(0, pos) : document.location.href; | ||
| 593 | + var newUrl = baseUrl + '#' + flexAppUrl; | ||
| 594 | + | ||
| 595 | + if (document.location.href != newUrl && document.location.href + '#' != newUrl) { | ||
| 596 | + currentHref = newUrl; | ||
| 597 | + addHistoryEntry(baseUrl, newUrl, flexAppUrl); | ||
| 598 | + currentHistoryLength = history.length; | ||
| 599 | + } | ||
| 600 | + }, | ||
| 601 | + | ||
| 602 | + browserURLChange: function(flexAppUrl) { | ||
| 603 | + var objectId = null; | ||
| 604 | + if (browser.ie && currentObjectId != null) { | ||
| 605 | + objectId = currentObjectId; | ||
| 606 | + } | ||
| 607 | + | ||
| 608 | + if (typeof BrowserHistory_multiple != "undefined" && BrowserHistory_multiple == true) { | ||
| 609 | + var pl = getPlayers(); | ||
| 610 | + for (var i = 0; i < pl.length; i++) { | ||
| 611 | + try { | ||
| 612 | + pl[i].browserURLChange(flexAppUrl); | ||
| 613 | + } catch(e) { } | ||
| 614 | + } | ||
| 615 | + } else { | ||
| 616 | + try { | ||
| 617 | + getPlayer(objectId).browserURLChange(flexAppUrl); | ||
| 618 | + } catch(e) { } | ||
| 619 | + } | ||
| 620 | + | ||
| 621 | + currentObjectId = null; | ||
| 622 | + }, | ||
| 623 | + getUserAgent: function() { | ||
| 624 | + return navigator.userAgent; | ||
| 625 | + }, | ||
| 626 | + getPlatform: function() { | ||
| 627 | + return navigator.platform; | ||
| 628 | + } | ||
| 629 | + | ||
| 630 | + } | ||
| 631 | + | ||
| 632 | +})(); | ||
| 633 | + | ||
| 634 | +// Initialization | ||
| 635 | + | ||
| 636 | +// Automated unit testing and other diagnostics | ||
| 637 | + | ||
| 638 | +function setURL(url) | ||
| 639 | +{ | ||
| 640 | + document.location.href = url; | ||
| 641 | +} | ||
| 642 | + | ||
| 643 | +function backButton() | ||
| 644 | +{ | ||
| 645 | + history.back(); | ||
| 646 | +} | ||
| 647 | + | ||
| 648 | +function forwardButton() | ||
| 649 | +{ | ||
| 650 | + history.forward(); | ||
| 651 | +} | ||
| 652 | + | ||
| 653 | +function goForwardOrBackInHistory(step) | ||
| 654 | +{ | ||
| 655 | + history.go(step); | ||
| 656 | +} | ||
| 657 | + | ||
| 658 | +//BrowserHistoryUtils.addEvent(window, "load", function() { BrowserHistory.initialize(); }); | ||
| 659 | +(function(i) { | ||
| 660 | + var u =navigator.userAgent;var e=/*@cc_on!@*/false; | ||
| 661 | + var st = setTimeout; | ||
| 662 | + if(/webkit/i.test(u)){ | ||
| 663 | + st(function(){ | ||
| 664 | + var dr=document.readyState; | ||
| 665 | + if(dr=="loaded"||dr=="complete"){i()} | ||
| 666 | + else{st(arguments.callee,10);}},10); | ||
| 667 | + } else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){ | ||
| 668 | + document.addEventListener("DOMContentLoaded",i,false); | ||
| 669 | + } else if(e){ | ||
| 670 | + (function(){ | ||
| 671 | + var t=document.createElement('doc:rdy'); | ||
| 672 | + try{t.doScroll('left'); | ||
| 673 | + i();t=null; | ||
| 674 | + }catch(e){st(arguments.callee,0);}})(); | ||
| 675 | + } else{ | ||
| 676 | + window.onload=i; | ||
| 677 | + } | ||
| 678 | +})( function() {BrowserHistory.initialize();} ); |
| 1 | +<html> | ||
| 2 | + <head> | ||
| 3 | + <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> | ||
| 4 | + <META HTTP-EQUIV="Expires" CONTENT="-1"> | ||
| 5 | + </head> | ||
| 6 | + <body> | ||
| 7 | + <script> | ||
| 8 | + function processUrl() | ||
| 9 | + { | ||
| 10 | + | ||
| 11 | + var pos = url.indexOf("?"); | ||
| 12 | + url = pos != -1 ? url.substr(pos + 1) : ""; | ||
| 13 | + if (!parent._ie_firstload) { | ||
| 14 | + parent.BrowserHistory.setBrowserURL(url); | ||
| 15 | + try { | ||
| 16 | + parent.BrowserHistory.browserURLChange(url); | ||
| 17 | + } catch(e) { } | ||
| 18 | + } else { | ||
| 19 | + parent._ie_firstload = false; | ||
| 20 | + } | ||
| 21 | + } | ||
| 22 | + | ||
| 23 | + var url = document.location.href; | ||
| 24 | + processUrl(); | ||
| 25 | + document.write(encodeURIComponent(url)); | ||
| 26 | + </script> | ||
| 27 | + Hidden frame for Browser History support. | ||
| 28 | + </body> | ||
| 29 | +</html> |
| 1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | ||
| 2 | +<!-- saved from url=(0014)about:internet --> | ||
| 3 | +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> | ||
| 4 | + <!-- | ||
| 5 | + Smart developers always View Source. | ||
| 6 | + | ||
| 7 | + This application was built using Adobe Flex, an open source framework | ||
| 8 | + for building rich Internet applications that get delivered via the | ||
| 9 | + Flash Player or to desktops via Adobe AIR. | ||
| 10 | + | ||
| 11 | + Learn more about Flex at http://flex.org | ||
| 12 | + // --> | ||
| 13 | + <head> | ||
| 14 | + <title>${title}</title> | ||
| 15 | + <meta name="google" value="notranslate" /> | ||
| 16 | + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | ||
| 17 | + <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and | ||
| 18 | + the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as | ||
| 19 | + the percentage of the height of its parent container, which has to be set explicitly. Fix for | ||
| 20 | + Firefox 3.6 focus border issues. Initially, don't display flashContent div so it won't show | ||
| 21 | + if JavaScript disabled. | ||
| 22 | + --> | ||
| 23 | + <style type="text/css" media="screen"> | ||
| 24 | + html, body { height:100%; } | ||
| 25 | + body { margin:0; padding:0; overflow:auto; text-align:center; | ||
| 26 | + background-color: ${bgcolor}; } | ||
| 27 | + object:focus { outline:none; } | ||
| 28 | + #flashContent { display:none; } | ||
| 29 | + </style> | ||
| 30 | + | ||
| 31 | + <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens --> | ||
| 32 | + <!-- BEGIN Browser History required section ${useBrowserHistory}> | ||
| 33 | + <link rel="stylesheet" type="text/css" href="history/history.css" /> | ||
| 34 | + <script type="text/javascript" src="history/history.js"></script> | ||
| 35 | + <!${useBrowserHistory} END Browser History required section --> | ||
| 36 | + | ||
| 37 | + <script type="text/javascript" src="swfobject.js"></script> | ||
| 38 | + <script type="text/javascript"> | ||
| 39 | + // For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. | ||
| 40 | + var swfVersionStr = "${version_major}.${version_minor}.${version_revision}"; | ||
| 41 | + // To use express install, set to playerProductInstall.swf, otherwise the empty string. | ||
| 42 | + var xiSwfUrlStr = "${expressInstallSwf}"; | ||
| 43 | + var flashvars = {}; | ||
| 44 | + var params = {}; | ||
| 45 | + params.quality = "high"; | ||
| 46 | + params.bgcolor = "${bgcolor}"; | ||
| 47 | + params.allowscriptaccess = "sameDomain"; | ||
| 48 | + params.allowfullscreen = "true"; | ||
| 49 | + var attributes = {}; | ||
| 50 | + attributes.id = "${application}"; | ||
| 51 | + attributes.name = "${application}"; | ||
| 52 | + attributes.align = "middle"; | ||
| 53 | + swfobject.embedSWF( | ||
| 54 | + "${swf}.swf", "flashContent", | ||
| 55 | + "${width}", "${height}", | ||
| 56 | + swfVersionStr, xiSwfUrlStr, | ||
| 57 | + flashvars, params, attributes); | ||
| 58 | + // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. | ||
| 59 | + swfobject.createCSS("#flashContent", "display:block;text-align:left;"); | ||
| 60 | + </script> | ||
| 61 | + </head> | ||
| 62 | + <body> | ||
| 63 | + <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough | ||
| 64 | + JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show | ||
| 65 | + when JavaScript is disabled. | ||
| 66 | + --> | ||
| 67 | + <div id="flashContent"> | ||
| 68 | + <p> | ||
| 69 | + To view this page ensure that Adobe Flash Player version | ||
| 70 | + ${version_major}.${version_minor}.${version_revision} or greater is installed. | ||
| 71 | + </p> | ||
| 72 | + <script type="text/javascript"> | ||
| 73 | + var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); | ||
| 74 | + document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" | ||
| 75 | + + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); | ||
| 76 | + </script> | ||
| 77 | + </div> | ||
| 78 | + | ||
| 79 | + <noscript> | ||
| 80 | + <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="${width}" height="${height}" id="${application}"> | ||
| 81 | + <param name="movie" value="${swf}.swf" /> | ||
| 82 | + <param name="quality" value="high" /> | ||
| 83 | + <param name="bgcolor" value="${bgcolor}" /> | ||
| 84 | + <param name="allowScriptAccess" value="sameDomain" /> | ||
| 85 | + <param name="allowFullScreen" value="true" /> | ||
| 86 | + <!--[if !IE]>--> | ||
| 87 | + <object type="application/x-shockwave-flash" data="${swf}.swf" width="${width}" height="${height}"> | ||
| 88 | + <param name="quality" value="high" /> | ||
| 89 | + <param name="bgcolor" value="${bgcolor}" /> | ||
| 90 | + <param name="allowScriptAccess" value="sameDomain" /> | ||
| 91 | + <param name="allowFullScreen" value="true" /> | ||
| 92 | + <!--<![endif]--> | ||
| 93 | + <!--[if gte IE 6]>--> | ||
| 94 | + <p> | ||
| 95 | + Either scripts and active content are not permitted to run or Adobe Flash Player version | ||
| 96 | + ${version_major}.${version_minor}.${version_revision} or greater is not installed. | ||
| 97 | + </p> | ||
| 98 | + <!--<![endif]--> | ||
| 99 | + <a href="http://www.adobe.com/go/getflashplayer"> | ||
| 100 | + <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" /> | ||
| 101 | + </a> | ||
| 102 | + <!--[if !IE]>--> | ||
| 103 | + </object> | ||
| 104 | + <!--<![endif]--> | ||
| 105 | + </object> | ||
| 106 | + </noscript> | ||
| 107 | + </body> | ||
| 108 | +</html> |
不能预览此文件类型
| 1 | +/*! SWFObject v2.2 <http://code.google.com/p/swfobject/> | ||
| 2 | + is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> | ||
| 3 | +*/ | ||
| 4 | + | ||
| 5 | +var swfobject = function() { | ||
| 6 | + | ||
| 7 | + var UNDEF = "undefined", | ||
| 8 | + OBJECT = "object", | ||
| 9 | + SHOCKWAVE_FLASH = "Shockwave Flash", | ||
| 10 | + SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash", | ||
| 11 | + FLASH_MIME_TYPE = "application/x-shockwave-flash", | ||
| 12 | + EXPRESS_INSTALL_ID = "SWFObjectExprInst", | ||
| 13 | + ON_READY_STATE_CHANGE = "onreadystatechange", | ||
| 14 | + | ||
| 15 | + win = window, | ||
| 16 | + doc = document, | ||
| 17 | + nav = navigator, | ||
| 18 | + | ||
| 19 | + plugin = false, | ||
| 20 | + domLoadFnArr = [main], | ||
| 21 | + regObjArr = [], | ||
| 22 | + objIdArr = [], | ||
| 23 | + listenersArr = [], | ||
| 24 | + storedAltContent, | ||
| 25 | + storedAltContentId, | ||
| 26 | + storedCallbackFn, | ||
| 27 | + storedCallbackObj, | ||
| 28 | + isDomLoaded = false, | ||
| 29 | + isExpressInstallActive = false, | ||
| 30 | + dynamicStylesheet, | ||
| 31 | + dynamicStylesheetMedia, | ||
| 32 | + autoHideShow = true, | ||
| 33 | + | ||
| 34 | + /* Centralized function for browser feature detection | ||
| 35 | + - User agent string detection is only used when no good alternative is possible | ||
| 36 | + - Is executed directly for optimal performance | ||
| 37 | + */ | ||
| 38 | + ua = function() { | ||
| 39 | + var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF, | ||
| 40 | + u = nav.userAgent.toLowerCase(), | ||
| 41 | + p = nav.platform.toLowerCase(), | ||
| 42 | + windows = p ? /win/.test(p) : /win/.test(u), | ||
| 43 | + mac = p ? /mac/.test(p) : /mac/.test(u), | ||
| 44 | + webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit | ||
| 45 | + 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 | ||
| 46 | + playerVersion = [0,0,0], | ||
| 47 | + d = null; | ||
| 48 | + if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) { | ||
| 49 | + d = nav.plugins[SHOCKWAVE_FLASH].description; | ||
| 50 | + 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+ | ||
| 51 | + plugin = true; | ||
| 52 | + ie = false; // cascaded feature detection for Internet Explorer | ||
| 53 | + d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); | ||
| 54 | + playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10); | ||
| 55 | + playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10); | ||
| 56 | + playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0; | ||
| 57 | + } | ||
| 58 | + } | ||
| 59 | + else if (typeof win.ActiveXObject != UNDEF) { | ||
| 60 | + try { | ||
| 61 | + var a = new ActiveXObject(SHOCKWAVE_FLASH_AX); | ||
| 62 | + if (a) { // a will return null when ActiveX is disabled | ||
| 63 | + d = a.GetVariable("$version"); | ||
| 64 | + if (d) { | ||
| 65 | + ie = true; // cascaded feature detection for Internet Explorer | ||
| 66 | + d = d.split(" ")[1].split(","); | ||
| 67 | + playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; | ||
| 68 | + } | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + catch(e) {} | ||
| 72 | + } | ||
| 73 | + return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac }; | ||
| 74 | + }(), | ||
| 75 | + | ||
| 76 | + /* Cross-browser onDomLoad | ||
| 77 | + - Will fire an event as soon as the DOM of a web page is loaded | ||
| 78 | + - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/ | ||
| 79 | + - Regular onload serves as fallback | ||
| 80 | + */ | ||
| 81 | + onDomLoad = function() { | ||
| 82 | + if (!ua.w3) { return; } | ||
| 83 | + 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 | ||
| 84 | + callDomLoadFunctions(); | ||
| 85 | + } | ||
| 86 | + if (!isDomLoaded) { | ||
| 87 | + if (typeof doc.addEventListener != UNDEF) { | ||
| 88 | + doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false); | ||
| 89 | + } | ||
| 90 | + if (ua.ie && ua.win) { | ||
| 91 | + doc.attachEvent(ON_READY_STATE_CHANGE, function() { | ||
| 92 | + if (doc.readyState == "complete") { | ||
| 93 | + doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee); | ||
| 94 | + callDomLoadFunctions(); | ||
| 95 | + } | ||
| 96 | + }); | ||
| 97 | + if (win == top) { // if not inside an iframe | ||
| 98 | + (function(){ | ||
| 99 | + if (isDomLoaded) { return; } | ||
| 100 | + try { | ||
| 101 | + doc.documentElement.doScroll("left"); | ||
| 102 | + } | ||
| 103 | + catch(e) { | ||
| 104 | + setTimeout(arguments.callee, 0); | ||
| 105 | + return; | ||
| 106 | + } | ||
| 107 | + callDomLoadFunctions(); | ||
| 108 | + })(); | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | + if (ua.wk) { | ||
| 112 | + (function(){ | ||
| 113 | + if (isDomLoaded) { return; } | ||
| 114 | + if (!/loaded|complete/.test(doc.readyState)) { | ||
| 115 | + setTimeout(arguments.callee, 0); | ||
| 116 | + return; | ||
| 117 | + } | ||
| 118 | + callDomLoadFunctions(); | ||
| 119 | + })(); | ||
| 120 | + } | ||
| 121 | + addLoadEvent(callDomLoadFunctions); | ||
| 122 | + } | ||
| 123 | + }(); | ||
| 124 | + | ||
| 125 | + function callDomLoadFunctions() { | ||
| 126 | + if (isDomLoaded) { return; } | ||
| 127 | + try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early | ||
| 128 | + var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span")); | ||
| 129 | + t.parentNode.removeChild(t); | ||
| 130 | + } | ||
| 131 | + catch (e) { return; } | ||
| 132 | + isDomLoaded = true; | ||
| 133 | + var dl = domLoadFnArr.length; | ||
| 134 | + for (var i = 0; i < dl; i++) { | ||
| 135 | + domLoadFnArr[i](); | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + function addDomLoadEvent(fn) { | ||
| 140 | + if (isDomLoaded) { | ||
| 141 | + fn(); | ||
| 142 | + } | ||
| 143 | + else { | ||
| 144 | + domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+ | ||
| 145 | + } | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + /* Cross-browser onload | ||
| 149 | + - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/ | ||
| 150 | + - Will fire an event as soon as a web page including all of its assets are loaded | ||
| 151 | + */ | ||
| 152 | + function addLoadEvent(fn) { | ||
| 153 | + if (typeof win.addEventListener != UNDEF) { | ||
| 154 | + win.addEventListener("load", fn, false); | ||
| 155 | + } | ||
| 156 | + else if (typeof doc.addEventListener != UNDEF) { | ||
| 157 | + doc.addEventListener("load", fn, false); | ||
| 158 | + } | ||
| 159 | + else if (typeof win.attachEvent != UNDEF) { | ||
| 160 | + addListener(win, "onload", fn); | ||
| 161 | + } | ||
| 162 | + else if (typeof win.onload == "function") { | ||
| 163 | + var fnOld = win.onload; | ||
| 164 | + win.onload = function() { | ||
| 165 | + fnOld(); | ||
| 166 | + fn(); | ||
| 167 | + }; | ||
| 168 | + } | ||
| 169 | + else { | ||
| 170 | + win.onload = fn; | ||
| 171 | + } | ||
| 172 | + } | ||
| 173 | + | ||
| 174 | + /* Main function | ||
| 175 | + - Will preferably execute onDomLoad, otherwise onload (as a fallback) | ||
| 176 | + */ | ||
| 177 | + function main() { | ||
| 178 | + if (plugin) { | ||
| 179 | + testPlayerVersion(); | ||
| 180 | + } | ||
| 181 | + else { | ||
| 182 | + matchVersions(); | ||
| 183 | + } | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + /* Detect the Flash Player version for non-Internet Explorer browsers | ||
| 187 | + - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description: | ||
| 188 | + a. Both release and build numbers can be detected | ||
| 189 | + b. Avoid wrong descriptions by corrupt installers provided by Adobe | ||
| 190 | + c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports | ||
| 191 | + - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available | ||
| 192 | + */ | ||
| 193 | + function testPlayerVersion() { | ||
| 194 | + var b = doc.getElementsByTagName("body")[0]; | ||
| 195 | + var o = createElement(OBJECT); | ||
| 196 | + o.setAttribute("type", FLASH_MIME_TYPE); | ||
| 197 | + var t = b.appendChild(o); | ||
| 198 | + if (t) { | ||
| 199 | + var counter = 0; | ||
| 200 | + (function(){ | ||
| 201 | + if (typeof t.GetVariable != UNDEF) { | ||
| 202 | + var d = t.GetVariable("$version"); | ||
| 203 | + if (d) { | ||
| 204 | + d = d.split(" ")[1].split(","); | ||
| 205 | + ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)]; | ||
| 206 | + } | ||
| 207 | + } | ||
| 208 | + else if (counter < 10) { | ||
| 209 | + counter++; | ||
| 210 | + setTimeout(arguments.callee, 10); | ||
| 211 | + return; | ||
| 212 | + } | ||
| 213 | + b.removeChild(o); | ||
| 214 | + t = null; | ||
| 215 | + matchVersions(); | ||
| 216 | + })(); | ||
| 217 | + } | ||
| 218 | + else { | ||
| 219 | + matchVersions(); | ||
| 220 | + } | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + /* Perform Flash Player and SWF version matching; static publishing only | ||
| 224 | + */ | ||
| 225 | + function matchVersions() { | ||
| 226 | + var rl = regObjArr.length; | ||
| 227 | + if (rl > 0) { | ||
| 228 | + for (var i = 0; i < rl; i++) { // for each registered object element | ||
| 229 | + var id = regObjArr[i].id; | ||
| 230 | + var cb = regObjArr[i].callbackFn; | ||
| 231 | + var cbObj = {success:false, id:id}; | ||
| 232 | + if (ua.pv[0] > 0) { | ||
| 233 | + var obj = getElementById(id); | ||
| 234 | + if (obj) { | ||
| 235 | + if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match! | ||
| 236 | + setVisibility(id, true); | ||
| 237 | + if (cb) { | ||
| 238 | + cbObj.success = true; | ||
| 239 | + cbObj.ref = getObjectById(id); | ||
| 240 | + cb(cbObj); | ||
| 241 | + } | ||
| 242 | + } | ||
| 243 | + else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported | ||
| 244 | + var att = {}; | ||
| 245 | + att.data = regObjArr[i].expressInstall; | ||
| 246 | + att.width = obj.getAttribute("width") || "0"; | ||
| 247 | + att.height = obj.getAttribute("height") || "0"; | ||
| 248 | + if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); } | ||
| 249 | + if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); } | ||
| 250 | + // parse HTML object param element's name-value pairs | ||
| 251 | + var par = {}; | ||
| 252 | + var p = obj.getElementsByTagName("param"); | ||
| 253 | + var pl = p.length; | ||
| 254 | + for (var j = 0; j < pl; j++) { | ||
| 255 | + if (p[j].getAttribute("name").toLowerCase() != "movie") { | ||
| 256 | + par[p[j].getAttribute("name")] = p[j].getAttribute("value"); | ||
| 257 | + } | ||
| 258 | + } | ||
| 259 | + showExpressInstall(att, par, id, cb); | ||
| 260 | + } | ||
| 261 | + 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 | ||
| 262 | + displayAltContent(obj); | ||
| 263 | + if (cb) { cb(cbObj); } | ||
| 264 | + } | ||
| 265 | + } | ||
| 266 | + } | ||
| 267 | + 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) | ||
| 268 | + setVisibility(id, true); | ||
| 269 | + if (cb) { | ||
| 270 | + var o = getObjectById(id); // test whether there is an HTML object element or not | ||
| 271 | + if (o && typeof o.SetVariable != UNDEF) { | ||
| 272 | + cbObj.success = true; | ||
| 273 | + cbObj.ref = o; | ||
| 274 | + } | ||
| 275 | + cb(cbObj); | ||
| 276 | + } | ||
| 277 | + } | ||
| 278 | + } | ||
| 279 | + } | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + function getObjectById(objectIdStr) { | ||
| 283 | + var r = null; | ||
| 284 | + var o = getElementById(objectIdStr); | ||
| 285 | + if (o && o.nodeName == "OBJECT") { | ||
| 286 | + if (typeof o.SetVariable != UNDEF) { | ||
| 287 | + r = o; | ||
| 288 | + } | ||
| 289 | + else { | ||
| 290 | + var n = o.getElementsByTagName(OBJECT)[0]; | ||
| 291 | + if (n) { | ||
| 292 | + r = n; | ||
| 293 | + } | ||
| 294 | + } | ||
| 295 | + } | ||
| 296 | + return r; | ||
| 297 | + } | ||
| 298 | + | ||
| 299 | + /* Requirements for Adobe Express Install | ||
| 300 | + - only one instance can be active at a time | ||
| 301 | + - fp 6.0.65 or higher | ||
| 302 | + - Win/Mac OS only | ||
| 303 | + - no Webkit engines older than version 312 | ||
| 304 | + */ | ||
| 305 | + function canExpressInstall() { | ||
| 306 | + return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312); | ||
| 307 | + } | ||
| 308 | + | ||
| 309 | + /* Show the Adobe Express Install dialog | ||
| 310 | + - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75 | ||
| 311 | + */ | ||
| 312 | + function showExpressInstall(att, par, replaceElemIdStr, callbackFn) { | ||
| 313 | + isExpressInstallActive = true; | ||
| 314 | + storedCallbackFn = callbackFn || null; | ||
| 315 | + storedCallbackObj = {success:false, id:replaceElemIdStr}; | ||
| 316 | + var obj = getElementById(replaceElemIdStr); | ||
| 317 | + if (obj) { | ||
| 318 | + if (obj.nodeName == "OBJECT") { // static publishing | ||
| 319 | + storedAltContent = abstractAltContent(obj); | ||
| 320 | + storedAltContentId = null; | ||
| 321 | + } | ||
| 322 | + else { // dynamic publishing | ||
| 323 | + storedAltContent = obj; | ||
| 324 | + storedAltContentId = replaceElemIdStr; | ||
| 325 | + } | ||
| 326 | + att.id = EXPRESS_INSTALL_ID; | ||
| 327 | + if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; } | ||
| 328 | + if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; } | ||
| 329 | + doc.title = doc.title.slice(0, 47) + " - Flash Player Installation"; | ||
| 330 | + var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn", | ||
| 331 | + fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title; | ||
| 332 | + if (typeof par.flashvars != UNDEF) { | ||
| 333 | + par.flashvars += "&" + fv; | ||
| 334 | + } | ||
| 335 | + else { | ||
| 336 | + par.flashvars = fv; | ||
| 337 | + } | ||
| 338 | + // 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, | ||
| 339 | + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work | ||
| 340 | + if (ua.ie && ua.win && obj.readyState != 4) { | ||
| 341 | + var newObj = createElement("div"); | ||
| 342 | + replaceElemIdStr += "SWFObjectNew"; | ||
| 343 | + newObj.setAttribute("id", replaceElemIdStr); | ||
| 344 | + obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf | ||
| 345 | + obj.style.display = "none"; | ||
| 346 | + (function(){ | ||
| 347 | + if (obj.readyState == 4) { | ||
| 348 | + obj.parentNode.removeChild(obj); | ||
| 349 | + } | ||
| 350 | + else { | ||
| 351 | + setTimeout(arguments.callee, 10); | ||
| 352 | + } | ||
| 353 | + })(); | ||
| 354 | + } | ||
| 355 | + createSWF(att, par, replaceElemIdStr); | ||
| 356 | + } | ||
| 357 | + } | ||
| 358 | + | ||
| 359 | + /* Functions to abstract and display alternative content | ||
| 360 | + */ | ||
| 361 | + function displayAltContent(obj) { | ||
| 362 | + if (ua.ie && ua.win && obj.readyState != 4) { | ||
| 363 | + // 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, | ||
| 364 | + // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work | ||
| 365 | + var el = createElement("div"); | ||
| 366 | + obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content | ||
| 367 | + el.parentNode.replaceChild(abstractAltContent(obj), el); | ||
| 368 | + obj.style.display = "none"; | ||
| 369 | + (function(){ | ||
| 370 | + if (obj.readyState == 4) { | ||
| 371 | + obj.parentNode.removeChild(obj); | ||
| 372 | + } | ||
| 373 | + else { | ||
| 374 | + setTimeout(arguments.callee, 10); | ||
| 375 | + } | ||
| 376 | + })(); | ||
| 377 | + } | ||
| 378 | + else { | ||
| 379 | + obj.parentNode.replaceChild(abstractAltContent(obj), obj); | ||
| 380 | + } | ||
| 381 | + } | ||
| 382 | + | ||
| 383 | + function abstractAltContent(obj) { | ||
| 384 | + var ac = createElement("div"); | ||
| 385 | + if (ua.win && ua.ie) { | ||
| 386 | + ac.innerHTML = obj.innerHTML; | ||
| 387 | + } | ||
| 388 | + else { | ||
| 389 | + var nestedObj = obj.getElementsByTagName(OBJECT)[0]; | ||
| 390 | + if (nestedObj) { | ||
| 391 | + var c = nestedObj.childNodes; | ||
| 392 | + if (c) { | ||
| 393 | + var cl = c.length; | ||
| 394 | + for (var i = 0; i < cl; i++) { | ||
| 395 | + if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) { | ||
| 396 | + ac.appendChild(c[i].cloneNode(true)); | ||
| 397 | + } | ||
| 398 | + } | ||
| 399 | + } | ||
| 400 | + } | ||
| 401 | + } | ||
| 402 | + return ac; | ||
| 403 | + } | ||
| 404 | + | ||
| 405 | + /* Cross-browser dynamic SWF creation | ||
| 406 | + */ | ||
| 407 | + function createSWF(attObj, parObj, id) { | ||
| 408 | + var r, el = getElementById(id); | ||
| 409 | + if (ua.wk && ua.wk < 312) { return r; } | ||
| 410 | + if (el) { | ||
| 411 | + if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content | ||
| 412 | + attObj.id = id; | ||
| 413 | + } | ||
| 414 | + if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML | ||
| 415 | + var att = ""; | ||
| 416 | + for (var i in attObj) { | ||
| 417 | + if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries | ||
| 418 | + if (i.toLowerCase() == "data") { | ||
| 419 | + parObj.movie = attObj[i]; | ||
| 420 | + } | ||
| 421 | + else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword | ||
| 422 | + att += ' class="' + attObj[i] + '"'; | ||
| 423 | + } | ||
| 424 | + else if (i.toLowerCase() != "classid") { | ||
| 425 | + att += ' ' + i + '="' + attObj[i] + '"'; | ||
| 426 | + } | ||
| 427 | + } | ||
| 428 | + } | ||
| 429 | + var par = ""; | ||
| 430 | + for (var j in parObj) { | ||
| 431 | + if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries | ||
| 432 | + par += '<param name="' + j + '" value="' + parObj[j] + '" />'; | ||
| 433 | + } | ||
| 434 | + } | ||
| 435 | + el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>'; | ||
| 436 | + objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only) | ||
| 437 | + r = getElementById(attObj.id); | ||
| 438 | + } | ||
| 439 | + else { // well-behaving browsers | ||
| 440 | + var o = createElement(OBJECT); | ||
| 441 | + o.setAttribute("type", FLASH_MIME_TYPE); | ||
| 442 | + for (var m in attObj) { | ||
| 443 | + if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries | ||
| 444 | + if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword | ||
| 445 | + o.setAttribute("class", attObj[m]); | ||
| 446 | + } | ||
| 447 | + else if (m.toLowerCase() != "classid") { // filter out IE specific attribute | ||
| 448 | + o.setAttribute(m, attObj[m]); | ||
| 449 | + } | ||
| 450 | + } | ||
| 451 | + } | ||
| 452 | + for (var n in parObj) { | ||
| 453 | + if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element | ||
| 454 | + createObjParam(o, n, parObj[n]); | ||
| 455 | + } | ||
| 456 | + } | ||
| 457 | + el.parentNode.replaceChild(o, el); | ||
| 458 | + r = o; | ||
| 459 | + } | ||
| 460 | + } | ||
| 461 | + return r; | ||
| 462 | + } | ||
| 463 | + | ||
| 464 | + function createObjParam(el, pName, pValue) { | ||
| 465 | + var p = createElement("param"); | ||
| 466 | + p.setAttribute("name", pName); | ||
| 467 | + p.setAttribute("value", pValue); | ||
| 468 | + el.appendChild(p); | ||
| 469 | + } | ||
| 470 | + | ||
| 471 | + /* Cross-browser SWF removal | ||
| 472 | + - Especially needed to safely and completely remove a SWF in Internet Explorer | ||
| 473 | + */ | ||
| 474 | + function removeSWF(id) { | ||
| 475 | + var obj = getElementById(id); | ||
| 476 | + if (obj && obj.nodeName == "OBJECT") { | ||
| 477 | + if (ua.ie && ua.win) { | ||
| 478 | + obj.style.display = "none"; | ||
| 479 | + (function(){ | ||
| 480 | + if (obj.readyState == 4) { | ||
| 481 | + removeObjectInIE(id); | ||
| 482 | + } | ||
| 483 | + else { | ||
| 484 | + setTimeout(arguments.callee, 10); | ||
| 485 | + } | ||
| 486 | + })(); | ||
| 487 | + } | ||
| 488 | + else { | ||
| 489 | + obj.parentNode.removeChild(obj); | ||
| 490 | + } | ||
| 491 | + } | ||
| 492 | + } | ||
| 493 | + | ||
| 494 | + function removeObjectInIE(id) { | ||
| 495 | + var obj = getElementById(id); | ||
| 496 | + if (obj) { | ||
| 497 | + for (var i in obj) { | ||
| 498 | + if (typeof obj[i] == "function") { | ||
| 499 | + obj[i] = null; | ||
| 500 | + } | ||
| 501 | + } | ||
| 502 | + obj.parentNode.removeChild(obj); | ||
| 503 | + } | ||
| 504 | + } | ||
| 505 | + | ||
| 506 | + /* Functions to optimize JavaScript compression | ||
| 507 | + */ | ||
| 508 | + function getElementById(id) { | ||
| 509 | + var el = null; | ||
| 510 | + try { | ||
| 511 | + el = doc.getElementById(id); | ||
| 512 | + } | ||
| 513 | + catch (e) {} | ||
| 514 | + return el; | ||
| 515 | + } | ||
| 516 | + | ||
| 517 | + function createElement(el) { | ||
| 518 | + return doc.createElement(el); | ||
| 519 | + } | ||
| 520 | + | ||
| 521 | + /* Updated attachEvent function for Internet Explorer | ||
| 522 | + - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks | ||
| 523 | + */ | ||
| 524 | + function addListener(target, eventType, fn) { | ||
| 525 | + target.attachEvent(eventType, fn); | ||
| 526 | + listenersArr[listenersArr.length] = [target, eventType, fn]; | ||
| 527 | + } | ||
| 528 | + | ||
| 529 | + /* Flash Player and SWF content version matching | ||
| 530 | + */ | ||
| 531 | + function hasPlayerVersion(rv) { | ||
| 532 | + var pv = ua.pv, v = rv.split("."); | ||
| 533 | + v[0] = parseInt(v[0], 10); | ||
| 534 | + v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0" | ||
| 535 | + v[2] = parseInt(v[2], 10) || 0; | ||
| 536 | + 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; | ||
| 537 | + } | ||
| 538 | + | ||
| 539 | + /* Cross-browser dynamic CSS creation | ||
| 540 | + - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php | ||
| 541 | + */ | ||
| 542 | + function createCSS(sel, decl, media, newStyle) { | ||
| 543 | + if (ua.ie && ua.mac) { return; } | ||
| 544 | + var h = doc.getElementsByTagName("head")[0]; | ||
| 545 | + if (!h) { return; } // to also support badly authored HTML pages that lack a head element | ||
| 546 | + var m = (media && typeof media == "string") ? media : "screen"; | ||
| 547 | + if (newStyle) { | ||
| 548 | + dynamicStylesheet = null; | ||
| 549 | + dynamicStylesheetMedia = null; | ||
| 550 | + } | ||
| 551 | + if (!dynamicStylesheet || dynamicStylesheetMedia != m) { | ||
| 552 | + // create dynamic stylesheet + get a global reference to it | ||
| 553 | + var s = createElement("style"); | ||
| 554 | + s.setAttribute("type", "text/css"); | ||
| 555 | + s.setAttribute("media", m); | ||
| 556 | + dynamicStylesheet = h.appendChild(s); | ||
| 557 | + if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) { | ||
| 558 | + dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1]; | ||
| 559 | + } | ||
| 560 | + dynamicStylesheetMedia = m; | ||
| 561 | + } | ||
| 562 | + // add style rule | ||
| 563 | + if (ua.ie && ua.win) { | ||
| 564 | + if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) { | ||
| 565 | + dynamicStylesheet.addRule(sel, decl); | ||
| 566 | + } | ||
| 567 | + } | ||
| 568 | + else { | ||
| 569 | + if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) { | ||
| 570 | + dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}")); | ||
| 571 | + } | ||
| 572 | + } | ||
| 573 | + } | ||
| 574 | + | ||
| 575 | + function setVisibility(id, isVisible) { | ||
| 576 | + if (!autoHideShow) { return; } | ||
| 577 | + var v = isVisible ? "visible" : "hidden"; | ||
| 578 | + if (isDomLoaded && getElementById(id)) { | ||
| 579 | + getElementById(id).style.visibility = v; | ||
| 580 | + } | ||
| 581 | + else { | ||
| 582 | + createCSS("#" + id, "visibility:" + v); | ||
| 583 | + } | ||
| 584 | + } | ||
| 585 | + | ||
| 586 | + /* Filter to avoid XSS attacks | ||
| 587 | + */ | ||
| 588 | + function urlEncodeIfNecessary(s) { | ||
| 589 | + var regex = /[\\\"<>\.;]/; | ||
| 590 | + var hasBadChars = regex.exec(s) != null; | ||
| 591 | + return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s; | ||
| 592 | + } | ||
| 593 | + | ||
| 594 | + /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only) | ||
| 595 | + */ | ||
| 596 | + var cleanup = function() { | ||
| 597 | + if (ua.ie && ua.win) { | ||
| 598 | + window.attachEvent("onunload", function() { | ||
| 599 | + // remove listeners to avoid memory leaks | ||
| 600 | + var ll = listenersArr.length; | ||
| 601 | + for (var i = 0; i < ll; i++) { | ||
| 602 | + listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]); | ||
| 603 | + } | ||
| 604 | + // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect | ||
| 605 | + var il = objIdArr.length; | ||
| 606 | + for (var j = 0; j < il; j++) { | ||
| 607 | + removeSWF(objIdArr[j]); | ||
| 608 | + } | ||
| 609 | + // cleanup library's main closures to avoid memory leaks | ||
| 610 | + for (var k in ua) { | ||
| 611 | + ua[k] = null; | ||
| 612 | + } | ||
| 613 | + ua = null; | ||
| 614 | + for (var l in swfobject) { | ||
| 615 | + swfobject[l] = null; | ||
| 616 | + } | ||
| 617 | + swfobject = null; | ||
| 618 | + }); | ||
| 619 | + } | ||
| 620 | + }(); | ||
| 621 | + | ||
| 622 | + return { | ||
| 623 | + /* Public API | ||
| 624 | + - Reference: http://code.google.com/p/swfobject/wiki/documentation | ||
| 625 | + */ | ||
| 626 | + registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) { | ||
| 627 | + if (ua.w3 && objectIdStr && swfVersionStr) { | ||
| 628 | + var regObj = {}; | ||
| 629 | + regObj.id = objectIdStr; | ||
| 630 | + regObj.swfVersion = swfVersionStr; | ||
| 631 | + regObj.expressInstall = xiSwfUrlStr; | ||
| 632 | + regObj.callbackFn = callbackFn; | ||
| 633 | + regObjArr[regObjArr.length] = regObj; | ||
| 634 | + setVisibility(objectIdStr, false); | ||
| 635 | + } | ||
| 636 | + else if (callbackFn) { | ||
| 637 | + callbackFn({success:false, id:objectIdStr}); | ||
| 638 | + } | ||
| 639 | + }, | ||
| 640 | + | ||
| 641 | + getObjectById: function(objectIdStr) { | ||
| 642 | + if (ua.w3) { | ||
| 643 | + return getObjectById(objectIdStr); | ||
| 644 | + } | ||
| 645 | + }, | ||
| 646 | + | ||
| 647 | + embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) { | ||
| 648 | + var callbackObj = {success:false, id:replaceElemIdStr}; | ||
| 649 | + if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) { | ||
| 650 | + setVisibility(replaceElemIdStr, false); | ||
| 651 | + addDomLoadEvent(function() { | ||
| 652 | + widthStr += ""; // auto-convert to string | ||
| 653 | + heightStr += ""; | ||
| 654 | + var att = {}; | ||
| 655 | + if (attObj && typeof attObj === OBJECT) { | ||
| 656 | + for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs | ||
| 657 | + att[i] = attObj[i]; | ||
| 658 | + } | ||
| 659 | + } | ||
| 660 | + att.data = swfUrlStr; | ||
| 661 | + att.width = widthStr; | ||
| 662 | + att.height = heightStr; | ||
| 663 | + var par = {}; | ||
| 664 | + if (parObj && typeof parObj === OBJECT) { | ||
| 665 | + for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs | ||
| 666 | + par[j] = parObj[j]; | ||
| 667 | + } | ||
| 668 | + } | ||
| 669 | + if (flashvarsObj && typeof flashvarsObj === OBJECT) { | ||
| 670 | + for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs | ||
| 671 | + if (typeof par.flashvars != UNDEF) { | ||
| 672 | + par.flashvars += "&" + k + "=" + flashvarsObj[k]; | ||
| 673 | + } | ||
| 674 | + else { | ||
| 675 | + par.flashvars = k + "=" + flashvarsObj[k]; | ||
| 676 | + } | ||
| 677 | + } | ||
| 678 | + } | ||
| 679 | + if (hasPlayerVersion(swfVersionStr)) { // create SWF | ||
| 680 | + var obj = createSWF(att, par, replaceElemIdStr); | ||
| 681 | + if (att.id == replaceElemIdStr) { | ||
| 682 | + setVisibility(replaceElemIdStr, true); | ||
| 683 | + } | ||
| 684 | + callbackObj.success = true; | ||
| 685 | + callbackObj.ref = obj; | ||
| 686 | + } | ||
| 687 | + else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install | ||
| 688 | + att.data = xiSwfUrlStr; | ||
| 689 | + showExpressInstall(att, par, replaceElemIdStr, callbackFn); | ||
| 690 | + return; | ||
| 691 | + } | ||
| 692 | + else { // show alternative content | ||
| 693 | + setVisibility(replaceElemIdStr, true); | ||
| 694 | + } | ||
| 695 | + if (callbackFn) { callbackFn(callbackObj); } | ||
| 696 | + }); | ||
| 697 | + } | ||
| 698 | + else if (callbackFn) { callbackFn(callbackObj); } | ||
| 699 | + }, | ||
| 700 | + | ||
| 701 | + switchOffAutoHideShow: function() { | ||
| 702 | + autoHideShow = false; | ||
| 703 | + }, | ||
| 704 | + | ||
| 705 | + ua: ua, | ||
| 706 | + | ||
| 707 | + getFlashPlayerVersion: function() { | ||
| 708 | + return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] }; | ||
| 709 | + }, | ||
| 710 | + | ||
| 711 | + hasFlashPlayerVersion: hasPlayerVersion, | ||
| 712 | + | ||
| 713 | + createSWF: function(attObj, parObj, replaceElemIdStr) { | ||
| 714 | + if (ua.w3) { | ||
| 715 | + return createSWF(attObj, parObj, replaceElemIdStr); | ||
| 716 | + } | ||
| 717 | + else { | ||
| 718 | + return undefined; | ||
| 719 | + } | ||
| 720 | + }, | ||
| 721 | + | ||
| 722 | + showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) { | ||
| 723 | + if (ua.w3 && canExpressInstall()) { | ||
| 724 | + showExpressInstall(att, par, replaceElemIdStr, callbackFn); | ||
| 725 | + } | ||
| 726 | + }, | ||
| 727 | + | ||
| 728 | + removeSWF: function(objElemIdStr) { | ||
| 729 | + if (ua.w3) { | ||
| 730 | + removeSWF(objElemIdStr); | ||
| 731 | + } | ||
| 732 | + }, | ||
| 733 | + | ||
| 734 | + createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) { | ||
| 735 | + if (ua.w3) { | ||
| 736 | + createCSS(selStr, declStr, mediaStr, newStyleBoolean); | ||
| 737 | + } | ||
| 738 | + }, | ||
| 739 | + | ||
| 740 | + addDomLoadEvent: addDomLoadEvent, | ||
| 741 | + | ||
| 742 | + addLoadEvent: addLoadEvent, | ||
| 743 | + | ||
| 744 | + getQueryParamValue: function(param) { | ||
| 745 | + var q = doc.location.search || doc.location.hash; | ||
| 746 | + if (q) { | ||
| 747 | + if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark | ||
| 748 | + if (param == null) { | ||
| 749 | + return urlEncodeIfNecessary(q); | ||
| 750 | + } | ||
| 751 | + var pairs = q.split("&"); | ||
| 752 | + for (var i = 0; i < pairs.length; i++) { | ||
| 753 | + if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) { | ||
| 754 | + return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1))); | ||
| 755 | + } | ||
| 756 | + } | ||
| 757 | + } | ||
| 758 | + return ""; | ||
| 759 | + }, | ||
| 760 | + | ||
| 761 | + // For internal usage only | ||
| 762 | + expressInstallCallback: function() { | ||
| 763 | + if (isExpressInstallActive) { | ||
| 764 | + var obj = getElementById(EXPRESS_INSTALL_ID); | ||
| 765 | + if (obj && storedAltContent) { | ||
| 766 | + obj.parentNode.replaceChild(storedAltContent, obj); | ||
| 767 | + if (storedAltContentId) { | ||
| 768 | + setVisibility(storedAltContentId, true); | ||
| 769 | + if (ua.ie && ua.win) { storedAltContent.style.display = "block"; } | ||
| 770 | + } | ||
| 771 | + if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); } | ||
| 772 | + } | ||
| 773 | + isExpressInstallActive = false; | ||
| 774 | + } | ||
| 775 | + } | ||
| 776 | + }; | ||
| 777 | +}(); |
trunk/research/SrsBW/src/SrsBW.as
0 → 100644
| 1 | +package | ||
| 2 | +{ | ||
| 3 | + import SrsClass.SrsElapsedTimer; | ||
| 4 | + import SrsClass.SrsSettings; | ||
| 5 | + | ||
| 6 | + import fl.controls.Button; | ||
| 7 | + import fl.controls.Label; | ||
| 8 | + import fl.controls.ProgressBar; | ||
| 9 | + import fl.controls.ProgressBarDirection; | ||
| 10 | + import fl.controls.ProgressBarMode; | ||
| 11 | + import fl.controls.TextArea; | ||
| 12 | + | ||
| 13 | + import flash.display.Loader; | ||
| 14 | + import flash.display.LoaderInfo; | ||
| 15 | + import flash.display.MovieClip; | ||
| 16 | + import flash.display.Sprite; | ||
| 17 | + import flash.display.StageAlign; | ||
| 18 | + import flash.display.StageScaleMode; | ||
| 19 | + import flash.events.Event; | ||
| 20 | + import flash.events.IOErrorEvent; | ||
| 21 | + import flash.events.MouseEvent; | ||
| 22 | + import flash.events.NetStatusEvent; | ||
| 23 | + import flash.events.TimerEvent; | ||
| 24 | + import flash.external.ExternalInterface; | ||
| 25 | + import flash.media.SoundTransform; | ||
| 26 | + import flash.media.Video; | ||
| 27 | + import flash.net.NetConnection; | ||
| 28 | + import flash.net.NetStream; | ||
| 29 | + import flash.net.ObjectEncoding; | ||
| 30 | + import flash.net.URLLoader; | ||
| 31 | + import flash.net.URLRequest; | ||
| 32 | + import flash.system.System; | ||
| 33 | + import flash.text.TextField; | ||
| 34 | + import flash.text.TextFormat; | ||
| 35 | + import flash.ui.*; | ||
| 36 | + import flash.utils.Timer; | ||
| 37 | + import flash.utils.clearTimeout; | ||
| 38 | + import flash.utils.setTimeout; | ||
| 39 | + | ||
| 40 | + public class SrsBW extends Sprite | ||
| 41 | + { | ||
| 42 | + private var addressInput : TextArea; | ||
| 43 | + private var okButton : Button; | ||
| 44 | + private var logCenter : TextArea; | ||
| 45 | + private var progressBar : ProgressBar; | ||
| 46 | + | ||
| 47 | + private var connection:NetConnection; | ||
| 48 | + | ||
| 49 | + private var publishTimer:Timer; | ||
| 50 | + | ||
| 51 | + private var stopPublishMarker:Boolean = false; | ||
| 52 | + | ||
| 53 | + private var progressTextLabel:Label; | ||
| 54 | + | ||
| 55 | + | ||
| 56 | + private var loader:Loader; | ||
| 57 | + | ||
| 58 | + private var elapTimer:SrsElapsedTimer; | ||
| 59 | + | ||
| 60 | + private var server_ip:String; | ||
| 61 | + private var play_kbps:Number; | ||
| 62 | + private var pub_kbps:Number; | ||
| 63 | + | ||
| 64 | + private var settings:SrsSettings = new SrsSettings; | ||
| 65 | + | ||
| 66 | + // set NetConnection ObjectEncoding to AMF0 | ||
| 67 | + NetConnection.defaultObjectEncoding = ObjectEncoding.AMF0; | ||
| 68 | + | ||
| 69 | + public function SrsBW() | ||
| 70 | + { | ||
| 71 | + this.stage.scaleMode = StageScaleMode.NO_SCALE; | ||
| 72 | + this.stage.align = StageAlign.TOP_LEFT; | ||
| 73 | + | ||
| 74 | + this.graphics.beginFill(0x464645, 0.8); | ||
| 75 | + this.graphics.drawRect(0, 0, 700, 400); | ||
| 76 | + this.graphics.endFill(); | ||
| 77 | + | ||
| 78 | + var request:URLRequest = new URLRequest("ui.swf"); | ||
| 79 | + loader = new Loader() | ||
| 80 | + loader.contentLoaderInfo.addEventListener(Event.COMPLETE, __loadedSWF); | ||
| 81 | + loader.load(request); | ||
| 82 | + loader.x = 0; | ||
| 83 | + loader.y = 0; | ||
| 84 | + | ||
| 85 | + // NetConnection | ||
| 86 | + connection = new NetConnection; | ||
| 87 | + connection.client = this; | ||
| 88 | + connection.addEventListener(NetStatusEvent.NET_STATUS, onStatus); | ||
| 89 | + | ||
| 90 | + var myMenu:ContextMenu = new ContextMenu(); | ||
| 91 | + myMenu.hideBuiltInItems(); | ||
| 92 | + myMenu.customItems.push(new ContextMenuItem("Srs 带宽测试工具 0.1", true)); | ||
| 93 | + this.contextMenu = myMenu; | ||
| 94 | + | ||
| 95 | + publishTimer = new Timer(50); | ||
| 96 | + publishTimer.addEventListener(TimerEvent.TIMER, onTimerEventHandle); | ||
| 97 | + addChild(loader); | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + public function __loadedSWF(e:Event):void { | ||
| 101 | + var contents:MovieClip=e.target.content as MovieClip; | ||
| 102 | + | ||
| 103 | + progressBar = contents.progressBar; | ||
| 104 | + progressBar.setProgress(50, 100); | ||
| 105 | + progressBar.indeterminate = false; | ||
| 106 | + progressBar.mode = ProgressBarMode.MANUAL; | ||
| 107 | + progressBar.maximum = 100; | ||
| 108 | + progressBar.value = 0; | ||
| 109 | + | ||
| 110 | + var startButton:Button = contents.startButton; | ||
| 111 | + startButton.height = 30; | ||
| 112 | + startButton.addEventListener(MouseEvent.CLICK, onOKButtonClicked); | ||
| 113 | + | ||
| 114 | + progressTextLabel = contents.stateLabel; | ||
| 115 | + addressInput = contents.addressLineEdit; | ||
| 116 | + | ||
| 117 | + var txt:TextFormat = new TextFormat(); | ||
| 118 | + txt.size = 12; | ||
| 119 | + addressInput.setStyle("textFormat", txt); | ||
| 120 | + progressTextLabel.setStyle("textFormat", txt); | ||
| 121 | + startButton.setStyle("textFormat", txt); | ||
| 122 | + contents.addressLabel.setStyle("textFormat", txt); | ||
| 123 | + addressInput.setStyle("textFormat", txt); | ||
| 124 | + | ||
| 125 | + // restore text | ||
| 126 | + addressInput.text = settings.addressText(); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + public function onOKButtonClicked(evt:Event) : void | ||
| 130 | + { | ||
| 131 | + if(connection.connected){ | ||
| 132 | + return; | ||
| 133 | + } | ||
| 134 | + | ||
| 135 | + connection.connect(addressInput.text); | ||
| 136 | + | ||
| 137 | + stopPublishMarker = false; | ||
| 138 | + | ||
| 139 | + // store the address into cookie | ||
| 140 | + settings.addAddressText(addressInput.text); | ||
| 141 | + } | ||
| 142 | + | ||
| 143 | + public function onStatus(evt:NetStatusEvent) : void{ | ||
| 144 | + trace(evt.info.code); | ||
| 145 | + switch(evt.info.code){ | ||
| 146 | + case "NetConnection.Connect.Failed": | ||
| 147 | + updateState("连接服务器失败!"); | ||
| 148 | + break; | ||
| 149 | + case "NetConnection.Connect.Rejected": | ||
| 150 | + updateState("服务器拒绝连接!"); | ||
| 151 | + break; | ||
| 152 | + case "NetConnection.Connect.Success": | ||
| 153 | + server_ip = evt.info.data.srs_server_ip; | ||
| 154 | + updateState("连接服务器成功: " + server_ip); | ||
| 155 | + break; | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + public function close():void{ | ||
| 160 | + trace("close"); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + public function onSrsBandCheckStartPlayBytes(evt:Object):void{ | ||
| 164 | + var duration_ms:Number = evt.duration_ms; | ||
| 165 | + var interval_ms:Number = evt.interval_ms; | ||
| 166 | + | ||
| 167 | + connection.call("onSrsBandCheckStartingPlayBytes", null); | ||
| 168 | + updateState("测试下行带宽(" + server_ip + ")"); | ||
| 169 | + | ||
| 170 | + elapTimer = new SrsElapsedTimer; | ||
| 171 | + progressBar.maximum = evt.duration_ms; | ||
| 172 | + progressBar.value = 0; | ||
| 173 | + | ||
| 174 | + publishTimer.start(); | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + public function onSrsBandCheckPlaying(evt:Object):void{ | ||
| 178 | + //progressBar.value = elapTimer.elapsed(); | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + public function onTimerEventHandle(evt:TimerEvent):void | ||
| 182 | + { | ||
| 183 | + progressBar.value += 50; | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + public function onSrsBandCheckStopPlayBytes(evt:Object):void{ | ||
| 187 | + var duration_ms:Number = evt.duration_ms; | ||
| 188 | + var interval_ms:Number = evt.interval_ms; | ||
| 189 | + var duration_delta:Number = evt.duration_delta; | ||
| 190 | + var bytes_delta:Number = evt.bytes_delta; | ||
| 191 | + | ||
| 192 | + var kbps:Number = 0; | ||
| 193 | + if(duration_delta > 0){ | ||
| 194 | + kbps = bytes_delta * 8.0 / duration_delta; // b/ms == kbps | ||
| 195 | + } | ||
| 196 | + kbps = (int(kbps * 10))/10.0; | ||
| 197 | + play_kbps = kbps; | ||
| 198 | + | ||
| 199 | + flash.utils.setTimeout(stopPlayTest, 0); | ||
| 200 | + progressBar.value = elapTimer.elapsed(); | ||
| 201 | + progressBar.value = progressBar.maximum; | ||
| 202 | + } | ||
| 203 | + | ||
| 204 | + private function stopPlayTest():void{ | ||
| 205 | + connection.call("onSrsBandCheckStoppedPlayBytes", null); | ||
| 206 | + publishTimer.stop(); | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + private function publisher():void{ | ||
| 210 | + | ||
| 211 | + if(stopPublishMarker) { | ||
| 212 | + return; | ||
| 213 | + } | ||
| 214 | + | ||
| 215 | + var data:Array = new Array(); | ||
| 216 | + for(var i:int; i < 2000; i++){ | ||
| 217 | + data.push("SrS band check data from client's publishing......"); | ||
| 218 | + } | ||
| 219 | + connection.call("onSrsBandCheckPublishing", null, data); | ||
| 220 | + | ||
| 221 | + flash.utils.setTimeout(publisher, 0); | ||
| 222 | + | ||
| 223 | + progressBar.value = elapTimer.elapsed(); | ||
| 224 | + } | ||
| 225 | + | ||
| 226 | + public function onSrsBandCheckStartPublishBytes(evt:Object):void{ | ||
| 227 | + var duration_ms:Number = evt.duration_ms; | ||
| 228 | + var interval_ms:Number = evt.interval_ms; | ||
| 229 | + | ||
| 230 | + connection.call("onSrsBandCheckStartingPublishBytes", null); | ||
| 231 | + updateState("测试上行带宽(" + server_ip + ")"); | ||
| 232 | + | ||
| 233 | + flash.utils.setTimeout(publisher, 0); | ||
| 234 | + | ||
| 235 | + elapTimer.restart(); | ||
| 236 | + progressBar.maximum = duration_ms; | ||
| 237 | + progressBar.value = 0; | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + public function onSrsBandCheckStopPublishBytes(evt:Object):void{ | ||
| 241 | + var duration_ms:Number = evt.duration_ms; | ||
| 242 | + var interval_ms:Number = evt.interval_ms; | ||
| 243 | + var duration_delta:Number = evt.duration_delta; | ||
| 244 | + var bytes_delta:Number = evt.bytes_delta; | ||
| 245 | + | ||
| 246 | + var kbps:Number = 0; | ||
| 247 | + if(duration_delta > 0){ | ||
| 248 | + kbps = bytes_delta * 8.0 / duration_delta; // b/ms == kbps | ||
| 249 | + } | ||
| 250 | + kbps = (int(kbps * 10))/10.0; | ||
| 251 | + pub_kbps = kbps; | ||
| 252 | + progressBar.value = progressBar.maximum; | ||
| 253 | + | ||
| 254 | + stopPublishMarker = true; | ||
| 255 | + stopPublishTest(); | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + private function stopPublishTest():void{ | ||
| 259 | + if(connection.connected){ | ||
| 260 | + connection.call("onSrsBandCheckStoppedPublishBytes", null); | ||
| 261 | + } | ||
| 262 | + } | ||
| 263 | + | ||
| 264 | + public function onSrsBandCheckFinished(evt:Object):void{ | ||
| 265 | + var code:Number = evt.code; | ||
| 266 | + var start_time:Number = evt.start_time; | ||
| 267 | + var end_time:Number = evt.end_time; | ||
| 268 | + var play_kbps:Number = evt.play_kbps; | ||
| 269 | + var publish_kbps:Number = evt.publish_kbps; | ||
| 270 | + var play_bytes:Number = evt.play_bytes; | ||
| 271 | + var play_time:Number = evt.play_time; | ||
| 272 | + var publish_bytes:Number = evt.publish_bytes; | ||
| 273 | + var publish_time:Number = evt.publish_time; | ||
| 274 | + | ||
| 275 | + updateState("检测结束: 服务器: " + server_ip + " 上行: " + publish_kbps + " kbps" + " 下行: " + play_kbps + " kbps"); | ||
| 276 | + | ||
| 277 | + connection.call("finalClientPacket", null); | ||
| 278 | + } | ||
| 279 | + | ||
| 280 | + public function onBWDone():void{ | ||
| 281 | + // do nothing | ||
| 282 | + } | ||
| 283 | + | ||
| 284 | + private function updateState(text:String):void{ | ||
| 285 | + progressTextLabel.text = text; | ||
| 286 | + } | ||
| 287 | + } | ||
| 288 | +} |
| 1 | +package SrsClass | ||
| 2 | +{ | ||
| 3 | + import flash.system.System; | ||
| 4 | + | ||
| 5 | + public class SrsElapsedTimer | ||
| 6 | + { | ||
| 7 | + private var beginDate:Date; | ||
| 8 | + public function SrsElapsedTimer() | ||
| 9 | + { | ||
| 10 | + beginDate = new Date; | ||
| 11 | + } | ||
| 12 | + | ||
| 13 | + public function elapsed():Number{ | ||
| 14 | + var endDate:Date = new Date; | ||
| 15 | + | ||
| 16 | + // get deiff by ms | ||
| 17 | + return (endDate.time - beginDate.time); | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + public function restart():void{ | ||
| 21 | + beginDate = new Date; | ||
| 22 | + } | ||
| 23 | + } | ||
| 24 | +} |
| 1 | +package SrsClass | ||
| 2 | +{ | ||
| 3 | + import flash.net.SharedObject; | ||
| 4 | + | ||
| 5 | + public class SrsSettings | ||
| 6 | + { | ||
| 7 | + private var settings:SharedObject; | ||
| 8 | + private var key:String = "SrsBandCheck"; | ||
| 9 | + | ||
| 10 | + public function SrsSettings() | ||
| 11 | + { | ||
| 12 | + settings = SharedObject.getLocal(key); | ||
| 13 | + } | ||
| 14 | + | ||
| 15 | + public function addAddressText(val:String):void{ | ||
| 16 | + settings.data.address_text = val; | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | + public function addressText():String{ | ||
| 20 | + return settings.data.address_text; | ||
| 21 | + } | ||
| 22 | + | ||
| 23 | + static public function instance():SrsSettings{ | ||
| 24 | + return new SrsSettings; | ||
| 25 | + } | ||
| 26 | + } | ||
| 27 | +} |
trunk/research/SrsBW/ui.fla
0 → 100644
不能预览此文件类型
-
请 注册 或 登录 后发表评论