
#---------------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#---------------------------------------------------------------------------------

Weinre = require('../common/Weinre')

#-------------------------------------------------------------------------------
module.exports = class WiDOMImpl

    constructor: ->

    #---------------------------------------------------------------------------
    getChildNodes: (nodeId, callback) ->
        node = Weinre.nodeStore.getNode(nodeId)

        unless node
            Weinre.logWarning arguments.callee.signature + " passed an invalid nodeId: " + nodeId
            return

        children = Weinre.nodeStore.serializeNodeChildren(node, 1)
        Weinre.wi.DOMNotify.setChildNodes nodeId, children
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    setAttribute: (elementId, name, value, callback) ->
        element = Weinre.nodeStore.getNode(elementId)

        unless element
            Weinre.logWarning arguments.callee.signature + " passed an invalid elementId: " + elementId
            return

        element.setAttribute name, value
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    removeAttribute: (elementId, name, callback) ->
        element = Weinre.nodeStore.getNode(elementId)

        unless element
            Weinre.logWarning arguments.callee.signature + " passed an invalid elementId: " + elementId
            return

        element.removeAttribute name
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    setTextNodeValue: (nodeId, value, callback) ->
        node = Weinre.nodeStore.getNode(nodeId)

        unless node
            Weinre.logWarning arguments.callee.signature + " passed an invalid nodeId: " + nodeId
            return

        node.nodeValue = value
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    getEventListenersForNode: (nodeId, callback) ->
        Weinre.notImplemented arguments.callee.signature

    #---------------------------------------------------------------------------
    copyNode: (nodeId, callback) ->
        Weinre.notImplemented arguments.callee.signature

    #---------------------------------------------------------------------------
    removeNode: (nodeId, callback) ->
        node = Weinre.nodeStore.getNode(nodeId)

        unless node
            Weinre.logWarning arguments.callee.signature + " passed an invalid nodeId: " + nodeId
            return

        unless node.parentNode
            Weinre.logWarning arguments.callee.signature + " passed a parentless node: " + node
            return

        node.parentNode.removeChild node
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    changeTagName: (nodeId, newTagName, callback) ->
        Weinre.notImplemented arguments.callee.signature

    #---------------------------------------------------------------------------
    getOuterHTML: (nodeId, callback) ->
        node = Weinre.nodeStore.getNode(nodeId)

        unless node
            Weinre.logWarning arguments.callee.signature + " passed an invalid nodeId: " + nodeId
            return

        value = node.outerHTML
        if callback
            Weinre.WeinreTargetCommands.sendClientCallback callback, [ value ]

    #---------------------------------------------------------------------------
    setOuterHTML: (nodeId, outerHTML, callback) ->
        node = Weinre.nodeStore.getNode(nodeId)

        unless node
            Weinre.logWarning arguments.callee.signature + " passed an invalid nodeId: " + nodeId
            return

        node.outerHTML = outerHTML
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    addInspectedNode: (nodeId, callback) ->
        Weinre.nodeStore.addInspectedNode nodeId
        Weinre.WeinreTargetCommands.sendClientCallback callback if callback

    #---------------------------------------------------------------------------
    performSearch: (query, runSynchronously, callback) ->
        Weinre.notImplemented arguments.callee.signature

    #---------------------------------------------------------------------------
    searchCanceled: (callback) ->
        Weinre.notImplemented arguments.callee.signature

    #---------------------------------------------------------------------------
    pushNodeByPathToFrontend: (path, callback) ->
        Weinre.notImplemented arguments.callee.signature

    #---------------------------------------------------------------------------
    resolveNode: (nodeId, callback) ->
        result = Weinre.injectedScript.resolveNode(nodeId)
        if callback
            Weinre.WeinreTargetCommands.sendClientCallback callback, [ result ]

    #---------------------------------------------------------------------------
    getNodeProperties: (nodeId, propertiesArray, callback) ->
        propertiesArray = JSON.stringify(propertiesArray)
        result = Weinre.injectedScript.getNodeProperties(nodeId, propertiesArray)
        if callback
            Weinre.WeinreTargetCommands.sendClientCallback callback, [ result ]

    #---------------------------------------------------------------------------
    getNodePrototypes: (nodeId, callback) ->
        result = Weinre.injectedScript.getNodePrototypes(nodeId)
        if callback
            Weinre.WeinreTargetCommands.sendClientCallback callback, [ result ]

    #---------------------------------------------------------------------------
    pushNodeToFrontend: (objectId, callback) ->
        objectId = JSON.stringify(objectId)
        result = Weinre.injectedScript.pushNodeToFrontend(objectId)
        if callback
            Weinre.WeinreTargetCommands.sendClientCallback callback, [ result ]

#-------------------------------------------------------------------------------
require("../common/MethodNamer").setNamesForClass(module.exports)
