/**
 * Given an object containing all the necessary data,
 * (defined by the form in mod_form.php) this function
 * will update an existing instance with new data.
 *
 * @param object $adobeconnect An object from the form in mod_form.php
 * @return boolean Success/Fail
 */
function adobeconnect_update_instance($adobeconnect)
{
    global $DB;
    $adobeconnect->timemodified = time();
    $adobeconnect->id = $adobeconnect->instance;
    $aconnect = aconnect_login();
    $meetfldscoid = aconnect_get_folder($aconnect, 'meetings');
    // Look for meetings whose names are similar.
    $filter = array('filter-like-name' => $adobeconnect->name);
    $namematches = aconnect_meeting_exists($aconnect, $meetfldscoid, $filter);
    if (empty($namematches)) {
        $namematches = array();
    }
    // Find meeting URLs that are similar.
    $url = $adobeconnect->meeturl;
    $filter = array('filter-like-url-path' => $url);
    $urlmatches = aconnect_meeting_exists($aconnect, $meetfldscoid, $filter);
    if (empty($urlmatches)) {
        $urlmatches = array();
    } else {
        // Format url for comparison.
        if (false === strpos($url, '/') or 0 != strpos($url, '/')) {
            $url = '/' . $url;
        }
    }
    $url = adobeconnect_clean_meet_url($url);
    // Get all instances of the activity meetings.
    $param = array('instanceid' => $adobeconnect->instance);
    $grpmeetings = $DB->get_records('adobeconnect_meeting_groups', $param);
    if (empty($grpmeetings)) {
        $grpmeetings = array();
    }
    // If no errors then check to see if the updated name and URL are actually different.
    // If true, then update the meeting names and URLs now.
    $namechange = true;
    $urlchange = true;
    $timechange = true;
    // Look for meeting name change.
    foreach ($namematches as $match) {
        if (array_key_exists($match->scoid, $grpmeetings)) {
            if (0 == substr_compare($match->name, $adobeconnect->name . '_', 0, strlen($adobeconnect->name . '_'), false)) {
                // Break out of loop and change all referenced meetings.
                $namechange = false;
                break;
            } else {
                if (date('c', $adobeconnect->starttime) == $match->starttime) {
                    $timechange = false;
                    break;
                } else {
                    if (date('c', $adobeconnect->endtime) == $match->endtime) {
                        $timechange = false;
                        break;
                    }
                }
            }
        }
    }
    // Look for URL change.
    foreach ($urlmatches as $match) {
        if (array_key_exists($match->scoid, $grpmeetings)) {
            if (0 == substr_compare($match->url, $url . '_', 0, strlen($url . '_'), false)) {
                // Break out of loop and change all referenced meetings.
                $urlchange = false;
                break;
            } else {
                if (date('c', $adobeconnect->starttime) == $match->starttime) {
                    $timechange = false;
                    break;
                } else {
                    if (date('c', $adobeconnect->endtime) == $match->endtime) {
                        $timechange = false;
                        break;
                    }
                }
            }
        }
    }
    if ($timechange or $urlchange or $namechange) {
        $meetingobj = new stdClass();
        foreach ($grpmeetings as $grpmeeting) {
            $group = '';
            if ($adobeconnect->groupmode) {
                $group = groups_get_group($grpmeeting->groupid);
                $group = '_' . $group->name;
            }
            $meetingobj->scoid = $grpmeeting->meetingscoid;
            $meetingobj->name = $adobeconnect->name . $group;
            $meetingobj->starttime = date('c', $adobeconnect->starttime);
            $meetingobj->endtime = date('c', $adobeconnect->endtime);
            /* If the userid is not empty then set the meeting folder sco id to
               the user's connect folder.  If this line of code is not executed
               then user's meetings that were previously in the user's connect folder
               would be moved into the shared folder */
            if (!empty($adobeconnect->userid)) {
                $username = get_connect_username($adobeconnect->userid);
                $userfolder = aconnect_get_user_folder_sco_id($aconnect, $username);
                if (!empty($userfolder)) {
                    $meetfldscoid = $userfolder;
                }
            }
            // Update each meeting instance.
            if (!aconnect_update_meeting($aconnect, $meetingobj, $meetfldscoid)) {
                debugging('error updating meeting', DEBUG_DEVELOPER);
            }
            if (empty($adobeconnect->meetingpublic)) {
                aconnect_update_meeting_perm($aconnect, $grpmeeting->meetingscoid, ADOBE_MEETPERM_PRIVATE);
            } else {
                aconnect_update_meeting_perm($aconnect, $grpmeeting->meetingscoid, ADOBE_MEETPERM_PUBLIC);
            }
            // Update calendar event.
            $param = array('courseid' => $adobeconnect->course, 'instance' => $adobeconnect->id, 'groupid' => $grpmeeting->groupid, 'modulename' => 'adobeconnect');
            $eventid = $DB->get_field('event', 'id', $param);
            if (!empty($eventid)) {
                $event = new stdClass();
                $event->id = $eventid;
                $event->name = $meetingobj->name;
                $event->description = format_module_intro('adobeconnect', $adobeconnect, $adobeconnect->coursemodule);
                $event->courseid = $adobeconnect->course;
                $event->groupid = $grpmeeting->groupid;
                $event->userid = 0;
                $event->instance = $adobeconnect->id;
                $event->eventtype = 0 == $grpmeeting->groupid ? 'course' : 'group';
                $event->timestart = $adobeconnect->starttime;
                $event->timeduration = $adobeconnect->endtime - $adobeconnect->starttime;
                $event->visible = 1;
                $event->modulename = 'adobeconnect';
                $calendarevent = calendar_event::load($eventid);
                $calendarevent->update($event);
            }
        }
    }
    aconnect_logout($aconnect);
    return $DB->update_record('adobeconnect', $adobeconnect);
}
        }
    }
}
$aconnect = aconnect_login();
// Get the Meeting details.
$cond = array('instanceid' => $adobeconnect->id, 'groupid' => $groupid);
$scoid = $DB->get_field('adobeconnect_meeting_groups', 'meetingscoid', $cond);
$meetfldscoid = aconnect_get_folder($aconnect, 'meetings');
$filter = array('filter-sco-id' => $scoid);
if ($meeting = aconnect_meeting_exists($aconnect, $meetfldscoid, $filter)) {
    $meeting = current($meeting);
} else {
    /* First check if the module instance has a user associated with it
       if so, then check the user's adobe connect folder for existince of the meeting */
    if (!empty($adobeconnect->userid)) {
        $username = get_connect_username($adobeconnect->userid);
        $meetfldscoid = aconnect_get_user_folder_sco_id($aconnect, $username);
        $meeting = aconnect_meeting_exists($aconnect, $meetfldscoid, $filter);
        if (!empty($meeting)) {
            $meeting = current($meeting);
        }
    }
    // If meeting does not exist then display an error message.
    if (empty($meeting)) {
        $message = get_string('nomeeting', 'adobeconnect');
        echo $OUTPUT->notification($message);
        aconnect_logout($aconnect);
        die;
    }
}
aconnect_logout($aconnect);