I don't have the page live anywhere but below is the test file I'm using. After loading the page, the behavior is seen when I:
1) submit the page with the default loaded data. Both 'endDate' and 'endTime' fields are highlighted as expected 2) move to 'endDate' field and adjust the date to '1/21/2009'. 'endDate' field loses the error highlight right away but it remains on 'endTime' until I either bring focus back to 'endTime' field or submit the form again. I was expecting the 'endTime' to lose the error highlight at the same time 'endDate' loses it. jquery version: 1.2.6 jquery.validate version: 1.5.1 --- test.html ----- <html> <head> <link rel=StyleSheet HREF="style.css" TYPE="text/css"> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/ libs/jquery/1.2.6/jquery.min.js"></script> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/ libs/jqueryui/1.5.3/jquery-ui.min.js"></script> <script type="text/javascript" src="jquery.validate_1.5.1.js"></ script> <script type="text/javascript" src="datehelper.js"></script> <script type="text/javascript"> $(document).ready(function() { $("#endTime").focus(); $.validator.addMethod('dateTimeRange', function (data) { // console.log("dateTimeRange validation, data: " + data); var startDateTime = new Date(); var endDateTime = new Date(); // convertToDate returns a Date object for a given date & time string value startDateTime.convertToDate($("#startDate").val(), $ ("#startTime").val()) endDateTime.convertToDate($("#endDate").val(), $("#endTime").val()) var result = (endDateTime.getTime() > startDateTime.getTime()); // console.log("dateTimeRange result: " + result); return result; }, 'End date and time must be later than start date and time'); var validator = $("#sampleForm").validate({ debug: true, groups: { start: "startDate startTime", end: "endDate endTime" }, messages: { startTime: { required: "Enter start time", }, startDate: { required: "Enter start date", date: "Enter a valid date" }, endTime: { required: "Enter end time", }, endDate: { required: "Enter end date", date: "Enter a valid date" }, }, submitHandler: function(form) { // console.log("submit handler - do nothing for now"); } }); }); </script> </head> <body> <form id="sampleForm" method="POST" action=""> <div class="columntitle"> <label for="startTime">Start Time</label> <input type='text' name='startTime' id="startTime" class="required" size="8" maxlength="8" tabindex="4" value="11:59 pm"/> <label for="startDate">Start Date</label> <input type='text' name='startDate' id='startDate' class="required date" size="10" maxlength="10" tabindex="5" value="1/20/2009"/> </div> <div class="columntitle"> <label for='endTime'>End Time</label> <input type='text' name='endTime' id="endTime" class="required dateTimeRange" size="8" maxlength="8" tabindex="6" value="11:00 am"/> <label for="endDate">End Date</label> <input type='text' name='endDate' id='endDate' class="required date dateTimeRange" size="10" maxlength="10" tabindex="7" value="1/20/2009"/> </div> <input class="submit" type="submit" id="submitBtn" tabIndex="13" value="Submit"/> </form> </body> </html> datehelper.js referenced in the script file is as follows: // // Date helpers to convert string to date object // Date.prototype.convertToDate = function (startDate, startTime) { // recognizes time as either 1pm, 1 pm, or 1:00 pm (from regexlib.com) var regexp = /^([0-9]|[0-1][0-9]):([0-5][0-9])\s{0,1}(AM|PM|am|pm| aM|Am|pM|Pm{2,2})$|^([0-9]|[1][0-9])\s{0,1}(AM|PM|am|pm|aM|Am|pM|Pm {2,2})$/i; var parsedTime = startTime.match(new RegExp(regexp)); if (!parsedTime) return; var hour = null; var minute = "00"; var meridian = null; if (parsedTime[1]) { hour = parsedTime[1]; minute = parsedTime[2]; meridian = parsedTime[3]; } else { hour = parsedTime[4]; meridian = parsedTime[5]; } var parsedDateTime = new Date(); var extractedTime = hour + ":" + minute + " " + meridian; if (startDate.length < 1) { startDate = this.getCorrectMonth(parsedDateTime) + "/" + parsedDateTime.getDate() + "/" + this.getCorrectYear(parsedDateTime); } var startDateTime = startDate + " " + extractedTime; var millisec = Date.parse(startDateTime) if (millisec > 0) { parsedDateTime.setTime(millisec); this.setTime(millisec); } } Date.prototype.getCorrectYear = function (theDate) { var x = theDate.getYear(); var y = x % 100; y += (y < 38) ? 2000 : 1900; return y; } Date.prototype.getCorrectMonth = function (theDate) { var x = theDate.getMonth(); return x + 1; }