blob: c45a6bb71202db3f8760491c4144812dd5839968 [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.uri.Uri");
dojo.uri = new function () {
this.dojoUri = function (uri) {
return new dojo.uri.Uri(dojo.hostenv.getBaseScriptUri(), uri);
};
this.moduleUri = function (module, uri) {
var loc = dojo.hostenv.getModuleSymbols(module).join("/");
if (!loc) {
return null;
}
if (loc.lastIndexOf("/") != loc.length - 1) {
loc += "/";
}
var colonIndex = loc.indexOf(":");
var slashIndex = loc.indexOf("/");
if (loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > slashIndex)) {
loc = dojo.hostenv.getBaseScriptUri() + loc;
}
return new dojo.uri.Uri(loc, uri);
};
this.Uri = function () {
var uri = arguments[0];
for (var i = 1; i < arguments.length; i++) {
if (!arguments[i]) {
continue;
}
var relobj = new dojo.uri.Uri(arguments[i].toString());
var uriobj = new dojo.uri.Uri(uri.toString());
if ((relobj.path == "") && (relobj.scheme == null) && (relobj.authority == null) && (relobj.query == null)) {
if (relobj.fragment != null) {
uriobj.fragment = relobj.fragment;
}
relobj = uriobj;
} else {
if (relobj.scheme == null) {
relobj.scheme = uriobj.scheme;
if (relobj.authority == null) {
relobj.authority = uriobj.authority;
if (relobj.path.charAt(0) != "/") {
var path = uriobj.path.substring(0, uriobj.path.lastIndexOf("/") + 1) + relobj.path;
var segs = path.split("/");
for (var j = 0; j < segs.length; j++) {
if (segs[j] == ".") {
if (j == segs.length - 1) {
segs[j] = "";
} else {
segs.splice(j, 1);
j--;
}
} else {
if (j > 0 && !(j == 1 && segs[0] == "") && segs[j] == ".." && segs[j - 1] != "..") {
if (j == segs.length - 1) {
segs.splice(j, 1);
segs[j - 1] = "";
} else {
segs.splice(j - 1, 2);
j -= 2;
}
}
}
}
relobj.path = segs.join("/");
}
}
}
}
uri = "";
if (relobj.scheme != null) {
uri += relobj.scheme + ":";
}
if (relobj.authority != null) {
uri += "//" + relobj.authority;
}
uri += relobj.path;
if (relobj.query != null) {
uri += "?" + relobj.query;
}
if (relobj.fragment != null) {
uri += "#" + relobj.fragment;
}
}
this.uri = uri.toString();
var regexp = "^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$";
var r = this.uri.match(new RegExp(regexp));
this.scheme = r[2] || (r[1] ? "" : null);
this.authority = r[4] || (r[3] ? "" : null);
this.path = r[5];
this.query = r[7] || (r[6] ? "" : null);
this.fragment = r[9] || (r[8] ? "" : null);
if (this.authority != null) {
regexp = "^((([^:]+:)?([^@]+))@)?([^:]*)(:([0-9]+))?$";
r = this.authority.match(new RegExp(regexp));
this.user = r[3] || null;
this.password = r[4] || null;
this.host = r[5];
this.port = r[7] || null;
}
this.toString = function () {
return this.uri;
};
};
};