// DependencyManager
DependencyManager = new Object();
DependencyManager.init = function(form) {
  var inited = false;
  //var cache = document.getElementsByName(form.name + "DependencyCache");
  var cache = new Array();
  for (var i = 0; i < form.elements.length; i++) {
    if (form.elements[i].name == form.name + "DependencyCache") cache.push(form.elements[i]);
  }
  if (cache.length && cache[0].value) {
    var commands = eval(JSON.parse(decodeURIComponent(cache[0].value)));
    cache[0].value = "";
    this.initCommands(commands);
    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.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.show = function(elements) {
  return new Dependency(elements.constructor==String?elements.split(","):elements, "show");
}
DependencyManager.hide = function(elements) {
  return new Dependency(elements.constructor==String?elements.split(","):elements, "hide");
}
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.copy_value_from = function(content) {
  this.content = content;
  return this;
}
DependencyManager.to = function(elements) {
  return new Dependency(elements.constructor==String?elements.split(","):elements, "copy_value_from", null, this.content);
}
DependencyManager.set_value = function(content) {
  this.content = content;
  return this;
}
DependencyManager.on = function(elements) {
  return new Dependency(elements.constructor==String?elements.split(","):elements, "set_value", null, this.content);
}
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);
}
// checkbox és radio button esetén az ugyanolyan név ismétlést eredményez
// az események előtt és után végrehajtandó tevékenységek kezelésére
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(name) {
  if (this.managedTriggers.hasOwnProperty(name)) {
    if (this[this.managedTriggers[name][0].dependency.action + "Manager"]) {
      this[this.managedTriggers[name][0].dependency.action + "Manager"](name);
    } else {
      for (var j = 0 ; j < this.managedTriggers[name].length; j++) {
        this.managedTriggers[name][j].checkValue();
      }
    }
  }
}

// Actions
function Actions() {
}
Actions.prototype = new Object();
Actions.prototype.show = function() {
  for (var i = 0; i < this.elements.length; i++) {
    this.elements[i].style.display = "";
  }
}
Actions.prototype.hide = function() {
  for (var i = 0; i < this.elements.length; i++) {
    this.elements[i].style.display = "none";
  }
}
Actions.prototype.copy_value_from = function() {
  if (this.parameters) {
    var sourceElement = document.getElementsByName(this.parameters);
    if (sourceElement.length) {
      sourceElement = sourceElement[0];
      for (var i = 0; i < this.elements.length; i++) {
        var element = this.elements[i];
        if (element.type == "checkbox") {
          if (element.value == sourceElement.value) {
            element.checked = true;
          } else {
            element.checked = false;
          }
        } else {
          element.value = sourceElement.value;
        }
      }
    }
  }
}
Actions.prototype.set_value = function() {
  if (this.parameters) {
    for (var i = 0; i < this.elements.length; i++) {
      var element = this.elements[i];
      if (element.type == "checkbox") {
        if (element.value == this.parameters) element.checked = true;
      } else {
        element.value = this.parameters;
      }
    }
  }
}
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;
      element.options[0] = new Option((translations && translations.choose ? translations.choose : "Válassz"), "");
      var k = 1;
      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;
}
DependencyTrigger.prototype = new Object();
DependencyTrigger.prototype.changes = function() {
  Event.observe(this.element[0], "change", callback(this, function(){this.dependency.doAction();}));
}
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.isNot = function(value) {
  this.value = value;
}
DependencyTrigger.prototype.check = function() {
  if (this.managed) {
    DependencyManager.checkTriggers(this.element.name);
  } 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 (act) {
    this.dependency.doAction();
  } else {
    this.dependency.doOpposingAction();
  }
}

var DependencyCache = new Object();

