JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / swingjs / jquery / JQuery_UI_Core2.js
1 if (self.Clazz) {\r
2 \r
3 Clazz.declarePackage ("swingjs.jquery");\r
4 c$ = Clazz.declareType (swingjs.jquery, "JQuery_UI_Core2");\r
5 Clazz.makeConstructor (c$, \r
6 function () {\r
7 });\r
8 \r
9 }\r
10 \r
11 // menu button autocomplete\r
12 \r
13 if (!jQuery.ui.menu)\r
14 try{\r
15 \r
16 /*!\r
17  * jQuery UI Menu 1.10.4\r
18  * http://jqueryui.com\r
19  *\r
20  * Copyright 2014 jQuery Foundation and other contributors\r
21  * Released under the MIT license.\r
22  * http://jquery.org/license\r
23  *\r
24  * http://api.jqueryui.com/menu/\r
25  *\r
26  * Depends:\r
27  *      jquery.ui.core.js\r
28  *      jquery.ui.widget.js\r
29  *      jquery.ui.position.js\r
30  */\r
31 (function( $, undefined ) {\r
32 \r
33 $.widget( "ui.menu", {\r
34         version: "1.10.4",\r
35         defaultElement: "<ul>",\r
36         delay: 300,\r
37         options: {\r
38                 icons: {\r
39                         submenu: "ui-icon-carat-1-e"\r
40                 },\r
41                 menus: "ul",\r
42                 position: {\r
43                         my: "left top",\r
44                         at: "right top"\r
45                 },\r
46                 role: "menu",\r
47 \r
48                 // callbacks\r
49                 blur: null,\r
50                 focus: null,\r
51                 select: null\r
52         },\r
53 \r
54         _create: function() {\r
55                 this.activeMenu = this.element;\r
56                 // flag used to prevent firing of the click handler\r
57                 // as the event bubbles up through nested menus\r
58                 this.mouseHandled = false;\r
59                 this.element\r
60                         .uniqueId()\r
61                         .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )\r
62                         .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )\r
63                         .attr({\r
64                                 role: this.options.role,\r
65                                 tabIndex: 0\r
66                         })\r
67                         // need to catch all clicks on disabled menu\r
68                         // not possible through _on\r
69                         .bind( "click" + this.eventNamespace, $.proxy(function( event ) {\r
70                                 if ( this.options.disabled ) {\r
71                                         event.preventDefault();\r
72                                 }\r
73                         }, this ));\r
74 \r
75                 if ( this.options.disabled ) {\r
76                         this.element\r
77                                 .addClass( "ui-state-disabled" )\r
78                                 .attr( "aria-disabled", "true" );\r
79                 }\r
80 \r
81                 this._on({\r
82                         // Prevent focus from sticking to links inside menu after clicking\r
83                         // them (focus should always stay on UL during navigation).\r
84                         "mousedown .ui-menu-item > a": function( event ) {\r
85                                 event.preventDefault();\r
86                         },\r
87                         "click .ui-state-disabled > a": function( event ) {\r
88                                 event.preventDefault();\r
89                         },\r
90                         "click .ui-menu-item:has(a)": function( event ) {\r
91                                 var target = $( event.target ).closest( ".ui-menu-item" );\r
92                                 if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) {\r
93                                         this.select( event );\r
94 \r
95                                         // Only set the mouseHandled flag if the event will bubble, see #9469.\r
96                                         if ( !event.isPropagationStopped() ) {\r
97                                                 this.mouseHandled = true;\r
98                                         }\r
99 \r
100                                         // Open submenu on click\r
101                                         if ( target.has( ".ui-menu" ).length ) {\r
102                                                 this.expand( event );\r
103                                         } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) {\r
104 \r
105                                                 // Redirect focus to the menu\r
106                                                 this.element.trigger( "focus", [ true ] );\r
107 \r
108                                                 // If the active item is on the top level, let it stay active.\r
109                                                 // Otherwise, blur the active item since it is no longer visible.\r
110                                                 if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {\r
111                                                         clearTimeout( this.timer );\r
112                                                 }\r
113                                         }\r
114                                 }\r
115                         },\r
116                         "mouseenter .ui-menu-item": function( event ) {\r
117                                 var target = $( event.currentTarget );\r
118                                 // Remove ui-state-active class from siblings of the newly focused menu item\r
119                                 // to avoid a jump caused by adjacent elements both having a class with a border\r
120                                 target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );\r
121                                 this.focus( event, target );\r
122                         },\r
123                         mouseleave: "collapseAll",\r
124                         "mouseleave .ui-menu": "collapseAll",\r
125                         focus: function( event, keepActiveItem ) {\r
126                                 // If there's already an active item, keep it active\r
127                                 // If not, activate the first item\r
128                                 var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );\r
129 \r
130                                 if ( !keepActiveItem ) {\r
131                                         this.focus( event, item );\r
132                                 }\r
133                         },\r
134                         blur: function( event ) {\r
135                                 this._delay(function() {\r
136                                         if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {\r
137                                                 this.collapseAll( event );\r
138                                         }\r
139                                 });\r
140                         },\r
141                         keydown: "_keydown"\r
142                 });\r
143 \r
144                 this.refresh();\r
145 \r
146                 // Clicks outside of a menu collapse any open menus\r
147                 this._on( this.document, {\r
148                         click: function( event ) {\r
149                                 if ( !$( event.target ).closest( ".ui-menu" ).length ) {\r
150                                         this.collapseAll( event );\r
151                                 }\r
152 \r
153                                 // Reset the mouseHandled flag\r
154                                 this.mouseHandled = false;\r
155                         }\r
156                 });\r
157         },\r
158 \r
159         _destroy: function() {\r
160                 // Destroy (sub)menus\r
161                 this.element\r
162                         .removeAttr( "aria-activedescendant" )\r
163                         .find( ".ui-menu" ).addBack()\r
164                                 .removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )\r
165                                 .removeAttr( "role" )\r
166                                 .removeAttr( "tabIndex" )\r
167                                 .removeAttr( "aria-labelledby" )\r
168                                 .removeAttr( "aria-expanded" )\r
169                                 .removeAttr( "aria-hidden" )\r
170                                 .removeAttr( "aria-disabled" )\r
171                                 .removeUniqueId()\r
172                                 .show();\r
173 \r
174                 // Destroy menu items\r
175                 this.element.find( ".ui-menu-item" )\r
176                         .removeClass( "ui-menu-item" )\r
177                         .removeAttr( "role" )\r
178                         .removeAttr( "aria-disabled" )\r
179                         .children( "a" )\r
180                                 .removeUniqueId()\r
181                                 .removeClass( "ui-corner-all ui-state-hover" )\r
182                                 .removeAttr( "tabIndex" )\r
183                                 .removeAttr( "role" )\r
184                                 .removeAttr( "aria-haspopup" )\r
185                                 .children().each( function() {\r
186                                         var elem = $( this );\r
187                                         if ( elem.data( "ui-menu-submenu-carat" ) ) {\r
188                                                 elem.remove();\r
189                                         }\r
190                                 });\r
191 \r
192                 // Destroy menu dividers\r
193                 this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );\r
194         },\r
195 \r
196         _keydown: function( event ) {\r
197                 var match, prev, character, skip, regex,\r
198                         preventDefault = true;\r
199 \r
200                 function escape( value ) {\r
201                         return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );\r
202                 }\r
203 \r
204                 switch ( event.keyCode ) {\r
205                 case $.ui.keyCode.PAGE_UP:\r
206                         this.previousPage( event );\r
207                         break;\r
208                 case $.ui.keyCode.PAGE_DOWN:\r
209                         this.nextPage( event );\r
210                         break;\r
211                 case $.ui.keyCode.HOME:\r
212                         this._move( "first", "first", event );\r
213                         break;\r
214                 case $.ui.keyCode.END:\r
215                         this._move( "last", "last", event );\r
216                         break;\r
217                 case $.ui.keyCode.UP:\r
218                         this.previous( event );\r
219                         break;\r
220                 case $.ui.keyCode.DOWN:\r
221                         this.next( event );\r
222                         break;\r
223                 case $.ui.keyCode.LEFT:\r
224                         this.collapse( event );\r
225                         break;\r
226                 case $.ui.keyCode.RIGHT:\r
227                         if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {\r
228                                 this.expand( event );\r
229                         }\r
230                         break;\r
231                 case $.ui.keyCode.ENTER:\r
232                 case $.ui.keyCode.SPACE:\r
233                         this._activate( event );\r
234                         break;\r
235                 case $.ui.keyCode.ESCAPE:\r
236                         this.collapse( event );\r
237                         break;\r
238                 default:\r
239                         preventDefault = false;\r
240                         prev = this.previousFilter || "";\r
241                         character = String.fromCharCode( event.keyCode );\r
242                         skip = false;\r
243 \r
244                         clearTimeout( this.filterTimer );\r
245 \r
246                         if ( character === prev ) {\r
247                                 skip = true;\r
248                         } else {\r
249                                 character = prev + character;\r
250                         }\r
251 \r
252                         regex = new RegExp( "^" + escape( character ), "i" );\r
253                         match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {\r
254                                 return regex.test( $( this ).children( "a" ).text() );\r
255                         });\r
256                         match = skip && match.index( this.active.next() ) !== -1 ?\r
257                                 this.active.nextAll( ".ui-menu-item" ) :\r
258                                 match;\r
259 \r
260                         // If no matches on the current filter, reset to the last character pressed\r
261                         // to move down the menu to the first item that starts with that character\r
262                         if ( !match.length ) {\r
263                                 character = String.fromCharCode( event.keyCode );\r
264                                 regex = new RegExp( "^" + escape( character ), "i" );\r
265                                 match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {\r
266                                         return regex.test( $( this ).children( "a" ).text() );\r
267                                 });\r
268                         }\r
269 \r
270                         if ( match.length ) {\r
271                                 this.focus( event, match );\r
272                                 if ( match.length > 1 ) {\r
273                                         this.previousFilter = character;\r
274                                         this.filterTimer = this._delay(function() {\r
275                                                 delete this.previousFilter;\r
276                                         }, 1000 );\r
277                                 } else {\r
278                                         delete this.previousFilter;\r
279                                 }\r
280                         } else {\r
281                                 delete this.previousFilter;\r
282                         }\r
283                 }\r
284 \r
285                 if ( preventDefault ) {\r
286                         event.preventDefault();\r
287                 }\r
288         },\r
289 \r
290         _activate: function( event ) {\r
291                 if ( !this.active.is( ".ui-state-disabled" ) ) {\r
292                         if ( this.active.children( "a[aria-haspopup='true']" ).length ) {\r
293                                 this.expand( event );\r
294                         } else {\r
295                                 this.select( event );\r
296                         }\r
297                 }\r
298         },\r
299 \r
300         refresh: function() {\r
301                 var menus,\r
302                         icon = this.options.icons.submenu,\r
303                         submenus = this.element.find( this.options.menus );\r
304 \r
305                 this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length );\r
306 \r
307                 // Initialize nested menus\r
308                 submenus.filter( ":not(.ui-menu)" )\r
309                         .addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )\r
310                         .hide()\r
311                         .attr({\r
312                                 role: this.options.role,\r
313                                 "aria-hidden": "true",\r
314                                 "aria-expanded": "false"\r
315                         })\r
316                         .each(function() {\r
317                                 var menu = $( this ),\r
318                                         item = menu.prev( "a" ),\r
319                                         submenuCarat = $( "<span>" )\r
320                                                 .addClass( "ui-menu-icon ui-icon " + icon )\r
321                                                 .data( "ui-menu-submenu-carat", true );\r
322 \r
323                                 item\r
324                                         .attr( "aria-haspopup", "true" )\r
325                                         .prepend( submenuCarat );\r
326                                 menu.attr( "aria-labelledby", item.attr( "id" ) );\r
327                         });\r
328 \r
329                 menus = submenus.add( this.element );\r
330 \r
331                 // Don't refresh list items that are already adapted\r
332                 menus.children( ":not(.ui-menu-item):has(a)" )\r
333                         .addClass( "ui-menu-item" )\r
334                         .attr( "role", "presentation" )\r
335                         .children( "a" )\r
336                                 .uniqueId()\r
337                                 .addClass( "ui-corner-all" )\r
338                                 .attr({\r
339                                         tabIndex: -1,\r
340                                         role: this._itemRole()\r
341                                 });\r
342 \r
343                 // Initialize unlinked menu-items containing spaces and/or dashes only as dividers\r
344                 menus.children( ":not(.ui-menu-item)" ).each(function() {\r
345                         var item = $( this );\r
346                         // hyphen, em dash, en dash\r
347                         if ( !/[^\-\u2014\u2013\s]/.test( item.text() ) ) {\r
348                                 item.addClass( "ui-widget-content ui-menu-divider" );\r
349                         }\r
350                 });\r
351 \r
352                 // Add aria-disabled attribute to any disabled menu item\r
353                 menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );\r
354 \r
355                 // If the active item has been removed, blur the menu\r
356                 if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\r
357                         this.blur();\r
358                 }\r
359         },\r
360 \r
361         _itemRole: function() {\r
362                 return {\r
363                         menu: "menuitem",\r
364                         listbox: "option"\r
365                 }[ this.options.role ];\r
366         },\r
367 \r
368         _setOption: function( key, value ) {\r
369                 if ( key === "icons" ) {\r
370                         this.element.find( ".ui-menu-icon" )\r
371                                 .removeClass( this.options.icons.submenu )\r
372                                 .addClass( value.submenu );\r
373                 }\r
374                 this._super( key, value );\r
375         },\r
376 \r
377         focus: function( event, item ) {\r
378                 var nested, focused;\r
379                 this.blur( event, event && event.type === "focus" );\r
380 \r
381                 this._scrollIntoView( item );\r
382 \r
383                 this.active = item.first();\r
384                 focused = this.active.children( "a" ).addClass( "ui-state-focus" );\r
385                 // Only update aria-activedescendant if there's a role\r
386                 // otherwise we assume focus is managed elsewhere\r
387                 if ( this.options.role ) {\r
388                         this.element.attr( "aria-activedescendant", focused.attr( "id" ) );\r
389                 }\r
390 \r
391                 // Highlight active parent menu item, if any\r
392                 this.active\r
393                         .parent()\r
394                         .closest( ".ui-menu-item" )\r
395                         .children( "a:first" )\r
396                         .addClass( "ui-state-active" );\r
397 \r
398                 if ( event && event.type === "keydown" ) {\r
399                         this._close();\r
400                 } else {\r
401                         this.timer = this._delay(function() {\r
402                                 this._close();\r
403                         }, this.delay );\r
404                 }\r
405 \r
406                 nested = item.children( ".ui-menu" );\r
407                 if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\r
408                         this._startOpening(nested);\r
409                 }\r
410                 this.activeMenu = item.parent();\r
411 \r
412                 this._trigger( "focus", event, { item: item } );\r
413         },\r
414 \r
415         _scrollIntoView: function( item ) {\r
416                 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\r
417                 if ( this._hasScroll() ) {\r
418                         borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;\r
419                         paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;\r
420                         offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\r
421                         scroll = this.activeMenu.scrollTop();\r
422                         elementHeight = this.activeMenu.height();\r
423                         itemHeight = item.height();\r
424 \r
425                         if ( offset < 0 ) {\r
426                                 this.activeMenu.scrollTop( scroll + offset );\r
427                         } else if ( offset + itemHeight > elementHeight ) {\r
428                                 this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\r
429                         }\r
430                 }\r
431         },\r
432 \r
433         blur: function( event, fromFocus ) {\r
434                 if ( !fromFocus ) {\r
435                         clearTimeout( this.timer );\r
436                 }\r
437 \r
438                 if ( !this.active ) {\r
439                         return;\r
440                 }\r
441 \r
442                 this.active.children( "a" ).removeClass( "ui-state-focus" );\r
443                 this.active = null;\r
444 \r
445                 this._trigger( "blur", event, { item: this.active } );\r
446         },\r
447 \r
448         _startOpening: function( submenu ) {\r
449                 clearTimeout( this.timer );\r
450 \r
451                 // Don't open if already open fixes a Firefox bug that caused a .5 pixel\r
452                 // shift in the submenu position when mousing over the carat icon\r
453                 if ( submenu.attr( "aria-hidden" ) !== "true" ) {\r
454                         return;\r
455                 }\r
456 \r
457                 this.timer = this._delay(function() {\r
458                         this._close();\r
459                         this._open( submenu );\r
460                 }, this.delay );\r
461         },\r
462 \r
463         _open: function( submenu ) {\r
464                 var position = $.extend({\r
465                         of: this.active\r
466                 }, this.options.position );\r
467 \r
468                 clearTimeout( this.timer );\r
469                 this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )\r
470                         .hide()\r
471                         .attr( "aria-hidden", "true" );\r
472 \r
473                 submenu\r
474                         .show()\r
475                         .removeAttr( "aria-hidden" )\r
476                         .attr( "aria-expanded", "true" )\r
477                         .position( position );\r
478         },\r
479 \r
480         collapseAll: function( event, all ) {\r
481                 clearTimeout( this.timer );\r
482                 this.timer = this._delay(function() {\r
483                         // If we were passed an event, look for the submenu that contains the event\r
484                         var currentMenu = all ? this.element :\r
485                                 $( event && event.target ).closest( this.element.find( ".ui-menu" ) );\r
486 \r
487                         // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway\r
488                         if ( !currentMenu.length ) {\r
489                                 currentMenu = this.element;\r
490                         }\r
491 \r
492                         this._close( currentMenu );\r
493 \r
494                         this.blur( event );\r
495                         this.activeMenu = currentMenu;\r
496                 }, this.delay );\r
497         },\r
498 \r
499         // With no arguments, closes the currently active menu - if nothing is active\r
500         // it closes all menus.  If passed an argument, it will search for menus BELOW\r
501         _close: function( startMenu ) {\r
502                 if ( !startMenu ) {\r
503                         startMenu = this.active ? this.active.parent() : this.element;\r
504                 }\r
505 \r
506                 startMenu\r
507                         .find( ".ui-menu" )\r
508                                 .hide()\r
509                                 .attr( "aria-hidden", "true" )\r
510                                 .attr( "aria-expanded", "false" )\r
511                         .end()\r
512                         .find( "a.ui-state-active" )\r
513                                 .removeClass( "ui-state-active" );\r
514         },\r
515 \r
516         collapse: function( event ) {\r
517                 var newItem = this.active &&\r
518                         this.active.parent().closest( ".ui-menu-item", this.element );\r
519                 if ( newItem && newItem.length ) {\r
520                         this._close();\r
521                         this.focus( event, newItem );\r
522                 }\r
523         },\r
524 \r
525         expand: function( event ) {\r
526                 var newItem = this.active &&\r
527                         this.active\r
528                                 .children( ".ui-menu " )\r
529                                 .children( ".ui-menu-item" )\r
530                                 .first();\r
531 \r
532                 if ( newItem && newItem.length ) {\r
533                         this._open( newItem.parent() );\r
534 \r
535                         // Delay so Firefox will not hide activedescendant change in expanding submenu from AT\r
536                         this._delay(function() {\r
537                                 this.focus( event, newItem );\r
538                         });\r
539                 }\r
540         },\r
541 \r
542         next: function( event ) {\r
543                 this._move( "next", "first", event );\r
544         },\r
545 \r
546         previous: function( event ) {\r
547                 this._move( "prev", "last", event );\r
548         },\r
549 \r
550         isFirstItem: function() {\r
551                 return this.active && !this.active.prevAll( ".ui-menu-item" ).length;\r
552         },\r
553 \r
554         isLastItem: function() {\r
555                 return this.active && !this.active.nextAll( ".ui-menu-item" ).length;\r
556         },\r
557 \r
558         _move: function( direction, filter, event ) {\r
559                 var next;\r
560                 if ( this.active ) {\r
561                         if ( direction === "first" || direction === "last" ) {\r
562                                 next = this.active\r
563                                         [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )\r
564                                         .eq( -1 );\r
565                         } else {\r
566                                 next = this.active\r
567                                         [ direction + "All" ]( ".ui-menu-item" )\r
568                                         .eq( 0 );\r
569                         }\r
570                 }\r
571                 if ( !next || !next.length || !this.active ) {\r
572                         next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();\r
573                 }\r
574 \r
575                 this.focus( event, next );\r
576         },\r
577 \r
578         nextPage: function( event ) {\r
579                 var item, base, height;\r
580 \r
581                 if ( !this.active ) {\r
582                         this.next( event );\r
583                         return;\r
584                 }\r
585                 if ( this.isLastItem() ) {\r
586                         return;\r
587                 }\r
588                 if ( this._hasScroll() ) {\r
589                         base = this.active.offset().top;\r
590                         height = this.element.height();\r
591                         this.active.nextAll( ".ui-menu-item" ).each(function() {\r
592                                 item = $( this );\r
593                                 return item.offset().top - base - height < 0;\r
594                         });\r
595 \r
596                         this.focus( event, item );\r
597                 } else {\r
598                         this.focus( event, this.activeMenu.children( ".ui-menu-item" )\r
599                                 [ !this.active ? "first" : "last" ]() );\r
600                 }\r
601         },\r
602 \r
603         previousPage: function( event ) {\r
604                 var item, base, height;\r
605                 if ( !this.active ) {\r
606                         this.next( event );\r
607                         return;\r
608                 }\r
609                 if ( this.isFirstItem() ) {\r
610                         return;\r
611                 }\r
612                 if ( this._hasScroll() ) {\r
613                         base = this.active.offset().top;\r
614                         height = this.element.height();\r
615                         this.active.prevAll( ".ui-menu-item" ).each(function() {\r
616                                 item = $( this );\r
617                                 return item.offset().top - base + height > 0;\r
618                         });\r
619 \r
620                         this.focus( event, item );\r
621                 } else {\r
622                         this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );\r
623                 }\r
624         },\r
625 \r
626         _hasScroll: function() {\r
627                 return this.element.outerHeight() < this.element.prop( "scrollHeight" );\r
628         },\r
629 \r
630         select: function( event ) {\r
631                 // TODO: It should never be possible to not have an active item at this\r
632                 // point, but the tests don't trigger mouseenter before click.\r
633                 this.active = this.active || $( event.target ).closest( ".ui-menu-item" );\r
634                 var ui = { item: this.active };\r
635                 if ( !this.active.has( ".ui-menu" ).length ) {\r
636                         this.collapseAll( event, true );\r
637                 }\r
638                 this._trigger( "select", event, ui );\r
639         }\r
640 });\r
641 \r
642 }( jQuery ));\r
643 \r
644 \r
645 }catch (e) {\r
646 System.out.println("coremenu failed to load jQuery.ui.menu -- jQuery version conflict?");\r
647 }\r
648 \r
649 if (!jQuery.ui.button)\r
650 try{\r
651 \r
652 /*!\r
653  * jQuery UI Button 1.10.4\r
654  * http://jqueryui.com\r
655  *\r
656  * Copyright 2014 jQuery Foundation and other contributors\r
657  * Released under the MIT license.\r
658  * http://jquery.org/license\r
659  *\r
660  * http://api.jqueryui.com/button/\r
661  *\r
662  * Depends:\r
663  *      jquery.ui.core.js\r
664  *      jquery.ui.widget.js\r
665  */\r
666 (function( $, undefined ) {\r
667 \r
668 var lastActive,\r
669         baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",\r
670         typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",\r
671         formResetHandler = function() {\r
672                 var form = $( this );\r
673                 setTimeout(function() {\r
674                         form.find( ":ui-button" ).button( "refresh" );\r
675                 }, 1 );\r
676         },\r
677         radioGroup = function( radio ) {\r
678                 var name = radio.name,\r
679                         form = radio.form,\r
680                         radios = $( [] );\r
681                 if ( name ) {\r
682                         name = name.replace( /'/g, "\\'" );\r
683                         if ( form ) {\r
684                                 radios = $( form ).find( "[name='" + name + "']" );\r
685                         } else {\r
686                                 radios = $( "[name='" + name + "']", radio.ownerDocument )\r
687                                         .filter(function() {\r
688                                                 return !this.form;\r
689                                         });\r
690                         }\r
691                 }\r
692                 return radios;\r
693         };\r
694 \r
695 $.widget( "ui.button", {\r
696         version: "1.10.4",\r
697         defaultElement: "<button>",\r
698         options: {\r
699                 disabled: null,\r
700                 text: true,\r
701                 label: null,\r
702                 icons: {\r
703                         primary: null,\r
704                         secondary: null\r
705                 }\r
706         },\r
707         _create: function() {\r
708                 this.element.closest( "form" )\r
709                         .unbind( "reset" + this.eventNamespace )\r
710                         .bind( "reset" + this.eventNamespace, formResetHandler );\r
711 \r
712                 if ( typeof this.options.disabled !== "boolean" ) {\r
713                         this.options.disabled = !!this.element.prop( "disabled" );\r
714                 } else {\r
715                         this.element.prop( "disabled", this.options.disabled );\r
716                 }\r
717 \r
718                 this._determineButtonType();\r
719                 this.hasTitle = !!this.buttonElement.attr( "title" );\r
720 \r
721                 var that = this,\r
722                         options = this.options,\r
723                         toggleButton = this.type === "checkbox" || this.type === "radio",\r
724                         activeClass = !toggleButton ? "ui-state-active" : "";\r
725 \r
726                 if ( options.label === null ) {\r
727                         options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());\r
728                 }\r
729 \r
730                 this._hoverable( this.buttonElement );\r
731 \r
732                 this.buttonElement\r
733                         .addClass( baseClasses )\r
734                         .attr( "role", "button" )\r
735                         .bind( "mouseenter" + this.eventNamespace, function() {\r
736                                 if ( options.disabled ) {\r
737                                         return;\r
738                                 }\r
739                                 if ( this === lastActive ) {\r
740                                         $( this ).addClass( "ui-state-active" );\r
741                                 }\r
742                         })\r
743                         .bind( "mouseleave" + this.eventNamespace, function() {\r
744                                 if ( options.disabled ) {\r
745                                         return;\r
746                                 }\r
747                                 $( this ).removeClass( activeClass );\r
748                         })\r
749                         .bind( "click" + this.eventNamespace, function( event ) {\r
750                                 if ( options.disabled ) {\r
751                                         event.preventDefault();\r
752                                         event.stopImmediatePropagation();\r
753                                 }\r
754                         });\r
755 \r
756                 // Can't use _focusable() because the element that receives focus\r
757                 // and the element that gets the ui-state-focus class are different\r
758                 this._on({\r
759                         focus: function() {\r
760                                 this.buttonElement.addClass( "ui-state-focus" );\r
761                         },\r
762                         blur: function() {\r
763                                 this.buttonElement.removeClass( "ui-state-focus" );\r
764                         }\r
765                 });\r
766 \r
767                 if ( toggleButton ) {\r
768                         this.element.bind( "change" + this.eventNamespace, function() {\r
769                                 that.refresh();\r
770                         });\r
771                 }\r
772 \r
773                 if ( this.type === "checkbox" ) {\r
774                         this.buttonElement.bind( "click" + this.eventNamespace, function() {\r
775                                 if ( options.disabled ) {\r
776                                         return false;\r
777                                 }\r
778                         });\r
779                 } else if ( this.type === "radio" ) {\r
780                         this.buttonElement.bind( "click" + this.eventNamespace, function() {\r
781                                 if ( options.disabled ) {\r
782                                         return false;\r
783                                 }\r
784                                 $( this ).addClass( "ui-state-active" );\r
785                                 that.buttonElement.attr( "aria-pressed", "true" );\r
786 \r
787                                 var radio = that.element[ 0 ];\r
788                                 radioGroup( radio )\r
789                                         .not( radio )\r
790                                         .map(function() {\r
791                                                 return $( this ).button( "widget" )[ 0 ];\r
792                                         })\r
793                                         .removeClass( "ui-state-active" )\r
794                                         .attr( "aria-pressed", "false" );\r
795                         });\r
796                 } else {\r
797                         this.buttonElement\r
798                                 .bind( "mousedown" + this.eventNamespace, function() {\r
799                                         if ( options.disabled ) {\r
800                                                 return false;\r
801                                         }\r
802                                         $( this ).addClass( "ui-state-active" );\r
803                                         lastActive = this;\r
804                                         that.document.one( "mouseup", function() {\r
805                                                 lastActive = null;\r
806                                         });\r
807                                 })\r
808                                 .bind( "mouseup" + this.eventNamespace, function() {\r
809                                         if ( options.disabled ) {\r
810                                                 return false;\r
811                                         }\r
812                                         $( this ).removeClass( "ui-state-active" );\r
813                                 })\r
814                                 .bind( "keydown" + this.eventNamespace, function(event) {\r
815                                         if ( options.disabled ) {\r
816                                                 return false;\r
817                                         }\r
818                                         if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {\r
819                                                 $( this ).addClass( "ui-state-active" );\r
820                                         }\r
821                                 })\r
822                                 // see #8559, we bind to blur here in case the button element loses\r
823                                 // focus between keydown and keyup, it would be left in an "active" state\r
824                                 .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() {\r
825                                         $( this ).removeClass( "ui-state-active" );\r
826                                 });\r
827 \r
828                         if ( this.buttonElement.is("a") ) {\r
829                                 this.buttonElement.keyup(function(event) {\r
830                                         if ( event.keyCode === $.ui.keyCode.SPACE ) {\r
831                                                 // TODO pass through original event correctly (just as 2nd argument doesn't work)\r
832                                                 $( this ).click();\r
833                                         }\r
834                                 });\r
835                         }\r
836                 }\r
837 \r
838                 // TODO: pull out $.Widget's handling for the disabled option into\r
839                 // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can\r
840                 // be overridden by individual plugins\r
841                 this._setOption( "disabled", options.disabled );\r
842                 this._resetButton();\r
843         },\r
844 \r
845         _determineButtonType: function() {\r
846                 var ancestor, labelSelector, checked;\r
847 \r
848                 if ( this.element.is("[type=checkbox]") ) {\r
849                         this.type = "checkbox";\r
850                 } else if ( this.element.is("[type=radio]") ) {\r
851                         this.type = "radio";\r
852                 } else if ( this.element.is("input") ) {\r
853                         this.type = "input";\r
854                 } else {\r
855                         this.type = "button";\r
856                 }\r
857 \r
858                 if ( this.type === "checkbox" || this.type === "radio" ) {\r
859                         // we don't search against the document in case the element\r
860                         // is disconnected from the DOM\r
861                         ancestor = this.element.parents().last();\r
862                         labelSelector = "label[for='" + this.element.attr("id") + "']";\r
863                         this.buttonElement = ancestor.find( labelSelector );\r
864                         if ( !this.buttonElement.length ) {\r
865                                 ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();\r
866                                 this.buttonElement = ancestor.filter( labelSelector );\r
867                                 if ( !this.buttonElement.length ) {\r
868                                         this.buttonElement = ancestor.find( labelSelector );\r
869                                 }\r
870                         }\r
871                         this.element.addClass( "ui-helper-hidden-accessible" );\r
872 \r
873                         checked = this.element.is( ":checked" );\r
874                         if ( checked ) {\r
875                                 this.buttonElement.addClass( "ui-state-active" );\r
876                         }\r
877                         this.buttonElement.prop( "aria-pressed", checked );\r
878                 } else {\r
879                         this.buttonElement = this.element;\r
880                 }\r
881         },\r
882 \r
883         widget: function() {\r
884                 return this.buttonElement;\r
885         },\r
886 \r
887         _destroy: function() {\r
888                 this.element\r
889                         .removeClass( "ui-helper-hidden-accessible" );\r
890                 this.buttonElement\r
891                         .removeClass( baseClasses + " ui-state-active " + typeClasses )\r
892                         .removeAttr( "role" )\r
893                         .removeAttr( "aria-pressed" )\r
894                         .html( this.buttonElement.find(".ui-button-text").html() );\r
895 \r
896                 if ( !this.hasTitle ) {\r
897                         this.buttonElement.removeAttr( "title" );\r
898                 }\r
899         },\r
900 \r
901         _setOption: function( key, value ) {\r
902                 this._super( key, value );\r
903                 if ( key === "disabled" ) {\r
904                         this.element.prop( "disabled", !!value );\r
905                         if ( value ) {\r
906                                 this.buttonElement.removeClass( "ui-state-focus" );\r
907                         }\r
908                         return;\r
909                 }\r
910                 this._resetButton();\r
911         },\r
912 \r
913         refresh: function() {\r
914                 //See #8237 & #8828\r
915                 var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );\r
916 \r
917                 if ( isDisabled !== this.options.disabled ) {\r
918                         this._setOption( "disabled", isDisabled );\r
919                 }\r
920                 if ( this.type === "radio" ) {\r
921                         radioGroup( this.element[0] ).each(function() {\r
922                                 if ( $( this ).is( ":checked" ) ) {\r
923                                         $( this ).button( "widget" )\r
924                                                 .addClass( "ui-state-active" )\r
925                                                 .attr( "aria-pressed", "true" );\r
926                                 } else {\r
927                                         $( this ).button( "widget" )\r
928                                                 .removeClass( "ui-state-active" )\r
929                                                 .attr( "aria-pressed", "false" );\r
930                                 }\r
931                         });\r
932                 } else if ( this.type === "checkbox" ) {\r
933                         if ( this.element.is( ":checked" ) ) {\r
934                                 this.buttonElement\r
935                                         .addClass( "ui-state-active" )\r
936                                         .attr( "aria-pressed", "true" );\r
937                         } else {\r
938                                 this.buttonElement\r
939                                         .removeClass( "ui-state-active" )\r
940                                         .attr( "aria-pressed", "false" );\r
941                         }\r
942                 }\r
943         },\r
944 \r
945         _resetButton: function() {\r
946                 if ( this.type === "input" ) {\r
947                         if ( this.options.label ) {\r
948                                 this.element.val( this.options.label );\r
949                         }\r
950                         return;\r
951                 }\r
952                 var buttonElement = this.buttonElement.removeClass( typeClasses ),\r
953                         buttonText = $( "<span></span>", this.document[0] )\r
954                                 .addClass( "ui-button-text" )\r
955                                 .html( this.options.label )\r
956                                 .appendTo( buttonElement.empty() )\r
957                                 .text(),\r
958                         icons = this.options.icons,\r
959                         multipleIcons = icons.primary && icons.secondary,\r
960                         buttonClasses = [];\r
961 \r
962                 if ( icons.primary || icons.secondary ) {\r
963                         if ( this.options.text ) {\r
964                                 buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );\r
965                         }\r
966 \r
967                         if ( icons.primary ) {\r
968                                 buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );\r
969                         }\r
970 \r
971                         if ( icons.secondary ) {\r
972                                 buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );\r
973                         }\r
974 \r
975                         if ( !this.options.text ) {\r
976                                 buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );\r
977 \r
978                                 if ( !this.hasTitle ) {\r
979                                         buttonElement.attr( "title", $.trim( buttonText ) );\r
980                                 }\r
981                         }\r
982                 } else {\r
983                         buttonClasses.push( "ui-button-text-only" );\r
984                 }\r
985                 buttonElement.addClass( buttonClasses.join( " " ) );\r
986         }\r
987 });\r
988 \r
989 $.widget( "ui.buttonset", {\r
990         version: "1.10.4",\r
991         options: {\r
992                 items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"\r
993         },\r
994 \r
995         _create: function() {\r
996                 this.element.addClass( "ui-buttonset" );\r
997         },\r
998 \r
999         _init: function() {\r
1000                 this.refresh();\r
1001         },\r
1002 \r
1003         _setOption: function( key, value ) {\r
1004                 if ( key === "disabled" ) {\r
1005                         this.buttons.button( "option", key, value );\r
1006                 }\r
1007 \r
1008                 this._super( key, value );\r
1009         },\r
1010 \r
1011         refresh: function() {\r
1012                 var rtl = this.element.css( "direction" ) === "rtl";\r
1013 \r
1014                 this.buttons = this.element.find( this.options.items )\r
1015                         .filter( ":ui-button" )\r
1016                                 .button( "refresh" )\r
1017                         .end()\r
1018                         .not( ":ui-button" )\r
1019                                 .button()\r
1020                         .end()\r
1021                         .map(function() {\r
1022                                 return $( this ).button( "widget" )[ 0 ];\r
1023                         })\r
1024                                 .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )\r
1025                                 .filter( ":first" )\r
1026                                         .addClass( rtl ? "ui-corner-right" : "ui-corner-left" )\r
1027                                 .end()\r
1028                                 .filter( ":last" )\r
1029                                         .addClass( rtl ? "ui-corner-left" : "ui-corner-right" )\r
1030                                 .end()\r
1031                         .end();\r
1032         },\r
1033 \r
1034         _destroy: function() {\r
1035                 this.element.removeClass( "ui-buttonset" );\r
1036                 this.buttons\r
1037                         .map(function() {\r
1038                                 return $( this ).button( "widget" )[ 0 ];\r
1039                         })\r
1040                                 .removeClass( "ui-corner-left ui-corner-right" )\r
1041                         .end()\r
1042                         .button( "destroy" );\r
1043         }\r
1044 });\r
1045 \r
1046 }( jQuery ) );\r
1047 \r
1048 }catch (e) {\r
1049 System.out.println("coremenu failed to load jQuery.ui.button -- jQuery version conflict?");\r
1050 }\r
1051 \r
1052 if (!jQuery.ui.autocomplete)\r
1053 try{\r
1054 \r
1055 /*!\r
1056  * jQuery UI Autocomplete 1.10.4\r
1057  * http://jqueryui.com\r
1058  *\r
1059  * Copyright 2014 jQuery Foundation and other contributors\r
1060  * Released under the MIT license.\r
1061  * http://jquery.org/license\r
1062  *\r
1063  * http://api.jqueryui.com/autocomplete/\r
1064  *\r
1065  * Depends:\r
1066  *      jquery.ui.core.js\r
1067  *      jquery.ui.widget.js\r
1068  *      jquery.ui.position.js\r
1069  *      jquery.ui.menu.js\r
1070  */\r
1071 (function( $, undefined ) {\r
1072 \r
1073 $.widget( "ui.autocomplete", {\r
1074         version: "1.10.4",\r
1075         defaultElement: "<input>",\r
1076         options: {\r
1077                 appendTo: null,\r
1078                 autoFocus: false,\r
1079                 delay: 300,\r
1080                 minLength: 1,\r
1081                 position: {\r
1082                         my: "left top",\r
1083                         at: "left bottom",\r
1084                         collision: "none"\r
1085                 },\r
1086                 source: null,\r
1087 \r
1088                 // callbacks\r
1089                 change: null,\r
1090                 close: null,\r
1091                 focus: null,\r
1092                 open: null,\r
1093                 response: null,\r
1094                 search: null,\r
1095                 select: null\r
1096         },\r
1097 \r
1098         requestIndex: 0,\r
1099         pending: 0,\r
1100 \r
1101         _create: function() {\r
1102                 // Some browsers only repeat keydown events, not keypress events,\r
1103                 // so we use the suppressKeyPress flag to determine if we've already\r
1104                 // handled the keydown event. #7269\r
1105                 // Unfortunately the code for & in keypress is the same as the up arrow,\r
1106                 // so we use the suppressKeyPressRepeat flag to avoid handling keypress\r
1107                 // events when we know the keydown event was used to modify the\r
1108                 // search term. #7799\r
1109                 var suppressKeyPress, suppressKeyPressRepeat, suppressInput,\r
1110                         nodeName = this.element[0].nodeName.toLowerCase(),\r
1111                         isTextarea = nodeName === "textarea",\r
1112                         isInput = nodeName === "input";\r
1113 \r
1114                 this.isMultiLine =\r
1115                         // Textareas are always multi-line\r
1116                         isTextarea ? true :\r
1117                         // Inputs are always single-line, even if inside a contentEditable element\r
1118                         // IE also treats inputs as contentEditable\r
1119                         isInput ? false :\r
1120                         // All other element types are determined by whether or not they're contentEditable\r
1121                         this.element.prop( "isContentEditable" );\r
1122 \r
1123                 this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ];\r
1124                 this.isNewMenu = true;\r
1125 \r
1126                 this.element\r
1127                         .addClass( "ui-autocomplete-input" )\r
1128                         .attr( "autocomplete", "off" );\r
1129 \r
1130                 this._on( this.element, {\r
1131                         keydown: function( event ) {\r
1132                                 if ( this.element.prop( "readOnly" ) ) {\r
1133                                         suppressKeyPress = true;\r
1134                                         suppressInput = true;\r
1135                                         suppressKeyPressRepeat = true;\r
1136                                         return;\r
1137                                 }\r
1138 \r
1139                                 suppressKeyPress = false;\r
1140                                 suppressInput = false;\r
1141                                 suppressKeyPressRepeat = false;\r
1142                                 var keyCode = $.ui.keyCode;\r
1143                                 switch( event.keyCode ) {\r
1144                                 case keyCode.PAGE_UP:\r
1145                                         suppressKeyPress = true;\r
1146                                         this._move( "previousPage", event );\r
1147                                         break;\r
1148                                 case keyCode.PAGE_DOWN:\r
1149                                         suppressKeyPress = true;\r
1150                                         this._move( "nextPage", event );\r
1151                                         break;\r
1152                                 case keyCode.UP:\r
1153                                         suppressKeyPress = true;\r
1154                                         this._keyEvent( "previous", event );\r
1155                                         break;\r
1156                                 case keyCode.DOWN:\r
1157                                         suppressKeyPress = true;\r
1158                                         this._keyEvent( "next", event );\r
1159                                         break;\r
1160                                 case keyCode.ENTER:\r
1161                                 case keyCode.NUMPAD_ENTER:\r
1162                                         // when menu is open and has focus\r
1163                                         if ( this.menu.active ) {\r
1164                                                 // #6055 - Opera still allows the keypress to occur\r
1165                                                 // which causes forms to submit\r
1166                                                 suppressKeyPress = true;\r
1167                                                 event.preventDefault();\r
1168                                                 this.menu.select( event );\r
1169                                         }\r
1170                                         break;\r
1171                                 case keyCode.TAB:\r
1172                                         if ( this.menu.active ) {\r
1173                                                 this.menu.select( event );\r
1174                                         }\r
1175                                         break;\r
1176                                 case keyCode.ESCAPE:\r
1177                                         if ( this.menu.element.is( ":visible" ) ) {\r
1178                                                 this._value( this.term );\r
1179                                                 this.close( event );\r
1180                                                 // Different browsers have different default behavior for escape\r
1181                                                 // Single press can mean undo or clear\r
1182                                                 // Double press in IE means clear the whole form\r
1183                                                 event.preventDefault();\r
1184                                         }\r
1185                                         break;\r
1186                                 default:\r
1187                                         suppressKeyPressRepeat = true;\r
1188                                         // search timeout should be triggered before the input value is changed\r
1189                                         this._searchTimeout( event );\r
1190                                         break;\r
1191                                 }\r
1192                         },\r
1193                         keypress: function( event ) {\r
1194                                 if ( suppressKeyPress ) {\r
1195                                         suppressKeyPress = false;\r
1196                                         if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {\r
1197                                                 event.preventDefault();\r
1198                                         }\r
1199                                         return;\r
1200                                 }\r
1201                                 if ( suppressKeyPressRepeat ) {\r
1202                                         return;\r
1203                                 }\r
1204 \r
1205                                 // replicate some key handlers to allow them to repeat in Firefox and Opera\r
1206                                 var keyCode = $.ui.keyCode;\r
1207                                 switch( event.keyCode ) {\r
1208                                 case keyCode.PAGE_UP:\r
1209                                         this._move( "previousPage", event );\r
1210                                         break;\r
1211                                 case keyCode.PAGE_DOWN:\r
1212                                         this._move( "nextPage", event );\r
1213                                         break;\r
1214                                 case keyCode.UP:\r
1215                                         this._keyEvent( "previous", event );\r
1216                                         break;\r
1217                                 case keyCode.DOWN:\r
1218                                         this._keyEvent( "next", event );\r
1219                                         break;\r
1220                                 }\r
1221                         },\r
1222                         input: function( event ) {\r
1223                                 if ( suppressInput ) {\r
1224                                         suppressInput = false;\r
1225                                         event.preventDefault();\r
1226                                         return;\r
1227                                 }\r
1228                                 this._searchTimeout( event );\r
1229                         },\r
1230                         focus: function() {\r
1231                                 this.selectedItem = null;\r
1232                                 this.previous = this._value();\r
1233                         },\r
1234                         blur: function( event ) {\r
1235                                 if ( this.cancelBlur ) {\r
1236                                         delete this.cancelBlur;\r
1237                                         return;\r
1238                                 }\r
1239 \r
1240                                 clearTimeout( this.searching );\r
1241                                 this.close( event );\r
1242                                 this._change( event );\r
1243                         }\r
1244                 });\r
1245 \r
1246                 this._initSource();\r
1247                 this.menu = $( "<ul>" )\r
1248                         .addClass( "ui-autocomplete ui-front" )\r
1249                         .appendTo( this._appendTo() )\r
1250                         .menu({\r
1251                                 // disable ARIA support, the live region takes care of that\r
1252                                 role: null\r
1253                         })\r
1254                         .hide()\r
1255                         .data( "ui-menu" );\r
1256 \r
1257                 this._on( this.menu.element, {\r
1258                         mousedown: function( event ) {\r
1259                                 // prevent moving focus out of the text field\r
1260                                 event.preventDefault();\r
1261 \r
1262                                 // IE doesn't prevent moving focus even with event.preventDefault()\r
1263                                 // so we set a flag to know when we should ignore the blur event\r
1264                                 this.cancelBlur = true;\r
1265                                 this._delay(function() {\r
1266                                         delete this.cancelBlur;\r
1267                                 });\r
1268 \r
1269                                 // clicking on the scrollbar causes focus to shift to the body\r
1270                                 // but we can't detect a mouseup or a click immediately afterward\r
1271                                 // so we have to track the next mousedown and close the menu if\r
1272                                 // the user clicks somewhere outside of the autocomplete\r
1273                                 var menuElement = this.menu.element[ 0 ];\r
1274                                 if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {\r
1275                                         this._delay(function() {\r
1276                                                 var that = this;\r
1277                                                 this.document.one( "mousedown", function( event ) {\r
1278                                                         if ( event.target !== that.element[ 0 ] &&\r
1279                                                                         event.target !== menuElement &&\r
1280                                                                         !$.contains( menuElement, event.target ) ) {\r
1281                                                                 that.close();\r
1282                                                         }\r
1283                                                 });\r
1284                                         });\r
1285                                 }\r
1286                         },\r
1287                         menufocus: function( event, ui ) {\r
1288                                 // support: Firefox\r
1289                                 // Prevent accidental activation of menu items in Firefox (#7024 #9118)\r
1290                                 if ( this.isNewMenu ) {\r
1291                                         this.isNewMenu = false;\r
1292                                         if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\r
1293                                                 this.menu.blur();\r
1294 \r
1295                                                 this.document.one( "mousemove", function() {\r
1296                                                         $( event.target ).trigger( event.originalEvent );\r
1297                                                 });\r
1298 \r
1299                                                 return;\r
1300                                         }\r
1301                                 }\r
1302 \r
1303                                 var item = ui.item.data( "ui-autocomplete-item" );\r
1304                                 if ( false !== this._trigger( "focus", event, { item: item } ) ) {\r
1305                                         // use value to match what will end up in the input, if it was a key event\r
1306                                         if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\r
1307                                                 this._value( item.value );\r
1308                                         }\r
1309                                 } else {\r
1310                                         // Normally the input is populated with the item's value as the\r
1311                                         // menu is navigated, causing screen readers to notice a change and\r
1312                                         // announce the item. Since the focus event was canceled, this doesn't\r
1313                                         // happen, so we update the live region so that screen readers can\r
1314                                         // still notice the change and announce it.\r
1315                                         this.liveRegion.text( item.value );\r
1316                                 }\r
1317                         },\r
1318                         menuselect: function( event, ui ) {\r
1319                                 var item = ui.item.data( "ui-autocomplete-item" ),\r
1320                                         previous = this.previous;\r
1321 \r
1322                                 // only trigger when focus was lost (click on menu)\r
1323                                 if ( this.element[0] !== this.document[0].activeElement ) {\r
1324                                         this.element.focus();\r
1325                                         this.previous = previous;\r
1326                                         // #6109 - IE triggers two focus events and the second\r
1327                                         // is asynchronous, so we need to reset the previous\r
1328                                         // term synchronously and asynchronously :-(\r
1329                                         this._delay(function() {\r
1330                                                 this.previous = previous;\r
1331                                                 this.selectedItem = item;\r
1332                                         });\r
1333                                 }\r
1334 \r
1335                                 if ( false !== this._trigger( "select", event, { item: item } ) ) {\r
1336                                         this._value( item.value );\r
1337                                 }\r
1338                                 // reset the term after the select event\r
1339                                 // this allows custom select handling to work properly\r
1340                                 this.term = this._value();\r
1341 \r
1342                                 this.close( event );\r
1343                                 this.selectedItem = item;\r
1344                         }\r
1345                 });\r
1346 \r
1347                 this.liveRegion = $( "<span>", {\r
1348                                 role: "status",\r
1349                                 "aria-live": "polite"\r
1350                         })\r
1351                         .addClass( "ui-helper-hidden-accessible" )\r
1352                         .insertBefore( this.element );\r
1353 \r
1354                 // turning off autocomplete prevents the browser from remembering the\r
1355                 // value when navigating through history, so we re-enable autocomplete\r
1356                 // if the page is unloaded before the widget is destroyed. #7790\r
1357                 this._on( this.window, {\r
1358                         beforeunload: function() {\r
1359                                 this.element.removeAttr( "autocomplete" );\r
1360                         }\r
1361                 });\r
1362         },\r
1363 \r
1364         _destroy: function() {\r
1365                 clearTimeout( this.searching );\r
1366                 this.element\r
1367                         .removeClass( "ui-autocomplete-input" )\r
1368                         .removeAttr( "autocomplete" );\r
1369                 this.menu.element.remove();\r
1370                 this.liveRegion.remove();\r
1371         },\r
1372 \r
1373         _setOption: function( key, value ) {\r
1374                 this._super( key, value );\r
1375                 if ( key === "source" ) {\r
1376                         this._initSource();\r
1377                 }\r
1378                 if ( key === "appendTo" ) {\r
1379                         this.menu.element.appendTo( this._appendTo() );\r
1380                 }\r
1381                 if ( key === "disabled" && value && this.xhr ) {\r
1382                         this.xhr.abort();\r
1383                 }\r
1384         },\r
1385 \r
1386         _appendTo: function() {\r
1387                 var element = this.options.appendTo;\r
1388 \r
1389                 if ( element ) {\r
1390                         element = element.jquery || element.nodeType ?\r
1391                                 $( element ) :\r
1392                                 this.document.find( element ).eq( 0 );\r
1393                 }\r
1394 \r
1395                 if ( !element ) {\r
1396                         element = this.element.closest( ".ui-front" );\r
1397                 }\r
1398 \r
1399                 if ( !element.length ) {\r
1400                         element = this.document[0].body;\r
1401                 }\r
1402 \r
1403                 return element;\r
1404         },\r
1405 \r
1406         _initSource: function() {\r
1407                 var array, url,\r
1408                         that = this;\r
1409                 if ( $.isArray(this.options.source) ) {\r
1410                         array = this.options.source;\r
1411                         this.source = function( request, response ) {\r
1412                                 response( $.ui.autocomplete.filter( array, request.term ) );\r
1413                         };\r
1414                 } else if ( typeof this.options.source === "string" ) {\r
1415                         url = this.options.source;\r
1416                         this.source = function( request, response ) {\r
1417                                 if ( that.xhr ) {\r
1418                                         that.xhr.abort();\r
1419                                 }\r
1420                                 that.xhr = $.ajax({\r
1421                                         url: url,\r
1422                                         data: request,\r
1423                                         dataType: "json",\r
1424                                         success: function( data ) {\r
1425                                                 response( data );\r
1426                                         },\r
1427                                         error: function() {\r
1428                                                 response( [] );\r
1429                                         }\r
1430                                 });\r
1431                         };\r
1432                 } else {\r
1433                         this.source = this.options.source;\r
1434                 }\r
1435         },\r
1436 \r
1437         _searchTimeout: function( event ) {\r
1438                 clearTimeout( this.searching );\r
1439                 this.searching = this._delay(function() {\r
1440                         // only search if the value has changed\r
1441                         if ( this.term !== this._value() ) {\r
1442                                 this.selectedItem = null;\r
1443                                 this.search( null, event );\r
1444                         }\r
1445                 }, this.options.delay );\r
1446         },\r
1447 \r
1448         search: function( value, event ) {\r
1449                 value = value != null ? value : this._value();\r
1450 \r
1451                 // always save the actual value, not the one passed as an argument\r
1452                 this.term = this._value();\r
1453 \r
1454                 if ( value.length < this.options.minLength ) {\r
1455                         return this.close( event );\r
1456                 }\r
1457 \r
1458                 if ( this._trigger( "search", event ) === false ) {\r
1459                         return;\r
1460                 }\r
1461 \r
1462                 return this._search( value );\r
1463         },\r
1464 \r
1465         _search: function( value ) {\r
1466                 this.pending++;\r
1467                 this.element.addClass( "ui-autocomplete-loading" );\r
1468                 this.cancelSearch = false;\r
1469 \r
1470                 this.source( { term: value }, this._response() );\r
1471         },\r
1472 \r
1473         _response: function() {\r
1474                 var index = ++this.requestIndex;\r
1475 \r
1476                 return $.proxy(function( content ) {\r
1477                         if ( index === this.requestIndex ) {\r
1478                                 this.__response( content );\r
1479                         }\r
1480 \r
1481                         this.pending--;\r
1482                         if ( !this.pending ) {\r
1483                                 this.element.removeClass( "ui-autocomplete-loading" );\r
1484                         }\r
1485                 }, this );\r
1486         },\r
1487 \r
1488         __response: function( content ) {\r
1489                 if ( content ) {\r
1490                         content = this._normalize( content );\r
1491                 }\r
1492                 this._trigger( "response", null, { content: content } );\r
1493                 if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\r
1494                         this._suggest( content );\r
1495                         this._trigger( "open" );\r
1496                 } else {\r
1497                         // use ._close() instead of .close() so we don't cancel future searches\r
1498                         this._close();\r
1499                 }\r
1500         },\r
1501 \r
1502         close: function( event ) {\r
1503                 this.cancelSearch = true;\r
1504                 this._close( event );\r
1505         },\r
1506 \r
1507         _close: function( event ) {\r
1508                 if ( this.menu.element.is( ":visible" ) ) {\r
1509                         this.menu.element.hide();\r
1510                         this.menu.blur();\r
1511                         this.isNewMenu = true;\r
1512                         this._trigger( "close", event );\r
1513                 }\r
1514         },\r
1515 \r
1516         _change: function( event ) {\r
1517                 if ( this.previous !== this._value() ) {\r
1518                         this._trigger( "change", event, { item: this.selectedItem } );\r
1519                 }\r
1520         },\r
1521 \r
1522         _normalize: function( items ) {\r
1523                 // assume all items have the right format when the first item is complete\r
1524                 if ( items.length && items[0].label && items[0].value ) {\r
1525                         return items;\r
1526                 }\r
1527                 return $.map( items, function( item ) {\r
1528                         if ( typeof item === "string" ) {\r
1529                                 return {\r
1530                                         label: item,\r
1531                                         value: item\r
1532                                 };\r
1533                         }\r
1534                         return $.extend({\r
1535                                 label: item.label || item.value,\r
1536                                 value: item.value || item.label\r
1537                         }, item );\r
1538                 });\r
1539         },\r
1540 \r
1541         _suggest: function( items ) {\r
1542                 var ul = this.menu.element.empty();\r
1543                 this._renderMenu( ul, items );\r
1544                 this.isNewMenu = true;\r
1545                 this.menu.refresh();\r
1546 \r
1547                 // size and position menu\r
1548                 ul.show();\r
1549                 this._resizeMenu();\r
1550                 ul.position( $.extend({\r
1551                         of: this.element\r
1552                 }, this.options.position ));\r
1553 \r
1554                 if ( this.options.autoFocus ) {\r
1555                         this.menu.next();\r
1556                 }\r
1557         },\r
1558 \r
1559         _resizeMenu: function() {\r
1560                 var ul = this.menu.element;\r
1561                 ul.outerWidth( Math.max(\r
1562                         // Firefox wraps long text (possibly a rounding bug)\r
1563                         // so we add 1px to avoid the wrapping (#7513)\r
1564                         ul.width( "" ).outerWidth() + 1,\r
1565                         this.element.outerWidth()\r
1566                 ) );\r
1567         },\r
1568 \r
1569         _renderMenu: function( ul, items ) {\r
1570                 var that = this;\r
1571                 $.each( items, function( index, item ) {\r
1572                         that._renderItemData( ul, item );\r
1573                 });\r
1574         },\r
1575 \r
1576         _renderItemData: function( ul, item ) {\r
1577                 return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );\r
1578         },\r
1579 \r
1580         _renderItem: function( ul, item ) {\r
1581                 return $( "<li>" )\r
1582                         .append( $( "<a>" ).text( item.label ) )\r
1583                         .appendTo( ul );\r
1584         },\r
1585 \r
1586         _move: function( direction, event ) {\r
1587                 if ( !this.menu.element.is( ":visible" ) ) {\r
1588                         this.search( null, event );\r
1589                         return;\r
1590                 }\r
1591                 if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\r
1592                                 this.menu.isLastItem() && /^next/.test( direction ) ) {\r
1593                         this._value( this.term );\r
1594                         this.menu.blur();\r
1595                         return;\r
1596                 }\r
1597                 this.menu[ direction ]( event );\r
1598         },\r
1599 \r
1600         widget: function() {\r
1601                 return this.menu.element;\r
1602         },\r
1603 \r
1604         _value: function() {\r
1605                 return this.valueMethod.apply( this.element, arguments );\r
1606         },\r
1607 \r
1608         _keyEvent: function( keyEvent, event ) {\r
1609                 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {\r
1610                         this._move( keyEvent, event );\r
1611 \r
1612                         // prevents moving cursor to beginning/end of the text field in some browsers\r
1613                         event.preventDefault();\r
1614                 }\r
1615         }\r
1616 });\r
1617 \r
1618 $.extend( $.ui.autocomplete, {\r
1619         escapeRegex: function( value ) {\r
1620                 return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");\r
1621         },\r
1622         filter: function(array, term) {\r
1623                 var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );\r
1624                 return $.grep( array, function(value) {\r
1625                         return matcher.test( value.label || value.value || value );\r
1626                 });\r
1627         }\r
1628 });\r
1629 \r
1630 \r
1631 // live region extension, adding a `messages` option\r
1632 // NOTE: This is an experimental API. We are still investigating\r
1633 // a full solution for string manipulation and internationalization.\r
1634 $.widget( "ui.autocomplete", $.ui.autocomplete, {\r
1635         options: {\r
1636                 messages: {\r
1637                         noResults: "No search results.",\r
1638                         results: function( amount ) {\r
1639                                 return amount + ( amount > 1 ? " results are" : " result is" ) +\r
1640                                         " available, use up and down arrow keys to navigate.";\r
1641                         }\r
1642                 }\r
1643         },\r
1644 \r
1645         __response: function( content ) {\r
1646                 var message;\r
1647                 this._superApply( arguments );\r
1648                 if ( this.options.disabled || this.cancelSearch ) {\r
1649                         return;\r
1650                 }\r
1651                 if ( content && content.length ) {\r
1652                         message = this.options.messages.results( content.length );\r
1653                 } else {\r
1654                         message = this.options.messages.noResults;\r
1655                 }\r
1656                 this.liveRegion.text( message );\r
1657         }\r
1658 });\r
1659 \r
1660 }( jQuery ));\r
1661 \r
1662 }catch (e) {\r
1663 System.out.println("coremenu failed to load jQuery.ui.autocomplete -- jQuery version conflict?");\r
1664 }\r
1665 \r