private function _getMap($address = null, $gmapRegion = '', $width = '500px', $height = '500px', $gmapLib = 'http://maps.google.com/maps/api/js?sensor=false')
    {
        $googleMap = '';
        $gmapLocations = '';
        //-- Add google Map API
        if ($address) {
            include_once 'google_geoloc.class.inc';
            //-- Output the Address results
            if (class_exists("geoLocator") && $address) {
                //-- Split addresses for multiple points on the map
                $addressList = explode('|', $address);
                $mygeoloc = new geoLocator();
                $mygeoloc->region = $gmapRegion;
                //$mygeoloc->host = $this->config['GOOGLE_MAP_HOST'];
                //$mygeoloc->apikey = $this->config['GOOGLE_MAP_KEY'];
                //$mygeoloc->canvas = $this->config['mxcGoogleMapDisplayCanvasID'];
                //$mygeoloc->autofitmap = (count($addressList) > 1 ? true : false);
                foreach ($addressList as $loc) {
                    $mygeoloc->getGEO($loc);
                }
                $googleMap = '<div id="map_canvas" style="width:' . $width . '; height:' . $height . ';"></div>';
                $gmapLocations = $mygeoloc->mapJSv3;
            } else {
                $googleMap = 'No class found.';
            }
            return $googleMap . '<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
                        <script type="text/javascript">
                                // -- mxCalendar :: location map -- //
                                function initialize() {
                                    //' . $gmapLocations . '
                                };

                                if (window.attachEvent) {window.attachEvent(\'onload\', initialize);}
                                else if (window.addEventListener) {window.addEventListener(\'load\', initialize, false);}
                                else {document.addEventListener(\'load\', initialize, false);}

                        </script>';
        }
    }
        function MakeEventDetail($id, $param)
        {
            global $modx;
            $table = $modx->getFullTableName($this->tables['events']);
            $result = $modx->db->select('*', $table, 'id=' . $id);
            $eventSQL = 'SELECT *, (SELECT DATEDIFF(E.enddate, E.startdate)) as DurationDays, (SELECT TIMEDIFF(E.endtime, E.starttime)) as DurationTime
				FROM ' . $table . ' as E WHERE E.id=' . $id . ' LIMIT 1';
            $result = $modx->db->query($eventSQL);
            $content = $modx->db->makeArray($result);
            //-- OS Type check to switch varible for strftime()
            //$OS = $_SERVER['SERVER_SOFTWARE'];
            //echo '(#1038) OS TYPE => '.$OS.'<br />';
            $defaultParam = array('mxcTplEventDetail' => null, 'mxcDateTimeSeperator' => !empty($this->config['mxcDateTimeSeperator']) ? $this->config['mxcDateTimeSeperator'] : _mxCalendar_gl_datetimeseperator, 'mxcEventDetailBackBtnClass' => !empty($this->config['mxcEventDetailBackBtnClass']) ? $this->config['mxcEventDetailBackBtnClass'] : '', 'mxcEventDetailBackBtnTitle' => !empty($this->config['mxcEventDetailBackBtnTitle']) ? $this->config['mxcEventDetailBackBtnTitle'] : _mxCalendar_ed_backToCaltitle);
            $param = array_merge($defaultParam, $param);
            //-- Display back to calendar button
            if ((int) $param['mxcFullCalendarPgId'] == (int) $modx->documentIdentifier) {
                $backID = $param['mxcAjaxPageId'] != $param['mxcFullCalendarPgId'] && empty($param['mxcFullCalendarPgId']) ? $param['mxcAjaxPageId'] : $param['mxcFullCalendarPgId'];
                $modx->setPlaceholder('mxcEventDetailBackToCal', _mxCalendar_ed_backToCal);
                $modx->setPlaceholder('mxcEventDetailBackBtnURL', $modx->makeUrl((int) $backID));
                $modx->setPlaceholder('mxcEventDetailBackBtnClass', $param['mxcEventDetailBackBtnClass']);
                $modx->setPlaceholder('mxcEventDetailBackBtnTitle', $param['mxcEventDetailBackBtnTitle']);
            } else {
                $modx->setPlaceholder('mxcEventDetailBackToCal', '');
            }
            //-- Parse through returned results and format for UI
            if ($modx->db->getRecordCount($result)) {
                foreach ($content as $p_val) {
                    //-- Build the reoccurring date output list
                    $dateList = array();
                    if (!empty($p_val['repeat'])) {
                        $dates = explode(',', $p_val['repeat']);
                        $subDateX = 0;
                        foreach ($dates as $o) {
                            $dateList[] = strftime(_mxCalendar_ed_dateformat, mktime(date('H', strtotime($p_val['start'])), date('i', strtotime($p_val['start'])), 0, date('m', strtotime($o)), date('d', strtotime($o)), date('y', strtotime($o)))) . $param['mxcDateTimeSeperator'] . ($p_val['DurationDays'] ? strftime(_mxCalendar_ed_dateformat, mktime(date('H', strtotime($p_val['end'])), date('i', strtotime($p_val['end'])), 0, date('m', strtotime($o)), date('d', strtotime($o)) + (int) $p_val['DurationDays'], date('y', strtotime($o)))) : strftime(_mxCalendar_ed_dateformat, mktime(date('H', strtotime($p_val['end'])), date('i', strtotime($p_val['end'])), 0, date('m', strtotime($o)), date('d', strtotime($o)), date('y', strtotime($o)))));
                            $subDateX++;
                        }
                        //-- Strikeout past date times
                        $datetime_now = date(_mxCalendar_ed_dateformat);
                        $str_dates = '';
                        foreach ($dateList as $d) {
                            $str_dates .= $d > $datetime_now ? '<li style="text-decoration:line-through;color:red;">' . $d . '</li>' : $d;
                        }
                        $str_repeatDates = count($dateList) && $this->config['eventlist_multiday'] ? "<span ='mxcRepeatEventItem'>" . $str_dates . implode('<br />', $dateList) . "</span>" : '';
                        //-- Display only the selected event occurance date/time value
                        $str_repeatDates = $dates[$param['r']];
                    }
                    //-- Parse Event Detail Template
                    if (!empty($param['mxcTplEventDetail'])) {
                        //--Get user modified theme over-ride
                        $this->output = $modx->getChunk($param['mxcTplEventDetail']);
                    } else {
                        //--Get the theme details view
                        $this->output = $this->_getTheme('event.detail', $this->config['mxCalendarTheme']);
                    }
                    //-- Setup the title link check
                    $title = !empty($p_val['link']) ? is_numeric($p_val['link']) ? $modx->makeUrl((int) $p_val['link']) : '<a href="' . $p_val['link'] . '" rel="' . $p_val['linkrel'] . '" target="' . $p_val['linktarget'] . '">' . $p_val['title'] . '</a>' : $p_val['title'];
                    //-- Add google Map API
                    if ($p_val['location'] && $p_val['displayGoogleMap']) {
                        include_once $modx->config['base_path'] . 'assets/modules/mxCalendar/includes/google_geoloc.class.inc';
                        //-- Output the Address results
                        if (class_exists("geoLocator") && $p_val['location']) {
                            //-- Split addresses for multiple points on the map
                            $addressList = explode('|', $p_val['location']);
                            $mygeoloc = new geoLocator();
                            $mygeoloc->host = $this->config['GOOGLE_MAP_HOST'];
                            $mygeoloc->apikey = $this->config['GOOGLE_MAP_KEY'];
                            $mygeoloc->canvas = $this->config['mxcGoogleMapDisplayCanvasID'];
                            $mygeoloc->autofitmap = count($addressList) > 1 ? true : false;
                            foreach ($addressList as $loc) {
                                $mygeoloc->getGEO($loc);
                            }
                            $googleMap = '';
                            //-- Build Google MAP JS Section
                            if ($param['ajaxPageId'] != $modx->documentIdentifier && (int) $param['ajaxPageId'] !== 0) {
                                $googleMap = '<div id="' . $this->config['mxcGoogleMapDisplayCanvasID'] . '" style="width: ' . $this->config['mxcGoogleMapDisplayWidth'] . '; height: ' . $this->config['mxcGoogleMapDisplayHeigh'] . '"><img src="/blank.gif" alt="" onload="initialize();" /></div>';
                                if ($this->config['mxcGoogleMapDisplayLngLat']) {
                                    $googleMap .= $mygeoloc->output;
                                }
                                $this->_addGoogleMapJS($mygeoloc->mapJSv3, true);
                            } else {
                                $googleMap = '<div id="' . $this->config['mxcGoogleMapDisplayCanvasID'] . '" style="width: ' . $this->config['mxcGoogleMapDisplayWidth'] . '; height: ' . $this->config['mxcGoogleMapDisplayHeigh'] . ';"><img src="/blank.gif" alt="" onload="initialize();" /></div>';
                                if ($this->config['mxcGoogleMapDisplayLngLat']) {
                                    $googleMap .= $mygeoloc->output;
                                }
                                $googleMap .= $this->_addGoogleMapJS($mygeoloc->mapJSv3, null, true);
                            }
                        } else {
                            echo 'No class found.';
                        }
                    }
                    //-- Adjust Repeat Date Value r0.0.6
                    if (isset($_REQUEST['r']) && !empty($_REQUEST['r'])) {
                    }
                    //-- Replace placeholders w/UI values
                    $modx->setPlaceholder('mxcEventDetailId', $this->config['mxcEventDetailId']);
                    $modx->setPlaceholder('mxcEventDetailClass', $this->config['mxcEventDetailClass']);
                    $modx->setPlaceholder('mxcEventDetailTitle', $title);
                    $modx->setPlaceholder('mxcEventDetailLabelDateTime', $this->config['mxcEventDetailLabelDateTime'] ? $this->config['mxcEventDetailLabelDateTime'] : _mxCalendar_ed_dt);
                    $modx->setPlaceholder('mxcEventDetailDateTimeSeperator', $param['mxcDateTimeSeperator']);
                    $modx->setPlaceholder('mxcEventDetailStartDateTime', strftime(isset($param['mxcStartDateFormat']) ? $param['mxcStartDateFormat'] : _mxCalendar_ed_start_dateformat, strtotime(isset($_REQUEST['r']) && $_REQUEST['r'] != "" ? $dates[$_REQUEST['r']] . ' ' . $p_val['starttime'] : $p_val['start'])));
                    $modx->setPlaceholder('mxcEventDetailEndDateTime', strftime(isset($param['mxcEndDateFormat']) ? $param['mxcEndDateFormat'] : _mxCalendar_ed_end_dateformat, strtotime(isset($_REQUEST['r']) && $_REQUEST['r'] != "" ? $dates[$_REQUEST['r']] . ' ' . $p_val['endtime'] : $p_val['end'])));
                    $modx->setPlaceholder('mxcEventDetailDateTimeReoccurrences', $str_repeatDates);
                    $modx->setPlaceholder('mxcEventDetailLabelLocation', $p_val['location'] ? $this->config['mxcEventDetailLabelLocation'] ? $this->config['mxcEventDetailLabelLocation'] : _mxCalendar_ed_location : '');
                    $modx->setPlaceholder('mxcEventDetailLocation', str_replace('|', '<br />', $p_val['location']));
                    $modx->setPlaceholder('mxcEventDetailDescription', $p_val['description']);
                    $modx->setPlaceholder('mxcEventDetailGoogleMap', $googleMap);
                    /** START THE CUSTOM FIELDs **/
                    $EventArr_cft = array();
                    $cft_event = json_decode($p_val['customFields'], true);
                    $dyn_config_opts = json_decode($this->config['mxcCustomFieldTypes'], true);
                    $dyn_resource_opts = array();
                    //-- Grab the "resource" field type to get the TV's that should be used
                    if ($dyn_config_opts) {
                        foreach ($dyn_config_opts as $cft) {
                            $cft_type = $cft['type'];
                            if ($cft_type == 'resource') {
                                $dyn_resource_opts[$cft['name']] = $cft['options'];
                            }
                        }
                        //-- end loop of custom field types
                    }
                    //-- Loop through the custom fields
                    if (count($cft_event)) {
                        foreach ($cft_event as $l => $v) {
                            switch ($v['type']) {
                                default:
                                    $modx->setPlaceholder('mxc' . $l, $v['val']);
                                    break;
                                case 'image':
                                    $modx->setPlaceholder('mxc' . $l, '<img src="' . $v['val'] . '" alt="" />');
                                    break;
                                case 'resource':
                                    //-- Get the TV's as set in the options for the resource in the configuration tab of mxCalendar
                                    if (!empty($dyn_resource_opts[$l])) {
                                        $tvVals = $modx->getTemplateVarOutput(explode(',', $dyn_resource_opts[$l]), (int) $v['val'], 1);
                                        if (count($tvVals) && is_array($tvVals)) {
                                            foreach ($tvVals as $k => $tvVal) {
                                                $modx->setPlaceholder('mxc' . $k, $tvVal);
                                            }
                                        }
                                    }
                                    //-- Get predefined document values to use in mxCalendar
                                    $array_doc = $modx->getPageInfo((int) $v['val'], 1, 'pagetitle, description, alias, content');
                                    $modx->setPlaceholder('mxcpagetitle', $array_doc['pagetitle']);
                                    $modx->setPlaceholder('mxcdescription', $array_doc['description']);
                                    $modx->setPlaceholder('mxcalias', $array_doc['alias']);
                                    $modx->setPlaceholder('mxccontent', $array_doc['content']);
                                    $modx->setPlaceholder('mxc' . $l, $v['val']);
                                    break;
                            }
                        }
                    }
                    /** END THE CUSTOM FIELDs **/
                    // event date start
                    $modx->setPlaceholder('mxcEventDetailStateDateStamp', $param['mxcEventDetailStateDateStamp'] ? strftime($param['mxcEventDetailStateDateStamp'], strtotime($p_val['start'])) : $p_val['start']);
                    // event time end
                    $modx->setPlaceholder('mxcEventDetailStateTimeStamp', $param['mxcEventDetailStateTimeStamp'] ? strftime($param['mxcEventDetailStateTimeStamp'], strtotime($p_val['start'])) : $p_val['start']);
                    // event date end
                    $modx->setPlaceholder('mxcEventDetailEndDateStamp', $param['mxcEventDetailEndDateStamp'] ? strftime($param['mxcEventDetailEndDateStamp'], strtotime($p_val['end'])) : $p_val['end']);
                    // event time end
                    $modx->setPlaceholder('mxcEventDetailEndTimeStamp', $param['mxcEventDetailEndTimeStamp'] ? strftime($param['mxcEventDetailEndTimeStamp'], strtotime($p_val['end'])) : $p_val['end']);
                }
                //end loop
            }
            if (!empty($this->config["mxCalendarTheme"])) {
                $activeTheme = $this->_getActiveTheme();
                $this->_addCSS('<link rel="stylesheet" type="text/css" href="assets/modules/mxCalendar/themes/' . $this->config['mxCalendarTheme'] . '/' . $activeTheme["themecss"] . '" /> ');
            }
            if ($param['mxcAddMooJS'] || $param['mxcJSCodeLibrary']) {
                $this->_addMooJS();
            }
            return $this->output;
        }