wenjiegit

add bandcheck code and modified srs code for merge

  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>
  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>
  1 +#Thu Dec 19 02:10:00 CST 2013
  2 +eclipse.preferences.version=1
  3 +encoding/<project>=utf-8
不能预览此文件类型
不能预览此文件类型
  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>
不能预览此文件类型
  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 +}();
不能预览此文件类型
  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 +}();
  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 +}
不能预览此文件类型