houssam_ballout Posted March 11, 2013 Share Posted March 11, 2013 Hello,I need the help on the following in order to validate date on my form (validation is onBlur): - validation on form date format: dd-mm-yyyy , when I go to next field, if the date field is empty, it will be filled with today's date, and I write 9-3 and go to next field it will automatically write 9-3-2013 (where is 2013 is the current year), finally, if the date is not valid then user can't go to another field, focus must be go back to date field. Help is much appreciated. Thanks in advance Link to comment Share on other sites More sharing options...
justsomeguy Posted March 11, 2013 Share Posted March 11, 2013 There are several steps there, what do you have so far and which steps do you need help with? Link to comment Share on other sites More sharing options...
houssam_ballout Posted March 11, 2013 Author Share Posted March 11, 2013 I had the code for the validation dd-mm-yyyy but the auto complete is missing & when the field is empty is also missing!Thanks Link to comment Share on other sites More sharing options...
justsomeguy Posted March 11, 2013 Share Posted March 11, 2013 If the field is empty then you can create a Date object and get the current date parts from it. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date For auto-complete, you can split the date string up on the "-" character, and if there are less than 3 elements in the array then you can add the year. For validating the date, there is example code here: http://www.javascriptkit.com/script/script2/validatedate.shtml It expects a different date format then you're looking for, but you can modify that code to expect the format that you want. Link to comment Share on other sites More sharing options...
houssam_ballout Posted March 12, 2013 Author Share Posted March 12, 2013 Here it is, problem now, is that when I write 4-5 or 4-5- I need to autocomple the year with the current 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© == -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 = 31 if (i==4 || i==6 || i==9 || i==11) {this = 30} if (i==2) {this = 29} } return this}function isDate(dtStr){ var daysInMonth = DaysArray(12) var pos1=dtStr.indexOf(dtCh) var pos2=dtStr.indexOf(dtCh,pos1+1) var strDay=dtStr.substring(0,pos1) var strMonth=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("The date format should be : dd-mm-yyyy") return false } if (strMonth.length<1 || month<1 || month>12){ alert("Please enter a valid month") return false } if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){ alert("Please enter a valid day") return false } if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){ alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear) return false } if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){ alert("Please enter a valid date") return false }return true}function ValidateForm(){ var dt=document.getElementById("ADate");var currentTime4 = new Date()var month4 = currentTime4.getMonth() + 1var day4 = currentTime4.getDate()var year4 = currentTime4.getFullYear()var finalDate4 = ( day4 + "-" + month4 + "-" + year4 );if(dt.value == ''){ dt.value = finalDate4; }if (isDate(dt.value)==false) { dt.focus() return false } return true}/*function ValidateForm(){ var dt=document.frmSample.txtDate if (isDate(dt.value)==false){ dt.focus() return false } return true }*/ Link to comment Share on other sites More sharing options...
justsomeguy Posted March 12, 2013 Share Posted March 12, 2013 There's a lot of code there to do things that shouldn't take so much. Like this code: var pos1=dtStr.indexOf(dtCh)var pos2=dtStr.indexOf(dtCh,pos1+1)var strDay=dtStr.substring(0,pos1)var strMonth=dtStr.substring(pos1+1,pos2)var strYear=dtStr.substring(pos2+1)strYr=strYearif (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("The date format should be : dd-mm-yyyy")return false} I suggested splitting the date string. This is probably easier to understand: var dateParts = dtStr.split(dtCh); if (dateParts.length < 2){ alert("The date format should be : dd-mm-yyyy"); return false;}var day = parseInt(dateParts[0], 10);var month = parseInt(dateParts[1], 10); var year = 0;if (dateParts.length == 3){ year = parseInt(dateParts[2], 10);}if (isNaN(day) || isNaN(month) || isNaN(year)){ alert("The date parts must be numeric."); return false;} Now you haev the month, day, and year as numbers. The year will be 0 if it wasn't given. There is a problem in your logic, though. Your isDate function only returns true or false. Where do you expect the code to go to add the year if it is missing? You can put that code in isDate to add the year and update the value in the field, but that seems like a weird thing to do in a function that just validates a date. Then you have all of this code to check the ranges: if (strMonth.length<1 || month<1 || month>12){alert("Please enter a valid month")return false}if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){alert("Please enter a valid day")return false}if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)return false}if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){alert("Please enter a valid date")return false} You only need to do this, like the second link I posted above shows: var dayobj = new Date(year, month-1, day);if ((dayobj.getMonth()+1!=month)||(dayobj.getDate()!=day)||(dayobj.getFullYear()!=year))alert("Invalid Day, Month, or Year range detected. Please correct and submit again."); Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now