function _zwContextMenu()
{
	this.object=false;
	this.parent=false;
	this.x=0;
	this.y=0;
}

_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)
		{
			oRect=_getObjectPagePos(this.parent);
			this.x=oRect.x;
			this.y=oRect.y;
		}

		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 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);
			break;
		case 2: //FIELDEDITINTEGER
			bValidated=_zwFormValidateInteger(oField, bRequired);
			break;
		case 3: //FIELDEDITDECIMAL						
			bValidated=_zwFormValidateDecimal(oField, bRequired);
			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);
			break;
		case 11: //FIELDEDITMAIL
			bValidated=_zwFormValidateMail(oField, bRequired);
			break;
		case 14: //FIELDEDITCOLOR
			bValidated=_zwFormValidateColor(oField, bRequired);
			break;
		case 13: //FIELDHIDDEN
		case 99: //FIELDEDITNONE
		default:
			bValidated=true;
			break;
	}
		
	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));
		}
	} else {
		bReturn=true;
	}

	return bReturn;
}

function _zwFormValidateColor(oField, bRequired)
{
	return (bRequired || oField.value.length>0?/^#?([\dabcdef]{2}){3}$/i.test(oField.value):true);	
}


function _zwNumberKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	_zwFocusNext(oEvt);
	if(oEvt.keyCode<48 || oEvt.keyCode>57)
		oEvt.keyCode=0;
}

function _zwDecimalKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	_zwFocusNext(oEvt);
	
	if(oEvt.keyCode==44 || oEvt.keyCode==46)
	{
		oEvt.keyCode=46;
	} else if(oEvt.keyCode<48 || oEvt.keyCode>57) {
		oEvt.keyCode=0;
	}
}

function _zwColorKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	_zwFocusNext(oEvt);

	if(oEvt.keyCode>=97 && oEvt.keyCode<=102)
		oEvt.keyCode-=32;	

	if((oEvt.keyCode<65 || oEvt.keyCode>70) && (oEvt.keyCode<48 || oEvt.keyCode>57))
	{
		oEvt.keyCode=0;
	}	
}

function _zwDateKeyPress(oEvt)
{
	oEvt=(oEvt?oEvt:window.event);
	_zwFocusNext(oEvt);
	
	if(oEvt.keyCode>=44 && oEvt.keyCode<=47)
	{
		oEvt.keyCode=47;
	} else if(oEvt.keyCode<48 || oEvt.keyCode>57) {
		oEvt.keyCode=0;
	}
}

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))
	{
		oEvt.keyCode=0;
	}
}

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
		{
			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();
		} 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);
	if(oBg) oBg.style.backgroundColor='#'+tc;
	//if(oHueSel) oHueSel.style.top=y-3;
}

function _zwColorMoveHBS(oEvt, oImg)
{
	var oInfo, oPrv, oHue;
	var h=0, s=0, b=0;
	var tc, c;
	
	if(_zwContext.object && _zwContext.object.id=='_zwcoloreditor')
	{
		oInfo=document.getElementById('_zwcoloreditor_dropinfo');
		oPrv=document.getElementById('_zwcoloreditor_dropprv');
		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);
		if(oPrv) oPrv.style.backgroundColor='#'+tc;
		if(oInfo) oInfo.innerHTML=tc;//+', '+x+' x '+y;

	}
}

function _zwColorMove(oEvt, oImg)
{
	var oInfo, oPrv;
	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')
	{
		oInfo=document.getElementById('_zwcoloreditor_dropinfo');
		oPrv=document.getElementById('_zwcoloreditor_dropprv');

		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);
	
		if(oPrv) oPrv.style.backgroundColor='#'+tc;
		if(oInfo) oInfo.innerHTML=tc;//+', '+x+' x '+y;
	}	
}

var _zwContext=new _zwContextMenu();
