OSDN Git Service

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