1 2( function( $ ) { 3 4 var gpGetDateFieldDate = function ($field) { 5 6 var origValue, 7 formatBits = getDateFormatByClass($field.parents('li.gfield').attr('class')).split('_'), 8 mdy = formatBits[0] ? formatBits[0] : 'mdy', 9 sepTypes = {dot: '.', slash: '/', dash: '-'}, 10 separator = formatBits[1] ? sepTypes[formatBits[1]] : '/', 11 dateBits, 12 month, 13 day, 14 year; 15 16 /* Dropdown/Fields */ 17 if ($field.find('.gfield_date_dropdown_month').length || $field.find('.gfield_date_month').length) { 18 19 var $inputs = $field.find('.ginput_container_date input, .ginput_container_date select'); 20 21 month = $inputs.eq(mdy.indexOf('m')).val() - 1; 22 day = $inputs.eq(mdy.indexOf('d')).val(); 23 year = $inputs.eq(mdy.indexOf('y')).val(); 24 25 /* Datepicker */ 26 } else if ( $field.is( '.datepicker, .has-inline-datepicker, .gpro-disabled-datepicker' ) ) { 27 28 origValue = $field.val(); 29 dateBits = origValue.split( separator ); 30 month = dateBits[ mdy.indexOf( 'm' ) ] - 1; 31 day = dateBits[ mdy.indexOf( 'd' ) ]; 32 year = dateBits[ mdy.indexOf( 'y' ) ]; 33 34 } 35 36 return { 37 month: month, 38 day: day, 39 year: year 40 } 41 42 }; 43 44 var gpGetDateFieldDateObject = function ($field) { 45 46 var datebits = gpGetDateFieldDate($field); 47 48 var day = datebits.day; 49 var month = datebits.month; 50 var year = datebits.year; 51 52 if (! day || ( ! month && month !== '0' && month !== 0 ) || ! year ) { 53 return false; 54 } 55 56 date = new Date(year, month, day, 0, 0, 0, 0); 57 58 return date; 59 60 }; 61 62 var gpGetDateFieldTimestamp = function ($field) { 63 64 var date = gpGetDateFieldDateObject($field); 65 66 if (!date) { 67 return false; 68 } 69 70 var tzOffset = date.getTimezoneOffset() * 60; // convert to seconds 71 72 if (isNaN(date.getTime())) { 73 return false; 74 } 75 76 return ( date.getTime() / 1000 ) - tzOffset; 77 78 }; 79 80 gform.addFilter( 'gform_is_value_match', function( isMatch, formId, rule ) { 81 82 var fieldValue = false, 83 ruleValue = rule.value, 84 $sourceInput = jQuery( '#input_' + formId + '_' + rule.fieldId ), 85 isTimeField = $sourceInput.parents( 'li.gfield' ).hasClass( 'gcldf-field-time' ); 86 87 if( rule.fieldId == '_gpcld_current_time' || isTimeField ) { 88 89 var currentDate = new Date(), 90 $timeInputs = $sourceInput.parents( 'li.gfield' ).find( 'input, select' ), 91 timeString = '{0}:{1}{2}'.format( $timeInputs.eq( 0 ).val(), $timeInputs.eq( 1 ).val(), $timeInputs.eq( 2 ).val() ); 92 93 var datetime = isTimeField ? getDateFromTimeString( timeString ) : currentDate, 94 timestamp = datetime.getTime() / 1000, 95 compareDate = getDateFromTimeString( rule.value ); 96 97 /** 98 * Convert user's local time to UTC. 99 * 100 * @since 1.0.1 101 * 102 * @param bool $enable Enable conversion of user's local time to UTC. 103 * @param object $rule The current Gravity Forms rule object being evaluated. 104 * @param int formId The current form ID. 105 */ 106 if( gform.applyFilters( 'gpcld_enable_utc_timezone', false, rule, formId ) ) { 107 108 var tzOffset = datetime.getTimezoneOffset() * 60, // convert to seconds 109 tzTimestamp = ( datetime.getTime() / 1000 ) - tzOffset, 110 tzDatetime = new Date( tzTimestamp * 1000 ); 111 112 timestamp = tzTimestamp; 113 114 } 115 116 117 ruleValue = ( compareDate.getTime() / 1000 ); 118 119 } else { 120 121 if( ! $sourceInput.parents( 'li.gfield' ).hasClass( 'gcldf-field' ) ) { 122 return isMatch; 123 } 124 125 timestamp = gpGetDateFieldTimestamp($sourceInput); 126 127 } 128 129 fieldValue = timestamp; 130 131 /* 132 * Allows use of asterisks (wildcards) when specifying dates in rule values. Will be replaced with 133 * the corresponding value from the compared date value. 134 * 135 * Selected Date: 9/20/2016 136 * Wildcard Rule: 9/15/* 137 * Replaced Rule: 9/15/2016 138 */ 139 if( String( ruleValue ).indexOf( '*' ) != -1 ) { 140 141 var ruleBits = ruleValue.split( '/' ); 142 var date = gpGetDateFieldDate($sourceInput); 143 var dateBits = [ date.month, date.day, date.year ]; 144 145 for( var i = 0; i < ruleBits.length; i++ ) { 146 if( ruleBits[i] == '*' ) { 147 ruleBits[i] = dateBits[i]; 148 } 149 } 150 151 // ruleBits = [ month, day, year ] 152 var date = new Date( ruleBits[2], ruleBits[0] - 1, ruleBits[1], 0, 0, 0, 0 ), 153 tzOffset = date.getTimezoneOffset() * 60; // convert to seconds 154 155 ruleValue = ( date.getTime() / 1000 ) - tzOffset; 156 157 } 158 159 if( fieldValue ) { 160 161 var tag = rule.value.match( /{(.+?)}/ ); 162 163 if( tag ) { 164 165 var tag = tag[1].toLowerCase(), 166 days = [ 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' ],
167 date = gpGetDateFieldDateObject($sourceInput); 168 169 switch( tag ) { 170 case 'monday': 171 case 'tuesday': 172 case 'wednesday': 173 case 'thursday': 174 case 'friday': 175 case 'saturday': 176 case 'sunday': 177 fieldValue = !date || isNaN( date.getDay() ) ? '' : date.getDay(); 178 ruleValue = days.indexOf( tag ); 179 break; 180 } 181 182 } 183 184 } 185 186 // Modify fieldValue or ruleValue so that rule always returns false until a date is selected. 187 if( fieldValue === false && gform.applyFilters( 'gpcld_require_date_selection', true, formId, rule ) ) { 188 if( rule.operator == 'isnot' ) { 189 fieldValue = ruleValue; 190 } else if( rule.operator != 'is' ) { 191 ruleValue = ''; 192 } else { 193 fieldValue = 0; 194 } 195 } 196 197 // must be strings for GF 198 isMatch = gf_matches_operation( String( fieldValue ), String( ruleValue ), rule.operator ); 199 200 return isMatch; 201 } ); 202 203 function getDateFromTimeString( timeString ) { 204 205 var bits = timeString.split( /([0-9]{1,2}):([0-9]{2})(am|pm)?/i ), // 09:00pm => [ '', '09', '00', 'pm', '' ] 206 hour = parseInt( bits[1] ), 207 min = parseInt( bits[2] ), 208 ampm = String( bits[3] ).toLowerCase(), 209 currentDate = new Date(); 210 211 if( ampm == 'pm' && hour < 12 ) { 212 hour += 12; 213 } else if( ampm == 'am' && hour == 12 ) { 214 hour = 0; 215 } 216 217 return new Date( currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate(), hour, min, 0, 0 ); 218 } 219 220 function getDateFormatByClass( cssClass ) { 221 var classes = cssClass.split( ' ' ); 222 for( var i = 0; i < classes.length; i++ ) { 223 if( classes[i].indexOf( 'gcldf-date-format-' ) != -1 ) { 224 var bits = classes[i].split( '-' ); 225 return bits[ bits.length - 1 ]; 226 } 227 } 228 return false; 229 } 230 231} )( jQuery );
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.