├── .gitignore ├── Makefile ├── README ├── README.md ├── Vimlogo.svg ├── data ├── commandBuffer.ts ├── content-script.js ├── content-script.ts ├── highlights.ts ├── icons │ ├── electrovim-128.png │ ├── electrovim-16.png │ ├── electrovim-18.png │ ├── electrovim-32.png │ ├── electrovim-36.png │ ├── electrovim-530.png │ └── electrovim-64.png ├── jquery-1.11.3.min.js ├── jquery.d.ts ├── keycodes.ts ├── messaging.ts └── style.css ├── electrovim.svg ├── icon.png ├── index.js ├── lightning-bolt-145473_1280.png ├── package.json ├── test └── test-index.js └── ts └── index.ts /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | *.swo 3 | *.swn 4 | *.xpi 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ts: 2 | tsc --out index.js ts/index.ts --target ES5 3 | tsc --out data/content-script.js data/content-script.ts --target ES5 4 | 5 | xpi: 6 | jpm xpi 7 | 8 | clean: 9 | rm -f index.js 10 | rm -f *.xpi 11 | 12 | 13 | .PHONY: ts 14 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Electrovim 2 | =============== 3 | 4 | ![](https://raw.githubusercontent.com/ChimeraCoder/electrovim/master/data/icons/electrovim-128.png) 5 | 6 | 7 | Electrovim adds Vim keybindings to Firefox. It supports multiprocess mode (also known as [electrolysis](https://wiki.mozilla.org/Electrolysis) or e10s). 8 | 9 | 10 | ### Installation 11 | 12 | Electrovim can be installed from the [Firefox Add-ons marketplace](https://addons.mozilla.org/en-US/firefox/addon/electrovim/). 13 | 14 | Upon installation, Electrovim will be available from any new tabs opened. Tabs that were open when Electrovim were installed for the first time may need to be refreshed. 15 | 16 | 17 | ### Usage 18 | 19 | The current mode (normal or insert) is shown on the bottom right of the window. Clicking inside any input field will automatically enter insert mode. You can leave insert mode by pressing Escape, just like in Vim. 20 | 21 | 22 | When in normal mode, use `d` to close the current tab. `CTRL+n` and `CTRL+p` switch to the next and previous tab, respectively. `CTRL+f` and `CTRL+b` are the equivalent of page up/page down. 23 | 24 | 25 | Command | Action 26 | ------------- | ------------- 27 | d | Closes tab 28 | j | Scroll down 29 | k | Scroll up 30 | / | Enter find mode 31 | H | Go back in browser history 32 | L | Go forward in browser history 33 | gg | Scroll to top of page 34 | G | Scroll to bottom of page 35 | CTRL + b | Page up 36 | CTRL + f | Page down 37 | CTRL + n | Switch to the next tab 38 | CTRL + p | Switch to the previous tab 39 | 40 | 41 | #### Find mode 42 | 43 | Press `/` to enter find mode and begin typing text to search the current page. Electrovim automatically highlights the first match (if any). To find subsequent matches, press `Enter` to complete the search and press `n` to iterate through all matches. 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | README -------------------------------------------------------------------------------- /Vimlogo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 28 | 35 | 36 | 59 | 61 | 62 | 64 | image/svg+xml 65 | 67 | 68 | 69 | 70 | 75 | 78 | 83 | 88 | 93 | 98 | 103 | 108 | 113 | 118 | 128 | 134 | 139 | 145 | 151 | 161 | 167 | 173 | 176 | 183 | 190 | 191 | 192 | 193 | 194 | -------------------------------------------------------------------------------- /data/commandBuffer.ts: -------------------------------------------------------------------------------- 1 | /// 2 | class _CommandBuffer { 3 | buffer : string[]; 4 | 5 | constructor(){ 6 | this.reset(); 7 | } 8 | 9 | reset() : void { 10 | this.buffer = []; 11 | } 12 | 13 | add(e : KeyboardEvent) : boolean{ 14 | const keyCode = e.keyCode 15 | if(e.keyCode === KeyCodeShift){ 16 | return false; 17 | } 18 | 19 | let key : string = KeyNameByCode[keyCode] 20 | if(e.shiftKey && isAlphaNumeric(keyCode)){ 21 | key = key.toUpperCase(); 22 | } 23 | this.buffer.push(key); 24 | return this.canExecute(); 25 | } 26 | 27 | canExecute() : boolean{ 28 | return (this.parseBuffer() !== null); 29 | } 30 | 31 | parseBuffer() : () => void{ 32 | // TODO replace this with a proper parser 33 | const command = this.buffer.join(""); 34 | switch (command){ 35 | case "d": 36 | return sendTabCloseEvent; 37 | case "G": 38 | return scrollToBottom; 39 | case "gg": 40 | return scrollToTop; 41 | case "H": 42 | return historyBack; 43 | case "L": 44 | return historyForward; 45 | case "j": 46 | return scrollDown; 47 | case "k": 48 | return scrollUp; 49 | } 50 | } 51 | } 52 | 53 | 54 | function sendTabCloseEvent(){ 55 | const message = new KeypressMessage(KeyCodeD, {}); 56 | self["port"].emit(message.name, message); 57 | } 58 | 59 | function scrollToBottom(){ 60 | $(window).scrollTop($(document).height()); 61 | } 62 | 63 | function scrollToTop(){ 64 | $(window).scrollTop(0); 65 | } 66 | 67 | function historyBack(){ 68 | content.window.history.back(); 69 | } 70 | 71 | function historyForward(){ 72 | content.window.history.forward(); 73 | } 74 | 75 | function scrollDown(){ 76 | const numPixels = 60; 77 | animateScroll(numPixels); 78 | } 79 | 80 | function scrollUp(){ 81 | const numPixels = -60; 82 | animateScroll(numPixels); 83 | } 84 | 85 | function animateScroll(numPixels : number, duration = 100){ 86 | const loc = $(document).scrollTop() + numPixels 87 | $('html,body').animate({scrollTop:loc}, duration); 88 | } 89 | -------------------------------------------------------------------------------- /data/content-script.js: -------------------------------------------------------------------------------- 1 | var KeyCodeShift = 16; 2 | var KeyCodeEsc = 27; 3 | var KeyCodeD = 68; 4 | var KeyCodeG = 71; 5 | var KeyCodeI = 73; 6 | var KeyCodeN = 78; 7 | var KeyCodeForwardSlash = 191; 8 | var KeyCodeEnter = 13; 9 | var KeypressListener = (function () { 10 | function KeypressListener(receiveMessage) { 11 | } 12 | KeypressListener.prototype.receiveMessage = function (message) { 13 | content.console.log("received message", message); 14 | this.receiveMessageFunc(message); 15 | }; 16 | return KeypressListener; 17 | })(); 18 | var KeypressMessage = (function () { 19 | function KeypressMessage(keycode, json) { 20 | this.name = "keypress"; 21 | this.json = json; 22 | } 23 | return KeypressMessage; 24 | })(); 25 | var LogMessage = (function () { 26 | function LogMessage() { 27 | var objs = []; 28 | for (var _i = 0; _i < arguments.length; _i++) { 29 | objs[_i - 0] = arguments[_i]; 30 | } 31 | this.name = "log"; 32 | this.json = { "contents": objs }; 33 | } 34 | return LogMessage; 35 | })(); 36 | /* 37 | 38 | highlight v5 39 | 40 | Highlights arbitrary terms. 41 | 42 | 43 | 44 | MIT license. 45 | 46 | Johann Burkard 47 | 48 | 49 | 50 | */ 51 | var HighlightClass = "electrovim-highlight"; 52 | var HighlightClassSelector = "." + HighlightClass; 53 | var ELEMENT_NODE = 1; 54 | var TEXT_NODE = 3; 55 | jQuery.fn.highlight = function (pattern, max) { 56 | var highlighted = 0; 57 | function innerHighlight(node, pattern) { 58 | if (max >= 0 && highlighted >= max) { 59 | return 0; 60 | } 61 | var skip = 0; 62 | if (node.nodeType == TEXT_NODE) { 63 | var pos = node.data.toUpperCase().indexOf(pattern); 64 | pos -= (node.data.substr(0, pos).toUpperCase().length - node.data.substr(0, pos).length); 65 | if (pos >= 0) { 66 | var spannode = document.createElement('span'); 67 | spannode.className = HighlightClass; 68 | var middlebit = node.splitText(pos); 69 | var endbit = middlebit.splitText(pattern.length); 70 | var middleclone = middlebit.cloneNode(true); 71 | spannode.appendChild(middleclone); 72 | middlebit.parentNode.replaceChild(spannode, middlebit); 73 | skip = 1; 74 | } 75 | } 76 | else if (node.nodeType == ELEMENT_NODE && node.childNodes && !/(script|style)/i.test(node.tagName)) { 77 | for (var i = 0; i < node.childNodes.length; ++i) { 78 | i += innerHighlight(node.childNodes[i], pattern); 79 | } 80 | } 81 | highlighted += skip; 82 | return skip; 83 | } 84 | return this.length && pattern && pattern.length ? this.each(function () { 85 | if (max >= 0 && highlighted >= max) { 86 | return; 87 | } 88 | innerHighlight(this, pattern.toUpperCase()); 89 | }) : this; 90 | }; 91 | jQuery.fn.removeHighlight = function () { 92 | return this.find("span." + HighlightClass).each(function () { 93 | this.parentNode.firstChild.nodeName; 94 | var parent = this.parentNode; 95 | var txtContent = this.textContent; 96 | $(this).replaceWith(txtContent); 97 | $(parent).get()[0].normalize(); 98 | }).end(); 99 | }; 100 | /* MIT license 101 | * https://github.com/timoxley/keycode/blob/master/index.js 102 | */ 103 | var KeyCodeByName = { 104 | 'backspace': 8, 105 | 'tab': 9, 106 | 'enter': 13, 107 | 'shift': 16, 108 | 'ctrl': 17, 109 | 'alt': 18, 110 | 'pause/break': 19, 111 | 'caps lock': 20, 112 | 'esc': 27, 113 | 'space': 32, 114 | 'page up': 33, 115 | 'page down': 34, 116 | 'end': 35, 117 | 'home': 36, 118 | 'left': 37, 119 | 'up': 38, 120 | 'right': 39, 121 | 'down': 40, 122 | 'insert': 45, 123 | 'delete': 46, 124 | 'command': 91, 125 | 'right click': 93, 126 | 'numpad *': 106, 127 | 'numpad +': 107, 128 | 'numpad -': 109, 129 | 'numpad .': 110, 130 | 'numpad /': 111, 131 | 'num lock': 144, 132 | 'scroll lock': 145, 133 | 'my computer': 182, 134 | 'my calculator': 183, 135 | ';': 186, 136 | '=': 187, 137 | ',': 188, 138 | '-': 189, 139 | '.': 190, 140 | '/': 191, 141 | '`': 192, 142 | '[': 219, 143 | '\\': 220, 144 | ']': 221, 145 | "'": 222, 146 | "a": 65, 147 | "b": 66, 148 | "c": 67, 149 | "d": 68, 150 | "e": 69, 151 | "f": 70, 152 | "g": 71, 153 | "h": 72, 154 | "i": 73, 155 | "j": 74, 156 | "k": 75, 157 | "l": 76, 158 | "m": 77, 159 | "n": 78, 160 | "o": 79, 161 | "p": 80, 162 | "q": 81, 163 | "r": 82, 164 | "s": 83, 165 | "t": 84, 166 | "u": 85, 167 | "v": 86, 168 | "w": 87, 169 | "x": 88, 170 | "y": 89, 171 | "z": 90 172 | }; 173 | var KeyNameByCode = { 174 | 8: 'backspace', 175 | 9: 'tab', 176 | 13: 'enter', 177 | 16: 'shift', 178 | 17: 'ctrl', 179 | 18: 'alt', 180 | 19: 'pause/break', 181 | 20: 'caps lock', 182 | 27: 'esc', 183 | 32: 'space', 184 | 33: 'page up', 185 | 34: 'page down', 186 | 35: 'end', 187 | 36: 'home', 188 | 37: 'left', 189 | 38: 'up', 190 | 39: 'right', 191 | 40: 'down', 192 | 45: 'insert', 193 | 46: 'delete', 194 | 65: "a", 195 | 66: "b", 196 | 67: "c", 197 | 68: "d", 198 | 69: "e", 199 | 70: "f", 200 | 71: "g", 201 | 72: "h", 202 | 73: "i", 203 | 74: "j", 204 | 75: "k", 205 | 76: "l", 206 | 77: "m", 207 | 78: "n", 208 | 79: "o", 209 | 80: "p", 210 | 81: "q", 211 | 82: "r", 212 | 83: "s", 213 | 84: "t", 214 | 85: "u", 215 | 86: "v", 216 | 87: "w", 217 | 88: "x", 218 | 89: "y", 219 | 90: "z", 220 | 91: 'command', 221 | 93: 'right click', 222 | 106: 'numpad *', 223 | 107: 'numpad +', 224 | 109: 'numpad -', 225 | 110: 'numpad .', 226 | 111: 'numpad /', 227 | 144: 'num lock', 228 | 145: 'scroll lock', 229 | 182: 'my computer', 230 | 183: 'my calculator', 231 | 186: ';', 232 | 187: '=', 233 | 188: ',', 234 | 189: '-', 235 | 190: '.', 236 | 191: '/', 237 | 192: '`', 238 | 219: '[', 239 | 220: '\\', 240 | 221: ']', 241 | 222: "'", 242 | }; 243 | function isAlphaNumeric(keyCode) { 244 | return (keyCode >= 65 && keyCode <= 90); 245 | } 246 | /// 247 | var _CommandBuffer = (function () { 248 | function _CommandBuffer() { 249 | this.reset(); 250 | } 251 | _CommandBuffer.prototype.reset = function () { 252 | this.buffer = []; 253 | }; 254 | _CommandBuffer.prototype.add = function (e) { 255 | var keyCode = e.keyCode; 256 | if (e.keyCode === KeyCodeShift) { 257 | return false; 258 | } 259 | var key = KeyNameByCode[keyCode]; 260 | if (e.shiftKey && isAlphaNumeric(keyCode)) { 261 | key = key.toUpperCase(); 262 | } 263 | this.buffer.push(key); 264 | return this.canExecute(); 265 | }; 266 | _CommandBuffer.prototype.canExecute = function () { 267 | return (this.parseBuffer() !== null); 268 | }; 269 | _CommandBuffer.prototype.parseBuffer = function () { 270 | // TODO replace this with a proper parser 271 | var command = this.buffer.join(""); 272 | switch (command) { 273 | case "d": 274 | return sendTabCloseEvent; 275 | case "G": 276 | return scrollToBottom; 277 | case "gg": 278 | return scrollToTop; 279 | case "H": 280 | return historyBack; 281 | case "L": 282 | return historyForward; 283 | case "j": 284 | return scrollDown; 285 | case "k": 286 | return scrollUp; 287 | } 288 | }; 289 | return _CommandBuffer; 290 | })(); 291 | function sendTabCloseEvent() { 292 | var message = new KeypressMessage(KeyCodeD, {}); 293 | self["port"].emit(message.name, message); 294 | } 295 | function scrollToBottom() { 296 | $(window).scrollTop($(document).height()); 297 | } 298 | function scrollToTop() { 299 | $(window).scrollTop(0); 300 | } 301 | function historyBack() { 302 | content.window.history.back(); 303 | } 304 | function historyForward() { 305 | content.window.history.forward(); 306 | } 307 | function scrollDown() { 308 | var numPixels = 60; 309 | animateScroll(numPixels); 310 | } 311 | function scrollUp() { 312 | var numPixels = -60; 313 | animateScroll(numPixels); 314 | } 315 | function animateScroll(numPixels, duration) { 316 | if (duration === void 0) { duration = 100; } 317 | var loc = $(document).scrollTop() + numPixels; 318 | $('html,body').animate({ scrollTop: loc }, duration); 319 | } 320 | /// 321 | /// 322 | /// 323 | /// 324 | var OverlayId = "electrovim-overlay"; 325 | var OverlayModeId = "electrovim-overlay-mode"; 326 | var SearchInputId = "electrovim-find"; 327 | var ModeInsert = "INSERT"; 328 | var ModeNormal = "NORMAL"; 329 | var ModeIgnore = "IGNORE"; 330 | var ModeFind = "FIND"; 331 | var CurrentFindClass = "electrovim-current-find"; 332 | var CommandBuffer = new _CommandBuffer(); 333 | var currentMode = ModeNormal; 334 | var findBuffer = ""; 335 | var findResults = false; // denotes whether we are in the middle of searching through results 336 | var findSelected = -1; 337 | function createOverlay() { 338 | // set the correct initial mode 339 | if (content.document.activeElement !== document.body) { 340 | currentMode = ModeInsert; 341 | } 342 | // check if an overlay already exists 343 | if (content.document.getElementById(OverlayId)) { 344 | updateOverlay(); 345 | return; 346 | } 347 | // create a new div element 348 | // and give it some content 349 | var newDiv = content.document.createElement("div"); 350 | var newSpan = content.document.createElement("span"); 351 | var newContent = content.document.createTextNode(currentMode); 352 | newSpan.id = OverlayModeId; 353 | newSpan.appendChild(newContent); //add the text node to the newly created div. 354 | newDiv.appendChild(newSpan); 355 | newDiv.id = OverlayId; 356 | // add the newly created element and its content into the DOM 357 | content.document.body.appendChild(newDiv); 358 | } 359 | function updateOverlay() { 360 | var elem = content.document.getElementById(OverlayModeId); 361 | if (elem === null) { 362 | content.console.log("error updating overlay - no element found"); 363 | return; 364 | } 365 | elem.textContent = currentMode; 366 | } 367 | // create the search input field 368 | // or reset it if already present 369 | function createSearchField() { 370 | removeSearchField(); 371 | var inputNode = content.document.createElement("input"); 372 | var overlay = content.document.getElementById(OverlayId); 373 | inputNode.setAttribute("type", "search"); 374 | inputNode.id = SearchInputId; 375 | inputNode.onsubmit = submitSearch; 376 | overlay.appendChild(inputNode); 377 | // add the newly created element and its content into the DOM 378 | } 379 | function removeSearchField() { 380 | var e = document.getElementById(SearchInputId); 381 | if (e) { 382 | e.parentNode.removeChild(e); 383 | } 384 | } 385 | function focusSearchField() { 386 | document.getElementById(SearchInputId).focus(); 387 | } 388 | function setMode(mode) { 389 | currentMode = mode; 390 | if (mode !== ModeFind) { 391 | var overlay = document.getElementById(OverlayId); 392 | var inputNode = document.getElementById(SearchInputId); 393 | if (inputNode !== null) { 394 | overlay.removeChild(inputNode); 395 | } 396 | } 397 | updateOverlay(); 398 | } 399 | function submitSearch(e) { 400 | e.preventDefault(); 401 | var searchField = document.getElementById(SearchInputId); 402 | findBuffer = searchField.value; 403 | findResults = true; 404 | searchField.disabled = true; 405 | stealFocus(); 406 | findSelected = -1; 407 | highlightAndCenter(); 408 | } 409 | function highlightAndCenter() { 410 | clearHighlights(); 411 | $("body")["highlight"](findBuffer, -1); 412 | var elements = $(HighlightClassSelector); 413 | findSelected++; 414 | $("." + CurrentFindClass).removeClass(CurrentFindClass); 415 | var selected = elements[findSelected % elements.length]; 416 | scrollToElement(selected); 417 | $(selected).addClass(CurrentFindClass); 418 | return; 419 | } 420 | // remove focus from the active element 421 | function stealFocus() { 422 | content.document.activeElement["blur"](); 423 | } 424 | function clearHighlights() { 425 | $("body")["removeHighlight"](); 426 | } 427 | function keyDownTextField(e) { 428 | try { 429 | var keyCode = e.keyCode; 430 | if (keyCode === KeyCodeShift) { 431 | return; 432 | } 433 | // From any mode, Escape always resets everything 434 | // and drops the user back in normal mode 435 | if (keyCode === KeyCodeEsc) { 436 | CommandBuffer.reset(); 437 | findBuffer = ""; 438 | findResults = false; 439 | findSelected = -1; 440 | clearHighlights(); 441 | stealFocus(); 442 | setMode(ModeNormal); 443 | return; 444 | } 445 | if (currentMode === ModeFind) { 446 | if (findResults) { 447 | if (keyCode === KeyCodeN) { 448 | var elements = $(HighlightClassSelector); 449 | findSelected++; 450 | $("." + CurrentFindClass).removeClass(CurrentFindClass); 451 | var selected = elements[findSelected % elements.length]; 452 | scrollToElement(selected); 453 | $(selected).addClass(CurrentFindClass); 454 | return; 455 | } 456 | } 457 | focusSearchField(); 458 | if (keyCode === KeyCodeEnter) { 459 | submitSearch(e); 460 | return; 461 | } 462 | if (!isCharPrintable(keyCode)) { 463 | return; 464 | } 465 | findBuffer += String.fromCharCode(keyCode).toLowerCase(); 466 | updateOverlay(); 467 | log(findBuffer); 468 | var body = $("body"); 469 | clearHighlights(); 470 | $("body")["highlight"](findBuffer, 1); 471 | var highlighted = $(HighlightClassSelector); 472 | if (highlighted[0]) { 473 | scrollToElement(highlighted[0]); 474 | } 475 | } 476 | // check if in insert/ignore mode 477 | if (currentMode !== ModeNormal) { 478 | return; 479 | } 480 | // forward slash enters find mode 481 | if (keyCode === KeyCodeForwardSlash) { 482 | setMode(ModeFind); 483 | findBuffer = ""; 484 | e.preventDefault(); 485 | createSearchField(); 486 | focusSearchField(); 487 | return; 488 | } 489 | // i enters ignore mode 490 | if (keyCode === KeyCodeI) { 491 | setMode(ModeIgnore); 492 | return; 493 | } 494 | // check if another element has focus 495 | if (!(content.document.activeElement === content.document.body)) { 496 | if (currentMode != ModeInsert) { 497 | setMode(ModeInsert); 498 | } 499 | return; 500 | } 501 | // add the key to command buffer and check if we can execute 502 | // a command 503 | var canExecute = CommandBuffer.add(e); 504 | if (canExecute) { 505 | var action = CommandBuffer.parseBuffer(); 506 | action(); 507 | CommandBuffer.reset(); 508 | } 509 | return; 510 | switch (keyCode) { 511 | case KeyCodeD: 512 | var message = new KeypressMessage(KeyCodeD, {}); 513 | self["port"].emit(message.name, message); 514 | break; 515 | case KeyCodeG: 516 | if (e.shiftKey) { 517 | // capital G 518 | // scroll to bottom 519 | $(window).scrollTop($(document).height()); 520 | } 521 | } 522 | } 523 | catch (e) { 524 | content.console.log("exception: ", e); 525 | log(e); 526 | throw e; 527 | } 528 | } 529 | function windowHeight() { 530 | if (document.compatMode === 'BackCompat') { 531 | return document.body.clientHeight; 532 | } 533 | return $(window).height(); 534 | } 535 | function pageup() { 536 | $(document).scrollTop($(document).scrollTop() - windowHeight()); 537 | } 538 | function pagedown() { 539 | $(document).scrollTop($(document).scrollTop() + windowHeight()); 540 | } 541 | function scrollToElement(element) { 542 | $(document).scrollTop($(element).offset().top); 543 | } 544 | // log to extension console 545 | function log() { 546 | var objs = []; 547 | for (var _i = 0; _i < arguments.length; _i++) { 548 | objs[_i - 0] = arguments[_i]; 549 | } 550 | var message = new (Array.bind.apply(LogMessage, [null].concat(objs))); 551 | self["port"].emit(message.name, message); 552 | } 553 | function handleClick(e) { 554 | if (!(content.document.activeElement === content.document.body)) { 555 | if (currentMode != ModeInsert) { 556 | setMode(ModeInsert); 557 | } 558 | } 559 | } 560 | function isCharPrintable(keycode) { 561 | var valid = (keycode > 47 && keycode < 58) || 562 | keycode == 32 || keycode == 13 || 563 | (keycode > 64 && keycode < 91) || 564 | (keycode > 95 && keycode < 112) || 565 | (keycode > 185 && keycode < 193) || 566 | (keycode > 218 && keycode < 223); // [\]' (in order) 567 | return valid; 568 | } 569 | createOverlay(); 570 | content.document.addEventListener("keydown", keyDownTextField, false); 571 | content.document.addEventListener("mouseup", handleClick, false); 572 | self["port"].on("pagedown", pagedown); 573 | self["port"].on("pageup", pageup); 574 | -------------------------------------------------------------------------------- /data/content-script.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | declare var content; 6 | declare var addMessageListener; 7 | declare var sendSyncMessage; 8 | declare var sendAsyncMessage; 9 | 10 | const OverlayId = "electrovim-overlay"; 11 | const OverlayModeId = "electrovim-overlay-mode"; 12 | const SearchInputId = "electrovim-find"; 13 | 14 | const ModeInsert = "INSERT"; 15 | const ModeNormal = "NORMAL"; 16 | const ModeIgnore = "IGNORE"; 17 | const ModeFind = "FIND"; 18 | 19 | const CurrentFindClass = "electrovim-current-find"; 20 | 21 | const CommandBuffer = new _CommandBuffer(); 22 | 23 | var currentMode = ModeNormal; 24 | 25 | var findBuffer : string = ""; 26 | var findResults : boolean = false; // denotes whether we are in the middle of searching through results 27 | var findSelected : number = -1; 28 | 29 | function createOverlay() { 30 | // set the correct initial mode 31 | if(content.document.activeElement !== document.body){ 32 | currentMode = ModeInsert; 33 | } 34 | 35 | // check if an overlay already exists 36 | if(content.document.getElementById(OverlayId)){ 37 | updateOverlay(); 38 | return; 39 | } 40 | 41 | 42 | // create a new div element 43 | // and give it some content 44 | const newDiv = content.document.createElement("div"); 45 | const newSpan = content.document.createElement("span"); 46 | const newContent = content.document.createTextNode(currentMode); 47 | newSpan.id = OverlayModeId; 48 | newSpan.appendChild(newContent); //add the text node to the newly created div. 49 | newDiv.appendChild(newSpan); 50 | newDiv.id = OverlayId; 51 | 52 | // add the newly created element and its content into the DOM 53 | content.document.body.appendChild(newDiv); 54 | } 55 | 56 | function updateOverlay(){ 57 | let elem = content.document.getElementById(OverlayModeId); 58 | if(elem === null){ 59 | content.console.log("error updating overlay - no element found"); 60 | return; 61 | } 62 | elem.textContent= currentMode; 63 | } 64 | 65 | 66 | // create the search input field 67 | // or reset it if already present 68 | function createSearchField(){ 69 | removeSearchField(); 70 | const inputNode = content.document.createElement("input"); 71 | const overlay = content.document.getElementById(OverlayId); 72 | inputNode.setAttribute("type", "search"); 73 | 74 | inputNode.id = SearchInputId; 75 | inputNode.onsubmit = submitSearch; 76 | overlay.appendChild(inputNode); 77 | 78 | // add the newly created element and its content into the DOM 79 | } 80 | 81 | function removeSearchField(){ 82 | let e = document.getElementById(SearchInputId); 83 | if(e){ 84 | e.parentNode.removeChild(e); 85 | } 86 | } 87 | 88 | function focusSearchField(){ 89 | document.getElementById(SearchInputId).focus(); 90 | } 91 | 92 | function setMode(mode : string){ 93 | currentMode = mode; 94 | if(mode !== ModeFind){ 95 | const overlay = document.getElementById(OverlayId); 96 | const inputNode = document.getElementById(SearchInputId); 97 | if(inputNode !== null){ 98 | overlay.removeChild(inputNode); 99 | } 100 | } 101 | updateOverlay(); 102 | } 103 | 104 | function submitSearch(e){ 105 | e.preventDefault(); 106 | const searchField = (document.getElementById(SearchInputId)); 107 | findBuffer = searchField.value; 108 | findResults = true; 109 | searchField.disabled = true; 110 | stealFocus(); 111 | findSelected = -1; 112 | highlightAndCenter(); 113 | 114 | } 115 | 116 | function highlightAndCenter(){ 117 | clearHighlights(); 118 | $("body")["highlight"](findBuffer, -1); 119 | 120 | const elements = $(HighlightClassSelector); 121 | findSelected++; 122 | $("." + CurrentFindClass).removeClass(CurrentFindClass); 123 | const selected = elements[findSelected % elements.length]; 124 | scrollToElement(selected); 125 | $(selected).addClass(CurrentFindClass); 126 | return; 127 | } 128 | 129 | // remove focus from the active element 130 | function stealFocus(){ 131 | content.document.activeElement["blur"](); 132 | } 133 | 134 | 135 | function clearHighlights(){ 136 | $("body")["removeHighlight"](); 137 | } 138 | 139 | 140 | 141 | function keyDownTextField(e) { 142 | try{ 143 | const keyCode = e.keyCode; 144 | if(keyCode === KeyCodeShift){ 145 | return; 146 | } 147 | 148 | // From any mode, Escape always resets everything 149 | // and drops the user back in normal mode 150 | if(keyCode === KeyCodeEsc) { 151 | CommandBuffer.reset(); 152 | 153 | 154 | findBuffer = ""; 155 | findResults = false; 156 | findSelected = -1; 157 | 158 | clearHighlights(); 159 | 160 | stealFocus(); 161 | setMode(ModeNormal); 162 | return; 163 | } 164 | 165 | if(currentMode === ModeFind){ 166 | if(findResults) { 167 | if(keyCode === KeyCodeN){ 168 | const elements = $(HighlightClassSelector); 169 | findSelected++; 170 | $("." + CurrentFindClass).removeClass(CurrentFindClass); 171 | const selected = elements[findSelected % elements.length]; 172 | scrollToElement(selected); 173 | $(selected).addClass(CurrentFindClass); 174 | return; 175 | } 176 | } 177 | 178 | focusSearchField(); 179 | 180 | if(keyCode === KeyCodeEnter){ 181 | submitSearch(e); 182 | return; 183 | } 184 | 185 | if(!isCharPrintable(keyCode)){ 186 | return; 187 | } 188 | findBuffer += String.fromCharCode(keyCode).toLowerCase(); 189 | updateOverlay(); 190 | log(findBuffer); 191 | const body = $("body"); 192 | 193 | 194 | clearHighlights(); 195 | $("body")["highlight"](findBuffer, 1); 196 | const highlighted = $(HighlightClassSelector); 197 | if(highlighted[0]){ 198 | scrollToElement(highlighted[0]); 199 | } 200 | } 201 | 202 | // check if in insert/ignore mode 203 | if(currentMode !== ModeNormal){ 204 | return; 205 | } 206 | 207 | // forward slash enters find mode 208 | if(keyCode === KeyCodeForwardSlash){ 209 | setMode(ModeFind); 210 | findBuffer = ""; 211 | e.preventDefault(); 212 | createSearchField(); 213 | focusSearchField(); 214 | return; 215 | } 216 | 217 | // i enters ignore mode 218 | if(keyCode===KeyCodeI){ 219 | setMode(ModeIgnore); 220 | return; 221 | } 222 | 223 | // check if another element has focus 224 | if(!(content.document.activeElement === content.document.body)){ 225 | if(currentMode != ModeInsert){ 226 | setMode(ModeInsert); 227 | } 228 | return; 229 | } 230 | 231 | 232 | // add the key to command buffer and check if we can execute 233 | // a command 234 | const canExecute = CommandBuffer.add(e); 235 | if(canExecute){ 236 | const action = CommandBuffer.parseBuffer(); 237 | action(); 238 | CommandBuffer.reset(); 239 | } 240 | 241 | return; 242 | 243 | switch (keyCode){ 244 | case KeyCodeD: 245 | const message = new KeypressMessage(KeyCodeD, {}); 246 | self["port"].emit(message.name, message) 247 | break; 248 | case KeyCodeG: 249 | if(e.shiftKey){ 250 | // capital G 251 | // scroll to bottom 252 | $(window).scrollTop($(document).height()); 253 | } 254 | } 255 | } 256 | catch (e){ 257 | content.console.log("exception: ", e); 258 | log(e); 259 | throw e; 260 | 261 | } 262 | } 263 | 264 | 265 | 266 | function windowHeight() : number { 267 | if (document.compatMode === 'BackCompat') { 268 | return document.body.clientHeight; 269 | } 270 | return $(window).height(); 271 | } 272 | 273 | 274 | function pageup(){ 275 | $(document).scrollTop($(document).scrollTop()-windowHeight()); 276 | } 277 | 278 | function pagedown(){ 279 | $(document).scrollTop($(document).scrollTop()+windowHeight()); 280 | } 281 | 282 | function scrollToElement(element : HTMLElement){ 283 | $(document).scrollTop($(element).offset().top) 284 | } 285 | 286 | // log to extension console 287 | function log(...objs: any[]){ 288 | const message = new (Array.bind.apply(LogMessage, [null].concat(objs))); 289 | self["port"].emit(message.name, message); 290 | } 291 | 292 | 293 | function handleClick(e){ 294 | if(!(content.document.activeElement === content.document.body)){ 295 | if(currentMode != ModeInsert){ 296 | setMode(ModeInsert); 297 | } 298 | } 299 | } 300 | 301 | 302 | 303 | function isCharPrintable(keycode : number) : boolean { 304 | const valid = 305 | (keycode > 47 && keycode < 58) || // number keys 306 | keycode == 32 || keycode == 13 || // spacebar & return key(s) (if you want to allow carriage returns) 307 | (keycode > 64 && keycode < 91) || // letter keys 308 | (keycode > 95 && keycode < 112) || // numpad keys 309 | (keycode > 185 && keycode < 193) || // ;=,-./` (in order) 310 | (keycode > 218 && keycode < 223); // [\]' (in order) 311 | 312 | return valid; 313 | } 314 | 315 | createOverlay(); 316 | content.document.addEventListener("keydown", keyDownTextField, false); 317 | content.document.addEventListener("mouseup", handleClick, false); 318 | 319 | self["port"].on("pagedown", pagedown); 320 | self["port"].on("pageup", pageup); 321 | -------------------------------------------------------------------------------- /data/highlights.ts: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | highlight v5 4 | 5 | Highlights arbitrary terms. 6 | 7 | 8 | 9 | MIT license. 10 | 11 | Johann Burkard 12 | 13 | 14 | 15 | */ 16 | 17 | const HighlightClass = "electrovim-highlight" 18 | const HighlightClassSelector = "." + HighlightClass; 19 | 20 | const ELEMENT_NODE = 1; 21 | const TEXT_NODE = 3; 22 | 23 | jQuery.fn.highlight = function(pattern : string, max? : number) { 24 | var highlighted = 0; 25 | function innerHighlight(node, pattern) : number { 26 | if(max >= 0 && highlighted >= max){ 27 | return 0; 28 | } 29 | let skip = 0; 30 | if (node.nodeType == TEXT_NODE) { 31 | let pos = node.data.toUpperCase().indexOf(pattern); 32 | pos -= (node.data.substr(0, pos).toUpperCase().length - node.data.substr(0, pos).length); 33 | if (pos >= 0) { 34 | let spannode = document.createElement('span'); 35 | spannode.className = HighlightClass; 36 | let middlebit = node.splitText(pos); 37 | let endbit = middlebit.splitText(pattern.length); 38 | let middleclone = middlebit.cloneNode(true); 39 | spannode.appendChild(middleclone); 40 | middlebit.parentNode.replaceChild(spannode, middlebit); 41 | skip = 1; 42 | } 43 | } 44 | else if (node.nodeType == ELEMENT_NODE && node.childNodes && !/(script|style)/i.test(node.tagName)) { 45 | for (var i = 0; i < node.childNodes.length; ++i) { 46 | i += innerHighlight(node.childNodes[i], pattern); 47 | } 48 | } 49 | highlighted += skip; 50 | return skip; 51 | } 52 | return this.length && pattern && pattern.length ? this.each(function() { 53 | if(max >= 0 && highlighted >= max){ 54 | return; 55 | } 56 | innerHighlight(this, pattern.toUpperCase()); 57 | }) : this; 58 | }; 59 | 60 | jQuery.fn.removeHighlight = function() { 61 | return this.find("span." + HighlightClass).each(function() { 62 | this.parentNode.firstChild.nodeName; 63 | const parent = this.parentNode; 64 | const txtContent = this.textContent; 65 | $(this).replaceWith(txtContent); 66 | $(parent).get()[0].normalize(); 67 | }).end(); 68 | }; 69 | 70 | -------------------------------------------------------------------------------- /data/icons/electrovim-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-128.png -------------------------------------------------------------------------------- /data/icons/electrovim-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-16.png -------------------------------------------------------------------------------- /data/icons/electrovim-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-18.png -------------------------------------------------------------------------------- /data/icons/electrovim-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-32.png -------------------------------------------------------------------------------- /data/icons/electrovim-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-36.png -------------------------------------------------------------------------------- /data/icons/electrovim-530.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-530.png -------------------------------------------------------------------------------- /data/icons/electrovim-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraCoder/electrovim/3f512ad85d6a9e5307645fbae8ecf0f8d3c52c70/data/icons/electrovim-64.png -------------------------------------------------------------------------------- /data/jquery-1.11.3.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; 3 | 4 | return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("