OSDN Git Service

Version 0.6.104, fix X_shortcut & etc.
[pettanr/clientJs.git] / 0.6.x / js / 05_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 X_NET_ImageWrapper = X_Class_override(\r
30         !X_Net_Image_isElement ? new X.EventDispatcher( X_Net_Image_image ) : new X.Node( X_Net_Image_image ),\r
31         {\r
32 \r
33                 _busy      : false,\r
34                 tick       : 0,\r
35                 timerID    : 0,\r
36                 finish     : false,\r
37                 abspath    : '',\r
38                 delay      : 0,\r
39                 timeout    : 0,\r
40                 \r
41                 load : function( data ){\r
42                         this._busy   = true;\r
43                         this.abspath = X.URL.toAbsolutePath( data.url );\r
44                         this.delay   = data.delay || 100;\r
45                         this.timeout = data.timeout || 5000;\r
46                         this.timerID = X.Timer.add( this.delay, 0, this, this._detect );\r
47                         \r
48                         //X_Net_Image_hasImage ? ( this._rawObject.src = this.abspath ) : this.attr( 'src', this.abspath );\r
49                         /*\r
50                         if( X_UA.Opera7 ){\r
51                                 X_EventDispatcher_toggleAllEvents( this, false );\r
52                                 this._rawObject = new Image();\r
53                                 X_EventDispatcher_toggleAllEvents( this, true );\r
54                         }; */\r
55                         \r
56                         this._rawObject.src = this.abspath;\r
57                         //alert( this._rawObject.src + ' ' + this._rawObject.complete );\r
58                         if( X_UA.Opera7 && this._rawObject.complete ){\r
59                                 this.asyncDispatch( 'load' );\r
60                         } else {\r
61                                 this.timerID = X.Timer.add( this.delay, 0, this, this._detect );\r
62                         };\r
63                         //alert( this._rawObject.src + ' ' + this._rawObject.complete );\r
64                 },\r
65                 \r
66                 handleEvent : function( e ){\r
67                         var size;\r
68                         switch( e.type ){\r
69                                 case 'error' :\r
70                                 //case 'abort' : // TODO ??\r
71                                         if( this.finish ) return;\r
72                                         this._busy  = false;\r
73                                         this.finish  = true;\r
74                                         this.timerID && X.Timer.remove( this.timerID );\r
75                                         this.timerID = this.asyncDispatch( /*e.type === 'error' ?*/ X.Event.ERROR /*: X.Event.CANCELED*/ );\r
76                                         break;\r
77                                 case 'load' :\r
78                                 // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
79                                 // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
80                                         this._busy  = false;\r
81                                         this.finish = true;\r
82                                         this.timerID && X.Timer.remove( this.timerID );\r
83                                         if( X_UA.Opera && !this._rawObject.complete ){\r
84                                                 this.timerID = this.asyncDispatch( X.Event.ERROR );\r
85                                                 return;\r
86                                         };\r
87                                         size = X.Util.Image.getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
88                                         this.timerID = this.asyncDispatch( {\r
89                                                 type : X.Event.SUCCESS,\r
90                                                 src  : this.abspath,\r
91                                                 w    : size[ 0 ],\r
92                                                 h    : size[ 1 ]\r
93                                         } );\r
94                                         break;\r
95                                 case X.Event.KILL_INSTANCE :\r
96                                         this.reset();\r
97                                         !X_Net_Image_hasImage && this.destroy(); // if xnode\r
98                                         break;\r
99                         };\r
100                 },\r
101                 \r
102                 _detect : function(){\r
103                         if( this.finish ) return;\r
104                         if( this._rawObject && this._rawObject.complete ){\r
105                                 this._busy  = false;\r
106                                 this.finish = true;\r
107                                 if( this._rawObject.width ) return;\r
108                                 X.Timer.remove( this.timerID );\r
109                                 this.timerID = this.asyncDispatch( X.Event.ERROR );\r
110                         } else\r
111                         if( this.timeout < ( this.tick += this.delay ) ){\r
112                                 this._busy  = false;\r
113                                 this.finish = true;\r
114                                 X.Timer.remove( this.timerID );\r
115                                 this.timerID = this.asyncDispatch( X.Event.TIMEOUT );\r
116                         };\r
117                 },\r
118                 \r
119                 cancel : function(){\r
120                         // abort がある?\r
121                         this._rawObject && this._rawObject.abort && this._rawObject.abort();\r
122                         this._busy  = false;\r
123                         this.finish = true;\r
124                         this.asyncDispatch( X.Event.CANCELED );\r
125                 },\r
126                 \r
127                 reset : function(){\r
128                         this.timerID && X.Timer.remove( this.timerID );\r
129                         //X_Net_Image_isElement ? this._rawObject.removeAttribute( 'src' ) : ( this._rawObject.src = '' );\r
130                         this._rawObject.src = '';\r
131                         this.timerID  = 0;\r
132                         this._busy    = false;\r
133                         this.finished = false;\r
134                         this.abspath  = '';\r
135                 }\r
136         }\r
137 );\r
138 \r
139 X_NET_ImageWrapper.listen( [ 'load', 'error' /*, 'abort'*/, X.Event.KILL_INSTANCE ] );\r
140 \r
141 // X_Net_Image_isElement && X_NET_ImageWrapper.appendTo( X.X_Node_systemNode );\r