/**
     * rank
     * 
     *	@access		public
     *	@return		string 	tagdata
     */
    public function rank()
    {
        $entry_id = '';
        $cat_id = '';
        $dynamic = !$this->check_no(ee()->TMPL->fetch_param('dynamic'));
        // -------------------------------------------
        //  Grab entries
        // -------------------------------------------
        $sql = "FROM  \t\t{$this->sc->db->channel_titles} AS t\r\n\t\t\t\t   LEFT JOIN \t{$this->sc->db->channels} as c \r\n\t\t\t\t   ON \t\t\tc.{$this->sc->db->channel_id} = t.{$this->sc->db->channel_id}";
        if (ee()->TMPL->fetch_param('category') or $cat_id != '' and $dynamic) {
            $sql .= " LEFT JOIN \texp_category_posts \r\n\t\t\t \t\t\t ON \t\tt.entry_id = exp_category_posts.entry_id\r\n\t\t\t\t\t\t LEFT JOIN \texp_categories \r\n\t\t\t\t\t\t ON \t\texp_category_posts.cat_id = exp_categories.cat_id";
        }
        $sql .= " WHERE \tt.site_id \r\n\t\t\t\t\t IN \t('" . implode("','", ee()->TMPL->site_ids) . "') ";
        // -------------------------------------------
        //	Yes, One Could Potentially Show Nothing...
        // -------------------------------------------
        if (!$this->check_yes(ee()->TMPL->fetch_param('show_unfavorited'))) {
            $sql .= " AND (t.favorites_count_public != 0 \r\n\t\t\t\t\t\t AND t.favorites_count_public != '') ";
        }
        if ($this->check_no(ee()->TMPL->fetch_param('show_favorites'))) {
            $sql .= " AND (t.favorites_count_public = 0 OR t.favorites_count_public = '') ";
        }
        if (ee()->TMPL->fetch_param('favorites_start_on') !== FALSE or ee()->TMPL->fetch_param('favorites_stop_before') !== FALSE) {
            $asql = "SELECT DISTINCT \tentry_id\r\n\t\t\t\t\t   FROM \t\t\texp_favorites\r\n\t\t\t\t\t   WHERE \t\t\tsite_id \r\n\t\t\t\t\t   IN \t\t\t\t('" . implode("','", ee()->TMPL->site_ids) . "')";
            if (ee()->TMPL->fetch_param('favorites_start_on')) {
                $asql .= " AND exp_favorites.entry_date >= '" . ee()->localize->convert_human_date_to_gmt(ee()->TMPL->fetch_param('favorites_start_on')) . "' ";
            }
            if (ee()->TMPL->fetch_param('favorites_stop_before')) {
                $asql .= " AND exp_favorites.entry_date < '" . ee()->localize->convert_human_date_to_gmt(ee()->TMPL->fetch_param('favorites_stop_before')) . "' ";
            }
            $aquery = ee()->db->query($asql);
            if ($aquery->num_rows() == 0) {
                return $this->no_results();
            }
            $entries = array();
            foreach ($aquery->result_array() as $row) {
                $entries[] = $row['entry_id'];
            }
            $sql .= " AND t.entry_id IN ('" . implode("','", $entries) . "')";
            unset($aquery);
            unset($entries);
        }
        // -------------------------------------------
        //	We only select un-expired entries
        // -------------------------------------------
        $timestamp = ee()->TMPL->cache_timestamp != '' ? ee()->TMPL->cache_timestamp : ee()->localize->now;
        if (!$this->check_yes(ee()->TMPL->fetch_param('show_future_entries'))) {
            $sql .= " AND t.entry_date < " . $timestamp . " ";
        }
        if (!$this->check_yes(ee()->TMPL->fetch_param('show_expired'))) {
            $sql .= " AND (t.expiration_date = 0 || t.expiration_date > " . $timestamp . ") ";
        }
        // -------------------------------------------
        // Limit to/exclude specific weblogs
        // -------------------------------------------
        if ($channel = ee()->TMPL->fetch_param($this->sc->channel)) {
            $xql = "SELECT \t{$this->sc->db->channel_id} \r\n\t\t\t\t    FROM \t{$this->sc->db->channels} \r\n\t\t\t\t\tWHERE \tsite_id \r\n\t\t\t\t\tIN \t\t('" . implode("','", ee()->db->escape_str(ee()->TMPL->site_ids)) . "') ";
            $xql .= ee()->functions->sql_andor_string($channel, $this->sc->db->channel_name);
            $query = ee()->db->query($xql);
            if ($query->num_rows() == 0) {
                return $this->no_results();
            } else {
                if ($query->num_rows() == 1) {
                    $sql .= "AND t.{$this->sc->db->channel_id} = '" . $query->row($this->sc->db->channel_id) . "' ";
                } else {
                    $sql .= "AND (";
                    foreach ($query->result_array() as $row) {
                        $sql .= "t.{$this->sc->db->channel_id} = '" . $row[$this->sc->db->channel_id] . "' OR ";
                    }
                    $sql = substr($sql, 0, -3);
                    $sql .= ") ";
                }
            }
        }
        // -------------------------------------------
        //  Limit query by category
        // -------------------------------------------
        if (ee()->TMPL->fetch_param('category')) {
            $sql .= ee()->functions->sql_andor_string(ee()->TMPL->fetch_param('category'), 'exp_categories.cat_id') . " ";
        } else {
            if ($cat_id != '' and $dynamic) {
                $sql .= " AND exp_categories.cat_id = '" . ee()->db->escape_str($cat_id) . "' ";
            }
        }
        // -------------------------------------------
        //	Add status declaration
        // -------------------------------------------
        if ($status = ee()->TMPL->fetch_param('status')) {
            $status = str_replace('Open', 'open', $status);
            $status = str_replace('Closed', 'closed', $status);
            $sstr = ee()->functions->sql_andor_string($status, 't.status');
            if (!stristr($sstr, "'closed'")) {
                $sstr .= " AND t.status != 'closed' ";
            }
            $sql .= $sstr;
        } else {
            $sql .= "AND t.status = 'open' ";
        }
        // -------------------------------------------
        //	Limit by number of hours
        // -------------------------------------------
        if ($days = ee()->TMPL->fetch_param('hours')) {
            $time = ee()->localize->now - $days * 60 * 60;
            $sql .= " AND t.entry_date > {$time}";
        }
        // -------------------------------------------
        //	Order by
        // -------------------------------------------
        if (ee()->TMPL->fetch_param('orderby') == 'random') {
            $sql .= " ORDER BY rand()";
        } else {
            $sql .= " ORDER BY count DESC";
        }
        // ----------------------------------------
        //  Pagination!
        // ----------------------------------------
        if (is_numeric(ee()->TMPL->fetch_param('limit'))) {
            $this->p_limit = ee()->TMPL->fetch_param('limit');
        }
        // ----------------------------------------
        //  Favorites Date Required for Ordering?
        // ----------------------------------------
        $sort = in_array(strtoupper(ee()->TMPL->fetch_param('sort')), array('DESC', 'ASC')) ? strtoupper(ee()->TMPL->fetch_param('sort')) : 'DESC';
        if (ee()->TMPL->fetch_param('orderby') == 'favorites_date') {
            $sql = preg_replace("/ORDER BY.+?(LIMIT|\$)/is", "ORDER BY favorites_date " . $sort . ' \\1', $sql);
            $ugh = !$this->check_yes(ee()->TMPL->fetch_param('show_unfavorited')) ? 'INNER' : 'LEFT';
            $sql = preg_replace("/LEFT JOIN\\s+{$this->sc->db->channels}/is", "{$ugh} JOIN \texp_favorites AS f \r\n\t\t\t\t ON \t\t\t(t.entry_id = f.entry_id\r\n        \t\t AND \t\t\tf.favorites_id \r\n\t\t\t\t IN\t\t\t\t(SELECT MAX(favorites_id) FROM exp_favorites GROUP BY entry_id))\r\n        \t\t LEFT JOIN \t\t{$this->sc->db->channels}", $sql);
        }
        // -------------------------------------------
        //	Run query
        // -------------------------------------------
        $orderby = ee()->TMPL->fetch_param('orderby') != '' ? ee()->TMPL->fetch_param('orderby') : 'count';
        if ($orderby == 'favorites_date') {
            $query = ee()->db->query('SELECT t.entry_id, 
						f.entry_date AS favorites_date, 
						t.favorites_count_public AS count ' . $sql);
        } else {
            $query = ee()->db->query('SELECT t.entry_id, 
						t.favorites_count_public AS count ' . $sql);
        }
        // -------------------------------------------
        //	Create entries array
        // -------------------------------------------
        $entries = array();
        if ($query->num_rows() == 0) {
            return $this->no_results();
        } else {
            foreach ($query->result_array() as $row) {
                $entries[] = $row['entry_id'];
            }
            // -------------------------------------------
            //  Pass params
            // -------------------------------------------
            ee()->TMPL->tagparams['entry_id'] = implode("|", $entries);
            if ($orderby == 'favorites_date' or $orderby == 'count') {
                if ($sort == 'ASC') {
                    $entries = array_reverse($entries);
                }
                ee()->TMPL->tagparams['fixed_order'] = implode("|", $entries);
            }
            ee()->TMPL->tagparams['sort'] = $sort;
        }
        // -------------------------------------------
        //  Invoke weblog class
        // -------------------------------------------
        if (APP_VER < 2.0) {
            if (!class_exists('Weblog')) {
                require PATH_MOD . '/weblog/mod.weblog' . EXT;
            }
            $channel = new Weblog();
        } else {
            if (!class_exists('Channel')) {
                require PATH_MOD . '/channel/mod.channel' . EXT;
            }
            $channel = new Channel();
        }
        // --------------------------------------------
        //  Invoke Pagination for EE 2.4 and Above
        // --------------------------------------------
        if (APP_VER >= '2.4.0') {
            ee()->load->library('pagination');
            $channel->pagination = new Pagination_object('Channel');
            // Used by pagination to determine whether we're coming from the cache
            $channel->pagination->dynamic_sql = FALSE;
        }
        // ----------------------------------------
        //  Pre-process related data
        // ----------------------------------------
        //	TMPL class is coded so that only
        //	one method in the weblog class and one
        //	method in the search class are allowed
        //	to parse related entries tags. This is
        //	no doubt for performance reasons.
        // ----------------------------------------
        ee()->TMPL->tagdata = ee()->TMPL->assign_relationship_data(ee()->TMPL->tagdata);
        ee()->TMPL->var_single = array_merge(ee()->TMPL->var_single, ee()->TMPL->related_markers);
        // ----------------------------------------
        //  Execute needed methods
        // ----------------------------------------
        if (APP_VER < 2.0) {
            $channel->fetch_custom_weblog_fields();
        } else {
            $channel->fetch_custom_channel_fields();
        }
        $channel->fetch_custom_member_fields();
        // --------------------------------------------
        //  Pagination Tags Parsed Out
        // --------------------------------------------
        if (APP_VER >= '2.4.0') {
            $channel->pagination->get_template();
        } else {
            $channel->fetch_pagination_data();
        }
        //	----------------------------------------
        //	 Build Weblog Data Query
        //	----------------------------------------
        $channel->build_sql_query();
        // --------------------------------------------
        //  Transfer Pagination Variables Over to Channel object
        //	- Has to go after the building of the query as EE 2.4 does its Pagination work in there
        // --------------------------------------------
        if (APP_VER >= '2.4.0') {
            $transfer = array('paginate' => 'paginate', 'total_pages' => 'total_pages', 'current_page' => 'current_page', 'offset' => 'offset', 'page_next' => 'page_next', 'page_previous' => 'page_previous', 'page_links' => 'pagination_links', 'total_rows' => 'total_rows', 'per_page' => 'per_page', 'per_page' => 'p_limit', 'offset' => 'p_page');
            foreach ($transfer as $from => $to) {
                $channel->{$to} = $channel->pagination->{$from};
            }
        }
        //	----------------------------------------
        //	Empty?
        //	----------------------------------------
        if (trim($channel->sql) == '') {
            if ($this->check_yes(ee()->TMPL->fetch_param('favorites_count'))) {
                return $this->return_data = str_replace(LD . 'favorites_count' . RD, '0', ee()->TMPL->tagdata);
            } else {
                return $this->no_results();
            }
        }
        // ----------------------------------------
        //  Pagination
        // ----------------------------------------
        $query = ee()->db->query(preg_replace("/SELECT(.*?)\\s+FROM\\s+/is", 'SELECT COUNT(*) AS count FROM ', $channel->sql));
        $this->total_rows = $query->row('count');
        //pagination request but no entries?
        if ($query->row('count') == 0 and strpos(ee()->TMPL->tagdata, 'paginate') !== FALSE) {
            return $this->no_results();
        }
        //$sql_remove = 'SELECT t.entry_id ';
        //get pagination info
        $pagination_data = $this->universal_pagination(array('sql' => $channel->sql, 'total_results' => $this->total_rows, 'tagdata' => ee()->TMPL->tagdata, 'limit' => $this->p_limit, 'uri_string' => ee()->uri->uri_string, 'current_page' => $this->current_page));
        //if we paginated, sort the data
        if ($pagination_data['paginate'] === TRUE) {
            $this->paginate = $pagination_data['paginate'];
            $this->page_next = $pagination_data['page_next'];
            $this->page_previous = $pagination_data['page_previous'];
            $this->p_page = $pagination_data['pagination_page'];
            $this->current_page = $pagination_data['current_page'];
            $channel->sql = str_replace($sql_remove, '', $pagination_data['sql']);
            $this->pagination_links = $pagination_data['pagination_links'];
            $this->basepath = $pagination_data['base_url'];
            $this->total_pages = $pagination_data['total_pages'];
            $this->paginate_data = $pagination_data['paginate_tagpair_data'];
            ee()->TMPL->tagdata = $pagination_data['tagdata'];
        } else {
            $channel->sql .= " LIMIT " . $this->p_limit;
        }
        //	----------------------------------------
        //	 Favorites Specific Rewrites!
        //	----------------------------------------
        if ($this->check_yes(ee()->TMPL->fetch_param('favorites_count'))) {
            /*$query = ee()->db->query(
            			preg_replace(
            				"/SELECT(.*?)\s+FROM\s+/is", 
            				'SELECT COUNT(*) AS count FROM ', 
            				$channel->sql
            			)
            		);*/
            return $this->return_data = str_replace(LD . 'favorites_count' . RD, $this->total_rows, ee()->TMPL->tagdata);
        }
        //	----------------------------------------
        //	 Favorites date
        //	----------------------------------------
        if (stristr(ee()->TMPL->tagdata, LD . 'favorites_date ') or ee()->TMPL->fetch_param('orderby') == 'favorites_date') {
            $channel->favorites_date = TRUE;
            $channel->sql = preg_replace("/\\s+FROM\\s+/s", ", f.entry_date AS favorites_date FROM ", ltrim($channel->sql));
            $channel->sql = preg_replace("/LEFT JOIN\\s+{$this->sc->db->channels}/is", "LEFT JOIN \texp_favorites AS f \r\n\t\t\t\t ON \t\t(t.entry_id = f.entry_id\r\n\t\t\t\t AND \t\tf.favorites_id \r\n\t\t\t\t IN \t\t(SELECT MAX(favorites_id) FROM exp_favorites GROUP BY entry_id))\r\n        \t\t LEFT JOIN \t{$this->sc->db->channels}", $channel->sql);
        }
        $channel->query = ee()->db->query($channel->sql);
        if (APP_VER < 2.0) {
            $channel->query->result = $channel->query->result_array();
        }
        //	----------------------------------------
        //	Empty?
        //	----------------------------------------
        if (!isset($channel->query) or $channel->query->num_rows() == 0) {
            return $this->no_results();
        }
        //	----------------------------------------
        //	typography
        //	----------------------------------------
        if (APP_VER < 2.0) {
            if (!class_exists('Typography')) {
                require PATH_CORE . 'core.typography' . EXT;
            }
            $channel->TYPE = new Typography();
            $channel->TYPE->convert_curly = FALSE;
        } else {
            ee()->load->library('typography');
            ee()->typography->initialize();
            ee()->typography->convert_curly = FALSE;
        }
        $channel->fetch_categories();
        // ----------------------------------------
        //  Parse and return entry data
        // ----------------------------------------
        if (APP_VER < 2.0) {
            $channel->parse_weblog_entries();
        } else {
            $channel->parse_channel_entries();
        }
        // --------------------------------------------
        //  Render the Pagination Data
        // --------------------------------------------
        if (APP_VER >= '2.4.0') {
            $channel->return_data = $channel->pagination->render($channel->return_data);
        } else {
            $channel->add_pagination_data();
        }
        // --------------------------------------------
        //  Reverse and Related Entries
        // --------------------------------------------
        if (count(ee()->TMPL->related_data) > 0 and count($channel->related_entries) > 0) {
            $channel->parse_related_entries();
        }
        if (count(ee()->TMPL->reverse_related_data) > 0 and count($channel->reverse_related_entries) > 0) {
            $channel->parse_reverse_related_entries();
        }
        // ----------------------------------------
        //  Handle problem with pagination segments
        //	in the url
        // ----------------------------------------
        if (preg_match("#(/P\\d+)#", ee()->uri->uri_string, $match)) {
            $channel->return_data = str_replace($match['1'], "", $channel->return_data);
        } elseif (preg_match("#(P\\d+)#", ee()->uri->uri_string, $match)) {
            $channel->return_data = str_replace($match['1'], "", $channel->return_data);
        }
        // ----------------------------------------
        //  Pagination Replace
        // ----------------------------------------
        if ($this->paginate == TRUE) {
            $this->paginate_data = str_replace(LD . 'current_page' . RD, $this->current_page, $this->paginate_data);
            $this->paginate_data = str_replace(LD . 'total_pages' . RD, $this->total_pages, $this->paginate_data);
            $this->paginate_data = str_replace(LD . 'pagination_links' . RD, $this->pagination_links, $this->paginate_data);
            if (preg_match("/" . LD . "if previous_page" . RD . "(.+?)" . LD . preg_quote(T_SLASH, '/') . "if" . RD . "/s", $this->paginate_data, $match)) {
                if ($this->page_previous == '') {
                    $this->paginate_data = preg_replace("/" . LD . "if previous_page" . RD . ".+?" . LD . preg_quote(T_SLASH, '/') . "if" . RD . "/s", '', $this->paginate_data);
                } else {
                    $match['1'] = preg_replace("/" . LD . 'path.*?' . RD . "/", $this->page_previous, $match['1']);
                    $match['1'] = preg_replace("/" . LD . 'auto_path' . RD . "/", $this->page_previous, $match['1']);
                    $this->paginate_data = str_replace($match['0'], $match['1'], $this->paginate_data);
                }
            }
            if (preg_match("/" . LD . "if next_page" . RD . "(.+?)" . LD . preg_quote(T_SLASH, '/') . "if" . RD . "/s", $this->paginate_data, $match)) {
                if ($this->page_next == '') {
                    $this->paginate_data = preg_replace("/" . LD . "if next_page" . RD . ".+?" . LD . preg_quote(T_SLASH, '/') . "if" . RD . "/s", '', $this->paginate_data);
                } else {
                    $match['1'] = preg_replace("/" . LD . 'path.*?' . RD . "/", $this->page_next, $match['1']);
                    $match['1'] = preg_replace("/" . LD . 'auto_path' . RD . "/", $this->page_next, $match['1']);
                    $this->paginate_data = str_replace($match['0'], $match['1'], $this->paginate_data);
                }
            }
            $position = !ee()->TMPL->fetch_param('paginate') ? '' : ee()->TMPL->fetch_param('paginate');
            switch ($position) {
                case "top":
                    $channel->return_data = $this->paginate_data . $channel->return_data;
                    break;
                case "both":
                    $channel->return_data = $this->paginate_data . $channel->return_data . $this->paginate_data;
                    break;
                default:
                    $channel->return_data .= $this->paginate_data;
                    break;
            }
        }
        $tagdata = $channel->return_data;
        return $tagdata;
    }
示例#2
0
 /** ----------------------------------------
 	/**  Show search results
 	/** ----------------------------------------*/
 function search_results()
 {
     // Fetch the search language file
     ee()->lang->loadfile('search');
     // Load Pagination Object
     ee()->load->library('pagination');
     $pagination = ee()->pagination->create();
     ee()->TMPL->tagdata = $pagination->prepare(ee()->TMPL->tagdata);
     // Check search ID number
     // If the QSTR variable is less than 32 characters long we
     // don't have a valid search ID number
     if (strlen(ee()->uri->query_string) < 32) {
         return ee()->output->show_user_error('off', array(lang('search_no_result')));
     }
     // Clear old search results
     ee()->db->delete('search', array('site_id' => ee()->config->item('site_id'), 'search_date <' => ee()->localize->now - $this->cache_expire * 3600));
     // Retrieve the search_id
     $qstring = explode('/', ee()->uri->query_string);
     $search_id = trim($qstring[0]);
     // Fetch the cached search query
     $query = ee()->db->get_where('search', array('search_id' => $search_id));
     if ($query->num_rows() == 0 or $query->row('total_results') == 0) {
         // This should be impossible as we already know there are results
         return ee()->output->show_user_error('general', array(lang('invalid_action')));
     }
     $fields = $query->row('custom_fields') == '' ? array() : unserialize(stripslashes($query->row('custom_fields')));
     $sql = unserialize(stripslashes($query->row('query')));
     $sql = str_replace('MDBMPREFIX', 'exp_', $sql);
     $pagination->per_page = (int) $query->row('per_page');
     $res_page = $query->row('result_page');
     // -------------------------------------------
     // 'channel_search_modify_result_query' hook.
     //  - Take the whole query string, do what you wish
     //  - added 2.8
     //
     if (ee()->extensions->active_hook('channel_search_modify_result_query') === TRUE) {
         $modified_sql = ee()->extensions->call('channel_search_modify_result_query', $sql, $search_id);
         // Make sure its valid
         if (is_string($modified_sql) && $modified_sql != '') {
             $sql = $modified_sql;
         }
     }
     //
     // -------------------------------------------
     // Run the search query
     $query = ee()->db->query(preg_replace("/SELECT(.*?)\\s+FROM\\s+/is", 'SELECT COUNT(*) AS count FROM ', $sql));
     if ($query->row('count') == 0) {
         // This should also be impossible
         return ee()->output->show_user_error('general', array(lang('invalid_action')));
     }
     // Calculate total number of pages and add total rows
     $pagination->total_items = $query->row('count');
     // Build pagination if enabled
     // If we're paginating limit the query and do it again
     if ($pagination->paginate === TRUE) {
         $pagination->build($pagination->total_items, $pagination->per_page);
         $sql .= " LIMIT " . $pagination->offset . ", " . $pagination->per_page;
     } else {
         $sql .= " LIMIT 0, 100";
     }
     $query = ee()->db->query($sql);
     $output = '';
     if (!class_exists('Channel')) {
         require PATH_ADDONS . 'channel/mod.channel.php';
     }
     unset(ee()->TMPL->var_single['auto_path']);
     unset(ee()->TMPL->var_single['excerpt']);
     unset(ee()->TMPL->var_single['id_auto_path']);
     unset(ee()->TMPL->var_single['full_text']);
     unset(ee()->TMPL->var_single['switch']);
     foreach (ee()->TMPL->var_single as $key => $value) {
         if (substr($key, 0, strlen('member_path')) == 'member_path') {
             unset(ee()->TMPL->var_single[$key]);
         }
     }
     $switch = ee()->TMPL->fetch_param('switch');
     if (!empty($switch) && strpos(ee()->TMPL->tagdata, '{switch}') !== FALSE) {
         ee()->TMPL->tagdata = str_replace("{switch}", "{switch='{$switch}'}", ee()->TMPL->tagdata);
         ee()->load->library('logger');
         ee()->logger->developer('The search module\'s {switch} variable has been deprecated, use standard {switch=} tags in your search results template.', TRUE, 604800);
     }
     $channel = new Channel();
     // This allows the channel {absolute_count} variable to work
     $channel->pagination->offset = $pagination->per_page * $pagination->current_page - $pagination->per_page;
     $channel->fetch_custom_channel_fields();
     $channel->fetch_custom_member_fields();
     $channel->query = $query;
     if ($channel->query->num_rows() == 0) {
         return ee()->TMPL->no_results();
     }
     ee()->load->library('typography');
     ee()->typography->initialize(array('convert_curly' => FALSE, 'encode_email' => FALSE));
     $channel->fetch_categories();
     $channel->parse_channel_entries(array($this, 'callback_search_result_row'));
     // Add new pagination
     ee()->TMPL->tagdata = $pagination->render($channel->return_data);
     // Parse lang variables
     $swap = array('lang:total_search_results' => lang('search_total_results'), 'lang:search_engine' => lang('search_engine'), 'lang:search_results' => lang('search_results'), 'lang:search' => lang('search'), 'lang:title' => lang('search_title'), 'lang:channel' => lang('search_channel'), 'lang:excerpt' => lang('search_excerpt'), 'lang:author' => lang('search_author'), 'lang:date' => lang('search_date'), 'lang:total_comments' => lang('search_total_comments'), 'lang:recent_comments' => lang('search_recent_comment_date'), 'lang:keywords' => lang('search_keywords'));
     ee()->TMPL->template = ee()->functions->var_swap(ee()->TMPL->template, $swap);
     return ee()->TMPL->tagdata;
 }
 /** ----------------------------------------
 	/**  Show search results
 	/** ----------------------------------------*/
 function search_results()
 {
     // Fetch the search language file
     $this->EE->lang->loadfile('search');
     // Load Pagination Object
     $this->EE->load->library('pagination');
     $pagination = new Pagination_object(__CLASS__);
     // Capture Pagination Template
     $pagination->get_template();
     // Check to see if we're using old style pagination
     // TODO: Remove once old pagination is phased out
     $old_pagination = strpos($this->EE->TMPL->template, LD . 'if paginate' . RD) !== FALSE ? TRUE : FALSE;
     // If we are using old pagination, log it as deprecated
     // TODO: Remove once old pagination is phased out
     if ($old_pagination) {
         $this->EE->load->library('logger');
         $this->EE->logger->developer('Deprecated template tag {if paginate}. Old style pagination in the Search Module has been deprecated in 2.4 and will be removed soon. Switch to the new Channel style pagination.', TRUE);
     }
     // Check search ID number
     // If the QSTR variable is less than 32 characters long we
     // don't have a valid search ID number
     if (strlen($this->EE->uri->query_string) < 32) {
         return $this->EE->output->show_user_error('off', array(lang('search_no_result')), lang('search_result_heading'));
     }
     // Clear old search results
     $this->EE->db->delete('search', array('site_id' => $this->EE->config->item('site_id'), 'search_date <' => $this->EE->localize->now - $this->cache_expire * 3600));
     // Fetch ID number and page number
     $pagination->offset = 0;
     $qstring = $this->EE->uri->query_string;
     // Parse page number
     if (preg_match("#^P(\\d+)|/P(\\d+)#", $qstring, $match)) {
         $pagination->offset = isset($match[2]) ? $match[2] : $match[1];
         $search_id = trim_slashes(str_replace($match[0], '', $qstring));
     } else {
         $pagination->offset = 0;
         $search_id = $qstring;
     }
     // If there is a slash in the search ID we'll kill everything after it.
     $search_id = trim($search_id);
     $search_id = preg_replace("#/.+#", "", $search_id);
     // Fetch the cached search query
     $query = $this->EE->db->get_where('search', array('search_id' => $search_id));
     if ($query->num_rows() == 0 or $query->row('total_results') == 0) {
         return $this->EE->output->show_user_error('off', array(lang('search_no_result')), lang('search_result_heading'));
     }
     $fields = $query->row('custom_fields') == '' ? array() : unserialize(stripslashes($query->row('custom_fields')));
     $sql = unserialize(stripslashes($query->row('query')));
     $sql = str_replace('MDBMPREFIX', 'exp_', $sql);
     $pagination->per_page = (int) $query->row('per_page');
     $res_page = $query->row('result_page');
     // Run the search query
     $query = $this->EE->db->query(preg_replace("/SELECT(.*?)\\s+FROM\\s+/is", 'SELECT COUNT(*) AS count FROM ', $sql));
     if ($query->row('count') == 0) {
         return $this->EE->output->show_user_error('off', array(lang('search_no_result')), lang('search_result_heading'));
     }
     // Calculate total number of pages and add total rows
     $pagination->current_page = $pagination->offset / $pagination->per_page + 1;
     $pagination->total_rows = $query->row('count');
     // Figure out total number of pages for old style pagination
     // TODO: Remove once old pagination is phased out
     if ($old_pagination) {
         $total_pages = intval($pagination->total_rows / $pagination->per_page);
         if ($pagination->total_rows % $pagination->per_page) {
             $total_pages++;
         }
         $page_count = lang('page') . ' ' . $pagination->current_page . ' ' . lang('of') . ' ' . $total_pages;
         $pager = '';
         if ($pagination->total_rows > $pagination->per_page) {
             $this->EE->load->library('pagination');
             $config = array('base_url' => $this->EE->functions->create_url($res_page . '/' . $search_id, 0, 0), 'prefix' => 'P', 'total_rows' => $pagination->total_rows, 'per_page' => $pagination->per_page, 'cur_page' => $pagination->offset, 'first_link' => lang('pag_first_link'), 'last_link' => lang('pag_last_link'), 'uri_segment' => 0);
             $this->EE->pagination->initialize($config);
             $pager = $this->EE->pagination->create_links();
         }
     }
     // Build pagination if enabled
     if ($pagination->paginate === TRUE) {
         $pagination->build($pagination->total_rows);
     }
     // If we're paginating, old or new, limit the query and do it again
     if ($pagination->paginate === TRUE or $old_pagination) {
         $sql .= " LIMIT " . $pagination->offset . ", " . $pagination->per_page;
     } else {
         if ($pagination->per_page > 0) {
             $sql .= " LIMIT 0, " . $pagination->per_page;
         } else {
             $sql .= " LIMIT 0, 100";
         }
     }
     $query = $this->EE->db->query($sql);
     $output = '';
     if (!class_exists('Channel')) {
         require PATH_MOD . 'channel/mod.channel.php';
     }
     unset($this->EE->TMPL->var_single['auto_path']);
     unset($this->EE->TMPL->var_single['excerpt']);
     unset($this->EE->TMPL->var_single['id_auto_path']);
     unset($this->EE->TMPL->var_single['full_text']);
     unset($this->EE->TMPL->var_single['switch']);
     foreach ($this->EE->TMPL->var_single as $key => $value) {
         if (substr($key, 0, strlen('member_path')) == 'member_path') {
             unset($this->EE->TMPL->var_single[$key]);
         }
     }
     $channel = new Channel();
     // This allows the channel {absolute_count} variable to work
     $channel->pagination->offset = $pagination->per_page * $pagination->current_page - $pagination->per_page;
     $channel->fetch_custom_channel_fields();
     $channel->fetch_custom_member_fields();
     $channel->query = $this->EE->db->query($sql);
     if ($channel->query->num_rows() == 0) {
         return $this->EE->TMPL->no_results();
     }
     $this->EE->load->library('typography');
     $this->EE->typography->initialize(array('convert_curly' => FALSE, 'encode_email' => FALSE));
     $channel->fetch_categories();
     $channel->parse_channel_entries();
     $tagdata = $this->EE->TMPL->tagdata;
     // Does the tag contain "related entries" that we need to parse out?
     if (count($this->EE->TMPL->related_data) > 0 and count($channel->related_entries) > 0) {
         $channel->parse_related_entries();
     }
     if (count($this->EE->TMPL->reverse_related_data) > 0 and count($channel->reverse_related_entries) > 0) {
         $channel->parse_reverse_related_entries();
     }
     $output = $channel->return_data;
     $this->EE->TMPL->tagdata = $tagdata;
     // Fetch member path variable
     // We do it here in case it's used in multiple places.
     $m_paths = array();
     if (preg_match_all("/" . LD . "member_path(\\s*=.*?)" . RD . "/s", $this->EE->TMPL->tagdata, $matches)) {
         for ($j = 0; $j < count($matches['0']); $j++) {
             $m_paths[] = array($matches['0'][$j], $this->EE->functions->extract_path($matches['1'][$j]));
         }
     }
     // Fetch switch param
     $switch1 = '';
     $switch2 = '';
     if ($switch = $this->EE->TMPL->fetch_param('switch')) {
         if (strpos($switch, '|') !== FALSE) {
             $x = explode("|", $switch);
             $switch1 = $x['0'];
             $switch2 = $x['1'];
         } else {
             $switch1 = $switch;
         }
     }
     /** -----------------------------
     		/**  Result Loop - Legacy!
     		/** -----------------------------*/
     $i = 0;
     foreach ($query->result_array() as $row) {
         if (isset($row['field_id_' . $row['search_excerpt']]) and $row['field_id_' . $row['search_excerpt']]) {
             $format = !isset($row['field_ft_' . $row['search_excerpt']]) ? 'xhtml' : $row['field_ft_' . $row['search_excerpt']];
             $full_text = $this->EE->typography->parse_type(strip_tags($row['field_id_' . $row['search_excerpt']]), array('text_format' => $format, 'html_format' => 'safe', 'auto_links' => 'y', 'allow_img_url' => 'n'));
             $excerpt = trim(strip_tags($full_text));
             if (strpos($excerpt, "\r") !== FALSE or strpos($excerpt, "\n") !== FALSE) {
                 $excerpt = str_replace(array("\r\n", "\r", "\n"), " ", $excerpt);
             }
             $excerpt = $this->EE->functions->word_limiter($excerpt, 50);
         } else {
             $excerpt = '';
             $full_text = '';
         }
         // Parse permalink path
         $url = $row['search_results_url'] != '' ? $row['search_results_url'] : $row['channel_url'];
         $path = $this->EE->functions->remove_double_slashes($this->EE->functions->prep_query_string($url) . '/' . $row['url_title']);
         $idpath = $this->EE->functions->remove_double_slashes($this->EE->functions->prep_query_string($url) . '/' . $row['entry_id']);
         $switch = $i++ % 2 ? $switch1 : $switch2;
         $output = preg_replace("/" . LD . 'switch' . RD . "/", $switch, $output, count(explode(LD . 'switch' . RD, $this->EE->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'auto_path' . RD . "/", $path, $output, count(explode(LD . 'auto_path' . RD, $this->EE->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'id_auto_path' . RD . "/", $idpath, $output, count(explode(LD . 'id_auto_path' . RD, $this->EE->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'excerpt' . RD . "/", preg_quote($excerpt), $output, count(explode(LD . 'excerpt' . RD, $this->EE->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'full_text' . RD . "/", preg_quote($full_text), $output, count(explode(LD . 'full_text' . RD, $this->EE->TMPL->tagdata)) - 1);
         // Parse member_path
         if (count($m_paths) > 0) {
             foreach ($m_paths as $val) {
                 $output = preg_replace("/" . preg_quote($val['0'], '/') . "/", $this->EE->functions->create_url($val['1'] . '/' . $row['member_id']), $output, 1);
             }
         }
     }
     $this->EE->TMPL->tagdata = $output;
     // Add new pagination
     $this->EE->TMPL->tagdata = $pagination->render($this->EE->TMPL->tagdata);
     // Parse lang variables
     $swap = array('lang:total_search_results' => lang('search_total_results'), 'lang:search_engine' => lang('search_engine'), 'lang:search_results' => lang('search_results'), 'lang:search' => lang('search'), 'lang:title' => lang('search_title'), 'lang:channel' => lang('search_channel'), 'lang:excerpt' => lang('search_excerpt'), 'lang:author' => lang('search_author'), 'lang:date' => lang('search_date'), 'lang:total_comments' => lang('search_total_comments'), 'lang:recent_comments' => lang('search_recent_comment_date'), 'lang:keywords' => lang('search_keywords'));
     $this->EE->TMPL->template = $this->EE->functions->var_swap($this->EE->TMPL->template, $swap);
     // Add Old Style Pagination
     // TODO: Remove once old pagination is phased out
     if ($old_pagination) {
         if ($pager == '') {
             $this->EE->TMPL->template = preg_replace("#" . LD . "if paginate" . RD . ".*?" . LD . "/if" . RD . "#s", '', $this->EE->TMPL->template);
         } else {
             $this->EE->TMPL->template = preg_replace("#" . LD . "if paginate" . RD . "(.*?)" . LD . "/if" . RD . "#s", "\\1", $this->EE->TMPL->template);
         }
         $this->EE->TMPL->template = str_replace(LD . 'paginate' . RD, $pager, $this->EE->TMPL->template);
         $this->EE->TMPL->template = str_replace(LD . 'page_count' . RD, $page_count, $this->EE->TMPL->template);
     }
     return $this->EE->TMPL->tagdata;
 }
 function search()
 {
     $address = '';
     $tagdata = $this->EE->TMPL->tagdata;
     $prec = !$this->EE->TMPL->fetch_param('prec') ? '' : ',' . $this->EE->TMPL->fetch_param('prec');
     $prefix = !$this->EE->TMPL->fetch_param('prefix') ? '' : ',' . $this->EE->TMPL->fetch_param('prefix');
     $orderby = !$this->EE->TMPL->fetch_param('orderby') ? false : ($this->EE->TMPL->fetch_param('orderby') == 'distance' ? false : $this->EE->TMPL->fetch_param('orderby'));
     $sort = !$this->EE->TMPL->fetch_param('sort') ? 'asc' : $this->EE->TMPL->fetch_param('sort');
     $this->EE->TMPL->tagparams['limit'] = !$this->EE->TMPL->fetch_param('limit') ? 99999 : $this->EE->TMPL->fetch_param('limit');
     $address_fields = !$this->EE->TMPL->fetch_param('address_fields') ? false : $this->EE->TMPL->fetch_param('address_fields');
     $debug = !$this->EE->TMPL->fetch_param('debug') ? false : true;
     //@delete
     $reverse_geocoding = !$this->EE->TMPL->fetch_param('reverse_geocoding') ? '' : ',' . $this->EE->TMPL->fetch_param('reverse_geocoding');
     if (isset($_POST) and count($_POST) > 0 or isset($_GET) and count($_GET) > 0) {
         $zipLongitude = $this->EE->security->xss_clean($this->EE->input->get_post('long'));
         $zipLatitude = $this->EE->security->xss_clean($this->EE->input->get_post('lat'));
         $unit = $this->EE->security->xss_clean($this->EE->input->get_post('unit'));
         //@add to site description
         if ($address_fields) {
             foreach (explode('|', $address_fields) as $field_name) {
                 $address = $this->EE->input->get_post($field_name) ? $address . $this->EE->security->xss_clean($this->EE->input->get_post($field_name)) . ', ' : '';
             }
         } else {
             $address = $this->EE->security->xss_clean($this->EE->input->get_post('address'));
             if (is_array($address)) {
                 $address = implode(",", $address);
             }
         }
         $address = $prefix . $address;
         $radius = $this->EE->security->xss_clean($this->EE->input->get_post('radius'));
     } else {
         $zipLongitude = $this->EE->TMPL->fetch_param('long') != '' ? $this->EE->TMPL->fetch_param('long') : "";
         $zipLatitude = $this->EE->TMPL->fetch_param('lat') != '' ? $this->EE->TMPL->fetch_param('lat') : '';
         $unit = $this->EE->TMPL->fetch_param('unit') != '' ? $this->EE->TMPL->fetch_param('unit') : 'ml';
         $address = $this->EE->TMPL->fetch_param('address') != '' ? $this->EE->TMPL->fetch_param('address') : '';
         $radius = $this->EE->TMPL->fetch_param('radius') != '' ? $this->EE->TMPL->fetch_param('radius') : $this->default_radius;
     }
     $radius = $radius == '' ? $this->default_radius : $radius;
     $earth_radius = $unit == 'km' ? 6371 : 3959;
     //earth_radius
     if (($zipLongitude == "" or $zipLatitude == "") and $address == "") {
         $zipLongitude = $this->default_long;
         $zipLatitude = $this->default_lat;
         $address = $this->default_address;
     }
     $entry_id = '';
     $points = array();
     $entry_id = rtrim($entry_id, '|');
     $channel = new Channel();
     $LD = '\\{';
     $RD = '\\}';
     $SLASH = '\\/';
     $variable = "entries";
     $return_data = "";
     if (isset($_POST['categories'])) {
         $this->EE->TMPL->tagparams['category'] = (isset($this->EE->TMPL->tagparams['category']) ? $this->EE->TMPL->tagparams['category'] : '') . '|' . implode("|", $this->EE->security->xss_clean($_POST['categories']));
     }
     if (preg_match("/" . LD . $variable . ".*?" . RD . "(.*?)" . LD . '\\/' . $variable . RD . "/s", $tagdata, $entries)) {
         $channel->EE->TMPL->tagdata = $entries[1];
         if ($channel->EE->TMPL->fetch_param('related_categories_mode') == 'yes') {
             return $channel->related_entries();
         }
         $channel->initialize();
         $channel->uri = $channel->query_string != '' ? $channel->query_string : 'index.php';
         if ($channel->enable['custom_fields'] == TRUE) {
             $channel->fetch_custom_channel_fields();
         }
         if ($channel->enable['member_data'] == TRUE) {
             $channel->fetch_custom_member_fields();
         }
         if ($channel->enable['pagination'] == TRUE) {
             if (version_compare(APP_VER, '2.4', '>=')) {
                 $channel->add_pagination_data();
             } else {
                 $channel->fetch_pagination_data();
             }
         }
         $save_cache = FALSE;
         $channel->EE->TMPL->tagparams['dynamic'] = 'no';
         //$zipLongitude.$zipLatitude.$address
         if ($channel->EE->config->item('enable_sql_caching') == 'y') {
             if (FALSE == ($channel->sql = $channel->fetch_cache())) {
                 $save_cache = TRUE;
             } else {
                 if ($channel->EE->TMPL->fetch_param('dynamic') != 'no') {
                     if (preg_match("#(^|\\/)C(\\d+)#", $channel->query_string, $match) or in_array($channel->reserved_cat_segment, explode("/", $channel->query_string))) {
                         $channel->cat_request = TRUE;
                     }
                 }
             }
             if (FALSE !== ($cache = $channel->fetch_cache('pagination_count'))) {
                 if (FALSE !== $channel->fetch_cache('field_pagination')) {
                     if (FALSE !== ($pg_query = $channel->fetch_cache('pagination_query'))) {
                         $channel->paginate = TRUE;
                         $channel->field_pagination = TRUE;
                         $channel->create_pagination(trim($cache), $channel->EE->db->query(trim($pg_query)));
                     }
                 } else {
                     $channel->create_pagination(trim($cache));
                 }
             }
         }
         if ($channel->sql == '') {
             $channel->build_sql_query();
         }
         if ($channel->sql == '') {
             return $channel->EE->TMPL->no_results();
         }
         $sql = "";
         //@start geocoding
         //if don't have the Latitude and Longitude, do query to google.map; ($zipLongitude == "" OR $zipLatitude == "") AND
         if ($address != "" and ($zipLongitude == "" or $zipLatitude == "")) {
             $GetLatLong_result = $this->GetLatLong($address, 2);
             if ($GetLatLong_result != false) {
                 list($zipLongitude, $zipLatitude) = $GetLatLong_result;
             } else {
                 return $this->EE->TMPL->no_results();
             }
         }
         if ($reverse_geocoding and $address == "") {
             $GetLatLong_result = $this->GetLatLong($zipLatitude . ',' . $zipLongitude, $api_key, 1);
             if ($GetLatLong_result != false) {
                 $address = $GetLatLong_result;
             } else {
                 return $this->EE->TMPL->no_results();
             }
         }
         //@END geocoding
         $conds['radius'] = $radius;
         $tagdata = $this->EE->functions->prep_conditionals($tagdata, $conds);
         $tagdata = str_replace(array('{center:long}', '{center:lat}', '{radius}'), array($zipLongitude, $zipLatitude, $radius), $tagdata);
         $where_strpos = strpos($channel->sql, "WHERE");
         if ($where_strpos > 0) {
             $sql_entry_id = substr($channel->sql, $where_strpos + 5, strpos($channel->sql, "ORDER BY") - $where_strpos - 5);
             $limit_strpos = strpos($channel->sql, "LIMIT");
             $order_by = substr($channel->sql, strpos($channel->sql, "ORDER BY"), $limit_strpos);
             $limit = substr($channel->sql, strpos($channel->sql, "LIMIT"));
             $sql = str_replace('FROM', ", gm.*, ROUND( {$earth_radius} * acos( cos( radians({$zipLatitude}) ) * cos( radians( gm.latitude ) ) * cos( radians( gm.longitude ) - radians({$zipLongitude}) ) + sin( radians({$zipLatitude}) ) *  sin( radians( gm.latitude ) ) ) {$prec} ) AS distance   FROM ", $channel->sql);
             $sql = substr($sql, 0, strpos($sql, "WHERE")) . "RIGHT JOIN exp_mx_google_map AS gm ON t.entry_id = gm.entry_id HAVING distance < {$radius} AND " . $sql_entry_id;
             if ($orderby) {
                 $sql = $sql . $order_by;
             } else {
                 $sql = $sql . " ORDER BY distance " . $sort;
             }
             $channel->sql = $sql;
         }
         if ($save_cache == TRUE) {
             $channel->save_cache($channel->sql);
         }
         $channel->query = $channel->EE->db->query($channel->sql);
         if ($channel->query->num_rows() == 0) {
             return $channel->EE->TMPL->no_results();
         }
         foreach ($channel->query->result_array() as $row) {
             $points[$row['point_id']] = $row['distance'];
         }
         $channel->EE->TMPL->tagparams['points'] = $points;
         if ($channel->EE->config->item('relaxed_track_views') === 'y' && $channel->query->num_rows() == 1) {
             $channel->hit_tracking_id = $channel->query->row('entry_id');
         }
         $channel->track_views();
         $channel->EE->load->library('typography');
         $channel->EE->typography->initialize();
         $channel->EE->typography->convert_curly = FALSE;
         if ($channel->enable['categories'] == TRUE) {
             $channel->fetch_categories();
         }
         $channel->parse_channel_entries();
         if ($channel->enable['pagination'] == TRUE) {
             if (version_compare(APP_VER, '2.4', '>=')) {
                 $channel->add_pagination_data();
             } else {
                 $channel->fetch_pagination_data();
             }
         }
         if (count($channel->EE->TMPL->related_data) > 0 && count($channel->related_entries) > 0) {
             $channel->parse_related_entries();
         }
         if (count($channel->EE->TMPL->reverse_related_data) > 0 && count($channel->reverse_related_entries) > 0) {
             $channel->parse_reverse_related_entries();
         }
         $return_data = str_replace($entries[0], $channel->return_data, $tagdata);
     }
     return $return_data;
 }
示例#5
0
 function tell_a_friend()
 {
     if ($this->EE->uri->query_string == '') {
         return FALSE;
     }
     /** ----------------------------------------
     		/**  Recipient Email Checking
     		/** ----------------------------------------*/
     $user_recipients = true;
     // By default
     $recipients = !$this->EE->TMPL->fetch_param('recipients') ? '' : $this->EE->TMPL->fetch_param('recipients');
     $charset = !$this->EE->TMPL->fetch_param('charset') ? '' : $this->EE->TMPL->fetch_param('charset');
     $allow_html = !$this->EE->TMPL->fetch_param('allow_html') ? 'n' : $this->EE->TMPL->fetch_param('allow_html');
     if (!$this->EE->TMPL->fetch_param('status')) {
         $this->EE->TMPL->tagparams['status'] = 'open';
     }
     // Clean and check recipient emails, if any
     if ($recipients != '') {
         $array = $this->validate_recipients($recipients);
         // Put together into string again
         $recipients = implode(',', $array['approved']);
     }
     /** --------------------------------------
     		/**  Parse page number
     		/** --------------------------------------*/
     // We need to strip the page number from the URL for two reasons:
     // 1. So we can create pagination links
     // 2. So it won't confuse the query with an improper proper ID
     $qstring = $this->EE->uri->query_string;
     if (preg_match("#/P(\\d+)#", $qstring, $match)) {
         $current_page = $match['1'];
         $qstring = $this->EE->functions->remove_double_slashes(str_replace($match['0'], '', $qstring));
     }
     /** --------------------------------------
     		/**  Remove "N"
     		/** --------------------------------------*/
     // The recent comments feature uses "N" as the URL indicator
     // It needs to be removed if presenst
     if (preg_match("#/N(\\d+)#", $qstring, $match)) {
         $qstring = $this->EE->functions->remove_double_slashes(str_replace($match['0'], '', $qstring));
     }
     /* -------------------------------------
     		/*  'email_module_tellafriend_override' hook.
     		/*  - Allow use of Tell-A-Friend for things besides channel entries
     		/*  - Added EE 1.5.1
     		*/
     if ($this->EE->extensions->active_hook('email_module_tellafriend_override') === TRUE) {
         $tagdata = $this->EE->extensions->call('email_module_tellafriend_override', $qstring, $this);
         if ($this->EE->extensions->end_script === TRUE) {
             return $tagdata;
         }
     } else {
         $entry_id = trim($qstring);
         // If there is a slash in the entry ID we'll kill everything after it.
         $entry_id = preg_replace("#/.+#", "", $entry_id);
         /** ----------------------------------------
         				/**  Do we have a vaild channel and ID number?
         				/** ----------------------------------------*/
         $timestamp = $this->EE->TMPL->cache_timestamp != '' ? $this->EE->localize->set_gmt($this->EE->TMPL->cache_timestamp) : $this->EE->localize->now;
         $channel = !$this->EE->TMPL->fetch_param('channel') ? '' : $this->EE->TMPL->fetch_param('channel');
         $sql = "SELECT entry_id FROM exp_channel_titles, exp_channels\n\t\t\t\t\t\tWHERE exp_channel_titles.channel_id = exp_channels.channel_id\n\t\t\t\t\t\tAND (expiration_date = 0 OR expiration_date > " . $timestamp . ")\n\t\t\t\t\t\tAND status != 'closed' AND ";
         $sql .= !is_numeric($entry_id) ? " url_title = '" . $entry_id . "' " : " entry_id = '{$entry_id}' ";
         if ($channel != '') {
             $sql .= $this->EE->functions->sql_andor_string($channel, 'exp_channels.channel_name') . " ";
         }
         $query = $this->EE->db->query($sql);
         // Bad ID?  See ya!
         if ($query->num_rows() == 0) {
             return FALSE;
         }
         /** ----------------------------------------
         				/**  Fetch the channel entry
         				/** ----------------------------------------*/
         if (!class_exists('Channel')) {
             require PATH_MOD . 'channel/mod.channel' . EXT;
         }
         $channel = new Channel();
         $channel->fetch_custom_channel_fields();
         $channel->fetch_custom_member_fields();
         $channel->build_sql_query();
         if ($channel->sql == '') {
             return FALSE;
         }
         $channel->query = $this->EE->db->query($channel->sql);
         if ($channel->query->num_rows() == 0) {
             return FALSE;
         }
         $this->EE->load->library('typography');
         $this->EE->typography->initialize();
         $this->EE->typography->encode_email = FALSE;
         $this->EE->typography->convert_curly = FALSE;
         $channel->fetch_categories();
         $channel->parse_channel_entries();
         $tagdata = $channel->return_data;
     }
     /*
     		/* -------------------------------------*/
     /** ----------------------------------------
     		/**  Parse conditionals
     		/** ----------------------------------------*/
     $cond = array();
     $cond['captcha'] = $this->use_captchas == 'y' ? 'TRUE' : 'FALSE';
     $tagdata = $this->EE->functions->prep_conditionals($tagdata, $cond);
     /** ----------------------------------------
     			/**  Parse tell-a-friend variables
     			/** ----------------------------------------*/
     // {member_name}
     $tagdata = $this->EE->TMPL->swap_var_single('member_name', $this->EE->session->userdata['screen_name'], $tagdata);
     // {member_email}
     $tagdata = $this->EE->TMPL->swap_var_single('member_email', $this->EE->session->userdata['email'], $tagdata);
     /** ----------------------------------------
     			/**  A little work on the form field's values
     			/** ----------------------------------------*/
     // Match values in input fields
     preg_match_all("/<input(.*?)value=\"(.*?)\"/", $tagdata, $matches);
     if (count($matches) > 0 && $allow_html != 'y') {
         foreach ($matches['2'] as $value) {
             if ($allow_html == 'n') {
                 $new = strip_tags($value);
             } else {
                 $new = strip_tags($value, $allow_html);
             }
             $tagdata = str_replace($value, $new, $tagdata);
         }
     }
     // Remove line breaks
     $LB = 'snookums9loves4wookie';
     $tagdata = str_replace(array("\r\n", "\r", "\n"), $LB, $tagdata);
     // Match textarea content
     preg_match_all("/<textarea(.*?)>(.*?)<\\/textarea>/", $tagdata, $matches);
     if (count($matches) > 0 && $allow_html != 'y') {
         foreach ($matches['2'] as $value) {
             if ($allow_html == 'n') {
                 $new = strip_tags($value);
             } else {
                 $new = strip_tags($value, $allow_html);
             }
             $tagdata = str_replace($value, $new, $tagdata);
         }
     }
     $tagdata = str_replace($LB, "\n", $tagdata);
     /** ----------------------------------------
     			/**  Create form
     			/** ----------------------------------------*/
     if ($this->EE->TMPL->fetch_param('name') !== FALSE && preg_match("#^[a-zA-Z0-9_\\-]+\$#i", $this->EE->TMPL->fetch_param('name'), $match)) {
         $data['name'] = $this->EE->TMPL->fetch_param('name');
     }
     if (function_exists('mcrypt_encrypt')) {
         $init_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
         $init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND);
         $recipients = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($this->EE->session->sess_crypt_key), $recipients, MCRYPT_MODE_ECB, $init_vect);
     } else {
         $recipients = $recipients . md5($this->EE->session->sess_crypt_key . $recipients);
     }
     $data['id'] = $this->EE->TMPL->form_id == '' ? 'tellafriend_form' : $this->EE->TMPL->form_id;
     $data['class'] = $this->EE->TMPL->form_class;
     $data['hidden_fields'] = array('ACT' => $this->EE->functions->fetch_action_id('Email', 'send_email'), 'RET' => !$this->EE->TMPL->fetch_param('return') ? '' : $this->EE->TMPL->fetch_param('return'), 'URI' => $this->EE->uri->uri_string == '' ? 'index' : $this->EE->uri->uri_string, 'recipients' => base64_encode($recipients), 'user_recipients' => $user_recipients == 'true' ? md5($this->EE->db->username . $this->EE->db->password . 'y') : md5($this->EE->db->username . $this->EE->db->password . 'n'), 'charset' => $charset, 'allow_html' => $allow_html, 'redirect' => !$this->EE->TMPL->fetch_param('redirect') ? '' : $this->EE->TMPL->fetch_param('redirect'), 'replyto' => !$this->EE->TMPL->fetch_param('replyto') ? '' : $this->EE->TMPL->fetch_param('replyto'));
     $res = $this->EE->functions->form_declaration($data);
     $res .= stripslashes($tagdata);
     $res .= "</form>";
     return $res;
 }
 /**
  * Prepare occurrences output
  *
  * @param	string	$tagdata			Tagdata
  * @param	array	$data				Array of data
  * @param	bool	$include_default	Include the default entry_id when fetching weblog data?
  * @return	string
  */
 protected function prep_occurrences_output($tagdata, $data, $include_default = TRUE)
 {
     // -------------------------------------
     //  Ensure $this->CDT is ready
     // -------------------------------------
     $this->load_calendar_datetime();
     if (empty($data->dates)) {
         return $tagdata;
     }
     $output = '';
     // -------------------------------------
     //  Put the items in order
     // -------------------------------------
     foreach ($data->dates as $ymd => $times) {
         ksort($data->dates[$ymd]);
     }
     ksort($data->dates);
     //--------------------------------------------
     //	order arrays for later multi sorting
     //--------------------------------------------
     $calendar_orderby_params = array('event_start_date', 'occurrence_start_date');
     $orders = explode('|', $this->P->value('orderby'));
     $sorts = explode('|', $this->P->value('sort'));
     $calendar_orders = array();
     $calendar_order_data = array();
     foreach ($orders as $k => $order) {
         if (in_array($order, $calendar_orderby_params)) {
             $sort = isset($sorts[$k]) ? $sorts[$k] : 'desc';
             $calendar_orders[$order] = $sort;
             $calendar_order_data[$order] = array();
         }
     }
     // -------------------------------------
     //  Are prior_ or upcoming_ limits in effect?
     // -------------------------------------
     $prior_limit = $this->P->value('prior_occurrences_limit') !== FALSE ? $this->P->value('prior_occurrences_limit') : FALSE;
     $upcoming_limit = $this->P->value('upcoming_occurrences_limit') !== FALSE ? $this->P->value('upcoming_occurrences_limit') : FALSE;
     if ($prior_limit !== FALSE or $upcoming_limit !== FALSE) {
         $priors = array();
         $upcoming = array();
         //set date to current
         $this->CDT->set_date_to_now();
         foreach ($data->dates as $ymd => $info) {
             //yeterday or before
             if ($ymd < $this->CDT->ymd) {
                 $priors[$ymd] = $info;
             } elseif ($ymd == $this->CDT->ymd) {
                 //we need to check all hours and minutes :/
                 foreach ($info as $time => $time_data) {
                     $temp_end_hour = $time_data['end_date']['hour'] + ($time_data['end_date']['pm'] ? 12 : 0);
                     $temp_end_minute = $time_data['end_date']['minute'];
                     //if this is an all day item and we are still in this day, its current
                     if ($time_data['all_day'] == TRUE) {
                         $upcoming[$ymd][$time] = $time_data;
                     } else {
                         if ($temp_end_hour > $this->CDT->hour() or $temp_end_hour == $this->CDT->hour() and $temp_end_minute > $this->CDT->minute()) {
                             $upcoming[$ymd][$time] = $time_data;
                         } else {
                             $priors[$ymd][$time] = $time_data;
                         }
                     }
                 }
             } else {
                 $upcoming[$ymd] = $info;
             }
         }
         //slice out our limits
         if ($prior_limit !== FALSE) {
             $priors = $this->apply_occurrences_limit($priors, $prior_limit, 0, 'prior');
             //$priors = array_slice(array_reverse($priors, TRUE), 0, $prior_limit, TRUE);
         }
         if ($upcoming_limit !== FALSE) {
             $upcoming = $this->apply_occurrences_limit($upcoming, $upcoming_limit, 0, 'upcoming');
             //$upcoming = array_slice($upcoming, 0, $upcoming_limit, TRUE);
         }
         //this has to be recursive because we can have the same $YMD happening if its today's date
         $data->dates = array_merge_recursive($priors, $upcoming);
     }
     //--------------------------------------------
     //	get default data from parent entry_id
     //--------------------------------------------
     if (!isset($this->cache['entry_info'])) {
         $this->cache['entry_info'] = array();
     }
     //we need some extra data about this entry so we can parse occurrences items
     if (!isset($this->cache['entry_info'][$data->default_data['entry_id']])) {
         $entry_info_query = ee()->db->query("SELECT \tct.title, ct.url_title, ct.author_id, ct.status, m.screen_name, m.username\n\t\t\t\t FROM\t\t{$this->sc->db->channel_titles} as ct\n\t\t\t\t LEFT JOIN\texp_members as m\n\t\t\t\t ON\t\t\tct.author_id = m.member_id\n\t\t\t\t WHERE\t\tct.entry_id = " . ee()->db->escape_str($data->default_data['entry_id']));
         if ($entry_info_query->num_rows() > 0) {
             $this->cache['entry_info'][$data->default_data['entry_id']] = $entry_info_query->row_array();
         } else {
             $this->cache['entry_info'][$data->default_data['entry_id']] = array();
         }
     }
     $entry_info = $this->cache['entry_info'][$data->default_data['entry_id']];
     // -------------------------------------
     //  Grab entry IDs from the occurrences
     // -------------------------------------
     foreach ($data->occurrences as $ymd => $times) {
         foreach ($times as $time => $info) {
             if ($info['entry_id'] != $data->default_data['entry_id'] and !isset($ids[$info['entry_id']])) {
                 $ids[$ymd] = $info['entry_id'];
             }
         }
     }
     $tagdatas = array();
     $tagdatas[$data->default_data['entry_id']] = $tagdata;
     //this will probably only happen for edited occurrences
     if (!empty($ids)) {
         // -------------------------------------
         //  Add the "parent" entry id for default data
         // -------------------------------------
         $ids[0] = $data->default_data['entry_id'];
         //ee()->TMPL_orig = clone ee()->TMPL;
         $tagdata = LD . 'occurrences id="' . LD . 'entry_id' . RD . '"' . RD . $tagdata . LD . T_SLASH . 'occurrences' . RD;
         //	----------------------------------------
         //	Invoke Channel class
         //	----------------------------------------
         if (APP_VER < 2.0) {
             if (!class_exists('Weblog')) {
                 require PATH_MOD . '/weblog/mod.weblog' . EXT;
             }
             $channel = new Weblog();
         } else {
             if (!class_exists('Channel')) {
                 require PATH_MOD . '/channel/mod.channel' . EXT;
             }
             $channel = new Channel();
         }
         //default is 100 and that could limit events when there are very many to be shown
         $channel->limit = 500;
         // --------------------------------------------
         //  Invoke Pagination for EE 2.4 and Above
         // --------------------------------------------
         if (APP_VER >= '2.4.0') {
             ee()->load->library('pagination');
             $channel->pagination = new Pagination_object('Channel');
             // Used by pagination to determine whether we're coming from the cache
             $channel->pagination->dynamic_sql = FALSE;
         }
         // -------------------------------------
         //  Prepare parameters
         // -------------------------------------
         ee()->TMPL->tagparams['entry_id'] = implode('|', $ids);
         ee()->TMPL->tagparams['weblog'] = CALENDAR_EVENTS_CHANNEL_NAME;
         ee()->TMPL->tagparams['channel'] = CALENDAR_EVENTS_CHANNEL_NAME;
         // -------------------------------------
         //  Pre-process related data
         // -------------------------------------
         ee()->TMPL->tagdata = ee()->TMPL->assign_relationship_data($tagdata);
         ee()->TMPL->var_single = array_merge(ee()->TMPL->var_single, ee()->TMPL->related_markers);
         ee()->TMPL->var_single['entry_id'] = 'entry_id';
         // -------------------------------------
         //  Execute needed methods
         // -------------------------------------
         if (APP_VER < 2.0) {
             $channel->fetch_custom_weblog_fields();
         } else {
             $channel->fetch_custom_channel_fields();
         }
         $channel->fetch_custom_member_fields();
         // --------------------------------------------
         //  Pagination Tags Parsed Out
         // --------------------------------------------
         if (APP_VER >= '2.4.0') {
             $channel->pagination->get_template();
         } else {
             $channel->fetch_pagination_data();
         }
         // -------------------------------------
         //  Add occurrence_ prefix to custom fields
         // -------------------------------------
         foreach ($channel->cfields as $sid => $fields) {
             foreach ($fields as $name => $fid) {
                 $channel->cfields[$sid]['occurrence_' . $name] = $fid;
                 unset($channel->cfields[$sid][$name]);
             }
         }
         // -------------------------------------
         //  Querification
         // -------------------------------------
         $channel->build_sql_query();
         if ($channel->sql == '') {
             return $this->no_results();
         }
         $channel->query = ee()->db->query($channel->sql);
         if ($channel->query->num_rows() == 0) {
             //ee()->TMPL->log_item('Calendar: Channel module says no results, bailing');
             return $this->no_results();
         }
         $channel->query->result = $channel->query->result_array();
         // -------------------------------------
         //  Trim IDs and build events
         // -------------------------------------
         $new_ids = array();
         foreach ($channel->query->result as $k => $row) {
             $new_ids[$row['entry_id']] = $row['entry_id'];
         }
         if (empty($new_ids)) {
             return $this->no_results();
         }
         $occurrence_data = $this->data->fetch_event_occurrences($data->default_data['entry_id']);
         // -------------------------------------
         //  Turn these IDs into events
         // -------------------------------------
         $events = array();
         if (!class_exists('Calendar_event')) {
             require_once CALENDAR_PATH . 'calendar.event' . EXT;
         }
         $calendars = array();
         $start_ymd = $this->P->value('date_range_start') !== FALSE ? $this->P->value('date_range_start', 'ymd') : '';
         $end_ymd = $this->P->value('date_range_end') !== FALSE ? $this->P->value('date_range_end', 'ymd') : '';
         foreach ($occurrence_data[$data->default_data['entry_id']] as $times) {
             foreach ($times as $k => $odata) {
                 $temp = new Calendar_event($odata, $start_ymd, $end_ymd);
                 if (!empty($temp->dates)) {
                     $temp->prepare_for_output();
                     $events[$odata['entry_id']] = $temp;
                     $calendars[$events[$odata['entry_id']]->default_data['calendar_id']] = array();
                 }
             }
         }
         // -------------------------------------
         //  Fetch information about the calendars
         // -------------------------------------
         $calendars = $this->data->fetch_calendar_data_by_id(array_keys($calendars));
         // -------------------------------------
         //  Prep variable aliases
         // -------------------------------------
         $variables = array('title' => 'occurrence_title', 'url_title' => 'occurrence_url_title', 'entry_id' => 'occurrence_id', 'author_id' => 'occurrence_author_id', 'author' => 'occurrence_author', 'status' => 'occurrence_status');
         // -------------------------------------
         //  Add variables to the query result
         // -------------------------------------
         foreach ($channel->query->result as $k => $row) {
             $channel->query->result[$k]['author'] = $row['screen_name'] != '' ? $row['screen_name'] : $row['username'];
             $entry_id = $row['entry_id'];
             if (isset($ids[0]) and $entry_id == $ids[0]) {
                 $events[$entry_id] = $data;
             } elseif (!isset($events[$entry_id])) {
                 unset($channel->query->result[$k]);
                 continue;
             }
             // -------------------------------------
             //  Alias
             // -------------------------------------
             foreach ($variables as $old => $new) {
                 $channel->query->result[$k][$new] = $channel->query->result[$k][$old];
             }
             // -------------------------------------
             //  Occurrence variables
             // -------------------------------------
             foreach ($events[$entry_id]->default_data as $key => $val) {
                 if (!is_array($val)) {
                     if ($val == 'y' or $val == 'n') {
                         $channel->query->result[$k]['occurrence_' . $key] = $val == 'y' ? TRUE : FALSE;
                     } else {
                         $channel->query->result[$k]['occurrence_' . $key] = $val;
                     }
                 } else {
                     foreach ($val as $vkey => $vval) {
                         if ($vval === 'y' or $vval === 'n') {
                             $channel->query->result[$k]['occurrence_' . $key . '_' . $vkey] = $vval == 'y' ? TRUE : FALSE;
                         } else {
                             $channel->query->result[$k]['occurrence_' . $key . '_' . $vkey] = $vval;
                         }
                     }
                 }
             }
         }
         unset($CDT);
         //	----------------------------------------
         //	Redeclare
         //	----------------------------------------
         //	We will reassign the $channel->query->result with our
         //	reordered array of values. Thank you PHP for being so fast with array loops.
         //	----------------------------------------
         if (APP_VER < 2.0) {
             $channel->query->result = $channel->query->result;
         } else {
             $channel->query->result_array = $channel->query->result;
         }
         // --------------------------------------------
         //  Typography
         // --------------------------------------------
         if (APP_VER < 2.0) {
             if (!class_exists('Typography')) {
                 require PATH_CORE . 'core.typography' . EXT;
             }
             $channel->TYPE = new Typography();
             $channel->TYPE->convert_curly = FALSE;
         } else {
             ee()->load->library('typography');
             ee()->typography->initialize();
             ee()->typography->convert_curly = FALSE;
         }
         $channel->fetch_categories();
         // -------------------------------------
         //  Parse
         // -------------------------------------
         //ee()->TMPL->log_item('Calendar: Parsing, via channel module');
         if (APP_VER < 2.0) {
             $channel->parse_weblog_entries();
         } else {
             $channel->parse_channel_entries();
         }
         // -------------------------------------
         //  Paginate
         // -------------------------------------
         //$channel->add_pagination_data();
         // -------------------------------------
         //  Related entries
         // -------------------------------------
         if (count(ee()->TMPL->related_data) > 0 and count($channel->related_entries) > 0) {
             $channel->parse_related_entries();
         }
         if (count(ee()->TMPL->reverse_related_data) > 0 and count($channel->reverse_related_entries) > 0) {
             $channel->parse_reverse_related_entries();
         }
         // -------------------------------------
         //  Send 'em home
         // -------------------------------------
         $tagdata = $channel->return_data;
         // -------------------------------------
         //  Collect the tagdata
         // -------------------------------------
         preg_match_all("/" . LD . 'occurrences id="(\\d+)"' . RD . '(.*?)' . LD . preg_quote(T_SLASH, '/') . 'occurrences' . RD . '/s', $tagdata, $matches);
         foreach ($matches[1] as $k => $id) {
             $tagdatas[$id] = $matches[2][$k];
         }
         //ee()->TMPL = ee()->TMPL_orig;
     }
     // -------------------------------------
     //  Date and time variables
     // -------------------------------------
     $dt_vars = array('start_date', 'end_date', 'start_time', 'end_time');
     $count = 1;
     $total = 0;
     foreach ($data->dates as $date) {
         $total += count($date);
     }
     if (empty($data->dates)) {
         return $this->no_results();
     }
     //--------------------------------------------
     //	reverse sorting
     //--------------------------------------------
     if ($this->parent_method == 'occurrences' and ee()->TMPL->fetch_param('reverse') and strtolower(ee()->TMPL->fetch_param('reverse')) === 'true') {
         krsort($data->dates);
     }
     //--------------------------------------------
     //	orderby sorting
     //--------------------------------------------
     /*if ($this->parent_method == 'occurrences' AND
     			ee()->TMPL->fetch_param('orderby'))
     		{
     			$sort = (ee()->TMPL->fetch_param('sort') AND
     					 strtolower(ee()->TMPL->fetch_param('sort')) === 'DESC') ? 'DESC' : 'ASC';
     
     
     		}*/
     //--------------------------------------------
     //	pagination
     //--------------------------------------------
     if ($this->parent_method === 'occurrences') {
         $this->paginate = FALSE;
     }
     $limit = ee()->TMPL->fetch_param('occurrences_limit') ? ee()->TMPL->fetch_param('occurrences_limit') : $this->limit;
     if ($limit > 0 and $this->parent_method === 'occurrences' and $total > $limit) {
         //get pagination info
         $pagination_data = $this->universal_pagination(array('total_results' => $total, 'tagdata' => $tagdata . $this->paginate_tagpair_data, 'limit' => $limit, 'uri_string' => ee()->uri->uri_string, 'paginate_prefix' => 'calendar_'));
         //if we paginated, sort the data
         if ($pagination_data['paginate'] === TRUE) {
             $this->paginate = $pagination_data['paginate'];
             $this->page_next = $pagination_data['page_next'];
             $this->page_previous = $pagination_data['page_previous'];
             $this->p_page = $pagination_data['pagination_page'];
             $this->current_page = $pagination_data['current_page'];
             $this->pager = $pagination_data['pagination_links'];
             $this->basepath = $pagination_data['base_url'];
             $this->total_pages = $pagination_data['total_pages'];
             $this->paginate_data = $pagination_data['paginate_tagpair_data'];
             $this->page_count = $pagination_data['page_count'];
             //$tagdata				= $pagination_data['tagdata'];
         }
     }
     //--------------------------------------------
     //	event limiter
     //--------------------------------------------
     $offset = ee()->TMPL->fetch_param('occurrences_offset') ? ee()->TMPL->fetch_param('occurrences_offset') : 0;
     $page = ($this->current_page - 1) * $limit;
     if ($this->parent_method === 'occurrences' and $page > 0) {
         $offset += $page;
     }
     //--------------------------------------------
     //	Add final variables and swap out,
     //	then add tagdata to return variable
     //--------------------------------------------
     $offset_counter = 0;
     foreach ($data->dates as $ymd => $times) {
         foreach ($times as $time => $info) {
             //offset and limiting
             if ($this->parent_method === 'occurrences' and ++$offset_counter <= $offset) {
                 continue;
             }
             if ($this->parent_method === 'occurrences' and $offset_counter > $limit + $offset) {
                 break 2;
             }
             //--------------------------------------------
             //	output variables
             //--------------------------------------------
             $tdata = isset($data->occurrences[$ymd][$time]['entry_id']) ? $tagdatas[$data->occurrences[$ymd][$time]['entry_id']] : $tagdatas[$data->default_data['entry_id']];
             if ($info['all_day'] === TRUE or $info['all_day'] == 'y') {
                 $info['date']['time'] = '0000';
                 $info['date']['hour'] = '00';
                 $info['date']['minute'] = '00';
                 $info['end_date']['time'] = '2400';
                 $info['end_date']['hour'] = '24';
                 $info['end_date']['minute'] = '00';
                 $info['duration']['hours'] = '24';
             }
             $vars = array('single' => array('occurrence_duration_minutes' => $info['duration']['minutes'], 'occurrence_duration_hours' => $info['duration']['hours'], 'occurrence_duration_days' => $info['duration']['days'], 'occurrence_id' => isset($data->occurrences[$ymd][$time]['entry_id']) ? $data->occurrences[$ymd][$time]['entry_id'] : $data->default_data['entry_id'], 'occurrence_start_year' => $info['date']['year'], 'occurrence_start_month' => $info['date']['month'], 'occurrence_start_day' => $info['date']['day'], 'occurence_start_hour' => $info['date']['hour'], 'occurrence_start_minute' => $info['date']['minute'], 'occurrence_end_year' => $info['end_date']['year'], 'occurrence_end_month' => $info['end_date']['month'], 'occurrence_end_day' => $info['end_date']['day'], 'occurrence_end_hour' => $info['end_date']['hour'], 'occurrence_end_minute' => $info['end_date']['minute'], 'occurrence_count' => $count, 'occurrence_total' => $total, 'occurrence_author_id' => isset($entry_info['author_id']) ? $entry_info['author_id'] : '', 'occurrence_author' => isset($entry_info['screen_name']) ? $entry_info['screen_name'] : (isset($entry_info['username']) ? $entry_info['username'] : ''), 'occurrence_title' => isset($entry_info['title']) ? $entry_info['title'] : '', 'occurrence_url_title' => isset($entry_info['url_title']) ? $entry_info['url_title'] : '', 'occurrence_status' => isset($entry_info['status']) ? $entry_info['status'] : ''), 'conditional' => array('occurrence_all_day' => $info['all_day'], 'occurrence_multi_day' => $info['multi_day'], 'occurrence_status' => isset($entry_info['status']) ? $entry_info['status'] : '', 'occurrence_author_id' => isset($entry_info['author_id']) ? $entry_info['author_id'] : ''), 'date' => array('occurrence_start_date' => $info['date'], 'occurrence_start_time' => $info['date'], 'occurrence_end_date' => $info['end_date'], 'occurrence_end_time' => $info['end_date']));
             $output .= $this->swap_vars($vars, $tdata);
             $count++;
         }
     }
     //--------------------------------------------
     //	offset too much? buh bye
     //--------------------------------------------
     if (trim($output) === '') {
         return $this->no_results();
     }
     return $output;
 }
 /**
  *	List of Entires for an Author, Sub-Processing for entries() method
  *
  *	@access		private
  *	@param		array
  *	@return		string
  */
 private function _entries($params = array())
 {
     /**	----------------------------------------
     		/**	Execute?
     		/**	----------------------------------------*/
     if ($this->entry_id == '') {
         return FALSE;
     }
     /**	----------------------------------------
     		/**	Invoke Channel/Weblog class
     		/**	----------------------------------------*/
     if (APP_VER < 2.0) {
         if (!class_exists('Weblog')) {
             require PATH_MOD . 'weblog/mod.weblog' . EXT;
         }
         $channel = new Weblog();
     } else {
         if (!class_exists('Channel')) {
             require PATH_MOD . 'channel/mod.channel.php';
         }
         $channel = new Channel();
     }
     // --------------------------------------------
     //  Invoke Pagination for EE 2.4 and Above
     // --------------------------------------------
     if (APP_VER >= '2.4.0') {
         ee()->load->library('pagination');
         $channel->pagination = new Pagination_object('Channel');
         // Used by pagination to determine whether we're coming from the cache
         $channel->pagination->dynamic_sql = FALSE;
     }
     /**	----------------------------------------
     		/**	Pass params
     		/**	----------------------------------------*/
     ee()->TMPL->tagparams['entry_id'] = $this->entry_id;
     ee()->TMPL->tagparams['inclusive'] = '';
     if (isset($params['dynamic']) and $params['dynamic'] == "off") {
         if (APP_VER < 2.0) {
             ee()->TMPL->tagparams['dynamic'] = 'off';
         } else {
             ee()->TMPL->tagparams['dynamic'] = 'no';
         }
     }
     /**	----------------------------------------
     		/**	Pre-process related data
     		/**	----------------------------------------*/
     ee()->TMPL->tagdata = ee()->TMPL->assign_relationship_data(ee()->TMPL->tagdata);
     ee()->TMPL->var_single = array_merge(ee()->TMPL->var_single, ee()->TMPL->related_markers);
     /**	----------------------------------------
     		/**	Execute needed methods
     		/**	----------------------------------------*/
     if (APP_VER < 2.0) {
         $channel->fetch_custom_weblog_fields();
     } else {
         $channel->fetch_custom_channel_fields();
     }
     $channel->fetch_custom_member_fields();
     // --------------------------------------------
     //  Pagination Tags Parsed Out
     // --------------------------------------------
     if (APP_VER >= '2.4.0') {
         $channel->pagination->get_template();
     } else {
         $channel->fetch_pagination_data();
     }
     if (APP_VER >= '2.4.0') {
         $channel->pagination->cfields = $channel->cfields;
         $channel->pagination->build();
     } else {
         $channel->create_pagination();
     }
     /**	----------------------------------------
     		/**	Grab entry data
     		/**	----------------------------------------*/
     //$channel->create_pagination();
     $channel->build_sql_query();
     if ($channel->sql == '') {
         return $this->no_results();
     }
     $channel->query = ee()->db->query($channel->sql);
     if (APP_VER < 2.0) {
         $channel->query->result = $channel->query->result_array();
     }
     if (!isset($channel->query) or $channel->query->num_rows() == 0) {
         return $this->no_results();
     }
     if (APP_VER < 2.0) {
         if (!class_exists('Typography')) {
             require PATH_CORE . 'core.typography' . EXT;
         }
         $channel->TYPE = new Typography();
         $channel->TYPE->convert_curly = FALSE;
     } else {
         ee()->load->library('typography');
         ee()->typography->initialize();
         ee()->typography->convert_curly = FALSE;
     }
     $channel->fetch_categories();
     /**	----------------------------------------
     		/**	Parse and return entry data
     		/**	----------------------------------------*/
     if (APP_VER < 2.0) {
         $channel->parse_weblog_entries();
     } else {
         $channel->parse_channel_entries();
     }
     if (APP_VER >= '2.4.0') {
         $channel->return_data = $channel->pagination->render($channel->return_data);
     } else {
         $channel->add_pagination_data();
     }
     /**	----------------------------------------
     		/**	Count tag
     		/**	----------------------------------------*/
     if (count(ee()->TMPL->related_data) > 0 and count($channel->related_entries) > 0) {
         $channel->parse_related_entries();
     }
     if (count(ee()->TMPL->reverse_related_data) > 0 and count($channel->reverse_related_entries) > 0) {
         $channel->parse_reverse_related_entries();
     }
     // ----------------------------------------
     //  Handle problem with pagination segments in the url
     // ----------------------------------------
     if (preg_match("#(/P\\d+)#", ee()->uri->uri_string, $match)) {
         $channel->return_data = str_replace($match['1'], "", $channel->return_data);
     } elseif (preg_match("#(P\\d+)#", ee()->uri->uri_string, $match)) {
         $channel->return_data = str_replace($match['1'], "", $channel->return_data);
     }
     $tagdata = $channel->return_data;
     return $tagdata;
 }
示例#8
0
 /**
  * Tell a friend form
  *
  * {exp:email:tell_a_friend charset="utf-8" allow_html='n'}
  * {exp:email:tell_a_friend charset="utf-8" allow_html='<p>,<a>' recipients='*****@*****.**'}
  * {member_email}, {member_name}, {current_time format="%Y %d %m"}
  */
 public function tell_a_friend()
 {
     if (ee()->uri->query_string == '') {
         return FALSE;
     }
     // Recipient Email Checking
     $this->_user_recipients = 'yes';
     // By default
     $recipients = ee()->TMPL->fetch_param('recipients', '');
     $charset = ee()->TMPL->fetch_param('charset', '');
     $allow_html = ee()->TMPL->fetch_param('allow_html');
     // Equalize $allow_html value
     $allow_html = (is_string($allow_html) and in_array($allow_html, array('yes', 'y', 'true'))) ? TRUE : $allow_html;
     $allow_html = (is_string($allow_html) and in_array($allow_html, array('no', 'n', 'false'))) ? FALSE : $allow_html;
     if (!ee()->TMPL->fetch_param('status')) {
         ee()->TMPL->tagparams['status'] = 'open';
     }
     // Clean and check recipient emails, if any
     if ($recipients != '') {
         $array = $this->validate_recipients($recipients);
         // Put together into string again
         $recipients = implode(',', $array['approved']);
     }
     // Parse page number
     // We need to strip the page number from the URL for two reasons:
     // 1. So we can create pagination links
     // 2. So it won't confuse the query with an improper proper ID
     // Conditionally get query string based on whether or not the page
     // was accessed through the Pages module
     $qstring = empty(ee()->uri->page_query_string) ? ee()->uri->query_string : ee()->uri->page_query_string;
     if (preg_match("#/P(\\d+)#", $qstring, $match)) {
         $current_page = $match['1'];
         $qstring = reduce_double_slashes(str_replace($match[0], '', $qstring));
     }
     // Remove "N"
     // The recent comments feature uses "N" as the URL indicator
     // It needs to be removed if presenst
     if (preg_match("#/N(\\d+)#", $qstring, $match)) {
         $qstring = reduce_double_slashes(str_replace($match[0], '', $qstring));
     }
     /* -------------------------------------
     		/*  'email_module_tellafriend_override' hook.
     		/*  - Allow use of Tell-A-Friend for things besides channel entries
     		/*  - Added EE 1.5.1
     		*/
     if (ee()->extensions->active_hook('email_module_tellafriend_override') === TRUE) {
         $tagdata = ee()->extensions->call('email_module_tellafriend_override', $qstring, $this);
         if (ee()->extensions->end_script === TRUE) {
             return $tagdata;
         }
     } else {
         $entry_id = trim($qstring);
         // If there is a slash in the entry ID we'll kill everything after it.
         $entry_id = preg_replace("#/.+#", "", $entry_id);
         //  Do we have a vaild channel and ID number?
         $timestamp = ee()->TMPL->cache_timestamp != '' ? ee()->TMPL->cache_timestamp : ee()->localize->now;
         $channel = ee()->TMPL->fetch_param('channel', '');
         ee()->db->select('entry_id')->from(array('channel_titles ct', 'channels c'))->where('ct.channel_id = c.channel_id', '', FALSE)->where('(ct.expiration_date = 0 OR expiration_date > ' . $timestamp . ')', '', FALSE)->where('ct.status !=', 'closed');
         $table = !is_numeric($entry_id) ? 'ct.url_title' : 'ct.entry_id';
         ee()->db->where($table, $entry_id);
         if ($channel != '') {
             ee()->functions->ar_andor_string($channel, 'c.channel_name');
         }
         $query = ee()->db->get();
         // Bad ID?  See ya!
         if ($query->num_rows() === 0) {
             return FALSE;
         }
         // Fetch the channel entry
         if (!class_exists('Channel')) {
             require PATH_MOD . 'channel/mod.channel.php';
         }
         $channel = new Channel();
         $channel->fetch_custom_channel_fields();
         $channel->fetch_custom_member_fields();
         $channel->build_sql_query();
         if ($channel->sql == '') {
             return FALSE;
         }
         $channel->query = ee()->db->query($channel->sql);
         if ($channel->query->num_rows() === 0) {
             return FALSE;
         }
         ee()->load->library('typography');
         ee()->typography->initialize(array('encode_email' => FALSE, 'convert_curly' => FALSE));
         $channel->fetch_categories();
         $channel->parse_channel_entries();
         $tagdata = $channel->return_data;
     }
     /*
     		/* -------------------------------------*/
     // Parse conditionals
     $cond = array();
     $cond['captcha'] = $this->use_captchas == 'y' ? TRUE : FALSE;
     $tagdata = ee()->functions->prep_conditionals($tagdata, $cond);
     // Parse tell-a-friend variables
     // {member_name}
     $tagdata = ee()->TMPL->swap_var_single('member_name', ee()->session->userdata['screen_name'], $tagdata);
     // {member_email}
     $tagdata = ee()->TMPL->swap_var_single('member_email', ee()->session->userdata['email'], $tagdata);
     // A little work on the form field's values
     // Match values in input fields
     $tagdata = $this->_strip_field_html($tagdata, "/<input(.*?)value=\"(.*?)\"/", $allow_html);
     // Remove line breaks
     $LB = 'snookums9loves4wookie';
     $tagdata = str_replace(array("\r\n", "\r", "\n"), $LB, $tagdata);
     // Match textarea content
     $tagdata = $this->_strip_field_html($tagdata, "/<textarea(.*?)>(.*?)<\\/textarea>/", $allow_html);
     $tagdata = str_replace($LB, "\n", $tagdata);
     $allow = $allow_html !== FALSE ? TRUE : FALSE;
     return $this->_setup_form($tagdata, $recipients, 'tellafriend_form', $allow);
 }
示例#9
0
 /** ----------------------------------------
 	/**  Show search results
 	/** ----------------------------------------*/
 function search_results()
 {
     // Fetch the search language file
     ee()->lang->loadfile('search');
     // Load Pagination Object
     ee()->load->library('pagination');
     $pagination = ee()->pagination->create();
     ee()->TMPL->tagdata = $pagination->prepare(ee()->TMPL->tagdata);
     // Check search ID number
     // If the QSTR variable is less than 32 characters long we
     // don't have a valid search ID number
     if (strlen(ee()->uri->query_string) < 32) {
         return ee()->output->show_user_error('off', array(lang('search_no_result')));
     }
     // Clear old search results
     ee()->db->delete('search', array('site_id' => ee()->config->item('site_id'), 'search_date <' => ee()->localize->now - $this->cache_expire * 3600));
     // Retrieve the search_id
     $qstring = explode('/', ee()->uri->query_string);
     $search_id = trim($qstring[0]);
     // Fetch the cached search query
     $query = ee()->db->get_where('search', array('search_id' => $search_id));
     if ($query->num_rows() == 0 or $query->row('total_results') == 0) {
         // This should be impossible as we already know there are results
         return ee()->output->show_user_error('general', array(lang('invalid_action')));
     }
     $fields = $query->row('custom_fields') == '' ? array() : unserialize(stripslashes($query->row('custom_fields')));
     $sql = unserialize(stripslashes($query->row('query')));
     $sql = str_replace('MDBMPREFIX', 'exp_', $sql);
     $pagination->per_page = (int) $query->row('per_page');
     $res_page = $query->row('result_page');
     // -------------------------------------------
     // 'channel_search_modify_result_query' hook.
     //  - Take the whole query string, do what you wish
     //  - added 2.8
     //
     if (ee()->extensions->active_hook('channel_search_modify_result_query') === TRUE) {
         $modified_sql = ee()->extensions->call('channel_search_modify_result_query', $sql, $search_id);
         // Make sure its valid
         if (is_string($modified_sql) && $modified_sql != '') {
             $sql = $modified_sql;
         }
     }
     //
     // -------------------------------------------
     // Run the search query
     $query = ee()->db->query(preg_replace("/SELECT(.*?)\\s+FROM\\s+/is", 'SELECT COUNT(*) AS count FROM ', $sql));
     if ($query->row('count') == 0) {
         // This should also be impossible
         return ee()->output->show_user_error('general', array(lang('invalid_action')));
     }
     // Calculate total number of pages and add total rows
     $pagination->total_items = $query->row('count');
     // Build pagination if enabled
     // If we're paginating limit the query and do it again
     if ($pagination->paginate === TRUE) {
         $pagination->build($pagination->total_items, $pagination->per_page);
         $sql .= " LIMIT " . $pagination->offset . ", " . $pagination->per_page;
     } else {
         $sql .= " LIMIT 0, 100";
     }
     $query = ee()->db->query($sql);
     $output = '';
     if (!class_exists('Channel')) {
         require PATH_MOD . 'channel/mod.channel.php';
     }
     unset(ee()->TMPL->var_single['auto_path']);
     unset(ee()->TMPL->var_single['excerpt']);
     unset(ee()->TMPL->var_single['id_auto_path']);
     unset(ee()->TMPL->var_single['full_text']);
     unset(ee()->TMPL->var_single['switch']);
     foreach (ee()->TMPL->var_single as $key => $value) {
         if (substr($key, 0, strlen('member_path')) == 'member_path') {
             unset(ee()->TMPL->var_single[$key]);
         }
     }
     $channel = new Channel();
     // This allows the channel {absolute_count} variable to work
     $channel->pagination->offset = $pagination->per_page * $pagination->current_page - $pagination->per_page;
     $channel->fetch_custom_channel_fields();
     $channel->fetch_custom_member_fields();
     $channel->query = ee()->db->query($sql);
     if ($channel->query->num_rows() == 0) {
         return ee()->TMPL->no_results();
     }
     ee()->load->library('typography');
     ee()->typography->initialize(array('convert_curly' => FALSE, 'encode_email' => FALSE));
     $channel->fetch_categories();
     $channel->parse_channel_entries();
     $output = $channel->return_data;
     // Fetch member path variable
     // We do it here in case it's used in multiple places.
     $m_paths = array();
     if (preg_match_all("/" . LD . "member_path(\\s*=.*?)" . RD . "/s", ee()->TMPL->tagdata, $matches)) {
         for ($j = 0; $j < count($matches['0']); $j++) {
             $m_paths[] = array($matches['0'][$j], ee()->functions->extract_path($matches['1'][$j]));
         }
     }
     // Fetch switch param
     $switch1 = '';
     $switch2 = '';
     if ($switch = ee()->TMPL->fetch_param('switch')) {
         if (strpos($switch, '|') !== FALSE) {
             $x = explode("|", $switch);
             $switch1 = $x['0'];
             $switch2 = $x['1'];
         } else {
             $switch1 = $switch;
         }
     }
     /** -----------------------------
     		/**  Result Loop - Legacy!
     		/** -----------------------------*/
     $i = 0;
     foreach ($query->result_array() as $row) {
         if (isset($row['field_id_' . $row['search_excerpt']]) and $row['field_id_' . $row['search_excerpt']]) {
             $format = !isset($row['field_ft_' . $row['search_excerpt']]) ? 'xhtml' : $row['field_ft_' . $row['search_excerpt']];
             $full_text = ee()->typography->parse_type(strip_tags(preg_replace('/\\s+/', ' ', preg_replace('/<[\\/?][p|br|div|h1|h2]*>/', ' ', $row['field_id_' . $row['search_excerpt']]))), array('text_format' => $format, 'html_format' => 'safe', 'auto_links' => 'y', 'allow_img_url' => 'n'));
             $excerpt = trim(strip_tags($full_text));
             if (strpos($excerpt, "\r") !== FALSE or strpos($excerpt, "\n") !== FALSE) {
                 $excerpt = str_replace(array("\r\n", "\r", "\n"), " ", $excerpt);
             }
             $excerpt = ee()->functions->word_limiter($excerpt, 50);
         } else {
             $excerpt = '';
             $full_text = '';
         }
         // Parse permalink path
         $url = $row['search_results_url'] != '' ? $row['search_results_url'] : $row['channel_url'];
         $path = reduce_double_slashes(ee()->functions->prep_query_string($url) . '/' . $row['url_title']);
         $idpath = reduce_double_slashes(ee()->functions->prep_query_string($url) . '/' . $row['entry_id']);
         $switch = $i++ % 2 ? $switch1 : $switch2;
         $output = preg_replace("/" . LD . 'switch' . RD . "/", $switch, $output, count(explode(LD . 'switch' . RD, ee()->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'auto_path' . RD . "/", $path, $output, count(explode(LD . 'auto_path' . RD, ee()->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'id_auto_path' . RD . "/", $idpath, $output, count(explode(LD . 'id_auto_path' . RD, ee()->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'excerpt' . RD . "/", $this->_escape_replacement_pattern($excerpt), $output, count(explode(LD . 'excerpt' . RD, ee()->TMPL->tagdata)) - 1);
         $output = preg_replace("/" . LD . 'full_text' . RD . "/", $this->_escape_replacement_pattern($full_text), $output, count(explode(LD . 'full_text' . RD, ee()->TMPL->tagdata)) - 1);
         // Parse member_path
         if (count($m_paths) > 0) {
             foreach ($m_paths as $val) {
                 $output = preg_replace("/" . preg_quote($val['0'], '/') . "/", ee()->functions->create_url($val['1'] . '/' . $row['member_id']), $output, 1);
             }
         }
     }
     ee()->TMPL->tagdata = $output;
     // Add new pagination
     ee()->TMPL->tagdata = $pagination->render(ee()->TMPL->tagdata);
     // Parse lang variables
     $swap = array('lang:total_search_results' => lang('search_total_results'), 'lang:search_engine' => lang('search_engine'), 'lang:search_results' => lang('search_results'), 'lang:search' => lang('search'), 'lang:title' => lang('search_title'), 'lang:channel' => lang('search_channel'), 'lang:excerpt' => lang('search_excerpt'), 'lang:author' => lang('search_author'), 'lang:date' => lang('search_date'), 'lang:total_comments' => lang('search_total_comments'), 'lang:recent_comments' => lang('search_recent_comment_date'), 'lang:keywords' => lang('search_keywords'));
     ee()->TMPL->template = ee()->functions->var_swap(ee()->TMPL->template, $swap);
     return ee()->TMPL->tagdata;
 }
示例#10
0
	/** ----------------------------------------
	/**  Show search results
	/** ----------------------------------------*/
	
	function search_results()
	{
		// Fetch the search language file
		$this->EE->lang->loadfile('search');
		
		// Check search ID number
		// If the QSTR variable is less than 32 characters long we
		// don't have a valid search ID number
		
		if (strlen($this->EE->uri->query_string) < 32)
		{
			return $this->EE->output->show_user_error('off', array($this->EE->lang->line('search_no_result')), $this->EE->lang->line('search_result_heading'));		
		}		
				
		// Clear old search results
		$expire = time() - ($this->cache_expire * 3600);
		
		$this->EE->db->query("DELETE FROM exp_search WHERE site_id = '".$this->EE->db->escape_str($this->EE->config->item('site_id'))."' AND search_date < '$expire'");
		
		// Fetch ID number and page number
		$cur_page = 0;
		$qstring = $this->EE->uri->query_string;

		// Parse page number
		if (preg_match("#^P(\d+)|/P(\d+)#", $qstring, $match))
		{
			$cur_page = (isset($match[2])) ? $match[2] : $match[1];
			$search_id = trim_slashes(str_replace($match[0], '', $qstring));
		}
		else
		{
			$search_id = $qstring;
		}
		
		// If there is a slash in the search ID we'll kill everything after it.
		$search_id = trim($search_id); 
		$search_id = preg_replace("#/.+#", "", $search_id);			
		
		// Fetch the cached search query
		$query = $this->EE->db->get_where('search', array('search_id' => $search_id));
		
		if ($query->num_rows() == 0 OR $query->row('total_results')  == 0)
		{
			return $this->EE->output->show_user_error('off', array($this->EE->lang->line('search_no_result')), $this->EE->lang->line('search_result_heading'));		
		}
		
		$fields = ($query->row('custom_fields') == '') ? array() : unserialize(stripslashes($query->row('custom_fields') ));
		$sql 	= unserialize(stripslashes($query->row('query')));
		$sql	= str_replace('MDBMPREFIX', 'exp_', $sql);
		
		$per_page = $query->row('per_page');
		$res_page = $query->row('result_page');
		
		// Run the search query
		$query = $this->EE->db->query(preg_replace("/SELECT(.*?)\s+FROM\s+/is", 'SELECT COUNT(*) AS count FROM ', $sql));
		
		if ($query->row('count')  == 0)
		{
			return $this->EE->output->show_user_error('off', array($this->EE->lang->line('search_no_result')), $this->EE->lang->line('search_result_heading'));		
		}
		
		// Calculate total number of pages
		$current_page =  ($cur_page / $per_page) + 1;
			
		$total_pages = intval($query->row('count')  / $per_page);
		
		if ($query->row('count')  % $per_page) 
		{
			$total_pages++;
		}		
		
		$page_count = $this->EE->lang->line('page').' '.$current_page.' '.$this->EE->lang->line('of').' '.$total_pages;
		
		//  Do we need pagination?
		// If so, we'll add the LIMIT clause to the SQL statement and run the query again				
		$pager = ''; 		
		
		if ($query->row('count')  > $per_page)
		{ 											
			$this->EE->load->library('pagination');

			$config = array(
					'base_url' 		=> $this->EE->functions->create_url($res_page.'/'.$search_id, 0, 0),
					'prefix'		=> 'P',
					'total_rows'	=> $query->row('count'),
					'per_page'		=> $per_page,
					'cur_page'		=> $cur_page,
					'first_link'	=> $this->EE->lang->line('pag_first_link'),
					'last_link'		=> $this->EE->lang->line('pag_last_link'),
					'uri_segment'	=> 0 // Allows $config['cur_page'] to override
				);

			$this->EE->pagination->initialize($config);
			$pager = $this->EE->pagination->create_links();			
			 
			$sql .= " LIMIT ".$cur_page.", ".$per_page;	
		}
		
		$query = $this->EE->db->query($sql);
		
		$output = '';
		
		if ( ! class_exists('Channel'))
		{
			require PATH_MOD.'channel/mod.channel'.EXT;
		}
		
		unset($this->EE->TMPL->var_single['auto_path']);
		unset($this->EE->TMPL->var_single['excerpt']);
		unset($this->EE->TMPL->var_single['id_auto_path']);
		unset($this->EE->TMPL->var_single['full_text']);
		unset($this->EE->TMPL->var_single['switch']);
		
		foreach($this->EE->TMPL->var_single as $key => $value)
		{
			if (substr($key, 0, strlen('member_path')) == 'member_path')
			{
				unset($this->EE->TMPL->var_single[$key]);
			}
		}

		$channel = new Channel;		

		// This allows the channel {absolute_count} variable to work
		$channel->p_page = ($per_page * $current_page) - $per_page;

		$channel->fetch_custom_channel_fields();
		$channel->fetch_custom_member_fields();
		$channel->query = $this->EE->db->query($sql);
		
		if ($channel->query->num_rows() == 0)
		{
			return $this->EE->TMPL->no_results();
		}
		
		$this->EE->load->library('typography');
		$this->EE->typography->initialize();
		$this->EE->typography->convert_curly = FALSE;
		$this->EE->typography->encode_email = FALSE;
		
		$channel->fetch_categories();
		$channel->parse_channel_entries();
		
		$tagdata = $this->EE->TMPL->tagdata;

		// Does the tag contain "related entries" that we need to parse out?
		if (count($this->EE->TMPL->related_data) > 0 AND count($channel->related_entries) > 0)
		{
			$channel->parse_related_entries();
		}
		
		if (count($this->EE->TMPL->reverse_related_data) > 0 AND count($channel->reverse_related_entries) > 0)
		{
			$channel->parse_reverse_related_entries();
		}
				
		$output = $channel->return_data;
		
		$this->EE->TMPL->tagdata = $tagdata;
		
		// Fetch member path variable
		// We do it here in case it's used in multiple places.		
		$m_paths = array();
		
		if (preg_match_all("/".LD."member_path(\s*=.*?)".RD."/s", $this->EE->TMPL->tagdata, $matches))
		{ 
			for ($j = 0; $j < count($matches['0']); $j++)
			{			
				$m_paths[] = array($matches['0'][$j], $this->EE->functions->extract_path($matches['1'][$j]));
			}
		}
		
		// Fetch switch param
		$switch1 = '';
		$switch2 = '';
		
		if ($switch = $this->EE->TMPL->fetch_param('switch'))
		{
			if (strpos($switch, '|') !== FALSE)
			{
				$x = explode("|", $switch);
				
				$switch1 = $x['0'];
				$switch2 = $x['1'];
			}
			else
			{
				$switch1 = $switch;
			}
		}	
		
		/** -----------------------------
		/**  Result Loop - Legacy!
		/** -----------------------------*/
		
		$i = 0;
				
		foreach ($query->result_array() as $row)
		{
			if (isset($row['field_id_'.$row['search_excerpt']]) AND $row['field_id_'.$row['search_excerpt']])
			{
				$format = ( ! isset($row['field_ft_'.$row['search_excerpt']])) ? 'xhtml' : $row['field_ft_'.$row['search_excerpt']];
			
				$full_text = $this->EE->typography->parse_type(strip_tags($row['field_id_'.$row['search_excerpt']]), 
														array(
																'text_format'	=> $format,
																'html_format'	=> 'safe',
																'auto_links'	=> 'y',
																'allow_img_url' => 'n'
															));
															
				$excerpt = trim(strip_tags($full_text));
				
				if (strpos($excerpt, "\r") !== FALSE OR strpos($excerpt, "\n") !== FALSE)
				{
					$excerpt = str_replace(array("\r\n", "\r", "\n"), " ", $excerpt);
				}

				$excerpt = $this->EE->functions->word_limiter($excerpt, 50);
			}
			else
			{
				$excerpt = '';
				$full_text = '';
			}
			
			// Parse permalink path
												
			$url = ($row['search_results_url'] != '') ? $row['search_results_url'] : $row['channel_url'];		
						
			$path = $this->EE->functions->remove_double_slashes($this->EE->functions->prep_query_string($url).'/'.$row['url_title']);
			$idpath = $this->EE->functions->remove_double_slashes($this->EE->functions->prep_query_string($url).'/'.$row['entry_id']);
			
			$switch = ($i++ % 2) ? $switch1 : $switch2;
			$output = preg_replace("/".LD.'switch'.RD."/", $switch, $output, count(explode(LD.'switch'.RD, $this->EE->TMPL->tagdata)) - 1);
			$output = preg_replace("/".LD.'auto_path'.RD."/", $path, $output, count(explode(LD.'auto_path'.RD, $this->EE->TMPL->tagdata)) - 1);
			$output = preg_replace("/".LD.'id_auto_path'.RD."/", $idpath, $output, count(explode(LD.'id_auto_path'.RD, $this->EE->TMPL->tagdata)) - 1);
			$output = preg_replace("/".LD.'excerpt'.RD."/", preg_quote($excerpt), $output, count(explode(LD.'excerpt'.RD, $this->EE->TMPL->tagdata)) - 1);
			$output = preg_replace("/".LD.'full_text'.RD."/", preg_quote($full_text), $output, count(explode(LD.'full_text'.RD, $this->EE->TMPL->tagdata)) - 1);
		
			// Parse member_path
			
			if (count($m_paths) > 0)
			{
				foreach ($m_paths as $val)
				{					
					$output = preg_replace("/".preg_quote($val['0'], '/')."/", $this->EE->functions->create_url($val['1'].'/'.$row['member_id']), $output, 1);
				}
			}
		
		}
		
		
		$this->EE->TMPL->tagdata = $output;
		
		/** ----------------------------------------
		/**  Parse variables
		/** ----------------------------------------*/
		
		$swap = array(
						'lang:total_search_results'	=>	$this->EE->lang->line('search_total_results'),
						'lang:search_engine'		=>	$this->EE->lang->line('search_engine'),
						'lang:search_results'		=>	$this->EE->lang->line('search_results'),
						'lang:search'				=>	$this->EE->lang->line('search'),
						'lang:title'				=>	$this->EE->lang->line('search_title'),
						'lang:channel'				=>	$this->EE->lang->line('search_channel'),
						'lang:excerpt'				=>	$this->EE->lang->line('search_excerpt'),
						'lang:author'				=>	$this->EE->lang->line('search_author'),
						'lang:date'					=>	$this->EE->lang->line('search_date'),
						'lang:total_comments'		=>	$this->EE->lang->line('search_total_comments'),
						'lang:recent_comments'		=>	$this->EE->lang->line('search_recent_comment_date'),
						'lang:keywords'				=>	$this->EE->lang->line('search_keywords')
					);
	
		$this->EE->TMPL->template = $this->EE->functions->var_swap($this->EE->TMPL->template, $swap);

		/** ----------------------------------------
		/**  Add Pagination
		/** ----------------------------------------*/
		if ($pager == '')
		{
			$this->EE->TMPL->template = preg_replace("#".LD."if paginate".RD.".*?".LD."/if".RD."#s", '', $this->EE->TMPL->template);
		}
		else
		{
			$this->EE->TMPL->template = preg_replace("#".LD."if paginate".RD."(.*?)".LD."/if".RD."#s", "\\1", $this->EE->TMPL->template);
		}

		$this->EE->TMPL->template = str_replace(LD.'paginate'.RD, $pager, $this->EE->TMPL->template);
		$this->EE->TMPL->template = str_replace(LD.'page_count'.RD, $page_count, $this->EE->TMPL->template);
		
		return stripslashes($this->EE->TMPL->tagdata);
	}