	var i;
	var c;
	var k;
	
	var word;
	var sign;
	var kword;
	
	var month, day, year;
	
	var len;
	var type;
	var name;
	var a;
	
	var number;
	var hold;
	
	var relv;
	var day;
	var month;
	var year;
	var k = 0;
	var monthe;
	var montha;


function validateDate(elName){
	var back;
	i = 0;
	c = 0;
	k = 0;	
	number = '';
	hold = '';
	relv = /^[a-zA-ZúřčíÚŘČÍ]*$/;
	k = 0;
	monthe = new Array("leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	montha = new Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12");
	
	element = window.document.getElementsByName(elName);
	if(element[0]==undefined){
		return true;			
		}	
	word=element[0].type;
	if(element[0].type=='radio'){
		for(i=0;i<element.length;i++){
			if(element[i].checked==true){
				word=element[i].value;
				}
			}
	}else{
		word=element[0].value;
		}
	name= elName;
	len = word.length;
	//alert('Validace datumu-'+elName+':'+word);
	if(len!=0){
		loadSignDate();
		back=analyzeDate();
	}else{
		back=true;
	}
	return back;
}

function loadSignDate(){
	a = word.charAt(i);
	sign = 'other';
	if (i == len){ sign = 'endline'; return; }
	if (relv.test(a)){ sign = 'letter'; }
	if (a == '0' || a == '1' || a == '2' || a == '3' || a == '4' || a == '5' || a == '6' || a == '7' || a == '8' || a == '9'){ sign = 'numeric'; }
	if (a == ' '){ sign = 'breaka'; }
	if (a == '.'){ sign = 'dot'; }
	if (a == '-'){ sign = 'dash'; }
	if (a == '/'){ sign = 'slash'; }
	i++;
}

function loadSymbolDate(){
	  while (sign=='breaka')
	  {
	    loadSignDate();
	  }

	  if (sign=='dot')
	  {
	     kword='dot';
		 loadSignDate();
	     return;
	  }

	  if (sign=='dash')
	  {
	     kword='dash';
		 loadSignDate();
	     return;
	  }

	  if (sign=='slash')
	  {
	     kword='slash';
		 loadSignDate();
	     return;
	  }

	  if (sign=='numeric')
	  {
	     hold = hold + a;
	     loadSignDate();
	     while (sign=='numeric' || sign=='breaka')
	     {
	       if(sign=='numeric'){ hold = hold + a;}
	       loadSignDate();
	     }

	     kword='numeric';
	     return;
	  }

	  if (sign=='letter')
	  {
	     hold = hold + a;
	     loadSignDate();
	     while (sign=='letter' || sign=='breaka')
	     {
	       if(sign=='letter'){ hold = hold + a;}
	       loadSignDate();
	     }

	     kword='letter';
	     return;
	  }

	  if (sign=='other')
	  {
	     kword='other';
	     return;
	  }

	  if (sign=='endline')
	  {
	     kword='end';
	     return;
	  }
}

function analyzeDate(){
	loadSymbolDate();

	if(kword != 'numeric'){  return name+'3bad_value'; };

	loadSymbolDate();
	
	if(kword == 'dot')
	{
		day = hold;
		hold = '';

		loadSymbolDate();

		if(kword == 'numeric')
		{
			loadSymbolDate();
			
			if(kword == 'dot')
			{
				month = hold;
				hold = '';

				loadSymbolDate();
				if(kword == 'numeric')
				{
					year = hold;
					loadSymbolDate();
					loadSymbolDate();
					if(kword == 'end'){
						if(month <= 12){
							if(correctDay(day,month,year)){							
								isCorrect=true;						
								return true;
							}
							return name+'3bad_day1';	
						}
						return name+'3bad_month';
					}
					return name+'3bad_format';
				}
				return name+'3bad_format';

			}
			return name+'3bad_format';
		}

		if(kword == 'letter')
		{		
			if(!check_m(hold)){ 
				return name+'3bad_month'; 
				}
			hold = '';

			loadSymbolDate();

			if(kword == 'numeric')
			{
				year = hold;
				loadSymbolDate();
				loadSymbolDate();
				if(kword == 'end'){
					if(month <= 12){
						if(proZacatek(day,month)){
							return true;
						}
					}
				}
				return name+'3bad_day';
			}
			return name+'3bad_month';

		}
		return name+'3bad_format';
	}

	if(kword == 'slash' || kword == 'dash')
	{
		year = hold;
		hold = '';

		loadSymbolDate();

		if(kword == 'numeric' || kword == 'letter')
		{
			loadSymbolDate();

			if(kword == 'slash' || kword == 'dash')
			{
				month = hold;
				hold = '';

				loadSymbolDate();
				if(kword == 'numeric')
				{
					day = hold;
					loadSymbolDate();
					loadSymbolDate();
					if(kword == 'end'){
						if(month <= 12){
							if(proZacatek(day,month)){
								return true;
							}
						}
					}
					return name+'3bad_day';
				}
				return name+'3bad_month';

			}
			return name+'3bad_format';
		}
		return name+'3bad_format';
	}
   if(kword == 'end') {
    	year = hold;
    	
    	if (year.length==4) {
    		return true;
    	}
    }	
  	return name+'3bad_format';
}

function check_m(inp){
	while(k<monthe.length)
	{
		if(monthe[k] == inp){ month = montha[k]; return true; }
		k++;
	}
	return false;
}


function prestupny(year) {
    if ((year%4==0) && ((year%100!=0) || (year%400==0))) return 1;
    return 0;
}

function correctDay(day,month,year) {
    switch (month) {     
      case '01': return (day<=31)?true:false;
      case '03': return (day<=31)?true:false;
      case '05': return (day<=31)?true:false;
      case '07': return (day<=31)?true:false;
      case '08': return (day<=31)?true:false;
      case '1': return (day<=31)?true:false;
      case '3': return (day<=31)?true:false;
      case '5': return (day<=31)?true:false;
      case '7': return (day<=31)?true:false;
      case '8': return (day<=31)?true:false;
      case '10': return (day<=31)?true:false;
      case '12': return (day<=31)?true:false;
      case '4': return (day<=30)?true:false;
      case '6': return (day<=30)?true:false;
      case '9': return (day<=30)?true:false;
      case '11': return (day<=30)?true:false;
      case '2': return ((prestupny(year))?((day<=29)?true:false):((day<=28)?true:false));
      case '04': return (day<=30)?true:false;
      case '06': return (day<=30)?true:false;
      case '09': return (day<=30)?true:false;
      case '02': return ((prestupny(year))?((day<=29)?true:false):((day<=28)?true:false));
      default: return false;
    }
}
