1 define("dojo/_base/url", ["./kernel"], function(dojo) {
5 // This module contains dojo._Url
8 ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),
9 ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),
14 // resolve uri components relative to each other
15 for(var i = 1; i<_a.length; i++){
16 if(!_a[i]){ continue; }
18 // Safari doesn't support this.constructor so we have to be explicit
19 // FIXME: Tracked (and fixed) in Webkit bug 3537.
20 // http://bugs.webkit.org/show_bug.cgi?id=3537
21 var relobj = new _Url(_a[i]+""),
22 uriobj = new _Url(uri[0]+"");
30 if(relobj.fragment != n){
31 uriobj.fragment = relobj.fragment;
34 }else if(!relobj.scheme){
35 relobj.scheme = uriobj.scheme;
37 if(!relobj.authority){
38 relobj.authority = uriobj.authority;
40 if(relobj.path.charAt(0) != "/"){
41 var path = uriobj.path.substring(0,
42 uriobj.path.lastIndexOf("/") + 1) + relobj.path;
44 var segs = path.split("/");
45 for(var j = 0; j < segs.length; j++){
47 // flatten "./" references
48 if(j == segs.length - 1){
54 }else if(j > 0 && !(j == 1 && segs[0] == "") &&
55 segs[j] == ".." && segs[j-1] != ".."){
56 // flatten "../" references
57 if(j == (segs.length - 1)){
61 segs.splice(j - 1, 2);
66 relobj.path = segs.join("/");
73 uri.push(relobj.scheme, ":");
76 uri.push("//", relobj.authority);
78 uri.push(relobj.path);
80 uri.push("?", relobj.query);
83 uri.push("#", relobj.fragment);
87 this.uri = uri.join("");
89 // break the uri into its main components
90 var r = this.uri.match(ore);
92 this.scheme = r[2] || (r[1] ? "" : n);
93 this.authority = r[4] || (r[3] ? "" : n);
94 this.path = r[5]; // can never be undefined
95 this.query = r[7] || (r[6] ? "" : n);
96 this.fragment = r[9] || (r[8] ? "" : n);
98 if(this.authority != n){
99 // server based naming authority
100 r = this.authority.match(ire);
102 this.user = r[3] || n;
103 this.password = r[4] || n;
104 this.host = r[6] || r[7]; // ipv6 || ipv4
105 this.port = r[9] || n;
108 _Url.prototype.toString = function(){ return this.uri; };
110 return dojo._Url = _Url;