// Opera user javascript to enable IE hidden-input behaviour in Opera
// Does not yet work in Greasemonkey, due to bugs

(function (){

  // GM compat..
  var win = (typeof unsafeWindow != 'undefined') ? unsafeWindow : window;

  // must have a "real" element to lookup getters and setters on in Opera
  var tmp = win.document.createElement('input');

  var internalDefaultValueGetter = tmp.__lookupGetter__('defaultValue');
  var internalValueGetter = tmp.__lookupGetter__('value');
  var internalValueSetter = tmp.__lookupSetter__('value');

  // override 'defaultValue' setter so setting it doesn't set defaultValue on hidden inputs
  win.HTMLInputElement.prototype.__defineSetter__('value', function(val) {
    this.__defaultValue = typeof this.__defaultValue !='undefined' ? this.__defaultValue : this.defaultValue;
    internalValueSetter.call(this, val);
  });

  // this implies overriding the getter too, to make sure we return the expected value
  win.HTMLInputElement.prototype.__defineGetter__('value', function() {
    return internalValueGetter.call(this);
  });

  // this implies overriding the getter too, to make sure we return the expected value
  win.HTMLInputElement.prototype.__defineGetter__('defaultValue', function() {

    // value has been set from JS, we return it
    if (typeof this.__defaultValue != 'undefined') return this.__defaultValue;
    return internalDefaultValueGetter.call(this);
  });
  win.HTMLInputElement.prototype.getAttribute = function(name) {
    if (typeof this.__defaultValue != 'undefined') return this.__defaultValue;
    return Element.prototype.getAttribute.call(this, name);
  };

  // capture 'reset' events to make sure hidden inputs associated with the form are reset too
  win.addEventListener('reset', function(e) {
    var frm = e.target;
    for (var el, i = 0; el = frm.elements[i]; i++) {
      if (el.type === 'hidden') {
        el.value = el.defaultValue;
        win.status = 'WARNING: user script fixed RESET, reset an hidden input';
      }
    }
  }, true);
})();