OSDN Git Service

Version 0.6.144, fix Gesture for iOS4, fix Node.css, fix X.Net.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 04_XNetImage.js
1 /* \r
2  * original\r
3  *  LICENSE: MIT?\r
4  *  URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631\r
5  *  AUTHOR: uupaa.js@gmail.com\r
6  * \r
7  */\r
8 \r
9 var X_Net_Image_hasImage  = !!window[ 'Image' ],\r
10         X_Net_Image_image     = X_Net_Image_hasImage && new Image(),\r
11         // IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
12         X_Net_Image_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_Net_Image_image );\r
13         \r
14 \r
15 if( !X_Net_Image_hasImage ){\r
16         alert( 'no Image!' );\r
17 } else\r
18 if( X_Net_Image_isElement ){\r
19         //alert( 'X_Net_Image_isElement ' + X_Net_Image_isElement );\r
20 };\r
21 \r
22 /*\r
23  * TODO\r
24  * new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
25  * Image は、X.EventDispatcher で、<img> は X.Node で。 \r
26  * \r
27  * Opera7 では毎回 image を作る必要あり、src が異なればOK?\r
28  */\r
29 \r
30 X_TEMP.X_NET_Image_init = function(){\r
31 \r
32 delete X_TEMP.X_NET_Image_init;\r
33 \r
34 X_NET_ImageWrapper = X_Class_override(\r
35         !X_Net_Image_isElement ? X_EventDispatcher( X_Net_Image_image ) : Node( X_Net_Image_image ),\r
36         {\r
37 \r
38                 _busy      : false,\r
39                 tick       : 0,\r
40                 timerID    : 0,\r
41                 finish     : false,\r
42                 abspath    : '',\r
43                 delay      : 0,\r
44                 timeout    : 0,\r
45                 \r
46                 load : function( data ){\r
47                         this._busy   = true;\r
48                         this.abspath = X_URL_toAbsolutePath( data[ 'url' ] );\r
49                         this.delay   = data[ 'delay'   ] || 100;\r
50                         this.timeout = data[ 'timeout' ] || 5000;\r
51 \r
52                         this[ '_rawObject' ].src = this.abspath;\r
53 \r
54                         if( X_UA[ 'Opera7' ] && this[ '_rawObject' ].complete ){\r
55                                 this[ 'asyncDispatch' ]( 'load' );\r
56                         } else {\r
57                                 this.timerID = X_Timer_add( this.delay, 0, this, X_NET_Image_detect );\r
58                         };\r
59                 },\r
60                 \r
61                 cancel : function(){\r
62                         // abort がある?\r
63                         this[ '_rawObject' ] && this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();\r
64                         // this[ '_rawObject' ].src = '';\r
65                         this._busy  = false;\r
66                         this.finish = true;\r
67                 },\r
68                 \r
69                 reset : function(){\r
70                         this.timerID && X_Timer_remove( this.timerID );\r
71                         //X_Net_Image_isElement ? this[ '_rawObject' ].removeAttribute( 'src' ) : ( this[ '_rawObject' ].src = '' );\r
72                         this[ '_rawObject' ].src = '';\r
73                         this.timerID  = 0;\r
74                         this._busy    = false;\r
75                         this.finished = false;\r
76                         this.abspath  = '';\r
77                 }\r
78         }\r
79 );\r
80 \r
81 X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
82 \r
83 return X_NET_ImageWrapper;\r
84 \r
85 };\r
86 \r
87 function X_NET_Image_detect(){\r
88         if( this.finish ) return;\r
89         if( this[ '_rawObject' ] && this[ '_rawObject' ].complete ){\r
90                 this._busy  = false;\r
91                 this.finish = true;\r
92                 if( this[ '_rawObject' ].width ) return;\r
93                 X_Timer_remove( this.timerID );\r
94                 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
95         } else\r
96         if( this.timeout < ( this.tick += this.delay ) ){\r
97                 this._busy  = false;\r
98                 this.finish = true;\r
99                 X_Timer_remove( this.timerID );\r
100                 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_TIMEOUT );\r
101         };\r
102 };\r
103 \r
104 function X_NET_Image_handleEvent( e ){\r
105         var size;\r
106         \r
107         switch( e.type ){\r
108                 case 'error' :\r
109                 //case 'abort' : // TODO ??\r
110                         if( this.finish ) return;\r
111                         this._busy  = false;\r
112                         this.finish  = true;\r
113                         this.timerID && X_Timer_remove( this.timerID );\r
114                         this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ );\r
115                         break;\r
116 \r
117                 case 'load' :\r
118                 // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
119                 // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
120                         this._busy  = false;\r
121                         this.finish = true;\r
122                         this.timerID && X_Timer_remove( this.timerID );\r
123                         if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){\r
124                                 this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
125                                 return;\r
126                         };\r
127 \r
128                         size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
129                         this.timerID = this[ 'asyncDispatch' ]( {\r
130                                 type : X_EVENT_SUCCESS,\r
131                                 src  : this.abspath,\r
132                                 w    : size[ 0 ],\r
133                                 h    : size[ 1 ]\r
134                                 // TODO feedback net speed\r
135                                 // time , this[ '_rawObject' ].fileSize\r
136                         } );\r
137                         break;\r
138 \r
139                 case X_EVENT_KILL_INSTANCE :\r
140                         this.reset();\r
141                         !X_Net_Image_hasImage && this[ 'kill' ](); // if xnode\r
142                         break;\r
143         };\r
144 };\r
145 \r
146 \r
147 // X_Net_Image_isElement && X_NET_ImageWrapper[ 'appendAt' ]( X.X_Node_systemNode );\r