// DependencyManager
DependencyManager = new Object();
DependencyManager.init = function(form) {
  var inited = false;
  var cache = document.getElementsByName(form.name + "DependencyCache");
  if (cache.length && cache[0].value) {
    this.initCommands(JSON.parse(decodeURIComponent(cache[0].value)));
    cache[0].value = "";
    inited = true;
  } else if (DependencyCache && DependencyCache[form.name]) {
     this.initCommands(DependencyCache[form.name]);
     inited = true;
  }
    
  // Form reset segítése.
  if (inited) {
    Event.observe(form, "reset", function() {
      window.setTimeout(function(){
        if (form.dependency) {
          for (var i = 0; i < form.dependency.length; i++) {
            form.dependency[i].check();
          }
        }
      }, 0);
    });
  }
}
DependencyManager.initElements = function(e) {
  var element = Event.delegate(e);
  if (!this.params.elements[element.name]) {
    new asyncRequest(this.params.url + "?element[]=" + element.name, callback(this, function(xhr){this.initCommands(JSON.parse(xhr.responseText));}));
    this.params.elements[element.name] = true;
  }
}
DependencyManager.initCommands = function(commands) {
  for (var i = 0; i < commands.length; i++) {
    var state = this;
    for (var j in commands[i]) {
      if (commands[i].hasOwnProperty(j)) {
        state = state[j](commands[i][j]);
      }
    }
  }
}
DependencyManager.disable = function(elements) {
  return new Dependency(elements.constructor==String?elements.split(","):elements, "disable");
}
DependencyManager.enable = function(elements) {
  return new Dependency(elements.constructor==String?elements.split(","):elements, "enable");
}
DependencyManager.update = function(elements) {
  this.elements = elements;
  return this;
}
DependencyManager._with = function(content) {
  return new Dependency(this.elements.constructor==String?this.elements.split(","):this.elements, "update", null, content);
}
DependencyManager.managedTriggers = new Object();
DependencyManager.registerTrigger = function(trigger) {
  if (!this.managedTriggers[trigger.element.name]) this.managedTriggers[trigger.element.name] = new Array();
  this.managedTriggers[trigger.element.name].push(trigger);
}
DependencyManager.checkTriggers = function() {
  for (var i in this.managedTriggers) {
    if (this.managedTriggers.hasOwnProperty(i)) {
      if (this[this.managedTriggers[i][0].dependency.action + "Manager"]) this[this.managedTriggers[i][0].dependency.action + "Manager"](i);
    }
  }
}

// Actions
function Actions() {
}
Actions.prototype = new Object();
Actions.prototype.update = function() {
  if (this.parameters) {
    for (var i = 0; i < this.elements.length; i++) {
      var element = this.elements[i];
      if (element.disabled) element.disabled = false;
      element.options.length = 0;
      var k = 0;
      for (var j in this.parameters) {
        if (this.parameters.hasOwnProperty(j)) {
          var option = new Option(this.parameters[j], j);
          element.options[k++] = option;
        }
      }
      element.focus();
      element.blur();
    }
  }
}
Actions.prototype.disable = function() {
  for (var i = 0; i < this.elements.length; i++) {
    var element = this.elements[i];
    element.value = "";
    if (element.options) element.options.length = 0;
    element.disabled = true;
  }
}
Actions.prototype.enable = function() {
  for (var i = 0; i < this.elements.length; i++) {
    var element = this.elements[i];
    element.disabled = false;
  }
}

// Dependency
function Dependency(elements, action, opposingAction, parameters) {
  Actions.call(this);
  this.elements = new Array();
  for (var i = 0; i < elements.length; i++) {
    var el = document.getElementsByName(elements[i]);
    for (var j = 0; j < el.length; j++) {
      this.elements.push(el[j]);
    }
  }
  this.parameters = parameters;
  this.action = action;
  this.opposingAction = opposingAction;
}
Dependency.prototype = new Actions();
Dependency.prototype.when = function(element) {
  this.targetElement = document.getElementsByName(element);
  return new DependencyTrigger(element, this);
}
Dependency.prototype.doAction = function() {
  if (this.action) this[this.action]();
}
Dependency.prototype.doOpposingAction = function() {
  if (this.opposingAction) this[this.opposingAction]();
}

// DependencyTrigger
function DependencyTrigger(element, dependency) {
  this.element = document.getElementsByName(element);
  this.dependency = dependency;
  this.managed = false;
  this.neg = false;
}
DependencyTrigger.prototype = new Object();
DependencyTrigger.prototype.is_not = function(value) {
  this.neg = true;
  this.is(value);
}
DependencyTrigger.prototype.is = function(value) {
  this.value = value;
  if (this.element[0].type == "checkbox" || this.element[0].type == "radio") {
    var element = null;
    for (var i = 0; i < this.element.length; i++) {
      if (this.element[i].value == this.value) {
        element = this.element[i];
        break;
      }
    }
    this.element = element;
    Event.observe(this.element, "click", callback(this, this.check));
    DependencyManager.registerTrigger(this);
    this.managed = true;
  } else {
    this.element = this.element[0];
    Event.observe(this.element, "change", callback(this, this.check));
  }
  // Form cache.
  if (!this.element.dependency) this.element.dependency = new Array();
  this.element.dependency.push(this);
  // Form reset.
  if (!this.element.form.dependency) this.element.form.dependency = new Array();
  this.element.form.dependency.push(this);
  
  // Kezdeti értékadás.
  var values = new Object();
  for (var i = 0; i < this.dependency.elements.length; i++) {
    if (this.dependency.elements[i].value) values[this.dependency.elements[i].id] = this.dependency.elements[i].value;
  }
  
  this.check();
  
  for (var i = 0; i < this.dependency.elements.length; i++) {
    if (values[this.dependency.elements[i].id]) this.dependency.elements[i].value = values[this.dependency.elements[i].id];
  }
  
}
DependencyTrigger.prototype.check = function() {
  if (this.managed) {
    DependencyManager.checkTriggers();
  } else {
    this.checkValue();
  }
}
DependencyTrigger.prototype.checkValue = function() {
  var act = false;
  if (this.element.type == "checkbox" || this.element.type == "radio") {
    if (this.element.checked == true) act = true;
  } else if (this.element.type == "select-multiple") {
    for (var i = 0; i < this.element.options.length; i++) {
      if (this.element.options[i].value == this.value) {
        if (this.element.options[i].selected == true) act = true;
        break;
      }
    }
  } else {
    if (this.element.value == this.value) act = true;
  }
  if (this.neg) act = !act;
  if (act) {
    this.dependency.doAction();
  } else {
    this.dependency.doOpposingAction();
  }
}

var DependencyCache = new Object();