Help with Javascript validating date fields

Abiel de Groot
Abiel de Groot used Ask the Experts™
on
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

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Expert of the Year 2008
Top Expert 2008
Commented:
On lines 108 and 109, you are not doing anything with the result you get back from the validation functions.  You can try this instead:
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;
   }

   if( ValidateForm() === false ||   ValidateForm2()===false )
   {
     return false;
   }
return true;
}

Open in new window


If the problem persists, then post back stating how you are calling CheckApplication()
Zakaria AcharkiAnalyst Developer
Distinguished Expert 2018

Commented:
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

Abiel de GrootDeveloper

Author

Commented:
many thanks to both of you.

A

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial