function _zwContextMenu()
{
	this.object=false;
	this.parent=false;
	this.x=0;
	this.y=0;
	this.shadow=false;
}

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, oRo;

		if(this.object) this.hide();

		if(this.shadow==false)
		{
			this.shadow=document.createElement('DIV');
			this.shadow.className='cmspopupmenush';
			document.body.insertBefore(this.shadow, document.body.childNodes[0]);
		}

		if(object.parentNode!=document.body)
		{
			object.parentNode.removeChild(object);
			object.style.position='absolute';
			document.body.insertBefore(object, this.shadow);
		}

		this.object=object;
		this.parent=parent;

		if(this.parent)
		{
			if(this.parent!=document)
			{
				oRo=_getObjectSize(parent);
				oRect=_getObjectPagePos(this.parent);
				this.x=oRect.x;
				this.y=oRect.y+oRo.height;
			} else {
				this.x=0;
				this.y=0;
			}
		}

		this.x+=x;
		this.y+=y;

		object.style.left=this.x+'px';
		object.style.top=this.y+'px';

		object.style.display='block';

		oRo=_getObjectSize(object);
		this.shadow.style.left=(this.x+3)+'px';
		this.shadow.style.top=(this.y+3)+'px';
		this.shadow.style.width=oRo.width+'px';
		this.shadow.style.height=oRo.height+'px';
		this.shadow.style.display='block';

		_addEventHandler(document.body, 'onmousedown', this.eventHandler);
		_addEventHandler(document.body, 'onkeydown', this.eventHandler);
		_addEventHandler(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';
			this.shadow.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(t, s, r)
{
	var b=false;
	var c=false;
	var e,f;

	if(t==8)
	{
		if(s)
		{
			e=(s.length>0?document.getElementById(s[0].name+'_error'):false);
			f=s;
		} else {
			s=true;
		}
	} else {
		e=document.getElementById(s+'_error');
		f=document.getElementById(s);
	}
	if(!f) return true;

	switch(t)
	{
		case 0: //FIELDEDITDEFAULT
		case 1: //FIELDEDITTEXT
		case 12: //FIELDEDITPASS
		case 15: //FIELDEDITTEXTAREA
			b=_zwFormValidateText(f, r);
			c=true;
			break;
		case 2: //FIELDEDITINTEGER
			b=_zwFormValidateInteger(f, r);
			c=true;
			break;
		case 3: //FIELDEDITDECIMAL
			b=_zwFormValidateDecimal(f, r);
			c=true;
			break;
		case 4: //FIELDEDITBOOLEAN
			b=_zwFormValidateCheck(f, r);
			break;
		case 5: //FIELDEDITDATE
			b=_zwFormValidateDate(f, r);
			break;
		case 6: //FIELDEDITWYSWYG
			b=_zwFormValidateWYSWYG(f, r);
			break;
		case 7: //FIELDEDITIMAGE
			b=_zwFormValidateImage(f, r);
			break;
		case 8: //FIELDEDITOPTIONS
			b=_zwFormValidateOptions(f, r);
			break;
		case 9: //FIELDEDITCOMBO
		case 20: //FIELDEDITCOUNTRY
			b=_zwFormValidateSelect(f, r);
			break;
		case 10: //FIELDEDITURL
			b=_zwFormValidateWeb(f, r);
			c=true;
			break;
		case 11: //FIELDEDITMAIL
			b=_zwFormValidateMail(f, r);
			c=true;
			break;
		case 14: //FIELDEDITCOLOR
			b=_zwFormValidateColor(f, r);
			break;
		case 16: //FIELDHIDDEN
		case 99: //FIELDEDITNONE
		default:
			b=true;
			break;
	}

	if(c) if(f.className.indexOf('emptyvalue')>-1) b=false;
	if(e) e.style.display=(b?'none':'');

	return b;
}

function _zwFormValidateCheck(f, r)
{
	return (r?f.checked:true);
}

function _zwFormValidateText(f, r)
{
	return(r && f.value.length==0?false:true);
}

function _zwFormValidateMail(f, r)
{
	return (r || f.value.length>0?_isMail(f.value):true);
}

function _zwFormValidateWeb(f, r)
{
	return (r || f.value.length>0?_isWeb(f.value):true);
}

function _zwFormValidateInteger(f, r)
{
	return (r || f.value.length>0?/^[-|+]?\d+$/.test(f.value):true);
}

function _zwFormValidateDecimal(f, r)
{
	var oReg=/^(([+|-]?\d+(\.\d*)?)|([+|-]?(\d*\.)?\d+))$/;
	return (r || f.value.length>0?oReg.test(f.value):true);
}

function _zwFormValidateDate(f, r)
{
	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 (r || f.value.length>0?oReg.test(f.value):true);
}

function _zwFormValidateImage(f, r)
{
	return (f.value==0 || f.value.length==0?false:true);
}

function _zwFormValidateWYSWYG(f, r)
{
	return true;
}

function _zwFormValidateOptions(o, r)
{
	var i;
	var b=false;

	if(r)
	{
		for(i=0;i<o.length;i++)
			if(o[i].checked)
			{
				b=true;
				break;
			}
	} else {
		b=true;
	}

	return b;
}

function _zwFormValidateSelect(f, r)
{
	var bReturn=false;
	var oOption;

	if(r)
	{
		if(f.selectedIndex>-1)
		{
			oOption=f.options[f.selectedIndex];
			bReturn=!(/\btextdes\b/i.test(oOption.className));
			if(bReturn) bReturn=(oOption.value.length==0 && f.selectedIndex==0?false:true);
		}
	} else {
		bReturn=true;
	}

	return bReturn;
}

function _zwFormValidateColor(f, r)
{
	return (r || f.value.length>0?/^#?([\dabcdef]{2}){3}$/i.test(f.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(e)
{
	e=(e?e:window.event);
	s=(window.event?e.keyCode:e.charCode);
	_zwFocusNext(e);

	if((s<48 || s>57) && s!=0)
	{
		if(window.event)
		{
			e.keyCode=0;
			return false;
		} else {
			return (s>0?false:true);
		}
	}
}

function _zwDecimalKeyPress(e)
{
	e=(e?e:window.event);
	var s=(window.event?e.keyCode:e.charCode);
	_zwFocusNext(e);

	if(s==46 || (s==44 && window.event))
	{
		if(window.event) s=46;
	} else if(s<48 || s>57) {
		if(window.event)
		{
			e.keyCode=0;
			return false;
		} else {
			return (s>0?false:true);
		}
	}
}

function _zwColorKeyPress(e)
{
	e=(e?e:window.event);
	s=(window.event?e.keyCode:e.charCode);
	_zwFocusNext(e);

	if(s>=97 && s<=102) if(window.event) s-=32; else return true;
	if((s<65 || s>70) && (s<48 || s>57))
	{
		if(window.event)
		{
			e.keyCode=0;
			return false;
		} else {
			return (s>0?false:true);
		}
	}
}

function _zwDateKeyPress(e, f)
{
	e=(e?e:window.event);
	s=(window.event?e.keyCode:e.charCode);
	f=(f?f:false);
	_zwFocusNext(e);

	if((s>=44 && s<=47 && window.event) || s==47 || (f && s==58))
	{
		if(window.event && s!=58) e.keyCode=47;
	} else if((s<48 || s>57)) {
		if(window.event)
		{
			e.keyCode=0;
			return false;
		} else {
			return (s>0?false:true);
		}
	}
}

function _zwMailKeyPress(e)
{
	e=(e?e:window.event);
	var s=(window.event?e.keyCode:e.charCode);
	_zwFocusNext(e);

	if(s>=65 && s<=90)
		s+=32;

	if(s!=46 && s!=95 && s!=45 && s!=64 && (s<97 || s>122) && (s<48 || s>57))
	{
		if(window.event)
		{
			e.keyCode=0;
			return false;
		} else {
			return (s>0?false:true);
		}
	}
}

function _zwLower(e)
{
	e=(e?e:window.event);
	var o=(e.srcElement)?e.srcElement:e.target;
	o.value=o.value.toLowerCase();
}

function _zwUpper(oEvt)
{
	e=(e?e:window.event);
	var o=(e.srcElement)?e.srcElement:e.target;
	o.value=o.value.toUpperCase();
}

function _zwUpperFirst(e)
{
	var e=(e?e:window.event);
	var o=(e.srcElement)?e.srcElement:e.target;

	var s=o.value.toLowerCase().split('');
	var c='', a=' ', r='', b=false, i;

	for(i=0;i<s.length;i++)
	{
		b=/[^a-z0-9áéíóúàèìòùçñäëïöü]/.test(a);
		c=s[i];
		if(a==' ' && a==c) c='';
		r+=(b?c.toUpperCase():c);
		a=s[i];
	}
	o.value=r;
}

function _zwFocusNext(e)
{
	_zwDoFocus(e, true, false);
}

function _zwFocusPrev(e)
{
	_zwDoFocus(e, false, false);
}

function _zwDoFocus(e, b, c)
{
	var e=(window.event?window.event:e);
	var o=(e.srcElement?e.srcElement:e.target);
	var f, d, i, n=false, p, s=0;

	if(e.keyCode==13) n=true;
	if(c)
	{
		if(o.tagName=='INPUT' && o.type=='text')
		{
			p=_zwGetSelectionStart(o);
			if(((e.keyCode==39 && p==o.value.length)||(e.keyCode==40)) && b) { n=true; s=1; }
			if(((e.keyCode==37 && p==0)||(e.keyCode==38)) && !b) { n=true; s=2 }

		} else {
			if(e.keyCode==39 && b) n=true;
			if(e.keyCode==37 && !b) n=true;
		}
	}

	if(n)
	{
		try
		{
			if(window.event) e.keyCode=0;
			f=o.form;
			if(f)
			{
				if(o.tabIndex>0)
					for(i=0;i<f.elements.length;i++)
						if(f.elements[i].tabIndex==o.tabIndex+(b?1:-1))
						{
							d=f.elements[i];
							break;
						}

				if(!d)
					for(i=0;i<f.elements.length;i++)
						if(f.elements[i].name==o.name)
						{
							if(b) i++; else i--;
							d=f.elements[i];
							break;
						}
			}
			if(d)
			{
				d.focus();
				switch(s)
				{
					case 1:
						_zwSetSelectionRange(d, 0, 0);
						_stopEventPropagation(e, true);
						break;
					case 2:
						_zwSetSelectionRange(d, d.value.length, d.value.length);
						_stopEventPropagation(e, true);
						break;
				}
			}
			return false;
		} catch(er) {}
	}
}

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!='cmscoloreditor')
		{
			oParent=oParent.parentNode;
			/*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);
	}
}

function _zwSetFlag(d, id)
{
	var o=document.getElementById(id);
	if(d.value!='')
	{
		o.style.backgroundImage='url(\'image.php?zwflag='+d.value+'\')';
		o.title=d.options[d.selectedIndex].text;
	} else {
		o.style.backgroundImage='none';
		o.title='';
	}
}

function _zwDateValidate(o)
{
	var d, m, y;
	var s=o.value;

	s.replace(/[-\\]/g, '/');
	if(s.match(/[0-9]{6,8}/))
	{
		if(s.length==6)
		{
			d=s.substr(0,2);
			m=s.substr(2,2);
			y=parseInt(s.substr(4), 10);
			y+=(y<25?2000:1900);
			o.value=d+'/'+m+'/'+y;
		} else if(s.length==8) {
			d=s.substr(0,2);
			m=s.substr(2,2);
			y=s.substr(4);
			o.value=d+'/'+m+'/'+y;
		}
	} else if(s.length==8 && s.match(/[0-9]{2}\/[0-9]{2}\/[0-9]{2}/)) {
			d=s.substr(0,2);
			m=s.substr(3,2);
			y=parseInt(s.substr(6), 10);
			y+=(y<25?2000:1900);
			o.value=d+'/'+m+'/'+y;
	}
}

function _zwDateYears(o)
{
	var a='', b=true, l=document.getElementById(o.id+'_years');
	var d, m, y, p, n, t, c;

	_zwDateValidate(o);
	if(o.value=='') b=false;

	if(b)
	{
		p=o.value.split('/');
		if(p.length<3) b=false;
	}

	if(b)
	{
		d=p[0];m=p[1];y=p[2];
		if(isNaN(d) || isNaN(m) || isNaN(y)) b=false;
	}

	if(b)
	{
		t=new Date();
		n=new Date(y, m-1, d);
		c=t.getFullYear()-n.getFullYear();
		if(c>0)
		{
			if((n.getMonth()>t.getMonth()) || (n.getMonth()==t.getMonth() && n.getDate()>t.getDate()))
				c--;
			a=c;
		}
	}

	if(l) l.value=a;
}

var _zwContext=new _zwContextMenu();