﻿// This THREEx helper makes it easy to handle the fullscreen API
// * it hides the prefix for each browser
// * it hides the little discrepencies of the various vendor API
// * at the time of this writing (nov 2011) it is available in 
//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),
//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and
//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).

// 
// # Code

//

/** @namespace */
var THREEx = THREEx || {};
THREEx.FullScreen = THREEx.FullScreen || {};

/**
 * test if it is possible to have fullscreen
 * 
 * @returns {Boolean} true if fullscreen API is available, false otherwise
*/
THREEx.FullScreen.available = function () {
    return this._hasWebkitFullScreen || this._hasMozFullScreen;
}

/**
 * test if fullscreen is currently activated
 * 
 * @returns {Boolean} true if fullscreen is currently activated, false otherwise
*/
THREEx.FullScreen.activated = function () {
    if (this._hasWebkitFullScreen) {
        return document.webkitIsFullScreen;
    } else if (this._hasMozFullScreen) {
        return document.mozFullScreen;
    } else {
        console.assert(false);
    }
}

/**
 * Request fullscreen on a given element
 * @param {DomElement} element to make fullscreen. optional. default to document.body
*/
THREEx.FullScreen.request = function (element) {
    element = element || document.body;
    if (this._hasWebkitFullScreen) {
        element.webkitRequestFullScreen();
    } else if (this._hasMozFullScreen) {
        element.mozRequestFullScreen();
    } else {
        console.assert(false);
    }
}

/**
 * Cancel fullscreen
*/
THREEx.FullScreen.cancel = function () {
    if (this._hasWebkitFullScreen) {
        document.webkitCancelFullScreen();
    } else if (this._hasMozFullScreen) {
        document.mozCancelFullScreen();
    } else {
        console.assert(false);
    }
}

// internal functions to know which fullscreen API implementation is available
THREEx.FullScreen._hasWebkitFullScreen = 'webkitCancelFullScreen' in document ? true : false;
THREEx.FullScreen._hasMozFullScreen = 'mozCancelFullScreen' in document ? true : false;

/**
 * Bind a key to renderer screenshot
 * usage: THREEx.FullScreen.bindKey({ charCode : 'a'.charCodeAt(0) }); 
*/
THREEx.FullScreen.bindKey = function (opts) {
    opts = opts || {};
    var charCode = opts.charCode || 'f'.charCodeAt(0);
    var dblclick = opts.dblclick !== undefined ? opts.dblclick : false;
    var element = opts.element

    var toggle = function () {
        if (THREEx.FullScreen.activated()) {
            THREEx.FullScreen.cancel();
        } else {
            THREEx.FullScreen.request(element);
        }
    }

    var onKeyPress = function (event) {
        if (event.which !== charCode) return;
        toggle();
    }.bind(this);

    document.addEventListener('keypress', onKeyPress, false);

    dblclick && document.addEventListener('dblclick', toggle, false);

    return {
        unbind: function () {
            document.removeEventListener('keypress', onKeyPress, false);
            dblclick && document.removeEventListener('dblclick', toggle, false);
        }
    };
}