function _zwContextMenu()
{
	this.object=false;
	this.parent=false;
	this.x=0;
	this.y=0;
}

function _zwIsValidDate(sDate)
{
	var oVal=sDate.split('/');
	var iDay='';
	var iMonth='';
	var iYear='';

	iDay=oVal[0];
	if(oVal.length>1) iMonth=oVal[1];
	if(oVal.length>2)	iYear=oVal[2];

	if(iDay.length>0 && iMonth.length>0 && iYear.length>0)
	{
		return _zwIsValidDayMonthYear(iDay, iMonth, iYear)
	} else {
		return false;
	}
}

function _zwIsValidDayMonthYear(iDay, iMn, iYr)
{
	var dt;

	iDay=parseInt(iDay, 10);
	iMn=parseInt(iMn, 10);
	iYr=parseInt(iYr, 10);
	dt=new Date(iMn+"/"+iDay+"/"+iYr);

	if(dt.getDate()!=iDay || dt.getMonth()!=iMn-1 || dt.getFullYear()!=iYr)
		return false;
	return true;
 }


_zwContextMenu.prototype = {

	show:function(object, parent, x, y)
	{
		var oPos;

		if(this.object) this.hide();

		this.object=object;
		this.parent=parent;
		this.object.style.display='';

		if(this.parent)
		{
			if(this.parent!=document)
			{
				oRect=_getObjectPagePos(this.parent);
				this.x=oRect.x;
				this.y=oRect.y;
			} else {
				this.x=0;
				this.y=0;
			}
		}

		this.x+=x;
		this.y+=y;

		this.object.style.left=this.x;
		this.object.style.top=this.y;

		_addEventHandler(document.body, 'onmousedown', this.eventHandler);
		_addEventHandler(document.body, 'onkeydown', this.eventHandler);
		_addEventHandler(this.object, 'onmousedown', this.stopPropagation);
	},

	stopPropagation:function(oEvt)
	{
		oEvt=(window.event?window.event:oEvt);
		oEvt.cancelBubble=true;
		if(window.event)
		{
			oEvt.returnValue=false;
		} else {
			oEvt.stopPropagation();
		}
		return false;
	},

	eventHandler:function(oEvt)
	{

		oEvt=(window.event?window.event:oEvt);
		oObj=(window.event?oEvt.srcElement:oEvt.target)

		if(oObj!=_zwContext.object)
		{
			switch(oEvt.type)
			{
				case 'mousedown':
					_zwContext.hide();
					break;
				case 'keydown':
					if(oEvt.keyCode==27)
						_zwContext.hide();
					break;
			}
		}
	},

	hide:function()
	{
		if(this.object)
		{
			this.object.style.display='none';
			_removeEventHandler(document.body, 'onmousedown', this.eventHandler);
			_removeEventHandler(document.body, 'onkeydown', this.eventHandler);
			_removeEventHandler(this.object, 'onmousedown', this.stopPropagation);
			this.object=false;
			this.parent=false;
		}
	}
}

function _zwFormValidate(eType, sName, bRequired)
{
	var bValidated=false;
	var bCanEmpty=false;
	var oErr=document.getElementById(sName+'_error');
	var oField=document.getElementById(sName);

	switch(eType)
	{
		case 0: //FIELDEDITDEFAULT
		case 1: //FIELDEDITTEXT
		case 12: //FIELDEDITPASS
		case 15: //FIELDEDITTEXTAREA
			bValidated=_zwFormValidateText(oField, bRequired);
			bCanEmpty=true;
			break;
		case 2: //FIELDEDITINTEGER
			bValidated=_zwFormValidateInteger(oField, bRequired);
			bCanEmpty=true;
			break;
		case 3: //FIELDEDITDECIMAL
			bValidated=_zwFormValidateDecimal(oField, bRequired);
			bCanEmpty=true;
			break;
		case 4: //FIELDEDITBOOLEAN
			bValidated=_zwFormValidateCheck(oField, bRequired);
			break;
		case 5: //FIELDEDITDATE
			bValidated=_zwFormValidateDate(oField, bRequired);
			break;
		case 6: //FIELDEDITWYSWYG
			bValidated=_zwFormValidateWYSWYG(oField, bRequired);
			break;
		case 7: //FIELDEDITIMAGE
			bValidated=_zwFormValidateImage(oField, bRequired);
			break;
		case 8: //FIELDEDITOPTIONS
			bValidated=_zwFormValidateOptions(oField, bRequired);
			break;
		case 9: //FIELDEDITCOMBO
			bValidated=_zwFormValidateSelect(oField, bRequired);
			break;
		case 10: //FIELDEDITURL
			bValidated=_zwFormValidateWeb(oField, bRequired);
			bCanEmpty=true;
			break;
		case 11: //FIELDEDITMAIL
			bValidated=_zwFormValidateMail(oField, bRequired);
			bCanEmpty=true;
			break;
		case 14: //FIELDEDITCOLOR
			bValidated=_zwFormValidateColor(oField, bRequired);
			break;
		case 13: //FIELDHIDDEN
		case 99: //FIELDEDITNONE
		default:
			bValidated=true;
			break;
	}

	if(bCanEmpty)
		if(oField.className.indexOf('emptyvalue')>-1) bValidated=false;

	if(oErr) oErr.style.display=(bValidated?'none':'');

	return bValidated;
}

function _zwFormValidateCheck(oField, bRequired)
{
	return (bRequired?oField.checked:true);
}

function _zwFormValidateText(oField, bRequired)
{
	return(bRequired && oField.value.length==0?false:true);
}

function _zwFormValidateMail(oField, bRequired)
{
	return (bRequired || oField.value.length>0?_isMail(oField.value):true);
}

function _zwFormValidateWeb(oField, bRequired)
{
	return (bRequired || oField.value.length>0?_isWeb(oField.value):true);
}

function _zwFormValidateInteger(oField, bRequired)
{
	return (bRequired || oField.value.length>0?/^[-|+]?\d+$/.test(oField.value):true);
}

function _zwFormValidateDecimal(oField, bRequired)
{
	var oReg=/^(([+|-]?\d+(\.\d*)?)|([+|-]?(\d*\.)?\d+))$/;
	return (bRequired || oField.value.length>0?oReg.test(oField.value):true);
}

function _zwFormValidateDate(oField, bRequired)
{
	var oReg=/^((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/;
	// MDY	/^(?=\d)(?:(?:(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))($|\ (?=\d)))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/
	return (bRequired || oField.value.length>0?oReg.test(oField.value):true);
}

function _zwFormValidateImage(oField, bRequired)
{
	return (oField.value==0 || oField.value.length==0?false:true);
}

function _zwFormValidateWYSWYG(oField, bRequired)
{
	return true;
}

function _zwFormValidateOptions(oField, bRequired)
{
	var i;
	var bReturn=false;

	if(bRequired)
	{
		for(i=0;i<oField.length;i++)
			if(oField[i].checked)
			{
				bReturn=true;
				break;
			}
	} else {
		bReturn=true;
	}

	return bReturn;
}

function _zwFormValidateSelect(oField, bRequired)
{
	var bReturn=false;
	var oOption;

	if(bRequired)
	{
		if(oField.selectedIndex>-1)
		{
			oOption=oField.options[oField.selectedIndex];
			bReturn=!(/\btextdes\b/i.test(oOption.className));
			if(bReturn) bReturn=(oOption.value.length==0 && oField.selectedIndex==0?false:true);
		}
	} else {
		bReturn=true;
	}

	return bReturn;
}

function _zwFormValidateColor(oField, bRequired)
{
	return (bRequired || oField.value.length>0?/^#?([\dabcdef]{2}){3}$/i.test(oField.value):true);
}

function _zwEmptyValueFocus(oEvt, f)
{
	var oEvt=(oEvt?oEvt:window.event);
	var oObj=(oEvt.srcElement)?oEvt.srcElement:oEvt.target;

	if(f)
	{
		if(oObj.showempty=='1')
		{
			oObj.className=oObj.className.replace(/[ ]?emptyvalue/g, '');
			oObj.value='';
			oObj.showempty='0';
		}
	} else {
		if(oObj.showempty=='0' && oObj.value.length==0)
		{
			oObj.className+=' emptyvalue';
			oObj.value=oObj.emptyvalue;
			oObj.showempty='1';
		}
	}
}

function _zwNumberKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	sChr=(window.event?oEvt.keyCode:oEvt.charCode);
	_zwFocusNext(oEvt);

	if((sChr<48 || sChr>57) && sChr!=0)
	{
		if(window.event) oEvt.keyCode=0;
		return false;
	}
}

function _zwDecimalKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	sChr=(window.event?oEvt.keyCode:oEvt.charCode);
	_zwFocusNext(oEvt);

	if(sChr==46 || (sChr==44 && window.event))
	{
		if(window.event) oEvt.keyCode=46;
	} else if(oEvt.keyCode<48 || oEvt.keyCode>57) {
		if(window.event) oEvt.keyCode=0;
		return false;
	}
}

function _zwColorKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	sChr=(window.event?oEvt.keyCode:oEvt.charCode);
	_zwFocusNext(oEvt);

	if(sChr>=97 && sChr<=102)
		if(window.event) oEvt.keyCode-=32; else return true;

	if((oEvt.keyCode<65 || oEvt.keyCode>70) && (oEvt.keyCode<48 || oEvt.keyCode>57))
	{
		if(window.event) oEvt.keyCode=0;
		return false;
	}
}

function _zwDateKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	sChr=(window.event?oEvt.keyCode:oEvt.charCode);
	_zwFocusNext(oEvt);

	if((sChr>=44 && sChr<=47 && window.event) || sChr==47)
	{
		if(window.event) oEvt.keyCode=47;
	} else if(sChr<48 || sChr>57) {
		if(window.event) oEvt.keyCode=0;
		return false;
	}
}

function _zwMailKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	_zwFocusNext(oEvt);

	if(oEvt.keyCode>=65 && oEvt.keyCode<=90)
		oEvt.keyCode+=32;

	if(oEvt.keyCode!=46 && oEvt.keyCode!=95 && oEvt.keyCode!=45 && oEvt.keyCode!=45 && oEvt.keyCode!=64 && (oEvt.keyCode<97 || oEvt.keyCode>122) && (oEvt.keyCode<48 || oEvt.keyCode>57))
	{
		if(window.event)
			oEvt.keyCode=0;
	}
}

function _zwLower(oEvt)
{
	var oEvt=(oEvt?oEvt:window.event);
	var oObj=(oEvt.srcElement)?oEvt.srcElement:oEvt.target;

	var sVal=oObj.value.toLowerCase();
	oObj.value=sVal;
}

function _zwUpper(oEvt)
{
	var oEvt=(oEvt?oEvt:window.event);
	var oObj=(oEvt.srcElement)?oEvt.srcElement:oEvt.target;

	var sVal=oObj.value.toUpperCase();
	oObj.value=sVal;
}

function _zwUpperFirst(oEvt)
{
	var oEvt=(oEvt?oEvt:window.event);
	var oObj=(oEvt.srcElement)?oEvt.srcElement:oEvt.target;

	var sVal=oObj.value.toLowerCase().split('');
	var sCar='';
	var sAnt=' ';
	var sResult='';
	var bUp=false;

	for(var i=0;i<sVal.length;i++)
	{
		bUp=/[^a-z0-9áéíóúàèìòùçñäëïöü]/.test(sAnt);
		sCar=sVal[i];
		if(sAnt==' ' && sAnt==sCar) sCar='';
		sResult+=(bUp?sCar.toUpperCase():sCar);
		sAnt=sVal[i];
	}
	oObj.value=sResult;
}

function _zwFocusNext(oEvt)
{
	var oEvt=(oEvt?oEvt:window.event);
	var oObj=(oEvt.srcElement)?oEvt.srcElement:oEvt.target;
	var oForm;
	var oFocus;
	var i;

	if(oEvt.keyCode==13)
	{
		try
		{
			if(window.event) oEvt.keyCode=0;
			oForm=oObj.form;
			if(oForm)
			{
				if(oObj.tabIndex>0)
					for(i=0;i<oForm.elements.length;i++)
						if(oForm.elements[i].tabIndex==oObj.tabIndex+1)
						{
							oFocus=oForm.elements[i];
							break;
						}

				if(!oFocus)
					for(i=0;i<oForm.elements.length;i++)
						if(oForm.elements[i].name==oObj.name)
						{
							i++;
							oFocus=oForm.elements[i];
							break;
						}
				}
			if(oFocus) oFocus.focus();
			return false;
		} catch(e) {}
	}
}

function _zwColorPreview()
{
	var oPreview;

	if(_zwContext.object && _zwContext.object.id=='_zwcoloreditor')
	{
		oPreview=document.getElementById(_zwContext.parent.id+'_preview');

		if(oPreview)
		try
		{
			oPreview.style.backgroundColor='#'+_zwContext.parent.value;
		} catch(e) {}
	}
}

function _zwSetColor(sColor)
{
	if(_zwContext.object && _zwContext.object.id=='_zwcoloreditor')
	{
		_zwContext.parent.value=sColor;
		_zwColorPreview();
		_zwContext.hide();
	}

}

function _zwColorDrop(oObj)
{
	var oDrop;
	var oParent;
	var difX=0, difY=0;
	var oRp, oRo;

	if(oObj)
	{
		oParent=oObj;
		while(oParent && oParent.className!='coloreditor')
		{
			if(window.event)
			{
				oParent=oParent.parentElement;
			} else {
				oParent=oParent.parentNode;
			}
		}

		if(oParent)
		{
			oRp=_getObjRectangle(oParent);
			oRo=_getObjRectangle(oObj);
			difX=oRp.left-oRo.left;
			difY=oRp.height;
		}

		oDrop=document.getElementById('_zwcoloreditor');
		_zwContext.show(oDrop, oObj, difX, difY);
	}
}

function _zwColorDropSel()
{
	var oPrv;

	if(_zwContext.object && _zwContext.object.id=='_zwcoloreditor')
	{
		oPrv=document.getElementById('_zwcoloreditor_dropinfo');
		_zwSetColor(oPrv.innerHTML);
	}
}

function _zwColorShowEditor(sId)
{
	var oInfo=document.getElementById('_zwcoloreditor_dropinfo');
	var oPrv=document.getElementById('_zwcoloreditor_dropprv');
	var oObj=document.getElementById(sId);

	try
	{
		if(oPrv) oPrv.style.backgroundColor='#'+oObj.value;
		if(oInfo) oInfo.innerHTML=oObj.value;//+', '+x+' x '+y;
	} catch(e) {}

	_zwColorDrop(oObj);
}

function _zwColorGetFromHBS(h, b, s, oh)
{
	var c={r:0, g:0, b:0};
	var oImg=document.getElementById('_zwcoloreditor_hueimg');
	var ih=oImg.height-1;
	var zw=(ih+1)/6;
	var dz=0, sc=0;
	var tr=0, tg=0, tb=0;
	var rb, rs;
	var vu, vd;
	var vs, vb;

	dz=h%zw; sc=(h-dz)/zw;

	vu=parseInt(dz*255/zw);
	vd=255-vu;

	rb=100-(b*100/ih);
	rs=100-(s*100/ih);

	switch(sc)
	{
		case 0:
			c.r=255; c.g=0; c.b=vu;
			break;
		case 1:
			c.r=vd; c.g=0; c.b=255;
			break;
		case 2:
			c.r=0; c.g=vu; c.b=255;
			break;
		case 3:
			c.r=0; c.g=255; c.b=vd;
			break;
		case 4:
			c.r=vu; c.g=255; c.b=0;
			break;
		case 5:
			c.r=255; c.g=vd; c.b=0;
			break;
	}

	if(!oh)
	{
		vs=(255-c.r)*rs/100;
		c.r+=vs;
		vb=(255-c.r)*b/100;
		c.r=c.r*rb/100;

		vs=(255-c.g)*rs/100;
		c.g+=vs;
		vb=(255-c.g)*b/100;
		c.g=c.g*rb/100;

		vs=(255-c.b)*rs/100;
		c.b+=vs;
		vb=(255-c.b)*rb/100;
		c.b=c.b*rb/100;
	}

	return c;
}

function _zwColorSetHue(value)
{
	var oHueSel=document.getElementById('_zwcoloreditor_huesel');
	var oBg=document.getElementById('_zwcoloreditor_base');
	var tc;
	var c;

	c=_zwColorGetFromHBS(value, 0, 0, true);

	tc=hex(c.r)+hex(c.g)+hex(c.b);
	//alert(tc);
	try {
		if(oBg) oBg.style.backgroundColor='#'+tc;
	} catch(e) {}
	//if(oHueSel) oHueSel.style.top=y-3;
}

function _zwColorMoveHBS(oEvt, oImg)
{
	var oHue;
	var h=0, s=0, b=0;
	var tc, c;

	if(_zwContext.object && _zwContext.object.id=='_zwcoloreditor')
	{
		oInfo=document.getElementById('_zwcoloreditor_dropinfo');
		oHue=document.getElementById('_zwcoloreditor_huesel');

		oEvt=(oEvt?oEvt:window.event);

		if(window.event)
		{
			s=oEvt.offsetX;
			b=oEvt.offsetY;
		} else {
			s=oEvt.layerX-7;
			b=oEvt.layerY-7;
		}

		h=parseInt(oHue.style.top)+3;

		c=_zwColorGetFromHBS(h, b, s, false);

		//oInfo.innerHTML='r: '+c.r+', g: '+c.g+', b:'+c.b;

		tc=hex(c.r)+hex(c.g)+hex(c.b);
		_zwColorSetPreview(tc)
	}
}

function _zwColorSetPreview(s)
{
	i=document.getElementById('_zwcoloreditor_dropinfo');
	p=document.getElementById('_zwcoloreditor_dropprv');
	try {	if(p) p.style.backgroundColor='#'+s; } catch(e) {}
	try { if(i) i.innerHTML=s; } catch(e) {}
}

function _zwColorMove(oEvt, oImg)
{
	var x, y;
	var ih=oImg.width-1;
	var zw=(ih+1)/6;
	var dz=0, sc=0;
	var tr=0, tg=0, tb=0;
	var vu, vd, vi;
	var dyu, dyd;
	var tc;

	if(_zwContext.object && _zwContext.object.id=='_zwcoloreditor')
	{
		oEvt=(oEvt?oEvt:window.event);

		if(window.event)
		{
			x=oEvt.offsetX;
			y=oEvt.offsetY;
		} else {
			x=oEvt.layerX-5;
			y=oEvt.layerY-5;
		}

		dz=x%zw; sc=(x-dz)/zw;

		vu=parseInt(dz*255/zw);
		vd=255-vu; dyu=vd; dyd=vu;

		vu=vu+parseInt(y*dyu/ih);
		vd=vd+parseInt(y*dyd/ih);
		vi=parseInt(y*255/ih)

		switch(sc)
		{
			case 0:
				tr=255; tg=vu; tb=vi;
				break;
			case 1:
				tr=vd; tg=255; tb=vi;
				break;
			case 2:
				tr=vi; tg=255; tb=vu;
				break;
			case 3:
				tr=vi; tg=vd; tb=255;
				break;
			case 4:
				tr=vu; tg=vi; tb=255;
				break;
			case 5:
				tr=255; tg=vi; tb=vd;
				break;
		}
		tc=hex(tr)+hex(tg)+hex(tb);
		_zwColorSetPreview(tc);
	}
}

var _zwContext=new _zwContextMenu();
