Link to home
Start Free TrialLog in
Avatar of Abiel de Groot
Abiel de GrootFlag for Spain

asked on

Help with Javascript validating date fields

Hi All,

I have 2 sets of date fields to check for validity. If an invalid date is entered it is caught my the javascript. However, as soon as the 'OK' on the alert is clicked the form coninues to submit rather than the 'return false'


Any help much appreciated.

<script language="javascript">

//Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		alert("<%=PlaceTextFront(2439) & ":\n" & PlaceTextFront(2435)%>")
		return false;
	}
	if (strMonth.length<1 || month<1 || month>12){
		alert("<%=PlaceTextFront(2439) & ":\n" & PlaceTextFront(2435)%>")
		return false;
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		alert("<%=PlaceTextFront(2439) & ":\n" & PlaceTextFront(2435)%>")
		return false;
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		alert("<%=PlaceTextFront(2439) & ":\n" & PlaceTextFront(2435)%>")
		return false;
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		alert("<%=PlaceTextFront(2439) & ":\n" & PlaceTextFront(2435)%>")
		return false;
	}
return true;
}
 
function ValidateForm(){
	var dt=document.getElementById("selMonth").value+"/"+document.getElementById("selDay").value+"/"+document.getElementById("selYear").value
	if (isDate(dt)==false){
		//dt.focus()
	return false;
	}
 }
function ValidateForm2(){
	var dt2=document.getElementById("selMonth2").value+"/"+document.getElementById("selDay2").value+"/"+document.getElementById("selYear2").value
	if (isDate(dt2)==false){
		//dt2.focus()
	return false;
	}
 }
 
function CheckApplication()
{
if(document.getElementById("Sel_Country").value == 0)
   {
      alert("<%=PlaceTextFront(2436)%>"); // prompt user
      document.getElementById("Sel_Country").focus(); //set focus back to control
      return false;
   }
   ValidateForm();
   ValidateForm2();
}
</script>

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of hielo
hielo
Flag of Wallis and Futuna image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
You don't need to duplicate the code, to suit the best practice and DRY concept, all you need is a generic function like :

function ValidateForm(selMonth, selDay, selYear){
	return isDate( document.getElementById(selMonth).value+"/"+document.getElementById(selDay).value+"/"+document.getElementById(selYear).value );
}

Open in new window


Then you need to return a boolean from your "CheckApplication" function, something like :

function CheckApplication(){
	if(document.getElementById("Sel_Country").value == 0)
	{
      	alert("<%=PlaceTextFront(2436)%>"); // prompt user
      	document.getElementById("Sel_Country").focus(); //set focus back to control
      	return false;
	}

	return ValidateForm("selMonth", "selDay", "selYear") && ValidateForm("selMonth2", "selDay2", "selYear2");
}

Open in new window

Avatar of Abiel de Groot

ASKER

many thanks to both of you.

A