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