1/*! 2 * jQuery Selectbox plugin 0.2 3 * 4 * Copyright 2011-2012, Dimitar Ivanov (http://www.bulgaria-web-developers.com/projects/javascript/selectbox/) 5 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. 6 * 7 * Date: Tue Jul 17 19:58:36 2012 +0300 8 */ 9 10 11(function select_box($, undefined) { 12 var PROP_NAME = 'selectbox', 13 FALSE = false, 14 TRUE = true; 15 16 function Selectbox() { 17 this._state = []; 18 this._defaults = { 19 classHolder: "sbHolder", 20 classHolderDisabled: "sbHolderDisabled", 21 classSelector: "sbSelector", 22 classOptions: "sbOptions", 23 classGroup: "sbGroup", 24 classSub: "sbSub", 25 classDisabled: "sbDisabled", 26 classToggleOpen: "sbToggleOpen", 27 classToggle: "sbToggle", 28 classFocus: "sbFocus", 29 speed: 300, 30 effect: "slide", 31 onChange: null, 32 onOpen: null, 33 onClose: null 34 }; 35 } 36 37 $.extend(Selectbox.prototype, { 38 /** 39 * Is the first field in a jQuery collection open as a selectbox 40 * 41 * @param {Object} target 42 * @return {Boolean} 43 */ 44 _isOpenSelectbox: function (target) { 45 if (!target) { 46 return FALSE; 47 } 48 var inst = this._getInst(target); 49 return inst.isOpen; 50 }, 51 /** 52 * Is the first field in a jQuery collection disabled as a selectbox 53 * 54 * @param {HTMLElement} target 55 * @return {Boolean} 56 */ 57 _isDisabledSelectbox: function (target) { 58 if (!target) { 59 return FALSE; 60 } 61 var inst = this._getInst(target); 62 return inst.isDisabled; 63 }, 64 /** 65 * Attach the select box to a jQuery selection. 66 * 67 * @param {HTMLElement} target 68 * @param {Object} settings 69 */ 70 _attachSelectbox: function (target, settings) { 71 if (this._getInst(target)) { 72 return FALSE; 73 } 74 var $target = $(target), 75 self = this, 76 inst = self._newInst($target), 77 sbHolder, sbSelector, sbToggle, sbOptions, 78 s = FALSE, optGroup = $target.find("optgroup"), opts = $target.find("option"), olen = opts.length; 79 80 $target.attr("sb", inst.uid); 81 82 $.extend(inst.settings, self._defaults, settings); 83 self._state[inst.uid] = FALSE; 84 $target.hide(); 85 86 function closeOthers() { 87 var key, sel, 88 uid = this.attr("id").split("_")[1]; 89 for (key in self._state) { 90 if (key !== uid) { 91 if (self._state.hasOwnProperty(key)) { 92 sel = $("select[sb='" + key + "']")[0]; 93 if (sel) { 94 self._closeSelectbox(sel); 95 } 96 } 97 } 98 } 99 } 100 101 sbHolder = $("<div>", { 102 "id": "sbHolder_" + inst.uid, 103 "class": inst.settings.classHolder, 104 "tabindex": $target.attr("tabindex") 105 }); 106 107 sbSelector = $("<a>", { 108 "id": "sbSelector_" + inst.uid, 109 "href": "#", 110 "class": inst.settings.classSelector, 111 "click": function (e) { 112 e.preventDefault(); 113 closeOthers.apply($(this), []); 114 var uid = $(this).attr("id").split("_")[1]; 115 if (self._state[uid]) { 116 self._closeSelectbox(target); 117 } else { 118 self._openSelectbox(target); 119 } 120 } 121 }); 122 123 sbToggle = $("<a>", { 124 "id": "sbToggle_" + inst.uid, 125 "href": "#", 126 "class": inst.settings.classToggle, 127 "click": function (e) { 128 e.preventDefault(); 129 closeOthers.apply($(this), []); 130 var uid = $(this).attr("id").split("_")[1]; 131 if (self._state[uid]) { 132 self._closeSelectbox(target); 133 } else { 134 self._openSelectbox(target); 135 } 136 } 137 }); 138 sbToggle.appendTo(sbHolder); 139 140 sbOptions = $("<ul>", { 141 "id": "sbOptions_" + inst.uid, 142 "class": inst.settings.classOptions, 143 "css": { 144 "display": "none" 145 } 146 }); 147 148 $target.children().each(function(i) { 149 var that = $(this), li, config = {}; 150 if (that.is("option")) { 151 getOptions(i, that); 152 } else if (that.is("optgroup")) { 153 li = $("<li>"); 154 $("<span>", { 155 "text": that.attr("label") 156 }
156).addClass(inst.settings.classGroup).appendTo(li); 157 li.appendTo(sbOptions); 158 if (that.is(":disabled")) { 159 config.disabled = true; 160 } 161 config.sub = true; 162 getOptions(i, that.find("option"), config); 163 } 164 }); 165 166 function getOptions () { 167 var sub = arguments[2] && arguments[2].sub ? true : false, 168 disabled = arguments[2] && arguments[2].disabled ? true : false, 169 i = arguments[0]; 170 arguments[1].each(function () { 171 var that = $(this), 172 li = $("<li>"), 173 child, 174 bgcolor = (i === 0)?"#ffff":"#ffffa0"; 175 176 if (that.is(":selected")) { 177 sbSelector.text(that.text()); 178 sbHolder.css({'background':bgcolor}); 179 s = TRUE; 180 } 181 if (i === olen - 1) { 182 li.addClass("last"); 183 } 184 if (!that.is(":disabled") && !disabled) { 185 // 2014/04/24 k.takeda i¼v_EÚÌCfgÎ start. 186 className = ""; 187 188 189 // 2016/07/12 k.nakayama i¼NbNJEgÎ start. 190 onClick = "$('#sbHolder_" + inst.uid + "').css('background', '').css({'background':'"+bgcolor+"'});"; 191 // 2016/07/12 k.nakayama i¼NbNJEgÎ end. 192 // "012001"©çJn³êéW¦ÔªvalÉÝè³êÄ¢éIvVÌÝðÎÛÆ·é 193 if (that.val().substr(0, "012001".length) === "012001") { 194 if (that.val().length == 9) { 195 className = "dispDepth1"; 196 } 197 else if (that.val().length == 12) { 198 className = "dispDepth2"; 199 // 2016/07/12 k.nakayama i¼NbNJEgÎ start. 200 onClick += "ga_et('2', '" + that.val().substr(6, 6) + "', this.href); return false;" 201 // 2016/07/12 k.nakayama i¼NbNJEgÎ end. 202 } 203 } 204 // 2014/04/24 k.takeda i¼v_EÚÌCfgÎ end. 205 child = $("<a>", { 206 "href": "#" + that.val(), 207 "class": className, 208 // 2016/07/12 k.nakayama i¼NbNJEgÎ start. 209 "onClick": onClick, 210 // 2016/07/12 k.nakayama i¼NbNJEgÎ end. 211 "rel": that.val() 212 }).text(that.text()).bind("click.sb", function (e) { 213 if (e && e.preventDefault) { 214 e.preventDefault(); 215 } 216 var t = sbToggle, 217 $this = $(this), 218 uid = t.attr("id").split("_")[1]; 219 self._changeSelectbox(target, $this.attr("rel"), $this.text()); 220 self._closeSelectbox(target); 221 }).bind("mouseover.sb", function () { 222 var $this = $(this); 223 $this.parent().siblings().find("a").removeClass(inst.settings.classFocus); 224 $this.addClass(inst.settings.classFocus); 225 }).bind("mouseout.sb", function () { 226 $(this).removeClass(inst.settings.classFocus); 227 }); 228 if (sub) { 229 child.addClass(inst.settings.classSub); 230 } 231 if (that.is(":selected")) { 232 child.addClass(inst.settings.classFocus); 233 } 234 child.appendTo(li); 235 } else { 236 child = $("<span>", { 237 "text": that.text() 238 }).addClass(inst.settings.classDisabled); 239 if (sub) { 240 child.addClass(inst.settings.classSub); 241 } 242 child.appendTo(li); 243 } 244 li.appendTo(sbOptions); 245 }); 246 } 247 248 if (!s) { 249 sbSelector.text(opts.first().text()); 250 } 251 252 $.data(target, PROP_NAME, inst); 253 254 sbHolder.data("uid", inst.uid).bind("keydown.sb", function (e) { 255 var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0, 256 $this = $(this), 257 uid = $this.data("uid"), 258 inst = $this.siblings("select[sb='"+uid+"']").data(PROP_NAME), 259 trgt = $this.siblings(["select[sb='", uid, "']"].join("")).get(0), 260 $f = $this.find("ul").find("a." + inst.settings.classFocus); 261 switch (key) { 262 case 37: //Arrow Left 263 case 38: //Arrow Up 264 if ($f.length > 0) { 265 var $next; 266 $("a", $this).removeClass(inst.settings.classFocus); 267 $next = $f.parent().prevAll("li:has(a)").eq(0).find("a"); 268 if ($next.length > 0) { 269 $next.addClass(inst.settings.classFocus).focus(); 270 $("#sbSelector_" + uid).text($next.text()); 271 } 272 } 273 break; 274 case 39: //Arrow Right 275 case 40: //Arrow Down 276 var $next; 277 $("a", $this).removeClass(inst.settings.classFocus); 278 if ($f.length > 0) { 279 $next = $f.parent().nextAll("li:has(a)").eq(0).find("a"); 280 } else { 281 $next = $this.find("ul").find("a").eq(0); 282 } 283 if ($next.length > 0) { 284 $next.addClass(inst.settings.classFocus).focus(); 285 $("#sbSelector_" + uid).text($next.text()); 286 } 287 break; 288 case 13: //Enter 289 if ($f.length > 0) { 290 self._changeSelectbox(trgt, $f.attr("rel"), $f.text()); 291 } 292 self._closeSelectbox(trgt); 293 break; 294 case 9: //Tab 295 if (trgt) { 296 var inst = self._getInst(trgt); 297 if (inst/* && inst.isOpen*/) { 298 if ($f.length > 0) { 299 self._changeSelectbox(trgt, $f.attr("rel"), $f.text()); 300 } 301 self._closeSelectbox(trgt); 302 } 303 } 304 var i = parseInt($this.attr("tabindex"), 10); 305 if (!e.shiftKey) { 306 i++; 307 } else { 308 i--; 309 } 310 $("*[tabindex='" + i + "']").focus(); 311 break; 312 case 27: //Escape 313 self._closeSelectbox(trgt); 314 break; 315 } 316 e.stopPropagation(); 317 return false;
318 }).delegate("a", "mouseover", function (e) { 319 $(this).addClass(inst.settings.classFocus); 320 }).delegate("a", "mouseout", function (e) { 321 $(this).removeClass(inst.settings.classFocus); 322 }); 323 324 sbSelector.appendTo(sbHolder); 325 sbOptions.appendTo(sbHolder); 326 sbHolder.insertAfter($target); 327 328 $("html").live('mousedown', function(e) { 329 e.stopPropagation(); 330 $("select").selectbox('close'); 331 }); 332 $([".", inst.settings.classHolder, ", .", inst.settings.classSelector].join("")).mousedown(function(e) { 333 e.stopPropagation(); 334 }); 335 }, 336 /** 337 * Remove the selectbox functionality completely. This will return the element back to its pre-init state. 338 * 339 * @param {HTMLElement} target 340 */ 341 _detachSelectbox: function (target) { 342 var inst = this._getInst(target); 343 if (!inst) { 344 return FALSE; 345 } 346 $("#sbHolder_" + inst.uid).remove(); 347 $.data(target, PROP_NAME, null); 348 $(target).show(); 349 }, 350 /** 351 * Change selected attribute of the selectbox. 352 * 353 * @param {HTMLElement} target 354 * @param {String} value 355 * @param {String} text 356 */ 357 _changeSelectbox: function (target, value, text) { 358 var onChange, 359 inst = this._getInst(target); 360 if (inst) { 361 onChange = this._get(inst, 'onChange'); 362 $("#sbSelector_" + inst.uid).text(text); 363 } 364 value = value.replace(/\'/g, "\\'"); 365 $(target).find("option[value='" + value + "']").attr("selected", TRUE); 366 if (inst && onChange) { 367 onChange.apply((inst.input ? inst.input[0] : null), [value, inst]); 368 } else if (inst && inst.input) { 369 inst.input.trigger('change'); 370 } 371 }, 372 /** 373 * Enable the selectbox. 374 * 375 * @param {HTMLElement} target 376 */ 377 _enableSelectbox: function (target) { 378 var inst = this._getInst(target); 379 if (!inst || !inst.isDisabled) { 380 return FALSE; 381 } 382 $("#sbHolder_" + inst.uid).removeClass(inst.settings.classHolderDisabled); 383 inst.isDisabled = FALSE; 384 $.data(target, PROP_NAME, inst); 385 }, 386 /** 387 * Disable the selectbox. 388 * 389 * @param {HTMLElement} target 390 */ 391 _disableSelectbox: function (target) { 392 var inst = this._getInst(target); 393 if (!inst || inst.isDisabled) { 394 return FALSE; 395 } 396 $("#sbHolder_" + inst.uid).addClass(inst.settings.classHolderDisabled); 397 inst.isDisabled = TRUE; 398 $.data(target, PROP_NAME, inst); 399 }, 400 /** 401 * Get or set any selectbox option. If no value is specified, will act as a getter. 402 * 403 * @param {HTMLElement} target 404 * @param {String} name 405 * @param {Object} value 406 */ 407 _optionSelectbox: function (target, name, value) { 408 var inst = this._getInst(target); 409 if (!inst) { 410 return FALSE; 411 } 412 //TODO check name 413 inst[name] = value; 414 $.data(target, PROP_NAME, inst); 415 }, 416 /** 417 * Call up attached selectbox 418 * 419 * @param {HTMLElement} target 420 */ 421 _openSelectbox: function (target) { 422 var inst = this._getInst(target); 423 //if (!inst || this._state[inst.uid] || inst.isDisabled) { 424 if (!inst || inst.isOpen || inst.isDisabled) { 425 return; 426 } 427 var el = $("#sbOptions_" + inst.uid), 428 viewportHeight = parseInt($(window).height(), 10), 429 offset = $("#sbHolder_" + inst.uid).offset(), 430 scrollTop = $(window).scrollTop(), 431 height = el.prev().height(), 432 diff = viewportHeight - (offset.top - scrollTop) - height / 2, 433 onOpen = this._get(inst, 'onOpen'); 434 el.css({ 435 "top": height + "px", 436 "maxHeight": (diff - height) + "px" 437 }); 438 inst.settings.effect === "fade" ? el.fadeIn(inst.settings.speed) : el.slideDown(inst.settings.speed); 439 $("#sbToggle_" + inst.uid).addClass(inst.settings.classToggleOpen); 440 this._state[inst.uid] = TRUE; 441 inst.isOpen = TRUE; 442 if (onOpen) { 443 onOpen.apply((inst.input ? inst.input[0] : null), [inst]); 444 } 445 $.data(target, PROP_NAME, inst); 446 }, 447 /** 448 * Close opened selectbox 449 * 450 * @param {HTMLElement} target 451 */ 452 _closeSelectbox: function (target) { 453 var inst = this._getInst(target); 454 //if (!inst || !this._state[inst.uid]) { 455 if (!inst || !inst.isOpen) { 456 return; 457 } 458 var onClose = this._get(inst, 'onClose'); 459 inst.settings.effect === "fade" ? $("#sbOptions_" + inst.uid).fadeOut(inst.settings.speed) : $("#sbOptions_" + inst.uid).slideUp(inst.settings.speed); 460 $("#sbToggle_" + inst.uid).removeClass(inst.settings.classToggleOpen); 461 this._state[inst.uid] = FALSE; 462 inst.isOpen = FALSE; 463 if (onClose) { 464 onClose.apply((inst.input ? inst.input[0] : null), [inst]); 465 } 466 $.data(target, PROP_NAME, inst); 467 }, 468 /** 469 * Create a new instance object 470 * 471 * @param {HTMLElement} target 472 * @return {Object} 473 */ 474 _newInst: function(target) { 475 var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); 476 return { 477 id: id, 478 input: target, 479 uid: Math.floor(Math.random() * 99999999), 480 isOpen: FALSE, 481 isDisabled: FALSE, 482 settings: {} 483 }; 484 }, 485 /** 486 * Retrieve the instance data for the target control. 487 * 488 * @param {HTMLElement} target 489 * @return {Object} - the associated instance data 490 * @throws error if a jQuery problem getting data 491 */ 492 _getInst: function(target) {
493 try { 494 return $.data(target, PROP_NAME); 495 } 496 catch (err) { 497 throw 'Missing instance data for this selectbox'; 498 } 499 }, 500 /** 501 * Get a setting value, defaulting if necessary 502 * 503 * @param {Object} inst 504 * @param {String} name 505 * @return {Mixed} 506 */ 507 _get: function(inst, name) { 508 return inst.settings[name] !== undefined ? inst.settings[name] : this._defaults[name]; 509 } 510 }); 511 512 /** 513 * Invoke the selectbox functionality. 514 * 515 * @param {Object|String} options 516 * @return {Object} 517 */ 518 $.fn.selectbox = function (options) { 519 520 var otherArgs = Array.prototype.slice.call(arguments, 1); 521 if (typeof options == 'string' && options == 'isDisabled') { 522 return $.selectbox['_' + options + 'Selectbox'].apply($.selectbox, [this[0]].concat(otherArgs)); 523 } 524 525 if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') { 526 return $.selectbox['_' + options + 'Selectbox'].apply($.selectbox, [this[0]].concat(otherArgs)); 527 } 528 529 return this.each(function() { 530 typeof options == 'string' ? 531 $.selectbox['_' + options + 'Selectbox'].apply($.selectbox, [this].concat(otherArgs)) : 532 $.selectbox._attachSelectbox(this, options); 533 }); 534 }; 535 536 $.selectbox = new Selectbox(); // singleton instance 537 $.selectbox.version = "0.2"; 538 539})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.