public static function getInstance(&$debug)
 {
     if (self::$instance === NULL) {
         self::$instance = new serendipity_mobile($debug);
     }
     return self::$instance;
 }
 function event_hook($event, &$bag, &$eventData, $addData = null)
 {
     global $serendipity;
     $hooks =& $bag->get('event_hooks');
     if (isset($hooks[$event])) {
         switch ($event) {
             ////////////////////////////////////////////////////////////////////
             // SITEMAP
             ////////////////////////////////////////////////////////////////////
             case 'backend_publish':
             case 'backend_save':
                 if ($this->get_config('sitemap')) {
                     $this->generateSitemap($bag);
                 }
                 return true;
                 break;
         }
     }
     // plugin enabled?
     if (!$this->get_config('enable')) {
         return false;
     }
     // get instance of serendipity_mobile class
     $this->m = serendipity_mobile::getInstance($this->debugItems);
     // mobile device?
     if (!$this->m->isMobileDevice && $_SERVER['HTTP_HOST'] != $this->get_config('sticky_host')) {
         return false;
     }
     if ($this->m->isMobileDevice) {
         $this->debugItems[] = 'Mobile device found';
     }
     if ($this->m->isIPhone) {
         $this->debugItems[] = 'Apple IPhone or IPod Touch device found';
     }
     if ($this->m->isAndroid) {
         $this->debugItems[] = 'Android device found';
     }
     if ($_SERVER['HTTP_HOST'] == $this->get_config('sticky_host')) {
         $this->debugItems[] = 'Sticky host! Outputting mobile markup anyways';
     }
     if (isset($hooks[$event])) {
         switch ($event) {
             ////////////////////////////////////////////////////////////////////
             // FRONTEND
             ////////////////////////////////////////////////////////////////////
             case 'frontend_configure':
                 // redirect? don't loop and don't redirect admin backend
                 if ($this->get_config('redirect') && $this->get_config('redirect_url') != $_SERVER['HTTP_HOST'] && !strstr($_SERVER['REQUEST_URI'], 'serendipity_admin.php')) {
                     header('Status: 302 Found');
                     header('Location: http://' . $this->get_config('redirect_url') . $_SERVER['REQUEST_URI']);
                     exit;
                 }
                 // set template and css to the included style.css - requires the (normally included) xhtml_mp or iphone template from http://c.seo-mobile.de/
                 $this->debugItems[] = 'Charset: ' . LANG_CHARSET;
                 if ($this->m->isIPhone == true) {
                     $template = $this->get_config('iphone_template');
                 } elseif ($this->m->isAndroid == true) {
                     $template = $this->get_config('android_template');
                 } else {
                     $template = $this->get_config('mobile_template');
                 }
                 if (!empty($template)) {
                     $eventData['template'] = $template;
                     $eventData['template_engine'] = $template;
                     $serendipity['smarty_vars']['head_link_stylesheet'] = $serendipity['baseURL'] . 'serendipity.css.php?switch=' . $template;
                     $this->debugItems[] = 'Template changed to: ' . $template;
                 }
                 return true;
                 break;
                 ////////////////////////////////////////////////////////////////////
                 // ENTRIES
                 ////////////////////////////////////////////////////////////////////
             ////////////////////////////////////////////////////////////////////
             // ENTRIES
             ////////////////////////////////////////////////////////////////////
             case 'entry_display':
                 // AJAX Request (IPhone)
                 if ($_SERVER['HTTP_X_XMLHTTPREQUEST']) {
                     $serendipity['smarty']->assign(array('ajax' => 1));
                 } else {
                     $serendipity['smarty']->assign(array('ajax' => 0));
                 }
                 // send content-type xhtml header (not for iphones)
                 if ($this->m->isIPhone == true || $this->m->isAndroid == true) {
                     header('Content-Type: text/html; charset=' . LANG_CHARSET);
                 } else {
                     header('Content-Type: application/xhtml+xml; charset=' . LANG_CHARSET);
                 }
                 // add categories to footer navigation?
                 if ($this->get_config('categories')) {
                     $this->debugItems[] = 'Adding categories to footer navigation';
                     $this->assignCategories($serendipity);
                 }
                 $smallteaser = $this->get_config('smallteaser', true);
                 $template_meta = new serendipity_template_meta($serendipity['template']);
                 $template_supports_extended_articles = $template_meta->supports('ext_article');
                 $article_overview = count($eventData) > 1;
                 foreach ($eventData as $key => $entry) {
                     // get body and extended body
                     $body = $this->cleanupMobileHtml($this->getFieldReference('body', $entry), $serendipity);
                     $extended = $this->cleanupMobileHtml($this->getFieldReference('extended', $entry), $serendipity);
                     if (!$article_overview && !$template_supports_extended_articles) {
                         $body .= $extended;
                     }
                     if ($article_overview && $smallteaser) {
                         if (preg_match('/^(.+?)<\\/p>/', $body, $matches)) {
                             $body = $matches[1] . "</p>";
                         }
                     }
                     // debugging
                     $this->debug($serendipity);
                     // check for caching again
                     if ($eventData[$key]['properties']['ep_cache_body']) {
                         $eventData[$key]['properties']['ep_cache_body'] = $body;
                         $eventData[$key]['properties']['ep_cache_extended'] = $extended;
                     } elseif ($eventData[$key]['ep_cache_body']) {
                         $eventData[$key]['ep_cache_body'] = $body;
                         $eventData[$key]['ep_cache_extended'] = $extended;
                     } else {
                         $eventData[$key]['body'] = $body;
                         $eventData[$key]['extended'] = $extended;
                     }
                     //return true; // do all entries!
                 }
                 break;
         }
     }
 }