minor improvement to tabs style
[openemr.git] / library / appointments.inc.php
blob1b43a5e0b19faf759244f38e410616cd8f3f14fb
1 <?php
3 // Copyright (C) 2011 Ken Chapple
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // Holds library functions (and hashes) used by the appointment reporting module
14 require_once(dirname(__FILE__)."/encounter_events.inc.php");
15 require_once(dirname(__FILE__)."/../interface/main/calendar/modules/PostCalendar/pnincludes/Date/Calc.php");
18 $COMPARE_FUNCTION_HASH = array(
19 'doctor' => 'compareAppointmentsByDoctorName',
20 'patient' => 'compareAppointmentsByPatientName',
21 'pubpid' => 'compareAppointmentsByPatientId',
22 'date' => 'compareAppointmentsByDate',
23 'time' => 'compareAppointmentsByTime',
24 'type' => 'compareAppointmentsByType',
25 'comment' => 'compareAppointmentsByComment',
26 'status' => 'compareAppointmentsByStatus',
27 'completed' => 'compareAppointmentsByCompletedDrugScreen',
28 'trackerstatus' => 'compareAppointmentsByTrackerStatus'
31 $ORDERHASH = array(
32 'doctor' => array( 'doctor', 'date', 'time' ),
33 'patient' => array( 'patient', 'date', 'time' ),
34 'pubpid' => array( 'pubpid', 'date', 'time' ),
35 'date' => array( 'date', 'time', 'type', 'patient' ),
36 'time' => array( 'time', 'date', 'patient' ),
37 'type' => array( 'type', 'date', 'time', 'patient' ),
38 'comment' => array( 'comment', 'date', 'time', 'patient' ),
39 'status' => array( 'status', 'date', 'time', 'patient' ),
40 'completed' => array( 'completed', 'date', 'time', 'patient' ),
41 'trackerstatus' => array( 'trackerstatus', 'date', 'time', 'patient' ),
44 /*Arrays for the interpretation of recurrence patterns.*/
45 $REPEAT_FREQ = array(
46 '1' => xl('Every'),
47 '2' => xl('Every 2nd'),
48 '3' => xl('Every 3rd'),
49 '4' => xl('Every 4th'),
50 '5' => xl('Every 5th'),
51 '6' => xl('Every 6th')
54 $REPEAT_FREQ_TYPE = array(
55 '0' => xl('day'),
56 '1' => xl('week'),
57 '2' => xl('month'),
58 '3' => xl('year'),
59 '4' => xl('workday')
62 $REPEAT_ON_NUM = array(
63 '1' => xl('1st'),
64 '2' => xl('2nd'),
65 '3' => xl('3rd'),
66 '4' => xl('4th'),
67 '5' => xl('Last')
70 $REPEAT_ON_DAY = array(
71 '0' => xl('Sunday'),
72 '1' => xl('Monday'),
73 '2' => xl('Tuesday'),
74 '3' => xl('Wednesday'),
75 '4' => xl('Thursday'),
76 '5' => xl('Friday'),
77 '6' => xl('Saturday')
80 function fetchEvents( $from_date, $to_date, $where_param = null, $orderby_param = null, $tracker_board = false, $nextX = 0, $bind_param = null, $query_param = null )
83 $sqlBindArray = array();
85 if($query_param) {
87 $query = $query_param;
89 if($bind_param) $sqlBindArray = $bind_param;
91 } else {
92 //////
93 if($nextX) {
95 $where =
96 "((e.pc_endDate >= ? AND e.pc_recurrtype > '0') OR " .
97 "(e.pc_eventDate >= ?))";
99 array_push($sqlBindArray, $from_date, $from_date);
101 } else {
102 //////
103 $where =
104 "((e.pc_endDate >= ? AND e.pc_eventDate <= ? AND e.pc_recurrtype > '0') OR " .
105 "(e.pc_eventDate >= ? AND e.pc_eventDate <= ?))";
107 array_push($sqlBindArray, $from_date, $to_date, $from_date, $to_date);
111 if ( $where_param ) $where .= $where_param;
113 $order_by = "e.pc_eventDate, e.pc_startTime";
114 if ( $orderby_param ) {
115 $order_by = $orderby_param;
118 // Tracker Board specific stuff
119 $tracker_fields = '';
120 $tracker_joins = '';
121 if ($tracker_board) {
122 $tracker_fields = "e.pc_room, e.pc_pid, t.id, t.date, t.apptdate, t.appttime, t.eid, t.pid, t.original_user, t.encounter, t.lastseq, t.random_drug_test, t.drug_screen_completed, " .
123 "q.pt_tracker_id, q.start_datetime, q.room, q.status, q.seq, q.user, " .
124 "s.toggle_setting_1, s.toggle_setting_2, s.option_id, ";
125 $tracker_joins = "LEFT OUTER JOIN patient_tracker AS t ON t.pid = e.pc_pid AND t.apptdate = e.pc_eventDate AND t.appttime = e.pc_starttime AND t.eid = e.pc_eid " .
126 "LEFT OUTER JOIN patient_tracker_element AS q ON q.pt_tracker_id = t.id AND q.seq = t.lastseq " .
127 "LEFT OUTER JOIN list_options AS s ON s.list_id = 'apptstat' AND s.option_id = q.status AND s.activity = 1 " ;
130 $query = "SELECT " .
131 "e.pc_eventDate, e.pc_endDate, e.pc_startTime, e.pc_endTime, e.pc_duration, e.pc_recurrtype, e.pc_recurrspec, e.pc_recurrfreq, e.pc_catid, e.pc_eid, e.pc_gid, " .
132 "e.pc_title, e.pc_hometext, e.pc_apptstatus, " .
133 "p.fname, p.mname, p.lname, p.pid, p.pubpid, p.phone_home, p.phone_cell, " .
134 "u.fname AS ufname, u.mname AS umname, u.lname AS ulname, u.id AS uprovider_id, " .
135 "f.name, " .
136 "$tracker_fields" .
137 "c.pc_catname, c.pc_catid " .
138 "FROM openemr_postcalendar_events AS e " .
139 "$tracker_joins" .
140 "LEFT OUTER JOIN facility AS f ON e.pc_facility = f.id " .
141 "LEFT OUTER JOIN patient_data AS p ON p.pid = e.pc_pid " .
142 "LEFT OUTER JOIN users AS u ON u.id = e.pc_aid " .
143 "LEFT OUTER JOIN openemr_postcalendar_categories AS c ON c.pc_catid = e.pc_catid " .
144 "WHERE $where " .
145 "ORDER BY $order_by";
147 if($bind_param) $sqlBindArray = array_merge($sqlBindArray, $bind_param);
152 ///////////////////////////////////////////////////////////////////////
153 // The following code is from the calculateEvents function in the //
154 // PostCalendar Module modified and inserted here by epsdky //
155 ///////////////////////////////////////////////////////////////////////
157 $events2 = array();
159 $res = sqlStatement($query, $sqlBindArray);
161 ////////
162 if($nextX) {
163 global $resNotNull;
164 $resNotNull = (isset($res) && $res != null);
167 while ($event = sqlFetchArray($res)) {
168 ///////
169 if($nextX) $stopDate = $event['pc_endDate'];
170 else $stopDate = ($event['pc_endDate'] <= $to_date) ? $event['pc_endDate'] : $to_date;
171 ///////
172 $incX = 0;
173 switch($event['pc_recurrtype']) {
175 case '0' :
177 $events2[] = $event;
179 break;
180 //////
181 case '1' :
182 case '3' :
183 $event_recurrspec = @unserialize($event['pc_recurrspec']);
185 $rfreq = $event_recurrspec['event_repeat_freq'];
186 $rtype = $event_recurrspec['event_repeat_freq_type'];
187 $exdate = $event_recurrspec['exdate'];
189 list($ny,$nm,$nd) = explode('-',$event['pc_eventDate']);
190 // $occurance = Date_Calc::dateFormat($nd,$nm,$ny,'%Y-%m-%d');
191 $occurance = $event['pc_eventDate'];
193 while($occurance < $from_date) {
194 $occurance =& __increment($nd,$nm,$ny,$rfreq,$rtype);
195 list($ny,$nm,$nd) = explode('-',$occurance);
198 while($occurance <= $stopDate) {
200 $excluded = false;
201 if (isset($exdate)) {
202 foreach (explode(",", $exdate) as $exception) {
203 // occurrance format == yyyy-mm-dd
204 // exception format == yyyymmdd
205 if (preg_replace("/-/", "", $occurance) == $exception) {
206 $excluded = true;
211 if ($excluded == false) {
212 $event['pc_eventDate'] = $occurance;
213 $event['pc_endDate'] = '0000-00-00';
214 $events2[] = $event;
215 //////
216 if ($nextX) {
217 ++$incX;
218 if($incX == $nextX) break;
220 //////
223 $occurance =& __increment($nd,$nm,$ny,$rfreq,$rtype);
224 list($ny,$nm,$nd) = explode('-',$occurance);
228 break;
230 //////
231 case '2' :
233 $event_recurrspec = @unserialize($event['pc_recurrspec']);
235 $rfreq = $event_recurrspec['event_repeat_on_freq'];
236 $rnum = $event_recurrspec['event_repeat_on_num'];
237 $rday = $event_recurrspec['event_repeat_on_day'];
238 $exdate = $event_recurrspec['exdate'];
240 list($ny,$nm,$nd) = explode('-',$event['pc_eventDate']);
242 if(isset($event_recurrspec['rt2_pf_flag']) && $event_recurrspec['rt2_pf_flag']) $nd = 1;
244 $occuranceYm = "$ny-$nm"; // YYYY-mm
245 $from_dateYm = substr($from_date,0,7); // YYYY-mm
246 $stopDateYm = substr($stopDate,0,7); // YYYY-mm
248 // $nd will sometimes be 29, 30 or 31 and if used in the mktime functions below
249 // a problem with overflow will occur so it is set to 1 to avoid this (for rt2
250 // appointments set prior to fix $nd remains unchanged). This can be done since
251 // $nd has no influence past the mktime functions.
252 while($occuranceYm < $from_dateYm) {
253 $occuranceYmX = date('Y-m-d',mktime(0,0,0,$nm+$rfreq,$nd,$ny));
254 list($ny,$nm,$nd) = explode('-',$occuranceYmX);
255 $occuranceYm = "$ny-$nm";
258 while($occuranceYm <= $stopDateYm) {
260 // (YYYY-mm)-dd
261 $dnum = $rnum;
262 do {
263 $occurance = Date_Calc::NWeekdayOfMonth($dnum--,$rday,$nm,$ny,$format="%Y-%m-%d");
264 } while($occurance === -1);
266 if($occurance >= $from_date && $occurance <= $stopDate) {
268 $excluded = false;
269 if (isset($exdate)) {
270 foreach (explode(",", $exdate) as $exception) {
271 // occurrance format == yyyy-mm-dd
272 // exception format == yyyymmdd
273 if (preg_replace("/-/", "", $occurance) == $exception) {
274 $excluded = true;
279 if ($excluded == false) {
281 $event['pc_eventDate'] = $occurance;
282 $event['pc_endDate'] = '0000-00-00';
283 $events2[] = $event;
284 //////
285 if($nextX) {
286 ++$incX;
287 if($incX == $nextX) break;
289 //////
295 $occuranceYmX = date('Y-m-d',mktime(0,0,0,$nm+$rfreq,$nd,$ny));
296 list($ny,$nm,$nd) = explode('-',$occuranceYmX);
297 $occuranceYm = "$ny-$nm";
301 break;
308 return $events2;
309 ////////////////////// End of code inserted by epsdky
312 function fetchAllEvents( $from_date, $to_date, $provider_id = null, $facility_id = null )
314 $sqlBindArray = array();
316 $where = "";
318 if ( $provider_id ) {
319 $where .= " AND e.pc_aid = ?";
320 array_push($sqlBindArray, $provider_id);
323 if ( $facility_id ) {
324 $where .= " AND e.pc_facility = ? AND u.facility_id = ?";
325 array_push($sqlBindArray, $facility_id, $facility_id);
328 $appointments = fetchEvents( $from_date, $to_date, $where, null, false, 0, $sqlBindArray );
329 return $appointments;
332 //Support for therapy group appointments added by shachar z.
333 function fetchAppointments( $from_date, $to_date, $patient_id = null, $provider_id = null, $facility_id = null, $pc_appstatus = null, $with_out_provider = null, $with_out_facility = null, $pc_catid = null, $tracker_board = false, $nextX = 0, $group_id = null)
335 $sqlBindArray = array();
337 $where = "";
339 if ( $provider_id ) {
340 $where .= " AND e.pc_aid = ?";
341 array_push($sqlBindArray, $provider_id);
344 if ( $patient_id ) {
345 $where .= " AND e.pc_pid = ?";
346 array_push($sqlBindArray, $patient_id);
347 } elseif( $group_id ) {
348 //if $group_id this means we want only the group events
349 $where .= " AND e.pc_gid = ? AND e.pc_pid = ''";
350 array_push($sqlBindArray, $group_id);
351 } else {
352 $where .= " AND e.pc_pid != ''";
355 if ( $facility_id ) {
356 $where .= " AND e.pc_facility = ?";
357 array_push($sqlBindArray, $facility_id);
360 //Appointment Status Checking
361 if($pc_appstatus != ''){
362 $where .= " AND e.pc_apptstatus = ?";
363 array_push($sqlBindArray, $pc_appstatus);
366 if($pc_catid !=null) {
367 $where .= " AND e.pc_catid = ?";
368 array_push($sqlBindArray, $pc_catid);
371 //Without Provider checking
372 if($with_out_provider != ''){
373 $where .= " AND e.pc_aid = ''";
376 //Without Facility checking
377 if($with_out_facility != ''){
378 $where .= " AND e.pc_facility = 0";
381 $appointments = fetchEvents( $from_date, $to_date, $where, '', $tracker_board, $nextX, $sqlBindArray );
382 return $appointments;
385 //Support for therapy group appointments added by shachar z.
386 function fetchNextXAppts($from_date, $patient_id, $nextX = 1, $group_id = null) {
388 $appts = array();
389 $nextXAppts = array();
390 $appts = fetchAppointments( $from_date, null, $patient_id, null, null, null, null, null, null, false, $nextX, $group_id);
391 if($appts) {
392 $appts = sortAppointments($appts);
393 $nextXAppts = array_slice($appts, 0, $nextX);
395 return $nextXAppts;
399 // get the event slot size in seconds
400 function getSlotSize()
402 if ( isset( $GLOBALS['calendar_interval'] ) ) {
403 return $GLOBALS['calendar_interval'] * 60;
405 return 15 * 60;
408 function getAvailableSlots( $from_date, $to_date, $provider_id = null, $facility_id = null )
410 $appointments = fetchAllEvents( $from_date, $to_date, $provider_id, $facility_id );
411 $appointments = sortAppointments( $appointments, "date" );
412 $from_datetime = strtotime( $from_date." 00:00:00" );
413 $to_datetime = strtotime( $to_date." 23:59:59" );
414 $availableSlots = array();
415 $start_time = 0;
416 $date = 0;
417 for ( $i = 0; $i < count( $appointments ); ++$i )
419 if ( $appointments[$i]['pc_catid'] == 2 ) { // 2 == In Office
420 $start_time = $appointments[$i]['pc_startTime'];
421 $date = $appointments[$i]['pc_eventDate'];
422 $provider_id = $appointments[$i]['uprovider_id'];
423 } else if ( $appointments[$i]['pc_catid'] == 3 ) { // 3 == Out Of Office
424 continue;
425 } else {
426 $start_time = $appointments[$i]['pc_endTime'];
427 $date = $appointments[$i]['pc_eventDate'];
428 $provider_id = $appointments[$i]['uprovider_id'];
431 // find next appointment with the same provider
432 $next_appointment_date = 0;
433 $next_appointment_time = 0;
434 for ( $j = $i+1; $j < count( $appointments ); ++$j ) {
435 if ( $appointments[$j]['uprovider_id'] == $provider_id ) {
436 $next_appointment_date = $appointments[$j]['pc_eventDate'];
437 $next_appointment_time = $appointments[$j]['pc_startTime'];
438 break;
442 $same_day = ( strtotime( $next_appointment_date ) == strtotime( $date ) ) ? true : false;
444 if ( $next_appointment_time && $same_day ) {
445 // check the start time of the next appointment
447 $start_datetime = strtotime( $date." ".$start_time );
448 $next_appointment_datetime = strtotime( $next_appointment_date." ".$next_appointment_time );
449 $curr_time = $start_datetime;
450 while ( $curr_time < $next_appointment_datetime - (getSlotSize() / 2) ) {
451 //create a new appointment ever 15 minutes
452 $time = date( "H:i:s", $curr_time );
453 $available_slot = createAvailableSlot(
454 $appointments[$i]['pc_eventDate'],
455 $time,
456 $appointments[$i]['ufname'],
457 $appointments[$i]['ulname'],
458 $appointments[$i]['umname'] );
459 $availableSlots []= $available_slot;
460 $curr_time += getSlotSize(); // add a 15-minute slot
465 return $availableSlots;
468 function createAvailableSlot( $event_date, $start_time, $provider_fname, $provider_lname, $provider_mname = "", $cat_name = "Available" )
470 $newSlot = array();
471 $newSlot['ulname'] = $provider_lname;
472 $newSlot['ufname'] = $provider_fname;
473 $newSlot['umname'] = $provider_mname;
474 $newSlot['pc_eventDate'] = $event_date;
475 $newSlot['pc_startTime'] = $start_time;
476 $newSlot['pc_endTime'] = $start_time;
477 $newSlot['pc_catname'] = $cat_name;
478 return $newSlot;
481 function getCompareFunction( $code ) {
482 global $COMPARE_FUNCTION_HASH;
483 return $COMPARE_FUNCTION_HASH[$code];
486 function getComparisonOrder( $code ) {
487 global $ORDERHASH;
488 return $ORDERHASH[$code];
492 function sortAppointments( array $appointments, $orderBy = 'date' )
494 global $appointment_sort_order;
495 $appointment_sort_order = $orderBy;
496 usort( $appointments, "compareAppointments" );
497 return $appointments;
500 // cmp_function for usort
501 // The comparison function must return an integer less than, equal to,
502 // or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
503 function compareAppointments( $appointment1, $appointment2 )
505 global $appointment_sort_order;
506 $comparisonOrder = getComparisonOrder( $appointment_sort_order );
507 foreach ($comparisonOrder as $comparison) {
508 $cmp_function = getCompareFunction($comparison);
509 $result = $cmp_function($appointment1, $appointment2);
510 if (0 != $result) {
511 return $result;
515 return 0;
518 function compareBasic( $e1, $e2 )
520 if ( $e1 < $e2 ) {
521 return -1;
522 } else if ( $e1 > $e2 ) {
523 return 1;
526 return 0;
529 function compareAppointmentsByDate( $appointment1, $appointment2 )
531 $date1 = strtotime( $appointment1['pc_eventDate'] );
532 $date2 = strtotime( $appointment2['pc_eventDate'] );
534 return compareBasic( $date1, $date2 );
537 function compareAppointmentsByTime( $appointment1, $appointment2 )
539 $time1 = strtotime( $appointment1['pc_startTime'] );
540 $time2 = strtotime( $appointment2['pc_startTime'] );
542 return compareBasic( $time1, $time2 );
545 function compareAppointmentsByDoctorName( $appointment1, $appointment2 )
547 $name1 = $appointment1['ulname'];
548 $name2 = $appointment2['ulname'];
549 $cmp = compareBasic( $name1, $name2 );
550 if ( $cmp == 0 ) {
551 $name1 = $appointment1['ufname'];
552 $name2 = $appointment2['ufname'];
553 return compareBasic( $name1, $name2 );
556 return $cmp;
559 function compareAppointmentsByPatientName( $appointment1, $appointment2 )
561 $name1 = $appointment1['lname'];
562 $name2 = $appointment2['lname'];
563 $cmp = compareBasic( $name1, $name2 );
564 if ( $cmp == 0 ) {
565 $name1 = $appointment1['fname'];
566 $name2 = $appointment2['fname'];
567 return compareBasic( $name1, $name2 );
570 return $cmp;
573 function compareAppointmentsByType( $appointment1, $appointment2 )
575 $type1 = $appointment1['pc_catid'];
576 $type2 = $appointment2['pc_catid'];
577 return compareBasic( $type1, $type2 );
580 function compareAppointmentsByPatientId( $appointment1, $appointment2 )
582 $id1 = $appointment1['pubpid'];
583 $id2 = $appointment2['pubpid'];
584 return compareBasic( $id1, $id2 );
587 function compareAppointmentsByComment( $appointment1, $appointment2 )
589 $comment1 = $appointment1['pc_hometext'];
590 $comment2 = $appointment2['pc_hometext'];
591 return compareBasic( $comment1, $comment2 );
594 function compareAppointmentsByStatus( $appointment1, $appointment2 )
596 $status1 = $appointment1['pc_apptstatus'];
597 $status2 = $appointment2['pc_apptstatus'];
598 return compareBasic( $status1, $status2 );
601 function compareAppointmentsByTrackerStatus( $appointment1, $appointment2 )
603 $trackerstatus1 = $appointment1['status'];
604 $trackerstatus2 = $appointment2['status'];
605 return compareBasic( $trackerstatus1, $trackerstatus2 );
608 function compareAppointmentsByCompletedDrugScreen( $appointment1, $appointment2 )
610 $completed1 = $appointment1['drug_screen_completed'];
611 $completed2 = $appointment2['drug_screen_completed'];
612 return compareBasic( $completed1, $completed2 );
615 function fetchAppointmentCategories()
617 $catSQL= " SELECT pc_catid as id, pc_catname as category "
618 . " FROM openemr_postcalendar_categories WHERE pc_recurrtype=0 and pc_cattype=0";
619 if($GLOBALS['enable_group_therapy']) $catSQL .= " OR pc_cattype=3";
620 $catSQL .= " ORDER BY category";
621 return sqlStatement($catSQL);
624 function interpretRecurrence($recurr_freq, $recurr_type){
625 global $REPEAT_FREQ, $REPEAT_FREQ_TYPE, $REPEAT_ON_NUM, $REPEAT_ON_DAY;
626 $interpreted = "";
627 $recurr_freq = unserialize($recurr_freq);
628 if($recurr_type == 1){
629 $interpreted = $REPEAT_FREQ[$recurr_freq['event_repeat_freq']];
630 $interpreted .= " " . $REPEAT_FREQ_TYPE[$recurr_freq['event_repeat_freq_type']];
632 elseif($recurr_type == 2){
633 $interpreted = $REPEAT_FREQ[$recurr_freq['event_repeat_on_freq']];
634 $interpreted .= " " . $REPEAT_ON_NUM[$recurr_freq['event_repeat_on_num']];
635 $interpreted .= " " . $REPEAT_ON_DAY[$recurr_freq['event_repeat_on_day']];
637 elseif ($recurr_type == 3){
638 $interpreted = $REPEAT_FREQ[1];
639 $comma = "";
640 $day_arr = explode(",", $recurr_freq['event_repeat_freq']);
641 foreach ($day_arr as $day){
642 $interpreted .= $comma . " " . $REPEAT_ON_DAY[$day - 1];
643 $comma = ",";
648 return $interpreted;
651 function fetchRecurrences($pid){
652 $query = "SELECT pe.pc_title, pe.pc_endDate, pe.pc_recurrtype, pe.pc_recurrspec, pc.pc_catname FROM openemr_postcalendar_events AS pe "
653 . "JOIN openemr_postcalendar_categories AS pc ON pe.pc_catid=pc.pc_catid "
654 . "WHERE pe.pc_pid = ? AND pe.pc_recurrtype > 0;";
655 $sqlBindArray = array();
656 array_push($sqlBindArray, $pid);
657 $res = sqlStatement($query, $sqlBindArray);
658 $row = 0;
659 while($res_arr[$row] = sqlFetchArray($res)) {
660 $res_arr[$row]['pc_recurrspec'] = interpretRecurrence($res_arr[$row]['pc_recurrspec'], $res_arr[$row]['pc_recurrtype']);
661 $row++;
663 return $res_arr;
666 function ends_in_a_week($end_date){
667 $timestamp_in_a_week = strtotime('+7 day');
668 $timestamp_end_date = strtotime($end_date);
669 if($timestamp_in_a_week > $timestamp_end_date){
670 return true; //ends in a week
672 return false; // ends in more than a week
675 //Checks if recurrence is current (didn't end yet).
676 function recurrence_is_current($end_date){
677 $end_date_timestamp = strtotime($end_date);
678 $current_timestamp = time();
679 if($current_timestamp <= $end_date_timestamp){
680 return true; //recurrence is current
682 return false;