public function generate($grouped = true)
 {
     $objT = new \FrontendTemplate($grouped ? 'watchlist_grouped' : 'watchlist');
     if ($this->isEmpty()) {
         $objT->empty = $GLOBALS['TL_LANG']['WATCHLIST']['empty'];
         return $objT->parse();
     }
     $arrItems = array();
     $arrParents = array();
     $i = 0;
     while (list($id, $item) = each($this->arrItems)) {
         // get view class by type
         $strClass = $GLOBALS['WLV'][$item->type];
         if (!class_exists($strClass)) {
             continue;
         }
         ++$i;
         $strategy = new $strClass();
         $view = new WatchlistItemView($strategy);
         $cssClass = trim(($i == 1 ? 'first ' : '') . ($i == $this->count() ? 'last ' : '') . ($i % 2 == 0 ? 'odd ' : 'even '));
         if (!isset($arrParents[$item->pageID])) {
             $objParentT = new \FrontendTemplate('watchlist_parents');
             $objParentT->items = $this->generateParentList(\PageModel::findByPk($item->pageID));
             $arrParents[$item->pageID] = $objParentT->parse();
         }
         $objItemT = new \FrontendTemplate('watchlist_item');
         $objItemT->cssClass = $cssClass;
         $objItemT->item = $view->generate($item, $this);
         if ($grouped) {
             $arrItems[$item->pageID]['page'] = $arrParents[$item->pageID];
             $arrItems[$item->pageID]['items'][$id] = $objItemT->parse();
         } else {
             $arrPids[$item->pageID] = $arrParents[$item->pageID];
             $arrItems[$id] = $objItemT->parse();
         }
     }
     $objT->pids = array_keys($arrParents);
     $objT->items = $arrItems;
     $objT->actions = $this->generateGlobalActions();
     return $objT->parse();
 }