1/* 2 * 3 * 4 * 5 * 6 */ 7 8 (function() { 9 // define the root namespace object 10 if(!window.$axure) window.$axure = {}; 11 12 $axure.utils = {}; 13 14 // ------------------------------------------------------------------------ 15 // Makes an object bindable 16 // ------------------------------------------------------------------------ 17 $axure.utils.makeBindable = function(obj, events) { 18 if(obj.registeredBindings != null) return; 19 20 // copy the events 21 obj.bindableEvents = events.slice(); 22 obj.registeredBindings = {}; 23 24 obj.bind = function(eventName, fn) { 25 var binding = {}; 26 binding.eventName = eventName; 27 binding.action = fn; 28 29 var bindingList = this.registeredBindings[eventName]; 30 if(bindingList == null) { 31 bindingList = []; 32 this.registeredBindings[eventName] = bindingList; 33 } 34 bindingList[bindingList.length] = binding; 35 }; 36 37 obj.unbind = function(eventName) { 38 if(eventName.indexOf('.') >= 0) { 39 this.registeredBindings[eventName] = null; 40 } else { 41 var event = eventName.split('.')[0]; 42 for(var bindingKey in this.registeredBindings) { 43 if(bindingKey.split('.')[0] == event) { 44 this.registeredBindings[bindingKey] = null; 45 } 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 66 67 $axure.utils.loadCSS = function(url) { 68 $('head').append('<link text="text/css" href="' + url + '" rel="Stylesheet" />'); 69 }; 70 71 $axure.utils.loadJS = function(url) { 72 $('head').append('<script text="text/javascript" language="JavaScript" src="' + url + '"></script>'); 73 }; 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 82 $axure.utils.succeeded = function(result) { 83 return result && result.success; 84 }; 85 86 $axure.utils.createUniqueTag = function() { 87 return Math.random().toString().substring(2) + 88 Math.random().toString().substring(2) + 89 Math.random().toString().substring(2) + 90 Math.random().toString().substring(2); 91 }; 92 93 $axure.utils.formatDate = function(date) { 94 var months = [ 95 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 96 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; 97 var hours = date.getHours(); 98 var amPm = (hours > 11 ? 'PM' : 'AM'); 99 hours = hours % 12; 100 if(hours == '0') hours = '12'; 101 var minutes = date.getMinutes() + ''; 102 if(minutes.length == 1) { 103 minutes = '0' + minutes; 104 } 105 return [ 106 months[date.getMonth()], ' ', date.getDate(), ' ', date.getFullYear(), ' ', 107 hours, ':', minutes, ' ', amPm].join(''); 108 109 }; 110 111 $axure.utils.quickObject = function() { 112 var returnVal = {}; 113 for(var i = 0; i < arguments.length; i += 2) { 114 returnVal[arguments[i]] = arguments[i + 1]; 115 } 116 return returnVal; 117 }; 118 119 var matrixBase = { 120 mul: function(val) { 121 if(val.x !== undefined) { 122 return $axure.utils.Vector2D( 123 this.m11 * val.x + this.m12 * val.y + this.tx, 124 this.m21 * val.x + this.m22 * val.y + this.ty); 125 } else if(val.m11) { 126 return $axure.utils.Matrix2D( 127 this.m11 * val.m11 + this.m12 * val.m21, 128 this.m11 * val.m12 + this.m12 * val.m22, 129 this.m21 * val.m11 + this.m22 * val.m21, 130 this.m21 * val.m12 + this.m22 * val.m22, 131 val.tx + this.tx * val.m11 + this.ty * val.m21, 132 val.ty + this.tx * val.m12 + this.ty * val.m22 133 ); 134 } else if(Number(val)) { 135 var num = Number(val); 136 return $axure.utils.Matrix2D(this.m11 * num, this.m12 * num, 137 this.m21 * num, this.m22 * num, 138 this.tx * num, this.ty * num); 139 } else return undefined; 140 }, 141 rotate: function(angle) { 142 var angleRad = angle * Math.PI / 180; 143 var c = Math.cos(angleRad); 144 var s = Math.sin(angleRad); 145 146 return this.mul($axure.utils.Matrix2D(c, -s, s, c)); 147 }, 148 translate: function(tx, ty) { 149 return this.mul($axure.utils.Matrix2D(1, 0, 0, 1, tx, ty)); 150 } 151 }; 152 153 $axure.utils.Matrix2D = function(m11, m12, m21, m22, tx, ty) { 154 return $.extend({ 155 m11: m11 || 0, 156 m12: m12 || 0, 157 m21: m21 || 0, 158 m22: m22 || 0, 159 tx: tx || 0, 160 ty: ty || 0 161 }, matrixBase); 162 }; 163 164 $axure.utils.Vector2D = function(x, y) { 165 return { x: x || 0, y: y || 0 }; 166 }; 167 168 $axure.utils.Matrix2D.identity = function() { 169 return $axure.utils.Matrix2D(1, 0, 0, 1, 0, 0); 170 }; 171 172 $axure.utils.fixPng = function(png) { 173 if(!(/MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32")) return; 174 175 var src = png.src; 176 if(!png.style.width) { png.style.width = $(png).width(); } 177 if(!png.style.height) { png.style.height = $(png).height(); } 178 png.onload = function() { }; 179 png.src = $axure.utils.getTransparentGifPath(); 180 png.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')"; 181 }; 182 })(); 183 184 // TODO: [mas] simplify this 185 if(window.$axure && window.$axure.internal) { 186 $axure.internal(function($ax) { $ax.utils = $axure.utils; }); 187 } 188 189 // Its too much of a pain to escape everything and use regular expresions, just replace manually 190 (function () { 191 var original = String.prototype.replace; 192 // TODO: maybe use flags or object instead to pass options in 193 String.prototype.replace = function (search, newVal, replaceFirst, ignoreCase) { 194 // Use original is some cases 195 if (search instanceof RegExp) return original.apply(this, arguments); 196 197 search = String(search); 198 var searchCompare = ignoreCase ? this.toLowerCase() : this; 199 if (ignoreCase) search = search.toLowerCase(); 200 201 var searchLength = search.length; 202 var thisLength = this.length; 203 204 var index = 0; 205 var retVal = ''; 206 while (index != -1) { 207 var nextIndex = searchCompare.indexOf(search, index); 208 if (nextIndex != -1) { 209 retVal += this.substring(index, nextIndex) + newVal; 210 index = nextIndex + searchLength; 211 if (index >= thisLength) index = -1; 212 } else { 213 retVal += this.substring(index); 214 index = -1; 215 } 216 if (replaceFirst) break; 217 } 218 219 return retVal; 220 }; 221 222 if (!Array.prototype.indexOf) { 223 Array.prototype.indexOf = function (elt /*, from*/) { 224 var len = this.length >>> 0; 225 226 var from = trunc(Number(arguments[1]) || 0); 227 if(from < 0) from += len; 228 229 for(; from < len; from++) { 230 if(from in this && this[from] === elt) return from; 231 } 232 return -1; 233 }; 234 } 235 236 var trunc = function(num) { 237 return num < 0 ? Math.ceil(num) : Math.floor(num); 238 }; 239 240 241 })();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.