/**
 * @private
 */
Ext.define('Ext.device.device.Cordova', {
    alternateClassName: 'Ext.device.device.PhoneGap',
 
    extend: 'Ext.device.device.Abstract',
 
    availableListeners: [
        'pause',
        'resume',
        'backbutton',
        'batterycritical',
        'batterylow',
        'batterystatus',
        'menubutton',
        'searchbutton',
        'startcallbutton',
        'endcallbutton',
        'volumeupbutton',
        'volumedownbutton'
    ],
 
    constructor: function() {
        // We can't get the device details until the device is ready, so lets wait.
        if (Ext.isReady) {
            this.onReady();
        }
        else {
            Ext.onReady(this.onReady, this, { single: true });
        }
    },
 
    /**
     * @property {String} cordova
     * Returns the version of Cordova running on the device.
     *
     *     alert('Device cordova: ' + Ext.device.Device.cordova);
     */
 
    /**
     * @property {String} version
     * Returns the operating system version.
     *
     *     alert('Device Version: ' + Ext.device.Device.version);
     */
 
    /**
     * @property {String} model
     * Returns the device's model name.
     *
     *     alert('Device Model: ' + Ext.device.Device.model);
     */
 
    /**
     * @event pause
     * Fires when the application goes into the background
     */
 
    /**
     * @event resume
     * Fires when the application goes into the foreground
     */
 
    /**
     * @event batterycritical
     * This event that fires when a Cordova application detects the percentage of battery 
     * has reached the critical battery threshold.
     */
 
    /**
     * @event batterylow
     * This event that fires when a Cordova application detects the percentage of battery 
     * has reached the low battery threshold.
     */
 
    /**
     * @event batterystatus
     * This event that fires when a Cordova application detects the percentage of battery 
     * has changed by at least 1 percent.
     */
 
    /**
     * @event backbutton
     * This is an event that fires when the user presses the back button.
     */
 
    /**
     * @event menubutton
     * This is an event that fires when the user presses the menu button.
     */
 
    /**
     * @event searchbutton
     * This is an event that fires when the user presses the search button.
     */
 
    /**
     * @event startcallbutton
     * This is an event that fires when the user presses the start call button.
     */
 
    /**
     * @event endcallbutton
     * This is an event that fires when the user presses the end call button.
     */
 
    /**
     * @event volumeupbutton
     * This is an event that fires when the user presses the volume up button.
     */
 
    /**
     * @event volumedownbutton
     * This is an event that fires when the user presses the volume down button.
     */
 
    onReady: function() {
        var me = this,
            device = window.device;
 
        me.name = device.name || device.model;
        me.cordova = device.cordova;
        me.platform = device.platform || Ext.os.name;
        me.uuid = device.uuid;
        me.version = device.version;
        me.model = device.model;
    },
 
    privates: {
        doAddListener: function(name) {
            var me = this;
 
            if (!me.addedListeners) {
                me.addedListeners = [];
            }
 
            if (me.availableListeners.indexOf(name) != -1 && me.addedListeners.indexOf(name) == -1) {
                // Add the listeners
                me.addedListeners.push(name);
 
                document.addEventListener(name, function() {
                    me.fireEvent(name, me);
                });
            }
 
            Ext.device.Device.mixins.observable.doAddListener.apply(Ext.device.Device.mixins.observable, arguments);
        }
    }
});