| | 507 | |
| | 508 | |
| | 509 | |
| | 510 | Component.Delegator = { |
| | 511 | |
| | 512 | DEFAULT_NAMESPACE: "core", |
| | 513 | |
| | 514 | setupDelegates: function( object ) { |
| | 515 | /* this needs more testing before enabling |
| | 516 | if ( object && !object.delegateParent ) |
| | 517 | object.delegateParent = this; |
| | 518 | */ |
| | 519 | |
| | 520 | if ( !this.delegateListeners ) |
| | 521 | this.delegateListeners = {}; |
| | 522 | |
| | 523 | if ( !this.delegates ) |
| | 524 | this.delegates = {}; |
| | 525 | |
| | 526 | if ( !defined( this.NAMESPACE ) ) |
| | 527 | this.NAMESPACE = ( window.app && app.NAMESPACE ) |
| | 528 | ? app.NAMESPACE : this.DEFAULT_NAMESPACE; |
| | 529 | }, |
| | 530 | |
| | 531 | |
| | 532 | addEventListener: function( object, eventName, methodName, useCapture ) { |
| | 533 | DOM.addEventListener( object, eventName, |
| | 534 | (this.useClosures |
| | 535 | ? this.getEventListener( methodName ) |
| | 536 | : this.getIndirectEventListener( methodName ) ), |
| | 537 | useCapture ); |
| | 538 | }, |
| | 539 | |
| | 540 | |
| | 541 | /* delegate functions */ |
| | 542 | setDelegate: function( name, object ) { |
| | 543 | this.setupDelegates( object ); |
| | 544 | this.delegates[ name ] = object; |
| | 545 | return object; |
| | 546 | }, |
| | 547 | |
| | 548 | |
| | 549 | setDelegateListener: function( eventName, delegateName ) { |
| | 550 | this.setupDelegates(); |
| | 551 | this.delegateListeners[ eventName ] = delegateName; |
| | 552 | }, |
| | 553 | |
| | 554 | |
| | 555 | delegateEvent: function( event, eventName ) { |
| | 556 | var delegate = DOM.getMouseEventAttribute( event, this.NAMESPACE + ":delegate" ); |
| | 557 | |
| | 558 | if ( !delegate ) { |
| | 559 | if ( this.delegateListeners && this.delegateListeners.hasOwnProperty( eventName ) ) |
| | 560 | delegate = this.delegateListeners[ eventName ]; |
| | 561 | else |
| | 562 | return undefined; |
| | 563 | } else |
| | 564 | delegate = delegate.cssToJS(); |
| | 565 | |
| | 566 | if ( this.delegates && this.delegates.hasOwnProperty( delegate ) && this.delegates[ delegate ][ eventName ] ) |
| | 567 | return this.delegates[ delegate ][ eventName ]( event, this ); |
| | 568 | }, |
| | 569 | |
| | 570 | |
| | 571 | getIndirectEventListener: function( methodName ) { |
| | 572 | if( !this.indirectEventListeners ) |
| | 573 | this.indirectEventListeners = {}; |
| | 574 | var method = this[ methodName ]; |
| | 575 | var indirectIndex = this.getIndirectIndex(); |
| | 576 | if( !this.indirectEventListeners[ methodName ] ) { |
| | 577 | return this.indirectEventListeners[ methodName ] = new Function( "event", |
| | 578 | "try { event = Event.prep( event ); } catch( e ) {}" + |
| | 579 | "var o = indirectObjects[" + indirectIndex + "];" + |
| | 580 | "var r = o.delegateEvent( event, '" + methodName + |
| | 581 | "' ); if ( r ) return r; if ( o[ '" + methodName + |
| | 582 | "' ] ) return o." + methodName + ".call( o, event );" ); |
| | 583 | } |
| | 584 | |
| | 585 | return this.indirectEventListeners[ methodName ]; |
| | 586 | } |
| | 587 | |
| | 588 | |
| | 589 | }; |