/*
 * 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) 2010, 2011 IBM Corporation
 */

;(function(){

window.addEventListener("load", onLoad, false)

var Interfaces = {}
var Indent     = "<span class='indent'>   </span>"
var Indent2    = "<span class='indent'>      </span>"

var e_interfaceList
var e_interfaceName
var e_interfaceBody
var e_showIdl
var e_showJavaScript
var e_showJava

var NativeTypes = "int any number boolean string void".split(" ")

var IDLTools = require("weinre/common/IDLTools").getClass()

if (!window.localStorage) {
    window.localStorage = {
        getItem: function() {},
        setItem: function() {}
    }
}

//-----------------------------------------------------------------------------
function onLoad() {
    e_interfaceList  = document.getElementById("interface-list")
    e_interfaceName  = document.getElementById("interface-name")
    e_interfaceBody  = document.getElementById("interface-body")
    e_showIdl        = document.getElementById("show-Idl")
    e_showJavaScript = document.getElementById("show-JavaScript")
    e_showJava       = document.getElementById("show-Java")
    
    setUpShowCheckBoxes()
    populateInterfacesList(IDLTools.getIDLsMatching(/.*/))
}

//-----------------------------------------------------------------------------
function setUpShowCheckBoxes() {
    setUpShowCheckBox(e_showIdl,        "show-Idl")
    setUpShowCheckBox(e_showJavaScript, "show-JavaScript")
    setUpShowCheckBox(e_showJava,       "show-Java")
}

//-----------------------------------------------------------------------------
function setUpShowCheckBox(element, key) {
    var value = localStorage.getItem(key)
    if (null == value) 
        value = true
    else
        value = (value == "true")
    
    element.checked    = value
    element.storageKey = key
    
    element.addEventListener("click", el_showCheckBoxClicked, false)
}

//-----------------------------------------------------------------------------
function el_showCheckBoxClicked(event) {
    var element = event.target
    
    localStorage.setItem(element.storageKey, element.checked)
    
    reapplyDisplayStyle("." + element.storageKey, element.checked)
}

//-----------------------------------------------------------------------------
function reapplyDisplayStyles() {
    reapplyDisplayStyle(".show-Idl",        e_showIdl.checked)
    reapplyDisplayStyle(".show-JavaScript", e_showJavaScript.checked)
    reapplyDisplayStyle(".show-Java",       e_showJava.checked)
}

//-----------------------------------------------------------------------------
function reapplyDisplayStyle(className, value) {
    value = value ? "block" : "none"
    ;[].slice.call(document.querySelectorAll(className)).forEach(function(element) {
        element.style.display = value 
    })
}

//-----------------------------------------------------------------------------
function populateInterfacesList(intfs) {
    e_interfaceList.innerHTML = ""
        
    fixedIntfs = []
    intfs.forEach(function(intf){
        fixedIntfs.push(intf.name)
        Interfaces[intf.name] = intf
            
        if (!intf.methods)    intf.methods    = []
        if (!intf.attributes) intf.attributes = []
    })
    
    intfs = fixedIntfs
    
    intfs.sort()
    intfs.forEach(function(intf){
        var a  = document.createElement("a")
        a.href          = "#"
        a.innerHTML     = intf
        a.interfaceName = intf
        a.addEventListener("click", el_interfaceClicked, false)
        
        var li = document.createElement("li")
        li.appendChild(a)
        e_interfaceList.appendChild(li)
    })
}

//-----------------------------------------------------------------------------
function el_interfaceClicked(event) {
    event.preventDefault()

    showInterface(event.target.interfaceName)
}

//-----------------------------------------------------------------------------
function showInterface(interfaceName) {
    var intf = Interfaces[interfaceName]
    
    e_interfaceName.innerHTML = interfaceName
    
    var html = []

    showInterfaceIdl(intf, html)
    showInterfaceJavaScript(intf, html)
    showInterfaceJava(intf, html)
    
    e_interfaceBody.innerHTML = html.join("\n")
    
    reapplyDisplayStyles()
}

window.showInterface = showInterface

//-----------------------------------------------------------------------------
function showInterfaceIdl(intf, html) {
    html.push("<div class='show-Idl'><h3>IDL</h3><pre>")
    html.push("interface {")
    
    intf.methods.forEach(function(method){
        showInterfaceIdlMethod(method, html)
    })
    
    if (intf.attributes.length > 0) html.push("<table>")
    intf.attributes.forEach(function(attribute){
        showInterfaceIdlAttribute(attribute, html)
    })
    if (intf.attributes.length > 0) html.push("</table>")
    
    html.push("};")
    html.push("</pre></div>")
}

//-----------------------------------------------------------------------------
function showInterfaceIdlMethod(method, html) {
    var line = "\n   "
    
    var allParameters = method.parameters.concat(method.callbackParameters)
    
    line += getIdlType(method.returns)
    line += " <span class='methodName'>" + method.name + "</span> (" + getIdlParameterList(allParameters) + ");"
    html.push(line)
}

//-----------------------------------------------------------------------------
function getIdlParameterList(parameters) {
    var result = []
    
    if (parameters.length == 0) return "";
    
    result.push("<table>")
    parameters.forEach(function(parameter, index, list){
        var comma = (index == list.length-1) ? "" : ","
        result.push("<tr>")
        result.push("<td>" + Indent2 + (parameter.out ? "out" : "in"))
        result.push("<td>" + getIdlType(parameter.type))
        result.push("<td>" + "<span class='parameterName tdIndent'>" + parameter.name + comma + "</span>")
    })
    
    result.push("</table>")
    return result.join("\n") + Indent
}

//-----------------------------------------------------------------------------
function getIdlType(type) {
    var result
    
    
    if (-1 == NativeTypes.indexOf(type.name)) {
        result = "<a href='javascript:showInterface(\"" + type.name + "\"); void(0);'>" + type.name + "</a>"
    }
    else {
        result = type.name
    }
    
    for (var i=0; i<type.rank; i++) {
        result += "[]"
    }
    
    return "<span class='type'>" + result + "</span>"
}

//-----------------------------------------------------------------------------
IDL2Java = {
    string: "String",
    any:    "Object",
    int:    "Long",
    boolean: "Boolean",
    "":     "?"
}

//-----------------------------------------------------------------------------
function getJavaType(type) {
    var result
    
    
    if (-1 == NativeTypes.indexOf(type.name)) {
        result = "<a href='javascript:showInterface(\"" + type.name + "\"); void(0);'>" + type.name + "</a>"
    }
    else {
        result = IDL2Java[type.name]
        if (!result) {
            result = "?" + type.name + "?"
            console.log("Unable to translate IDL type to Java: " + type.name)
        }
    }
    
    for (var i=0; i<type.rank; i++) {
        result += "[]"
    }
    
    return "<span class='type'>" + result + "</span>"
}


//-----------------------------------------------------------------------------
function showInterfaceIdlAttribute(attribute, html) {
    var line = "<tr><td>" + Indent + "attribute "
        
    line += getIdlType(attribute.type)
    line += "<td><span class='attributeName tdIndent'>" + attribute.name + "</span>;"
    html.push(line)
    
}

//-----------------------------------------------------------------------------
function showInterfaceJavaScript(intf, html) {
    html.push("<div class='show-JavaScript'><h3>JavaScript</h3><pre>")
    
    var line = ""
        
    line += "\n//-----------------------------------------------------------------------------"
    line += "\n<span class='interfaceName'>class " + intf.name + "</span>"        
    html.push(line)
    
    intf.methods.forEach(function(method){
        showInterfaceJavaScriptMethod(intf, method, html)
    })
    
    html.push("</pre></div>")
}

//-----------------------------------------------------------------------------
function showInterfaceJavaScriptMethod(intf, method, html) {
    var line = ""
        
    line += "\n//-----------------------------------------------------------------------------"
    line += "\n<span class='methodName'>method " + method.name + "</span>(" + getJavaScriptParameterListSimple(method.parameters, method.returns) + ")"
    line += "\n    // callback: function(" + getJavaScriptCallbackParameterListSimple(method.callbackParameters) + ")"
    line += "\n    Weinre.notImplemented(arguments.callee.signature)"
    line += "\n"
    html.push(line)
}

//-----------------------------------------------------------------------------
function getJavaScriptParameterList(parameters, returnType) {
    var result = []
    
    result.push("<table>")
    parameters.forEach(function(parameter){
        result.push("<tr>")
        result.push("<td>" + Indent2 + "<span class='parameterName'>" + parameter.name + ",</span>")
        result.push("<td><span class='tdIndent'>// " + getIdlType(parameter.type) + "</span>")
    })

    result.push("<tr>")
    result.push("<td>" + Indent2 + "<span class='parameterName'>callback</span>")
    result.push("<td><span class='tdIndent'>// function(error, " + getIdlType(returnType) + ")</span>")
    
    result.push("</table>")
    return result.join("\n") + Indent
}

//-----------------------------------------------------------------------------
function getJavaScriptParameterListSimple(parameters, returnType) {
    var result = []
    
    parameters.forEach(function(parameter){
        if (parameter.out) return
        result.push("<span class='type'>/*" + getIdlType(parameter.type) + "*/ </span><span class='parameterName'>" + parameter.name + "</span>")
    })

    result.push("<span class='parameterName'>callback</span>")
    return result.join(", ")
}

//-----------------------------------------------------------------------------
function getJavaScriptCallbackParameterListSimple(parameters) {
    var result = []
    
    parameters.forEach(function(parameter){
        if (!parameter.out) return
        result.push("/*" + getIdlType(parameter.type) + "*/ "+ parameter.name)
    })

    return result.join(", ")
}

//-----------------------------------------------------------------------------
function showInterfaceJava(intf, html) {
    html.push("<div class='show-Java'><h3>Java</h3><pre>")

    intf.methods.forEach(function(method){
        showInterfaceJavaMethod(intf, method, html)
    })

    html.push("</pre></div>")
}

//-----------------------------------------------------------------------------
function showInterfaceJavaMethod(intf, method, html) {
    var line = ""
        
    line += "\n    /**"
    line += "\n     * "
    line += "\n     */"
    line += "\n    <span class='methodName'>public void " + method.name + "</span>(" + getJavaParameterListSimple(method.parameters, method.returns) + ") throws IOException {"
    line += "\n        Main.warn(getClass().getName() + \"." + method.name + "() not implemented\");"
    line += "\n"
    line += "\n        channel.sendCallback(\"" + intf.name + "\", callbackId" + getJavaCallbackParameterListSimple(method.callbackParameters) + ");"
    line += "\n    }"
    line += "\n"
    html.push(line)
}

//-----------------------------------------------------------------------------
function getJavaParameterList(parameters, returnType) {
    var result = []
    
    result.push("<table>")
    parameters.forEach(function(parameter){
        result.push("<tr>")
        result.push("<td>" + Indent2 + "<span class='parameterName'>" + parameter.name + ",</span>")
        result.push("<td><span class='tdIndent'>// " + getIdlType(parameter.type) + "</span>")
    })

    result.push("<tr>")
    result.push("<td>" + Indent2 + "<span class='parameterName'>callback</span>")
    result.push("<td><span class='tdIndent'>// function(error, " + getIdlType(returnType) + ")</span>")
    
    result.push("</table>")
    return result.join("\n") + Indent
}

//-----------------------------------------------------------------------------
function getJavaParameterListSimple(parameters, returnType) {
    var result = []

    result.push("<span class='type'>Channel</span> <span class='parameterName'>channel</span>")

    parameters.forEach(function(parameter){
        if (parameter.out) return
        result.push("<span class='type'>" + getJavaType(parameter.type) + " </span><span class='parameterName'>" + parameter.name + "</span>")
    })

    result.push("<span class='type'>String</span> <span class='parameterName'>callbackId</span>")
    return result.join(", ")
}

//-----------------------------------------------------------------------------
function getJavaCallbackParameterListSimple(parameters) {
    var result = []
    
    parameters.forEach(function(parameter){
        if (!parameter.out) return
        result.push("/*" + getJavaType(parameter.type)  + " " + parameter.name + "*/ (Object) null")
    })

    result = result.join(", ")
    
    if (result != "") result = ", " + result
    
    return result
}

//-----------------------------------------------------------------------------
function toArray(arrayLike) {
    return [].slice.call(arrayLike)
}

//-----------------------------------------------------------------------------
ExBreak = new Error("breaks out of loops")

//-----------------------------------------------------------------------------
function exBreak() {
    throw ExBreak
}

//-----------------------------------------------------------------------------
function allowExBreak(func) {
    try {
        func.call()
    }
    catch(e) {
        if (e == ExBreak) return
        throw e
    }
}

//-----------------------------------------------------------------------------
})();

