/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * The contents of this file are subject to the Netscape Public
 * License Version 1.1 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of
 * the License at http://www.mozilla.org/NPL/
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code is mozilla.org code.
 *
 * The Initial Developer of the Original Code is Netscape
 * Communications Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s): 
 *   Gagan Saksena <gagan@netscape.com> (original author)
 */

#include "nsIURI.idl"

/**
 * The nsIURL interface provides convenience methods that further
 * break down the path portion of nsIURI:
 *
 * http://directory/fileBaseName.fileExtension?query
 * http://directory/fileBaseName.fileExtension#ref
 * http://directory/fileBaseName.fileExtension;param
 *       \          \                       /
 *        \          -----------------------
 *         \                   |          /
 *          \               fileName     /
 *           ----------------------------
 *                       |
 *                   filePath
 *
 * @status UNDER_REVIEW
 */
[scriptable, uuid(d6116970-8034-11d3-9399-00104ba0fd40)]
interface nsIURL : nsIURI
{
    ////////////////////////////////////////////////////////////////////////////
    // The path attribute is broken down into the following attributes:
    // filePath, param, query, and ref:

    /**
     * Returns a path including the directory and file portions of a
     * URL. E.g. The filePath of "http://foo/bar.html#baz" is
     * "/foo/bar.html". 
     */
    attribute string filePath;

    /**
     * Returns the parameters specified after the ; in the URL. 
     *
     */
    attribute string param;

    /**
     * Returns the query portion (the part after the "?") of the URL.
     * If there isn't one, an empty string is returned.
     */
    attribute string query;

    /**
     * Returns the reference portion (the part after the "#") of the URL.
     * If there isn't one, an empty string is returned.
     */
    attribute string ref;

    ////////////////////////////////////////////////////////////////////////////
    // The filePath attribute is further broken down into the following
    // attributes: directory, file:

    /**
     * Returns the directory portion of a URL. 
     * If the URL denotes a path to a directory and not a file,
     * e.g. http://foo/bar/, then the Directory attribute accesses
     * the complete /foo/bar/ portion, and the FileName is the 
     * empty string. If the trailing slash is omitted, then the
     * Directory is /foo/ and the file is bar (i.e. this is a 
     * syntactic, not a semantic breakdown of the Path).
     * And hence dont rely on this for something to be a definitely 
     * be a file. But you can get just the leading directory portion 
     * for sure.
     */
    attribute string directory;

    /**
     * Returns the file name portion of a URL.
     * If the URL denotes a path to a directory and not a file,
     * e.g. http://foo/bar/, then the Directory attribute accesses
     * the complete /foo/bar/ portion, and the FileName is the 
     * empty string. Note that this is purely based on searching 
     * for the last trailing slash. And hence dont rely on this to 
     * be a definite file. 
     */
    attribute string fileName;

    ////////////////////////////////////////////////////////////////////////////
    // The fileName attribute is further broken down into the following
    // attributes: fileName, fileExtension:

    attribute string fileBaseName;

    /**
     * Returns the file extension portion of a filename in a url.
     * If a file extension does not exist, the empty string is returned.
     */
    attribute string fileExtension;

    /**
     * Returns the query portion (the part after the "?") of the URL
     * without unescaping the string.
     * If there isn't one, an empty string is returned.
     */
    readonly attribute string escapedQuery;
};

////////////////////////////////////////////////////////////////////////////////

/**
 * Protocol writers can obtain a default nsIURL implementation by calling the
 * component manager with NS_STANDARDURL_CID. The implementation returned will 
 * only implement the set of accessors specified by nsIURL. After obtaining the
 * instance from the component manager, the Init routine must be called on it
 * to initialize it from the user's URL spec. 
 */

[scriptable, uuid(8793370a-311f-11d4-9876-00c04fa0cf4a)]
interface nsIStandardURL : nsISupports
{
    const unsigned long URLTYPE_STANDARD        = 1;
    const unsigned long URLTYPE_AUTHORITY       = 2;
    const unsigned long URLTYPE_NO_AUTHORITY    = 3;

    void init(in unsigned long urlType,
              in long defaultPort,
              in string initialSpec,
              in nsIURI initialBaseURI);
};
