正在显示
34 个修改的文件
包含
0 行增加
和
3597 行删除
| 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
已删除
100644 → 0
| 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
已删除
100644 → 0
不能预览此文件类型
trunk/research/SrsBW/Video.swc
已删除
100644 → 0
不能预览此文件类型
| 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
已删除
100644 → 0
不能预览此文件类型
| 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 | -/*! 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
已删除
100644 → 0
不能预览此文件类型
| 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
已删除
100644 → 0
| 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
已删除
100644 → 0
不能预览此文件类型
trunk/research/api-server/static-dir/index.html
100755 → 100644
trunk/research/players/crossdomain.xml
100755 → 100644
trunk/research/players/index.html
100755 → 100644
trunk/research/players/jwplayer6.html
100755 → 100644
trunk/research/players/nginx_index.html
100755 → 100644
trunk/research/players/osmf.html
100755 → 100644
trunk/research/players/srs_bwt.html
100755 → 100644
trunk/research/players/srs_chat.html
100755 → 100644
trunk/research/players/srs_player.html
100755 → 100644
trunk/research/players/srs_publisher.html
100755 → 100644
trunk/research/players/vlc.html
100755 → 100644
-
请 注册 或 登录 后发表评论