1if (!Array.isArray) { 2 Array.isArray = function (vArg) { 3 return Object.prototype.toString.call(vArg) === "[object Array]"; 4 }; 5} 6 7// http://stackoverflow.com/questions/7153470/why-wont-filter-work-in-interent-explorer-8 8if (!Array.prototype.filter) 9{ 10 Array.prototype.filter = function(fun /*, thisp */) 11 { 12 "use strict"; 13 14 if (this === void 0 || this === null) 15 throw new TypeError(); 16 17 var t = Object(this); 18 var len = t.length >>> 0; 19 if (typeof fun !== "function") 20 throw new TypeError(); 21 22 var res = []; 23 var thisp = arguments[1]; 24 for (var i = 0; i < len; i++) 25 { 26 if (i in t) 27 { 28 var val = t[i]; // in case fun mutates this 29 if (fun.call(thisp, val, i, t)) 30 res.push(val); 31 } 32 } 33 34 return res; 35 }; 36} 37 38// https://gist.github.com/eliperelman/1035932#file-index-js 39Date.now||(Date.now=function(){return+new Date()}); 40 41(function($, window) { 42 $.extend(window, { 43 setItem: function(key, value) { 44 value = JSON.stringify(value); 45 window.sessionStorage.setItem(key, value); 46 }, 47 48 getItem: function (key) { 49 var value; 50 value = window.sessionStorage.getItem(key); 51 try { 52 return JSON.parse(value); 53 } catch(e) { 54 return value; 55 } 56 }, 57 58 extendItem: function(key, value){ 59 return setItem(key, $.extend(true, getItem(key), value)); 60 }, 61 62 removeItem: function(key) { 63 return window.sessionStorage.removeItem(key); 64 }, 65 66 getParam: function(name, url) { 67 return decodeURI( 68 (RegExp(name + '=' + '(.+?)(&|$)').exec(url || location.search)||[,''])[1] 69 ); 70 }, 71 72 prettifyFS2Date: function(date, method, format){ 73 74 var removeTZ = date.replace(/[TZ]/g, ' '); 75 var _has_meridian = removeTZ.match(/PM|AM|P.M.|A.M./g); 76 var inputFormat = "DD/MM/YYYY HH:mm"; 77 format = format || "DD-MM-YYYY"; 78 79 80 if(method == "standardDate"){ 81 return _has_meridian ? moment(removeTZ, inputFormat).format(format || "MMM Do YYYY (h:mm A) ") : moment(removeTZ, "YYYY-MM-DD HH:mm").format(format || "MMM Do YYYY (h:mm A) "); 82 } else { 83 return _has_meridian ? moment(removeTZ, inputFormat).format(format || "YYYY-MM-DD HH:mm") : moment(removeTZ, "YYYY-MM-DD HH:mm").format(format || "YYYY-MM-DD HH:mm"); 84 } 85 }, 86 87 getIDfromFormURI: function(uri){ 88 var start = uri.search('//')+2; 89 var end = uri.search('/definition.json'); 90 return uri.slice(start, end); 91 }, 92 93 spinner: function(selector, override, options) { 94 var defaults = { 95 className: 'self-spinner', // The CSS class to assign to the spinner 96 inline: false 97 }; 98 var opts = $.extend({}, defaults, options); 99 var tag = opts.inline ? 'span' : 'div'; 100 var container = $('<' + tag + '/>', {'class': 'row ' + opts.className + '-outer'}); 101 if(selector) { 102 var target = $(selector); 103 if(target.length) { 104 if(override) target.html(container); 105 else target.append(container); 106 } 107 108 // Asynchronously render the spinner into the container 109 FS.Template('spinner', opts).into(container).then(function(container){ 110 var $spinner = container.find('.self-spinner'); 111 function spinnerAnimation() { 112 $({deg: 0}).animate({ deg: 360 }, { 113 duration: 400, 114 easing: 'linear', 115 step: function(now) { 116 $spinner.css({ 'transform': 'rotate(' + now + 'deg)' }); 117 }, 118 complete: function() { 119 _.defer(spinnerAnimation); 120 } 121 }); 122 }; 123 124 if ($('html, body').hasClass('ie9-oldie')) { 125 spinnerAnimation(); 126 } 127 }); 128 } 129 130 return container; 131 }, 132 smallspinner: function(selector, override, options) { 133 var defaults = { 134 className: 'small self-spinner', 135 inline: true 136 }; 137 var smallOptions = $.extend({}, defaults, options); 138 return window.spinner(selector, override, smallOptions); 139 }, 140 Alert:function(title, body, clss){ 141 title = title || 'Alert'; 142 clss = clss || ''; 143 body = body || ''; 144 145 $('.alert').remove(); 146 return FS.Template('alert', {alertClass: clss, alertTitle:title, alertBody:body}) 147 .then( 148 function(output) { 149 var alert = $(output); 150 $('body').prepend(alert); 151 setTimeout(function(){alert.remove();}, 5000); 152 }, 153 function(error) { 154 console.warn('Unable to render alert window', settings, error); 155 } 156 ); 157 }, 158 159 iframeModalBackdrop: function(on) { 160 return $('<div />', { 'class': 'modal-backdrop fade in' }).appendTo('body'); 161 }, 162 163 modal: function(overrideSettings) { 164 var defaultSettings = { 165 noSave: false, 166 noClose: false, 167 forceRenderClose: false, 168 detach: true 169 }, 170 settings = $.extend({}, defaultSettings, overrideSettings); 171 172 return FS.Template('modal', settings) 173 .then( 174 function(output) { 175 var modal = settings.appendToParentWindow ? top.$(output) : $(output), 176 modalSettings = (settings && settings.modalSettings) ? settings.modalSettings : settings; 177 178 if(settings.noClose) { 179 modalSettings.backdrop = 'static'; 180 modalSettings.keyboard = false;
181 } 182 183 var m = modal 184 .modal(modalSettings) 185 .on("show.bs.modal", function () { 186 $('.renderForm').css('z-index', 1000); 187 $('.achieveforms-iframe').css('z-index', 1000); 188 }) 189 .on("shown.bs.modal", function () { 190 $("body").addClass("modal-open"); 191 }) 192 .on("hide.bs.modal", function () { 193 $("body").removeClass("modal-open"); 194 }) 195 .on("hidden.bs.modal", function () { 196 if (settings.detach) { 197 modal.detach(); 198 } 199 $('.renderForm').css('z-index', 1050); 200 $('.achieveforms-iframe').css('z-index', 1050); 201 }) 202 .modal('show') 203 .removeClass('hide'); 204 205 if(modalSettings.spinner) { 206 spinner(modal.find('.modal-body'), true); 207 } 208 return m; 209 }, 210 function(error) { 211 console.warn('Unable to render modal window', settings, error); 212 } 213 ); 214 }, 215 216 appModal: function(modalHTML, overrideSettings){ 217 var $modal = $(modalHTML); 218 var defaultSettings = { 219 detach: true 220 }; 221 var settings = $.extend({}, defaultSettings, overrideSettings); 222 223 $(document).find('body').append($modal); 224 $modal 225 .modal(settings) 226 .on("shown.bs.modal", function () { 227 $("body").addClass("modal-open"); 228 }) 229 .on("hide.bs.modal", function () { 230 $("body").removeClass("modal-open"); 231 }) 232 .on("hidden.bs.modal", function () { 233 if (settings.detach) { 234 $modal.detach(); 235 } 236 }) 237 .modal('show') 238 .removeClass('hide'); 239 240 var defer = $.Deferred(); 241 defer.promise($modal); 242 defer.resolve($modal); 243 244 return $modal; 245 }, 246 247 addReCaptchaToModal: function(recaptchaElement, siteKey, callback){ 248 return grecaptcha.render(recaptchaElement, { 249 sitekey: siteKey, 250 callback: callback 251 }); 252 253 }, 254 255 docAPITransform: function(input) { 256 var _this = this; 257 var output = []; 258 if(input && input.length) { 259 output = _.map(input, this.getDocApiTransformObject); 260 } else { 261 console.warn('Invalid input to docAPITransform', input); 262 } 263 return output; 264 }, 265 266 getDocApiTransformObject: function(input){ 267 var o = { name: input.Name || input.name }; 268 _.each(input.Attribute, function(obj) { 269 var newName = obj.Name.replace(/-([a-z])/g, function(src, letter) { 270 return letter.toUpperCase(); 271 }); 272 o[newName] = obj.Value; 273 }); 274 275 return o; 276 }, 277 278 sortObjects: function(arrayOfObjects, sortBy, reverse) { 279 var sortingFunction = null; 280 var ordering = function (A, B) { return (A > B ? 1 : (A == B ? 0 : -1)); }; 281 if(typeof sortBy === 'string') { 282 sortingFunction = function(a, b) { 283 var A = a[sortBy]; 284 var B = b[sortBy]; 285 return ordering(A, B); 286 }; 287 } else if($.isFunction(sortBy)) { 288 sortingFunction = function(a, b) { 289 var A = sortBy.apply(a); 290 var B = sortBy.apply(b); 291 return ordering(A, B); 292 }; 293 } 294 return arrayOfObjects.sort(function() { 295 return sortingFunction.apply(this, arguments) * (reverse ? -1 : 1); 296 }); 297 }, 298 299 getQueryString: function(specificKey, url) { 300 var output = specificKey ? null : {}; 301 url = url || window.location.search || ''; 302 $.each(url.split(/\?|&/g), function() { 303 var bits = this.split('='); 304 if(bits.length == 2) { 305 if(specificKey && bits[0] == specificKey) { 306 output = decodeURIComponent(bits[1]); 307 return false; 308 } else if(!specificKey) { 309 output[bits[0]] = decodeURIComponent(bits[1]); 310 } 311 } 312 }); 313 return output; 314 }, 315 316 uuid: function() { 317 return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 318 var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 319 return v.toString(16); 320 }); 321 }, 322 323 printPreview: function(div){ 324 var printContents = $(div).clone(), 325 myWindow = window.open("", "popup", "width=1000,height=600,scrollbars=yes,resizable=yes," + 326 "toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0"), 327 doc = myWindow.document; 328 doc.open(); 329 $(printContents).find(".tCheckboxes").remove(); 330 var button = "<input type='button' id='btnPrint' value='Print' style='float: left;' onclick='window.print();'/>"; 331 button += "<link rel=\"stylesheet\" type=\"text/css\" href=\"../getStylesheet.php\" id=\"MasterStylesheet\"/><link rel=\"stylesheet\" type=\"text/css\" href=\"../assets/print.css\"/>"; 332 $(printContents).append($(button)); 333 doc.write($(printContents).html()); 334 doc.close(); 335 return false;
336 }, 337 338 notification: function(text, header, type, options){ 339 var task; 340 var header = header || ""; 341 var type = type || "success"; 342 var options = options || {}; 343 options = _.defaults(options, { 344 "closeButton": true, 345 "debug": false, 346 "positionClass": "toast-top-right", 347 "onclick": null, 348 "showDuration": "300", 349 "hideDuration": "1000", 350 "timeOut": "5000", 351 "extendedTimeOut": "1000", 352 "showEasing": "swing", 353 "hideEasing": "linear", 354 "showMethod": "fadeIn", 355 "hideMethod": "fadeOut" 356 }); 357 if (!!options.promisifyOnHidden) { 358 task = Promise.defer(); 359 options["onHidden"] = function() { task.resolve(); }; 360 } 361 toastr.options = options; 362 363 var toastTypes = ['success', 'error', 'warning', 'info']; 364 if(type in toastTypes != -1 ) toastr[type](text, header); 365 if (!!options.promisifyOnHidden) { 366 return task.promise; 367 } 368 }, 369 370 getDomainDetails: _.memoize(function() { 371 return FS.API.get("/domain/" + window.location.host) 372 .bind(this) 373 .then(function(data){ 374 return data; 375 }); 376 }), 377 378 getBrowserDetails: function() { 379 var nVer = navigator.appVersion; 380 var nAgt = navigator.userAgent; 381 var browserName = navigator.appName; 382 var fullVersion = ''+parseFloat(navigator.appVersion); 383 var majorVersion = parseInt(navigator.appVersion,10); 384 var nameOffset,verOffset,ix; 385 386 // In Opera, the true version is after "Opera" or after "Version" 387 if ((verOffset=nAgt.indexOf("Opera"))!=-1) { 388 browserName = "Opera"; 389 fullVersion = nAgt.substring(verOffset+6); 390 if ((verOffset=nAgt.indexOf("Version"))!=-1) 391 fullVersion = nAgt.substring(verOffset+8); 392 } 393 // In MSIE, the true version is after "MSIE" in userAgent 394 else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) { 395 browserName = "Microsoft Internet Explorer"; 396 fullVersion = nAgt.substring(verOffset+5); 397 } 398 // In Chrome, the true version is after "Chrome" 399 else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) { 400 browserName = "Chrome"; 401 fullVersion = nAgt.substring(verOffset+7); 402 } 403 // In Safari, the true version is after "Safari" or after "Version" 404 else if ((verOffset=nAgt.indexOf("Safari"))!=-1) { 405 browserName = "Safari"; 406 fullVersion = nAgt.substring(verOffset+7); 407 if ((verOffset=nAgt.indexOf("Version"))!=-1) 408 fullVersion = nAgt.substring(verOffset+8); 409 } 410 // In Firefox, the true version is after "Firefox" 411 else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) { 412 browserName = "Firefox"; 413 fullVersion = nAgt.substring(verOffset+8); 414 } 415 // In most other browsers, "name/version" is at the end of userAgent 416 else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < (verOffset=nAgt.lastIndexOf('/')) ) { 417 browserName = nAgt.substring(nameOffset,verOffset); 418 fullVersion = nAgt.substring(verOffset+1); 419 if (browserName.toLowerCase()==browserName.toUpperCase()) { 420 browserName = navigator.appName; 421 } 422 } 423 // trim the fullVersion string at semicolon/space if present 424 if ((ix=fullVersion.indexOf(";"))!=-1) 425 fullVersion=fullVersion.substring(0,ix); 426 if ((ix=fullVersion.indexOf(" "))!=-1) 427 fullVersion=fullVersion.substring(0,ix); 428 429 majorVersion = parseInt(''+fullVersion,10); 430 if (isNaN(majorVersion)) { 431 fullVersion = ''+parseFloat(navigator.appVersion); 432 majorVersion = parseInt(navigator.appVersion,10); 433 } 434 435 return { 436 browser : browserName, 437 fullVersion : fullVersion, 438 majorVersion: majorVersion, 439 userAgent : nAgt 440 }; 441 }, 442 443 getCurrentUrl: function() { 444 return top.window.location.protocol + '//' + top.window.location.host + top.window.location.pathname + top.window.location.search + top.window.location.hash; 445 }, 446 447 windowSearchToObject: function(params) { 448 params = params || {}; 449 var queryString = (!!params.searchParent ? window.parent.location.search.slice(1) : window.location.search.slice(1)); 450 var pairs = queryString.split("&"), 451 obj = {}, pair, i; 452 for (var i = 0; i < pairs.length; i++) { 453 if (pairs[i].trim() === "") continue; 454 pair = pairs[i].split("="); 455 obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 456 } 457 return obj; 458 } 459 }); 460 461 function dateFromISO(s) { 462 s = s.split(/\D/); 463 return new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||'')); 464 } 465 466 function pretty_date(date) { 467 if(!date || !typeof date == 'string') return ''; 468 var time = dateFromISO(date); 469 var seconds = (new Date() - Date(time)) / 1000; 470 var token = 'ago', 471 list_choice = 1; 472 if (seconds < 0) { 473 seconds = Math.abs(seconds); 474 token = 'from now'; 475 list_choice = 2; 476 } 477 var i = 0, 478 format; 479 while (format = time_formats[i++]) if (seconds < format[0]) { 480 if (typeof format[2] == 'string') return format[list_choice]; 481 else return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token; 482 } 483 return time; 484 } 485 486 var time_formats = [ 487 [60, 'seconds', 1], // 60 488 [120, '1 minute ago', '1 minute from now'], // 60*2 489 [3600, 'minutes', 60], // 60*60, 60 490 [7200, '1 hour ago', '1 hour from now'], // 60*60*2 491 [86400, 'hours', 3600], // 60*60*24, 60*60 492 [172800, 'yesterday', 'tomorrow'], // 60*60*24*2 493 [604800, 'days', 86400], // 60*60*24*7, 60*60*24 494 [1209600, 'last week', 'next week'], // 60*60*24*7*4*2 495 [2419200, 'weeks', 604800], // 60*60*24*7*4, 60*60*24*7 496 [4838400, 'last month', 'next month'], // 60*60*24*7*4*2 497 [29030400, 'months', 2419200], // 60*60*24*7*4*12, 60*60*24*7*4 498 [58060800, 'last year', 'next year'], // 60*60*24*7*4*12*2 499 [2903040000, 'years', 29030400], // 60*60*24*7*4*12*100, 60*60*24*7*4*12 500 [5806080000, 'last century', 'next century'], // 60*60*24*7*4*12*100*2 501 [58060800000, 'centuries', 2903040000] // 60*60*24*7*4*12*100*20, 60*60*24*7*4*12*100 502 ]; 503 504 if(dust && dust.filters) { 505 $.extend(dust.filters, {
506 dl: function(value) { return new Date(value).toLocaleString(); }, 507 duk: function(value) { 508 var d = new Date(value); 509 if(d && !isNaN(d.getDate())) return d.getDate() + '/' + (d.getMonth() + 1) + '/' + (d.getFullYear() ? d.getFullYear() : 'YYYY'); 510 else return ''; 511 }, 512 dp: pretty_date, 513 d: function(value) { return decodeURI(value); }, 514 dc: function(value) { return decodeURIComponent(value); } 515 }); 516 } 517})(jQuery, this);
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.