"""Suite WorldWideWeb suite, as defined in Spyglass spec.:
Level 1, version 1

Generated from /Volumes/Sap/Applications (Mac OS 9)/Netscape Communicator\xe2\x84\xa2 Folder/Netscape Communicator\xe2\x84\xa2
AETE/AEUT resource version 1/0, language 0, script 0
"""

import aetools
import MacOS

_code = 'WWW!'

class WorldWideWeb_suite_Events:

    _argmap_OpenURL = {
        'to' : 'INTO',
        'toWindow' : 'WIND',
        'flags' : 'FLGS',
        'post_data' : 'POST',
        'post_type' : 'MIME',
        'progressApp' : 'PROG',
    }

    def OpenURL(self, _object, _attributes={}, **_arguments):
        """OpenURL: Opens a URL. Allows for more options than GetURL event
        Required argument: URL
        Keyword argument to: file destination
        Keyword argument toWindow: window iD
        Keyword argument flags: Binary: any combination of 1, 2 and 4 is allowed: 1 and 2 mean force reload the document. 4 is ignored
        Keyword argument post_data: Form posting data
        Keyword argument post_type: MIME type of the posting data. Defaults to application/x-www-form-urlencoded
        Keyword argument progressApp: Application that will display progress
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: ID of the loading window
        """
        _code = 'WWW!'
        _subcode = 'OURL'

        aetools.keysubst(_arguments, self._argmap_OpenURL)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_ShowFile = {
        'MIME_type' : 'MIME',
        'Window_ID' : 'WIND',
        'URL' : 'URL ',
    }

    def ShowFile(self, _object, _attributes={}, **_arguments):
        """ShowFile: Similar to OpenDocuments, except that it specifies the parent URL, and MIME type of the file
        Required argument: File to open
        Keyword argument MIME_type: MIME type
        Keyword argument Window_ID: Window to open the file in
        Keyword argument URL: Use this as a base URL
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: Window ID of the loaded window. 0 means ShowFile failed, FFFFFFF means that data was not appropriate type to display in the browser.
        """
        _code = 'WWW!'
        _subcode = 'SHWF'

        aetools.keysubst(_arguments, self._argmap_ShowFile)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_cancel_progress = {
        'in_window' : 'WIND',
    }

    def cancel_progress(self, _object=None, _attributes={}, **_arguments):
        """cancel progress: Interrupts the download of the document in the given window
        Required argument: progress ID, obtained from the progress app
        Keyword argument in_window: window ID of the progress to cancel
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'WWW!'
        _subcode = 'CNCL'

        aetools.keysubst(_arguments, self._argmap_cancel_progress)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def find_URL(self, _object, _attributes={}, **_arguments):
        """find URL: If the file was downloaded by Netscape, you can call FindURL to find out the URL used to download the file.
        Required argument: File spec
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: The URL
        """
        _code = 'WWW!'
        _subcode = 'FURL'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def get_window_info(self, _object=None, _attributes={}, **_arguments):
        """get window info: Returns the information about the window as a list. Currently the list contains the window title and the URL. You can get the same information using standard Apple Event GetProperty.
        Required argument: window ID
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: undocumented, typecode 'list'
        """
        _code = 'WWW!'
        _subcode = 'WNFO'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def list_windows(self, _no_object=None, _attributes={}, **_arguments):
        """list windows: Lists the IDs of all the hypertext windows
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: List of unique IDs of all the hypertext windows
        """
        _code = 'WWW!'
        _subcode = 'LSTW'

        if _arguments: raise TypeError, 'No optional args expected'
        if _no_object is not None: raise TypeError, 'No direct arg expected'


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_parse_anchor = {
        'relative_to' : 'RELA',
    }

    def parse_anchor(self, _object, _attributes={}, **_arguments):
        """parse anchor: Resolves the relative URL
        Required argument: Main URL
        Keyword argument relative_to: Relative URL
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: Parsed  URL
        """
        _code = 'WWW!'
        _subcode = 'PRSA'

        aetools.keysubst(_arguments, self._argmap_parse_anchor)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def register_URL_echo(self, _object=None, _attributes={}, **_arguments):
        """register URL echo: Registers the \xd2echo\xd3 application. Each download from now on will be echoed to this application.
        Required argument: Application signature
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'WWW!'
        _subcode = 'RGUE'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_register_protocol = {
        'for_protocol' : 'PROT',
    }

    def register_protocol(self, _object=None, _attributes={}, **_arguments):
        """register protocol: Registers application as a \xd2handler\xd3 for this protocol with a given prefix. The handler will receive \xd2OpenURL\xd3, or if that fails, \xd2GetURL\xd3 event.
        Required argument: Application sig
        Keyword argument for_protocol: protocol prefix: \xd2finger:\xd3, \xd2file\xd3,
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: TRUE if registration has been successful
        """
        _code = 'WWW!'
        _subcode = 'RGPR'

        aetools.keysubst(_arguments, self._argmap_register_protocol)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_register_viewer = {
        'MIME_type' : 'MIME',
        'with_file_type' : 'FTYP',
    }

    def register_viewer(self, _object, _attributes={}, **_arguments):
        """register viewer: Registers an application as a \xd4special\xd5 viewer for this MIME type. The application will be launched with ViewDoc events
        Required argument: Application sig
        Keyword argument MIME_type: MIME type viewer is registering for
        Keyword argument with_file_type: Mac file type for the downloaded files
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: TRUE if registration has been successful
        """
        _code = 'WWW!'
        _subcode = 'RGVW'

        aetools.keysubst(_arguments, self._argmap_register_viewer)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_register_window_close = {
        'for_window' : 'WIND',
    }

    def register_window_close(self, _object=None, _attributes={}, **_arguments):
        """register window close: Netscape will notify registered application when this window closes
        Required argument: Application signature
        Keyword argument for_window: window ID
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: true if successful
        """
        _code = 'WWW!'
        _subcode = 'RGWC'

        aetools.keysubst(_arguments, self._argmap_register_window_close)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def unregister_URL_echo(self, _object, _attributes={}, **_arguments):
        """unregister URL echo: cancels URL echo
        Required argument: application signature
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'WWW!'
        _subcode = 'UNRU'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_unregister_protocol = {
        'for_protocol' : 'PROT',
    }

    def unregister_protocol(self, _object=None, _attributes={}, **_arguments):
        """unregister protocol: reverses the effects of \xd2register protocol\xd3
        Required argument: Application sig.
        Keyword argument for_protocol: protocol prefix. If none, unregister for all protocols
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: TRUE if successful
        """
        _code = 'WWW!'
        _subcode = 'UNRP'

        aetools.keysubst(_arguments, self._argmap_unregister_protocol)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_unregister_viewer = {
        'MIME_type' : 'MIME',
    }

    def unregister_viewer(self, _object, _attributes={}, **_arguments):
        """unregister viewer: Revert to the old way of handling this MIME type
        Required argument: Application sig
        Keyword argument MIME_type: MIME type to be unregistered
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: TRUE if the event was successful
        """
        _code = 'WWW!'
        _subcode = 'UNRV'

        aetools.keysubst(_arguments, self._argmap_unregister_viewer)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    _argmap_unregister_window_close = {
        'for_window' : 'WIND',
    }

    def unregister_window_close(self, _object=None, _attributes={}, **_arguments):
        """unregister window close: Undo for register window close
        Required argument: Application signature
        Keyword argument for_window: window ID
        Keyword argument _attributes: AppleEvent attribute dictionary
        Returns: true if successful
        """
        _code = 'WWW!'
        _subcode = 'UNRC'

        aetools.keysubst(_arguments, self._argmap_unregister_window_close)
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']

    def webActivate(self, _object=None, _attributes={}, **_arguments):
        """webActivate: Makes Netscape the frontmost application, and selects a given window. This event is here for suite completeness/ cross-platform compatibility only, you should use standard AppleEvents instead.
        Required argument: window to bring to front
        Keyword argument _attributes: AppleEvent attribute dictionary
        """
        _code = 'WWW!'
        _subcode = 'ACTV'

        if _arguments: raise TypeError, 'No optional args expected'
        _arguments['----'] = _object


        _reply, _arguments, _attributes = self.send(_code, _subcode,
                _arguments, _attributes)
        if _arguments.get('errn', 0):
            raise aetools.Error, aetools.decodeerror(_arguments)
        # XXXX Optionally decode result
        if _arguments.has_key('----'):
            return _arguments['----']


#
# Indices of types declared in this module
#
_classdeclarations = {
}

_propdeclarations = {
}

_compdeclarations = {
}

_enumdeclarations = {
}
