You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

293 lines
10 KiB

3 years ago
  1. /*
  2. *
  3. *
  4. *
  5. *
  6. */
  7. const START_URL_NAME = 'start.html';
  8. const PAGE_ID_NAME = 'id';
  9. const PAGE_URL_NAME = 'p';
  10. const SITEMAP_COLLAPSE_VAR_NAME = 'c';
  11. const SITEMAP_COLLAPSE_VALUE = "1";
  12. const SITEMAP_CLOSE_VALUE = "2";
  13. const GLOBAL_VAR_NAME = '&ZQZ=s&';
  14. const GLOBAL_VAR_CHECKSUM = 'CSUM';
  15. (function() {
  16. // define the root namespace object
  17. if(!window.$axure) window.$axure = {};
  18. $axure.utils = {};
  19. // ------------------------------------------------------------------------
  20. // Makes an object bindable
  21. // ------------------------------------------------------------------------
  22. $axure.utils.makeBindable = function(obj, events) {
  23. if(obj.registeredBindings != null) return;
  24. // copy the events
  25. obj.bindableEvents = events.slice();
  26. obj.registeredBindings = {};
  27. obj.bind = function(eventName, fn) {
  28. var binding = {};
  29. binding.eventName = eventName;
  30. binding.action = fn;
  31. var bindingList = this.registeredBindings[eventName];
  32. if(bindingList == null) {
  33. bindingList = [];
  34. this.registeredBindings[eventName] = bindingList;
  35. }
  36. bindingList[bindingList.length] = binding;
  37. };
  38. obj.unbind = function(eventName) {
  39. if(eventName.indexOf('.') >= 0) {
  40. this.registeredBindings[eventName] = null;
  41. } else {
  42. var event = eventName.split('.')[0];
  43. for(var bindingKey in this.registeredBindings) {
  44. if(bindingKey.split('.')[0] == event) {
  45. this.registeredBindings[bindingKey] = null;
  46. }
  47. }
  48. }
  49. };
  50. obj.triggerEvent = function(eventName, arg) {
  51. for(var bindingKey in this.registeredBindings) {
  52. if(bindingKey.split('.')[0] == eventName) {
  53. var bindings = this.registeredBindings[bindingKey];
  54. for(var i = 0; i < bindings.length; i++) {
  55. if(arg == null) {
  56. bindings[i].action();
  57. } else {
  58. bindings[i].action(arg);
  59. }
  60. }
  61. }
  62. }
  63. };
  64. };
  65. $axure.utils.loadCSS = function(url) {
  66. $('head').append('<link text="text/css" href="' + url + '" rel="Stylesheet" />');
  67. };
  68. $axure.utils.loadJS = function(url) {
  69. $('head').append('<script text="text/javascript" language="JavaScript" src="' + url + '"></script>');
  70. };
  71. $axure.utils.curry = function(fn) {
  72. var curriedArgs = Array.prototype.slice.call(arguments, [1]);
  73. return function() {
  74. fn.apply(this, curriedArgs.concat(Array.prototype.slice.call(arguments)));
  75. };
  76. };
  77. $axure.utils.succeeded = function(result) {
  78. return result && result.success;
  79. };
  80. $axure.utils.createUniqueTag = function() {
  81. return Math.random().toString().substring(2) +
  82. Math.random().toString().substring(2) +
  83. Math.random().toString().substring(2) +
  84. Math.random().toString().substring(2);
  85. };
  86. $axure.utils.formatDate = function(date) {
  87. var months = [
  88. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  89. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  90. var hours = date.getHours();
  91. var amPm = (hours > 11 ? 'PM' : 'AM');
  92. hours = hours % 12;
  93. if(hours == '0') hours = '12';
  94. var minutes = date.getMinutes() + '';
  95. if(minutes.length == 1) {
  96. minutes = '0' + minutes;
  97. }
  98. return [
  99. months[date.getMonth()], ' ', date.getDate(), ' ', date.getFullYear(), ' ',
  100. hours, ':', minutes, ' ', amPm].join('');
  101. };
  102. $axure.utils.quickObject = function() {
  103. var returnVal = {};
  104. for(var i = 0; i < arguments.length; i += 2) {
  105. returnVal[arguments[i]] = arguments[i + 1];
  106. }
  107. return returnVal;
  108. };
  109. $axure.utils.isInPlayer = function() { return window.name == 'mainFrame'; }
  110. // This will return true if prototype is opened from version of app after update with code that sets this value
  111. // (won't be able to distinguish between browser and outdated app)
  112. $axure.utils.isShareApp = function () { return /ShareApp/.test(navigator.userAgent); }
  113. $axure.utils.setHashStringVar = function(currentHash, varName, varVal) {
  114. var varWithEqual = varName + '=';
  115. var poundVarWithEqual = varVal === '' ? '' : '#' + varName + '=' + varVal;
  116. var ampVarWithEqual = varVal === '' ? '' : '&' + varName + '=' + varVal;
  117. var hashToSet = '';
  118. var pageIndex = currentHash.indexOf('#' + varWithEqual);
  119. if (pageIndex == -1) pageIndex = currentHash.indexOf('&' + varWithEqual);
  120. if (pageIndex != -1) {
  121. var newHash = currentHash.substring(0, pageIndex);
  122. newHash = newHash == '' ? poundVarWithEqual : newHash + ampVarWithEqual;
  123. var ampIndex = currentHash.indexOf('&', pageIndex + 1);
  124. if (ampIndex != -1) {
  125. newHash = newHash == '' ? '#' + currentHash.substring(ampIndex + 1) : newHash + currentHash.substring(ampIndex);
  126. }
  127. hashToSet = newHash;
  128. } else if (currentHash.indexOf('#') != -1) {
  129. hashToSet = currentHash + ampVarWithEqual;
  130. } else {
  131. hashToSet = poundVarWithEqual;
  132. }
  133. if (hashToSet != '' || varVal == '') {
  134. return hashToSet;
  135. }
  136. return null;
  137. }
  138. $axure.utils.parseGlobalVars = function(query, setAction) {
  139. let vars = query.split("&");
  140. let csum = false;
  141. for(let i = 0; i < vars.length; i++) {
  142. let pair = vars[i].split("=");
  143. let varName = pair[0];
  144. let varValue = pair[1];
  145. if(varName) {
  146. if(varName == GLOBAL_VAR_CHECKSUM) csum = true;
  147. else setAction(varName, decodeURIComponent(varValue), true);
  148. }
  149. }
  150. if(!csum && query.length > 250) {
  151. window.alert('Axure Warning: The variable values were too long to pass to this page.\n\nIf you are using IE, using Chrome or Firefox will support more data.');
  152. }
  153. }
  154. var matrixBase = {
  155. mul: function(val) {
  156. if(val.x !== undefined) {
  157. return $axure.utils.Vector2D(
  158. this.m11 * val.x + this.m12 * val.y + this.tx,
  159. this.m21 * val.x + this.m22 * val.y + this.ty);
  160. } else if(val.m11) {
  161. return $axure.utils.Matrix2D(
  162. this.m11 * val.m11 + this.m12 * val.m21,
  163. this.m11 * val.m12 + this.m12 * val.m22,
  164. this.m21 * val.m11 + this.m22 * val.m21,
  165. this.m21 * val.m12 + this.m22 * val.m22,
  166. val.tx + this.tx * val.m11 + this.ty * val.m21,
  167. val.ty + this.tx * val.m12 + this.ty * val.m22
  168. );
  169. } else if(Number(val)) {
  170. var num = Number(val);
  171. return $axure.utils.Matrix2D(this.m11 * num, this.m12 * num,
  172. this.m21 * num, this.m22 * num,
  173. this.tx * num, this.ty * num);
  174. } else return undefined;
  175. },
  176. rotate: function(angle) {
  177. var angleRad = angle * Math.PI / 180;
  178. var c = Math.cos(angleRad);
  179. var s = Math.sin(angleRad);
  180. return this.mul($axure.utils.Matrix2D(c, -s, s, c));
  181. },
  182. translate: function(tx, ty) {
  183. return this.mul($axure.utils.Matrix2D(1, 0, 0, 1, tx, ty));
  184. }
  185. };
  186. $axure.utils.Matrix2D = function(m11, m12, m21, m22, tx, ty) {
  187. return $.extend({
  188. m11: m11 || 0,
  189. m12: m12 || 0,
  190. m21: m21 || 0,
  191. m22: m22 || 0,
  192. tx: tx || 0,
  193. ty: ty || 0
  194. }, matrixBase);
  195. };
  196. $axure.utils.Vector2D = function(x, y) {
  197. return { x: x || 0, y: y || 0 };
  198. };
  199. $axure.utils.Matrix2D.identity = function() {
  200. return $axure.utils.Matrix2D(1, 0, 0, 1, 0, 0);
  201. };
  202. })();
  203. // TODO: [mas] simplify this
  204. if(window.$axure && window.$axure.internal) {
  205. $axure.internal(function($ax) { $ax.utils = $axure.utils; });
  206. }
  207. // Its too much of a pain to escape everything and use regular expresions, just replace manually
  208. (function () {
  209. var original = String.prototype.replace;
  210. // TODO: maybe use flags or object instead to pass options in
  211. String.prototype.replace = function (search, newVal, replaceFirst, ignoreCase) {
  212. // Use original is some cases
  213. if (search instanceof RegExp) return original.apply(this, arguments);
  214. search = String(search);
  215. var searchCompare = ignoreCase ? this.toLowerCase() : this;
  216. if (ignoreCase) search = search.toLowerCase();
  217. var searchLength = search.length;
  218. var thisLength = this.length;
  219. var index = 0;
  220. var retVal = '';
  221. while (index != -1) {
  222. var nextIndex = searchCompare.indexOf(search, index);
  223. if (nextIndex != -1) {
  224. retVal += this.substring(index, nextIndex) + newVal;
  225. index = nextIndex + searchLength;
  226. if (index >= thisLength) index = -1;
  227. } else {
  228. retVal += this.substring(index);
  229. index = -1;
  230. }
  231. if (replaceFirst) break;
  232. }
  233. return retVal;
  234. };
  235. if (!Array.prototype.indexOf) {
  236. Array.prototype.indexOf = function (elt /*, from*/) {
  237. var len = this.length >>> 0;
  238. var from = trunc(Number(arguments[1]) || 0);
  239. if(from < 0) from += len;
  240. for(; from < len; from++) {
  241. if(from in this && this[from] === elt) return from;
  242. }
  243. return -1;
  244. };
  245. }
  246. var trunc = function(num) {
  247. return num < 0 ? Math.ceil(num) : Math.floor(num);
  248. };
  249. })();