/*
 * Copyright 2008 Jacek Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "jsglobal_dispid.h"

import "oaidl.idl";

[
    uuid(3eef9759-35fc-11d1-8ce4-00c04fc2b085),
    version(1.0),
]
library JSGlobal
{
    importlib("stdole2.tlb");

    interface StringInstance;

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b086)
    ]
    dispinterface GlobalObj {
    properties:
        [id(DISPID_GLOBAL_NAN), readonly]
        VARIANT NaN;

        [id(DISPID_GLOBAL_INFINITY), readonly]
        VARIANT Infinity;

    methods:
        [id(DISPID_GLOBAL_ARRAY)]
        VARIANT Array();

        [id(DISPID_GLOBAL_BOOLEAN)]
        VARIANT Boolean();

        [id(DISPID_GLOBAL_DATE)]
        VARIANT Date();

        [id(DISPID_GLOBAL_FUNCTION)]
        VARIANT Function();

        [id(DISPID_GLOBAL_NUMBER)]
        VARIANT Number();

        [id(DISPID_GLOBAL_OBJECT)]
        VARIANT Object();

        [id(DISPID_GLOBAL_STRING)]
        VARIANT String();

        [id(DISPID_GLOBAL_REGEXP)]
        VARIANT RegExp();

        [id(DISPID_GLOBAL_ACTIVEXOBJ)]
        VARIANT ActiveXObject();

        [id(DISPID_GLOBAL_VBARRAY)]
        VARIANT VBArray();

        [id(DISPID_GLOBAL_ENUMERATOR)]
        VARIANT Enumerator();

        [id(DISPID_GLOBAL_ESCAPE)]
        VARIANT escape(VARIANT String);

        [id(DISPID_GLOBAL_EVAL)]
        VARIANT eval(VARIANT x);

        [id(DISPID_GLOBAL_ISNAN)]
        VARIANT isNaN(VARIANT Number);

        [id(DISPID_GLOBAL_ISFINITE)]
        VARIANT isFinite(VARIANT Number);

        [id(DISPID_GLOBAL_PARSEINT)]
        VARIANT parseInt(
                VARIANT String,
                VARIANT radix);

        [id(DISPID_GLOBAL_PARSEFLOAT)]
        VARIANT parseFloat(VARIANT String);

        [id(DISPID_GLOBAL_UNESCAPE)]
        VARIANT unescape(VARIANT String);

        [id(DISPID_GLOBAL_GETOBJECT)]
        VARIANT GetObject(
                [optional] VARIANT path,
                [optional] VARIANT classname);

        [id(DISPID_GLOBAL_SCRIPTENGINE)]
        VARIANT ScriptEngine();

        [id(DISPID_GLOBAL_MAJORVER)]
        VARIANT ScriptEngineMajorVersion();

        [id(DISPID_GLOBAL_MINORVER)]
        VARIANT ScriptEngineMinorVersion();

        [id(DISPID_GLOBAL_BUILDVER)]
        VARIANT ScriptEngineBuildVersion();

        [id(DISPID_GLOBAL_COLLECT)]
        VARIANT CollectGarbage();

        [id(DISPID_GLOBAL_MATH)]
        VARIANT Math();
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b087)
    ]
    dispinterface DateObj {
    properties:
    methods:
        [id(DISPID_DATEOBJ_PARSE)]
        VARIANT parse(VARIANT String);

        [id(DISPID_DATEOBJ_UTC)]
        VARIANT UTC(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date,
                [optional] VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT ms);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b088)
    ]
    dispinterface MathObj {
    properties:
        [id(DISPID_MATHOBJ_E), readonly]
        VARIANT E;

        [id(DISPID_MATHOBJ_LOG2E), readonly]
        VARIANT LOG2E;

        [id(DISPID_MATHOBJ_LOG10E), readonly]
        VARIANT LOG10E;

        [id(DISPID_MATHOBJ_LN2), readonly]
        VARIANT LN2;

        [id(DISPID_MATHOBJ_LN10), readonly]
        VARIANT LN10;

        [id(DISPID_MATHOBJ_PI), readonly]
        VARIANT PI;

        [id(DISPID_MATHOBJ_SQRT2), readonly]
        VARIANT SQRT2;

        [id(DISPID_MATHOBJ_SQRT1_2), readonly]
        VARIANT SQRT1_2;

    methods:
        [id(DISPID_MATHOBJ_ABS)]
        VARIANT abs(VARIANT x);

        [id(DISPID_MATHOBJ_ACOS)]
        VARIANT acos(VARIANT x);

        [id(DISPID_MATHOBJ_ASIN)]
        VARIANT asin(VARIANT x);

        [id(DISPID_MATHOBJ_ATAN)]
        VARIANT atan(VARIANT x);

        [id(DISPID_MATHOBJ_ATAN2)]
        VARIANT atan2(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_CEIL)]
        VARIANT ceil(VARIANT x);

        [id(DISPID_MATHOBJ_COS)]
        VARIANT cos(VARIANT x);

        [id(DISPID_MATHOBJ_EXP)]
        VARIANT exp(VARIANT x);

        [id(DISPID_MATHOBJ_FLOOR)]
        VARIANT floor(VARIANT x);

        [id(DISPID_MATHOBJ_LOG)]
        VARIANT log(VARIANT x);

        [id(DISPID_MATHOBJ_MAX)]
        VARIANT max(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_MIN)]
        VARIANT min(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_POW)]
        VARIANT pow(VARIANT x, VARIANT y);

        [id(DISPID_MATHOBJ_RANDOM)]
        VARIANT random();

        [id(DISPID_MATHOBJ_ROUND)]
        VARIANT round(VARIANT x);

        [id(DISPID_MATHOBJ_SIN)]
        VARIANT sin(VARIANT x);

        [id(DISPID_MATHOBJ_SQRT)]
        VARIANT sqrt(VARIANT x);

        [id(DISPID_MATHOBJ_TAN)]
        VARIANT tan(VARIANT x);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b089)
    ]
    dispinterface NumberObj {
    properties:
        [id(DISPID_NUMBEROBJ_MAX_VALUE), readonly]
        VARIANT MAX_VALUE;

        [id(DISPID_NUMBEROBJ_MIN_VALUE), readonly]
        VARIANT MIN_VALUE;

        [id(DISPID_NUMBEROBJ_NAN), readonly]
        VARIANT NaN;

        [id(DISPID_NUMBEROBJ_NEGATIVE_INFINITY), readonly]
        VARIANT NEGATIVE_INFINITY;

        [id(DISPID_NUMBEROBJ_POSITIVE_INFINITY), readonly]
        VARIANT POSITIVE_INFINITY;

    methods:
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b090)
    ]
    dispinterface RegExpObj {
    properties:
        [id(DISPID_REGEXPOBJ_INDEX), readonly]
        VARIANT index;

        [id(DISPID_REGEXPOBJ_INPUT), readonly]
        VARIANT input;

        [id(DISPID_REGEXPOBJ_LASTINDEX), readonly]
        VARIANT lastIndex;

    methods:
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b091)
    ]
    dispinterface StringObj {
    properties:
    methods:
        [id(DISPID_STRINGOBJ_FROMCHARCODE)]
        VARIANT fromCharCode(VARIANT char0);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b092)
    ]
    dispinterface ArrayInstance {
    properties:
        [id(DISPID_ARRAY_LENGTH)]
        VARIANT length;

    methods:
        [id(DISPID_ARRAY_CONCAT)]
        ArrayInstance *concat(VARIANT Array);

        [id(DISPID_ARRAY_JOIN)]
        StringInstance *join(VARIANT separator);

        [id(DISPID_ARRAY_POP)]
        VARIANT pop();

        [id(DISPID_ARRAY_PUSH)]
        VARIANT push(VARIANT value);

        [id(DISPID_ARRAY_REVERSE)]
        ArrayInstance *reverse();

        [id(DISPID_ARRAY_SHIFT)]
        VARIANT shift();

        [id(DISPID_ARRAY_SLICE)]
        ArrayInstance *slice(
                VARIANT start,
                VARIANT end);

        [id(DISPID_ARRAY_SORT)]
        ArrayInstance *sort(VARIANT sortfunction);

        [id(DISPID_ARRAY_SPLICE)]
        ArrayInstance *splice(
                VARIANT start,
                VARIANT deletecount);

        [id(DISPID_ARRAY_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ARRAY_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ARRAY_VALUEOF)]
        ArrayInstance *valueOf();

        [id(DISPID_ARRAY_UNSHIFT)]
        VARIANT unshift(VARIANT value);

        [id(DISPID_ARRAY_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ARRAY_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ARRAY_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b093)
    ]
    dispinterface FunctionInstance {
    properties:
        [id(DISPID_FUNCTION_LENGTH)]
        VARIANT length;
    methods:
        [id(DISPID_FUNCTION_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_FUNCTION_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_FUNCTION_VALUEOF)]
        FunctionInstance *valueOf();

        [id(DISPID_FUNCTION_APPLY)]
        VARIANT apply(
                VARIANT thisValue,
                VARIANT argArray);

        [id(DISPID_FUNCTION_CALL)]
        VARIANT call(VARIANT thisValue);

        [id(DISPID_FUNCTION_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_FUNCTION_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_FUNCTION_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b094)
    ]
    dispinterface StringInstance {
    properties:
        [id(DISPID_STRING_LENGTH)]
        VARIANT length;
    methods:
        [id(DISPID_STRING_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_STRING_VALUEOF)]
        StringInstance *valueOf();

        [id(DISPID_STRING_ANCHOR)]
        StringInstance *anchor(VARIANT anchorString);

        [id(DISPID_STRING_BIG)]
        StringInstance *big();

        [id(DISPID_STRING_BLINK)]
        StringInstance *blink();

        [id(DISPID_STRING_BOLD)]
        StringInstance *bold();

        [id(DISPID_STRING_CHARAT)]
        StringInstance *charAt(VARIANT index);

        [id(DISPID_STRING_CHARCODEAT)]
        VARIANT charCodeAt(VARIANT index);

        [id(DISPID_STRING_CONCAT)]
        StringInstance *concat(VARIANT String);

        [id(DISPID_STRING_FIXED)]
        StringInstance *fixed();

        [id(DISPID_STRING_FONTCOLOR)]
        StringInstance *fontcolor(VARIANT colorval);

        [id(DISPID_STRING_FONTSIZE)]
        StringInstance *fontsize(VARIANT size);

        [id(DISPID_STRING_INDEXOF)]
        VARIANT indexOf(
                VARIANT substring,
                VARIANT startindex);

        [id(DISPID_STRING_ITALICS)]
        StringInstance *italics();

        [id(DISPID_STRING_LASTINDEXOF)]
        VARIANT lastIndexOf(
                VARIANT substring,
                VARIANT startindex);

        [id(DISPID_STRING_LINK)]
        StringInstance *link(VARIANT linkstring);

        [id(DISPID_STRING_MATCH)]
        VARIANT match(VARIANT RegExp);

        [id(DISPID_STRING_REPLACE)]
        StringInstance *replace(
                VARIANT RegExp,
                VARIANT replacetext);

        [id(DISPID_STRING_SEARCH)]
        VARIANT search(VARIANT RegExp);

        [id(DISPID_STRING_SLICE)]
        StringInstance *slice(
                VARIANT start,
                VARIANT end);

        [id(DISPID_STRING_SMALL)]
        StringInstance *_small(); /* FIXME */

        [id(DISPID_STRING_SPLIT)]
        ArrayInstance *split(VARIANT RegExp);

        [id(DISPID_STRING_STRIKE)]
        StringInstance *strike();

        [id(DISPID_STRING_SUB)]
        StringInstance *sub();

        [id(DISPID_STRING_SUBSTRING)]
        StringInstance *substring(
                VARIANT start,
                VARIANT end);

        [id(DISPID_STRING_SUBSTR)]
        StringInstance *substr(
                VARIANT start,
                VARIANT length);

        [id(DISPID_STRING_SUP)]
        StringInstance *sup();

        [id(DISPID_STRING_TOLOWERCASE)]
        StringInstance *toLowerCase();

        [id(DISPID_STRING_TOUPPERCASE)]
        StringInstance *toUpperCase();

        [id(DISPID_STRING_TOLOCLOWERCASE)]
        StringInstance *toLocaleLowerCase();

        [id(DISPID_STRING_TOLOCUPPERCASE)]
        StringInstance *toLocaleUpperCase();

        [id(DISPID_STRING_LOCCOMPARE)]
        VARIANT localeCompare(VARIANT that);

        [id(DISPID_STRING_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_STRING_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_STRING_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b095)
    ]
    dispinterface BoolInstance {
    properties:
    methods:
        [id(DISPID_BOOL_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_BOOL_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_BOOL_VALUEOF)]
        VARIANT valueOf();

        [id(DISPID_BOOL_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_BOOL_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_BOOL_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b096)
    ]
    dispinterface NumberInstance {
    properties:
    methods:
        [id(DISPID_NUMBER_TOSTRING)]
        StringInstance *toString(VARIANT radix);

        [id(DISPID_NUMBER_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_NUMBER_TOFIXED)]
        StringInstance *toFixed(VARIANT fractionDigits);

        [id(DISPID_NUMBER_TOEXPONENTIAL)]
        StringInstance *toExponential(VARIANT fractionDigits);

        [id(DISPID_NUMBER_TOPRECISION)]
        StringInstance *toPrecision(VARIANT precision);

        [id(DISPID_NUMBER_VALUEOF)]
        VARIANT valueOf();

        [id(DISPID_NUMBER_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_NUMBER_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_NUMBER_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b097)
    ]
    dispinterface ObjectInstance {
    properties:
    methods:
        [id(DISPID_OBJECT_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_OBJECT_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_OBJECT_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_OBJECT_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_OBJECT_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_OBJECT_VALUEOF)]
        ObjectInstance *valueOf();
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00C04fc2b098)
    ]
    dispinterface DateInstance {
    properties:
    methods:
        [id(DISPID_DATE_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_DATE_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_DATE_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_DATE_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_DATE_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_DATE_VALUEOF)]
        DateInstance *valueOf();

        [id(DISPID_DATE_TOUTCSTRING)]
        StringInstance *toUTCString();

        [id(DISPID_DATE_TODATESTRING)]
        StringInstance *toDateString();

        [id(DISPID_DATE_TOTIMESTRING)]
        StringInstance *toTimeString();

        [id(DISPID_DATE_TOLOCDATESTRING)]
        StringInstance *toLocaleDateString();

        [id(DISPID_DATE_TOLOCTIMESTRING)]
        StringInstance *toLocaleTimeString();

        [id(DISPID_DATE_GETTIME)]
        VARIANT getTime();

        [id(DISPID_DATE_GETFULLYEAR)]
        VARIANT getFullYear();

        [id(DISPID_DATE_GETUTCFULLYEAR)]
        VARIANT getUTCFullYear();

        [id(DISPID_DATE_GETMONTH)]
        VARIANT getMonth();

        [id(DISPID_DATE_GETUTCMONTH)]
        VARIANT getUTCMonth();

        [id(DISPID_DATE_GETDATE)]
        VARIANT getDate();

        [id(DISPID_DATE_GETUTCDATE)]
        VARIANT getUTCDate();

        [id(DISPID_DATE_GETDAY)]
        VARIANT getDay();

        [id(DISPID_DATE_GETUTCDAY)]
        VARIANT getUTCDay();

        [id(DISPID_DATE_GETHOURS)]
        VARIANT getHours();

        [id(DISPID_DATE_GETUTCHOURS)]
        VARIANT getUTCHours();

        [id(DISPID_DATE_GETMINUTES)]
        VARIANT getMinutes();

        [id(DISPID_DATE_GETUTCMINUTES)]
        VARIANT getUTCMinutes();

        [id(DISPID_DATE_GETSECONDS)]
        VARIANT getSeconds();

        [id(DISPID_DATE_GETUTCSECONDS)]
        VARIANT getUTCSeconds();

        [id(DISPID_DATE_GETMILLISECONDS)]
        VARIANT getMilliseconds();

        [id(DISPID_DATE_GETUTCMILLISECONDS)]
        VARIANT getUTCMilliseconds();

        [id(DISPID_DATE_GETTIMEZONEOFFSET)]
        VARIANT getTimezoneOffset();

        [id(DISPID_DATE_SETTIME)]
        DateInstance *setTime(VARIANT time);

        [id(DISPID_DATE_SETMILLISECONDS)]
        DateInstance *setMilliseconds(VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCMILLISECONDS)]
        DateInstance *setUTCMilliseconds(VARIANT milliseconds);

        [id(DISPID_DATE_SETSECONDS)]
        DateInstance *setSeconds(
                VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCSECONDS)]
        DateInstance *setUTCSeconds(
                VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETMINUTES)]
        DateInstance *setMinutes(
                VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCMINUTES)]
        DateInstance *setUTCMinutes(
                VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETHOURS)]
        DateInstance *setHours(
                VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETUTCHOURS)]
        DateInstance *setUTCHours(
                VARIANT hours,
                [optional] VARIANT minutes,
                [optional] VARIANT seconds,
                [optional] VARIANT milliseconds);

        [id(DISPID_DATE_SETDATE)]
        DateInstance *setDate(VARIANT Date);

        [id(DISPID_DATE_SETUTCDATE)]
        DateInstance *setUTCDate(VARIANT Date);

        [id(DISPID_DATE_SETMONTH)]
        DateInstance *setMonth(
                VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETUTCMONTH)]
        DateInstance *setUTCMonth(
                VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETFULLYEAR)]
        DateInstance *setFullYear(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date);

        [id(DISPID_DATE_SETUTCFULLYEAR)]
        DateInstance *setUTCFullYear(
                VARIANT year,
                [optional] VARIANT month,
                [optional] VARIANT Date);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04Fc2b099)
    ]
    dispinterface RegExpInstance {
    properties:
        [id(DISPID_REGEXP_SOURCE)]
         StringInstance *source;

        [id(DISPID_REGEXP_GLOBAL)]
        VARIANT global;

        [id(DISPID_REGEXP_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_REGEXP_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_REGEXP_LASTINDEX)]
        VARIANT lastIndex;
    methods:
        [id(DISPID_REGEXP_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_REGEXP_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_REGEXP_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_REGEXP_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_REGEXP_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);

        [id(DISPID_REGEXP_EXEC)]
        ArrayInstance *exec(VARIANT String);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09a)
    ]
    dispinterface ErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09b)
    ]
    dispinterface EvalErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09c)
    ]
    dispinterface RangeErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09d)
    ]
    dispinterface ReferenceErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09e)
    ]
    dispinterface SyntaxErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b09f)
    ]
    dispinterface TypeErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }

    [
        uuid(3eef9758-35fc-11d1-8ce4-00c04fc2b0a0)
    ]
    dispinterface URIErrorInstance {
    properties:
        [id(DISPID_ERROR_NAME)]
        StringInstance *name;

        [id(DISPID_ERROR_MESSAGE)]
        StringInstance *message;

        [id(DISPID_ERROR_IGNORECASE)]
        VARIANT ignoreCase;

        [id(DISPID_ERROR_MULTILINE)]
        VARIANT multiline;

        [id(DISPID_ERROR_LASTINDEX)]
        VARIANT lastIndex;

    methods:
        [id(DISPID_ERROR_TOSTRING)]
        StringInstance *toString();

        [id(DISPID_ERROR_TOLOCSTRING)]
        StringInstance *toLocaleString();

        [id(DISPID_ERROR_HASOWNPROP)]
        VARIANT hasOwnProperty(VARIANT propertyName);

        [id(DISPID_ERROR_PROPISENUM)]
        VARIANT propertyIsEnumerable(VARIANT propertyName);

        [id(DISPID_ERROR_ISPROTOF)]
        VARIANT isPrototypeOf(VARIANT obj);
    }
}