/**
 * @class Ext.air.SystemMenu
 *
 * Provides platform independent handling of adding item to the application menu, creating the menu or
 * items as needed.


 *
 * This class also provides the ability to bind standard Ext.Action instances with NativeMenuItems
 *
 * @singleton
 */

Ext.air.SystemMenu = function(){
       
var menu;
       
// windows
       
if(air.NativeWindow.supportsMenu && nativeWindow.systemChrome != air.NativeWindowSystemChrome.NONE) {
        menu
= new air.NativeMenu();
        nativeWindow
.menu = menu;
   
}
   
       
// mac
   
if(air.NativeApplication.supportsMenu) {
                menu
= air.NativeApplication.nativeApplication.menu;
   
}

   
function find(menu, text){
       
for(var i = 0, len = menu.items.length; i < len; i++){
           
if(menu.items[i]['label'] == text){
               
return menu.items[i];
           
}
       
}
       
return null;
   
}

   
return {
               
/**
                 * Add items to one of the application menus
                 * @param {String} text The application menu to add the actions to (e.g. 'File' or 'Edit').
                 * @param {Array} actions An array of Ext.Action objects or menu item configs
                 * @param {Number} mindex The index of the character in "text" which should be used for
                 * keyboard access
                 * @return air.NativeMenu The raw submenu
                 */

                add
: function(text, actions, mindex){

           
var item = find(menu, text);
           
if(!item){
                item
= menu.addItem(new air.NativeMenuItem(text));
                item
.mnemonicIndex = mindex || 0;

                item
.submenu = new air.NativeMenu();
                       
}
                       
for (var i = 0, len = actions.length; i < len; i++) {
                                item
.submenu.addItem(actions[i] == '-' ? new air.NativeMenuItem("", true) : Ext.air.MenuItem(actions[i]));
                       
}
           
return item.submenu;
       
},
               
               
/**
                 * Returns the application menu
                 */

               
get : function(){
                       
return menu;
               
}
       
};      
}();

// ability to bind native menu items to an Ext.Action
Ext.air.MenuItem = function(action){
       
if(!action.isAction){
                action
= new Ext.Action(action);
       
}
       
var cfg = action.initialConfig;
       
var nativeItem = new air.NativeMenuItem(cfg.itemText || cfg.text);
       
        nativeItem
.enabled = !cfg.disabled;

   
if(!Ext.isEmpty(cfg.checked)){
        nativeItem
.checked = cfg.checked;
   
}

   
var handler = cfg.handler;
       
var scope = cfg.scope;
       
        nativeItem
.addEventListener(air.Event.SELECT, function(){
                handler
.call(scope || window, cfg);
       
});
       
        action
.addComponent({
                setDisabled
: function(v){
                        nativeItem
.enabled = !v;
               
},
               
                setText
: function(v){
                        nativeItem
.label = v;
               
},
               
                setVisible
: function(v){
                       
// could not find way to hide in air so disable?
                        nativeItem
.enabled = !v;
               
},
               
                setHandler
: function(newHandler, newScope){
                        handler
= newHandler;
                        scope
= newScope;
               
},
               
// empty function
                on
: function(){}
       
});
       
       
return nativeItem;
}