CmdUtils.CreateCommand({
  name: 'status-in-gmail',

  takes: {'status message': noun_arb_text},

  preview: function(pblock, msg) {
    var currentGmailTabs = this._getGmailTabs();
    
    var previewHTML = ''
    if (currentGmailTabs.length == 0) {
      previewHTML = 'You don\'t have any Gmail tabs open right now, so this won\'t do anything.';  
    } else {
      previewHTML = 'Set your Google Talk status message to: <em>"' + msg.text + '"</em>';
      if (currentGmailTabs.length > 1) {
        previewHTML += ' in each of your ' + currentGmailTabs.length + ' currently open Gmail tabs.';
      }
    }
    pblock.innerHTML = previewHTML;
  },

  execute: function( msg ) {
    var statusMsg = msg.text;

    var tabs = this._getGmailTabs();
    var originalTab = Application.activeWindow.activeTab;
    // One at a time, bring Gmail tab to the front, load gmonkey module, and set status message.
    // (The tab switching appears to be necessary to ensure that setting focus and sending an enter event
    // to the status input works.) Then bring focus back to the original tab.
    var updateNextWindow = this._bind(function() {
      var tab = tabs.pop();
      if (tab) {
        tab.focus();
        var win = tab.document.defaultView.wrappedJSObject;
        win.gmonkey.load('1.0', this._bind(function(gmail) {
          this._setStatusMsg(gmail, statusMsg);
          updateNextWindow();
        }));
      } else {
        originalTab.focus();
      }
    });
    updateNextWindow();
    
  },

  _bind: function(func, arguments) {
    var _this = this;
    return function() {
      func.apply(_this, arguments);
    }
  },

  _getGmailTabs: function(){
    var windows = [];

    for (var i = 0; i < Application.windows.length; i++ ) {
      var appWindow = Application.windows[i];
      for (var j = 0; j < appWindow.tabs.length; j++) {
        var tab = appWindow.tabs[j];
        var win = tab.document.defaultView.wrappedJSObject;
        if (/mail/i.exec(tab.document.title) && win.gmonkey) {
          windows.push(tab);
        }
      }
    }

    return windows;
  },

  _setStatusMsg: function(gmail, statusMessage) {
    try {

      var sidebar = gmail.getNavPaneElement();
      var doc = sidebar.ownerDocument;

      var contactSearchInput = sidebar.getElementsByTagName('input')[0];
      var contactSearchWrapper = this._getAncestor(contactSearchInput, 4)
      var chatWrapper = contactSearchWrapper.nextSibling;
      var statusTable = chatWrapper.getElementsByTagName('table')[0];
      var statusDiv = statusTable.getElementsByTagName('div')[1];

      var clickEvent = doc.createEvent("Events");
      clickEvent.initEvent("click", true, false);
      statusDiv.dispatchEvent(clickEvent);

      var statusInput = chatWrapper.getElementsByTagName('input')[0];
      statusInput.value = statusMessage;
    
      var enterKeyEvent = doc.createEvent('KeyboardEvent');
      enterKeyEvent.initKeyEvent('keypress', true, true, null, false, false, false, false, 13 ,0);
      statusInput.focus();
      statusInput.dispatchEvent(enterKeyEvent);

    } catch (e) {
      displayMessage('Error setting status: ' + e); 
    }
  },

  _getAncestor: function(node, generations) {
    for (var i = 0; i < generations; i++) {
      node = node.parentNode;
    }
    return node;
  },


})

