// © 2007, Applied Geographics, Inc.  All rights reserved.

function PanelOption(optionId, id, normalClass, overClass, selectedClass, disabledClass, hiddenName, group, selected, value) {
  this.optionId = optionId;
  this.id = id;
  this.selected = selected;
  this.element = document.getElementById(id);
  this.element.value = value;
  
  this.normalClass = normalClass;
  this.overClass = overClass;
  this.selectedClass = selectedClass;
  this.disabledClass = disabledClass;
  
  this.hiddenName = hiddenName;
  this.group = group.length > 0 ? group.split(",") : [];
  
  implementEventHandler(this);
  
  this.getEnabled = function() {
    return eval(document.getElementById(this.id + ".Enabled").value);
  };
  
  this.getSelected = function() {
    return this.selected;
  };
  
  this.getSelectedInGroup = function() {
    var id = document.getElementById(this.hiddenName).value;
    return id.length > 0 ? eval(id) : null;
  };
  
  this.mouseDown = function(e) {
    this.select(e);
  };
  
  this.mouseOver = function() {
    if (this.getEnabled() && !this.selected) {
      this.element.className = this.overClass;
    }
  };
  
  this.mouseOut = function() {
    if (this.getEnabled() && !this.selected) {
      this.element.className = this.normalClass;
    }
  };
  
  this.select = function(e) {
    if (this.getEnabled() && !this.selected) {

      var opt = this.getSelectedInGroup();
      
      if (opt) {
        opt.controller.unselect(e);
      }
      
      this.element.className = this.selectedClass;
      this.selected = true;
      
      document.getElementById(this.hiddenName).value = this.optionId;
      
      if (e) {
        this.dispatchEvent("click", e);
        this.dispatchEvent("selectedchanged", e, this.element.value);
      }
    }
  };
  
  this.setEnabled = function(enabled) {
    this.element.className = enabled ? this.normalClass : this.disabledClass;
    document.getElementById(this.id + ".Enabled").value = enabled + "";
  };
  
  this.setSelected = function(selected) {
    if (selected) {
      this.select();
    }
    else {
      this.unselect();
    }
  };
  
  this.unselect = function(fireEvent) {
    if (this.getEnabled() && this.selected) {
      this.element.className = this.normalClass;
      this.selected = false;
      
      document.getElementById(this.hiddenName).value = "";

      if (fireEvent) {
        this.dispatchEvent("selectedchanged");
      }
    }
  };
  
  var controller = this;
  this.attachEventToElement(this.element, "mousedown", function (e) { controller.mouseDown(e); });
  this.attachEventToElement(this.element, "mouseover", function (e) { controller.mouseOver(e); });
  this.attachEventToElement(this.element, "mouseout", function (e) { controller.mouseOut(e); });
  
  this.element.controller = controller;
  this.element.attachEvent = function(eventName, handler) { this.controller.attachEvent(eventName, handler); };
  this.element.getEnabled = function() { return this.controller.getEnabled(); };
  this.element.getSelected = function() { return this.controller.getSelected(); };
  this.element.getSelectedInGroup = function() { return this.controller.getSelectedInGroup(); };
  this.element.select = function() { return this.controller.select(); };
  this.element.setEnabled = function(enabled) { return this.controller.setEnabled(enabled); };
  this.element.setSelected = function(selected) { return this.controller.setSelected(selected); };
  this.element.unselect = function() { return this.controller.unselect(); };
  
  return this.element;
}



