//
//  controllerExample.js
//  hifi
//
//  Created by Brad Hefta-Gaub on 1/28/14.
//  Copyright (c) 2014 HighFidelity, Inc. All rights reserved.
//
//  This is an example script that demonstrates use of the Controller class
//
//

// initialize our triggers
var triggerPulled = new Array();
var numberOfTriggers = Controller.getNumberOfTriggers();
for (t = 0; t < numberOfTriggers; t++) {
    triggerPulled[t] = false;
}

function checkController(deltaTime) {
    var numberOfTriggers = Controller.getNumberOfTriggers();
    var numberOfSpatialControls = Controller.getNumberOfSpatialControls();
    var controllersPerTrigger = numberOfSpatialControls / numberOfTriggers;
    var triggerToggled = false;

    // this is expected for hydras
    if (numberOfTriggers == 2 && controllersPerTrigger == 2) {
        for (var t = 0; t < numberOfTriggers; t++) {
            var triggerValue = Controller.getTriggerValue(t);

            if (triggerPulled[t]) {
                // must release to at least 0.1
                if (triggerValue < 0.1) {
                    triggerPulled[t] = false; // unpulled
                }
            } else {
                // must pull to at least 0.9
                if (triggerValue > 0.9) {
                    triggerPulled[t] = true; // pulled
                    triggerToggled = true;
                }
            }

            if (triggerToggled) {
                print("a trigger was toggled");
            }
        }
    }
}

// register the call back so it fires before each data send
Script.update.connect(checkController);

function printKeyEvent(eventName, event) {
    print(eventName);
    print("    event.key=" + event.key);
    print("    event.text=" + event.text);
    print("    event.isShifted=" + event.isShifted);
    print("    event.isControl=" + event.isControl);
    print("    event.isMeta=" + event.isMeta);
    print("    event.isAlt=" + event.isAlt);
    print("    event.isKeypad=" + event.isKeypad);
}
function keyPressEvent(event) {
    printKeyEvent("keyPressEvent", event);

    if (event.text == "A") {
        print("the A key was pressed");
    }
    if (event.text == " ") {
        print("the <space> key was pressed");
    }
}

function keyReleaseEvent(event) {
    printKeyEvent("keyReleaseEvent", event);

    if (event.text == "A") {
        print("the A key was released");
    }
    if (event.text == " ") {
        print("the <space> key was pressed");
    }
}

// Map keyPress and mouse move events to our callbacks
Controller.keyPressEvent.connect(keyPressEvent);
Controller.keyReleaseEvent.connect(keyReleaseEvent);

// prevent the A key from going through to the application
Controller.captureKeyEvents({ text: "A" });
Controller.captureKeyEvents({ key: "A".charCodeAt(0) }); // same as above, just another example of how to capture the key
Controller.captureKeyEvents({ text: " " });
Controller.captureKeyEvents({ text: "@", isMeta: true });
Controller.captureKeyEvents({ text: "page up" });
Controller.captureKeyEvents({ text: "page down" });


function printMouseEvent(eventName, event) {
    print(eventName);
    print("    event.x,y=" + event.x + ", " + event.y);
    print("    event.button=" + event.button);
    print("    event.isLeftButton=" + event.isLeftButton);
    print("    event.isRightButton=" + event.isRightButton);
    print("    event.isMiddleButton=" + event.isMiddleButton);
    print("    event.isShifted=" + event.isShifted);
    print("    event.isControl=" + event.isControl);
    print("    event.isMeta=" + event.isMeta);
    print("    event.isAlt=" + event.isAlt);
}

function mouseMoveEvent(event) {
    printMouseEvent("mouseMoveEvent", event);
}
function mousePressEvent(event) {
    printMouseEvent("mousePressEvent", event);
}

function mouseReleaseEvent(event) {
    printMouseEvent("mouseReleaseEvent", event);
}

Controller.mouseMoveEvent.connect(mouseMoveEvent);
Controller.mousePressEvent.connect(mousePressEvent);
Controller.mouseReleaseEvent.connect(mouseReleaseEvent);

function printTouchEvent(eventName, event) {
    print(eventName);
    
    print("    event.x,y=" + event.x + ", " + event.y);
    print("    event.isPressed=" + event.isPressed);
    print("    event.isMoved=" + event.isMoved);
    print("    event.isStationary=" + event.isStationary);
    print("    event.isReleased=" + event.isReleased);
    print("    event.isShifted=" + event.isShifted);
    print("    event.isControl=" + event.isControl);
    print("    event.isMeta=" + event.isMeta);
    print("    event.isAlt=" + event.isAlt);
    for (var i = 0; i < event.points.length; i++) {
        print("    event.points[" + i + "].x.y:" + event.points[i].x + ", " + event.points[i].y);
    }
    print("    event.radius=" + event.radius);
    print("    event.isPinching=" + event.isPinching);
    print("    event.isPinchOpening=" + event.isPinchOpening);

    print("    event.angle=" + event.angle);
    for (var i = 0; i < event.points.length; i++) {
        print("    event.angles[" + i + "]:" + event.angles[i]);
    }
    print("    event.isRotating=" + event.isRotating);
    print("    event.rotating=" + event.rotating);
}

function touchBeginEvent(event) {
    printTouchEvent("touchBeginEvent", event);
}

function touchUpdateEvent(event) {
    printTouchEvent("touchUpdateEvent", event);
}

function touchEndEvent(event) {
    printTouchEvent("touchEndEvent", event);
}
// Map touch events to our callbacks
Controller.touchBeginEvent.connect(touchBeginEvent);
Controller.touchUpdateEvent.connect(touchUpdateEvent);
Controller.touchEndEvent.connect(touchEndEvent);


function wheelEvent(event) {
    print("wheelEvent");
    print("    event.x,y=" + event.x + ", " + event.y);
    print("    event.delta=" + event.delta);
    print("    event.orientation=" + event.orientation);
    print("    event.isLeftButton=" + event.isLeftButton);
    print("    event.isRightButton=" + event.isRightButton);
    print("    event.isMiddleButton=" + event.isMiddleButton);
    print("    event.isShifted=" + event.isShifted);
    print("    event.isControl=" + event.isControl);
    print("    event.isMeta=" + event.isMeta);
    print("    event.isAlt=" + event.isAlt);
}

Controller.wheelEvent.connect(wheelEvent);

function scriptEnding() {
    // re-enabled the standard application for touch events
    Controller.releaseKeyEvents({ text: "A" });
    Controller.releaseKeyEvents({ key: "A".charCodeAt(0) }); // same as above, just another example of how to capture the key
    Controller.releaseKeyEvents({ text: " " });
    Controller.releaseKeyEvents({ text: "@", isMeta: true });
    Controller.releaseKeyEvents({ text: "page up" });
    Controller.releaseKeyEvents({ text: "page down" });
}

Script.scriptEnding.connect(scriptEnding);