title = get_string('feedstitle', 'block_rss_client');
        $this->version = 2004112001;
    }
    function preferred_width() {
        return 210;
    }
    function specialization() {
        // After the block has been loaded we customize the block's title display
        if (!empty($this->config) && !empty($this->config->title)) {
            // There is a customized block title, display it
            $this->title = $this->config->title;
        } else {
            // No customized block title, use localized remote news feed string
            $this->title = get_string('remotenewsfeed', 'block_rss_client');
        }
    }
    function get_content() {
        global $CFG, $editing;
        require_once($CFG->libdir .'/rsslib.php');
        if($this->content !== NULL) {
            return $this->content;
        }
        $this->content = new stdClass;
        $this->content->text   = '';
        $this->content->footer = '';
        if (empty($this->instance)) {
            // We're being asked for content without an associated instance
            return $this->content;
        }
        $output = '';
        $rssid = -1;
        $display_description = false;
        if (isset($CFG->block_rss_client_num_entries) && is_numeric($CFG->block_rss_client_num_entries) ) {
            $shownumentries = intval($CFG->block_rss_client_num_entries);
        } else {
            $shownumentries = 5; //default to 5 entries is not specified by admin or instance
        }
        if (!empty($this->config)) {
            if (!empty($this->config->rssid)) {
                if (is_array($this->config->rssid)) { 
                    $rssidarray = $this->config->rssid;
                } else {     // Make an array of the single value 
                    $rssidarray = array($this->config->rssid);
                }
            }
            if (!empty($this->config->display_description)) {
                $display_description = intval($this->config->display_description);
            }
            if (!empty($this->config->shownumentries)) {
                $shownumentries = intval($this->config->shownumentries);
            }
        }
        $submitters = $CFG->block_rss_client_submitters;
        $isteacher = false;
        $this->courseid = SITEID;
        if ($this->instance->pagetype == PAGE_COURSE_VIEW) {
            $this->courseid = $this->instance->pageid;
            $isteacher = isteacher($this->courseid);
        }
        //if the user is an admin, course teacher, or all users are allowed
        // then allow the user to add rss feeds
        global $USER;
        $userisloggedin = false;
        if (isset($USER) && isset($USER->id) && $USER->id && !isguest()) {
            $userisloggedin = true;
        }
        if ( $userisloggedin && ($submitters == SUBMITTERS_ALL_ACCOUNT_HOLDERS || ($submitters == SUBMITTERS_ADMIN_AND_TEACHER && $isteacher)) ) {
            $page = page_create_object($this->instance->pagetype, $this->instance->pageid);
            if (isset($this->config)) {
                // this instance is configured - show Add/Edit feeds link
                $script = $page->url_get_full(array('instanceid' => $this->instance->id, 'sesskey' => $USER->sesskey, 'blockaction' => 'config', 'currentaction' => 'managefeeds', 'id' => $this->courseid));
                $output .= '
';
            } else {
                // this instance has not been configured yet - show configure link
                $script = $page->url_get_full(array('instanceid' => $this->instance->id, 'sesskey' => $USER->sesskey, 'blockaction' => 'config', 'currentaction' => 'configblock', 'id' => $this->courseid));
                $output .= '';
            }
        }
        // Daryl Hawes note: if count of rssidarray is greater than 1 
        // we should possibly display a drop down menu of selected feed titles
        // so user can select a single feed to view (similar to RSSFeed)
        if (!empty($rssidarray)) {
            $numids = count($rssidarray);
            $count = 0;
            foreach ($rssidarray as $rssid) {
                $output .=  $this->get_rss_by_id($rssid, $display_description, $shownumentries, ($numids > 1) ? true : false);
                if ($numids > 1 && $count != $numids -1 && !empty($rssfeedstring)) {
                    $output .= '
';
                }
                $count ++;
            }
        }
        $this->content->text = $output;
        return $this->content;
    }
    function instance_allow_multiple() {
        return true;
    }
    function has_config() {
        return true;
    }
    function instance_allow_config() {
        return true;
    }
    /**
     * @param int $rssid The feed to be displayed
     * @param bool $display_description Should the description information from the feed be displayed or simply the title?
     * @param int $shownumentries The maximum number of feed entries to be displayed.
     * @param bool $showtitle True if the feed title should be displayed above the feed entries.
     * @return string|NULL
     */
    function get_rss_by_id($rssid, $display_description, $shownumentries, $showtitle=false) {
        global $CFG;
        $returnstring = '';
        $now = time();
        require_once($CFG->libdir .'/rsslib.php');
        require_once(MAGPIE_DIR .'rss_fetch.inc');
        if (!defined('MAGPIE_OUTPUT_ENCODING')) {
            define('MAGPIE_OUTPUT_ENCODING', get_string('thischarset'));  // see bug 3107
        }
        // Check if there is a cached string which has not timed out.
        if (BLOCK_RSS_SECONDARY_CACHE_ENABLED &&
                isset($this->config->{'rssid'. $rssid}) && 
                    isset($this->config->{'rssid'. $rssid .'timestamp'}) && 
                        $this->config->{'rssid'. $rssid .'timestamp'} >= $now - $CFG->block_rss_timeout * 60) {
            // If the cached string is not too stale 
            // use it rather than going any further
            return stripslashes_safe($this->config->{'rssid'. $rssid});
        }
        $rss_record = get_record('block_rss_client', 'id', $rssid);
        if (isset($rss_record) && isset($rss_record->id)) {
            // By capturing the output from fetch_rss this way
            // error messages do not display and clutter up the moodle interface
            // however, we do lose out on seeing helpful messages like "cache hit", etc.
            ob_start();
            $rss = fetch_rss($rss_record->url);
            $rsserror = ob_get_contents();
            ob_end_clean();
            if ($rss === false) {
                if ($CFG->debug && !empty($rsserror)) {
                    // There was a failure in loading the rss feed, print link to full error text
                    return 'Error loading a feed.
'; //Daryl Hawes note: localize this line
                }
            }
            if ($shownumentries > 0 && $shownumentries < count($rss->items) ) {
                $rss->items = array_slice($rss->items, 0, $shownumentries);
            }
            if (empty($rss_record->preferredtitle)) {
                $feedtitle = $this->format_title(stripslashes_safe(rss_unhtmlentities($rss->channel['title'])));
            } else {
                $feedtitle = $this->format_title(stripslashes_safe($rss_record->preferredtitle));
            }
//            print_object($rss);
            if (isset($this->config) && 
                    isset($this->config->block_rss_client_show_channel_image) && 
                        $this->config->block_rss_client_show_channel_image &&
                            isset($rss->image) && isset($rss->image['link']) && isset($rss->image['title']) && isset($rss->image['url']) ) {
                $returnstring .= '';
            }
            if ($showtitle) {
                $returnstring .= ''. $feedtitle .'
';
            } 
            $formatoptions->para = false;
            // first we must verify that the rss feed is loaded
            // by checking $rss and $rss->items exist before using them
            if (empty($rss) || empty($rss->items)) {
                return '';
            }
            foreach ($rss->items as $item) {
                $item['title'] = stripslashes_safe(rss_unhtmlentities($item['title']));
                $item['description'] = stripslashes_safe(rss_unhtmlentities($item['description']));
                if ($item['title'] == '') {
                    // no title present, use portion of description
                    $item['title'] = substr(strip_tags($item['description']), 0, 20) . '...';
                } else {
                    $item['title'] = break_up_long_words($item['title'], 30);
                }
                if ($item['link'] == '') {
                    $item['link'] = $item['guid'];
                }
                $item['link'] = str_replace('&', '&', $item['link']);
                $returnstring .= '' ."\n";
                if ($display_description && !empty($item['description'])) {
                    $item['description'] = break_up_long_words($item['description'], 30);
                    $returnstring .= ''.
                                     format_text($item['description'], FORMAT_MOODLE, $formatoptions, $this->courseid) . 
                                     '
' ."\n";
                }
            }
            if (!empty($rss->channel['link'])) {
                if (!empty($this->config) && isset($this->config->block_rss_client_show_channel_link) && $this->config->block_rss_client_show_channel_link) {
                    $this->content->footer =  ''. get_string('clientchannellink', 'block_rss_client') .'';
                } 
                if (!empty($feedtitle) ) {
                    $feedtitle = ''. $feedtitle .'';
                }
            }
        }
        // if block has no custom title
        if (empty($this->config) || (!empty($this->config) && empty($this->config->title))) {
            // if the feed has a title
            if (!empty($feedtitle) and ($feedtitle != '')) {
                // set the block's title to the feed's title
                $this->title = $feedtitle;
            }
        }
        // store config setting for this rssid so we do not need to read from file each time
        $this->config->{'rssid'. $rssid} = addslashes($returnstring);
        $this->config->{'rssid'. $rssid .'timestamp'} = $now; 
        $this->instance_config_save($this->config);
        return $returnstring;
    }
     // just strips the title down and adds ... for excessively long titles.
     function format_title($title,$max=64) {
         if (strlen($title) <= $max) {
             return $title;
         }
         else {
             return substr($title,0,$max-3).'...';
         }
     }
}
?>