OSDN Git Service

bug fixes superCall, merge X.UI.Gesture to X.UI.AbstructUINode.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 08_XURL.js
1 \r
2 // ------------------------------------------------------------------------- //\r
3 // ------------ local variables -------------------------------------------- //\r
4 // ------------------------------------------------------------------------- //\r
5 var X_URL_BASE_URL = ( function( parts ){\r
6                 var last = 1 < parts.length && parts[ parts.length - 1 ];\r
7                 if( last !== false && ( last === '' || //末尾が/で終わるとき\r
8                         last.indexOf( '.' ) !== -1 ) ){    //末尾がファイル名で終わる時\r
9                         --parts.length;\r
10                 };\r
11                 return parts.join( '/' );\r
12         })( X_URL_cleanup( location.href ).split( '/' ) ),\r
13         \r
14         X_URL_IS_FILE  = location.protocol === 'file:',\r
15         \r
16         X_URL_IS_LOCAL = X_URL_IS_FILE || location.hostname === 'localhost' || location.hostname === '127.0.0.1',\r
17         \r
18         X_URL_PARAMS = X_URL_paramToObj( location.search.slice( 1 ) );\r
19 \r
20 // ------------------------------------------------------------------------- //\r
21 // --- interface ----------------------------------------------------------- //\r
22 // ------------------------------------------------------------------------- //\r
23 \r
24 /**\r
25  * @namespace X.URL\r
26  * @alias X.URL\r
27  */\r
28 X[ 'URL' ] = {\r
29         /**\r
30          * ベースurl\r
31          * @alias X.URL.BASE_URL\r
32          * @type {string}\r
33          */\r
34         'BASE_URL'       : X_URL_BASE_URL,\r
35         /**\r
36          * ファイルプロトコルである。\r
37          * @alias X.URL.IS_FILE\r
38          * @type {boolean}\r
39          */\r
40         'IS_FILE'        : X_URL_IS_FILE,\r
41         /**\r
42          * ローカルホストである。\r
43          * @alias X.URL.IS_LOCAL\r
44          * @type {boolean}\r
45          */\r
46         'IS_LOCAL'       : X_URL_IS_LOCAL,\r
47         /**\r
48          * url パラメータを object に格納したもの。\r
49          * @alias X.URL.PARAMS\r
50          * @type {object}\r
51          */\r
52         'PARAMS'         : X_URL_PARAMS,\r
53 \r
54         'create'         : X_URL_create,\r
55         \r
56         'toAbsolutePath' : X_URL_toAbsolutePath,\r
57         \r
58         'objToParam'     : X_URL_objToParam,\r
59         \r
60         'isSameDomain'   : X_URL_isSameDomain,\r
61         \r
62         'isSameProtocol' : X_URL_isSameProtocol,\r
63         \r
64         'isLocal'        : X_URL_isLocal,\r
65         \r
66         'cleanup'        : X_URL_cleanup,\r
67         \r
68         'getEXT'         : X_URL_getEXT\r
69 };\r
70 \r
71 // ------------------------------------------------------------------------- //\r
72 // --- implements ---------------------------------------------------------- //\r
73 // ------------------------------------------------------------------------- //\r
74 /**\r
75  * <p>絶対 url にして返します。\r
76  * <p>original AS3で相対パスを絶対パスに変換する http://www.shin-go.net/motionlab/?p=449\r
77  * @alias X.URL.toAbsolutePath\r
78  * @param {string}\r
79  * @return {string} url\r
80  */\r
81 function X_URL_toAbsolutePath( path ){\r
82         var s  = '/',\r
83                 ss = '//',\r
84                 _ary, ary, i = 0;\r
85 \r
86         if( 'http:file:https:'.indexOf( path.substr( 0, 4 ) ) !== -1 ) return path;\r
87         \r
88         _ary = X_URL_BASE_URL.split( ss );\r
89         ary  = _ary[ 1 ].split( s );\r
90 \r
91         if( path.charAt( 0 ) === s ) return [ _ary[ 0 ], ss, ary[ 0 ], path ].join( '' );\r
92                 \r
93         if( path.substr( 0, 2 ) === './' ){\r
94                 path = path.substr( 2 );\r
95         } else {\r
96                 while( path.substr( i, 3 ) === '../' ){\r
97                         --ary.length;\r
98                         i += 3;\r
99                 };\r
100                 if( i ) path = path.substr( i );\r
101         };\r
102         return [ _ary[ 0 ], ss, ary.join( s ), s, path ].join( '' );\r
103 };\r
104 /**\r
105  * 同一ドメインか?\r
106  * @alias X.URL.isSameDomain\r
107  * @param {string}\r
108  * @return {boolean}\r
109  */\r
110 function X_URL_isSameDomain( path ){\r
111         path = X_URL_cleanup( X_URL_toAbsolutePath( path ) );\r
112         return path === X_URL_BASE_URL || path.indexOf( X_URL_BASE_URL + '/' ) === 0;\r
113 };\r
114 /**\r
115  * 同一プロトコルか?\r
116  * @alias X.URL.isSameProtocol\r
117  * @param {string}\r
118  * @return {boolean}\r
119  */\r
120 function X_URL_isSameProtocol( path ){\r
121         return X_URL_toAbsolutePath( path ).indexOf( location.protocol ) === 0;\r
122 };\r
123 /**\r
124  * ローカルリソースへのアクセスか?\r
125  * @alias X.URL.isLocal\r
126  * @param {string}\r
127  * @return {boolean}\r
128  */\r
129 function X_URL_isLocal( path ){\r
130         return X_URL_toAbsolutePath( path ).indexOf( 'file:' ) === 0;\r
131 };\r
132 /**\r
133  * url パラメータとハッシュフラグメントを削除します。\r
134  * @alias X.URL.cleanup\r
135  * @param {string}\r
136  * @return {boolean}\r
137  */\r
138 function X_URL_cleanup( path ){\r
139         return path.split( '?' )[ 0 ].split( '#' )[ 0 ];\r
140 };\r
141 /**\r
142  * 拡張子を返します。\r
143  * @alias X.URL.getEXT\r
144  * @param {string}\r
145  * @return {string}\r
146  */\r
147 function X_URL_getEXT( path ){\r
148         path = X_URL_cleanup( path ).split( '.' );\r
149         return path.length ? path.pop() : '';\r
150 };\r
151 /**\r
152  * object を url パラメータにします。値が object の場合、データは失われます。\r
153  * @alias X.URL.objToParam\r
154  * @param {object}\r
155  * @return {string}\r
156  */\r
157 function X_URL_objToParam( data ){\r
158         var result = [], k, n = -1;\r
159         for( k in data ){\r
160                 if( n !== -1 ) result[ ++n ] = '&';\r
161                 result[ ++n ] = k;\r
162                 result[ ++n ] = '=';\r
163                 result[ ++n ] = encodeURIComponent( data[ k ] );\r
164         }\r
165         return result.join( '' );\r
166 };\r
167 /**\r
168  * url にパラメータを加えた url を返します。\r
169  * @alias X.URL.create\r
170  * @param {string}\r
171  * @param {object}\r
172  * @return {string}\r
173  */\r
174 function X_URL_create( url, params ){\r
175         if( !X_Type_isObject( params ) || !( params = X_URL_objToParam( params ) ) ) return url;\r
176         \r
177         return url + ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + params;\r
178 };\r
179 \r
180 function X_URL_paramToObj( str ){\r
181         var i   = 0,\r
182                 obj = {},\r
183                 parts, l, pair, p;\r
184 \r
185         if( !str ) return obj;\r
186         \r
187         for( parts = str.split( '&' ), l = parts.length; i < l; ++i ){\r
188                 pair = parts[ i ];\r
189                 p    = pair.indexOf( '=' );\r
190                 if( p === -1 ){\r
191                         obj[ decodeURIComponent( pair ) ] = true;\r
192                 } else {\r
193                         obj[ decodeURIComponent( pair.substr( 0, p ) ) ] = X_String_parse( decodeURIComponent( pair.substr( p + 1 ) ) );\r
194                 };\r
195         };\r
196 \r
197         return obj;     \r
198 };\r