/**
  * create element format parts
  *
  * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**>
  * @since 2.0.6 - 2006-06-20
  * @uses iCalBase::_createFormat()
  * @uses calendarComponent::$timezonetype
  * @return string
  */
 function _createFormat()
 {
     parent::_createFormat();
     $objectname = null;
     switch ($this->format) {
         case 'xcal':
             return isset($this->timezonetype) ? strtolower($this->timezonetype) : strtolower($this->objName);
             break;
         default:
             return isset($this->timezonetype) ? strtoupper($this->timezonetype) : strtoupper($this->objName);
             break;
     }
 }
 /**
  * creates formatted output for calendar object instance
  *
  * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**>
  * @since 2.21.07 - 2015-03-31
  * @uses vcalendar::$format
  * @uses vcalendar::$nl
  * @uses vcalendar::createVersion()
  * @uses vcalendar::createProdid()
  * @uses vcalendar::createCalscale()
  * @uses vcalendar::createMethod()
  * @uses vcalendar::createXprop()
  * @uses vcalendar::$components
  * @uses calendarComponent::setConfig()
  * @uses vcalendar::getConfig()
  * @uses calendarComponent::createComponent()
  * @uses vcalendar::$xcaldecl
  * @return string
  */
 function createCalendar()
 {
     parent::_createFormat();
     $calendarInit = $calendarxCaldecl = $calendarStart = $calendar = '';
     switch ($this->format) {
         case 'xcal':
             $calendarInit = '<?xml version="1.0" encoding="UTF-8"?>' . $this->nl . '<!DOCTYPE vcalendar PUBLIC "-//IETF//DTD XCAL/iCalendar XML//EN"' . $this->nl . '"http://www.ietf.org/internet-drafts/draft-ietf-calsch-many-xcal-01.txt"';
             $calendarStart = '>' . $this->nl . '<vcalendar';
             break;
         default:
             $calendarStart = 'BEGIN:VCALENDAR' . $this->nl;
             break;
     }
     $calendarStart .= $this->createVersion();
     $calendarStart .= $this->createProdid();
     $calendarStart .= $this->createCalscale();
     $calendarStart .= $this->createMethod();
     if ('xcal' == $this->format) {
         $calendarStart .= '>' . $this->nl;
     }
     $calendar .= $this->createXprop();
     foreach ($this->components as $component) {
         if (empty($component)) {
             continue;
         }
         $component->setConfig($this->getConfig(), FALSE, TRUE);
         $calendar .= $component->createComponent($this->xcaldecl);
     }
     if ('xcal' == $this->format && 0 < count($this->xcaldecl)) {
         // xCal only
         $calendarInit .= ' [';
         $old_xcaldecl = array();
         foreach ($this->xcaldecl as $declix => $declPart) {
             if (0 < count($old_xcaldecl) && isset($declPart['uri']) && isset($declPart['external']) && isset($old_xcaldecl['uri']) && isset($old_xcaldecl['external']) && in_array($declPart['uri'], $old_xcaldecl['uri']) && in_array($declPart['external'], $old_xcaldecl['external'])) {
                 continue;
             }
             // no duplicate uri and ext. references
             if (0 < count($old_xcaldecl) && !isset($declPart['uri']) && !isset($declPart['uri']) && isset($declPart['ref']) && isset($old_xcaldecl['ref']) && in_array($declPart['ref'], $old_xcaldecl['ref'])) {
                 continue;
             }
             // no duplicate element declarations
             $calendarxCaldecl .= $this->nl . '<!';
             foreach ($declPart as $declKey => $declValue) {
                 switch ($declKey) {
                     // index
                     case 'xmldecl':
                         // no 1
                         $calendarxCaldecl .= $declValue . ' ';
                         break;
                     case 'uri':
                         // no 2
                         $calendarxCaldecl .= $declValue . ' ';
                         $old_xcaldecl['uri'][] = $declValue;
                         break;
                     case 'ref':
                         // no 3
                         $calendarxCaldecl .= $declValue . ' ';
                         $old_xcaldecl['ref'][] = $declValue;
                         break;
                     case 'external':
                         // no 4
                         $calendarxCaldecl .= '"' . $declValue . '" ';
                         $old_xcaldecl['external'][] = $declValue;
                         break;
                     case 'type':
                         // no 5
                         $calendarxCaldecl .= $declValue . ' ';
                         break;
                     case 'type2':
                         // no 6
                         $calendarxCaldecl .= $declValue;
                         break;
                 }
             }
             $calendarxCaldecl .= '>';
         }
         $calendarxCaldecl .= $this->nl . ']';
     }
     // end if(( 'xcal'...
     switch ($this->format) {
         case 'xcal':
             $calendar .= '</vcalendar>' . $this->nl;
             break;
         default:
             $calendar .= 'END:VCALENDAR' . $this->nl;
             break;
     }
     return $calendarInit . $calendarxCaldecl . $calendarStart . $calendar;
 }