
def ensureFocusHandler():
    JS("""
    return (focusHandler !== null) ? focusHandler : (focusHandler =
            @{{createFocusHandler}}());
    """)

def createFocusHandler():
    JS("""
    return function(evt) {
      // This function is called directly as an event handler, so 'this' is
      // set up by the browser to be the input on which the event is fired. We
      // call focus() in a timeout or the element may be blurred when this event
      // ends.
      var div = this['parentNode'];
      if (div['onfocus']) {
        $wnd['setTimeout'](function() {
          div['focus']();
        }, 0);
      }
    };
    """)

def createFocusable0(focusHandler):
    JS("""
    var div = $doc['createElement']('div');
    div['tabIndex'] = 0;

    var input = $doc['createElement']('input');
    input['type'] = 'text';
    input['style']['opacity'] = 0;
    input['tabIndex'] = -1;
    input['style']['zIndex'] = -1;
    input['style']['width'] = '1px';
    input['style']['height'] = '1px';
    input['style']['overflow'] = 'hidden';
    input['style']['position'] = 'absolute';

    input['addEventListener']( 'focus', focusHandler, false);

    div['appendChild'](input);
    return div;
    """)

def createFocusable():
    ensureFocusHandler()
    return createFocusable0()



def ensureFocusHandler():
    JS("""
    return (focusHandler !== null) ? focusHandler : (focusHandler =
            @{{createFocusHandler}}());
    """)

def createFocusHandler():
    JS("""
    return function(evt) {
      // This function is called directly as an event handler, so 'this' is
      // set up by the browser to be the input on which the event is fired. We
      // call focus() in a timeout or the element may be blurred when this event
      // ends.
      var div = this['parentNode'];
      if (div['onfocus']) {
        $wnd['setTimeout'](function() {
          div['focus']();
        }, 0);
      }
    };
    """)

def createFocusable0(focusHandler):
    JS("""
    var div = $doc['createElement']('div');
    div['tabIndex'] = 0;

    var input = $doc['createElement']('input');
    input['type'] = 'text';
    input['style']['opacity'] = 0;
    input['tabIndex'] = -1;
    input['style']['zIndex'] = -1;
    input['style']['width'] = '1px';
    input['style']['height'] = '1px';
    input['style']['overflow'] = 'hidden';
    input['style']['position'] = 'absolute';

    input['addEventListener']( 'focus', focusHandler, false);

    div['appendChild'](input);
    return div;
    """)

def createFocusable():
    return createFocusable0(ensureFocusHandler())

Fix for IE 11 (Focus)
Fix for IE 11 (Focus)

IE presents itself as mozilla, so it trips on the bug.

  
  def ensureFocusHandler():
      JS("""
      return (focusHandler !== null) ? focusHandler : (focusHandler =
              @{{createFocusHandler}}());
      """)
  
  def createFocusHandler():
      JS("""
      return function(evt) {
        // This function is called directly as an event handler, so 'this' is
        // set up by the browser to be the input on which the event is fired. We
        // call focus() in a timeout or the element may be blurred when this event
        // ends.
        var div = this['parentNode'];
        if (div['onfocus']) {
          $wnd['setTimeout'](function() {
            div['focus']();
          }, 0);
        }
      };
      """)
  
  def createFocusable0(focusHandler):
      JS("""
      var div = $doc['createElement']('div');
      div['tabIndex'] = 0;
  
      var input = $doc['createElement']('input');
      input['type'] = 'text';
      input['style']['opacity'] = 0;
      input['tabIndex'] = -1;
      input['style']['zIndex'] = -1;
      input['style']['width'] = '1px';
      input['style']['height'] = '1px';
      input['style']['overflow'] = 'hidden';
      input['style']['position'] = 'absolute';
  
      input['addEventListener']( 'focus', focusHandler, false);
  
      div['appendChild'](input);
      return div;
      """)
  
  def createFocusable():
+     return createFocusable0(ensureFocusHandler())
-     ensureFocusHandler()
-     return createFocusable0()
  
- 
Fix for IE 11 (Focus)
## Code Before:

def ensureFocusHandler():
    JS("""
    return (focusHandler !== null) ? focusHandler : (focusHandler =
            @{{createFocusHandler}}());
    """)

def createFocusHandler():
    JS("""
    return function(evt) {
      // This function is called directly as an event handler, so 'this' is
      // set up by the browser to be the input on which the event is fired. We
      // call focus() in a timeout or the element may be blurred when this event
      // ends.
      var div = this['parentNode'];
      if (div['onfocus']) {
        $wnd['setTimeout'](function() {
          div['focus']();
        }, 0);
      }
    };
    """)

def createFocusable0(focusHandler):
    JS("""
    var div = $doc['createElement']('div');
    div['tabIndex'] = 0;

    var input = $doc['createElement']('input');
    input['type'] = 'text';
    input['style']['opacity'] = 0;
    input['tabIndex'] = -1;
    input['style']['zIndex'] = -1;
    input['style']['width'] = '1px';
    input['style']['height'] = '1px';
    input['style']['overflow'] = 'hidden';
    input['style']['position'] = 'absolute';

    input['addEventListener']( 'focus', focusHandler, false);

    div['appendChild'](input);
    return div;
    """)

def createFocusable():
    ensureFocusHandler()
    return createFocusable0()


## Instruction:
Fix for IE 11 (Focus)
## Code After:

def ensureFocusHandler():
    JS("""
    return (focusHandler !== null) ? focusHandler : (focusHandler =
            @{{createFocusHandler}}());
    """)

def createFocusHandler():
    JS("""
    return function(evt) {
      // This function is called directly as an event handler, so 'this' is
      // set up by the browser to be the input on which the event is fired. We
      // call focus() in a timeout or the element may be blurred when this event
      // ends.
      var div = this['parentNode'];
      if (div['onfocus']) {
        $wnd['setTimeout'](function() {
          div['focus']();
        }, 0);
      }
    };
    """)

def createFocusable0(focusHandler):
    JS("""
    var div = $doc['createElement']('div');
    div['tabIndex'] = 0;

    var input = $doc['createElement']('input');
    input['type'] = 'text';
    input['style']['opacity'] = 0;
    input['tabIndex'] = -1;
    input['style']['zIndex'] = -1;
    input['style']['width'] = '1px';
    input['style']['height'] = '1px';
    input['style']['overflow'] = 'hidden';
    input['style']['position'] = 'absolute';

    input['addEventListener']( 'focus', focusHandler, false);

    div['appendChild'](input);
    return div;
    """)

def createFocusable():
    return createFocusable0(ensureFocusHandler())
