You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2016/01/23 00:25:43 UTC
[02/51] [abbrv] incubator-geode git commit: GEODE-12: update
copyright headers
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/main/webapp/scripts/selectbox-customize/jquery.sb.js
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/main/webapp/scripts/selectbox-customize/jquery.sb.js b/gemfire-pulse/src/main/webapp/scripts/selectbox-customize/jquery.sb.js
index 4235f5e..e353213 100644
--- a/gemfire-pulse/src/main/webapp/scripts/selectbox-customize/jquery.sb.js
+++ b/gemfire-pulse/src/main/webapp/scripts/selectbox-customize/jquery.sb.js
@@ -1,864 +1,883 @@
-(function( $, window, undefined ) {
- // utility functions
- $.fn.borderWidth = function() { return $(this).outerWidth() - $(this).innerWidth(); };
- $.fn.paddingWidth = function() { return $(this).innerWidth() - $(this).width(); };
- $.fn.extraWidth = function() { return $(this).outerWidth(true) - $(this).width(); };
- $.fn.offsetFrom = function( e ) {
- var $e = $(e);
- return {
- left: $(this).offset().left - $e.offset().left,
- top: $(this).offset().top - $e.offset().top
- };
- };
- $.fn.maxWidth = function() {
- var max = 0;
- $(this).each(function() {
- if($(this).width() > max) {
- max = $(this).width();
- }
- });
- return max;
- };
- $.fn.triggerAll = function(event, params) {
- return $(this).each(function() {
- $(this).triggerHandler(event, params);
- });
- };
- var aps = Array.prototype.slice,
- randInt = function() {
- return Math.floor(Math.random() * 999999999);
- };
-
- // jQuery-Proto
- $.proto = function() {
- var name = arguments[0], // The name of the jQuery function that will be called
- clazz = arguments[1], // A reference to the class that you are associating
- klazz = clazz, // A version of clazz with a delayed constructor
- extOpt = {}, // used to extend clazz with a variable name for the init function
- undefined; // safety net
-
- opts = $.extend({
- elem: "elem", // the property name on the object that will be set to the current jQuery context
- access: "access", // the name of the access function to be set on the object
- init: "init", // the name of the init function to be set on the object
- instantAccess: false // when true, treat all args as access args (ignore constructor args) and allow construct/function call at the same time
- }, arguments[2]);
-
- if(clazz._super) {
- extOpt[opts.init] = function(){};
- klazz = clazz.extend(extOpt);
- }
-
- $.fn[name] = function() {
- var result, args = arguments;
-
- $(this).each(function() {
- var $e = $(this),
- obj = $e.data(name),
- isNew = !obj;
-
- // if the object is not defined for this element, then construct
- if(isNew) {
-
- // create the new object and restore init if necessary
- obj = new klazz();
- if(clazz._super) {
- obj[opts.init] = clazz.prototype.init;
- }
-
- // set the elem property and initialize the object
- obj[opts.elem] = $e[0];
- if(obj[opts.init]) {
- obj[opts.init].apply(obj, opts.instantAccess ? [] : aps.call(args, 0));
- }
-
- // associate it with the element
- $e.data(name, obj);
-
- }
-
- // if it is defined or we allow instance access, then access
- if(!isNew || opts.instantAccess) {
-
- // call the access function if it exists (allows lazy loading)
- if(obj[opts.access]) {
- obj[opts.access].apply(obj, aps.call(args, 0));
- }
-
- // do something with the object
- if(args.length > 0) {
-
- if($.isFunction(obj[args[0]])) {
-
- // use the method access interface
- result = obj[args[0]].apply(obj, aps.call(args, 1));
-
- } else if(args.length === 1) {
-
- // just retrieve the property (leverage deep access with getObject if we can)
- if($.getObject) {
- result = $.getObject(args[0], obj);
- } else {
- result = obj[args[0]];
- }
-
- } else {
-
- // set the property (leverage deep access with setObject if we can)
- if($.setObject) {
- $.setObject(args[0], args[1], obj);
- } else {
- obj[args[0]] = args[1];
- }
-
- }
-
- } else if(result === undefined) {
-
- // return the first object if there are no args
- result = $e.data(name);
-
- }
- }
- });
-
- // chain if no results were returned from the clazz's method (it's a setter)
- if(result === undefined) {
- return $(this);
- }
-
- // return the first result if not chaining
- return result;
- };
- };
-
- var falseFunc = function() {
- return false;
- },
- SelectBox = function() {
-
- var self = this,
- o = {},
- $orig = null,
- $label = null,
- $sb = null,
- $display = null,
- $dd = null,
- $items = null,
- searchTerm = "",
- cstTimeout = null,
- delayReloadTimeout = null,
- resizeTimeout = null,
-
- // functions
- loadSB,
- createOption,
- focusOrig,
- blurOrig,
- destroySB,
- reloadSB,
- delayReloadSB,
- openSB,
- centerOnSelected,
- closeSB,
- positionSB,
- positionSBIfOpen,
- delayPositionSB,
- clickSB,
- clickSBItem,
- keyupSB,
- keydownSB,
- focusSB,
- blurSB,
- addHoverState,
- removeHoverState,
- addActiveState,
- removeActiveState,
- getDDCtx,
- getSelected,
- getEnabled,
- selectItem,
- clearSearchTerm,
- findMatchingItem,
- selectMatchingItem,
- selectNextItemStartsWith,
- closeAll,
- closeAllButMe,
- closeAndUnbind,
- blurAllButMe,
- stopPageHotkeys,
- flickerDisplay,
- unbind;
-
- loadSB = function() {
-
- // create the new sb
- $sb = $("<div class='sb " + o.selectboxClass + " " + $orig.attr("class") + "' id='sb" + randInt() + "'></div>")
- .attr("role", "listbox")
- .attr("aria-has-popup", "true")
- .attr("aria-labelledby", $label.attr("id") ? $label.attr("id") : "");
- $("body").append($sb);
-
- // generate the display markup
- var displayMarkup = $orig.children().size() > 0
- ? o.displayFormat.call($orig.find("option:selected")[0], 0, 0)
- : " ";
- $display = $("<div class='display " + $orig.attr("class") + "' id='sbd" + randInt() + "'></div>")
- .append($("<div class='text'></div>").append(displayMarkup))
- .append(o.arrowMarkup);
- $sb.append($display);
-
- // generate the dropdown markup
- $dd = $("<ul class='" + o.selectboxClass + " items " + $orig.attr("class") + "' role='menu' id='sbdd" + randInt() + "'></ul>")
- .attr("aria-hidden", "true");
- $sb.append($dd)
- .attr("aria-owns", $dd.attr("id"));
- if($orig.children().size() === 0) {
- $dd.append(createOption().addClass("selected"));
- } else {
- $orig.children().each(function( i ) {
- var $opt, $og, $ogItem, $ogList;
- if($(this).is("optgroup")) {
- $og = $(this);
- $ogItem = $("<li class='optgroup'>" + o.optgroupFormat.call($og[0], i+1) + "</li>")
- .addClass($og.is(":disabled") ? "disabled" : "")
- .attr("aria-disabled", $og.is(":disabled") ? "true" : "");
- $ogList = $("<ul class='items'></ul>");
- $ogItem.append($ogList);
- $dd.append($ogItem);
- $og.children("option").each(function() {
- $opt = createOption($(this), i)
- .addClass($og.is(":disabled") ? "disabled" : "")
- .attr("aria-disabled", $og.is(":disabled") ? "true" : "");
- $ogList.append($opt);
- });
- } else {
- $dd.append(createOption($(this), i));
- }
- });
- }
-
- // cache all sb items
- $items = $dd.find("li").not(".optgroup");
-
- // for accessibility/styling
- $sb.attr("aria-active-descendant", $items.filter(".selected").attr("id"));
- $dd.children(":first").addClass("first");
- $dd.children(":last").addClass("last");
-
- // modify width based on fixedWidth/maxWidth options
- if(!o.fixedWidth) {
- var largestWidth = $dd.find(".text, .optgroup").maxWidth() + $display.extraWidth() + 1;
- $sb.width(o.maxWidth ? Math.min(o.maxWidth, largestWidth) : largestWidth);
- } else if(o.maxWidth && $sb.width() > o.maxWidth) {
- $sb.width(o.maxWidth);
- }
-
- // place the new markup in its semantic location (hide/show fixes positioning bugs)
- $orig.before($sb).addClass("has_sb").hide().show();
-
- // these two lines fix a div/span display bug on load in ie7
- positionSB();
- flickerDisplay();
-
- // hide the dropdown now that it's initialized
- $dd.hide();
-
- // bind events
- if(!$orig.is(":disabled")) {
- $orig
- .bind("blur.sb", blurOrig)
- .bind("focus.sb", focusOrig);
- $display
- .mouseup(addActiveState)
- .mouseup(clickSB)
- .click(falseFunc)
- .focus(focusSB)
- .blur(blurSB)
- .hover(addHoverState, removeHoverState);
- getEnabled()
- .click(clickSBItem)
- .hover(addHoverState, removeHoverState);
- $dd.find(".optgroup")
- .hover(addHoverState, removeHoverState)
- .click(falseFunc);
- $items.filter(".disabled")
- .click(falseFunc);
- if(!$.browser.msie || $.browser.version >= 9) {
- $(window).resize($.throttle ? $.throttle(100, positionSBIfOpen) : delayPositionSB);
- }
- } else {
- $sb.addClass("disabled").attr("aria-disabled");
- $display.click(function( e ) { e.preventDefault(); });
- }
-
- // bind custom events
- $sb.bind("close.sb", closeSB).bind("destroy.sb", destroySB);
- $orig.bind("reload.sb", reloadSB);
- if($.fn.tie && o.useTie) {
- $orig.bind("domupdate.sb", delayReloadSB);
- }
- };
-
- delayPositionSB = function() {
- clearTimeout(resizeTimeout);
- resizeTimeout = setTimeout(positionSBIfOpen, 50);
- };
-
- positionSBIfOpen = function() {
- if($sb.is(".open")) {
- positionSB();
- openSB(true);
- }
- }
-
- // create new markup from an <option>
- createOption = function( $option, index ) {
- if(!$option) {
- $option = $("<option value=''> </option>");
- index = 0;
- }
- var $li = $("<li id='sbo" + randInt() + "'></li>")
- .attr("role", "option")
- .data("orig", $option[0])
- .data("value", $option ? $option.attr("value") : "")
- .addClass($option.is(":selected") ? "selected" : "")
- .addClass($option.is(":disabled") ? "disabled" : "")
- .attr("aria-disabled", $option.is(":disabled") ? "true" : ""),
- $inner = $("<div class='item'></div>"),
- $text = $("<div class='text'></div>")
- .html(o.optionFormat.call($option[0], 0, index + 1));
- return $li.append($inner.append($text));
- };
-
- // causes focus if original is focused
- focusOrig = function() {
- blurAllButMe();
- $display.triggerHandler("focus");
- };
-
- // loses focus if original is blurred
- blurOrig = function() {
- if(!$sb.is(".open")) {
- $display.triggerHandler("blur");
- }
- };
-
- // unbind and remove
- destroySB = function( internal ) {
- $sb.remove();
- $orig
- .unbind(".sb")
- .removeClass("has_sb");
- $(window).unbind("resize", delayPositionSB);
- if(!internal) {
- $orig.removeData("sb");
- }
- };
-
- // destroy then load, maintaining open/focused state if applicable
- reloadSB = function() {
- var isOpen = $sb.is(".open"),
- isFocused = $display.is(".focused");
- closeSB(true);
- destroySB(true);
- self.init(o);
- if(isOpen) {
- $orig.focus();
- openSB(true);
- } else if(isFocused) {
- $orig.focus();
- }
- };
-
- // debouncing when useTie === true
- delayReloadSB = function() {
- clearTimeout(delayReloadTimeout);
- delayReloadTimeout = setTimeout(reloadSB, 30);
- };
-
- // when the user clicks outside the sb
- closeAndUnbind = function() {
- $sb.removeClass("focused");
- closeSB();
- unbind();
- };
-
- unbind = function() {
- $(document)
- .unbind("click", closeAndUnbind)
- .unbind("keyup", keyupSB)
- .unbind("keypress", stopPageHotkeys)
- .unbind("keydown", stopPageHotkeys)
- .unbind("keydown", keydownSB);
- };
-
- // trigger all sbs to close
- closeAll = function() {
- $(".sb.open." + o.selectboxClass).triggerAll("close");
- };
-
- // trigger all sbs to blur
- blurAllButMe = function() {
- $(".sb.focused." + o.selectboxClass).not($sb[0]).find(".display").blur();
- };
-
- // to prevent multiple selects open at once
- closeAllButMe = function() {
- $(".sb.open." + o.selectboxClass).not($sb[0]).triggerAll("close");
- };
-
- // hide and reset dropdown markup
- closeSB = function( instantClose ) {
- if($sb.is(".open")) {
- $display.blur();
- $items.removeClass("hover");
- unbind();
- $dd.attr("aria-hidden", "true");
- if(instantClose === true) {
- $dd.hide();
- $sb.removeClass("open");
- $sb.append($dd);
- } else {
- $dd.fadeOut(o.animDuration, function() {
- $sb.removeClass("open");
- $sb.append($dd);
- });
- }
- }
- };
-
- // since the context can change, we should get it dynamically
- getDDCtx = function() {
- var $ddCtx = null;
- if(o.ddCtx === "self") {
- $ddCtx = $sb;
- } else if($.isFunction(o.ddCtx)) {
- $ddCtx = $(o.ddCtx.call($orig[0]));
- } else {
- $ddCtx = $(o.ddCtx);
- }
- return $ddCtx;
- };
-
- // DRY
- getSelected = function() {
- return $items.filter(".selected");
- };
-
- // DRY
- getEnabled = function() {
- return $items.not(".disabled");
- };
-
- // reposition the scroll of the dropdown so the selected option is centered (or appropriately onscreen)
- centerOnSelected = function() {
- $dd.scrollTop($dd.scrollTop() + getSelected().offsetFrom($dd).top - $dd.height() / 2 + getSelected().outerHeight(true) / 2);
- };
-
- flickerDisplay = function() {
- if($.browser.msie && $.browser.version < 8) {
- $("." + o.selectboxClass + " .display").hide().show(); // fix ie7 display bug
- }
- };
-
- // show, reposition, and reset dropdown markup
- openSB = function( instantOpen ) {
- var dir,
- $ddCtx = getDDCtx();
- blurAllButMe();
- $sb.addClass("open");
- $ddCtx.append($dd);
- dir = positionSB();
- $dd.attr("aria-hidden", "false");
- if(instantOpen === true) {
- $dd.show();
- centerOnSelected();
- } else if(dir === "down") {
- $dd.slideDown(o.animDuration, centerOnSelected);
- } else {
- $dd.fadeIn(o.animDuration, centerOnSelected);
- }
- $orig.focus();
- };
-
- // position dropdown based on collision detection
- positionSB = function() {
- var $ddCtx = getDDCtx(),
- ddMaxHeight = 0,
- ddX = $display.offsetFrom($ddCtx).left,
- ddY = 0,
- dir = "",
- ml, mt,
- bottomSpace, topSpace,
- bottomOffset, spaceDiff,
- bodyX, bodyY;
-
- // modify dropdown css for getting values
- $dd.removeClass("above");
- $dd.show().css({
- maxHeight: "none",
- position: "relative",
- visibility: "hidden"
- });
- if(!o.fixedWidth) {
- $dd.width($display.outerWidth() - $dd.extraWidth() + 1);
- }
-
- // figure out if we should show above/below the display box
- bottomSpace = $(window).scrollTop() + $(window).height() - $display.offset().top - $display.outerHeight();
- topSpace = $display.offset().top - $(window).scrollTop();
- bottomOffset = $display.offsetFrom($ddCtx).top + $display.outerHeight();
- spaceDiff = bottomSpace - topSpace + o.dropupThreshold;
- if($dd.outerHeight() < bottomSpace) {
- ddMaxHeight = o.maxHeight ? o.maxHeight : bottomSpace;
- ddY = bottomOffset;
- dir = "down";
- } else if($dd.outerHeight() < topSpace) {
- ddMaxHeight = o.maxHeight ? o.maxHeight : topSpace;
- ddY = $display.offsetFrom($ddCtx).top - Math.min(ddMaxHeight, $dd.outerHeight());
- dir = "up";
- } else if(spaceDiff >= 0) {
- ddMaxHeight = o.maxHeight ? o.maxHeight : bottomSpace;
- ddY = bottomOffset;
- dir = "down";
- } else if(spaceDiff < 0) {
- ddMaxHeight = o.maxHeight ? o.maxHeight : topSpace;
- ddY = $display.offsetFrom($ddCtx).top - Math.min(ddMaxHeight, $dd.outerHeight());
- dir = "up";
- } else {
- ddMaxHeight = o.maxHeight ? o.maxHeight : "none";
- ddY = bottomOffset;
- dir = "down";
- }
-
- ml = ("" + $("body").css("margin-left")).match(/^\d+/) ? $("body").css("margin-left") : 0;
- mt = ("" + $("body").css("margin-top")).match(/^\d+/) ? $("body").css("margin-top") : 0;
- bodyX = $().jquery >= "1.4.2"
- ? parseInt(ml)
- : $("body").offset().left;
- bodyY = $().jquery >= "1.4.2"
- ? parseInt(mt)
- : $("body").offset().top;
-
-
- // modify dropdown css for display
- $dd.hide().css({
- left: ddX + ($ddCtx.is("body") ? bodyX : 0),
- maxHeight: ddMaxHeight,
- position: "absolute",
- top: ddY + ($ddCtx.is("body") ? bodyY : 0),
- visibility: "visible"
- });
- if(dir === "up") {
- $dd.addClass("above");
- }
- return dir;
- };
-
- // when the user explicitly clicks the display
- clickSB = function( e ) {
- if($sb.is(".open")) {
- closeSB();
- } else {
- openSB();
- }
- return false;
- };
-
- // when the user selects an item in any manner
- selectItem = function() {
- var $item = $(this),
- oldVal = $orig.val(),
- newVal = $item.data("value");
-
- // update the original <select>
- $orig.find("option").each(function() { this.selected = false; });
- $($item.data("orig")).each(function() { this.selected = true; });
-
- // change the selection to this item
- $items.removeClass("selected");
- $item.addClass("selected");
- $sb.attr("aria-active-descendant", $item.attr("id"));
-
- // update the title attr and the display markup
- $display.find(".text").attr("title", $item.find(".text").html());
- $display.find(".text").html(o.displayFormat.call($item.data("orig")));
-
- // trigger change on the old <select> if necessary
- if(oldVal !== newVal) {
- $orig.change();
- }
- };
-
- // when the user explicitly clicks an item
- clickSBItem = function( e ) {
- closeAndUnbind();
- $orig.focus();
- selectItem.call(this);
- return false;
- };
-
- // start over for generating the search term
- clearSearchTerm = function() {
- searchTerm = "";
- };
-
- // iterate over all the options to see if any match the search term
- findMatchingItem = function( term ) {
- var i, t, $tNode,
- $available = getEnabled();
- for(i=0; i < $available.size(); i++) {
- $tNode = $available.eq(i).find(".text");
- t = $tNode.children().size() == 0 ? $tNode.text() : $tNode.find("*").text();
- if(term.length > 0 && t.toLowerCase().match("^" + term.toLowerCase())) {
- return $available.eq(i);
- }
- }
- return null;
- };
-
- // if we get a match for any options, select it
- selectMatchingItem = function( text ) {
- var $matchingItem = findMatchingItem(text);
- if($matchingItem !== null) {
- selectItem.call($matchingItem[0]);
- return true;
- }
- return false;
- };
-
- // stop up/down/backspace/space from moving the page
- stopPageHotkeys = function( e ) {
- if(e.ctrlKey || e.altKey) {
- return;
- }
- if(e.which === 38 || e.which === 40 || e.which === 8 || e.which === 32) {
- e.preventDefault();
- }
- };
-
- // if a normal match fails, try matching the next element that starts with the pressed letter
- selectNextItemStartsWith = function( c ) {
- var i, t,
- $selected = getSelected(),
- $available = getEnabled();
- for(i = $available.index($selected) + 1; i < $available.size(); i++) {
- t = $available.eq(i).find(".text").text();
- if(t !== "" && t.substring(0,1).toLowerCase() === c.toLowerCase()) {
- selectItem.call($available.eq(i)[0]);
- return true;
- }
- }
- return false;
- };
-
- // go up/down using arrows or attempt to autocomplete based on string
- keydownSB = function( e ) {
- if(e.altKey || e.ctrlKey) {
- return false;
- }
- var $selected = getSelected(),
- $enabled = getEnabled();
- switch(e.which) {
- case 9: // tab
- closeSB();
- blurSB();
- break;
- case 35: // end
- if($selected.size() > 0) {
- e.preventDefault();
- selectItem.call($enabled.filter(":last")[0]);
- centerOnSelected();
- }
- break;
- case 36: // home
- if($selected.size() > 0) {
- e.preventDefault();
- selectItem.call($enabled.filter(":first")[0]);
- centerOnSelected();
- }
- break;
- case 38: // up
- if($selected.size() > 0) {
- if($enabled.filter(":first")[0] !== $selected[0]) {
- e.preventDefault();
- selectItem.call($enabled.eq($enabled.index($selected)-1)[0]);
- }
- centerOnSelected();
- }
- break;
- case 40: // down
- if($selected.size() > 0) {
- if($enabled.filter(":last")[0] !== $selected[0]) {
- e.preventDefault();
- selectItem.call($enabled.eq($enabled.index($selected)+1)[0]);
- centerOnSelected();
- }
- } else if($items.size() > 1) {
- e.preventDefault();
- selectItem.call($items.eq(0)[0]);
- }
- break;
- default:
- break;
- }
- };
-
- // the user is typing -- try to select an item based on what they press
- keyupSB = function( e ) {
- if(e.altKey || e.ctrlKey) {
- return false;
- }
- if(e.which !== 38 && e.which !== 40) {
-
- // add to the search term
- searchTerm += String.fromCharCode(e.keyCode);
-
- if(selectMatchingItem(searchTerm)) {
-
- // we found a match, continue with the current search term
- clearTimeout(cstTimeout);
- cstTimeout = setTimeout(clearSearchTerm, o.acTimeout);
-
- } else if(selectNextItemStartsWith(String.fromCharCode(e.keyCode))) {
-
- // we selected the next item that starts with what you just pressed
- centerOnSelected();
- clearTimeout(cstTimeout);
- cstTimeout = setTimeout(clearSearchTerm, o.acTimeout);
-
- } else {
-
- // no matches were found, clear everything
- clearSearchTerm();
- clearTimeout(cstTimeout);
-
- }
- }
- };
-
- // when the sb is focused (by tab or click), allow hotkey selection and kill all other selectboxes
- focusSB = function() {
- closeAllButMe();
- $sb.addClass("focused");
- $(document)
- .click(closeAndUnbind)
- .keyup(keyupSB)
- .keypress(stopPageHotkeys)
- .keydown(stopPageHotkeys)
- .keydown(keydownSB);
- };
-
- // when the sb is blurred (by tab or click), disable hotkey selection
- blurSB = function() {
- $sb.removeClass("focused");
- $display.removeClass("active");
- $(document)
- .unbind("keyup", keyupSB)
- .unbind("keydown", stopPageHotkeys)
- .unbind("keypress", stopPageHotkeys)
- .unbind("keydown", keydownSB);
- };
-
- // add hover class to an element
- addHoverState = function() {
- $(this).addClass("hover");
- };
-
- // remove hover class from an element
- removeHoverState = function() {
- $(this).removeClass("hover");
- };
-
- // add active class to the display
- addActiveState = function() {
- $display.addClass("active");
- $(document).bind("mouseup", removeActiveState);
- };
-
- // remove active class from an element
- removeActiveState = function() {
- $display.removeClass("active");
- $(document).unbind("mouseup", removeActiveState);
- };
-
- // constructor
- this.init = function( opts ) {
-
- // this plugin is not compatible with IE6 and below;
- // a normal <select> will be displayed for old browsers
- if($.browser.msie && $.browser.version < 7) {
- return;
- }
-
- // get the original <select> and <label>
- $orig = $(this.elem);
- if($orig.attr("id")) {
- $label = $("label[for='" + $orig.attr("id") + "']:first");
- }
- if(!$label || $label.size() === 0) {
- $label = $orig.closest("label");
- }
-
- // don't create duplicate SBs
- if($orig.hasClass("has_sb")) {
- return;
- }
-
- // set the various options
- o = $.extend({
- acTimeout: 800, // time between each keyup for the user to create a search string
- animDuration: 200, // time to open/close dropdown in ms
- ddCtx: 'body', // body | self | any selector | a function that returns a selector (the original select is the context)
- dropupThreshold: 150, // the minimum amount of extra space required above the selectbox for it to display a dropup
- fixedWidth: false, // if false, dropdown expands to widest and display conforms to whatever is selected
- maxHeight: false, // if an integer, show scrollbars if the dropdown is too tall
- maxWidth: false, // if an integer, prevent the display/dropdown from growing past this width; longer items will be clipped
- selectboxClass: 'selectbox', // class to apply our markup
- useTie: false, // if jquery.tie is included and this is true, the selectbox will update dynamically
-
- // markup appended to the display, typically for styling an arrow
- arrowMarkup: "<div class='arrow_btn'><span class='arrow'></span></div>",
-
- // use optionFormat by default
- displayFormat: undefined,
-
- // formatting for the display; note that it will be wrapped with <a href='#'><span class='text'></span></a>
- optionFormat: function( ogIndex, optIndex ) {
- if($(this).size() > 0) {
- var label = $(this).attr("label");
- if(label && label.length > 0) {
- return label;
- }
- return $(this).text();
- } else {
- return "";
- }
- },
-
- // the function to produce optgroup markup
- optgroupFormat: function( ogIndex ) {
- return "<span class='label'>" + $(this).attr("label") + "</span>";
- }
- }, opts);
- o.displayFormat = o.displayFormat || o.optionFormat;
-
- // generate the new sb
- loadSB();
- };
-
- // public method interface
- this.open = openSB;
- this.close = closeSB;
- this.refresh = reloadSB;
- this.destroy = destroySB;
- this.options = function( opts ) {
- o = $.extend(o, opts);
- reloadSB();
- };
- };
-
- $.proto("sb", SelectBox);
-
-}(jQuery, window));
\ No newline at end of file
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+(function( $, window, undefined ) {
+ // utility functions
+ $.fn.borderWidth = function() { return $(this).outerWidth() - $(this).innerWidth(); };
+ $.fn.paddingWidth = function() { return $(this).innerWidth() - $(this).width(); };
+ $.fn.extraWidth = function() { return $(this).outerWidth(true) - $(this).width(); };
+ $.fn.offsetFrom = function( e ) {
+ var $e = $(e);
+ return {
+ left: $(this).offset().left - $e.offset().left,
+ top: $(this).offset().top - $e.offset().top
+ };
+ };
+ $.fn.maxWidth = function() {
+ var max = 0;
+ $(this).each(function() {
+ if($(this).width() > max) {
+ max = $(this).width();
+ }
+ });
+ return max;
+ };
+ $.fn.triggerAll = function(event, params) {
+ return $(this).each(function() {
+ $(this).triggerHandler(event, params);
+ });
+ };
+ var aps = Array.prototype.slice,
+ randInt = function() {
+ return Math.floor(Math.random() * 999999999);
+ };
+
+ // jQuery-Proto
+ $.proto = function() {
+ var name = arguments[0], // The name of the jQuery function that will be called
+ clazz = arguments[1], // A reference to the class that you are associating
+ klazz = clazz, // A version of clazz with a delayed constructor
+ extOpt = {}, // used to extend clazz with a variable name for the init function
+ undefined; // safety net
+
+ opts = $.extend({
+ elem: "elem", // the property name on the object that will be set to the current jQuery context
+ access: "access", // the name of the access function to be set on the object
+ init: "init", // the name of the init function to be set on the object
+ instantAccess: false // when true, treat all args as access args (ignore constructor args) and allow construct/function call at the same time
+ }, arguments[2]);
+
+ if(clazz._super) {
+ extOpt[opts.init] = function(){};
+ klazz = clazz.extend(extOpt);
+ }
+
+ $.fn[name] = function() {
+ var result, args = arguments;
+
+ $(this).each(function() {
+ var $e = $(this),
+ obj = $e.data(name),
+ isNew = !obj;
+
+ // if the object is not defined for this element, then construct
+ if(isNew) {
+
+ // create the new object and restore init if necessary
+ obj = new klazz();
+ if(clazz._super) {
+ obj[opts.init] = clazz.prototype.init;
+ }
+
+ // set the elem property and initialize the object
+ obj[opts.elem] = $e[0];
+ if(obj[opts.init]) {
+ obj[opts.init].apply(obj, opts.instantAccess ? [] : aps.call(args, 0));
+ }
+
+ // associate it with the element
+ $e.data(name, obj);
+
+ }
+
+ // if it is defined or we allow instance access, then access
+ if(!isNew || opts.instantAccess) {
+
+ // call the access function if it exists (allows lazy loading)
+ if(obj[opts.access]) {
+ obj[opts.access].apply(obj, aps.call(args, 0));
+ }
+
+ // do something with the object
+ if(args.length > 0) {
+
+ if($.isFunction(obj[args[0]])) {
+
+ // use the method access interface
+ result = obj[args[0]].apply(obj, aps.call(args, 1));
+
+ } else if(args.length === 1) {
+
+ // just retrieve the property (leverage deep access with getObject if we can)
+ if($.getObject) {
+ result = $.getObject(args[0], obj);
+ } else {
+ result = obj[args[0]];
+ }
+
+ } else {
+
+ // set the property (leverage deep access with setObject if we can)
+ if($.setObject) {
+ $.setObject(args[0], args[1], obj);
+ } else {
+ obj[args[0]] = args[1];
+ }
+
+ }
+
+ } else if(result === undefined) {
+
+ // return the first object if there are no args
+ result = $e.data(name);
+
+ }
+ }
+ });
+
+ // chain if no results were returned from the clazz's method (it's a setter)
+ if(result === undefined) {
+ return $(this);
+ }
+
+ // return the first result if not chaining
+ return result;
+ };
+ };
+
+ var falseFunc = function() {
+ return false;
+ },
+ SelectBox = function() {
+
+ var self = this,
+ o = {},
+ $orig = null,
+ $label = null,
+ $sb = null,
+ $display = null,
+ $dd = null,
+ $items = null,
+ searchTerm = "",
+ cstTimeout = null,
+ delayReloadTimeout = null,
+ resizeTimeout = null,
+
+ // functions
+ loadSB,
+ createOption,
+ focusOrig,
+ blurOrig,
+ destroySB,
+ reloadSB,
+ delayReloadSB,
+ openSB,
+ centerOnSelected,
+ closeSB,
+ positionSB,
+ positionSBIfOpen,
+ delayPositionSB,
+ clickSB,
+ clickSBItem,
+ keyupSB,
+ keydownSB,
+ focusSB,
+ blurSB,
+ addHoverState,
+ removeHoverState,
+ addActiveState,
+ removeActiveState,
+ getDDCtx,
+ getSelected,
+ getEnabled,
+ selectItem,
+ clearSearchTerm,
+ findMatchingItem,
+ selectMatchingItem,
+ selectNextItemStartsWith,
+ closeAll,
+ closeAllButMe,
+ closeAndUnbind,
+ blurAllButMe,
+ stopPageHotkeys,
+ flickerDisplay,
+ unbind;
+
+ loadSB = function() {
+
+ // create the new sb
+ $sb = $("<div class='sb " + o.selectboxClass + " " + $orig.attr("class") + "' id='sb" + randInt() + "'></div>")
+ .attr("role", "listbox")
+ .attr("aria-has-popup", "true")
+ .attr("aria-labelledby", $label.attr("id") ? $label.attr("id") : "");
+ $("body").append($sb);
+
+ // generate the display markup
+ var displayMarkup = $orig.children().size() > 0
+ ? o.displayFormat.call($orig.find("option:selected")[0], 0, 0)
+ : " ";
+ $display = $("<div class='display " + $orig.attr("class") + "' id='sbd" + randInt() + "'></div>")
+ .append($("<div class='text'></div>").append(displayMarkup))
+ .append(o.arrowMarkup);
+ $sb.append($display);
+
+ // generate the dropdown markup
+ $dd = $("<ul class='" + o.selectboxClass + " items " + $orig.attr("class") + "' role='menu' id='sbdd" + randInt() + "'></ul>")
+ .attr("aria-hidden", "true");
+ $sb.append($dd)
+ .attr("aria-owns", $dd.attr("id"));
+ if($orig.children().size() === 0) {
+ $dd.append(createOption().addClass("selected"));
+ } else {
+ $orig.children().each(function( i ) {
+ var $opt, $og, $ogItem, $ogList;
+ if($(this).is("optgroup")) {
+ $og = $(this);
+ $ogItem = $("<li class='optgroup'>" + o.optgroupFormat.call($og[0], i+1) + "</li>")
+ .addClass($og.is(":disabled") ? "disabled" : "")
+ .attr("aria-disabled", $og.is(":disabled") ? "true" : "");
+ $ogList = $("<ul class='items'></ul>");
+ $ogItem.append($ogList);
+ $dd.append($ogItem);
+ $og.children("option").each(function() {
+ $opt = createOption($(this), i)
+ .addClass($og.is(":disabled") ? "disabled" : "")
+ .attr("aria-disabled", $og.is(":disabled") ? "true" : "");
+ $ogList.append($opt);
+ });
+ } else {
+ $dd.append(createOption($(this), i));
+ }
+ });
+ }
+
+ // cache all sb items
+ $items = $dd.find("li").not(".optgroup");
+
+ // for accessibility/styling
+ $sb.attr("aria-active-descendant", $items.filter(".selected").attr("id"));
+ $dd.children(":first").addClass("first");
+ $dd.children(":last").addClass("last");
+
+ // modify width based on fixedWidth/maxWidth options
+ if(!o.fixedWidth) {
+ var largestWidth = $dd.find(".text, .optgroup").maxWidth() + $display.extraWidth() + 1;
+ $sb.width(o.maxWidth ? Math.min(o.maxWidth, largestWidth) : largestWidth);
+ } else if(o.maxWidth && $sb.width() > o.maxWidth) {
+ $sb.width(o.maxWidth);
+ }
+
+ // place the new markup in its semantic location (hide/show fixes positioning bugs)
+ $orig.before($sb).addClass("has_sb").hide().show();
+
+ // these two lines fix a div/span display bug on load in ie7
+ positionSB();
+ flickerDisplay();
+
+ // hide the dropdown now that it's initialized
+ $dd.hide();
+
+ // bind events
+ if(!$orig.is(":disabled")) {
+ $orig
+ .bind("blur.sb", blurOrig)
+ .bind("focus.sb", focusOrig);
+ $display
+ .mouseup(addActiveState)
+ .mouseup(clickSB)
+ .click(falseFunc)
+ .focus(focusSB)
+ .blur(blurSB)
+ .hover(addHoverState, removeHoverState);
+ getEnabled()
+ .click(clickSBItem)
+ .hover(addHoverState, removeHoverState);
+ $dd.find(".optgroup")
+ .hover(addHoverState, removeHoverState)
+ .click(falseFunc);
+ $items.filter(".disabled")
+ .click(falseFunc);
+ if(!$.browser.msie || $.browser.version >= 9) {
+ $(window).resize($.throttle ? $.throttle(100, positionSBIfOpen) : delayPositionSB);
+ }
+ } else {
+ $sb.addClass("disabled").attr("aria-disabled");
+ $display.click(function( e ) { e.preventDefault(); });
+ }
+
+ // bind custom events
+ $sb.bind("close.sb", closeSB).bind("destroy.sb", destroySB);
+ $orig.bind("reload.sb", reloadSB);
+ if($.fn.tie && o.useTie) {
+ $orig.bind("domupdate.sb", delayReloadSB);
+ }
+ };
+
+ delayPositionSB = function() {
+ clearTimeout(resizeTimeout);
+ resizeTimeout = setTimeout(positionSBIfOpen, 50);
+ };
+
+ positionSBIfOpen = function() {
+ if($sb.is(".open")) {
+ positionSB();
+ openSB(true);
+ }
+ }
+
+ // create new markup from an <option>
+ createOption = function( $option, index ) {
+ if(!$option) {
+ $option = $("<option value=''> </option>");
+ index = 0;
+ }
+ var $li = $("<li id='sbo" + randInt() + "'></li>")
+ .attr("role", "option")
+ .data("orig", $option[0])
+ .data("value", $option ? $option.attr("value") : "")
+ .addClass($option.is(":selected") ? "selected" : "")
+ .addClass($option.is(":disabled") ? "disabled" : "")
+ .attr("aria-disabled", $option.is(":disabled") ? "true" : ""),
+ $inner = $("<div class='item'></div>"),
+ $text = $("<div class='text'></div>")
+ .html(o.optionFormat.call($option[0], 0, index + 1));
+ return $li.append($inner.append($text));
+ };
+
+ // causes focus if original is focused
+ focusOrig = function() {
+ blurAllButMe();
+ $display.triggerHandler("focus");
+ };
+
+ // loses focus if original is blurred
+ blurOrig = function() {
+ if(!$sb.is(".open")) {
+ $display.triggerHandler("blur");
+ }
+ };
+
+ // unbind and remove
+ destroySB = function( internal ) {
+ $sb.remove();
+ $orig
+ .unbind(".sb")
+ .removeClass("has_sb");
+ $(window).unbind("resize", delayPositionSB);
+ if(!internal) {
+ $orig.removeData("sb");
+ }
+ };
+
+ // destroy then load, maintaining open/focused state if applicable
+ reloadSB = function() {
+ var isOpen = $sb.is(".open"),
+ isFocused = $display.is(".focused");
+ closeSB(true);
+ destroySB(true);
+ self.init(o);
+ if(isOpen) {
+ $orig.focus();
+ openSB(true);
+ } else if(isFocused) {
+ $orig.focus();
+ }
+ };
+
+ // debouncing when useTie === true
+ delayReloadSB = function() {
+ clearTimeout(delayReloadTimeout);
+ delayReloadTimeout = setTimeout(reloadSB, 30);
+ };
+
+ // when the user clicks outside the sb
+ closeAndUnbind = function() {
+ $sb.removeClass("focused");
+ closeSB();
+ unbind();
+ };
+
+ unbind = function() {
+ $(document)
+ .unbind("click", closeAndUnbind)
+ .unbind("keyup", keyupSB)
+ .unbind("keypress", stopPageHotkeys)
+ .unbind("keydown", stopPageHotkeys)
+ .unbind("keydown", keydownSB);
+ };
+
+ // trigger all sbs to close
+ closeAll = function() {
+ $(".sb.open." + o.selectboxClass).triggerAll("close");
+ };
+
+ // trigger all sbs to blur
+ blurAllButMe = function() {
+ $(".sb.focused." + o.selectboxClass).not($sb[0]).find(".display").blur();
+ };
+
+ // to prevent multiple selects open at once
+ closeAllButMe = function() {
+ $(".sb.open." + o.selectboxClass).not($sb[0]).triggerAll("close");
+ };
+
+ // hide and reset dropdown markup
+ closeSB = function( instantClose ) {
+ if($sb.is(".open")) {
+ $display.blur();
+ $items.removeClass("hover");
+ unbind();
+ $dd.attr("aria-hidden", "true");
+ if(instantClose === true) {
+ $dd.hide();
+ $sb.removeClass("open");
+ $sb.append($dd);
+ } else {
+ $dd.fadeOut(o.animDuration, function() {
+ $sb.removeClass("open");
+ $sb.append($dd);
+ });
+ }
+ }
+ };
+
+ // since the context can change, we should get it dynamically
+ getDDCtx = function() {
+ var $ddCtx = null;
+ if(o.ddCtx === "self") {
+ $ddCtx = $sb;
+ } else if($.isFunction(o.ddCtx)) {
+ $ddCtx = $(o.ddCtx.call($orig[0]));
+ } else {
+ $ddCtx = $(o.ddCtx);
+ }
+ return $ddCtx;
+ };
+
+ // DRY
+ getSelected = function() {
+ return $items.filter(".selected");
+ };
+
+ // DRY
+ getEnabled = function() {
+ return $items.not(".disabled");
+ };
+
+ // reposition the scroll of the dropdown so the selected option is centered (or appropriately onscreen)
+ centerOnSelected = function() {
+ $dd.scrollTop($dd.scrollTop() + getSelected().offsetFrom($dd).top - $dd.height() / 2 + getSelected().outerHeight(true) / 2);
+ };
+
+ flickerDisplay = function() {
+ if($.browser.msie && $.browser.version < 8) {
+ $("." + o.selectboxClass + " .display").hide().show(); // fix ie7 display bug
+ }
+ };
+
+ // show, reposition, and reset dropdown markup
+ openSB = function( instantOpen ) {
+ var dir,
+ $ddCtx = getDDCtx();
+ blurAllButMe();
+ $sb.addClass("open");
+ $ddCtx.append($dd);
+ dir = positionSB();
+ $dd.attr("aria-hidden", "false");
+ if(instantOpen === true) {
+ $dd.show();
+ centerOnSelected();
+ } else if(dir === "down") {
+ $dd.slideDown(o.animDuration, centerOnSelected);
+ } else {
+ $dd.fadeIn(o.animDuration, centerOnSelected);
+ }
+ $orig.focus();
+ };
+
+ // position dropdown based on collision detection
+ positionSB = function() {
+ var $ddCtx = getDDCtx(),
+ ddMaxHeight = 0,
+ ddX = $display.offsetFrom($ddCtx).left,
+ ddY = 0,
+ dir = "",
+ ml, mt,
+ bottomSpace, topSpace,
+ bottomOffset, spaceDiff,
+ bodyX, bodyY;
+
+ // modify dropdown css for getting values
+ $dd.removeClass("above");
+ $dd.show().css({
+ maxHeight: "none",
+ position: "relative",
+ visibility: "hidden"
+ });
+ if(!o.fixedWidth) {
+ $dd.width($display.outerWidth() - $dd.extraWidth() + 1);
+ }
+
+ // figure out if we should show above/below the display box
+ bottomSpace = $(window).scrollTop() + $(window).height() - $display.offset().top - $display.outerHeight();
+ topSpace = $display.offset().top - $(window).scrollTop();
+ bottomOffset = $display.offsetFrom($ddCtx).top + $display.outerHeight();
+ spaceDiff = bottomSpace - topSpace + o.dropupThreshold;
+ if($dd.outerHeight() < bottomSpace) {
+ ddMaxHeight = o.maxHeight ? o.maxHeight : bottomSpace;
+ ddY = bottomOffset;
+ dir = "down";
+ } else if($dd.outerHeight() < topSpace) {
+ ddMaxHeight = o.maxHeight ? o.maxHeight : topSpace;
+ ddY = $display.offsetFrom($ddCtx).top - Math.min(ddMaxHeight, $dd.outerHeight());
+ dir = "up";
+ } else if(spaceDiff >= 0) {
+ ddMaxHeight = o.maxHeight ? o.maxHeight : bottomSpace;
+ ddY = bottomOffset;
+ dir = "down";
+ } else if(spaceDiff < 0) {
+ ddMaxHeight = o.maxHeight ? o.maxHeight : topSpace;
+ ddY = $display.offsetFrom($ddCtx).top - Math.min(ddMaxHeight, $dd.outerHeight());
+ dir = "up";
+ } else {
+ ddMaxHeight = o.maxHeight ? o.maxHeight : "none";
+ ddY = bottomOffset;
+ dir = "down";
+ }
+
+ ml = ("" + $("body").css("margin-left")).match(/^\d+/) ? $("body").css("margin-left") : 0;
+ mt = ("" + $("body").css("margin-top")).match(/^\d+/) ? $("body").css("margin-top") : 0;
+ bodyX = $().jquery >= "1.4.2"
+ ? parseInt(ml)
+ : $("body").offset().left;
+ bodyY = $().jquery >= "1.4.2"
+ ? parseInt(mt)
+ : $("body").offset().top;
+
+
+ // modify dropdown css for display
+ $dd.hide().css({
+ left: ddX + ($ddCtx.is("body") ? bodyX : 0),
+ maxHeight: ddMaxHeight,
+ position: "absolute",
+ top: ddY + ($ddCtx.is("body") ? bodyY : 0),
+ visibility: "visible"
+ });
+ if(dir === "up") {
+ $dd.addClass("above");
+ }
+ return dir;
+ };
+
+ // when the user explicitly clicks the display
+ clickSB = function( e ) {
+ if($sb.is(".open")) {
+ closeSB();
+ } else {
+ openSB();
+ }
+ return false;
+ };
+
+ // when the user selects an item in any manner
+ selectItem = function() {
+ var $item = $(this),
+ oldVal = $orig.val(),
+ newVal = $item.data("value");
+
+ // update the original <select>
+ $orig.find("option").each(function() { this.selected = false; });
+ $($item.data("orig")).each(function() { this.selected = true; });
+
+ // change the selection to this item
+ $items.removeClass("selected");
+ $item.addClass("selected");
+ $sb.attr("aria-active-descendant", $item.attr("id"));
+
+ // update the title attr and the display markup
+ $display.find(".text").attr("title", $item.find(".text").html());
+ $display.find(".text").html(o.displayFormat.call($item.data("orig")));
+
+ // trigger change on the old <select> if necessary
+ if(oldVal !== newVal) {
+ $orig.change();
+ }
+ };
+
+ // when the user explicitly clicks an item
+ clickSBItem = function( e ) {
+ closeAndUnbind();
+ $orig.focus();
+ selectItem.call(this);
+ return false;
+ };
+
+ // start over for generating the search term
+ clearSearchTerm = function() {
+ searchTerm = "";
+ };
+
+ // iterate over all the options to see if any match the search term
+ findMatchingItem = function( term ) {
+ var i, t, $tNode,
+ $available = getEnabled();
+ for(i=0; i < $available.size(); i++) {
+ $tNode = $available.eq(i).find(".text");
+ t = $tNode.children().size() == 0 ? $tNode.text() : $tNode.find("*").text();
+ if(term.length > 0 && t.toLowerCase().match("^" + term.toLowerCase())) {
+ return $available.eq(i);
+ }
+ }
+ return null;
+ };
+
+ // if we get a match for any options, select it
+ selectMatchingItem = function( text ) {
+ var $matchingItem = findMatchingItem(text);
+ if($matchingItem !== null) {
+ selectItem.call($matchingItem[0]);
+ return true;
+ }
+ return false;
+ };
+
+ // stop up/down/backspace/space from moving the page
+ stopPageHotkeys = function( e ) {
+ if(e.ctrlKey || e.altKey) {
+ return;
+ }
+ if(e.which === 38 || e.which === 40 || e.which === 8 || e.which === 32) {
+ e.preventDefault();
+ }
+ };
+
+ // if a normal match fails, try matching the next element that starts with the pressed letter
+ selectNextItemStartsWith = function( c ) {
+ var i, t,
+ $selected = getSelected(),
+ $available = getEnabled();
+ for(i = $available.index($selected) + 1; i < $available.size(); i++) {
+ t = $available.eq(i).find(".text").text();
+ if(t !== "" && t.substring(0,1).toLowerCase() === c.toLowerCase()) {
+ selectItem.call($available.eq(i)[0]);
+ return true;
+ }
+ }
+ return false;
+ };
+
+ // go up/down using arrows or attempt to autocomplete based on string
+ keydownSB = function( e ) {
+ if(e.altKey || e.ctrlKey) {
+ return false;
+ }
+ var $selected = getSelected(),
+ $enabled = getEnabled();
+ switch(e.which) {
+ case 9: // tab
+ closeSB();
+ blurSB();
+ break;
+ case 35: // end
+ if($selected.size() > 0) {
+ e.preventDefault();
+ selectItem.call($enabled.filter(":last")[0]);
+ centerOnSelected();
+ }
+ break;
+ case 36: // home
+ if($selected.size() > 0) {
+ e.preventDefault();
+ selectItem.call($enabled.filter(":first")[0]);
+ centerOnSelected();
+ }
+ break;
+ case 38: // up
+ if($selected.size() > 0) {
+ if($enabled.filter(":first")[0] !== $selected[0]) {
+ e.preventDefault();
+ selectItem.call($enabled.eq($enabled.index($selected)-1)[0]);
+ }
+ centerOnSelected();
+ }
+ break;
+ case 40: // down
+ if($selected.size() > 0) {
+ if($enabled.filter(":last")[0] !== $selected[0]) {
+ e.preventDefault();
+ selectItem.call($enabled.eq($enabled.index($selected)+1)[0]);
+ centerOnSelected();
+ }
+ } else if($items.size() > 1) {
+ e.preventDefault();
+ selectItem.call($items.eq(0)[0]);
+ }
+ break;
+ default:
+ break;
+ }
+ };
+
+ // the user is typing -- try to select an item based on what they press
+ keyupSB = function( e ) {
+ if(e.altKey || e.ctrlKey) {
+ return false;
+ }
+ if(e.which !== 38 && e.which !== 40) {
+
+ // add to the search term
+ searchTerm += String.fromCharCode(e.keyCode);
+
+ if(selectMatchingItem(searchTerm)) {
+
+ // we found a match, continue with the current search term
+ clearTimeout(cstTimeout);
+ cstTimeout = setTimeout(clearSearchTerm, o.acTimeout);
+
+ } else if(selectNextItemStartsWith(String.fromCharCode(e.keyCode))) {
+
+ // we selected the next item that starts with what you just pressed
+ centerOnSelected();
+ clearTimeout(cstTimeout);
+ cstTimeout = setTimeout(clearSearchTerm, o.acTimeout);
+
+ } else {
+
+ // no matches were found, clear everything
+ clearSearchTerm();
+ clearTimeout(cstTimeout);
+
+ }
+ }
+ };
+
+ // when the sb is focused (by tab or click), allow hotkey selection and kill all other selectboxes
+ focusSB = function() {
+ closeAllButMe();
+ $sb.addClass("focused");
+ $(document)
+ .click(closeAndUnbind)
+ .keyup(keyupSB)
+ .keypress(stopPageHotkeys)
+ .keydown(stopPageHotkeys)
+ .keydown(keydownSB);
+ };
+
+ // when the sb is blurred (by tab or click), disable hotkey selection
+ blurSB = function() {
+ $sb.removeClass("focused");
+ $display.removeClass("active");
+ $(document)
+ .unbind("keyup", keyupSB)
+ .unbind("keydown", stopPageHotkeys)
+ .unbind("keypress", stopPageHotkeys)
+ .unbind("keydown", keydownSB);
+ };
+
+ // add hover class to an element
+ addHoverState = function() {
+ $(this).addClass("hover");
+ };
+
+ // remove hover class from an element
+ removeHoverState = function() {
+ $(this).removeClass("hover");
+ };
+
+ // add active class to the display
+ addActiveState = function() {
+ $display.addClass("active");
+ $(document).bind("mouseup", removeActiveState);
+ };
+
+ // remove active class from an element
+ removeActiveState = function() {
+ $display.removeClass("active");
+ $(document).unbind("mouseup", removeActiveState);
+ };
+
+ // constructor
+ this.init = function( opts ) {
+
+ // this plugin is not compatible with IE6 and below;
+ // a normal <select> will be displayed for old browsers
+ if($.browser.msie && $.browser.version < 7) {
+ return;
+ }
+
+ // get the original <select> and <label>
+ $orig = $(this.elem);
+ if($orig.attr("id")) {
+ $label = $("label[for='" + $orig.attr("id") + "']:first");
+ }
+ if(!$label || $label.size() === 0) {
+ $label = $orig.closest("label");
+ }
+
+ // don't create duplicate SBs
+ if($orig.hasClass("has_sb")) {
+ return;
+ }
+
+ // set the various options
+ o = $.extend({
+ acTimeout: 800, // time between each keyup for the user to create a search string
+ animDuration: 200, // time to open/close dropdown in ms
+ ddCtx: 'body', // body | self | any selector | a function that returns a selector (the original select is the context)
+ dropupThreshold: 150, // the minimum amount of extra space required above the selectbox for it to display a dropup
+ fixedWidth: false, // if false, dropdown expands to widest and display conforms to whatever is selected
+ maxHeight: false, // if an integer, show scrollbars if the dropdown is too tall
+ maxWidth: false, // if an integer, prevent the display/dropdown from growing past this width; longer items will be clipped
+ selectboxClass: 'selectbox', // class to apply our markup
+ useTie: false, // if jquery.tie is included and this is true, the selectbox will update dynamically
+
+ // markup appended to the display, typically for styling an arrow
+ arrowMarkup: "<div class='arrow_btn'><span class='arrow'></span></div>",
+
+ // use optionFormat by default
+ displayFormat: undefined,
+
+ // formatting for the display; note that it will be wrapped with <a href='#'><span class='text'></span></a>
+ optionFormat: function( ogIndex, optIndex ) {
+ if($(this).size() > 0) {
+ var label = $(this).attr("label");
+ if(label && label.length > 0) {
+ return label;
+ }
+ return $(this).text();
+ } else {
+ return "";
+ }
+ },
+
+ // the function to produce optgroup markup
+ optgroupFormat: function( ogIndex ) {
+ return "<span class='label'>" + $(this).attr("label") + "</span>";
+ }
+ }, opts);
+ o.displayFormat = o.displayFormat || o.optionFormat;
+
+ // generate the new sb
+ loadSB();
+ };
+
+ // public method interface
+ this.open = openSB;
+ this.close = closeSB;
+ this.refresh = reloadSB;
+ this.destroy = destroySB;
+ this.options = function( opts ) {
+ o = $.extend(o, opts);
+ reloadSB();
+ };
+ };
+
+ $.proto("sb", SelectBox);
+
+}(jQuery, window));
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemFireDistributedSystem.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemFireDistributedSystem.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemFireDistributedSystem.java
index 70a1d99..82dd66f 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemFireDistributedSystem.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemFireDistributedSystem.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.testbed;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemfireTopology.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemfireTopology.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemfireTopology.java
index d463248..3778f45 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemfireTopology.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/GemfireTopology.java
@@ -1,3 +1,22 @@
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
+ */
+
package com.vmware.gemfire.tools.pulse.testbed;
public class GemfireTopology {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropFileHelper.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropFileHelper.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropFileHelper.java
index 84d7b1a..d1403d4 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropFileHelper.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropFileHelper.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.testbed;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropMockDataUpdater.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropMockDataUpdater.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropMockDataUpdater.java
index d22e33d..cb9d81e 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropMockDataUpdater.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/PropMockDataUpdater.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.testbed;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/TestBed.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/TestBed.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/TestBed.java
index 9638374..a6e547e 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/TestBed.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/TestBed.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.testbed;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/PulseUITest.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/PulseUITest.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/PulseUITest.java
index 8060fae..2d6f2a7 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/PulseUITest.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/PulseUITest.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.testbed.driver;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/TomcatHelper.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/TomcatHelper.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/TomcatHelper.java
index e450a37..d58c7a3 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/TomcatHelper.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/testbed/driver/TomcatHelper.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.testbed.driver;
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatement.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatement.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatement.java
index 0d7fa46..d40afbd 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatement.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatement.java
@@ -1,10 +1,21 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
- */
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
+ */
package com.vmware.gemfire.tools.pulse.tests;
public class AggregateStatement extends JMXBaseBean implements AggregateStatementMBean {
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ec004fc1/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatementMBean.java
----------------------------------------------------------------------
diff --git a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatementMBean.java b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatementMBean.java
index 018221a..baa2b80 100644
--- a/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatementMBean.java
+++ b/gemfire-pulse/src/test/java/com/vmware/gemfire/tools/pulse/tests/AggregateStatementMBean.java
@@ -1,9 +1,20 @@
-/*=========================================================================
- * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved.
- * This product is protected by U.S. and international copyright
- * and intellectual property laws. Pivotal products are covered by
- * one or more patents listed at http://www.pivotal.io/patents.
- *=========================================================================
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one or more
+ * * contributor license agreements. See the NOTICE file distributed with
+ * * this work for additional information regarding copyright ownership.
+ * * The ASF licenses this file to You under the Apache License, Version 2.0
+ * * (the "License"); you may not use this file except in compliance with
+ * * the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ *
*/
package com.vmware.gemfire.tools.pulse.tests;