OSDN Git Service

a75aaaff76b1155b7436b7cd22642c0263c9fbec
[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         'BASE_URL'       : X_URL_BASE_URL,\r
31         \r
32         'IS_FILE'        : X_URL_IS_FILE,\r
33         \r
34         'IS_LOCAL'       : X_URL_IS_LOCAL,\r
35         \r
36         'PARAMS'         : X_URL_PARAMS,\r
37         \r
38         'create'         : X_URL_create,\r
39         \r
40         'toAbsolutePath' : X_URL_toAbsolutePath,\r
41         \r
42         'isSameDomain'   : X_URL_isSameDomain,\r
43         \r
44         'isSameProtocol' : X_URL_isSameProtocol,\r
45         \r
46         'isLocal'        : X_URL_isLocal,\r
47         \r
48         'cleanup'        : X_URL_cleanup,\r
49         \r
50         'getEXT'         : X_URL_getEXT\r
51 };\r
52 \r
53 // ------------------------------------------------------------------------- //\r
54 // --- implements ---------------------------------------------------------- //\r
55 // ------------------------------------------------------------------------- //\r
56 /*\r
57  * original\r
58  * AS3で相対パスを絶対パスに変換する\r
59  * http://www.shin-go.net/motionlab/?p=449\r
60  */\r
61 function X_URL_toAbsolutePath( path ){\r
62         var s  = '/',\r
63                 ss = '//',\r
64                 _ary, ary, i = 0;\r
65 \r
66         if( 'http:file:https:'.indexOf( path.substr( 0, 4 ) ) !== -1 ) return path;\r
67         \r
68         _ary = X_URL_BASE_URL.split( ss );\r
69         ary  = _ary[ 1 ].split( s );\r
70 \r
71         if( path.charAt( 0 ) === s ) return [ _ary[ 0 ], ss, ary[ 0 ], path ].join( '' );\r
72                 \r
73         if( path.substr( 0, 2 ) === './' ){\r
74                 path = path.substr( 2 );\r
75         } else {\r
76                 while( path.substr( i, 3 ) === '../' ){\r
77                         --ary.length;\r
78                         i += 3;\r
79                 };\r
80                 if( i ) path = path.substr( i );\r
81         };\r
82         return [ _ary[ 0 ], ss, ary.join( s ), s, path ].join( '' );\r
83 };\r
84 \r
85 function X_URL_isSameDomain( path ){\r
86         path = X_URL_cleanup( X_URL_toAbsolutePath( path ) );\r
87         return path === X_URL_BASE_URL || path.indexOf( X_URL_BASE_URL + '/' ) === 0;\r
88 };\r
89 \r
90 function X_URL_isSameProtocol( path ){\r
91         return X_URL_toAbsolutePath( path ).indexOf( location.protocol ) === 0;\r
92 };\r
93 \r
94 function X_URL_isLocal( path ){\r
95         return X_URL_toAbsolutePath( path ).indexOf( 'file:' ) === 0;\r
96 };\r
97 \r
98 function X_URL_cleanup( path ){\r
99         return path.split( '?' )[ 0 ].split( '#' )[ 0 ];\r
100 };\r
101 \r
102 function X_URL_getEXT( path ){\r
103         path = X_URL_cleanup( path ).split( '.' );\r
104         return path.length ? path.pop() : '';\r
105 };\r
106 \r
107 function X_URL_objToParam( data ){\r
108         var result = [], k, n = -1;\r
109         for( k in data ){\r
110                 if( n !== -1 ) result[ ++n ] = '&';\r
111                 result[ ++n ] = k;\r
112                 result[ ++n ] = '=';\r
113                 result[ ++n ] = encodeURIComponent( data[ k ] );\r
114         }\r
115         return result.join( '' );\r
116 };\r
117 \r
118 function X_URL_create( url, params ){\r
119         if( !X_Type_isObject( params ) || !( params = X_URL_objToParam( params ) ) ) return url;\r
120         \r
121         return url + ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + params;\r
122 };\r
123 \r
124 function X_URL_ParamToObj( str ){\r
125         var i   = 0,\r
126                 obj = {},\r
127                 parts, l, pair, p;\r
128 \r
129         if( !str ) return obj;\r
130         \r
131         for( parts = str.split( '&' ), l = parts.length; i < l; ++i ){\r
132                 pair = parts[ i ];\r
133                 p    = pair.indexOf( '=' );\r
134                 if( p === -1 ){\r
135                         obj[ decodeURIComponent( pair ) ] = true;\r
136                 } else {\r
137                         obj[ decodeURIComponent( pair.substr( 0, p ) ) ] = X_String_parse( decodeURIComponent( pair.substr( p + 1 ) ) );\r
138                 };\r
139         };\r
140 \r
141         return obj;     \r
142 };\r