var CALENDAR_MONTHS = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]; var CALENDAR_WEEKDAYS = [ 'S', 'M', 'T', 'W', 'T', 'F', 'S' ]; var CALENDAR_DATEFORMAT = 'M/d/y'; var CALENDAR_DATEPATTERN = null; var CALENDAR_DATEPART_INDICES = [ 1, 0, 2, '/', '/' ]; var CALENDAR_MONTHDAYS = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; //document.onclick = ve_hideCalendar; function ve_showCalendar( sLink ) { if( ve_showCalendar.open ) { ve_hideCalendar(); } else { var oTextbox = getTag( sLink ); var oButton = getTag( "btn" + sLink ); var oCalendar = document.getElementById( "veCalendar" ); var iLeft = oButton.offsetLeft; var iTop = oButton.offsetTop + oButton.parentNode.offsetTop + oButton.offsetHeight; oCalendar.style.marginLeft = iLeft; oCalendar.style.marginTop = iTop; ve_showCalendar.currentDate = ve_calcValidDate( null, getTag( sLink ).value ); ve_showCalendar.months = CALENDAR_MONTHS; ve_showCalendar.weekdays = CALENDAR_WEEKDAYS; if( oCalendar.contentWindow ) { oCalendar.contentWindow.init( ve_showCalendar.currentDate, ve_showCalendar.months, ve_showCalendar.weekdays ); } oCalendar.style.display = "block"; ve_showCalendar.link = sLink; ve_showCalendar.open = true; } } function ve_hideCalendar() { if( !ve_showCalendar.open ) return; var oCalendar = getTag( "veCalendar" ); if(oCalendar != null && oCalendar.style != null) { oCalendar.style.display = "none"; ve_showCalendar.open = false; } } function ve_submitCalendar( oDate ) { ve_hideCalendar(); var format = CALENDAR_DATEFORMAT; var month = "" + ( oDate.getMonth() + 1 ); var day = "" + oDate.getDate(); var year = oDate.getFullYear(); var oLink = getTag( ve_showCalendar.link ); if( month.length < 2 ) month = "0" + month; if( day.length < 2 ) day = "0" + day; var dateString = ""; for( var i = 0; i < format.length; i++ ) if( ( ch = format.charAt( i ) ) == 'd' ) dateString += day; else if( ch == 'M' ) dateString += month; else if( ch == 'y' ) dateString += year; else dateString += ch; oLink.value = dateString; oLink.select(); oLink.focus(); if( oLink.onchange ) oLink.onchange(); } function ve_calcValidDate( pattern, strValue ) { var objRegExp = pattern == null || pattern == "" ? CALENDAR_DATEPATTERN : pattern; var arrayDate; if( objRegExp == null ) objRegExp = ve_initDatePattern(); //check to see if in correct format if( !( arrayDate = objRegExp.exec( strValue ) ) ) return null; //doesn't match pattern, bad date else { var intDay = parseInt( arrayDate[ CALENDAR_DATEPART_INDICES[ 0 ] + 1 ], 10 ); var intYear = parseInt( arrayDate[ CALENDAR_DATEPART_INDICES[ 2 ] + 1 ], 10 ); var intMonth = parseInt( arrayDate[ CALENDAR_DATEPART_INDICES[ 1 ] + 1 ], 10 ); if( intYear < 100 ) intYear += intYear < 70 ? 2000 : 1900; //check for valid month if( intMonth > 12 || intMonth < 1 ) return null; var maxMonthDays = CALENDAR_MONTHDAYS[ intMonth - 1 ]; if( intDay > maxMonthDays || intDay < 1 ) return null; else if( intMonth == 2 ) { //check for February var booLeapYear = ( intYear % 4 == 0 && ( intYear % 100 != 0 || intYear % 400 == 0 ) ); if( !booLeapYear && intDay > 28 ) return null; //Feb. has invalid number of days } return new Date( intYear, intMonth - 1, intDay ); } return null; //any other values, bad date } function ve_validateDateString( pattern, strValue ) { return ve_calcValidDate( pattern, strValue ) != null; } function ve_validateDate( element, pattern ) { if( element.value != "" && !ve_validateDateString( pattern, element.value ) ) { alert( 'Invalid Date.' ); setTimeout( function(){ element.select(); element.focus(); }, 10 ); return false; } return true; } function getDateFilter( name, id ) { var dateVal = document.getElementById( id ).value; return name + ' >= "' + dateVal + '" && ' + name + ' <= "' + dateVal + '"'; } function ve_initDatePattern() { var format = CALENDAR_DATEFORMAT; var pattern = "^"; var partIndex = 0; var ch; for( var i = 0; i < format.length; i++ ) if( ( ch = format.charAt( i ) ) == 'd' ) { CALENDAR_DATEPART_INDICES[ 0 ] = partIndex++; pattern += "(\\d{1,2})"; } else if( ch == 'M' ) { CALENDAR_DATEPART_INDICES[ 1 ] = partIndex++; pattern += "(\\d{1,2})"; } else if( ch == 'y' ) { CALENDAR_DATEPART_INDICES[ 2 ] = partIndex++; pattern += "(\\d{2,4})"; } else pattern += "\\" + ch; return CALENDAR_DATEPATTERN = new RegExp( pattern + "$" ); }