/*
 * Copyright (C) 2006, 2007, 2009, 2010 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

module html {

    interface HTMLAnchorElement : HTMLElement {
        attribute [Reflect] DOMString accessKey;
        attribute [Reflect] DOMString charset;
        attribute [Reflect] DOMString coords;
        attribute [Reflect, URL] DOMString href;
        attribute [Reflect] DOMString hreflang;
        attribute [Reflect] DOMString name;
        attribute [Reflect] DOMString ping;
        attribute [Reflect] DOMString rel;
        attribute [Reflect] DOMString rev;
        attribute [Reflect] DOMString shape;
        attribute [Reflect] DOMString target;
        attribute [Reflect] DOMString type;

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        readonly attribute DOMString hash;
        readonly attribute DOMString host;
        readonly attribute DOMString hostname;
        readonly attribute DOMString pathname;
        readonly attribute DOMString port;
        readonly attribute DOMString protocol;
        readonly attribute DOMString search;
#else
        attribute [ConvertNullToNullString] DOMString hash;
        attribute [ConvertNullToNullString] DOMString host;
        attribute [ConvertNullToNullString] DOMString hostname;
        attribute [ConvertNullToNullString] DOMString pathname;
        attribute [ConvertNullToNullString] DOMString port;
        attribute [ConvertNullToNullString] DOMString protocol;
        attribute [ConvertNullToNullString] DOMString search;

        readonly attribute [ConvertNullToNullString] DOMString origin;
#endif

        DOMString getParameter(in DOMString name);

        readonly attribute DOMString text;

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        [DontEnum] DOMString toString();
#endif

#if defined(LANGUAGE_OBJECTIVE_C) && LANGUAGE_OBJECTIVE_C
        // Objective-C extension:
        readonly attribute URL absoluteLinkURL;
#endif
    };

}
