// see also http://www.themaninblue.com/experiment/FormTextResizer/

function enableResize() {
    var txtAreas = document.getElementsByTagName('textarea');
    for(var i=0; i<txtAreas.length; i++)
    {
        el = new ResizableElement(txtAreas[i]);
    }
    
    /*
    var divs = document.getElementsByTagName('div');
    for(var i=0; i<divs.length; i++)
    {
        if (divs[i].className.indexOf('resizable')>=0)
          el = new ResizableElement(divs[i]);
    }
    */
    
}

/*
**  based on textareaResizer script by Jason Johnston (jj@lojjic.net)
**
**  This script allows user to drag with the mouse to resize enabled divs or textareas.
*/


function ResizableElement(elt, minWidth, minHeight, maxWidth, maxHeight) {
	this.element = elt;
	this.create();
        this.minWidth = minWidth;
        this.minHeight = minHeight;
        this.maxWidth = maxWidth;
        this.maxHeight = maxHeight;
}

ResizableElement.prototype = {
	create : function() {
		var thisRef = this;
                if (this.element.nodeName=="DIV") {
                  // prevent text selection when dragging div
                  this.element.onselectstart = function () { return false; } // ie
                  this.element.onmousedown = function () { return false; } // mozilla
                }
                attachEventListener(this.element,"mousedown", this.mouseDownHdlr=function(evt){thisRef.dragStart(evt);});
	},
	
	dragStart : function(evt) {
		var thisRef = this;

                var winPos = windowPos();
                var pos = elementPos(this.element);
                var x = evt.clientX - pos[0] + winPos[0];
                var y = evt.clientY - pos[1] + winPos[1];
                var width = getWidth(this.element);
                var height = getHeight(this.element);
                
                if (width - x < 20 && height - y < 20) {
                  //alert("x=" + x + ", y=" + y + ", width=" + width + ", height=" + height);

                  this.dragStartY = evt.clientY;
                  this.dragStartH = height;
                  this.dragStartX = evt.clientX;
                  this.dragStartW = width;

                  //alert("x=" + this.dragStartX + ", y=" + this.dragStartY + ", width=" + this.dragStartW + ", height=" + this.dragStartH);
                  attachEventListener(document, "mousemove", this.dragMoveHdlr=function(evt){thisRef.dragMove(evt); return false;});
                  attachEventListener(document, "mouseup", this.dragStopHdlr=function(evt){thisRef.dragStop(evt);});
                  attachEventListener(document, "click", this.dragStopHdlr=function(evt){thisRef.dragStop(evt);});
                } else {
                    this.element.focus();
                }
	},
	
	dragMove : function(evt) {
                width = checkBounds(this.dragStartW + evt.clientX - this.dragStartX, this.minWidth, this.maxWidth);
                height = checkBounds(this.dragStartH + evt.clientY - this.dragStartY, this.minHeight, this.maxHeight);
                
		if (width>-1) this.element.style.width = width + "px";
		if (height>-1) this.element.style.height = height + "px";
                //this.handle.style.width = this.element.style.width;
                if (this.element.resized) this.element.resized(width, height);
	},
	
	dragStop : function(evt) {
		detachEventListener(document, "mousemove", this.dragMoveHdlr);
		detachEventListener(document, "mouseup", this.dragStopHdlr);
		detachEventListener(document, "click", this.dragStopHdlr);
	},
	
	destroy : function() {
                this.element = null;
                detachEventListener(this.element,"mousedown", this.mouseDownHdlr);
	}
};

addOnLoad(enableResize);

function setupTabs(tabBarId, tabDivId) {
  if(tabBarDiv && tabDivId) {
    var objTabs = new Zapatec.Tabs({
      tabBar: tabBarId,
      tabs: tabDivId,
      theme: 'rounded'
    });
  }
}

function setupForm(formId) {
  if (formId) {
    new Zapatec.Form({
            form: formId,
            showErrors: 'afterField',
            showErrorsOnSubmit: true,
            submitErrorFunc: showFieldErrors,
            theme: 'default'
    });
  }
}

/*
 * Form Validation call-back functions
 */

function uniqueFieldErrors(a)
{
   var r = new Array();
   o:for(var i = 0, n = a.length; i < n; i++)
   {
      for(var x = 0, y = r.length; x < y; x++)
      {
         if(r[x].field.name==a[i].field.name) continue o;
      }
      r[r.length] = a[i];
   }
   return r;
}

function showFieldErrors(objErrors){

        var prevErrCount = objErrors.fieldErrors.length;
        objErrors.fieldErrors = uniqueFieldErrors(objErrors.fieldErrors);
        if (objErrors.fieldErrors.length != prevErrCount) objErrors.generalError = objErrors.generalError.replace(prevErrCount, objErrors.fieldErrors.length)
        
        var message = objErrors.generalError + '<br />';
	
	if (objErrors.fieldErrors) {
		for (var ii = 0; ii < objErrors.fieldErrors.length; ii++)
			message += (ii + 1) + ': Field "' + objErrors.fieldErrors[ii].field.name + '" ' + objErrors.fieldErrors[ii].errorMessage.replace("This field ","") + "<br />";
	}
	
	var outputDiv = document.getElementById("errOutput");
	
	if(outputDiv != null){
		outputDiv.innerHTML = message;
		outputDiv.style.display = "block";
	}
}
