1/*! jQuery Address v${version} | (c) 2009, 2013 Rostislav Hristov | jquery.org/license */ 2(function ($) { 3 4 $.address = (function () { 5 6 var _trigger = function(name) { 7 var e = $.extend($.Event(name), (function() { 8 var parameters = {}, 9 parameterNames = $.address.parameterNames(); 10 for (var i = 0, l = parameterNames.length; i < l; i++) { 11 parameters[parameterNames[i]] = $.address.parameter(parameterNames[i]); 12 } 13 return { 14 value: $.address.value(), 15 path: $.address.path(), 16 pathNames: $.address.pathNames(), 17 parameterNames: parameterNames, 18 parameters: parameters, 19 queryString: $.address.queryString() 20 }; 21 }).call($.address)); 22 $($.address).trigger(e); 23 return e; 24 }, 25 _array = function(obj) { 26 return Array.prototype.slice.call(obj); 27 }, 28 _bind = function(value, data, fn) { 29 $().bind.apply($($.address), Array.prototype.slice.call(arguments)); 30 return $.address; 31 }, 32 _unbind = function(value, fn) { 33 $().unbind.apply($($.address), Array.prototype.slice.call(arguments)); 34 return $.address; 35 }, 36 _supportsState = function() { 37 return (_h.pushState && _opts.state !== UNDEFINED); 38 }, 39 _hrefState = function() { 40 return ('/' + _l.pathname.replace(new RegExp(_opts.state), '') + 41 _l.search + (_hrefHash() ? '#' + _hrefHash() : '')).replace(_re, '/'); 42 }, 43 _hrefHash = function() { 44 var index = _l.href.indexOf('#'); 45 return index != -1 ? _l.href.substr(index + 1) : ''; 46 }, 47 _href = function() { 48 return _supportsState() ? _hrefState() : _hrefHash(); 49 }, 50 _window = function() { 51 try { 52 return top.document !== UNDEFINED && top.document.title !== UNDEFINED && top.jQuery !== UNDEFINED && 53 top.jQuery.address !== UNDEFINED && top.jQuery.address.frames() !== false ? top : window; 54 } catch (e) { 55 return window; 56 } 57 }, 58 _js = function() { 59 return 'javascript'; 60 }, 61 _strict = function(value) { 62 value = value.toString(); 63 return (_opts.strict && value.substr(0, 1) != '/' ? '/' : '') + value; 64 }, 65 _cssint = function(el, value) { 66 return parseInt(el.css(value), 10); 67 }, 68 _listen = function() { 69 if (!_silent) { 70 var hash = _href(), 71 diff = decodeURI(_value) != decodeURI(hash); 72 if (diff) { 73 if (_msie && _version < 7) { 74 _l.reload(); 75 } else { 76 if (_msie && !_hashchange && _opts.history) { 77 _st(_html, 50); 78 } 79 _value = hash; 80 _update(FALSE); 81 } 82 } 83 } 84 }, 85 _update = function(internal) { 86 _st(_track, 10); 87 return _trigger(CHANGE).isDefaultPrevented() || 88 _trigger(internal ? INTERNAL_CHANGE : EXTERNAL_CHANGE).isDefaultPrevented(); 89 }, 90 _track = function() { 91 if (_opts.tracker !== 'null' && _opts.tracker !== NULL) { 92 var fn = $.isFunction(_opts.tracker) ? _opts.tracker : _t[_opts.tracker], 93 value = (_l.pathname + _l.search + 94 ($.address && !_supportsState() ? $.address.value() : '')) 95 .replace(/\/\//, '/').replace(/^\/$/, ''); 96 if ($.isFunction(fn)) { 97 fn(value); 98 } else { 99 if ($.isFunction(_t.urchinTracker)) { 100 _t.urchinTracker(value); 101 } 102 if (_t.pageTracker !== UNDEFINED && $.isFunction(_t.pageTracker._trackPageview)) { 103 _t.pageTracker._trackPageview(value); 104 } 105 if (_t._gaq !== UNDEFINED && $.isFunction(_t._gaq.push)) { 106 _t._gaq.push(['_trackPageview', decodeURI(value)]); 107 } 108 if ($.isFunction(_t.ga)) { 109 _t.ga('send', 'pageview', value); 110 } 111 } 112 } 113 }, 114 _html = function() { 115 var src = _js() + ':' + FALSE + ';document.open();document.writeln(\'<html><head><title>' + 116 _d.title.replace(/\'/g, '\\\'') + '</title><script>var ' + ID + ' = "' + encodeURIComponent(_href()).replace(/\'/g, '\\\'') + 117 (_d.domain != _l.hostname ? '";document.domain="' + _d.domain : '') + 118 '";</' + 'script></head></html>\');document.close();'; 119 if (_version < 7) { 120 _frame.src = src; 121 } else { 122 _frame.contentWindow.location.replace(src); 123 } 124 }, 125 _options = function() { 126 if (_url && _qi != -1) { 127 var i, param, params = _url.substr(_qi + 1).split('&'); 128 for (i = 0; i < params.length; i++) { 129 param = params[i].split('='); 130 if (/^(autoUpdate|history|strict|wrap)$/.test(param[0])) { 131 _opts[param[0]] = (isNaN(param[1]) ? /^(true|yes)$/i.test(param[1]) : (parseInt(param[1], 10) !== 0)); 132 } 133 if (/^(state|tracker)$/.test(param[0])) { 134 _opts[param[0]] = param[1]; 135 } 136 } 137 _url = NULL; 138 } 139 _value = _href(); 140 }, 141 _load = function() { 142 if (!_loaded) { 143 _loaded = TRUE; 144 _options(); 145 $('a[rel*="address:"]').address(); 146 if (_opts.wrap) { 147 var body = $('body'), 148 wrap = $('body > *') 149 .wrapAll('<div style="padding:' + 150 (_cssint(body, 'marginTop') + _cssint(body, 'paddingTop')) + 'px ' + 151 (_cssint(body, 'marginRight') + _cssint(body, 'paddingRight')) + 'px ' + 152 (_cssint(body, 'marginBottom') + _cssint(body, 'paddingBottom')) + 'px ' + 153 (_cssint(body, 'marginLeft') + _cssint(body, 'paddingLeft')) + 'px;" />') 154 .parent() 155 .wrap('<div id="' + ID + '" style="height:100%;overflow:auto;position:relative;' + 156 (_webkit && !window.statusbar.visible ? 'resize:both;' : '') + '" />'); 157 $('html, body') 158 .css({ 159 height: '100%', 160 margin: 0, 161 padding: 0, 162 overflow: 'hidden' 163 }); 164 if (_webkit) { 165 $('<style type="text/css" />') 166 .appendTo('head') 167 .text('#' + ID + '::-webkit-resizer { background-color: #fff; }'); 168 } 169 } 170 if (_msie && !_hashchange) { 171 var frameset = _d.getElementsByTagName('frameset')[0]; 172 _frame = _d.createElement((frameset ? '' : 'i') + 'frame'); 173 _frame.src = _js() + ':' + FALSE; 174 if (frameset) { 175 frameset.insertAdjacentElement('beforeEnd', _frame); 176 frameset[frameset.cols ? 'cols' : 'rows'] += ',0';
177 _frame.noResize = TRUE; 178 _frame.frameBorder = _frame.frameSpacing = 0; 179 } else { 180 _frame.style.display = 'none'; 181 _frame.style.width = _frame.style.height = 0; 182 _frame.tabIndex = -1; 183 _d.body.insertAdjacentElement('afterBegin', _frame); 184 } 185 _st(function() { 186 $(_frame).bind('load', function() { 187 var win = _frame.contentWindow; 188 _value = win[ID] !== UNDEFINED ? win[ID] : ''; 189 if (_value != _href()) { 190 _update(FALSE); 191 _l.hash = _value; 192 } 193 }); 194 if (_frame.contentWindow[ID] === UNDEFINED) { 195 _html(); 196 } 197 }, 50); 198 } 199 _st(function() { 200 _trigger('init'); 201 _update(FALSE); 202 }, 1); 203 if (!_supportsState()) { 204 if ((_msie && _version > 7) || (!_msie && _hashchange)) { 205 if (_t.addEventListener) { 206 _t.addEventListener(HASH_CHANGE, _listen, FALSE); 207 } else if (_t.attachEvent) { 208 _t.attachEvent('on' + HASH_CHANGE, _listen); 209 } 210 } else { 211 _si(_listen, 50); 212 } 213 } 214 if ('state' in window.history) { 215 $(window).trigger('popstate'); 216 } 217 } 218 }, 219 _popstate = function() { 220 if (decodeURI(_value) != decodeURI(_href())) { 221 _value = _href(); 222 _update(FALSE); 223 } 224 }, 225 _unload = function() { 226 if (_t.removeEventListener) { 227 _t.removeEventListener(HASH_CHANGE, _listen, FALSE); 228 } else if (_t.detachEvent) { 229 _t.detachEvent('on' + HASH_CHANGE, _listen); 230 } 231 }, 232 _uaMatch = function(ua) { 233 ua = ua.toLowerCase(); 234 var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || 235 /(webkit)[ \/]([\w.]+)/.exec( ua ) || 236 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || 237 /(msie) ([\w.]+)/.exec( ua ) || 238 ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || 239 []; 240 return { 241 browser: match[ 1 ] || '', 242 version: match[ 2 ] || '0' 243 }; 244 }, 245 _detectBrowser = function() { 246 var browser = {}, 247 matched = _uaMatch(navigator.userAgent); 248 if (matched.browser) { 249 browser[matched.browser] = true; 250 browser.version = matched.version; 251 } 252 if (browser.chrome) { 253 browser.webkit = true; 254 } else if (browser.webkit) { 255 browser.safari = true; 256 } 257 return browser; 258 }, 259 UNDEFINED, 260 NULL = null, 261 ID = 'jQueryAddress', 262 STRING = 'string', 263 HASH_CHANGE = 'hashchange', 264 INIT = 'init', 265 CHANGE = 'change', 266 INTERNAL_CHANGE = 'internalChange', 267 EXTERNAL_CHANGE = 'externalChange', 268 TRUE = true, 269 FALSE = false, 270 _opts = { 271 autoUpdate: TRUE, 272 history: TRUE, 273 strict: TRUE, 274 frames: TRUE, 275 wrap: FALSE 276 }, 277 _browser = _detectBrowser(), 278 _version = parseFloat(_browser.version), 279 _webkit = _browser.webkit || _browser.safari, 280 _msie = _browser.msie, 281 _t = _window(), 282 _d = _t.document, 283 _h = _t.history, 284 _l = _t.location, 285 _si = setInterval, 286 _st = setTimeout, 287 _re = /\/{2,9}/g, 288 _agent = navigator.userAgent, 289 _hashchange = 'on' + HASH_CHANGE in _t, 290 _frame, 291 _form, 292 _url = $('script:last').attr('src'), 293 _qi = _url ? _url.indexOf('?') : -1, 294 _title = _d.title, 295 _silent = FALSE, 296 _loaded = FALSE, 297 _juststart = TRUE, 298 _updating = FALSE, 299 _listeners = {}, 300 _value = _href(); 301 302 if (_msie) { 303 _version = parseFloat(_agent.substr(_agent.indexOf('MSIE') + 4)); 304 if (_d.documentMode && _d.documentMode != _version) { 305 _version = _d.documentMode != 8 ? 7 : 8; 306 } 307 var pc = _d.onpropertychange; 308 _d.onpropertychange = function() { 309 if (pc) { 310 pc.call(_d); 311 } 312 if (_d.title != _title && _d.title.indexOf('#' + _href()) != -1) { 313 _d.title = _title; 314 } 315 }; 316 } 317 318 if (_h.navigationMode) { 319 _h.navigationMode = 'compatible'; 320 } 321 if (document.readyState == 'complete') { 322 var interval = setInterval(function() { 323 if ($.address) { 324 _load(); 325 clearInterval(interval); 326 } 327 }, 50); 328 } else { 329 _options(); 330 $(_load); 331 } 332 $(window).bind('popstate', _popstate).bind('unload', _unload); 333 334 return { 335 bind: function(type, data, fn) { 336 return _bind.apply(this, _array(arguments)); 337 },
338 unbind: function(type, fn) { 339 return _unbind.apply(this, _array(arguments)); 340 }, 341 init: function(data, fn) { 342 return _bind.apply(this, [INIT].concat(_array(arguments))); 343 }, 344 change: function(data, fn) { 345 return _bind.apply(this, [CHANGE].concat(_array(arguments))); 346 }, 347 internalChange: function(data, fn) { 348 return _bind.apply(this, [INTERNAL_CHANGE].concat(_array(arguments))); 349 }, 350 externalChange: function(data, fn) { 351 return _bind.apply(this, [EXTERNAL_CHANGE].concat(_array(arguments))); 352 }, 353 baseURL: function() { 354 var url = _l.href; 355 if (url.indexOf('#') != -1) { 356 url = url.substr(0, url.indexOf('#')); 357 } 358 if (/\/$/.test(url)) { 359 url = url.substr(0, url.length - 1); 360 } 361 return url; 362 }, 363 autoUpdate: function(value) { 364 if (value !== UNDEFINED) { 365 _opts.autoUpdate = value; 366 return this; 367 } 368 return _opts.autoUpdate; 369 }, 370 history: function(value) { 371 if (value !== UNDEFINED) { 372 _opts.history = value; 373 return this; 374 } 375 return _opts.history; 376 }, 377 state: function(value) { 378 if (value !== UNDEFINED) { 379 _opts.state = value; 380 var hrefState = _hrefState(); 381 if (_opts.state !== UNDEFINED) { 382 if (_h.pushState) { 383 if (hrefState.substr(0, 3) == '/#/') { 384 _l.replace(_opts.state.replace(/^\/$/, '') + hrefState.substr(2)); 385 } 386 } else if (hrefState != '/' && hrefState.replace(/^\/#/, '') != _hrefHash()) { 387 _st(function() { 388 _l.replace(_opts.state.replace(/^\/$/, '') + '/#' + hrefState); 389 }, 1); 390 } 391 } 392 return this; 393 } 394 return _opts.state; 395 }, 396 frames: function(value) { 397 if (value !== UNDEFINED) { 398 _opts.frames = value; 399 _t = _window(); 400 return this; 401 } 402 return _opts.frames; 403 }, 404 strict: function(value) { 405 if (value !== UNDEFINED) { 406 _opts.strict = value; 407 return this; 408 } 409 return _opts.strict; 410 }, 411 tracker: function(value) { 412 if (value !== UNDEFINED) { 413 _opts.tracker = value; 414 return this; 415 } 416 return _opts.tracker; 417 }, 418 wrap: function(value) { 419 if (value !== UNDEFINED) { 420 _opts.wrap = value; 421 return this; 422 } 423 return _opts.wrap; 424 }, 425 update: function() { 426 _updating = TRUE; 427 this.value(_value); 428 _updating = FALSE; 429 return this; 430 }, 431 title: function(value) { 432 if (value !== UNDEFINED) { 433 _st(function() { 434 _title = _d.title = value; 435 if (_juststart && _frame && _frame.contentWindow && _frame.contentWindow.document) { 436 _frame.contentWindow.document.title = value; 437 _juststart = FALSE; 438 } 439 }, 50); 440 return this; 441 } 442 return _d.title; 443 }, 444 value: function(value) { 445 if (value !== UNDEFINED) { 446 value = _strict(value); 447 if (value == '/') { 448 value = ''; 449 } 450 if (_value == value && !_updating) { 451 return; 452 } 453 _value = value; 454 if (_opts.autoUpdate || _updating) { 455 if (_update(TRUE)) { 456 return this; 457 } 458 if (_supportsState()) { 459 _h[_opts.history ? 'pushState' : 'replaceState']({}, '', 460 _opts.state.replace(/\/$/, '') + (_value === '' ? '/' : _value)); 461 } else { 462 _silent = TRUE; 463 if (_webkit) { 464 if (_opts.history) { 465 _l.hash = '#' + _value; 466 } else { 467 _l.replace('#' + _value); 468 } 469 } else if (_value != _href()) { 470 if (_opts.history) { 471 _l.hash = '#' + _value; 472 } else { 473 _l.replace('#' + _value); 474 } 475 } 476 if ((_msie && !_hashchange) && _opts.history) { 477 _st(_html, 50); 478 } 479 if (_webkit) { 480 _st(function(){ _silent = FALSE; }, 1); 481 } else { 482 _silent = FALSE; 483 } 484 } 485 } 486 return this; 487 } 488 return _strict(_value); 489 }, 490 path: function(value) { 491 if (value !== UNDEFINED) { 492 var qs = this.queryString(), 493 hash = this.hash(); 494 this.value(value + (qs ? '?' + qs : '') + (hash ? '#' + hash : '')); 495 return this; 496 } 497 return _strict(_value).split('#')[0].split('?')[0]; 498 }, 499 pathNames: function() { 500 var path = this.path(), 501 names = path.replace(_re, '/').split('/'); 502 if (path.substr(0, 1) == '/' || path.length === 0) { 503 names.splice(0, 1); 504 } 505 if (path.substr(path.length - 1, 1) == '/') { 506 names.splice(names.length - 1, 1); 507 } 508 return names; 509 }, 510 queryString: function(value) { 511 if (value !== UNDEFINED) { 512 var hash = this.hash(); 513 this.value(this.path() + (value ? '?' + value : '') + (hash ? '#' + hash : '')); 514 return this; 515 } 516 var arr = _value.split('?'); 517 return arr.slice(1, arr.length).join('?').split('#')[0]; 518 }, 519 parameter: function(name, value, append) { 520 var i, params; 521 if (value !== UNDEFINED) { 522 var names = this.parameterNames(); 523 params = []; 524 value = value === UNDEFINED || value === NULL ? '' : value.toString(); 525 for (i = 0; i < names.length; i++) { 526 var n = names[i], 527 v = this.parameter(n); 528 if (typeof v == STRING) { 529 v = [v]; 530 } 531 if (n == name) { 532 v = (value === NULL || value === '') ? [] : 533 (append ? v.concat([value]) : [value]); 534 } 535 for (var j = 0; j < v.length; j++) { 536 params.push(n + '=' + v[j]); 537 } 538 } 539 if ($.inArray(name, names) == -1 && value !== NULL && value !== '') { 540 params.push(name + '=' + value); 541 } 542 this.queryString(params.join('&')); 543 return this; 544 } 545 value = this.queryString(); 546 if (value) { 547 var r = []; 548 params = value.split('&'); 549 for (i = 0; i < params.length; i++) { 550 var p = params[i].split('='); 551 if (p[0] == name) { 552 r.push(p.slice(1).join('=')); 553 } 554 } 555 if (r.length !== 0) { 556 return r.length != 1 ? r : r[0]; 557 } 558 } 559 }, 560 parameterNames: function() { 561 var qs = this.queryString(), 562 names = []; 563 if (qs && qs.indexOf('=') != -1) { 564 var params = qs.split('&'); 565 for (var i = 0; i < params.length; i++) { 566 var name = params[i].split('=')[0]; 567 if ($.inArray(name, names) == -1) { 568 names.push(name); 569 } 570 } 571 } 572 return names; 573 }, 574 hash: function(value) { 575 if (value !== UNDEFINED) { 576 this.value(_value.split('#')[0] + (value ? '#' + value : '')); 577 return this; 578 } 579 var arr = _value.split('#'); 580 return arr.slice(1, arr.length).join('#'); 581 } 582 }; 583 })(); 584 585 $.fn.address = function(fn) { 586 $(this).each(function(index) { 587 if (!$(this).data('address')) { 588 $(this).on('click', function(e) { 589 if (e.shiftKey || e.ctrlKey || e.metaKey || e.which == 2) { 590 return true; 591 } 592 var target = e.currentTarget; 593 if ($(target).is('a')) { 594 e.preventDefault(); 595 var value = fn ? fn.call(target) : 596 /address:/.test($(target).attr('rel')) ? $(target).attr('rel').split('address:')[1].split(' ')[0] : 597 $.address.state() !== undefined && !/^\/?$/.test($.address.state()) ? 598 $(target).attr('href').replace(new RegExp('^(.*' + $.address.state() + '|\\.)'), '') : 599 $(target).attr('href').replace(/^(#\!?|\.)/, ''); 600 $.address.value(value); 601 } 602 }).on('submit', function(e) { 603 var target = e.currentTarget; 604 if ($(target).is('form')) { 605 e.preventDefault(); 606 var action = $(target).attr('action'), 607 value = fn ? fn.call(target) : (action.indexOf('?') != -1 ? action.replace(/&$/, '') : action + '?') + 608 $(target).serialize(); 609 $.address.value(value); 610 } 611 }).data('address', true); 612 } 613 }); 614 return this; 615 }; 616 617})(jQuery);
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.