
/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2011 IBM Corporation
 */

requireClass ../common/Weinre

//-----------------------------------------------------------------------------
class WiDOMImpl

//-----------------------------------------------------------------------------
method getChildNodes(/*int*/ nodeId, callback)
    var node = Weinre.nodeStore.getNode(nodeId)
    if (!node) {
        Weinre.logWarning(arguments.callee.signature  + " passed an invalid nodeId: " + nodeId)
        return
    }

    var children = Weinre.nodeStore.serializeNodeChildren(node, 1)
    Weinre.wi.DOMNotify.setChildNodes(nodeId, children)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method setAttribute(/*int*/ elementId, /*string*/ name, /*string*/ value, callback)
    var element = Weinre.nodeStore.getNode(elementId)
    if (!element) {
        Weinre.logWarning(arguments.callee.signature + " passed an invalid elementId: " + elementId)
        return
    }

    element.setAttribute(name, value)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method removeAttribute(/*int*/ elementId, /*string*/ name, callback)
    var element = Weinre.nodeStore.getNode(elementId)
    if (!element) {
        Weinre.logWarning(arguments.callee.signature + " passed an invalid elementId: " + elementId)
        return
    }

    element.removeAttribute(name)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method setTextNodeValue(/*int*/ nodeId, /*string*/ value, callback)
    var node = Weinre.nodeStore.getNode(nodeId)
    if (!node) {
        Weinre.logWarning(arguments.callee.signature + " passed an invalid nodeId: " + nodeId)
        return
    }

    node.nodeValue = value

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method getEventListenersForNode(/*int*/ nodeId, callback)
    // callback: function(/*int*/ outNodeId, /*any[]*/ listenersArray)
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
method copyNode(/*int*/ nodeId, callback)
    // callback: function()
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
method removeNode(/*int*/ nodeId, callback)
    var node = Weinre.nodeStore.getNode(nodeId)
    if (!node) {
        Weinre.logWarning(arguments.callee.signature + " passed an invalid nodeId: " + nodeId)
        return
    }

    if (!node.parentNode) {
        Weinre.logWarning(arguments.callee.signature + " passed a parentless node: " + node)
        return
    }

    node.parentNode.removeChild(node)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method changeTagName(/*int*/ nodeId, /*string*/ newTagName, callback)
    // callback: function(/*int*/ outNodeId)
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
method getOuterHTML(/*int*/ nodeId, callback)
    var node = Weinre.nodeStore.getNode(nodeId)
    if (!node) {
        Weinre.logWarning(arguments.callee.signature + " passed an invalid nodeId: " + nodeId)
        return
    }

    value = node.outerHTML

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [value])
    }

//-----------------------------------------------------------------------------
method setOuterHTML(/*int*/ nodeId, /*string*/ outerHTML, callback)
    var node = Weinre.nodeStore.getNode(nodeId)
    if (!node) {
        Weinre.logWarning(arguments.callee.signature + " passed an invalid nodeId: " + nodeId)
        return
    }

    node.outerHTML = outerHTML

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }

//-----------------------------------------------------------------------------
method addInspectedNode(/*int*/ nodeId, callback)
    Weinre.nodeStore.addInspectedNode(nodeId)
    
    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback)
    }
    
//-----------------------------------------------------------------------------
method performSearch(/*string*/ query, /*boolean*/ runSynchronously, callback)
    // callback: function()
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
method searchCanceled(callback)
    // callback: function()
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
method pushNodeByPathToFrontend(/*string*/ path, callback)
    // callback: function(/*int*/ nodeId)
    Weinre.notImplemented(arguments.callee.signature)

//-----------------------------------------------------------------------------
method resolveNode(/*int*/ nodeId, callback)
    var result = Weinre.injectedScript.resolveNode(nodeId)
    
    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method getNodeProperties(/*int*/ nodeId, /*any[]*/ propertiesArray, callback)
    var propertiesArray = JSON.stringify(propertiesArray)
    var result = Weinre.injectedScript.getNodeProperties(nodeId, propertiesArray)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method getNodePrototypes(/*int*/ nodeId, callback)
    var result = Weinre.injectedScript.getNodePrototypes(nodeId)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }

//-----------------------------------------------------------------------------
method pushNodeToFrontend(/*any*/ objectId, callback)
    var objectId = JSON.stringify(objectId)
    var result = Weinre.injectedScript.pushNodeToFrontend(objectId)

    if (callback) {
        Weinre.WeinreTargetCommands.sendClientCallback(callback, [result])
    }
