axutils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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.reloadCSS = function (url, id) {
  66. $('#' + id).remove();
  67. $('head').append('<link id="' + id + '" text="text/css" href="' + url + '" rel="Stylesheet" />');
  68. }
  69. $axure.utils.loadCSS = function(url) {
  70. $('head').append('<link text="text/css" href="' + url + '" rel="Stylesheet" />');
  71. };
  72. $axure.utils.loadJS = function(url) {
  73. $('head').append('<script text="text/javascript" language="JavaScript" src="' + url + '"></script>');
  74. };
  75. $axure.utils.curry = function(fn) {
  76. var curriedArgs = Array.prototype.slice.call(arguments, [1]);
  77. return function() {
  78. fn.apply(this, curriedArgs.concat(Array.prototype.slice.call(arguments)));
  79. };
  80. };
  81. $axure.utils.succeeded = function(result) {
  82. return result && result.success;
  83. };
  84. $axure.utils.createUniqueTag = function() {
  85. return Math.random().toString().substring(2) +
  86. Math.random().toString().substring(2) +
  87. Math.random().toString().substring(2) +
  88. Math.random().toString().substring(2);
  89. };
  90. $axure.utils.formatDate = function(date) {
  91. var months = [
  92. "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  93. "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
  94. var hours = date.getHours();
  95. var amPm = (hours > 11 ? 'PM' : 'AM');
  96. hours = hours % 12;
  97. if(hours == '0') hours = '12';
  98. var minutes = date.getMinutes() + '';
  99. if(minutes.length == 1) {
  100. minutes = '0' + minutes;
  101. }
  102. return [
  103. months[date.getMonth()], ' ', date.getDate(), ' ', date.getFullYear(), ' ',
  104. hours, ':', minutes, ' ', amPm].join('');
  105. };
  106. $axure.utils.quickObject = function() {
  107. var returnVal = {};
  108. for(var i = 0; i < arguments.length; i += 2) {
  109. returnVal[arguments[i]] = arguments[i + 1];
  110. }
  111. return returnVal;
  112. };
  113. $axure.utils.isInPlayer = function() { return window.name == 'mainFrame'; }
  114. // This will return true if prototype is opened from version of app after update with code that sets this value
  115. // (won't be able to distinguish between browser and outdated app)
  116. $axure.utils.isShareApp = function () { return /ShareApp/.test(navigator.userAgent); }
  117. $axure.utils.setHashStringVar = function (currentQuery, varName, varVal) {
  118. var varWithEqual = varName + '=';
  119. var poundVarWithEqual = varVal === '' ? '' : '?' + varName + '=' + varVal;
  120. var ampVarWithEqual = varVal === '' ? '' : '&' + varName + '=' + varVal;
  121. var queryToSet = '';
  122. var pageIndex = currentQuery.indexOf('?' + varWithEqual);
  123. if (pageIndex == -1) pageIndex = currentQuery.indexOf('&' + varWithEqual);
  124. if (pageIndex != -1) {
  125. var newQuery = currentQuery.substring(0, pageIndex);
  126. newQuery = newQuery == '' ? poundVarWithEqual : newQuery + ampVarWithEqual;
  127. var ampIndex = currentQuery.indexOf('&', pageIndex + 1);
  128. if (ampIndex != -1) {
  129. newQuery = newQuery == '' ? '?' + currentQuery.substring(ampIndex + 1) : newQuery + currentQuery.substring(ampIndex);
  130. }
  131. queryToSet = newQuery;
  132. } else if (currentQuery.indexOf('?') != -1) {
  133. queryToSet = currentQuery + ampVarWithEqual;
  134. } else {
  135. queryToSet = poundVarWithEqual;
  136. }
  137. if (queryToSet != '' || varVal == '') {
  138. return queryToSet;
  139. }
  140. return null;
  141. }
  142. $axure.utils.parseGlobalVars = function(query, setAction) {
  143. let vars = query.split("&");
  144. let csum = false;
  145. for(let i = 0; i < vars.length; i++) {
  146. let pair = vars[i].split("=");
  147. let varName = pair[0];
  148. let varValue = pair[1];
  149. if(varName) {
  150. if(varName == GLOBAL_VAR_CHECKSUM) csum = true;
  151. else setAction(varName, decodeURIComponent(decodeURIComponent(varValue)), false);
  152. }
  153. }
  154. if(!csum && query.length > 250) {
  155. 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.');
  156. }
  157. }
  158. var matrixBase = {
  159. mul: function(val) {
  160. if(val.x !== undefined) {
  161. return $axure.utils.Vector2D(
  162. this.m11 * val.x + this.m12 * val.y + this.tx,
  163. this.m21 * val.x + this.m22 * val.y + this.ty);
  164. } else if(val.m11) {
  165. return $axure.utils.Matrix2D(
  166. this.m11 * val.m11 + this.m12 * val.m21,
  167. this.m11 * val.m12 + this.m12 * val.m22,
  168. this.m21 * val.m11 + this.m22 * val.m21,
  169. this.m21 * val.m12 + this.m22 * val.m22,
  170. val.tx + this.tx * val.m11 + this.ty * val.m21,
  171. val.ty + this.tx * val.m12 + this.ty * val.m22
  172. );
  173. } else if(Number(val)) {
  174. var num = Number(val);
  175. return $axure.utils.Matrix2D(this.m11 * num, this.m12 * num,
  176. this.m21 * num, this.m22 * num,
  177. this.tx * num, this.ty * num);
  178. } else return undefined;
  179. },
  180. rotate: function(angle) {
  181. var angleRad = angle * Math.PI / 180;
  182. var c = Math.cos(angleRad);
  183. var s = Math.sin(angleRad);
  184. return this.mul($axure.utils.Matrix2D(c, -s, s, c));
  185. },
  186. translate: function(tx, ty) {
  187. return this.mul($axure.utils.Matrix2D(1, 0, 0, 1, tx, ty));
  188. }
  189. };
  190. $axure.utils.Matrix2D = function(m11, m12, m21, m22, tx, ty) {
  191. return $.extend({
  192. m11: m11 || 0,
  193. m12: m12 || 0,
  194. m21: m21 || 0,
  195. m22: m22 || 0,
  196. tx: tx || 0,
  197. ty: ty || 0
  198. }, matrixBase);
  199. };
  200. $axure.utils.Vector2D = function(x, y) {
  201. return { x: x || 0, y: y || 0 };
  202. };
  203. $axure.utils.Matrix2D.identity = function() {
  204. return $axure.utils.Matrix2D(1, 0, 0, 1, 0, 0);
  205. };
  206. var getParameter = function (qstring, query) {
  207. var prms = qstring[1].split("&");
  208. var frmelements = new Array();
  209. var currprmeter, querystr = "";
  210. for (var i = 0; i < prms.length; i++) {
  211. currprmeter = prms[i].split("=");
  212. frmelements[i] = new Array();
  213. frmelements[i][0] = currprmeter[0];
  214. frmelements[i][1] = currprmeter[1];
  215. }
  216. for (j = 0; j < frmelements.length; j++) {
  217. if (frmelements[j][0].toLowerCase() == query.toLowerCase()) {
  218. querystr = frmelements[j][1];
  219. break;
  220. }
  221. }
  222. return querystr;
  223. }
  224. $axure.utils.getQueryString = function (query, url) {
  225. if (!url) url = window.location.href;
  226. var qstring = url.split("?");
  227. if (qstring.length < 2) return "";
  228. return getParameter(qstring, query);
  229. };
  230. })();
  231. // TODO: [mas] simplify this
  232. if(window.$axure && window.$axure.internal) {
  233. $axure.internal(function($ax) { $ax.utils = $axure.utils; });
  234. }
  235. // Its too much of a pain to escape everything and use regular expresions, just replace manually
  236. (function () {
  237. var original = String.prototype.replace;
  238. // TODO: maybe use flags or object instead to pass options in
  239. String.prototype.replace = function (search, newVal, replaceFirst, ignoreCase) {
  240. // Use original is some cases
  241. if (search instanceof RegExp) return original.apply(this, arguments);
  242. search = String(search);
  243. var searchCompare = ignoreCase ? this.toLowerCase() : this;
  244. if (ignoreCase) search = search.toLowerCase();
  245. var searchLength = search.length;
  246. var thisLength = this.length;
  247. var index = 0;
  248. var retVal = '';
  249. while (index != -1) {
  250. var nextIndex = searchCompare.indexOf(search, index);
  251. if (nextIndex != -1) {
  252. retVal += this.substring(index, nextIndex) + newVal;
  253. index = nextIndex + searchLength;
  254. if (index >= thisLength) index = -1;
  255. } else {
  256. retVal += this.substring(index);
  257. index = -1;
  258. }
  259. if (replaceFirst) break;
  260. }
  261. return retVal;
  262. };
  263. if (!Array.prototype.indexOf) {
  264. Array.prototype.indexOf = function (elt /*, from*/) {
  265. var len = this.length >>> 0;
  266. var from = trunc(Number(arguments[1]) || 0);
  267. if(from < 0) from += len;
  268. for(; from < len; from++) {
  269. if(from in this && this[from] === elt) return from;
  270. }
  271. return -1;
  272. };
  273. }
  274. var trunc = function(num) {
  275. return num < 0 ? Math.ceil(num) : Math.floor(num);
  276. };
  277. })();