OSDN Git Service

Version 0.6.137, fix X.EventDispatcher.unlisten & remove X.Node.destroy.
authoritozyun <itozyun@user.sourceforge.jp>
Fri, 10 Apr 2015 03:02:29 +0000 (12:02 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Fri, 10 Apr 2015 03:02:29 +0000 (12:02 +0900)
16 files changed:
0.6.x/js/01_core/11_XClass.js
0.6.x/js/01_core/13_XEventDispatcher.js
0.6.x/js/02_dom/00_XDoc.js
0.6.x/js/02_dom/02_XNode.js
0.6.x/js/02_dom/07_XNodeList.js
0.6.x/js/02_dom/08_XNodeSelector.js
0.6.x/js/02_dom/22_XTreeBuilder.js
0.6.x/js/05_util/01_XNinjaIframe.js
0.6.x/js/05_util/03_XUtilImage.js
0.6.x/js/06_net/02_XNetJSONP.js
0.6.x/js/06_net/04_XNetImage.js
0.6.x/js/07_audio/00_XAudio.js
0.6.x/js/07_audio/03_XSilverlightAudio.js
0.6.x/js/07_audio/10_XAudioSprite.js
0.6.x/js/20_ui/06_AbstractUINode.js
0.6.x/js/20_ui/20_PageRoot.js

index 6ead421..1a5499e 100644 (file)
@@ -77,7 +77,7 @@ X_Class_CommonMethods =
                        };\r
                        \r
                        this[ 'dispatch' ]( X_EVENT_KILL_INSTANCE );\r
-                       this[ '_listeners' ] && X_EventDispatcher_systemUnlisten( this );\r
+                       this[ '_listeners' ] && X_EventDispatcher_unlistenAll( this );\r
                };\r
                \r
                for( p in instance ){\r
index 121525b..946cbfc 100644 (file)
@@ -105,7 +105,7 @@ var X_EventDispatcher_once       = false,
  * @constructs EventDispatcher\r
  * @extends {__ClassBase__}\r
  */\r
-var X_EventDispatcher = X.EventDispatcher =\r
+var X_EventDispatcher = X[ 'EventDispatcher' ] =\r
        X_Class_create(\r
                'EventDispatcher',\r
                \r
@@ -434,13 +434,11 @@ function X_EventDispatcher_systemListen( that, type, opt_arg1, opt_arg2, opt_arg
        X_EventDispatcher_lock = false;\r
 };\r
 \r
-// TODO this[ 'listen' ](type) は this リスナの登録なのに、this[ 'unlisten' ](type)は全てのtypeの削除、と不一致\r
-\r
 /**\r
  * イベントリスナの解除を行う。登録時と同じ引数を与える必要がある。kill() ですべてのイベントが解除されるので、途中で解除されるイベント以外は kill() に任せてしまってよい。\r
  * @alias EventDispatcher.prototype.unlisten\r
  * @return {EventDispatcher}\r
- * @param {string|number|Array.<string,number>} opt_type\r
+ * @param {string|number|Array.<string,number>} opt_type イベントID, イベント名、またはその配列\r
  * @param {listener|function|Array} opt_arg1\r
  * @param {function|Array} opt_arg2\r
  * @param {Array} opt_arg3\r
@@ -459,29 +457,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
                };\r
                return this;\r
        };\r
-       \r
-       if( opt_type === undefined ){\r
-               // 全て削除\r
-               for( opt_type in listeners ){\r
-                       //if( X_EMPTY_OBJECT[ opt_type ] ) continue;\r
-                       if( opt_type < X_Listeners_.KILL_RESERVED ) continue;\r
-                       list = listeners[ opt_type ];\r
-                       for( i = list.length; i; ){\r
-                               this[ 'unlisten' ]( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
-                       };\r
-                       // this[ 'unlisten' ]( opt_type ); これは無茶!\r
-               };\r
-               return this;\r
-       } else\r
-       if( opt_arg1 === undefined ){\r
-               // 同一タイプを全て削除\r
-               if( list = listeners[ opt_type ] ){\r
-                       for( i = list.length; i; ){\r
-                               this[ 'unlisten' ]( opt_type, list[ --i ] ); // override されていることがあるので、必ず unlisten を使用\r
-                       };\r
-               };\r
-               return this;\r
-       } else\r
+\r
        if( reserves = listeners[ X_Listeners_.RESERVES ] ){\r
                for( i = reserves.length; i; ){\r
                        f = reserves[ --i ];\r
@@ -515,7 +491,7 @@ function X_EventDispatcher_unlisten( opt_type, opt_arg1, opt_arg2, opt_arg3 ){
                        // TODO カウンター\r
                        empty = true;\r
                        for( k in listeners ){\r
-                               if( k < X_Listeners_.KILL_RESERVED ) continue;\r
+                               if( k <= X_Listeners_.KILL_RESERVED ) continue;\r
                                empty = false;\r
                                break;\r
                        };\r
@@ -537,6 +513,21 @@ function X_EventDispatcher_systemUnlisten( that, type, opt_arg1, opt_arg2, opt_a
        X_EventDispatcher_unlock = false;\r
 };\r
 \r
+function X_EventDispatcher_unlistenAll( that ){\r
+       var listeners = that[ '_listeners' ],\r
+               type, list, i;\r
+       if( !listeners ) return;\r
+       \r
+       for( type in listeners ){\r
+               //if( X_EMPTY_OBJECT[ opt_type ] ) continue;\r
+               if( type <= X_Listeners_.KILL_RESERVED ) continue;\r
+               list = listeners[ type ];\r
+               for( i = list.length; i; ){\r
+                       that[ 'unlisten' ]( type, list[ --i ] );\r
+               };\r
+       };\r
+};\r
+\r
 function X_EventDispatcher_addEvent( that, type, raw, list ){\r
        var i;\r
        X_EventDispatcher_lock || ( type = X_Event_Rename[ type ] || type );\r
@@ -840,7 +831,7 @@ function X_EventDispatcher_toggleAllEvents( that, add ){
        if( !list || !raw ) return;\r
        for( type in list ){\r
                //if( X_EMPTY_OBJECT[ type ] ) continue;\r
-               //if( type < X_Listeners_.KILL_RESERVED ) continue;\r
+               //if( type <= X_Listeners_.KILL_RESERVED ) continue;\r
                // 数字イベントの除外\r
                if( !X_String_isNumberString( type ) ){\r
                        // TODO type rename はここ\r
index e2fcbf8..48251a6 100644 (file)
@@ -12,7 +12,7 @@ X[ 'Doc' ] = {
                        X_ViewPort_document[ 'asyncDispatch' ]( type );
                };
                type && arg1 && X_ViewPort_document[ 'listen' ]( type, arg1, arg2, arg3 );
-               return X.Doc;
+               return X[ 'Doc' ];
        },
        
        
@@ -24,12 +24,12 @@ X[ 'Doc' ] = {
                        X_ViewPort_document[ 'asyncDispatch' ]( type );
                };
                type && arg1 && X_ViewPort_document[ 'listenOnce' ]( type, arg1, arg2, arg3 );
-               return X.Doc;
+               return X[ 'Doc' ];
        },
        
        'unlisten' : function( type, arg1, arg2, arg3 ){
                type && arg1 && X_ViewPort_document[ 'unlisten' ]( type, arg1, arg2, arg3 );
-               return X.Doc;
+               return X[ 'Doc' ];
        },
        
        'listening' : function( type, arg1, arg2, arg3 ){
@@ -63,7 +63,7 @@ function X_Doc_create( tag, opt_attrs, opt_css ){
                case X_Node_TYPE.HTML_STRING :
                        list = X_HtmlParser_parse( tag, true );
                        for( i = list.length; 1 < i; ){
-                               list[ --i ].destroy();
+                               list[ --i ][ 'kill' ]();
                        };
                        return list[ 0 ];
        };
index b3e6576..ab3d01c 100644 (file)
@@ -109,7 +109,7 @@ var X_Node_BITMASK_RESET_STYLE  = ( ( 2 << 29 ) - 1 + ( 2 << 29 ) ) ^ (
  */\r
 var    Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](\r
        'X.Node',\r
-       X_Class.POOL_OBJECT, // X_Class.FINAL\r
+       X_Class.POOL_OBJECT,\r
        \r
        {\r
                /**\r
@@ -313,8 +313,8 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](
                                                return X_Node_none;\r
 \r
                                        default :\r
-                                               this.length = 0;\r
                                                if( X_Node_none ) return X_Node_none;\r
+                                               this.length = 0;\r
                                                return;\r
                                };\r
                        };\r
@@ -324,6 +324,8 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](
                        };\r
                        this[ '_flags' ] |= X_Node_State.EXIST;\r
                        X_Node_CHASHE[ this[ '_uid' ] = uid ] = this;\r
+                       \r
+                       X_EventDispatcher_systemListen( this, X_EVENT_BEFORE_KILL_INSTANCE, X_Node_onBeforeKill );\r
                },\r
                \r
                // attr\r
@@ -347,9 +349,9 @@ var Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](
                \r
                'appendTo'       : X_Node_appendTo,\r
                \r
-               'prev'           : X_Node_before,\r
+               'prev'           : X_Node_prev,\r
                \r
-               'next'           : X_Node_after,\r
+               'next'           : X_Node_next,\r
                \r
                'swap'           : X_Node_swap,\r
                \r
@@ -357,13 +359,11 @@ var       Node = X[ 'Node' ] = X_EventDispatcher[ 'inherits' ](
                \r
                'empty'          : X_Node_empty,\r
                \r
-               destroy          : X_Node_destroy, // -> kill && kill event\r
-               \r
                'contains'       : X_Node_contains,\r
                \r
                'getChildAt'     : X_Node_getChildAt,\r
                \r
-               'numChildren'    : X_Node_length,\r
+               'numChildren'    : X_Node_numChildren,\r
                \r
                'firstChild'     : X_Node_firstChild,\r
                \r
@@ -397,6 +397,7 @@ function X_Node_getType( v ){
        if( X_Type_isString( v ) ){\r
                return '<' === v.charAt( 0 ) && v.charAt( v.length - 1 ) === '>' ? X_Node_TYPE.HTML_STRING : X_Node_TYPE.STRING;\r
        };\r
+       if( v[ 'instanceOf' ] && v[ 'instanceOf' ]( Node ) ) return X_Node_TYPE.XNODE;\r
        return 0;\r
 };\r
 function X_Node_getXNode( v ){\r
@@ -437,7 +438,7 @@ var X_Node_isXmlDocument =
                                return root.isXML = root[ '_rawObject' ].createElement( 'p' ).tagName !== root[ '_rawObject' ].createElement( 'P' ).tagName;\r
                        }),\r
        X_Node_CHASHE     = [],\r
-       X_Node_none  = X_Node_CHASHE[ 0 ] = new Node(),\r
+       X_Node_none  = X_Node_CHASHE[ 0 ] = Node(),\r
        X_Node_html, // = X_Node_CHASHE[ 1 ] <html>\r
        X_Node_head, // = X_Node_CHASHE[ 2 ] <head>\r
        X_Node_body, // = X_Node_CHASHE[ 3 ] <body>\r
@@ -562,7 +563,7 @@ function X_Node_clone( opt_clone_children ){
        var xnode, xnodes, i, l;\r
        if( this[ '_tag' ] ){\r
                X_Node_newByTag = true;\r
-               xnode = new Node( this[ '_tag' ], X_Object_clone( this[ '_attrs' ] ), X_Object_clone( this[ '_css' ] ) )\r
+               xnode = Node( this[ '_tag' ], X_Object_clone( this[ '_attrs' ] ), X_Object_clone( this[ '_css' ] ) )\r
                        [ 'attr' ]( { 'id' : this[ '_id' ] } )\r
                        [ 'className' ]( this[ '_className' ] );\r
                if( opt_clone_children && ( xnodes = this[ '_xnodes' ] ) && ( l = xnodes.length ) ){\r
@@ -573,12 +574,12 @@ function X_Node_clone( opt_clone_children ){
                return xnode;           \r
        };\r
        X_Node_newByText = true;\r
-       return new Node( this[ '_text' ] );\r
+       return Node( this[ '_text' ] );\r
 };\r
 \r
 /**\r
  * ノードを子配列の最後に追加する。文字列が渡された場合、HTMLパーサーによって Node ツリーを作成して追加する。HtmlElement, TextNode の場合は内部使用専用。\r
- * @alias Node.prototype.clone\r
+ * @alias Node.prototype.append\r
  * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
  * @return {Node} 自身。チェインメソッド\r
  * @example myNode.append( node );\r
@@ -600,7 +601,7 @@ function X_Node_append( v ){
        switch( X_Node_getType( v ) ){\r
                case X_Node_TYPE.RAW_HTML :\r
                case X_Node_TYPE.RAW_TEXT :\r
-                       v = new Node( v );\r
+                       v = Node( v );\r
                        break;\r
                case X_Node_TYPE.HTML_STRING :\r
                case X_Node_TYPE.STRING :\r
@@ -627,7 +628,7 @@ function X_Node_append( v ){
 \r
 /**\r
  * ノードを挿入位置に追加する。\r
- * @alias Node.prototype.clone\r
+ * @alias Node.prototype.appendAt\r
  * @param {number} index 挿入位置 0以上\r
  * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
  * @return {Node} 自身。チェインメソッド\r
@@ -659,7 +660,7 @@ function X_Node_appendAt( start, v ){
        switch( X_Node_getType( v ) ){\r
                case X_Node_TYPE.RAW_HTML :\r
                case X_Node_TYPE.RAW_TEXT :\r
-                       v = new Node( v );\r
+                       v = Node( v );\r
                        break;\r
                case X_Node_TYPE.HTML_STRING :\r
                case X_Node_TYPE.STRING :\r
@@ -688,10 +689,18 @@ function X_Node_appendAt( start, v ){
        return this;\r
 };\r
 \r
+/**\r
+ * ノードを親に追加する。戻り値は子ノードなので、続けて操作が出来る。\r
+ * @alias Node.prototype.appendTo\r
+ * @param {Node|string|HTMLElement} [parent] HTMLElement は内部のみ。\r
+ * @param {number} [opt_index=-1] 挿入位置。省略した場合は最後に追加する。\r
+ * @return {Node} 自身。チェインメソッド\r
+ * @example childNode.appendTo( parentNode, 1 );\r
+ */\r
 function X_Node_appendTo( parent, opt_index ){\r
        switch( X_Node_getType( parent ) ){\r
                case X_Node_TYPE.RAW_HTML :\r
-                       parent = new Node( parent );\r
+                       parent = Node( parent );\r
                        break;\r
                case X_Node_TYPE.HTML_STRING :\r
                        parent = X_HtmlParser_parse( parent, true );\r
@@ -701,14 +710,19 @@ function X_Node_appendTo( parent, opt_index ){
                default :\r
                        return this;\r
        };\r
-       opt_index === undefined ? parent[ 'append' ]( this ) : parent[ 'appendAt' ]( opt_index, this );\r
+       X_Type_isFinite( opt_index ) ? parent[ 'appendAt' ]( opt_index, this ) : parent[ 'append' ]( this );\r
        return this;\r
 };\r
 \r
-/* --------------------------------------\r
- *  Before , After, Replace\r
+\r
+/**\r
+ * ノードの直前の要素を取得。または直前に挿入。\r
+ * @alias Node.prototype.prev\r
+ * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
+ * @return {Node} 自身。チェインメソッド\r
+ * @example childNode.prev( prevNode );\r
  */\r
-function X_Node_before( v ){\r
+function X_Node_prev( v ){\r
        var parent = this.parent, xnodes, i, l, start;\r
        \r
        // getter\r
@@ -733,7 +747,14 @@ function X_Node_before( v ){
        return this;\r
 };\r
 \r
-function X_Node_after( v ){\r
+/**\r
+ * ノードの直後の要素を取得。または直後に挿入。\r
+ * @alias Node.prototype.next\r
+ * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
+ * @return {Node} 自身。チェインメソッド\r
+ * @example childNode.next( prevNode );\r
+ */\r
+function X_Node_next( v ){\r
        var parent = this.parent, xnodes, i, l, start;\r
        \r
        // getter\r
@@ -768,13 +789,23 @@ function X_Node_after( v ){
        return this;\r
 };\r
 \r
+/**\r
+ * 要素の入れ替え。自身は remove() される。\r
+ * @alias Node.prototype.swap\r
+ * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
+ * @return {Node} 自身。チェインメソッド\r
+ * @example node.swap( newNode );\r
+ */\r
 function X_Node_swap( v ){\r
        if( !this.parent ) return this;\r
-       return arguments.length === 1 ? this[ 'prev' ]( v )[ 'remove' ]() : X_Node_before.apply( this, arguments )[ 'remove' ]();\r
+       return arguments.length === 1 ? this[ 'prev' ]( v )[ 'remove' ]() : X_Node_prev.apply( this, arguments )[ 'remove' ]();\r
 };\r
 \r
-/* --------------------------------------\r
- *  Remove\r
+/**\r
+ * 要素を抜く。\r
+ * @alias Node.prototype.remove\r
+ * @return {Node} 自身。チェインメソッド\r
+ * @example node.remove();\r
  */\r
 function X_Node_remove(){\r
        var parent = this.parent,\r
@@ -809,54 +840,30 @@ function X_Node_remove(){
        return this;\r
 };\r
 \r
+/**\r
+ * 子要素を破棄する。子要素は kill() されます。\r
+ * @alias Node.prototype.empty\r
+ * @return {Node} 自身。チェインメソッド\r
+ * @example node.empty();\r
+ */\r
 function X_Node_empty(){\r
        var xnodes = this[ '_xnodes' ], i;\r
        if( xnodes && ( i = xnodes.length ) ){\r
                for( ; i; ){\r
-                       xnodes[ --i ].destroy();\r
+                       xnodes[ --i ][ 'kill' ]();\r
                };\r
                xnodes.length = 0;\r
        };\r
        return this;\r
 };\r
 \r
-/* --------------------------------------\r
- *  TODO destory -> kill\r
- */\r
-\r
-function X_Node_destroy( isChild ){\r
-       var xnodes = this[ '_xnodes' ], i, elm;\r
-       \r
-       if( ( this[ '_flags' ] & X_Node_State.EXIST ) === 0 ) return;\r
-       \r
-       elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
-       \r
-       if( xnodes && ( i = xnodes.length ) ){\r
-               //for( ; i; ){\r
-               //      xnodes[ --i ].destroy( true );\r
-               //};\r
-       };\r
-       elm && this[ '_listeners' ] && this[ 'unlisten' ](); // イベントの退避\r
-\r
-       if( this[ '_flags' ] & X_Node_State.IN_TREE ){\r
-               !isChild && this[ 'remove' ]();\r
-               this[ '_flags' ] &= ~X_Node_State.EXIST;\r
-       } else {\r
-               this.parent && this.parent[ '_xnodes' ].splice( this.parent[ '_xnodes' ].indexOf( this ), 1 );\r
-               elm && !isChild && X_Node__actualRemove( this );\r
-               this[ 'kill' ]();\r
-       };\r
-       \r
-       delete X_Node_CHASHE[ this[ '_uid' ] ];\r
-};\r
-\r
 function X_Node_onBeforeKill( e ){\r
        var xnodes = this[ '_xnodes' ], i, elm;\r
        \r
        if( ( this[ '_flags' ] & X_Node_State.EXIST ) === 0 ) return X_Callback_NONE;\r
        \r
        elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this );\r
-       elm && this[ '_listeners' ] && this[ 'unlisten' ](); // イベントの退避\r
+       elm && this[ '_listeners' ] && X_EventDispatcher_unlistenAll( this ); // イベントの退避\r
 \r
        if( xnodes && ( i = xnodes.length ) ){\r
                for( ; i; ){\r
@@ -877,64 +884,100 @@ function X_Node_onBeforeKill( e ){
 };\r
 \r
 \r
-/* --------------------------------------\r
- *  contains\r
+/**\r
+ * 要素を子以下に持つか?調べる。\r
+ * @alias Node.prototype.contains\r
+ * @param {Node|string|HTMLElement|TextNode} [v] HTMLElement と TextNode は内部のみ。\r
+ * @return {boolean} \r
+ * @example node.contains( testNode );\r
  */\r
 function X_Node_contains( v ){\r
        var elm, type, xnodes, i;\r
        if( !v || !this[ '_tag' ] || this === v ) return false;\r
        // contains ie4+\r
        if( ( elm = this[ '_rawObject' ] || X_UA_DOM.IE4 && X_Node__ie4getRawNode( this ) ) && document.contains && ( type = X_Node_getType( v ) ) && ( type === X_Node_TYPE.RAW_HTML || type === X_Node_TYPE.RAW_TEXT ) ){\r
-               return elm[ 'contains' ]( v );  \r
+               return elm.contains( v );\r
        };\r
+\r
        //if( document.compareDocumentPosition ){\r
        //      \r
        //};\r
        xnodes = this[ '_xnodes' ];\r
        if( !xnodes || !xnodes.length ) return false;\r
        if( xnodes.indexOf( v ) !== -1 ) return true; // fast\r
-       if( elm === v.parentNode ) return true;\r
        for( i = xnodes.length; i; ){\r
                if( xnodes[ --i ][ 'contains' ]( v ) ) return true;\r
        };\r
        return false;\r
 };\r
 \r
-/* --------------------------------------\r
- *  getChild\r
+/**\r
+ * index の子要素を取得する。\r
+ * @alias Node.prototype.getChildAt\r
+ * @param {number} index 取得する子ノードの位置。0~\r
+ * @return {Node} 子要素\r
+ * @example child1 = parent.getChildAt(1);\r
  */\r
 function X_Node_getChildAt( i ){\r
        var xnodes = this[ '_xnodes' ];\r
        return xnodes && 0 <= i && i < xnodes.length && xnodes[ i ];\r
 };\r
 \r
-function X_Node_length(){\r
+/**\r
+ * 子要素の数を取得する。\r
+ * @alias Node.prototype.numChildren\r
+ * @return {number} 子要素の数。\r
+ * @example n = parent.numChildren();\r
+ */\r
+function X_Node_numChildren(){\r
        var xnodes = this[ '_xnodes' ];\r
        return xnodes ? xnodes.length : 0;\r
 };\r
 \r
-/* --------------------------------------\r
- *  firstChild, lastChild\r
+/**\r
+ * 最初の子要素を取得する。\r
+ * @alias Node.prototype.firstChild\r
+ * @return {Node} 最初の子要素\r
+ * @example child0 = parent.firstChild();\r
  */\r
 function X_Node_firstChild(){\r
        return this[ '_xnodes' ] && this[ '_xnodes' ][ 0 ];\r
 };\r
+\r
+/**\r
+ * 最後の子要素を取得する。\r
+ * @alias Node.prototype.lastChild\r
+ * @return {Node} 最後の子要素\r
+ * @example lastChild = parent.lastChild();\r
+ */\r
 function X_Node_lastChild(){\r
        var xnodes = this[ '_xnodes' ];\r
        return xnodes && xnodes[ xnodes.length - 1 ];\r
 };\r
 \r
-/* --------------------------------------\r
- *  getOrder\r
+/**\r
+ * 要素の index 位置を取得する。\r
+ * @alias Node.prototype.getOrder\r
+ * @return {number} index -1 の場合、親を持たない。\r
+ * @example index = node.getOrder();\r
  */\r
 function X_Node_getOrder(){\r
        var parent = this.parent;\r
-       if( !parent ) return -1;\r
-       return parent[ '_xnodes' ].indexOf( this );\r
+       return this === X_Node_html ?\r
+                               0 :\r
+                  parent ?\r
+                               parent[ '_xnodes' ].indexOf( this ) :\r
+                               -1;\r
 };\r
 \r
-/* --------------------------------------\r
- *  className, addClass, removeClass, hasClass\r
+/**\r
+ * className の取得と設定。\r
+ * @alias Node.prototype.className\r
+ * @return {string|Node} getter の場合 class 文字列、setter の場合自身。\r
+ * @example // getter\r
+ * className = node.className();\r
+ * // setter\r
+ * node.className( 'myClass myClass_new' );\r
  */\r
 function X_Node_className( v ){\r
        var node, _, __;\r
@@ -960,9 +1003,18 @@ function X_Node_className( v ){
        this[ '_flags' ] & X_Node_State.IN_TREE && X_Node_reserveUpdate();\r
        return this;\r
 };\r
+\r
+/**\r
+ * className の追加。\r
+ * @alias Node.prototype.addClass\r
+ * @param {string} className スペース区切りで複数のクラスを追加できる。\r
+ * @return {Node} 自身。\r
+ * @example node.addClass( 'myClass myClass_new' );\r
+ */\r
 function X_Node_addClass( v ){\r
-       var names = v.split( ' ' ),\r
-               i     = names.length,\r
+       var names  = v.split( ' ' ),\r
+               i      = names.length,\r
+               _class = this[ '_className' ],\r
                name;\r
        v = '';\r
        for( ; i; ){\r
@@ -970,18 +1022,27 @@ function X_Node_addClass( v ){
                if( !name ) continue;\r
                !this[ 'hasClass' ]( name ) && ( v += ( v ? ' ' : '' ) + name );\r
        };\r
-       return v ? this[ 'className' ]( this[ '_className' ] + ( this[ '_className' ] ? ' ' : '' ) + v ) : this;\r
+       return v ? this[ 'className' ]( ( _class ? _class + ' ' : '' ) + v ) : this;\r
 };\r
+\r
+/**\r
+ * className の削除。\r
+ * @alias Node.prototype.removeClass\r
+ * @param {string} className スペース区切りで複数のクラスを削除できる。\r
+ * @return {Node} 自身。\r
+ * @example node.removeClass( 'myClass myClass_new' );\r
+ */\r
 function X_Node_removeClass( v ){\r
-       var _          = ' ',\r
-               className  = this[ '_className' ],\r
-               names      = v.split( _ ),\r
+       var _      = ' ',\r
+               _class = this[ '_className' ],\r
+               names  = v.split( _ ),\r
                classNames, i, f, j;\r
-       if( !className ) return this;\r
-       for( classNames = className.split( _ ), i = classNames.length; i; ){\r
-               className = classNames[ --i ];\r
+\r
+       if( !_class ) return this;\r
+       for( classNames = _class.split( _ ), i = classNames.length; i; ){\r
+               _class = classNames[ --i ];\r
                for( j = names.length; j; ){\r
-                       if( className === names[ --j ] ){\r
+                       if( _class === names[ --j ] ){\r
                                classNames.splice( i, 1 );\r
                                names.splice( j, 1 );\r
                                f = true;\r
@@ -991,10 +1052,19 @@ function X_Node_removeClass( v ){
        };\r
        return f ? this[ 'className' ]( classNames.join( _ ) ) : this;\r
 };\r
+\r
+/**\r
+ * className の更新。\r
+ * @alias Node.prototype.toggleClass\r
+ * @param {string} className スペース区切りで複数のクラスを削除できる。\r
+ * @param {boolean} [opt_toggle=] true はクラスの追加。false はクラスの削除。undefined はクラスのトグル。\r
+ * @return {Node} 自身。\r
+ * @example node.toggleClass( 'myClass myClass_new', !!n );\r
+ */\r
 function X_Node_toggleClass( v, opt_toggle ){\r
        var names, i, name;\r
        if( opt_toggle !== undefined ){\r
-               return !!opt_toggle ? this[ 'addClass' ]( v ) : this[ 'removeClass' ]( v );     \r
+               return !opt_toggle ? this[ 'removeClass' ]( v ) : this[ 'addClass' ]( v );      \r
        };\r
        names = v.split( ' ' );\r
        for( i = names.length; i; ){\r
@@ -1003,28 +1073,38 @@ function X_Node_toggleClass( v, opt_toggle ){
        };\r
        return this;\r
 };\r
+\r
+/**\r
+ * className を持つか。\r
+ * @alias Node.prototype.hasClass\r
+ * @param {string} className スペース区切りで複数のクラスを削除できる。\r
+ * @return {boolean} \r
+ * @example node.hasClass( 'myClass myClass_new' );\r
+ */\r
 function X_Node_hasClass( v ){\r
        var _ = ' ',\r
-               className = this[ '_className' ],\r
+               _class = this[ '_className' ],\r
                i, name;\r
-       if( className === v ) return true;\r
-       if( !className ) return false;\r
+       if( _class === v ) return true;\r
+       if( !_class ) return false;\r
        \r
-       className = _ + className + _;\r
-       if( className.indexOf( _ + v + _ ) !== -1 ) return true; // lucky hit\r
+       _class = _ + _class + _;\r
+       if( _class.indexOf( _ + v + _ ) !== -1 ) return true; // lucky hit\r
        \r
        for( v = v.split( _ ), i = v.length; i; ){\r
                name = v[ --i ];\r
                if( name === '' ) continue;\r
-               if( className.indexOf( _ + name + _ ) === -1 ) return false;\r
+               if( _class.indexOf( _ + name + _ ) === -1 ) return false;\r
        };\r
        return true;\r
 };\r
 \r
-/* --------------------------------------\r
- *  html, text\r
- * \r
- * outerHTML が欲しい場合は、xnode.call('outerHTML') とできる。\r
+/**\r
+ * innerHTML 取得・設定。outerHTML が欲しい場合は、xnode.call('outerHTML') とできる。\r
+ * @alias Node.prototype.html\r
+ * @param {string} [html=] html文字列\r
+ * @return {string|Node} \r
+ * @example node.html( '<img>' );\r
  */\r
 function X_Node_html( html ){\r
        var _ = '', q = '"', xnodes, n, i, l;\r
@@ -1065,6 +1145,13 @@ function X_Node_html( html ){
 /*\r
  * null が来たら '', 数値等が来たら文字列化\r
  */\r
+/**\r
+ * textContent 取得・設定。null が来たら '', 数値等が来たら文字列化\r
+ * @alias Node.prototype.text\r
+ * @param {string} [text=]\r
+ * @return {string|Node} \r
+ * @example node.text( 'Hello, world!' );\r
+ */\r
 function X_Node_text( text ){\r
        var xnodes, texts, i, l;\r
        // setter\r
index b6df535..50eaff9 100644 (file)
@@ -14,9 +14,7 @@ function X_NodeList( v ){
        \r
        for( i = 0; i < l; ++i ){\r
                xnode = args[ i ];\r
-               //xnode = xnode && xnode.constructor === Node ? xnode : new Node( xnode );\r
                skip  = false;\r
-               //if( xnode._xnodeType === 0 ) continue;\r
                for( j = 0; j < n; ++j ){\r
                        if( this[ j ] === xnode ){\r
                                skip = true;\r
index 578d9b2..5a0857e 100644 (file)
@@ -396,10 +396,7 @@ function X_Node_Selector__parse( query, last ){
                                                };\r
                                                //console.log( l + ' > ' + xnodes.length + ' tag:' + tagName );\r
                                                merge = {};\r
-                                               for( ; i < l; ++i ){\r
-                                                       xnode = parents[ i ];\r
-                                                       xnode[ '_xnodes' ] && xnode[ '_xnodes' ].length && X_Node_Selector__fetchElements( xnodes, xnode, isAll ? '' : tagName, merge );\r
-                                               };\r
+                                               X_Node_Selector__fetchElements( xnodes, parents, isAll ? '' : tagName, merge );\r
                                                //console.log( l + ' >> ' + xnodes.length + ' tag:' + tagName );\r
                                        };\r
                        };\r
@@ -611,23 +608,69 @@ function X_Node_Selector__parse( query, last ){
                        };\r
                };\r
        };\r
-       \r
-       function X_Node_Selector__fetchElements( list, parent, tag, merge ){\r
-               var xnodes = parent[ '_xnodes' ],\r
-                       l      = xnodes.length,\r
+\r
+       function X_Node_Selector__fetchElements( list, xnodes, tag, merge ){\r
+               var l      = xnodes.length,\r
                        i      = 0,\r
-                       child, uid;\r
+                       child, uid, _tag, _xnodes;\r
                for( ; i < l; ++i ){\r
                        child = xnodes[ i ];\r
                        uid   = child[ '_uid' ];\r
-                       if( !merge[ uid ] && child[ '_tag' ] ){\r
+                       _tag  = child[ '_tag' ];\r
+                       if( !merge[ uid ] && _tag ){\r
                                merge[ uid ] = true;\r
-                               ( !tag || child[ '_tag' ] === tag ) && ( list[ list.length ] = child );\r
-                               child[ '_xnodes' ] && X_Node_Selector__fetchElements( list, child, tag, merge );\r
+                               ( !tag || tag === _tag ) && ( list[ list.length ] = child );\r
+                               if( ( _xnodes = child[ '_xnodes' ] ) && ( 1 < _xnodes.length || ( _xnodes[ 0 ] && _xnodes[ 0 ][ '_tag' ] ) ) ){\r
+                                       X_Node_Selector__fetchElements( list, _xnodes, tag, merge );\r
+                               };\r
                        };\r
                };\r
        };\r
-\r
+/*\r
+       function X_Node_Selector__fetchElements( list, parent, tag, merge ){\r
+               \r
+               var xnodes   = parent[ '_xnodes' ],\r
+                       memory   = {\r
+                               i      : 0,\r
+                               l      : xnodes.length,\r
+                               xnodes : xnodes\r
+                       },              \r
+                       memories = [ memory ],\r
+                       i, l, xnode,\r
+                       uid, _xnodes;\r
+               \r
+               while( memories.length ){\r
+                       memory = memories.pop();\r
+                       xnodes = memory.xnodes;\r
+                       i      = memory.i;\r
+                       l      = memory.l;\r
+                       for( ; i < l; ++i ){\r
+                               xnode = xnodes[ i ];\r
+                               uid   = xnode[ '_uid' ];\r
+                               if( !merge[ uid ] && xnode[ '_tag' ] ){\r
+                                       if( !tag || xnode[ '_tag' ] === tag ) list[ list.length ] = xnode;\r
+                                       \r
+                                       if( _xnodes = xnode[ '_xnodes' ] ){\r
+                                               if( 1 < _xnodes.length || ( _xnodes[ 0 ] && _xnodes[ 0 ][ '_tag' ] ) ){\r
+                                                       memory.i = i + 1;\r
+                                                       memory.l = l;\r
+                                                       memory.xnodes = xnodes;\r
+                                                       memories[ memories.length ] = memory;\r
+                                                       memories[ memories.length ] = {\r
+                                                               i      : 0,\r
+                                                               l      : _xnodes.length,\r
+                                                               xnodes : _xnodes\r
+                                                       };\r
+                                                       merge[ uid ] = true;\r
+                                                       break;\r
+                                               };\r
+                                       };\r
+                               };\r
+                               merge[ uid ] = true;\r
+                       };\r
+               };\r
+       };\r
+ */\r
        function X_Node_Selector__funcSelectorChild( type, flag_all, flags, xnodes ){\r
                var res      = [],\r
                        flag_not = flags.not,\r
@@ -658,8 +701,7 @@ function X_Node_Selector__parse( query, last ){
                return res;\r
        };\r
        function X_Node_Selector__funcSelectorNth( pointer, sibling, flag_all, flags, xnodes, a, b ){\r
-               var _data    = funcData,\r
-                       res      = [],\r
+               var res      = [],\r
                        checked  = {},\r
                        flag_not = flags.not,\r
                        i = 0, n = -1, uid,\r
index ed57307..09d371e 100644 (file)
@@ -405,7 +405,7 @@ X_TEMP.bindElementToXnode =
                                if( elm.nodeType !== 3 ){\r
                                        if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){\r
                                                console.log( '[' +parent[ '_tag' ] + '> UID:' + xnode[ '_uid' ] + ' len:' + xnode[ '_text' ].length + ' code : ' + xnode[ '_text' ].charCodeAt( 0 ) + ',' + xnode[ '_text' ].charCodeAt( 1 ) + '] destroyed.' );\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                                break;\r
                                        };\r
                                        alert(  parent[ '_tag' ] + ' > ' + '"' + xnode[ '_text' ] + '" !== ' + tag + '\n' +\r
@@ -424,12 +424,12 @@ X_TEMP.bindElementToXnode =
                                if( !skipCleanup ){\r
                                        if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){\r
                                                console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] destroy ... ' );\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                        };\r
                                        if( xtext ){\r
                                                xtext[ 'text' ]( xtext[ '_text' ] + text );\r
                                                console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] xtext,destroy ... ' );\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                        } else {\r
                                                //alert( parent[ '_tag' ] + '>' + '"' + text + '"\n' + elm.data );\r
                                                xnode[ 'text' ]( text );\r
@@ -438,7 +438,7 @@ X_TEMP.bindElementToXnode =
                                if( xtext ){\r
                                        xtext[ 'text' ]( xtext[ '_text' ] + xnode[ '_text' ] );\r
                                        console.log( '[' +parent[ '_tag' ] + '>' + xnode[ '_uid' ] + '] xtext,destroy ... ' );\r
-                                       xnode.destroy();\r
+                                       xnode[ 'kill' ]();\r
                                };\r
                                current.xtext = xtext || xnode;\r
                                break;\r
@@ -460,13 +460,13 @@ X_TEMP.bindElementToXnode =
                                //alert( X_String_cleanupWhiteSpace( xnode[ '_text' ] ) );\r
                                if( !skipCleanup ){\r
                                        if( !( text = xnode[ '_text' ] ) || ( text = X_String_cleanupWhiteSpace( text ) ) === ' ' ){\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                                xnode = null;\r
                                        } else\r
                                        if( xtext ){\r
                                                //alert( 'xtext ' + text.charCodeAt( 0 ) + ' : ' + text.length );\r
                                                xtext[ 'text' ]( xtext[ '_text' ] + text );\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                        } else {\r
                                                //alert( 'xnode ' + text.charCodeAt( 0 ) + ' : ' + text.length );\r
                                                xnode[ 'text' ]( text );\r
@@ -475,7 +475,7 @@ X_TEMP.bindElementToXnode =
                                        if( xtext ){\r
                                                //alert( 'skip ' + text.charCodeAt( 0 ) + ' : ' + text.length );\r
                                                xtext[ 'text' ]( xtext[ '_text' ] + xnode[ '_text' ] );\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                        };\r
                                };\r
                                current.xtext = xtext || xnode;\r
@@ -503,7 +503,7 @@ X_TEMP.bindElementToXnode =
                                        xnode[ '_flags' ]    &= X_Node_BitMask_RESET_DIRTY;\r
                                        //xnode[ '_tag' ]     = X_Dom_DTD_TAG_FIX[ tag ] || tag;\r
                                        if( X_TEMP._isCleanupTarget( elm ) ){ //!xnode[ 'hasClass' ]( 'skip-cleanup' ) && ( X_Dom_DTD_CLEANUP_TAGS[ tag ] || xnode[ 'hasClass' ]( 'cleanup-target' ) ) ){\r
-                                               xnode.destroy();\r
+                                               xnode[ 'kill' ]();\r
                                                break;\r
                                        };\r
                                        \r
index b4ede0f..2eeaaa9 100644 (file)
@@ -4,13 +4,11 @@
  */\r
 \r
 // TODO Node.inherits\r
-X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ](\r
+X[ 'Util' ][ 'NinjaIframe' ] = Node[ 'inherits' ](\r
        'NinjaIframe',\r
        {\r
                autoRefresh  : 0,\r
                \r
-               xnodeIframe  : null,\r
-               \r
                _iwin        : null,\r
                \r
                _contentHTML : '',\r
@@ -22,8 +20,10 @@ X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ](
                        this._name = 'hidden-iframe-' + X_Timer_now();\r
                        // https://github.com/polygonplanet/Pot.js/blob/master/src/Worker.js\r
 \r
-                       this.xnodeIframe = X_Node_body[ 'create' ](\r
-                               'iframe',\r
+                       X_Node_newByTag = true;\r
+\r
+                       this[ 'Super' ](\r
+                               'IFRAME',\r
                                {\r
                                        className         : 'hidden-iframe',\r
                                        scrolling         : 'no',\r
@@ -35,64 +35,25 @@ X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ](
                                }\r
                        );\r
                        \r
-                       X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this );\r
-                       \r
                        // http://nanto.asablo.jp/blog/2011/12/08/6237308\r
                        // IE 6/7 で文書間通信を実現するための一案\r
                        if( X_UA[ 'IE' ] < 9 ){\r
-                               this.xnodeIframe[ 'attr' ]( 'src', 'about:blank' );\r
+                               this[ 'attr' ]( 'src', 'about:blank' );\r
                        };\r
                        // Safari 2.0.* bug: iframe's absolute position and src set.\r
                        if( !X_UA[ 'Webkit' ]  ){\r
-                               this.xnodeIframe[ 'css' ]( { position : 'absolute' } );\r
+                               this[ 'css' ]( { position : 'absolute' } );\r
                        };\r
                        \r
-                       if( html ) this._contentHTML = html;\r
-               },\r
-               \r
-               'handleEvent' : function( e ){\r
-                       var raw = this.xnodeIframe[ '_rawObject' ];\r
+                       if( html ) this._contentHTML = html;                    \r
                        \r
-                       switch( e.type ){\r
-                               case X_EVENT_AFTER_UPDATE :\r
-                                       this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
-                                       // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
-                                       // こちらに名前をsetしないとtargetが動作しない\r
-                                       if( X_UA[ 'IE' ] ) this._iwin.name = this._name;\r
-                                       \r
-                                       this.xnodeIframe[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this );\r
-                                       \r
-                                       if( !( X_UA[ 'IE' ] < 9 ) ){\r
-                                               this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
-                                               this._ready = true;\r
-                                               return;\r
-                                       };\r
-                                       //break; これあると IE8 で駄目!\r
-                                       \r
-                               case 'readystatechange' :\r
-                                       if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;\r
-                                       // ie9-\r
-                                       if( !this._ready ){\r
-                                               this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
-                                               this._ready = true;\r
-                                               break;\r
-                                       };\r
-                                       // onload\r
-                               case 'load' :\r
-                                       console.log( 'iframe load.' );\r
-                                       this[ 'asyncDispatch' ]( X_EVENT_SUCCESS );\r
-                                       break;\r
-\r
-                               case 'error' :\r
-                                       this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
-                                       break;\r
-                       };\r
+                       this[ 'appendTo' ]( X_Node_body /* X_Node_systemNode */ );\r
                        \r
-                       return X_Callback_STOP_PROPAGATION;                     \r
+                       X_ViewPort[ 'listenOnce' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
                },\r
                \r
                'refresh' : function( opt_contentHTML ){\r
-                       var raw = this.xnodeIframe[ '_rawObject' ],\r
+                       var raw = this[ '_rawObject' ],\r
                                idoc;\r
                                \r
                        this._ready = false;\r
@@ -117,16 +78,58 @@ X[ 'Util' ][ 'NinjaIframe' ] = X_EventDispatcher[ 'inherits' ](
                },\r
                \r
                'close' : function(){\r
-                       X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this );\r
-                       this.xnodeIframe.call( 'close' );\r
-                       this.xnodeIframe.destroy();\r
+                       X_ViewPort[ 'unlisten' ]( X_EVENT_AFTER_UPDATE, this, X_Util_NinjaIframe_handleEvent );\r
+                       this.call( 'close' );\r
+                       this[ 'kill' ]();\r
                }\r
                \r
        }\r
 );\r
 \r
+\r
+function X_Util_NinjaIframe_handleEvent( e ){\r
+       var raw = this[ '_rawObject' ];\r
+       \r
+       switch( e.type ){\r
+               case X_EVENT_AFTER_UPDATE :\r
+                       this._iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ this._name ];\r
+                       // http://d.hatena.ne.jp/NeoCat/20080921/1221940658\r
+                       // こちらに名前をsetしないとtargetが動作しない\r
+                       if( X_UA[ 'IE' ] ) this._iwin.name = this._name;\r
+                       \r
+                       this[ 'listen' ]( [ X_UA[ 'IE' ] < 9 ? 'readystatechange' : 'load', 'error' ], this, X_Util_NinjaIframe_handleEvent );\r
+                       \r
+                       if( !( X_UA[ 'IE' ] < 9 ) ){\r
+                               this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
+                               this._ready = true;\r
+                               return;\r
+                       };\r
+                       //break; これあると IE8 で駄目!\r
+                       \r
+               case 'readystatechange' :\r
+                       if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) break;\r
+                       // ie9-\r
+                       if( !this._ready ){\r
+                               this._contentHTML && X_Util_NinjaIframe_writeToIframe( this );\r
+                               this._ready = true;\r
+                               break;\r
+                       };\r
+                       // onload\r
+               case 'load' :\r
+                       console.log( 'iframe load.' );\r
+                       this[ 'asyncDispatch' ]( X_EVENT_SUCCESS );\r
+                       break;\r
+\r
+               case 'error' :\r
+                       this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
+                       break;\r
+       };\r
+       \r
+       return X_Callback_STOP_PROPAGATION;\r
+};\r
+\r
 function X_Util_NinjaIframe_writeToIframe( that ){\r
-       var raw  = that.xnodeIframe[ '_rawObject' ],\r
+       var raw  = that[ '_rawObject' ],\r
                idoc = raw.contentDocument || that._iwin.document,\r
                html = that._contentHTML;\r
                \r
index cd5e1d9..a9dcd7f 100644 (file)
@@ -89,7 +89,7 @@ function X_Util_Image_getActualDimension( XnodeOrImageElemOrSrc ){
        \r
        ret = X_Util_Image_actualSize[ img.src ] = [ w, h ];\r
        \r
-       remove && xnode.destroy();\r
+       remove && xnode[ 'kill' ]();\r
        \r
        return ret;\r
 };\r
index 6c008f0..21d5e36 100644 (file)
@@ -182,7 +182,7 @@ function X_NET_JSONP_iframeListener( e ){
                        X_NET_JSONPWrapper[ 'asyncDispatch' ]( X_EVENT_ERROR );
                        break;
        };
-       X_NET_JSONP_NinjaIframe[ 'unlisten' ]();
+       X_EventDispatcher_unlistenAll( X_NET_JSONP_NinjaIframe );
        return X_Callback_UN_LISTEN;
 };
 
index 86bbee3..9f5be7a 100644 (file)
@@ -86,7 +86,7 @@ X_NET_ImageWrapper = X_Class_override(
                                        break;\r
                                case X_EVENT_KILL_INSTANCE :\r
                                        this.reset();\r
-                                       !X_Net_Image_hasImage && this.destroy(); // if xnode\r
+                                       !X_Net_Image_hasImage && this[ 'kill' ](); // if xnode\r
                                        break;\r
                        };\r
                },\r
index edd2dec..acae436 100644 (file)
@@ -93,18 +93,18 @@ X[ 'Audio' ] = X_EventDispatcher[ 'inherits' ](
                                return backend ?\r
                                        backend.state() :\r
                                        {\r
-                                       startTime     : -1,\r
-                                       endTime       : -1,\r
-                                       loopStartTime : -1,\r
-                                       loopEndTime   : -1,\r
-                                       currentTime   : -1,\r
-                                       loop          : false,\r
-                                       looded        : false,\r
-                                       error         : false,\r
-                                       playing       : false,\r
+                                       'startTime'     : -1,\r
+                                       'endTime'       : -1,\r
+                                       'loopStartTime' : -1,\r
+                                       'loopEndTime'   : -1,\r
+                                       'currentTime'   : -1,\r
+                                       'loop'          : false,\r
+                                       'looded'        : false,\r
+                                       'error'         : false,\r
+                                       'playing'       : false,\r
                                        \r
-                                       source        : this[ 'source' ] || '',\r
-                                       duration      : 0\r
+                                       'source'        : this[ 'source' ] || '',\r
+                                       'duration'      : 0\r
                                        };\r
                        };\r
                        backend && backend.state( obj );\r
index c2a113b..f4b84ab 100644 (file)
@@ -236,7 +236,7 @@ if( X[ 'Pulgin' ][ 'SilverlightEnabled' ] ){
                                                        delete this._onload;\r
                                                        X_Callback_correct( this._callback );\r
                                                };\r
-                                               this.xnodeObject.destroy();\r
+                                               this.xnodeObject[ 'kill' ]();\r
                                                break;\r
                                };\r
                        },\r
index 45caa32..3b9366e 100644 (file)
@@ -304,10 +304,22 @@ X_Audio_Sprite_members = {
                },\r
                \r
                state : function( uid, opt_obj ){\r
-                       var track = X_Audio_Sprite_TEMP.tracks[ uid ];\r
+                       var track = X_Audio_Sprite_TEMP.tracks[ uid ],\r
+                               state, start, end;\r
                        // TODO uid = 0\r
                        if( opt_obj === undefined ){\r
-                               return track ? track.state() : { volume : X_Audio_Sprite_TEMP.volume };\r
+                               // TODO pause\r
+                               if( track ){\r
+                                       state = track.state();\r
+                                       start = state.startTime;\r
+                                       return {\r
+                                       'currentTime' : state.currentTime - state.startTime,\r
+                                       'playing'     : state.startTime <= state.currentTime && state.currentTime <= state.endTime,\r
+                                       'duration'    : state.endTime - state.startTime,\r
+                                       'volume'      : X_Audio_Sprite_TEMP.volume\r
+                                       };\r
+                               };\r
+                               return { 'volume' : X_Audio_Sprite_TEMP.volume, 'playing' : false };\r
                        };\r
                        track && track.state( opt_obj );\r
                        return this;\r
index 62c9043..13af1bc 100644 (file)
@@ -386,7 +386,7 @@ X.UI._AbstractUINode = X_EventDispatcher[ 'inherits' ](
                                case 2:\r
                                        \r
                                case 1:\r
-                                       this.xnode.destroy();\r
+                                       this.xnode[ 'kill' ]();\r
                                \r
                                        delete this.root;\r
                                        delete this.rootData;\r
index 8b567a8..43fbb74 100644 (file)
@@ -2,7 +2,7 @@ var X_UI_rootData  = null,
        X_UI_eventBusy = false;
 
 function X_UI_eventRellay( e ){
-       var font    = X.ViewPort.getBaseFontSize(),
+       var font    = X[ 'ViewPort' ][ 'getBaseFontSize' ](),
                x       = e.clientX / font,
                y       = e.clientY / font,
                type    = X.UI.Event.NameToID[ e.type ],
@@ -145,8 +145,8 @@ X.UI._PageRoot = X.UI._Box.inherits(
                        };
                },
                calculate : function( e ){
-                       var size = X.ViewPort.getSize(),
-                               font = X.ViewPort.getBaseFontSize(),
+                       var size = X[ 'ViewPort' ][ 'getSize' ](),
+                               font = X[ 'ViewPort' ][ 'getBaseFontSize' ](),
                                w    = size[ 0 ],
                                h    = size[ 1 ];
                        this.layout.calculate( this, false, 0, 0, w / font, h / font );
@@ -158,7 +158,7 @@ X.UI._PageRoot = X.UI._Box.inherits(
                },
                
                _remove : function(){
-                       this.xnodeInteractiveLayer[ 'unlisten' ]();
+                       X_EventDispatcher_unlistenAll( this.xnodeInteractiveLayer );
                        _Box.prototype._remove.call( this );
                }
        }