
/**
* Tool constructor
*/
var Tool = function(h, s, t, tb, w, toolBox) {
  this.headline   = h;
  this.selector   = s;
  this.parentElem = tb;
  this.toolBasic  = t;
  this.toolAdv    = null;
  this.expandBtn;
  this.expandBtnDisabled = null;
  this.contractBtn;
  this.isExpanded = false;
  this.width      = w - 19;
  this.left       = this.width * -1;
  this.selWidthOrig = s.offsetWidth;
  this.toolTip;
	this.mainContent;
	this.toolBox = toolBox;

  this.init();
  this.bindEvents();
  this.bindForms();
};

Tool.prototype.init = function() {
  var toolBasicBg        = document.getElementsByClassName("toolBasicBg", this.toolBasic)[0];
  var toolAdvBg          = $(toolBasicBg.id.replace("Basic", "Advanced"));
  if(toolAdvBg) this.toolAdv = toolAdvBg.parentNode;
  this.expandBtn         = document.getElementsByClassName("toolBoxExpandBtn", this.toolBasic)[0];
  if(this.expandBtn) this.expandBtnDisabled = this.expandBtn.parentNode.getElementsByTagName("span")[0];
  var toolAdvHeader      = document.getElementsByClassName("toolAdvContentHeader", this.toolAdv)[0];
  this.contractBtn       = toolAdvHeader.getElementsByTagName("a")[0];
	this.mainContent = $("mainContent");
  this.toolTip           = document.getElementsByClassName("toolBoxToolTip")[0];

  this.toolBasic.style.width = this.width + "px";
  this.toolBasic.style.left  = this.left + "px";
};

Tool.prototype.bindEvents = function() {
  var self = this;

  self.selector.parentNode.onmouseover = function() {
    var sON = this;

	  var tweenOn = new Fx.Style(sON, "width", {
	    duration: 250,
	    onStart: function() {
	      if(sON.className.indexOf("DEFAULT") == -1)
		      sON.className = sON.id + "On";
	    }
	  }).custom(self.selWidthOrig, self.selWidthOrig+5);
    
    self.toolTip.style.display = "block";
    self.toolTip.firstChild.innerHTML = self.selector.innerHTML;
    self.toolTip.style.top = self.getPosY() - 27 + "px";
    self.toolTip.style.left = self.getPosX() + sON.offsetWidth - 21 + "px";
  };

  self.selector.parentNode.onmouseout = function() {
    var sOFF  = this;
	  var width = sOFF.offsetWidth;

	  var tweenOff = new Fx.Style(sOFF, "width", {
	    duration: 250,
	    onStart: function() {
	      if(sOFF.className.indexOf("DEFAULT") == -1)
		      sOFF.className = "";	
	    },
			onComplete: function() {
				sOFF.style.width = self.selWidthOrig + "px";
			}
	  }).custom(self.selWidthOrig+5, self.selWidthOrig);

    self.toolTip.style.display = "none";
  };
  
  if(this.toolAdv && this.expandBtn && this.contractBtn) {
    this.expandBtn.onclick = function() {
      self.expand();
    };

    this.contractBtn.onclick = function() {
      self.contract();
    };
  }
};

Tool.prototype.bindForms = function() {
	var formBasic = this.toolBasic.getElementsByTagName('form')[0];
	var formAdv;
	if (this.toolAdv) formAdv = this.toolAdv.getElementsByTagName('form')[0];
	var fields = this.toolBasic.getElementsByTagName('input');
	for (var i=0; i<fields.length; i++)	{
		this.bindField(fields[i], formBasic, formAdv);
	}
	if (!this.toolAdv) return;
	fields = this.toolAdv.getElementsByTagName('input');
	for (var i=0; i<fields.length; i++)	{
		this.bindField(fields[i], formBasic, formAdv);
	}
};

Tool.prototype.bindField = function(field, formBasic, formAdv) {
	var o = this;
	field.onkeypress = function(e) {
		if (!e) var e = window.event;
		if (e.keyCode == 13) o.toolBox.submitForm(formBasic, formAdv);
	}
}

Tool.prototype.expand = function() {
  var self = this;
  var adv  = this.toolAdv;

  var tween = new Fx.Style(adv, "left", {
    duration: 500,
    onStart: function() {
			if(self.mainContent) {
				self.mainContent.style.position = "relative";
				self.mainContent.style.overflow = "hidden";
			}
      adv.style.display = "block";
      self.expandBtn.style.display = "none";
      self.expandBtnDisabled.style.display = "block";
      self.parentElem.style.overflow = "visible";
    },
    onComplete: function() {
			if(self.mainContent) {
				self.mainContent.style.position = "";
				self.mainContent.style.overflow = "visible";
			}
      self.manageSysSel(adv, 1);
      self.isExpanded = true;
    }
  }).custom(0, -379);
};

Tool.prototype.contract = function() {
  var self = this;
  var adv  = this.toolAdv;

  var tween = new Fx.Style(adv, "left", {
    duration: 500,
    onStart: function() {
			if(self.mainContent) {
				self.mainContent.style.position = "relative";
				self.mainContent.style.overflow = "hidden";
			}
      self.manageSysSel(adv, 0);
    },
    onComplete: function() {
      adv.style.display = "none";
      self.expandBtn.style.display = "block";
      self.expandBtnDisabled.style.display = "none";
      self.parentElem.style.overflow = "hidden";
			if(self.mainContent) {
				self.mainContent.style.position = "";
				self.mainContent.style.overflow = "visible";
			}
      self.isExpanded = false;
    }
  }).custom(-379, 0);
};

Tool.prototype.manageSysSel = function(obj, onOff) {
  var list  = obj.getElementsByTagName("select");
  var vis   = onOff ? "visible" : "hidden";

  for(var i=0; i<list.length; i++) {
    list[i].style.visibility = vis;
  }
};

Tool.prototype.getPosX = function() {
  var obj = this.selector;
  var curleft = 0;
  
  if(obj.offsetParent) {
    while(1) {
      curleft += obj.offsetLeft;
      
      if(!obj.offsetParent)
        break;
      
      obj = obj.offsetParent;
    }
  }
  else if(obj.x)
    curleft += obj.x;
    
  return curleft;
};

Tool.prototype.getPosY = function() {
  var obj = this.selector;
  var curtop = 0;
    
  if(obj.offsetParent) {
    while(1) {
      curtop += obj.offsetTop;
      
      if(!obj.offsetParent)
        break;
      
      obj = obj.offsetParent;
    }
  }
  else if(obj.y)
    curtop += obj.y;
  
  return curtop;
};
