| "use strict"; | 
|   | 
| var constants  = require("./constants"); | 
| var formatUrl  = require("./format"); | 
| var getOptions = require("./options"); | 
| var objUtils   = require("./util/object"); | 
| var parseUrl   = require("./parse"); | 
| var relateUrl  = require("./relate"); | 
|   | 
|   | 
|   | 
| function RelateUrl(from, options) | 
| { | 
|     this.options = getOptions(options, | 
|     { | 
|         defaultPorts: {ftp:21, http:80, https:443}, | 
|         directoryIndexes: ["index.html"], | 
|         ignore_www: false, | 
|         output: RelateUrl.SHORTEST, | 
|         rejectedSchemes: ["data","javascript","mailto"], | 
|         removeAuth: false, | 
|         removeDirectoryIndexes: true, | 
|         removeEmptyQueries: false, | 
|         removeRootTrailingSlash: true, | 
|         schemeRelative: true, | 
|         site: undefined, | 
|         slashesDenoteHost: true | 
|     }); | 
|      | 
|     this.from = parseUrl.from(from, this.options, null); | 
| } | 
|   | 
|   | 
|   | 
| /* | 
|     Usage: instance=new RelateUrl(); instance.relate(); | 
| */ | 
| RelateUrl.prototype.relate = function(from, to, options) | 
| { | 
|     // relate(to,options) | 
|     if ( objUtils.isPlainObject(to) ) | 
|     { | 
|         options = to; | 
|         to = from; | 
|         from = null; | 
|     } | 
|     // relate(to) | 
|     else if (!to) | 
|     { | 
|         to = from; | 
|         from = null; | 
|     } | 
|      | 
|     options = getOptions(options, this.options); | 
|     from = from || options.site; | 
|     from = parseUrl.from(from, options, this.from); | 
|      | 
|     if (!from || !from.href) | 
|     { | 
|         throw new Error("from value not defined."); | 
|     } | 
|     else if (from.extra.hrefInfo.minimumPathOnly) | 
|     { | 
|         throw new Error("from value supplied is not absolute: "+from.href); | 
|     } | 
|      | 
|     to = parseUrl.to(to, options); | 
|      | 
|     if (to.valid===false) return to.href; | 
|      | 
|     to = relateUrl(from, to, options); | 
|     to = formatUrl(to, options); | 
|      | 
|     return to; | 
| } | 
|   | 
|   | 
|   | 
| /* | 
|     Usage: RelateUrl.relate(); | 
| */ | 
| RelateUrl.relate = function(from, to, options) | 
| { | 
|     return new RelateUrl().relate(from, to, options); | 
| } | 
|   | 
|   | 
|   | 
| // Make constants accessible from API | 
| objUtils.shallowMerge(RelateUrl, constants); | 
|   | 
|   | 
|   | 
| module.exports = RelateUrl; |