<?php

if (!isset($gCms)) {
    exit;
}
$url = $this->GetPreference('ical_holidays');
if (!$url) {
    return;
}
$minutes = 7 * 24 * 60;
// 7 DAYS
$cachedfile = new cge_cached_remote_file($url, $minutes);
if (!$cachedfile->size()) {
    return;
}
$ical = new \CGCalendar\IcalParser();
$ical->parseFile($cachedfile->get_dest());
$events = $ical->getSortedEvents();
if (count($events)) {
    $out = array();
    foreach ($events as $event) {
        $obj = array();
        $obj['start'] = $event['DTSTART']->format('Y-m-d');
        $obj['end'] = $event['DTEND']->format('Y-m-d');
        $obj['allDay'] = true;
        $obj['title'] = $event['SUMMARY'];
        $obj['type'] = 'holiday';
        $out[] = $obj;
    }
    \cge_utils::send_ajax_and_exit($out);
}
 public static function cge_cached_url($params, $smarty)
 {
     $url = get_parameter_value($params, 'url');
     $time = get_paremeter_value($params, 'time', 60);
     $obj = new cge_cached_remote_file($url, $time);
     $out = $obj->file_get_contents();
     if (isset($params['assign'])) {
         $smarty->assign($params['assign'], $out);
         return;
     }
     return $out;
 }
 /**
  * Render the output javascript and stylesheets into cachable files
  * and output the appropriate HTML tags.
  *
  * @param array $opts Options for this method (for further reference, see the {cgjs_render} smarty tag.
  * @return string HTML output code.
  */
 public static function render($opts = null)
 {
     if (count(self::$_rlibs) == 0 && count(self::$_required) == 0) {
         return;
     }
     // nothing to do.
     // process options
     $options = array();
     $options['excludes'] = array();
     if (!cmsms()->is_frontend_request()) {
         // the cmsms admin console includes versions of these.
         $excludes = array();
         $excludes[] = 'jquery';
         $excludes[] = 'ui';
         $excludes[] = 'fileupload';
         $options['excludes'] = $excludes;
     }
     if (is_array($opts)) {
         $options = array_merge_recursive($options, $opts);
     }
     if (isset($options['no_jquery']) && !in_array('jquery', $options['excludes'])) {
         $options['excludes'][] = 'jquery';
     }
     if (isset($options['excludes']) && count($options['excludes'])) {
         // clean up the excludes
         $out = array();
         foreach ($options['excludes'] as &$str) {
             $str = strtolower(trim($str));
             if (!$str) {
                 continue;
             }
             if (!in_array($str, $out)) {
                 $out[] = $str;
             }
         }
         $options['excludes'] = $out;
     }
     $options['lang'] = \CmsNlsOperations::get_current_language();
     // expand some options to simple variables.
     $config = \cms_config::get_instance();
     $cache_lifetime = isset($options['cache_lifetime']) ? (int) $options['cache_lifetime'] : 24;
     $cache_lifetime = (int) \cge_utils::get_param($config, 'cgejs_cachelife', $cache_lifetime);
     $cache_lifetime = max($cache_lifetime, 1);
     $nocache = isset($options['no_cache']) ? TRUE : FALSE;
     $nocache = \cge_utils::get_param($config, 'cgejs_nocache', $nocache);
     $nominify = isset($options['nominify']) ? TRUE : FALSE;
     // overrides anything in libs.
     $nominify = \cge_utils::get_param($config, 'cgejs_nominify', $nominify);
     $nocsssmarty = isset($options['nocsssmarty']) || $nominify ? TRUE : $nocache;
     $addkey = \cge_utils::get_param($options, 'addkey', '');
     $do_js = isset($options['no_js']) ? FALSE : TRUE;
     $do_css = isset($options['no_css']) ? FALSE : TRUE;
     $js_fmt = '<script type="text/javascript" src="%s"></script>';
     $css_fmt = '<link type="text/css" rel="stylesheet" href="%s"/>';
     if ($nocache) {
         $nominify = true;
     }
     if (!$nominify) {
         require_once dirname(__DIR__) . '/jsmin.php';
     }
     $get_relative_url = function ($filename) {
         $config = \cms_config::get_instance();
         $relative_url = '';
         if (startswith($filename, $config['root_path'])) {
             $relative_url = str_replace($config['root_path'], $config['root_url'], dirname($filename));
             if (!endswith($relative_url, '/')) {
                 $relative_url .= '/';
             }
             if (startswith($relative_url, 'http:')) {
                 $relative_url = substr($relative_url, 5);
             }
             if (startswith($relative_url, 'https:')) {
                 $relative_url = substr($relative_url, 6);
             }
         }
         return $relative_url;
     };
     $fix_css_urls = function ($css, $url_prefix) {
         $css_search = '#url\\(\\s*[\'"]?(.*?)[\'"]?\\s*\\)#';
         $css_url_fix = function ($matches) use($url_prefix) {
             if (startswith($matches[1], 'data:')) {
                 return $matches[0];
             }
             if (startswith($matches[1], 'http:')) {
                 return $matches[0];
             }
             if (startswith($matches[1], 'https:')) {
                 return $matches[0];
             }
             if (startswith($matches[1], '//')) {
                 return $matches[0];
             }
             //$str = substr($matches[1],0,-1);
             $str = $matches[1];
             return "url('{$url_prefix}{$str}')";
         };
         $out = preg_replace_callback($css_search, $css_url_fix, $css);
         return $out;
     };
     $get_code = function ($rec, $type) use(&$get_relative_url, &$fix_css_urls) {
         $config = \cms_config::get_instance();
         if ($type == "js") {
             $js = null;
             if (isset($rec->jsfile)) {
                 $jsfile = $rec->jsfile;
                 if (!is_array($jsfile)) {
                     $jsfile = array($jsfile);
                 }
                 $js = null;
                 foreach ($jsfile as $one_file) {
                     $one_file = self::_expand_filename($one_file);
                     $js .= "/* jsloader // javascript file {$one_file} */\n";
                     if (is_file($one_file)) {
                         $js .= @file_get_contents($one_file);
                     }
                 }
             } else {
                 if (isset($rec->jsurl)) {
                     // cache this for at least 24 hours
                     if (startswith($rec->jsurl, $config['root_url'])) {
                         $fn = str_replace($config['root_url'], $config['root_path'], $rec->jsurl);
                         if (is_file($fn)) {
                             if (!endswith($js, "\n")) {
                                 $js .= "\n";
                             }
                             $js .= "/* jsloader // javascript local file from url {$fn} */\n";
                             $js .= file_get_contents($fn);
                         }
                     } else {
                         $crf = new \cge_cached_remote_file($rec->jsurl, 48 * 60);
                         if ($crf->size()) {
                             if (!endswith($js, "\n")) {
                                 $js .= "\n";
                             }
                             $js .= "/* jsloader // javascript remote {$rec->jsurl} */\n";
                             $js .= $crf->file_get_contents();
                         }
                     }
                 } else {
                     if (isset($rec->code)) {
                         $js .= "/* jsloader // javascript inline code */\n";
                         $js .= $rec->code;
                     }
                 }
             }
             return $js;
         } else {
             // css
             $css = null;
             if (isset($rec->cssfile)) {
                 $cssfile = $rec->cssfile;
                 if (!is_array($cssfile)) {
                     $cssfile = array($cssfile);
                 }
                 foreach ($cssfile as $one_file) {
                     $one_file = self::_expand_filename($one_file);
                     $tmp = file_get_contents($one_file);
                     $css .= "/* jsloader//css file: {$one_file} */\n";
                     $relative_url = $get_relative_url($one_file);
                     $tmp = $fix_css_urls($tmp, $relative_url);
                     $css .= $tmp;
                 }
             } else {
                 if (isset($rec->cssname)) {
                     if (version_compare(CMS_VERSION, '1.99-alpha0') < 0) {
                         $query = 'SELECT css_id, css_name, css_text FROM ' . cms_db_prefix() . 'css WHERE css_name = ?';
                         $db = CmsApp::get_instance()->GetDb();
                         $row = $db->GetRow($query, array($rec->cssname));
                         if (!is_array($row)) {
                             return;
                         }
                         $css = trim($row['css_text']);
                     } else {
                         $css = CmsLayoutStylesheet::load($rec->cssname)->get_content();
                     }
                 } else {
                     if (isset($rec->cssurl)) {
                         if (startswith($rec->cssurl, $config['root_url'])) {
                             $fn = str_replace($config['root_url'], $config['root_path'], $rec->cssurl);
                             if (is_file($fn)) {
                                 $relative_url = $get_relative_url($fn);
                                 $tmp .= file_get_contents($fn);
                                 $tmp = $fix_css_urls($tmp, $relative_url);
                                 if (!endswith($css, "\n")) {
                                     $css .= "\n";
                                 }
                                 $css .= "/* jsloader //css local file from url {$fn} */\n";
                                 $css .= $tmp;
                             }
                         } else {
                             $crf = new \cge_cached_remote_file($rec->cssurl, 48 * 60);
                             if ($crf->size()) {
                                 if (!endswith($css, "\n")) {
                                     $css .= "\n";
                                 }
                                 $css .= "/* jsloader//css remote {$rec->cssurl} */\n";
                                 $css .= $crf->file_get_contents();
                             }
                         }
                     } else {
                         if (isset($rec->styles)) {
                             $css .= "/* jsloader//css inline code */\n";
                             $css .= $rec->styles;
                         }
                     }
                 }
             }
             return $css;
         }
     };
     $get_minified_code = function ($rec, $type) use(&$get_code) {
         /* check for a cached version of this code */
         $fn = TMP_CACHE_LOCATION . '/cgejs_' . md5(__FILE__ . serialize($rec) . $type) . '.cache';
         if (is_file($fn)) {
             return file_get_contents($fn);
         }
         // not in cache
         // calculate a prefix to go on top of the cache file, and test if we are really minifying
         $code = $prefix = null;
         $do_minify = TRUE;
         if ($type == 'js') {
             if (isset($rec->js_nominify) && $rec->js_nominify) {
                 $do_minify = FALSE;
             }
             if ($do_minify && isset($rec->jsfile)) {
                 $jsfile = $rec->jsfile;
                 if (!is_array($jsfile)) {
                     $jsfile = array($jsfile);
                 }
                 foreach ($jsfile as $one) {
                     if (strpos($one, '.min') !== FALSE || strpos($one, '.pack') !== FALSE) {
                         $do_minify = FALSE;
                         break;
                     }
                 }
             }
             if ($do_minify && isset($rec->jsurl)) {
                 if (strpos($rec->jsurl, '.min') !== FALSE || strpos($rec->jsurl, '.pack') !== FALSE) {
                     $do_minify = FALSE;
                 }
             }
             $prefix = "/* jsloader // cached javascript // ";
             if (isset($rec->name)) {
                 $prefix .= $rec->name;
             } else {
                 if (isset($rec->jsfile)) {
                     if (is_string($rec->jsfile)) {
                         $prefix .= $rec->jsfile;
                     } else {
                         $prefix .= $rec->jsfile[0];
                     }
                 } else {
                     if (isset($rec->code)) {
                         $prefix .= 'inline code';
                     }
                 }
             }
             $prefix .= " */\n";
         } else {
             // CSS
             if (isset($rec->css_nominify) && $rec->css_nominify) {
                 $do_minify = FALSE;
             }
             if ($do_minify && isset($rec->cssfile)) {
                 $cssfile = $rec->cssfile;
                 if (!is_array($cssfile)) {
                     $cssfile = array($cssfile);
                 }
                 foreach ($cssfile as $one) {
                     if (strpos($one, '.min') !== FALSE || strpos($one, '.pack') !== FALSE) {
                         $do_minify = FALSE;
                         break;
                     }
                 }
             }
             if ($do_minify && isset($rec->cssurl)) {
                 if (strpos($rec->cssurl, '.min') !== FALSE || strpos($rec->cssurl, '.pack') !== FALSE) {
                     $do_minify = FALSE;
                 }
             }
             $prefix = "/* jsloader // cached css // ";
             if (isset($rec->name)) {
                 $prefix .= $rec->name;
             } else {
                 if (isset($rec->cssfile)) {
                     if (is_string($rec->cssfile)) {
                         $prefix .= $rec->cssfile;
                     } else {
                         $prefix .= $rec->cssfile[0];
                     }
                 } else {
                     $prefix .= 'inline code';
                 }
             }
             $prefix .= " */\n";
         }
         // get the code.
         $code = $get_code($rec, $type);
         if ($code) {
             // got code... are we minifying and caching it?
             if ($do_minify) {
                 $code = \JSMin::minify($code);
                 $code = $prefix . $code;
                 file_put_contents($fn, $code);
             }
             return $code;
         }
     };
     // determine if we have to process all this cruft (which could potentially be very expensive)
     $sig = md5(serialize(self::$_rlibs) . serialize(self::$_required) . serialize($options) . $nocache . $nominify . $cache_lifetime);
     $cache_js = TMP_CACHE_LOCATION . "/cgejs_{$sig}.js";
     $cache_css = TMP_CACHE_LOCATION . "/cgejs_{$sig}.css";
     $do_js_tag = $do_css_tag = FALSE;
     $do_js2 = $do_css2 = FALSE;
     $do_processing = TRUE;
     if ($nocache) {
         // forced to rejenerate.
         $do_js2 = $do_css2 = TRUE;
     } else {
         /* we can cache */
         $etime = time() - $cache_lifetime * 3600;
         if (is_file($cache_js)) {
             $mtime1 = @filemtime($cache_js);
             $do_js_tag = TRUE;
             if ($mtime1 < $etime) {
                 // cache too olo, forced to rebuild
                 $do_js2 = FALSE;
             }
         } else {
             // no file, gotta process.
             $do_js2 = TRUE;
         }
         if (is_file($cache_css)) {
             $mtime2 = @filemtime($cache_css);
             $do_css_tag = TRUE;
             if ($mtime2 < $etime) {
                 // cache too old, forced to rebuild
                 $do_css2 = FALSE;
             }
         } else {
             // no file, gotta process.
             $do_css2 = TRUE;
         }
     }
     if ($do_js2 || $do_css2) {
         // okay, we have work to do.
         static $list = null;
         if (is_null($list)) {
             // now expand all our dependencies.
             $list_0 = array();
             $required = array_merge(self::$_rlibs, self::$_required);
             foreach ($required as $rec) {
                 if (isset($rec->depends)) {
                     self::_resolve_dependencies($rec, $list_0, $options['excludes']);
                 } else {
                     $sig = md5(serialize($rec));
                     $list_0[$sig] = $rec;
                 }
             }
             // now check for callback items
             // and get their code... this may be an expensive process
             // note: may also have dependencies
             $list = array();
             foreach ($list_0 as $rec) {
                 if (isset($rec->callback)) {
                     $tmp = call_user_func($rec->callback, $rec->name);
                     if (is_object($tmp) && (isset($tmp->code) || isset($tmp->styles))) {
                         $list[] = $tmp;
                     }
                 } else {
                     $list[] = $rec;
                 }
             }
             unset($required, $list_0);
         }
         //
         // process js
         //
         if ($do_js && $do_js2 && $list && count($list)) {
             $txt = null;
             foreach ($list as $rec) {
                 if ($nominify) {
                     $txt .= $get_code($rec, 'js');
                 } else {
                     $txt .= $get_minified_code($rec, 'js');
                 }
             }
             if ($txt) {
                 $do_js_tag = TRUE;
                 file_put_contents($cache_js, $txt);
             }
         }
         //
         // process css
         //
         if ($do_css && $do_css2 && $list && count($list)) {
             $txt = null;
             foreach ($list as $rec) {
                 if ($nominify) {
                     $txt .= $get_code($rec, 'css');
                 } else {
                     $txt .= $get_minified_code($rec, 'css');
                 }
             }
             if ($txt) {
                 $do_css_tag = TRUE;
                 file_put_contents($cache_css, $txt);
             }
         }
         // do_css
     }
     // do processing
     // do the output.
     if ($nocache) {
         $cache_js .= '?_t=' . time();
         $cache_css .= '?_t=' . time();
     }
     $out = null;
     if ($do_js_tag) {
         $cache_url = $config['root_url'] . '/tmp/cache/' . basename($cache_js);
         $out .= trim(sprintf($js_fmt, $cache_url)) . "\n";
     }
     if ($do_css_tag) {
         $cache_url = $config['root_url'] . '/tmp/cache/' . basename($cache_css);
         $out .= trim(sprintf($css_fmt, $cache_url)) . "\n";
     }
     // all freaking done
     return $out;
 }