VateraUtils='';
VateraUtils=Class.create();

if(
	typeof Prototype=='undefined' ||
	typeof Scriptaculous=='undefined'
){
	// error message?
}
else{
	// globals
	VateraFormIsValid=false;
	VateraValidatorsContainer=new Array();
	VateraValidatorID=0;
	ValidatorFocused=false;
	ValidatorFocusOnError=false;
	ControlsAreInitiated=0;
	ImagePreviewContainer=new Array();
	CalendarScriptIncluded=0;

	// create vatera base class

	VateraUtils.getElementsByClassName=function(param){
		var retnode=new Array();
		var regular_expression=new RegExp('\\b'+param+'\\b');
		var elements=document.getElementsByTagName('*');
		for (i=0;i<elements.length;i++)
		{
			var classes=elements[i].className;
			if (regular_expression.test(classes)) retnode.push(elements[i]);
		}
		return retnode;
	};

	VateraUtils.setCookie=function(CookieName,Value,ExpireDays){
		var ckh=document.cookie;
		var today = new Date();
		if(! ExpireDays ){
				ExpireDays = 28 * 24 * 60 * 60 * 1000;
		}
		var expirydate = new Date(today.getTime() + ExpireDays);

		if (Value != null && Value != ""){
				document.cookie=CookieName + "=" + escape(Value) + "; path=/ ;expires=" + expirydate.toGMTString();
		}
		ckh = document.cookie;
	};

	VateraUtils.getCookie=function(CookieName){
		if (document.cookie.length>0){
			c_start=document.cookie.indexOf(CookieName + "=");
			if (c_start!=-1){
				c_start=c_start + CookieName.length+1;
				c_end=document.cookie.indexOf(";",c_start);
				if (c_end==-1) c_end=document.cookie.length;
					return unescape(document.cookie.substring(c_start,c_end));
			}
		}
		return "";
	};

	VateraUtils.Effects={
		ShowElement:function(param){
			$(param).setStyle({display:''});
		},
		HideElement:function(param){
			$(param).setStyle({display:'none'});
		},
		ShowElementWithBlindEffect:function(param){
			Effect.BlindDown($(param),{duration:.7});
		},
		HideElementWithBlindEffect:function(param){
			Effect.BlindUp($(param),{duration:.7});
		},
		ShowAndHideByObject:function(object){
			if(object.getStyle('display')=='none'){
				object.style.display='';
			}
			else{
				object.hide();
			}
		},
		ShowAndHideById:function(param){
			if($(param).getStyle('display')=='none'){
				this.ShowElement(param);
			}
			else{
				this.HideElement(param);
			}
		},
		ShowAndHideByIdWithBlindEffect:function(param){
			if($(param).getStyle('display')=='none'){
				this.ShowElementWithBlindEffect(param);
			}
			else{
				this.HideElementWithBlindEffect(param);
			}
		},
		HideElementsByClassName:function(param){
			items=VateraUtils.getElementsByClassName(param);
			items.each(function(item){item.hide();});
		},
		ShowElementsByClassName:function(param){
			items=VateraUtils.getElementsByClassName(param);
			items.each(function(item){VateraUtils.Effects.ShowElement(item.id);}
			);
		},
		ShowAndHideElementsByClassName:function(param){
			items=VateraUtils.getElementsByClassName(param);
			classAnyElementsIsVisible=false;
			for(var i=0;i<items.length;i++){
				if(items[i].style.display==''){
					classAnyElementsIsVisible=true;
				}
			}
			if(classAnyElementsIsVisible==true){
				this.HideElementsByClassName(param);
			}
			else{
				this.ShowElementsByClassName(param);
			}
		},
		ImagePreview:function(TargetID,Url){
			var Image=document.createElement('img');
			Image.src=Url;
			Image.style.border='1px solid gray';
			Image.style.padding='2px';
			Image.style.background='white';

			var div=VateraUtils.Tooltip.getContainerDiv(TargetID);
			div.appendChild(Image);
			if($(TargetID).parentNode.id==""){
				$(TargetID).parentNode.id=TargetID+"-preview-parent";
			}
			$(TargetID).parentNode.appendChild(div);

			ImagePreviewContainer[TargetID]=new Tooltip(TargetID,div.id);
		}
	};
	VateraUtils.Tooltip={
		add:function(TargetID,Text){
			var div=VateraUtils.Tooltip.getContainerDiv(TargetID);
			div.innerHTML=Text;
			$(TargetID).parentNode.appendChild(div);
			new Tooltip(TargetID,div.id);
		},
		addToContainer:function(TargetID,Text,ContainerID){
			var div=VateraUtils.Tooltip.getContainerDiv(TargetID);
			div.innerHTML=Text;
			div.className='tooltip-container';
			$(ContainerID).appendChild(div);
			new Tooltip(TargetID,div.id);
		},
		getContainerDiv:function(TargetID){
			var div=document.createElement('div');
			div.style.display='none';
			div.style.zIndex=10000000000;
			div.id=TargetID+'preview-container';
			return div;
		}
	};
	VateraUtils.Ajax={
		CallBack:function(FunctionName,ParamsFromUser,JSFunction,ParamsForCallback){
			Params=new Array();
			Params['ParamsFromUser']=ParamsFromUser;
			Params['VateraAjaxRequest']='Call';
			Params['Function']=FunctionName;
			var url = window.location.toString();
			var anchor_index = url.indexOf('#');
			if (anchor_index != -1) {
				url = url.substring(0, anchor_index);
			}
			new Ajax.Request(
				url,
				{
					method:'post',
					parameters:Params,
					onLoading:function(request){
						// loading screen?
					},
					onSuccess:function(request){
						JSFunction(request.responseText,ParamsForCallback);
					},
					onComplete:function(request){
						// loading screen?
					}
				}
			)
		}
	};
	VateraUtils.TabPanel={
		Reset:function(PanelClassName){
			items=VateraUtils.getElementsByClassName(PanelClassName);
			for(var i=0;i<items.length;i++){
				VateraUtils.Effects.HideElement(items[i].id);
			}
		},
		ShowById:function(PanelClassName,ActivePanelId){
			this.Reset(PanelClassName);
			VateraUtils.Effects.ShowElement(ActivePanelId);
		}
	};

	VateraUtils.addCalendarForInput=function(InputID,Type,Fix){
		if(Fix==undefined){
			Fix=true;
		}
		if(CalendarScriptIncluded==0){
			var CalendarScript=document.createElement('script');
			CalendarScript.src=ImageUrl+'js/datepicker/datepicker.js';
			var CalendarCss=document.createElement('link');
			CalendarCss.href=ImageUrl+'css/datepicker.css';
			CalendarCss.media='screen';
			CalendarCss.type='text/css';
			CalendarCss.rel='stylesheet';
			var head=document.getElementsByTagName('head');
			head[0].appendChild(CalendarScript);
			head[0].appendChild(CalendarCss);
		}

		if(Fix){
			$(InputID).size=10;
			$(InputID).setAttribute('maxlength',10);
		}

		switch(Type){
			case 'Button':
				var CalendarButton=document.createElement('input');
				CalendarButton.type='button';
				CalendarButton.onclick=function(){displayDatePicker(InputID);};
				CalendarButton.value=Translation_calendar['calendar'];
				$(InputID).parentNode.insertBefore(CalendarButton,$(InputID).nextSibling);
				break;
			case 'Hover':
				Event.observe(InputID,'mouseover',function(e){displayDatePicker(InputID);});
				break;
			default:
				Event.observe(InputID,'click',function(e){displayDatePicker(InputID);});
		}
	};

	VateraUtils.Validator={
		AddButton:function(ButtonID,FormName,GroupName,EventName,ConfirmText,FocusOnError){
			Event.observe(ButtonID,'click',
				function(event){
					if(ConfirmText!='' && ConfirmText!=undefined){
						if(!confirm(ConfirmText)){
							Event.stop(event);
							return false;
						}
					}
					if(!VateraUtils.Validator.FormIsValid(GroupName,FocusOnError)){
						Event.stop(event);
						return false;
					}
				}
			);
		},
		FormIsValid:function(GroupName,FocusOnError){
			VateraFormValidateIsStarted=true;
			ValidatorGroupName=GroupName;
			if(FocusOnError!=undefined && FocusOnError!=''){
				ValidatorFocusOnError=FocusOnError;
			}
			return this.Validate(GroupName);
		},
		getID:function(){
			return ++VateraValidatorID;
		},
		focusToObject:function(ObjectID){
			if(!ValidatorFocused && ValidatorFocusOnError){
				$(ObjectID).focus();
				ValidatorFocused=true;
			}
		},
		Validate:function(GroupName){
			this.addEventsForControl();
			VateraFormIsValid=true;
			if(VateraFormValidateIsStarted){
				VateraValidatorsContainer.each(
					function(item){
						/*
							item[0] value
							item[1] validator type
							item[2] validator ID
							item[3] if typeof=regexp -> regexp, if typeof=custom -> custom function name, if typeof (minimum or maximum) -> min/max value,	if typeof= between -> min value, else validator groupname
							item[4] if typeof= between -> max value, else validator groupname
							item[5] GroupName
						*/
						$('vatera-validator-'+item[0]+item[2]).hide();
						switch(item[1]){
							case 'RequiredField':
								if($(item[0]).tagName=='INPUT'){
									if($(item[0]).type=='text' || $(item[0]).type=='password'){
										if($F(item[0])=='' || $F(item[0])==null){
											if(item[3]=='' || item[3]==GroupName){
												$('vatera-validator-'+item[0]+item[2]).show();
												VateraUtils.Validator.focusToObject(item[0]);
												VateraFormIsValid=false;
											}
										}
									}
									else if($(item[0]).type=='checkbox'){
										if(!$(item[0]).checked){
											if(item[3]=='' || item[3]==GroupName){
												$('vatera-validator-'+item[0]+item[2]).show();
												VateraUtils.Validator.focusToObject(item[0]);
												VateraFormIsValid=false;
											}
										}
									}
								}
								else if($(item[0]).tagName=='SELECT'){
									if($(item[0]).options[$(item[0]).selectedIndex].value<0){
										$('vatera-validator-'+item[0]+item[2]).show();
										VateraUtils.Validator.focusToObject(item[0]);
										VateraFormIsValid=false;
									}
								}
								break;
							case 'Custom':
								if(!item[3]()){
									if(item[4]=='' || item[4]==GroupName){
										$('vatera-validator-'+item[0]+item[2]).show();
										VateraUtils.Validator.focusToObject(item[0]);
										VateraFormIsValid=false;
									}
								}
								break;
							case 'Regexp':
								if(!$F(item[0]).match(item[3])){
									if(item[4]=='' || item[4]==GroupName){
										$('vatera-validator-'+item[0]+item[2]).show();
										VateraUtils.Validator.focusToObject(item[0]);
										VateraFormIsValid=false;
									}
								}
								break;
							case 'Compare':
								if($F(item[0])!=$F(item[3])){
									$('vatera-validator-'+item[0]+item[2]).show();
									VateraUtils.Validator.focusToObject(item[0]);
									VateraFormIsValid=false;
								}
								break;
							case 'MinimumLength':
								if($F(item[0]).length<item[3]){
									$('vatera-validator-'+item[0]+item[2]).show();
									VateraUtils.Validator.focusToObject(item[0]);
									VateraFormIsValid=false;
								}
								break;
							case 'Minimum':
								if(parseInt($F(item[0]))<item[3]){
									$('vatera-validator-'+item[0]+item[2]).show();
									VateraUtils.Validator.focusToObject(item[0]);
									VateraFormIsValid=false;
								}
								break;
							case 'Maximum':
								if(parseInt($F(item[0]))>item[3]){
									$('vatera-validator-'+item[0]+item[2]).show();
									VateraUtils.Validator.focusToObject(item[0]);
									VateraFormIsValid=false;
								}
								break;
							case 'Between':
								if($F(item[0])<item[3] || $F(item[0])>item[4]){
									$('vatera-validator-'+item[0]+item[2]).show();
									VateraUtils.Validator.focusToObject(item[0]);
									VateraFormIsValid=false;
								}
								break;
						}
					}
				);
			}
			return VateraFormIsValid;
		},
		RequiredField:function(ControlToValidate,ErrorMessage,DisplayStyle,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'RequiredField',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),GroupName));
		},
		Custom:function(ControlToValidate,ErrorMessage,ValidaterFunction,DisplayStyle,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'Custom',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),ValidaterFunction,GroupName));
		},
		DataType:function(ControlToValidate,DataType){
			switch(DataType){
				case 'Integer':
					var ValidationKeyCodesArray=new Array(8,9,35,36,37,39,46,48,49,50,51,52,53,54,55,56,57,96,97,98,99,100,101,102,103,104,105,144,17,86);
					Event.observe(ControlToValidate,'keydown',function(e){k=e.which>0?e.which:e.keyCode;if(ValidationKeyCodesArray.indexOf(k)==-1){Event.stop(e)}});
					break;
			}
		},
		Regexp:function(ControlToValidate,ErrorMessage,DisplayStyle,Regexp,GroupName){
			Regexp=new RegExp(Regexp);
			VateraValidatorsContainer.push(new Array(ControlToValidate,'Regexp',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),Regexp,GroupName));
		},
		Compare:function(ControlToValidate,ErrorMessage,DisplayStyle,ControlToCompare,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'Compare',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),ControlToCompare,GroupName));
		},
		MinimumLength:function(ControlToValidate,ErrorMessage,DisplayStyle,MinimumLength,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'MinimumLength',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),MinimumLength,GroupName));
		},
		Minimum:function(ControlToValidate,ErrorMessage,DisplayStyle,Minimum,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'Minimum',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),Minimum,GroupName));
		},
		Maximum:function(ControlToValidate,ErrorMessage,DisplayStyle,Maximum,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'Maximum',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),Maximum,GroupName));
		},
		Between:function(ControlToValidate,ErrorMessage,DisplayStyle,Minimum,Maximum,GroupName){
			VateraValidatorsContainer.push(new Array(ControlToValidate,'Between',this.initControlToValidate(ControlToValidate,ErrorMessage,DisplayStyle),Minimum,Maximum,GroupName));
		},
		initControlToValidate:function(ControlToValidate,ErrorMessage,DisplayStyle){
			var ValidatorID=this.getID();
			this.CreateErrorMessageContainer(ControlToValidate+ValidatorID,ErrorMessage,DisplayStyle);
			return ValidatorID;
		},
		addEventsForControl:function(){
			if(ControlsAreInitiated!=1){
				var inputs=document.getElementsByTagName('input');
				for(var i=0;i<inputs.length;i++){
					Event.observe(inputs[i],'blur',function(e){VateraUtils.Validator.Validate(ValidatorGroupName);});
					if(inputs[i].type=='checkbox'){
						Event.observe(inputs[i],'click',function(e){VateraUtils.Validator.Validate(ValidatorGroupName);});
					}
				}
				var selects=document.getElementsByTagName('select');
				for(var i=0;i<selects.length;i++){
					Event.observe(selects[i],'change',function(e){VateraUtils.Validator.Validate(ValidatorGroupName);});
				}
			}
			ControlsAreInitiated=1;
		},
		CreateErrorMessageContainer:function(ValidatorID,Message,DisplayStyle){
			switch(DisplayStyle){
				case 'Dynamic':
					CssClass='color-red block';
					break;
				case 'Fixed':
				default:
					CssClass='color-red';
					break;
			}
			document.write('<span id="vatera-validator-'+ValidatorID+'" class="'+CssClass+'" style="display:none;">'+Message+'</span>');
		}
	}
}
