| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952 | // 8.0.0.3398. Generated 1/18/2021 11:03:29 PM UTC//***** splitter.js *****///** jQuery.splitter.js - two-pane splitter window plugin** version 1.51 (2009/01/09)** Dual licensed under the MIT and GPL licenses:*   http://www.opensource.org/licenses/mit-license.php*   http://www.gnu.org/licenses/gpl.html*//*** The splitter() plugin implements a two-pane resizable splitter window.* The selected elements in the jQuery object are converted to a splitter;* each selected element should have two child elements, used for the panes* of the splitter. The plugin adds a third child element for the splitbar.** For more details see: http://methvin.com/splitter/*** @example $('#MySplitter').splitter();* @desc Create a vertical splitter with default settings** @example $('#MySplitter').splitter({type: 'h', accessKey: 'M'});* @desc Create a horizontal splitter resizable via Alt+Shift+M** @name splitter* @type jQuery* @param Object options Options for the splitter (not required)* @cat Plugins/Splitter* @return jQuery* @author Dave Methvin (dave.methvin@gmail.com)*/;(function($){$.fn.splitter = function(args){   args = args || {};   return this.each(function() {      var zombie;      // left-behind splitbar for outline resizes      function startSplitMouse(evt) {         if ( opts.outline )            zombie = zombie || bar.clone(false).insertAfter(A);         panes.css("-webkit-user-select", "none");   // Safari selects A/B text on a move         bar.addClass(opts.activeClass);         $('<div class="splitterMask"></div>').insertAfter(bar);         A._posSplit = A[0][opts.pxSplit] - evt[opts.eventPos];         $(document)            .bind("mousemove", doSplitMouse)            .bind("mouseup", endSplitMouse);      }      function doSplitMouse(evt) {         var newPos = A._posSplit+evt[opts.eventPos];         if ( opts.outline ) {            newPos = Math.max(0, Math.min(newPos, splitter._DA - bar._DA));            bar.css(opts.origin, newPos);         } else            resplit(newPos);      }      function endSplitMouse(evt) {         $('div.splitterMask').remove();         bar.removeClass(opts.activeClass);         var newPos = A._posSplit+evt[opts.eventPos];         if ( opts.outline ) {            zombie.remove(); zombie = null;            resplit(newPos);         }         panes.css("-webkit-user-select", "text");   // let Safari select text again         $(document)            .unbind("mousemove", doSplitMouse)            .unbind("mouseup", endSplitMouse);      }      function resplit(newPos) {         // Constrain new splitbar position to fit pane size limits         newPos = Math.max(A._min, splitter._DA - B._max,               Math.min(newPos, A._max, splitter._DA - bar._DA - B._min));         // Resize/position the two panes         bar._DA = bar[0][opts.pxSplit];      // bar size may change during dock         var posOffset = bar.is(':visible') ? bar._DA - 1 : 0;         bar.css(opts.origin, newPos - posOffset).css(opts.fixed, splitter._DF);         A.css(opts.origin, 0).css(opts.split, newPos).css(opts.fixed,  splitter._DF);         B.css(opts.origin, newPos + bar._DA - posOffset)            .css(opts.split, splitter._DA-bar._DA-newPos).css(opts.fixed,  splitter._DF);         // IE fires resize for us; all others pay cash         if ( !IE_10_AND_BELOW )            panes.trigger("resize");      }      function dimSum(jq, dims) {         // Opera returns -1 for missing min/max width, turn into 0         var sum = 0;         for ( var i=1; i < arguments.length; i++ )            sum += Math.max(parseInt(jq.css(arguments[i])) || 0, 0);         return sum;      }      // Determine settings based on incoming opts, element classes, and defaults      var vh = (args.splitHorizontal? 'h' : args.splitVertical? 'v' : args.type) || 'v';      var opts = $.extend({         activeClass: 'active',   // class name for active splitter         pxPerKey: 8,         // splitter px moved per keypress         tabIndex: 0,         // tab order indicator         accessKey: ''         // accessKey for splitbar      },{         v: {               // Vertical splitters:            keyLeft: 39, keyRight: 37, cursor: "col-resize",            splitbarClass: "vsplitbar", outlineClass: "voutline",            type: 'v', eventPos: "pageX", origin: "left",            split: "width",  pxSplit: "offsetWidth",  side1: "Left", side2: "Right",            fixed: "height", pxFixed: "offsetHeight", side3: "Top",  side4: "Bottom"         },         h: {               // Horizontal splitters:            keyTop: 40, keyBottom: 38,  cursor: "row-resize",            splitbarClass: "hsplitbar", outlineClass: "houtline",            type: 'h', eventPos: "pageY", origin: "top",            split: "height", pxSplit: "offsetHeight", side1: "Top",  side2: "Bottom",            fixed: "width",  pxFixed: "offsetWidth",  side3: "Left", side4: "Right"         }      }[vh], args);      // Create jQuery object closures for splitter and both panes      var splitter = $(this).css({position: "relative"});      var panes = $(">*", splitter[0]).css({         position: "absolute",          // positioned inside splitter container         "z-index": "1",               // splitbar is positioned above         "-moz-outline-style": "none"   // don't show dotted outline      });      var A = $(panes[0]);      // left  or top      var B = $(panes[1]);      // right or bottom      // Focuser element, provides keyboard support; title is shown by Opera accessKeys      var focuser = $('<a href="javascript:void(0)"></a>')         .attr({accessKey: opts.accessKey, tabIndex: opts.tabIndex, title: opts.splitbarClass})         .bind($.browser.opera?"click":"focus", function(){ this.focus(); bar.addClass(opts.activeClass) })         .bind("keydown", function(e){            var key = e.which || e.keyCode;            var dir = key==opts["key"+opts.side1]? 1 : key==opts["key"+opts.side2]? -1 : 0;            if ( dir )               resplit(A[0][opts.pxSplit]+dir*opts.pxPerKey, false);         })         .bind("blur", function(){ bar.removeClass(opts.activeClass) });      // Splitbar element, can be already in the doc or we create one      var bar = $(panes[2] || '<div></div>')         .insertAfter(A).css("z-index", "100").append(focuser)         .attr({"class": opts.splitbarClass, unselectable: "on"})         .css({position: "absolute",   "user-select": "none", "-webkit-user-select": "none",            "-khtml-user-select": "none", "-moz-user-select": "none", "top": "0px"})         .bind("mousedown", startSplitMouse);      // Use our cursor unless the style specifies a non-default cursor      if ( /^(auto|default|)$/.test(bar.css("cursor")) )         bar.css("cursor", opts.cursor);      // Cache several dimensions for speed, rather than re-querying constantly      bar._DA = bar[0][opts.pxSplit];      splitter._PBF = $.boxModel? dimSum(splitter, "border"+opts.side3+"Width", "border"+opts.side4+"Width") : 0;      splitter._PBA = $.boxModel? dimSum(splitter, "border"+opts.side1+"Width", "border"+opts.side2+"Width") : 0;      A._pane = opts.side1;      B._pane = opts.side2;      $.each([A,B], function(){         this._min = opts["min"+this._pane] || dimSum(this, "min-"+opts.split);         this._max = opts["max"+this._pane] || dimSum(this, "max-"+opts.split) || 9999;         this._init = opts["size"+this._pane]===true ?            parseInt($.curCSS(this[0],opts.split)) : opts["size"+this._pane];      });      // Determine initial position, get from cookie if specified      var initPos = A._init;      if ( !isNaN(B._init) )   // recalc initial B size as an offset from the top or left side         initPos = splitter[0][opts.pxSplit] - splitter._PBA - B._init - bar._DA;      if ( opts.cookie ) {         if ( !$.cookie )            alert('jQuery.splitter(): jQuery cookie plugin required');         var ckpos = parseInt($.cookie(opts.cookie));         if ( !isNaN(ckpos) )            initPos = ckpos;         $(window).bind("unload", function(){            var state = String(bar.css(opts.origin));   // current location of splitbar            $.cookie(opts.cookie, state, {expires: opts.cookieExpires || 365,               path: opts.cookiePath || document.location.pathname});         });      }      if ( isNaN(initPos) )   // King Solomon's algorithm         initPos = Math.round((splitter[0][opts.pxSplit] - splitter._PBA - bar._DA)/2);      // Resize event propagation and splitter sizing      if ( opts.anchorToWindow ) {         // Account for margin or border on the splitter container and enforce min height         splitter._hadjust = dimSum(splitter, "borderTopWidth", "borderBottomWidth", "marginBottom");         splitter._hmin = Math.max(dimSum(splitter, "minHeight"), 20);         $(window).bind("resize", function(){            var top = splitter.offset().top;            var wh = $(window).height();            splitter.css("height", Math.max(wh-top-splitter._hadjust, splitter._hmin)+"px");            if ( !IE_10_AND_BELOW ) splitter.trigger("resize");         }).trigger("resize");      }      else if ( opts.resizeToWidth && !IE_10_AND_BELOW )         $(window).bind("resize", function(){            splitter.trigger("resize");         });      // Resize event handler; triggered immediately to set initial position      splitter.bind("resize", function(e, size){         // Custom events bubble in jQuery 1.3; don't Yo Dawg         if ( e.target != this ) return;         // Determine new width/height of splitter container         splitter._DF = splitter[0][opts.pxFixed] - splitter._PBF;         splitter._DA = splitter[0][opts.pxSplit] - splitter._PBA;         // Bail if splitter isn't visible or content isn't there yet         if ( splitter._DF <= 0 || splitter._DA <= 0 ) return;         // Re-divvy the adjustable dimension; maintain size of the preferred pane         resplit(!isNaN(size)? size : (!(opts.sizeRight||opts.sizeBottom)? A[0][opts.pxSplit] :            splitter._DA-B[0][opts.pxSplit]-bar._DA));      }).trigger("resize" , [initPos]);   });};})(jQuery);//***** axutils.js *****///* * * * * */ (function() {     // define the root namespace object     if(!window.$axure) window.$axure = {};     $axure.utils = {};     // ------------------------------------------------------------------------     // Makes an object bindable     // ------------------------------------------------------------------------     $axure.utils.makeBindable = function(obj, events) {         if(obj.registeredBindings != null) return;         // copy the events         obj.bindableEvents = events.slice();         obj.registeredBindings = {};         obj.bind = function(eventName, fn) {             var binding = {};             binding.eventName = eventName;             binding.action = fn;             var bindingList = this.registeredBindings[eventName];             if(bindingList == null) {                 bindingList = [];                 this.registeredBindings[eventName] = bindingList;             }             bindingList[bindingList.length] = binding;         };         obj.unbind = function(eventName) {             if(eventName.indexOf('.') >= 0) {                 this.registeredBindings[eventName] = null;             } else {                 var event = eventName.split('.')[0];                 for(var bindingKey in this.registeredBindings) {                     if(bindingKey.split('.')[0] == event) {                         this.registeredBindings[bindingKey] = null;                     }                 }             }         };         obj.triggerEvent = function(eventName, arg) {             for(var bindingKey in this.registeredBindings) {                 if(bindingKey.split('.')[0] == eventName) {                     var bindings = this.registeredBindings[bindingKey];                     for(var i = 0; i < bindings.length; i++) {                         if(arg == null) {                             bindings[i].action();                         } else {                             bindings[i].action(arg);                         }                     }                 }             }         };     };     $axure.utils.loadCSS = function(url) {         $('head').append('<link text="text/css" href="' + url + '" rel="Stylesheet" />');     };     $axure.utils.loadJS = function(url) {         $('head').append('<script text="text/javascript" language="JavaScript" src="' + url + '"></script>');     };     $axure.utils.curry = function(fn) {         var curriedArgs = Array.prototype.slice.call(arguments, [1]);         return function() {             fn.apply(this, curriedArgs.concat(Array.prototype.slice.call(arguments)));         };     };     $axure.utils.succeeded = function(result) {         return result && result.success;     };     $axure.utils.createUniqueTag = function() {         return Math.random().toString().substring(2) +             Math.random().toString().substring(2) +                 Math.random().toString().substring(2) +                     Math.random().toString().substring(2);     };     $axure.utils.formatDate = function(date) {         var months = [             "Jan", "Feb", "Mar", "Apr", "May", "Jun",             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];         var hours = date.getHours();         var amPm = (hours > 11 ? 'PM' : 'AM');         hours = hours % 12;         if(hours == '0') hours = '12';         var minutes = date.getMinutes() + '';         if(minutes.length == 1) {             minutes = '0' + minutes;         }         return [             months[date.getMonth()], ' ', date.getDate(), ' ', date.getFullYear(), ' ',             hours, ':', minutes, ' ', amPm].join('');     };     $axure.utils.quickObject = function() {         var returnVal = {};         for(var i = 0; i < arguments.length; i += 2) {             returnVal[arguments[i]] = arguments[i + 1];         }         return returnVal;     };     var matrixBase = {         mul: function(val) {             if(val.x !== undefined) {                 return $axure.utils.Vector2D(                     this.m11 * val.x + this.m12 * val.y + this.tx,                     this.m21 * val.x + this.m22 * val.y + this.ty);             } else if(val.m11) {                 return $axure.utils.Matrix2D(                     this.m11 * val.m11 + this.m12 * val.m21,                     this.m11 * val.m12 + this.m12 * val.m22,                     this.m21 * val.m11 + this.m22 * val.m21,                     this.m21 * val.m12 + this.m22 * val.m22,                     val.tx + this.tx * val.m11 + this.ty * val.m21,                     val.ty + this.tx * val.m12 + this.ty * val.m22                 );             } else if(Number(val)) {                 var num = Number(val);                 return $axure.utils.Matrix2D(this.m11 * num, this.m12 * num,                     this.m21 * num, this.m22 * num,                     this.tx * num, this.ty * num);             } else return undefined;         },         rotate: function(angle) {             var angleRad = angle * Math.PI / 180;             var c = Math.cos(angleRad);             var s = Math.sin(angleRad);             return this.mul($axure.utils.Matrix2D(c, -s, s, c));         },         translate: function(tx, ty) {             return this.mul($axure.utils.Matrix2D(1, 0, 0, 1, tx, ty));         }     };     $axure.utils.Matrix2D = function(m11, m12, m21, m22, tx, ty) {         return $.extend({             m11: m11 || 0,             m12: m12 || 0,             m21: m21 || 0,             m22: m22 || 0,             tx: tx || 0,             ty: ty || 0         }, matrixBase);     };     $axure.utils.Vector2D = function(x, y) {         return { x: x || 0, y: y || 0 };     };     $axure.utils.Matrix2D.identity = function() {         return $axure.utils.Matrix2D(1, 0, 0, 1, 0, 0);     };     $axure.utils.fixPng = function(png) {         if(!(/MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32")) return;         var src = png.src;         if(!png.style.width) { png.style.width = $(png).width(); }         if(!png.style.height) { png.style.height = $(png).height(); }         png.onload = function() { };         png.src = $axure.utils.getTransparentGifPath();         png.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')";     }; })(); // TODO: [mas] simplify this if(window.$axure && window.$axure.internal) {     $axure.internal(function($ax) { $ax.utils = $axure.utils; }); } // Its too much of a pain to escape everything and use regular expresions, just replace manually (function () {     var original = String.prototype.replace;     // TODO: maybe use flags or object instead to pass options in     String.prototype.replace = function (search, newVal, replaceFirst, ignoreCase) {         // Use original is some cases         if (search instanceof RegExp) return original.apply(this, arguments);         search = String(search);         var searchCompare = ignoreCase ? this.toLowerCase() : this;         if (ignoreCase) search = search.toLowerCase();         var searchLength = search.length;         var thisLength = this.length;         var index = 0;         var retVal = '';         while (index != -1) {             var nextIndex = searchCompare.indexOf(search, index);             if (nextIndex != -1) {                 retVal += this.substring(index, nextIndex) + newVal;                 index = nextIndex + searchLength;                 if (index >= thisLength) index = -1;             } else {                 retVal += this.substring(index);                 index = -1;             }             if (replaceFirst) break;         }         return retVal;     };     if (!Array.prototype.indexOf) {         Array.prototype.indexOf = function (elt /*, from*/) {             var len = this.length >>> 0;             var from = trunc(Number(arguments[1]) || 0);             if(from < 0) from += len;             for(; from < len; from++) {                 if(from in this && this[from] === elt) return from;             }             return -1;         };     }     var trunc = function(num) {         return num < 0 ? Math.ceil(num) : Math.floor(num);     }; })();//***** axplayer.js *****//if (!window.$axure) window.$axure = function () { };if (typeof console == 'undefined') console = {    log: function () { }};if(window._axUtils) $axure.utils = _axUtils;$axure.loadDocument = function(document) {    $axure.document = document;};function setUpController() {    //$axure.utils = _axUtils;    var _page = {};    $axure.page = _page;    $axure.utils.makeBindable(_page, ['load']);    var _player = function() {    };    $axure.player = _player;    //-----------------------------------------    //Global Var array, getLinkUrl function and setGlobalVar listener are    //for use in setting global vars in page url string when clicking a     //page in the sitemap    //-----------------------------------------    var _globalVars = {};    //-----------------------------------------    //Used by getLinkUrl below to check if local server is running     //in order to send back the global variables as a query string    //in the page url    //-----------------------------------------    var _shouldSendVarsToServer = function () {        //If exception occurs (due to page in content frame being from a different domain, etc)        //then run the check without the url (which will end up checking against sitemap url)        try {            var mainFrame = document.getElementById("mainFrame");            return $axure.shouldSendVarsToServer(mainFrame.contentWindow.location.href);        } catch (e) {            return $axure.shouldSendVarsToServer();        }    };    var _getLinkUrl = function (baseUrl) {        var toAdd = '';        for(var globalVarName in _globalVars) {            var val = _globalVars[globalVarName];            if(val != null) {                if(toAdd.length > 0) toAdd += '&';                toAdd += globalVarName + '=' + encodeURIComponent(val);            }        }        return toAdd.length > 0 ? baseUrl + (_shouldSendVarsToServer() ? '?' : '#') + toAdd + "&CSUM=1" : baseUrl;    };    $axure.getLinkUrlWithVars = _getLinkUrl;    $axure.messageCenter.addMessageListener(function(message, data) {        if (message == 'setGlobalVar'){            _globalVars[data.globalVarName] = data.globalVarValue;        }    });    $axure.messageCenter.addStateListener('page.data', function (key, value) {        for (var subKey in value) {            _page[subKey] = value[subKey];        }        $axure.page.triggerEvent('load');    });    // ---------------------------------------------    // Navigates the main frame (setting the currently visible page). If the link is relative,    // this method should test if it is actually a axure rp page being loaded and properly set    // up all the controller for the page if it is    // ---------------------------------------------    _page.navigate = function (url, includeVariables) {        var mainFrame = document.getElementById("mainFrame");        //var mainFrame = window.parent.mainFrame;        // if this is a relative url...        var urlToLoad;        if (url.indexOf(':') < 0 || url[0] == '/') {            var winHref = window.location.href;            var page = winHref.substring(0, winHref.lastIndexOf('/') + 1) + url;            urlToLoad = page;        } else {            urlToLoad = url;        }        if (!includeVariables) {            mainFrame.contentWindow.location.href = urlToLoad;            return;        }        var urlWithVars = $axure.getLinkUrlWithVars(urlToLoad);        var currentData = $axure.messageCenter.getState('page.data');        var currentUrl = currentData && currentData.location;        if(currentUrl && currentUrl.indexOf('#') != -1) currentUrl = currentUrl.substring(0, currentUrl.indexOf('#'))        // this is so we can make sure the current frame reloads if the variables have changed        // by default, if the location is the same but the hash code is different, the browser will not        // trigger a reload        mainFrame.contentWindow.location.href =            currentUrl && urlToLoad.toLowerCase() != currentUrl.toLowerCase()                ? urlWithVars                : 'resources/reload.html#' + encodeURI(urlWithVars);    };    var pluginIds = [];    var plugins = {};    var currentVisibleHostId = null;    // ---------------------------------------------    // Adds a tool box frame from a url to the interface. This is useful for loading plugins    // settings is an object that supports the following properties:    //    - id : the id of the element for the plugin    //    - context : the context to create the plugin host for    //    - title : the user-visible caption for the plugin    // ---------------------------------------------    _player.createPluginHost = function (settings) {        // right now we only understand an interface context        if (!(!settings.context || settings.context === 'interface')) {            throw ('unknown context type');        }        if (!settings.id) throw ('each plugin host needs an id');        var host = $('<div id=' + settings.id + '></div>')            .appendTo('#interfaceControlFrameHostContainer');        host.hide();        var headerLink = $('<a pluginId="' + settings.id + '" >' + settings.title.toUpperCase() + '</a>');        headerLink            .click($axure.utils.curry(interfaceControlHeaderButton_click, settings.id)).wrap('<li id="' + settings.id + 'Btn">');        if((settings.id == 'feedbackHost' || settings.id == 'feedbackContainer') && pluginIds[pluginIds.length - 1] == 'debugHost') headerLink.parent().insertBefore('#debugHostBtn');        else headerLink.parent().appendTo('#interfaceControlFrameHeader');                pluginIds[pluginIds.length] = settings.id;        plugins[settings.id] = settings;        $(document).trigger('pluginCreated', [settings.gid]);    };    // private methods    var interfaceControlHeaderButton_click = function (id) {        var clickedPlugin = $('#interfaceControlFrameHeader a[pluginId=' + id + ']');        if(clickedPlugin.hasClass('selected')) {            clickedPlugin.removeClass('selected');            $('#' + id).hide();            _player.collapseToBar();            $(document).trigger('pluginShown',['']);        } else {            $('#interfaceControlFrameHeader a').removeClass('selected');            clickedPlugin.addClass('selected');            $('#' + currentVisibleHostId).hide();            $('#' + id).show();            currentVisibleHostId = id;            _player.expandFromBar();            $(document).trigger('pluginShown', [plugins[id].gid]);        }        $(document).trigger('ContainerHeightChange');    };    $axure.player.showPlugin = function(gid) {        for(var id in plugins) {            if(plugins[id].gid == gid) {                $('a[pluginId="' + id + '"]').click();                break;            }        }    };}function setUpDocumentStateManager() {    var mgr = $axure.prototype.documentStateManager = {};    $axure.utils.makeBindable(mgr, ['globalVariableChanged']);    mgr.globalVariableValues = {};    mgr.setGlobalVariable = function(varname, value, source) {        var arg = {};        arg.variableName = varname;        arg.newValue = value;        arg.oldValue = this.getGlobalVariable(varname);        arg.source = source;        mgr.globalVariableValues[varname] = value;        this.triggerEvent('globalVariableChanged', arg);    };    mgr.getGlobalVariable = function(varname) {        return mgr.globalVariableValues[varname];    };}function setUpPageStateManager() {    var mgr = $axure.prototype.pageStateManager = {};    mgr.panelToStateIds = {};}//***** messagecenter.js *****//if (typeof console == 'undefined') console = {    log: function () { }};// sniff chromevar CHROME_5_LOCAL = false;var CHROME = false;var SAFARI = false;var FIREFOX = false;var WEBKIT = false;var OS_MAC = false;var IOS = false;var ANDROID = false;var MOBILE_DEVICE = false;var IE = false;var IE_10_AND_BELOW = false;  //ie 10 and lowervar IE_11_AND_ABOVE = false; //ie 11 and abovevar BROWSER_VERSION = 5000;(function () {    if(!window.$axure) window.$axure = function() {};    var useragent = window.navigator.userAgent;    var edgeRegex = /Edge\/([0-9]+)/g;    var edgeMatch = edgeRegex.exec(useragent);    $axure.browser = { isEdge: Boolean(edgeMatch) };    if(!$axure.browser.isEdge) {        var chromeRegex = /Chrome\/([0-9]+).([0-9]+)/g;        var chromeMatch = chromeRegex.exec(useragent);        CHROME = Boolean(chromeMatch);        CHROME_5_LOCAL = chromeMatch &&            Number(chromeMatch[1]) >= 5 &&            location.href.indexOf('file://') >= 0;    }    var safariRegex = /Safari\/([0-9]+)/g;    var safariMatch = safariRegex.exec(useragent);    SAFARI = Boolean(safariMatch) && !CHROME; //because chrome also inserts safari string into user agent    var webkitRegex = /WebKit\//g ;    WEBKIT = Boolean(webkitRegex.exec(useragent));    FIREFOX = useragent.toLowerCase().indexOf('firefox') > -1;    var macRegex = /Mac/g ;    OS_MAC = Boolean(macRegex.exec(window.navigator.platform));    IOS = useragent.match(/iPhone/i) || useragent.match(/iPad/i) || useragent.match(/iPod/i);    ANDROID = useragent.match(/Android/i);    MOBILE_DEVICE = ANDROID || IOS        || navigator.userAgent.match(/webOS/i)        || navigator.userAgent.match(/BlackBerry/i)        || navigator.userAgent.match(/Tablet PC/i)        || navigator.userAgent.match(/Windows Phone/i);        if($.browser) {        if($.browser.msie) IE_10_AND_BELOW = true;        else IE_11_AND_ABOVE = useragent.toLowerCase().indexOf('trident') > -1;        BROWSER_VERSION = $.browser.version;    }    IE = IE_10_AND_BELOW || IE_11_AND_ABOVE;    //Used by sitemap and variables.js getLinkUrl functions so that they know    //whether to embed global variables in URL as query string or hash string    //_shouldSendVars persists the value for sitemap instead of re-checking every time    var _shouldSendVars;    var _shouldSendVarsToServer = function(url) {        if(typeof _shouldSendVars != 'undefined') {            return _shouldSendVars;        }        if(SAFARI || (IE_10_AND_BELOW && BROWSER_VERSION < 10)) {            var urlToCheck = typeof url != 'undefined' ? url : window.location.href;            var serverRegex = /http:\/\/127\.0\.0\.1:[0-9]{5}/g;            var serverMatch = serverRegex.exec(urlToCheck);            var previewRegex = /[0-9]{2}\.[0-9]{2}\.[0-9]{2}/g;            var previewMatch = previewRegex.exec(urlToCheck);            if(Boolean(serverMatch) && Boolean(previewMatch)) {                _shouldSendVars = true;                return _shouldSendVars;            }        }        _shouldSendVars = false;        return _shouldSendVars;    };    $axure.shouldSendVarsToServer = _shouldSendVarsToServer;})();(function() {    var _topMessageCenter;    var _messageCenter = {};    var _listeners = [];    var _stateListeners = [];    var _state = {};    var _eventObject = null;    var _queuedMessages = [];    var _initialized = false;    // this is for the non Chrome 5 local scenarios. The "top" message center will dispatch to all the bottom ones    var _childrenMessageCenters = [];    // create $axure if it hasn't been created    if (!window.$axure) window.$axure = function() {};    $axure.messageCenter = _messageCenter;    // isolate scope, and initialize _topMessageCenter.    (function() {        if (!CHROME_5_LOCAL) {            var topAxureWindow = window;            try {                while(topAxureWindow.parent && topAxureWindow.parent !== topAxureWindow                    && topAxureWindow.parent.$axure) topAxureWindow = topAxureWindow.parent;            } catch(e) {}            _topMessageCenter = topAxureWindow.$axure.messageCenter;        }    })();    $(window.document).ready(function() {        if (CHROME_5_LOCAL) {            $('body').append("<div id='axureEventReceiverDiv' style='display:none'></div>" +                "<div id='axureEventSenderDiv' style='display:none'></div>");		    _eventObject = window.document.createEvent('Event');		    _eventObject.initEvent('axureMessageSenderEvent', true, true);                                    $('#axureEventReceiverDiv').bind('axureMessageReceiverEvent', function () {                var request = JSON.parse($(this).text());                _handleRequest(request);            });        } else {            if (_topMessageCenter != _messageCenter) {                _topMessageCenter.addChildMessageCenter(_messageCenter);                console.log('adding from ' + window.location.toString());            }        }    });    var _handleRequest = function (request) {        // route the request to all the listeners        for(var i = 0; i < _listeners.length; i++) _listeners[i](request.message, request.data);        // now handle the queued messages if we're initializing        if (request.message == 'initialize') {            _initialized = true;            // send all the queued messages and return            for (var i = 0; i < _queuedMessages.length; i++) {                var qRequest = _queuedMessages[i];                _messageCenter.postMessage(qRequest.message, qRequest.data);            }            _queuedMessages = [];        }                        // and then handle the set state messages, if necessary        if (request.message == 'setState') {            _state[request.data.key] = request.data.value;            for (var i = 0; i < _stateListeners.length; i++) {                var keyListener = _stateListeners[i];                // if thep passed a null or empty value, always post the message                if (!keyListener.key || keyListener.key == request.data.key) {                    keyListener.listener(request.data.key, request.data.value);                }            }        }    };    // -----------------------------------------------------------------------------------------    // This method allows for dispatching messages in the non-chromelocal scenario.    // Each child calls this on _topMessageCenter    // -----------------------------------------------------------------------------------------    _messageCenter.addChildMessageCenter = function(messageCenter) {        _childrenMessageCenters[_childrenMessageCenters.length] = messageCenter;    };    // -----------------------------------------------------------------------------------------    // This method allows for dispatching messages in the non-chromelocal scenario.    // Each child calls this on _topMessageCenter    // -----------------------------------------------------------------------------------------    _messageCenter.dispatchMessage = function(message, data) {        _handleRequest({            message: message,            data: data        });    };    // -----------------------------------------------------------------------------------------    // -----------------------------------------------------------------------------------------    _messageCenter.dispatchMessageRecursively = function(message, data) {        console.log("dispatched to " + window.location.toString());        // dispatch to the top center first        _messageCenter.dispatchMessage(message, data);        $('iframe').each(function(index, frame) {            //try,catch to handle permissions error in FF when loading pages from another domain            try {                if (frame.contentWindow.$axure && frame.contentWindow.$axure.messageCenter) {                    frame.contentWindow.$axure.messageCenter.dispatchMessageRecursively(message, data);                }            }catch(e) {}        });    };    var _combineEventMessages = false;    var _compositeEventMessageData = [];    _messageCenter.startCombineEventMessages = function() {        _combineEventMessages = true;    }    _messageCenter.endCombineEventMessages = function () {        _messageCenter.sendCompositeEventMessage();        _combineEventMessages = false;    }    _messageCenter.sendCompositeEventMessage = function () {        _messageCenter.postMessage('axCompositeEventMessage', _compositeEventMessageData);        _compositeEventMessageData = [];    }    _messageCenter.postMessage = function (message, data) {        if(_combineEventMessages) {            if(message == 'axEvent' || message == 'axCase' || message == 'axAction' || message == 'axEventComplete') {                _compositeEventMessageData.push({ 'message': message, 'data': data });                if(_compositeEventMessageData.length >= 10) _messageCenter.sendCompositeEventMessage();                return;            }        }        if(!CHROME_5_LOCAL) {            _topMessageCenter.dispatchMessageRecursively(message, data);        } else {            var request = {                message: message,                data: data            };            if(_initialized) {                var senderDiv = window.document.getElementById('axureEventSenderDiv');                var messageText = JSON.stringify(request);                //                console.log('sending event: ' + messageText);                senderDiv.innerText = messageText;                senderDiv.dispatchEvent(_eventObject);                //                console.log('event sent');            } else {                _queuedMessages[_queuedMessages.length] = request;            }        }    };    _messageCenter.setState = function(key, value) {        var data = {            key: key,            value: value        };        _messageCenter.postMessage('setState', data);    };    _messageCenter.getState = function(key) {        return _state[key];    };    _messageCenter.addMessageListener = function(listener) {        _listeners[_listeners.length] = listener;    };    _messageCenter.addStateListener = function(key, listener) {        _stateListeners[_stateListeners.length] = {            key: key,            listener: listener        };    };})();
 |