[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 YUI.add('yui2-element', function(Y) { 2 var YAHOO = Y.YUI2; 3 /* 4 Copyright (c) 2011, Yahoo! Inc. All rights reserved. 5 Code licensed under the BSD License: 6 http://developer.yahoo.com/yui/license.html 7 version: 2.9.0 8 */ 9 /** 10 * Provides Attribute configurations. 11 * @namespace YAHOO.util 12 * @class Attribute 13 * @constructor 14 * @param hash {Object} The intial Attribute. 15 * @param {YAHOO.util.AttributeProvider} The owner of the Attribute instance. 16 */ 17 18 YAHOO.util.Attribute = function(hash, owner) { 19 if (owner) { 20 this.owner = owner; 21 this.configure(hash, true); 22 } 23 }; 24 25 YAHOO.util.Attribute.INVALID_VALUE = {}; 26 27 YAHOO.util.Attribute.prototype = { 28 /** 29 * The name of the attribute. 30 * @property name 31 * @type String 32 */ 33 name: undefined, 34 35 /** 36 * The value of the attribute. 37 * @property value 38 * @type String 39 */ 40 value: null, 41 42 /** 43 * The owner of the attribute. 44 * @property owner 45 * @type YAHOO.util.AttributeProvider 46 */ 47 owner: null, 48 49 /** 50 * Whether or not the attribute is read only. 51 * @property readOnly 52 * @type Boolean 53 */ 54 readOnly: false, 55 56 /** 57 * Whether or not the attribute can only be written once. 58 * @property writeOnce 59 * @type Boolean 60 */ 61 writeOnce: false, 62 63 /** 64 * The attribute's initial configuration. 65 * @private 66 * @property _initialConfig 67 * @type Object 68 */ 69 _initialConfig: null, 70 71 /** 72 * Whether or not the attribute's value has been set. 73 * @private 74 * @property _written 75 * @type Boolean 76 */ 77 _written: false, 78 79 /** 80 * A function to call when setting the attribute's value. 81 * The method receives the new value as the first arg and the attribute name as the 2nd 82 * @property method 83 * @type Function 84 */ 85 method: null, 86 87 /** 88 * The function to use when setting the attribute's value. 89 * The setter receives the new value as the first arg and the attribute name as the 2nd 90 * The return value of the setter replaces the value passed to set(). 91 * @property setter 92 * @type Function 93 */ 94 setter: null, 95 96 /** 97 * The function to use when getting the attribute's value. 98 * The getter receives the new value as the first arg and the attribute name as the 2nd 99 * The return value of the getter will be used as the return from get(). 100 * @property getter 101 * @type Function 102 */ 103 getter: null, 104 105 /** 106 * The validator to use when setting the attribute's value. 107 * @property validator 108 * @type Function 109 * @return Boolean 110 */ 111 validator: null, 112 113 /** 114 * Retrieves the current value of the attribute. 115 * @method getValue 116 * @return {any} The current value of the attribute. 117 */ 118 getValue: function() { 119 var val = this.value; 120 121 if (this.getter) { 122 val = this.getter.call(this.owner, this.name, val); 123 } 124 125 return val; 126 }, 127 128 /** 129 * Sets the value of the attribute and fires beforeChange and change events. 130 * @method setValue 131 * @param {Any} value The value to apply to the attribute. 132 * @param {Boolean} silent If true the change events will not be fired. 133 * @return {Boolean} Whether or not the value was set. 134 */ 135 setValue: function(value, silent) { 136 var beforeRetVal, 137 owner = this.owner, 138 name = this.name, 139 invalidValue = YAHOO.util.Attribute.INVALID_VALUE, 140 141 event = { 142 type: name, 143 prevValue: this.getValue(), 144 newValue: value 145 }; 146 147 if (this.readOnly || ( this.writeOnce && this._written) ) { 148 return false; // write not allowed 149 } 150 151 if (this.validator && !this.validator.call(owner, value) ) { 152 return false; // invalid value 153 } 154 155 if (!silent) { 156 beforeRetVal = owner.fireBeforeChangeEvent(event); 157 if (beforeRetVal === false) { 158 return false; 159 } 160 } 161 162 if (this.setter) { 163 value = this.setter.call(owner, value, this.name); 164 if (value === undefined) { 165 } 166 167 if (value === invalidValue) { 168 return false; 169 } 170 } 171 172 if (this.method) { 173 if (this.method.call(owner, value, this.name) === invalidValue) { 174 return false; 175 } 176 } 177 178 this.value = value; // TODO: set before calling setter/method? 179 this._written = true; 180 181 event.type = name; 182 183 if (!silent) { 184 this.owner.fireChangeEvent(event); 185 } 186 187 return true; 188 }, 189 190 /** 191 * Allows for configuring the Attribute's properties. 192 * @method configure 193 * @param {Object} map A key-value map of Attribute properties. 194 * @param {Boolean} init Whether or not this should become the initial config. 195 */ 196 configure: function(map, init) { 197 map = map || {}; 198 199 if (init) { 200 this._written = false; // reset writeOnce 201 } 202 203 this._initialConfig = this._initialConfig || {}; 204 205 for (var key in map) { 206 if ( map.hasOwnProperty(key) ) { 207 this[key] = map[key]; 208 if (init) { 209 this._initialConfig[key] = map[key]; 210 } 211 } 212 } 213 }, 214 215 /** 216 * Resets the value to the initial config value. 217 * @method resetValue 218 * @return {Boolean} Whether or not the value was set. 219 */ 220 resetValue: function() { 221 return this.setValue(this._initialConfig.value); 222 }, 223 224 /** 225 * Resets the attribute config to the initial config state. 226 * @method resetConfig 227 */ 228 resetConfig: function() { 229 this.configure(this._initialConfig, true); 230 }, 231 232 /** 233 * Resets the value to the current value. 234 * Useful when values may have gotten out of sync with actual properties. 235 * @method refresh 236 * @return {Boolean} Whether or not the value was set. 237 */ 238 refresh: function(silent) { 239 this.setValue(this.value, silent); 240 } 241 }; 242 243 (function() { 244 var Lang = YAHOO.util.Lang; 245 246 /* 247 Copyright (c) 2006, Yahoo! Inc. All rights reserved. 248 Code licensed under the BSD License: 249 http://developer.yahoo.net/yui/license.txt 250 */ 251 252 /** 253 * Provides and manages YAHOO.util.Attribute instances 254 * @namespace YAHOO.util 255 * @class AttributeProvider 256 * @uses YAHOO.util.EventProvider 257 */ 258 YAHOO.util.AttributeProvider = function() {}; 259 260 YAHOO.util.AttributeProvider.prototype = { 261 262 /** 263 * A key-value map of Attribute configurations 264 * @property _configs 265 * @protected (may be used by subclasses and augmentors) 266 * @private 267 * @type {Object} 268 */ 269 _configs: null, 270 /** 271 * Returns the current value of the attribute. 272 * @method get 273 * @param {String} key The attribute whose value will be returned. 274 * @return {Any} The current value of the attribute. 275 */ 276 get: function(key){ 277 this._configs = this._configs || {}; 278 var config = this._configs[key]; 279 280 if (!config || !this._configs.hasOwnProperty(key)) { 281 return null; 282 } 283 284 return config.getValue(); 285 }, 286 287 /** 288 * Sets the value of a config. 289 * @method set 290 * @param {String} key The name of the attribute 291 * @param {Any} value The value to apply to the attribute 292 * @param {Boolean} silent Whether or not to suppress change events 293 * @return {Boolean} Whether or not the value was set. 294 */ 295 set: function(key, value, silent){ 296 this._configs = this._configs || {}; 297 var config = this._configs[key]; 298 299 if (!config) { 300 return false; 301 } 302 303 return config.setValue(value, silent); 304 }, 305 306 /** 307 * Returns an array of attribute names. 308 * @method getAttributeKeys 309 * @return {Array} An array of attribute names. 310 */ 311 getAttributeKeys: function(){ 312 this._configs = this._configs; 313 var keys = [], key; 314 315 for (key in this._configs) { 316 if ( Lang.hasOwnProperty(this._configs, key) && 317 !Lang.isUndefined(this._configs[key]) ) { 318 keys[keys.length] = key; 319 } 320 } 321 322 return keys; 323 }, 324 325 /** 326 * Sets multiple attribute values. 327 * @method setAttributes 328 * @param {Object} map A key-value map of attributes 329 * @param {Boolean} silent Whether or not to suppress change events 330 */ 331 setAttributes: function(map, silent){ 332 for (var key in map) { 333 if ( Lang.hasOwnProperty(map, key) ) { 334 this.set(key, map[key], silent); 335 } 336 } 337 }, 338 339 /** 340 * Resets the specified attribute's value to its initial value. 341 * @method resetValue 342 * @param {String} key The name of the attribute 343 * @param {Boolean} silent Whether or not to suppress change events 344 * @return {Boolean} Whether or not the value was set 345 */ 346 resetValue: function(key, silent){ 347 this._configs = this._configs || {}; 348 if (this._configs[key]) { 349 this.set(key, this._configs[key]._initialConfig.value, silent); 350 return true; 351 } 352 return false; 353 }, 354 355 /** 356 * Sets the attribute's value to its current value. 357 * @method refresh 358 * @param {String | Array} key The attribute(s) to refresh 359 * @param {Boolean} silent Whether or not to suppress change events 360 */ 361 refresh: function(key, silent) { 362 this._configs = this._configs || {}; 363 var configs = this._configs; 364 365 key = ( ( Lang.isString(key) ) ? [key] : key ) || 366 this.getAttributeKeys(); 367 368 for (var i = 0, len = key.length; i < len; ++i) { 369 if (configs.hasOwnProperty(key[i])) { 370 this._configs[key[i]].refresh(silent); 371 } 372 } 373 }, 374 375 /** 376 * Adds an Attribute to the AttributeProvider instance. 377 * @method register 378 * @param {String} key The attribute's name 379 * @param {Object} map A key-value map containing the 380 * attribute's properties. 381 * @deprecated Use setAttributeConfig 382 */ 383 register: function(key, map) { 384 this.setAttributeConfig(key, map); 385 }, 386 387 388 /** 389 * Returns the attribute's properties. 390 * @method getAttributeConfig 391 * @param {String} key The attribute's name 392 * @private 393 * @return {object} A key-value map containing all of the 394 * attribute's properties. 395 */ 396 getAttributeConfig: function(key) { 397 this._configs = this._configs || {}; 398 var config = this._configs[key] || {}; 399 var map = {}; // returning a copy to prevent overrides 400 401 for (key in config) { 402 if ( Lang.hasOwnProperty(config, key) ) { 403 map[key] = config[key]; 404 } 405 } 406 407 return map; 408 }, 409 410 /** 411 * Sets or updates an Attribute instance's properties. 412 * @method setAttributeConfig 413 * @param {String} key The attribute's name. 414 * @param {Object} map A key-value map of attribute properties 415 * @param {Boolean} init Whether or not this should become the intial config. 416 */ 417 setAttributeConfig: function(key, map, init) { 418 this._configs = this._configs || {}; 419 map = map || {}; 420 if (!this._configs[key]) { 421 map.name = key; 422 this._configs[key] = this.createAttribute(map); 423 } else { 424 this._configs[key].configure(map, init); 425 } 426 }, 427 428 /** 429 * Sets or updates an Attribute instance's properties. 430 * @method configureAttribute 431 * @param {String} key The attribute's name. 432 * @param {Object} map A key-value map of attribute properties 433 * @param {Boolean} init Whether or not this should become the intial config. 434 * @deprecated Use setAttributeConfig 435 */ 436 configureAttribute: function(key, map, init) { 437 this.setAttributeConfig(key, map, init); 438 }, 439 440 /** 441 * Resets an attribute to its intial configuration. 442 * @method resetAttributeConfig 443 * @param {String} key The attribute's name. 444 * @private 445 */ 446 resetAttributeConfig: function(key){ 447 this._configs = this._configs || {}; 448 this._configs[key].resetConfig(); 449 }, 450 451 // wrapper for EventProvider.subscribe 452 // to create events on the fly 453 subscribe: function(type, callback) { 454 this._events = this._events || {}; 455 456 if ( !(type in this._events) ) { 457 this._events[type] = this.createEvent(type); 458 } 459 460 YAHOO.util.EventProvider.prototype.subscribe.apply(this, arguments); 461 }, 462 463 on: function() { 464 this.subscribe.apply(this, arguments); 465 }, 466 467 addListener: function() { 468 this.subscribe.apply(this, arguments); 469 }, 470 471 /** 472 * Fires the attribute's beforeChange event. 473 * @method fireBeforeChangeEvent 474 * @param {String} key The attribute's name. 475 * @param {Obj} e The event object to pass to handlers. 476 */ 477 fireBeforeChangeEvent: function(e) { 478 var type = 'before'; 479 type += e.type.charAt(0).toUpperCase() + e.type.substr(1) + 'Change'; 480 e.type = type; 481 return this.fireEvent(e.type, e); 482 }, 483 484 /** 485 * Fires the attribute's change event. 486 * @method fireChangeEvent 487 * @param {String} key The attribute's name. 488 * @param {Obj} e The event object to pass to the handlers. 489 */ 490 fireChangeEvent: function(e) { 491 e.type += 'Change'; 492 return this.fireEvent(e.type, e); 493 }, 494 495 createAttribute: function(map) { 496 return new YAHOO.util.Attribute(map, this); 497 } 498 }; 499 500 YAHOO.augment(YAHOO.util.AttributeProvider, YAHOO.util.EventProvider); 501 })(); 502 503 (function() { 504 // internal shorthand 505 var Dom = YAHOO.util.Dom, 506 AttributeProvider = YAHOO.util.AttributeProvider, 507 specialTypes = { 508 mouseenter: true, 509 mouseleave: true 510 }; 511 512 /** 513 * Element provides an wrapper object to simplify adding 514 * event listeners, using dom methods, and managing attributes. 515 * @module element 516 * @namespace YAHOO.util 517 * @requires yahoo, dom, event 518 */ 519 520 /** 521 * Element provides an wrapper object to simplify adding 522 * event listeners, using dom methods, and managing attributes. 523 * @class Element 524 * @uses YAHOO.util.AttributeProvider 525 * @constructor 526 * @param el {HTMLElement | String} The html element that 527 * represents the Element. 528 * @param {Object} map A key-value map of initial config names and values 529 */ 530 var Element = function(el, map) { 531 this.init.apply(this, arguments); 532 }; 533 534 Element.DOM_EVENTS = { 535 'click': true, 536 'dblclick': true, 537 'keydown': true, 538 'keypress': true, 539 'keyup': true, 540 'mousedown': true, 541 'mousemove': true, 542 'mouseout': true, 543 'mouseover': true, 544 'mouseup': true, 545 'mouseenter': true, 546 'mouseleave': true, 547 'focus': true, 548 'blur': true, 549 'submit': true, 550 'change': true 551 }; 552 553 Element.prototype = { 554 /** 555 * Dom events supported by the Element instance. 556 * @property DOM_EVENTS 557 * @type Object 558 */ 559 DOM_EVENTS: null, 560 561 DEFAULT_HTML_SETTER: function(value, key) { 562 var el = this.get('element'); 563 564 if (el) { 565 el[key] = value; 566 } 567 568 return value; 569 570 }, 571 572 DEFAULT_HTML_GETTER: function(key) { 573 var el = this.get('element'), 574 val; 575 576 if (el) { 577 val = el[key]; 578 } 579 580 return val; 581 }, 582 583 /** 584 * Wrapper for HTMLElement method. 585 * @method appendChild 586 * @param {YAHOO.util.Element || HTMLElement} child The element to append. 587 * @return {HTMLElement} The appended DOM element. 588 */ 589 appendChild: function(child) { 590 child = child.get ? child.get('element') : child; 591 return this.get('element').appendChild(child); 592 }, 593 594 /** 595 * Wrapper for HTMLElement method. 596 * @method getElementsByTagName 597 * @param {String} tag The tagName to collect 598 * @return {HTMLCollection} A collection of DOM elements. 599 */ 600 getElementsByTagName: function(tag) { 601 return this.get('element').getElementsByTagName(tag); 602 }, 603 604 /** 605 * Wrapper for HTMLElement method. 606 * @method hasChildNodes 607 * @return {Boolean} Whether or not the element has childNodes 608 */ 609 hasChildNodes: function() { 610 return this.get('element').hasChildNodes(); 611 }, 612 613 /** 614 * Wrapper for HTMLElement method. 615 * @method insertBefore 616 * @param {HTMLElement} element The HTMLElement to insert 617 * @param {HTMLElement} before The HTMLElement to insert 618 * the element before. 619 * @return {HTMLElement} The inserted DOM element. 620 */ 621 insertBefore: function(element, before) { 622 element = element.get ? element.get('element') : element; 623 before = (before && before.get) ? before.get('element') : before; 624 625 return this.get('element').insertBefore(element, before); 626 }, 627 628 /** 629 * Wrapper for HTMLElement method. 630 * @method removeChild 631 * @param {HTMLElement} child The HTMLElement to remove 632 * @return {HTMLElement} The removed DOM element. 633 */ 634 removeChild: function(child) { 635 child = child.get ? child.get('element') : child; 636 return this.get('element').removeChild(child); 637 }, 638 639 /** 640 * Wrapper for HTMLElement method. 641 * @method replaceChild 642 * @param {HTMLElement} newNode The HTMLElement to insert 643 * @param {HTMLElement} oldNode The HTMLElement to replace 644 * @return {HTMLElement} The replaced DOM element. 645 */ 646 replaceChild: function(newNode, oldNode) { 647 newNode = newNode.get ? newNode.get('element') : newNode; 648 oldNode = oldNode.get ? oldNode.get('element') : oldNode; 649 return this.get('element').replaceChild(newNode, oldNode); 650 }, 651 652 653 /** 654 * Registers Element specific attributes. 655 * @method initAttributes 656 * @param {Object} map A key-value map of initial attribute configs 657 */ 658 initAttributes: function(map) { 659 }, 660 661 /** 662 * Adds a listener for the given event. These may be DOM or 663 * customEvent listeners. Any event that is fired via fireEvent 664 * can be listened for. All handlers receive an event object. 665 * @method addListener 666 * @param {String} type The name of the event to listen for 667 * @param {Function} fn The handler to call when the event fires 668 * @param {Any} obj A variable to pass to the handler 669 * @param {Object} scope The object to use for the scope of the handler 670 */ 671 addListener: function(type, fn, obj, scope) { 672 673 scope = scope || this; 674 675 var Event = YAHOO.util.Event, 676 el = this.get('element') || this.get('id'), 677 self = this; 678 679 680 if (specialTypes[type] && !Event._createMouseDelegate) { 681 return false; 682 } 683 684 685 if (!this._events[type]) { // create on the fly 686 687 if (el && this.DOM_EVENTS[type]) { 688 Event.on(el, type, function(e, matchedEl) { 689 690 // Supplement IE with target, currentTarget relatedTarget 691 692 if (e.srcElement && !e.target) { 693 e.target = e.srcElement; 694 } 695 696 if ((e.toElement && !e.relatedTarget) || (e.fromElement && !e.relatedTarget)) { 697 e.relatedTarget = Event.getRelatedTarget(e); 698 } 699 700 if (!e.currentTarget) { 701 e.currentTarget = el; 702 } 703 704 // Note: matchedEl el is passed back for delegated listeners 705 self.fireEvent(type, e, matchedEl); 706 707 }, obj, scope); 708 } 709 this.createEvent(type, {scope: this}); 710 } 711 712 return YAHOO.util.EventProvider.prototype.subscribe.apply(this, arguments); // notify via customEvent 713 }, 714 715 716 /** 717 * Alias for addListener 718 * @method on 719 * @param {String} type The name of the event to listen for 720 * @param {Function} fn The function call when the event fires 721 * @param {Any} obj A variable to pass to the handler 722 * @param {Object} scope The object to use for the scope of the handler 723 */ 724 on: function() { 725 return this.addListener.apply(this, arguments); 726 }, 727 728 /** 729 * Alias for addListener 730 * @method subscribe 731 * @param {String} type The name of the event to listen for 732 * @param {Function} fn The function call when the event fires 733 * @param {Any} obj A variable to pass to the handler 734 * @param {Object} scope The object to use for the scope of the handler 735 */ 736 subscribe: function() { 737 return this.addListener.apply(this, arguments); 738 }, 739 740 /** 741 * Remove an event listener 742 * @method removeListener 743 * @param {String} type The name of the event to listen for 744 * @param {Function} fn The function call when the event fires 745 */ 746 removeListener: function(type, fn) { 747 return this.unsubscribe.apply(this, arguments); 748 }, 749 750 /** 751 * Wrapper for Dom method. 752 * @method addClass 753 * @param {String} className The className to add 754 */ 755 addClass: function(className) { 756 Dom.addClass(this.get('element'), className); 757 }, 758 759 /** 760 * Wrapper for Dom method. 761 * @method getElementsByClassName 762 * @param {String} className The className to collect 763 * @param {String} tag (optional) The tag to use in 764 * conjunction with class name 765 * @return {Array} Array of HTMLElements 766 */ 767 getElementsByClassName: function(className, tag) { 768 return Dom.getElementsByClassName(className, tag, 769 this.get('element') ); 770 }, 771 772 /** 773 * Wrapper for Dom method. 774 * @method hasClass 775 * @param {String} className The className to add 776 * @return {Boolean} Whether or not the element has the class name 777 */ 778 hasClass: function(className) { 779 return Dom.hasClass(this.get('element'), className); 780 }, 781 782 /** 783 * Wrapper for Dom method. 784 * @method removeClass 785 * @param {String} className The className to remove 786 */ 787 removeClass: function(className) { 788 return Dom.removeClass(this.get('element'), className); 789 }, 790 791 /** 792 * Wrapper for Dom method. 793 * @method replaceClass 794 * @param {String} oldClassName The className to replace 795 * @param {String} newClassName The className to add 796 */ 797 replaceClass: function(oldClassName, newClassName) { 798 return Dom.replaceClass(this.get('element'), 799 oldClassName, newClassName); 800 }, 801 802 /** 803 * Wrapper for Dom method. 804 * @method setStyle 805 * @param {String} property The style property to set 806 * @param {String} value The value to apply to the style property 807 */ 808 setStyle: function(property, value) { 809 return Dom.setStyle(this.get('element'), property, value); // TODO: always queuing? 810 }, 811 812 /** 813 * Wrapper for Dom method. 814 * @method getStyle 815 * @param {String} property The style property to retrieve 816 * @return {String} The current value of the property 817 */ 818 getStyle: function(property) { 819 return Dom.getStyle(this.get('element'), property); 820 }, 821 822 /** 823 * Apply any queued set calls. 824 * @method fireQueue 825 */ 826 fireQueue: function() { 827 var queue = this._queue; 828 for (var i = 0, len = queue.length; i < len; ++i) { 829 this[queue[i][0]].apply(this, queue[i][1]); 830 } 831 }, 832 833 /** 834 * Appends the HTMLElement into either the supplied parentNode. 835 * @method appendTo 836 * @param {HTMLElement | Element} parentNode The node to append to 837 * @param {HTMLElement | Element} before An optional node to insert before 838 * @return {HTMLElement} The appended DOM element. 839 */ 840 appendTo: function(parent, before) { 841 parent = (parent.get) ? parent.get('element') : Dom.get(parent); 842 843 this.fireEvent('beforeAppendTo', { 844 type: 'beforeAppendTo', 845 target: parent 846 }); 847 848 849 before = (before && before.get) ? 850 before.get('element') : Dom.get(before); 851 var element = this.get('element'); 852 853 if (!element) { 854 return false; 855 } 856 857 if (!parent) { 858 return false; 859 } 860 861 if (element.parent != parent) { 862 if (before) { 863 parent.insertBefore(element, before); 864 } else { 865 parent.appendChild(element); 866 } 867 } 868 869 870 this.fireEvent('appendTo', { 871 type: 'appendTo', 872 target: parent 873 }); 874 875 return element; 876 }, 877 878 get: function(key) { 879 var configs = this._configs || {}, 880 el = configs.element; // avoid loop due to 'element' 881 882 if (el && !configs[key] && !YAHOO.lang.isUndefined(el.value[key]) ) { 883 this._setHTMLAttrConfig(key); 884 } 885 886 return AttributeProvider.prototype.get.call(this, key); 887 }, 888 889 setAttributes: function(map, silent) { 890 // set based on configOrder 891 var done = {}, 892 configOrder = this._configOrder; 893 894 // set based on configOrder 895 for (var i = 0, len = configOrder.length; i < len; ++i) { 896 if (map[configOrder[i]] !== undefined) { 897 done[configOrder[i]] = true; 898 this.set(configOrder[i], map[configOrder[i]], silent); 899 } 900 } 901 902 // unconfigured (e.g. Dom attributes) 903 for (var att in map) { 904 if (map.hasOwnProperty(att) && !done[att]) { 905 this.set(att, map[att], silent); 906 } 907 } 908 }, 909 910 set: function(key, value, silent) { 911 var el = this.get('element'); 912 if (!el) { 913 this._queue[this._queue.length] = ['set', arguments]; 914 if (this._configs[key]) { 915 this._configs[key].value = value; // so "get" works while queueing 916 917 } 918 return; 919 } 920 921 // set it on the element if not configured and is an HTML attribute 922 if ( !this._configs[key] && !YAHOO.lang.isUndefined(el[key]) ) { 923 this._setHTMLAttrConfig(key); 924 } 925 926 return AttributeProvider.prototype.set.apply(this, arguments); 927 }, 928 929 setAttributeConfig: function(key, map, init) { 930 this._configOrder.push(key); 931 AttributeProvider.prototype.setAttributeConfig.apply(this, arguments); 932 }, 933 934 createEvent: function(type, config) { 935 this._events[type] = true; 936 return AttributeProvider.prototype.createEvent.apply(this, arguments); 937 }, 938 939 init: function(el, attr) { 940 this._initElement(el, attr); 941 }, 942 943 destroy: function() { 944 var el = this.get('element'); 945 YAHOO.util.Event.purgeElement(el, true); // purge DOM listeners recursively 946 this.unsubscribeAll(); // unsubscribe all custom events 947 948 if (el && el.parentNode) { 949 el.parentNode.removeChild(el); // pull from the DOM 950 } 951 952 // revert initial configs 953 this._queue = []; 954 this._events = {}; 955 this._configs = {}; 956 this._configOrder = []; 957 }, 958 959 _initElement: function(el, attr) { 960 this._queue = this._queue || []; 961 this._events = this._events || {}; 962 this._configs = this._configs || {}; 963 this._configOrder = []; 964 attr = attr || {}; 965 attr.element = attr.element || el || null; 966 967 var isReady = false; // to determine when to init HTMLElement and content 968 969 var DOM_EVENTS = Element.DOM_EVENTS; 970 this.DOM_EVENTS = this.DOM_EVENTS || {}; 971 972 for (var event in DOM_EVENTS) { 973 if (DOM_EVENTS.hasOwnProperty(event)) { 974 this.DOM_EVENTS[event] = DOM_EVENTS[event]; 975 } 976 } 977 978 if (typeof attr.element === 'string') { // register ID for get() access 979 this._setHTMLAttrConfig('id', { value: attr.element }); 980 } 981 982 if (Dom.get(attr.element)) { 983 isReady = true; 984 this._initHTMLElement(attr); 985 this._initContent(attr); 986 } 987 988 YAHOO.util.Event.onAvailable(attr.element, function() { 989 if (!isReady) { // otherwise already done 990 this._initHTMLElement(attr); 991 } 992 993 this.fireEvent('available', { type: 'available', target: Dom.get(attr.element) }); 994 }, this, true); 995 996 YAHOO.util.Event.onContentReady(attr.element, function() { 997 if (!isReady) { // otherwise already done 998 this._initContent(attr); 999 } 1000 this.fireEvent('contentReady', { type: 'contentReady', target: Dom.get(attr.element) }); 1001 }, this, true); 1002 }, 1003 1004 _initHTMLElement: function(attr) { 1005 /** 1006 * The HTMLElement the Element instance refers to. 1007 * @attribute element 1008 * @type HTMLElement 1009 */ 1010 this.setAttributeConfig('element', { 1011 value: Dom.get(attr.element), 1012 readOnly: true 1013 }); 1014 }, 1015 1016 _initContent: function(attr) { 1017 this.initAttributes(attr); 1018 this.setAttributes(attr, true); 1019 this.fireQueue(); 1020 1021 }, 1022 1023 /** 1024 * Sets the value of the property and fires beforeChange and change events. 1025 * @private 1026 * @method _setHTMLAttrConfig 1027 * @param {YAHOO.util.Element} element The Element instance to 1028 * register the config to. 1029 * @param {String} key The name of the config to register 1030 * @param {Object} map A key-value map of the config's params 1031 */ 1032 _setHTMLAttrConfig: function(key, map) { 1033 var el = this.get('element'); 1034 map = map || {}; 1035 map.name = key; 1036 1037 map.setter = map.setter || this.DEFAULT_HTML_SETTER; 1038 map.getter = map.getter || this.DEFAULT_HTML_GETTER; 1039 1040 map.value = map.value || el[key]; 1041 this._configs[key] = new YAHOO.util.Attribute(map, this); 1042 } 1043 }; 1044 1045 /** 1046 * Fires when the Element's HTMLElement can be retrieved by Id. 1047 * <p>See: <a href="#addListener">Element.addListener</a></p> 1048 * <p><strong>Event fields:</strong><br> 1049 * <code><String> type</code> available<br> 1050 * <code><HTMLElement> 1051 * target</code> the HTMLElement bound to this Element instance<br> 1052 * <p><strong>Usage:</strong><br> 1053 * <code>var handler = function(e) {var target = e.target};<br> 1054 * myTabs.addListener('available', handler);</code></p> 1055 * @event available 1056 */ 1057 1058 /** 1059 * Fires when the Element's HTMLElement subtree is rendered. 1060 * <p>See: <a href="#addListener">Element.addListener</a></p> 1061 * <p><strong>Event fields:</strong><br> 1062 * <code><String> type</code> contentReady<br> 1063 * <code><HTMLElement> 1064 * target</code> the HTMLElement bound to this Element instance<br> 1065 * <p><strong>Usage:</strong><br> 1066 * <code>var handler = function(e) {var target = e.target};<br> 1067 * myTabs.addListener('contentReady', handler);</code></p> 1068 * @event contentReady 1069 */ 1070 1071 /** 1072 * Fires before the Element is appended to another Element. 1073 * <p>See: <a href="#addListener">Element.addListener</a></p> 1074 * <p><strong>Event fields:</strong><br> 1075 * <code><String> type</code> beforeAppendTo<br> 1076 * <code><HTMLElement/Element> 1077 * target</code> the HTMLElement/Element being appended to 1078 * <p><strong>Usage:</strong><br> 1079 * <code>var handler = function(e) {var target = e.target};<br> 1080 * myTabs.addListener('beforeAppendTo', handler);</code></p> 1081 * @event beforeAppendTo 1082 */ 1083 1084 /** 1085 * Fires after the Element is appended to another Element. 1086 * <p>See: <a href="#addListener">Element.addListener</a></p> 1087 * <p><strong>Event fields:</strong><br> 1088 * <code><String> type</code> appendTo<br> 1089 * <code><HTMLElement/Element> 1090 * target</code> the HTMLElement/Element being appended to 1091 * <p><strong>Usage:</strong><br> 1092 * <code>var handler = function(e) {var target = e.target};<br> 1093 * myTabs.addListener('appendTo', handler);</code></p> 1094 * @event appendTo 1095 */ 1096 1097 YAHOO.augment(Element, AttributeProvider); 1098 YAHOO.util.Element = Element; 1099 })(); 1100 1101 YAHOO.register("element", YAHOO.util.Element, {version: "2.9.0", build: "2800"}); 1102 1103 }, '2.9.0' ,{"requires": ["yui2-yahoo", "yui2-dom", "yui2-event"], "optional": ["yui2-event-mouseenter", "yui2-event-delegate"]});
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |