<?php

    /**
     *  Main JSON Rest api for LGCCC Conferences
     */

    //Enable error reporting for dev only
        error_reporting(E_ERROR | E_PARSE);

    //Enable compression/output buffering
        if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start();

    //Set required response headers
        header("Access-Control-Allow-Origin: *");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    
    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");         
        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");
    }

    //Set JSON response format for header
        header("Content-Type: application/json; charset=UTF-8");
    
    //Include required files
        include_once( '../inc/db.php' );
        include_once( '../inc/actividad.php' );
        include_once( '../inc/helpers.php' );

    //Set incoming variables, parse and validate
    if($_REQUEST){
        $func = ($_REQUEST['f']!=''?$_REQUEST['f']:'epub');
        $return = ($_REQUEST['return']!=''?$_REQUEST['return']:true);
        $overwrite = ($_REQUEST['overwrite']!=''?$_REQUEST['overwrite']:false);
        $id = $_REQUEST['id'];
        $year = ($_REQUEST['year']!=''?$_REQUEST['year']:'');
        $month = ($_REQUEST['month']!=''?$_REQUEST['month']:'');
        $cache = ($_REQUEST['cache']!=''?$_REQUEST['cache']:false);
        $limit = ($_REQUEST['limit']!=''?$_REQUEST['limit']:'');
        define('LOCALE', ($_REQUEST['locale']!=''?$_REQUEST['locale']:'es'));
    }

    switch ( $func ){
        case "all":
            listAllActivities();
            break;
        case "historyYears":
            activity_years(true);
            break;
        case "years":
            activity_years(false);
            break;
        case "detail":
            activity_detail($id);
            break;
        case "summary":
            activity_summary($id,false);
            break;
        case "epub":
            conference_epub($id,$return,$overwrite);
            break;
        case "ahistory":
            listActivities( $year, $month, true, 1000 );
            break;
        case "searchList":
            listSearchActivities( $year, $month );
            break;
        case "list":
        default :
            listActivities( $year, $month, false, $limit );
            break;
    }

    function better_strip_tags( $str, $allowable_tags = '', $strip_attrs = false, $preserve_comments = false, callable $callback = null ) {
        $allowable_tags = array_map( 'strtolower', array_filter( // lowercase
            preg_split( '/(?:>|^)\\s*(?:<|$)/', $allowable_tags, -1, PREG_SPLIT_NO_EMPTY ), // get tag names
            function( $tag ) { return preg_match( '/^[a-z][a-z0-9_]*$/i', $tag ); } // filter broken
        ) );
        $comments_and_stuff = preg_split( '/(<!--.*?(?:-->|$))/', $str, -1, PREG_SPLIT_DELIM_CAPTURE );
        foreach ( $comments_and_stuff as $i => $comment_or_stuff ) {
          if ( $i % 2 ) { // html comment
            if ( !( $preserve_comments && preg_match( '/<!--.*?-->/', $comment_or_stuff ) ) ) {
              $comments_and_stuff[$i] = '';
            }
          } else { // stuff between comments
            $tags_and_text = preg_split( "/(<(?:[^>\"']++|\"[^\"]*+(?:\"|$)|'[^']*+(?:'|$))*(?:>|$))/", $comment_or_stuff, -1, PREG_SPLIT_DELIM_CAPTURE );
            foreach ( $tags_and_text as $j => $tag_or_text ) {
              $is_broken = false;
              $is_allowable = true;
              $result = $tag_or_text;
              if ( $j % 2 ) { // tag
                if ( preg_match( "%^(</?)([a-z][a-z0-9_]*)\\b(?:[^>\"'/]++|/+?|\"[^\"]*\"|'[^']*')*?(/?>)%i", $tag_or_text, $matches ) ) {
                  $tag = strtolower( $matches[2] );
                  if ( in_array( $tag, $allowable_tags ) ) {
                    if ( $strip_attrs ) {
                      $opening = $matches[1];
                      $closing = ( $opening === '</' ) ? '>' : $closing;
                      $result = $opening . $tag . $closing;
                    }
                  } else {
                    $is_allowable = false;
                    $result = '';
                  }
                } else {
                  $is_broken = true;
                  $result = '';
                }
              } else { // text
                $tag = false;
              }
              if ( !$is_broken && isset( $callback ) ) {
                // allow result modification
                call_user_func_array( $callback, array( &$result, $tag_or_text, $tag, $is_allowable ) );
              }
              $tags_and_text[$j] = $result;
            }
            $comments_and_stuff[$i] = implode( '', $tags_and_text );
          }
        }
        $str = implode( '', $comments_and_stuff );
        return $str;
      }

      function getFilePrefix(){
          switch (LOCALE){
            case "pt_BR":
	    case "pt":
                $prefix = "POR";
                break;
            case "en_US":
	    case "en":
                $prefix = "ENG";
                break;
            case "fr_FR":
	    case "fr":
                $prefix = "FRA";
                break;
            case "es_ES":
	    case "es":
            default:
                $prefix = "SPA";
                break;
          }
          return $prefix;
      }

      function conference_epub($id,$return,$overwrite){

        if(!$id){
            echo json_encode("No id!");
            die();
        }

        require_once( '/var/www/html/v3/inc/epub/EPub.php');
        require_once( '/var/www/html/v3/inc/epub/EPubChapterSplitter.class.php');
        require_once( '/var/www/html/v3/inc/epub/Zip.class.php');

        /*require_once( 'c:/laragon/www/conferencias/v3/inc/epub/EPub.php');
        require_once( 'c:/laragon/www/conferencias/v3/inc/epub/EPubChapterSplitter.class.php');
        require_once( 'c:/laragon/www/conferencias/v3/inc/epub/Zip.class.php');*/

        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);

        $count = $activity->get_post_interventions($id);
        $row = $count->fetch(PDO::FETCH_ASSOC);
        $interventions = $row['meta_value'];

        $interventionData = $activity->get_interventions($id,$interventions);
        
        $stmt = $activity->detail($id,LOCALE);

        $num = $stmt->rowCount();


        if($num>0){

            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){

                //echo json_encode($row);
                //die();

                extract($row);

                $date = $creation_date;
                $no_activity = '';
                $city = '';
                $state = '';
                $country = '';
                $thumbnail = '';

                $response_item=array(
                    "_id" => $ID,
                    "title" => $title,
                    "body" => wpautop($content),
                    "slug" => $slug,
                    "hasText" => ($bodylength>0?true:false)
                );

                $translations = unserialize($translationmeta);
                $translations[LOCALE] = (int)$ID;
                                    
                if(LOCALE=='es_ES'){
                    $original_id = $ID;
                } else {
                    $original_id = $translations['es_ES'];
                }

                $count = $activity->get_post_interventions($id);

                //Get interventions
                //$intervention_count = "SELECT * FROM `wp_postmeta` WHERE `post_id` = " . $id . " AND `meta_key` = 'intervenciones'";


                /*$response_item['date'] = $date;
                $response_item['activity'] = $no_activity;
                $response_item['city'] = $city;
                $response_item['state'] = $state;
                $response_item['country'] = $country;
                $response_item['thumbnail'] = $thumbnail;*/


                $dt = new DateTime($date);
                $formatter = new IntlDateFormatter(LOCALE, IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
                $formatter->setPattern( datePattern( $date ) );
                $nicedate = ucfirst($formatter->format($dt));
                $lo = implode(', ',array_filter(array($city,$state,Locale::getDisplayRegion('-'.strtoupper($country), LOCALE ))));

                $code = getFilePrefix() . '-' . date("Y-m-d", strtotime( $date ) ) . '-' . $no_activity; 

                //Title
                $newTitle = sanitize_title( $title );
                $fixedNewTitle = str_replace( '-','_',$newTitle );


                $newFilename = $code . "-" . $fixedNewTitle . "-" . strtoupper( substr( $city , 0 , 3 ) ) . strtoupper( $country ) . ".epub";
                
                $file = $newFilename;
                
                $generate = 'true';

                if(file_exists( $file )){
                    $generate = 'false';
                }

                if($generate == 'true' || $overwrite == 'true'){
                    $book = new EPub();

                    // Title and Identifier are mandatory!
                    $book->setTitle( $title );
                    $book->setIdentifier( $code , EPub::IDENTIFIER_URI); // Could also be the ISBN number, prefered for published books, or a UUID.
                    $book->setLanguage( LOCALE ); // Not needed, but included for the example, Language is mandatory, but EPub defaults to "en". Use RFC3066 Language codes, such as "en", "da", "fr" etc.
                    $book->setDescription( $t . ', predicado el ' . $nicedate . ', en ' . $lo );
                    $book->setAuthor("Rev. José Benjamín Pérez","Rev. José Benjamín Pérez"); 
                    $book->setPublisher("La Gran Carpa Catedral, Corp.", "https://www.carpa.com/"); // I hope this is a non existant address :) 
                    $book->setDate(time()); // Strictly not needed as the book date defaults to time().
                    $book->setRights("Copyright and licence information specific for the book.");
                    $book->setSourceURL( $u );
    
                    $cssData = "
                    h1 {\n text-transform : uppercase;\n text-align : center;\n}\n
                    h2 {\n text-align : center;\n text-transform : capitalize;\n}";
    
                    $book->addCSSFile("styles.css", "css1", $cssData);
    
                    // ePub uses XHTML 1.1, preferably strict.
                    $content_start =
                        "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                        . "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n"
                        . "    \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n"
                        . "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"
                        . "<head>"
                        . "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"
                        . "<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\" />\n"
                        . "<title>". $title ."</title>\n"
                        . "</head>\n"
                        . "<body>\n";

                    $svgData = '<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" x="0" y="0" version="1.1" viewBox="0 0 710.33 134.1"><path d="M276.83 79.5c-27.61-9.75-78.41-6.39-91.89-.06C242.35 41.14 315.81 8.7 402.17 1.07c17.45-1.38 40.95-1.52 63.71.18C572.97 9.26 658.85 65.5 710.33 134.1 663.2 90.76 585.31 31.86 461.15 31.86c-95.72 0-167.71 38.13-184.32 47.64z" fill="#ed1c24" fill-rule="evenodd" clip-rule="evenodd"/><path d="M91.41 79.44C64.55 68.85 12.87 73.78.52 79.27 70.43 29.73 170.34-3.72 316.7 1.6 178.46 11.28 102.53 72.2 91.41 79.44z" fill="#2d4ea2" fill-rule="evenodd" clip-rule="evenodd"/><path d="M184.94 79.64c-26.86-10.59-81.18-5.69-93.53-.2C161.32 29.9 249.94-6.39 403.56 1.48 294.93 9.2 216.06 60.24 184.94 79.64z" fill="#fff" fill-rule="evenodd" clip-rule="evenodd"/><path d="M0 86.68h7.56v22.68c0 1.66.25 3.03.76 4.13.5 1.1 1.2 1.98 2.08 2.65.88.67 1.92 1.14 3.1 1.43 1.19.29 2.45.43 3.78.43H27v6.48h-9.72c-2.38 0-4.61-.25-6.7-.76-2.09-.5-3.92-1.35-5.48-2.54-1.57-1.19-2.81-2.75-3.73-4.67S0 112.2 0 109.36V86.68z"/><path d="M37.97 97.53h5.81l12.01 26.95h-6.01l-2.27-5.39H34.24l-2.27 5.39h-6.01l12.01-26.95zm7.59 16.94-4.7-11.01-4.66 11.01h9.36zm162.21 8.81c-1.96-.67-3.68-1.74-5.16-3.21-1.48-1.48-2.64-3.42-3.48-5.83-.85-2.41-1.27-5.36-1.27-8.86 0-3.49.42-6.44 1.27-8.86.85-2.41 2.01-4.36 3.48-5.83 1.48-1.48 3.19-2.55 5.16-3.21 1.96-.67 4.06-1 6.29-1h14.04v6.48h-12.96c-1.33 0-2.59.2-3.78.59s-2.22 1.07-3.1 2.02c-.88.95-1.58 2.22-2.08 3.81-.5 1.58-.76 3.58-.76 5.99s.25 4.41.76 5.99c.5 1.58 1.2 2.85 2.08 3.81.88.95 1.92 1.63 3.1 2.02 1.19.4 2.45.59 3.78.59h12.96v6.48h-14.04c-2.23.02-4.33-.31-6.29-.98zm33.88-28.23h6.31l13.03 29.23h-6.51l-2.46-5.85H237.6l-2.46 5.85h-6.52l13.03-29.23zm8.23 18.37-5.09-11.94-5.05 11.94h10.14zm11.73-18.37h17.33c1.28 0 2.49.15 3.63.46 1.14.31 2.14.8 3.01 1.48.86.68 1.54 1.59 2.03 2.71.49 1.13.73 2.5.73 4.11 0 1.42-.17 2.65-.5 3.7s-.8 1.93-1.4 2.65c-.6.72-1.31 1.29-2.13 1.71-.82.42-1.71.72-2.65.92l6.64 11.48h-6.77L275.35 113h-7.89v11.28h-5.85V95.05zm17.33 12.94c.97 0 1.81-.3 2.51-.9.7-.6 1.04-1.69 1.04-3.28 0-1.39-.35-2.37-1.04-2.92-.7-.56-1.53-.83-2.51-.83h-11.48V108h11.48zm12.74-12.94h16.91c1.34 0 2.6.17 3.8.5 1.2.33 2.24.88 3.13 1.63.89.75 1.59 1.74 2.11 2.97.51 1.23.77 2.73.77 4.51 0 1.92-.26 3.52-.77 4.8-.52 1.28-1.22 2.31-2.11 3.09-.89.78-1.94 1.33-3.13 1.65-1.2.32-2.46.48-3.8.48h-11.07v9.61h-5.85V95.05zm16.91 14.61c.53 0 1.04-.08 1.52-.25.49-.17.91-.44 1.27-.81.36-.38.65-.88.86-1.52.21-.64.31-1.45.31-2.42 0-1.67-.39-2.85-1.17-3.55-.78-.7-1.71-1.04-2.8-1.04h-11.07v9.61h11.08zm19.38-14.61h6.31l13.03 29.23h-6.51l-2.46-5.85h-14.41l-2.46 5.85h-6.52l13.02-29.23zm8.23 18.37-5.09-11.94-5.05 11.94h10.14zm29.09 10.19c-1.96-.67-3.68-1.74-5.16-3.21-1.48-1.48-2.64-3.42-3.48-5.83-.85-2.41-1.27-5.36-1.27-8.86 0-3.49.42-6.44 1.27-8.86.85-2.41 2.01-4.36 3.48-5.83 1.48-1.48 3.19-2.55 5.16-3.21 1.96-.67 4.06-1 6.29-1h14.04v6.48h-12.96c-1.33 0-2.59.2-3.78.59-1.19.4-2.22 1.07-3.11 2.02-.88.95-1.58 2.22-2.08 3.81-.5 1.58-.76 3.58-.76 5.99s.25 4.41.76 5.99c.5 1.58 1.2 2.85 2.08 3.81.88.95 1.92 1.63 3.11 2.02 1.19.4 2.45.59 3.78.59h12.96v6.48h-14.04c-2.24.02-4.33-.31-6.29-.98zm33.87-28.23h6.31l13.03 29.23h-6.52l-2.46-5.85h-14.41l-2.46 5.85h-6.51l13.02-29.23zm8.23 18.37-5.09-11.94-5.05 11.94h10.14zm15.99-13.36h-10.44v-5.01h26.73v5.01h-10.44v24.22h-5.85v-24.22zm23.99 23.45c-1.52-.51-2.85-1.34-3.99-2.49-1.14-1.14-2.04-2.64-2.69-4.51-.65-1.87-.98-4.15-.98-6.85 0-2.7.33-4.98.98-6.85.65-1.87 1.55-3.37 2.69-4.51 1.14-1.14 2.47-1.97 3.99-2.48 1.52-.52 3.14-.77 4.87-.77h10.86v5.01h-10.02c-.92 0-1.78.12-2.59.36-.81.24-1.54.63-2.19 1.17-.65.54-1.21 1.27-1.67 2.17-.46.91-.77 2.04-.94 3.4h17.42v5.01h-17.42c.17 1.36.48 2.5.94 3.4.46.91 1.02 1.63 1.67 2.17.65.54 1.38.93 2.19 1.17.81.24 1.67.35 2.59.35h10.02v5.01h-10.86c-1.73.01-3.35-.25-4.87-.76zm19.7-28.46h14.2c1.73 0 3.35.26 4.87.77s2.85 1.34 3.99 2.48c1.14 1.14 2.04 2.65 2.69 4.51.65 1.87.98 4.15.98 6.85 0 2.7-.33 4.98-.98 6.85-.66 1.87-1.55 3.37-2.69 4.51a10.276 10.276 0 0 1-3.99 2.49c-1.52.52-3.14.77-4.87.77h-14.2V95.38zm13.36 24.22c1.03 0 2-.15 2.92-.46.92-.31 1.72-.83 2.4-1.57.68-.74 1.22-1.72 1.61-2.94.39-1.22.58-2.77.58-4.64 0-1.87-.2-3.41-.58-4.64-.39-1.22-.93-2.21-1.61-2.94a5.673 5.673 0 0 0-2.4-1.57c-.92-.31-1.89-.46-2.92-.46h-7.52v19.21h7.52zm16.08-24.22h17.33c1.28 0 2.49.15 3.63.46 1.14.31 2.14.8 3.01 1.48.86.68 1.54 1.59 2.03 2.71.49 1.13.73 2.5.73 4.11 0 1.42-.17 2.65-.5 3.7-.33 1.04-.8 1.93-1.4 2.65-.6.72-1.31 1.29-2.13 1.71-.82.42-1.71.72-2.65.92l6.64 11.48h-6.77l-6.18-11.28h-7.89v11.28h-5.85V95.38zm17.33 12.94c.97 0 1.81-.3 2.51-.9.7-.6 1.04-1.69 1.04-3.28 0-1.39-.35-2.37-1.04-2.92-.7-.56-1.53-.83-2.51-.83h-11.48v7.94h11.48zm22.43-12.94h6.31l13.03 29.23h-6.52l-2.46-5.85h-14.41l-2.46 5.85h-6.51l13.02-29.23zm8.22 18.37-5.09-11.94-5.05 11.94h10.14zm11.32-18.37h5.85v17.54c0 1.28.2 2.35.59 3.19.39.85.93 1.53 1.61 2.05.68.52 1.48.88 2.4 1.11.92.22 1.89.33 2.92.33h7.52v5.01h-7.52c-1.84 0-3.56-.19-5.18-.58-1.62-.39-3.03-1.04-4.24-1.96-1.21-.92-2.17-2.12-2.88-3.61-.71-1.49-1.07-3.33-1.07-5.53V95.38zm42.7 25.72c-.92-.31-1.72-.81-2.4-1.5-.69-.69-1.23-1.59-1.62-2.72-.39-1.12-.59-2.5-.59-4.13s.2-3 .59-4.13c.39-1.12.93-2.03 1.62-2.72.69-.69 1.49-1.19 2.4-1.5.91-.31 1.89-.47 2.93-.47h6.54v3.02h-6.04c-.62 0-1.21.09-1.76.28-.55.18-1.04.5-1.45.94-.41.44-.73 1.04-.97 1.77-.24.74-.35 1.67-.35 2.79s.12 2.05.35 2.79c.23.74.56 1.33.97 1.77.41.44.89.76 1.45.94.55.18 1.14.28 1.76.28h6.04v3.02h-6.54c-1.04.04-2.01-.12-2.93-.43zm11.49-8.34c0-1.69.22-3.13.67-4.3.44-1.17 1.05-2.12 1.82-2.84.77-.72 1.68-1.24 2.72-1.56 1.04-.32 2.16-.48 3.35-.48 1.16 0 2.26.16 3.3.48 1.04.32 1.95.84 2.73 1.56.78.72 1.4 1.67 1.85 2.84.45 1.17.68 2.61.68 4.3s-.23 3.13-.68 4.3c-.45 1.17-1.07 2.12-1.85 2.84-.78.72-1.69 1.24-2.73 1.56-1.04.32-2.14.48-3.3.48-1.19 0-2.31-.16-3.35-.48s-1.95-.84-2.72-1.56c-.77-.72-1.38-1.67-1.82-2.84-.45-1.17-.67-2.61-.67-4.3zm8.56 6.16c.69 0 1.34-.1 1.95-.29.61-.19 1.14-.52 1.6-.99s.81-1.1 1.08-1.9c.27-.8.4-1.79.4-2.98s-.13-2.19-.4-2.98-.63-1.43-1.08-1.9c-.45-.47-.99-.8-1.6-.99-.61-.19-1.26-.29-1.95-.29-.71 0-1.36.1-1.98.29-.61.19-1.15.52-1.6.99-.45.47-.81 1.1-1.07 1.9s-.39 1.79-.39 2.98.13 2.19.39 2.98c.26.8.62 1.43 1.07 1.9.45.47.99.8 1.6.99.61.2 1.27.29 1.98.29zm10.82-14.97h10.44c.77 0 1.5.09 2.19.28.69.18 1.29.48 1.81.89.52.41.93.96 1.22 1.64.29.68.44 1.51.44 2.48 0 .86-.1 1.6-.3 2.23-.2.63-.48 1.16-.84 1.6-.36.44-.79.78-1.28 1.03-.5.25-1.03.44-1.6.55l4 6.92h-4.08l-3.72-6.79h-4.76v6.79h-3.52v-17.62zm10.44 7.8c.59 0 1.09-.18 1.51-.54.42-.36.63-1.02.63-1.98 0-.84-.21-1.43-.63-1.76-.42-.33-.92-.5-1.51-.5h-6.92v4.78h6.92zm8.31-7.8h10.19c.8 0 1.57.1 2.29.3.72.2 1.35.53 1.89.98.54.45.96 1.05 1.27 1.79s.47 1.64.47 2.72c0 1.16-.16 2.12-.47 2.89s-.73 1.39-1.27 1.86c-.54.47-1.17.8-1.89.99-.72.19-1.49.29-2.29.29h-6.67v5.79h-3.52v-17.61zm10.19 8.81c.32 0 .63-.05.92-.15.29-.1.55-.26.77-.49.22-.23.39-.53.52-.92s.19-.87.19-1.46c0-1.01-.24-1.72-.71-2.14-.47-.42-1.03-.63-1.69-.63h-6.67v5.79h6.67zm.66 6.1h4.01v4.01h-4.01v-4.01zm-585.61 4.68c-1.96-.67-3.68-1.74-5.16-3.21-1.48-1.48-2.64-3.42-3.48-5.83-.85-2.41-1.27-5.36-1.27-8.86 0-3.49.42-6.44 1.27-8.86.85-2.41 2.01-4.36 3.48-5.83 1.48-1.48 3.19-2.55 5.16-3.21 1.96-.67 4.06-1 6.29-1h18.36v6.48H80.75c-1.33 0-2.59.2-3.78.59s-2.22 1.07-3.1 2.02c-.88.95-1.58 2.22-2.08 3.81-.5 1.58-.76 3.58-.76 5.99s.25 4.41.76 5.99c.5 1.58 1.2 2.85 2.08 3.81.88.95 1.92 1.63 3.1 2.02 1.19.4 2.45.59 3.78.59h9.72v-9.18h-7.56v-6.48h15.12v22.14H79.67c-2.24.02-4.33-.32-6.3-.98zm28.98-27.42h16.85c1.24 0 2.42.15 3.53.45 1.11.3 2.08.78 2.92 1.44.84.66 1.5 1.54 1.97 2.64s.71 2.43.71 4c0 1.38-.16 2.58-.49 3.59-.32 1.01-.78 1.87-1.36 2.58-.58.7-1.27 1.26-2.07 1.66-.8.41-1.66.7-2.58.89l6.46 11.17h-6.58l-6.01-10.96h-7.67v10.96h-5.68V96.12zm16.85 12.58c.95 0 1.76-.29 2.44-.87.68-.58 1.01-1.64 1.01-3.19 0-1.35-.34-2.3-1.01-2.84-.68-.54-1.49-.81-2.44-.81h-11.17v7.71h11.17zM141 96.12h6.13l12.67 28.42h-6.33l-2.4-5.68h-14.01l-2.4 5.68h-6.33L141 96.12zm8 17.86-4.95-11.61-4.91 11.61H149zm11.41-17.86h7.31l11.37 20.67V96.12h5.68v28.42h-7.31l-11.37-20.67v20.67h-5.68V96.12zm421.96 34.28v-3.77h-2.24v-5h4.8v3.63c0 1.09-.21 2.05-.62 2.86s-1.05 1.58-1.94 2.28z"/></svg>';

                    $book->addFile("logo_lgccc_epub.svg", "logo_svg", $svgData, "image/svg+xml");
    
                    $cover = $content_start . "<h1>".$title."</h1>\n<h2>Rev. José Benjamín Pérez<br/>".$nicedate."<br/>Cayey, Puerto Rico</h2><br/><div style=\"text-align:center;width:60%;margin:0 auto;margin-top:100px;\"><img alt=\"La Gran Carpa Catedral Corp.\" src=\"logo_lgccc_epub.svg\" style=\"width:60%;\"/></div>\n"
                        . "</body>\n</html>\n";
                    $book->addChapter("Cover", "Cover.html", $cover);
    
                    //$content = autop($content);

                    $x = 1;

                    foreach($interventionData as $intervention){
                        
                        $content = preg_replace('/[\x00-\x1F\x7F]/u', '', $intervention['texto']);

                        $dt = new DateTime($intervention['fecha']);
                        $formatter = new IntlDateFormatter(LOCALE, IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
                        $formatter->setPattern( datePattern( $intervention['fecha'] ) );
                        $nicedate = ucfirst($formatter->format($dt));

                        $contenido = $content_start . "<h1>".$intervention['titulo']."</h1>\n<h2>".$intervention['autor']."<br/>".$nicedate."<br/>" . $intervention['lugar'] . "</h2>\n" . $content. "</body>\n</html>\n";
    
                        $book->addChapter("Contenido: " . $intervention['titulo'], "Chapter00".$x.".html", $contenido);

                        $x++;
                
                    }

                    $book->finalize(); // Finalize the book, and build the archive.

                    //save file
                    $fp = fopen( $file , 'w');
                    fwrite( $fp , $book->getBook() );
                    fclose( $fp );
                    
                    if($return=='true'){
                        $zipData = $book->sendBook( $newFilename );
                    }
    
                    //die();
                } else {

                    if($return=='true'){
                        $newTitle = sanitize_title( $title );
                        $fixedNewTitle = str_replace( '-','_',$newTitle );
        
                        $newFilename = $code . "-" . $fixedNewTitle . "-" . strtoupper( substr( $city , 0 , 3 ) ) . strtoupper( $country ) . ".epub";
        
                        //Send current file
                        header($_SERVER["SERVER_PROTOCOL"] . " 200 OK");
                        header("Cache-Control: public"); // needed for internet explorer
                        header("Content-Type: application/epub+zip");
                        header("Content-Transfer-Encoding: Binary");
                        header("Content-Length:".filesize($file));
                        header("Content-Disposition: attachment; filename=".$newFilename);
                        readfile($file);
                    }
                    
                }
            
            }
        }
      }

      function sanitize_title($text, string $divider = '-') {
        // replace non letter or digits by divider
        $text = preg_replace('~[^\pL\d]+~u', $divider, $text);

        // transliterate
        $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);

        // remove unwanted characters
        $text = preg_replace('~[^-\w]+~', '', $text);

        // trim
        $text = trim($text, $divider);

        // remove duplicate divider
        $text = preg_replace('~-+~', $divider, $text);

        // lowercase
        $text = strtolower($text);

        if (empty($text)) {
            return 'n-a';
        }

        return $text;
    }

    function nl2p($string, $line_breaks = false, $xml = true) {

        $string = str_replace(array('<p>', '</p>', '<br>', '<br />'), '', $string);
        
        // It is conceivable that people might still want single line-breaks
        // without breaking into a new paragraph.
        if ($line_breaks == true)
            return '<p>'.preg_replace(array("/([\n]{2,})/i", "/([^>])\n([^<])/i"), array("</p>\n<p>", '$1<br'.($xml == true ? ' /' : '').'>$2'), trim($string)).'</p>';
        else 
            return '<p>'.preg_replace(
            array("/([\n]{2,})/i", "/([\r\n]{3,})/i","/([^>])\n([^<])/i"),
            array("</p>\n<p>", "</p>\n<p>", '$1<br'.($xml == true ? ' /' : '').'>$2'),
        
            trim($string)).'</p>'; 
    }

    function autop($pee, $br = false) {
        $pre_tags = array();
        
            if ( trim($pee) === '' )
                return '';
        
            $pee = $pee . "\n"; // just to make things a little easier, pad the end
        
            if ( strpos($pee, '<pre') !== false ) {
                $pee_parts = explode( '</pre>', $pee );
                $last_pee = array_pop($pee_parts);
                $pee = '';
                $i = 0;
        
                foreach ( $pee_parts as $pee_part ) {
                    $start = strpos($pee_part, '<pre');
        
                    // Malformed html?
                    if ( $start === false ) {
                        $pee .= $pee_part;
                        continue;
                    }
        
                    $name = "<pre wp-pre-tag-$i></pre>";
                    $pre_tags[$name] = substr( $pee_part, $start ) . '</pre>';
        
                    $pee .= substr( $pee_part, 0, $start ) . $name;
                    $i++;
                }
        
                $pee .= $last_pee;
            }
        
            $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee);
            // Space things out a little
            $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|option|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|noscript|samp|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)';
            $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee);
            $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee);
            $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines
            if ( strpos($pee, '<object') !== false ) {
                $pee = preg_replace('|\s*<param([^>]*)>\s*|', "<param$1>", $pee); // no pee inside object/embed
                $pee = preg_replace('|\s*</embed>\s*|', '</embed>', $pee);
            }
            $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates
            // make paragraphs, including one at the end
            $pees = preg_split('/\n\s*\n/', $pee, -1, PREG_SPLIT_NO_EMPTY);
            $pee = '';
            foreach ( $pees as $tinkle )
                $pee .= '<p>' . trim($tinkle, "\n") . "</p>\n";
            $pee = preg_replace('|<p>\s*</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace
            $pee = preg_replace('!<p>([^<]+)</(div|address|form)>!', "<p>$1</p></$2>", $pee);
            $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag
            $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists
            $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee);
            $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee);
            $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee);
            $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee);
            if ( $br ) {
                $pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', create_function('$matches', 'return str_replace("\n", "<PreserveNewline />", $matches[0]);'), $pee);
                $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks
                $pee = str_replace('<PreserveNewline />', "\n", $pee);
            }
            $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee);
            $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee);
            $pee = preg_replace( "|\n</p>$|", '</p>', $pee );
        
            if ( !empty($pre_tags) )
                $pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee);
        
            return $pee;
        }

    function conference_download($h,$p,$file){
        header_remove();
        header("X-Accel-Redirect: /downloadfile/" . $h . $p .'?' . $file);
    }

    function datePattern( $date ){
        $format = '';
        switch( LOCALE ){
            case "en_US":
                $format = "EEEE, MMMM d, yyyy";
                break;
            case "fr":
            case "pt_BR":
            case "es_ES":
            default:
                $format = "EEEE, d 'de' MMMM 'de' yyyy";
                break;
        }
        return $format;
    }

    function listAllActivities(){
        header('Content-Type: application/json; charset=utf-8');

        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);

        $stmt = $activity->translation_list( '', '', null, false, LOCALE, null, true, true, false );
        
        $num = $stmt->rowCount();

        $data = [];

        if($num>0){
            $activities_array=array();
        
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                
                extract($row);

                $response_item=array(
                    "_id" => $ID,
                    "title" => $title,
                    "date" => $date,
                    "slug" => $slug
                );

                $confmeta = $activity->activity_meta( $ID );

                extract($confmeta);
                
                if($mensaje_json){

                    $j = json_decode($mensaje_json);

                    $response_item['mensaje_json'] = $j;
                    
                    array_push($data,$response_item);
                }
            }
        }

        send_response( $data );

    }

    function listActivities( $year, $month, $history=false, $limit ){
        header('Content-Type: application/json; charset=utf-8');

        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);

        $stmt = $activity->translation_list( $year, $month, null, false, LOCALE, null, false, $history, $limit );
        
        $num = $stmt->rowCount();

        $data = [];

        if($num>0){
            $activities_array=array();
        
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                
                extract($row);

                $response_item=array(
                    "_id" => $ID,
                    "title" => $title,
                    "slug" => $slug
                );

                $confmeta = $activity->activity_meta( $ID );

                extract($confmeta);

                $response_item['lugar'] = $lugar;
                $response_item['city'] = $city;
                $response_item['state'] = $state;
                $response_item['country'] = $country;
                $response_item['bible_study'] = $numero_de_estudio_biblico;
                $response_item['activity'] = $actividad;
                $response_item['youtube'] = $youtube;

                //Revisado
                $response_item['revisado'] = $revisado;

                $translations = unserialize($translationmeta);

                foreach($translations as $translation_locale=>$translation_id){
                    $the_slug = $activity->translation_slug( $translation_locale, $translation_id);
                    $row = $the_slug->fetch(PDO::FETCH_ASSOC);
                    $translations[$translation_locale.'_slug'] = $row['slug'];
                }

                $response_item['translations'] = $translations;

                $response_item['date'] = $date;

                $dt = new DateTime($date);
                $formatter = new IntlDateFormatter(LOCALE, IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
                $formatter->setPattern( datePattern( $date ) );
                $response_item['nicedate'] = ucfirst($formatter->format($dt));

                $response_item['files'] = [];

                //Get filedata
                $fileData = $activity->get_activity_files( $ID );
                $files = $fileData->fetch(PDO::FETCH_ASSOC);
                $fileTypes = ['videos','audios','textos','enlaces'];
                if($files['use_files']){

                    $tempFiles = [];

                    foreach($fileTypes as $type){
                        if(!is_array($tempFiles[$type])){
                            $tempFiles[$type] = [];
                        }
                        if($files[$type] > 0){
                            $t = $activity->get_files( $ID, $type, $files[$type]);
                            array_push($tempFiles[$type],$t);
                        }
                    }

                    $response_item['files'] = $tempFiles;

                }
                /*if( $thumbnail == '') {
                    $response_item['thumbnail'] = '2021/07/maxresdefault.jpg';
                } else {*/
                    $response_item['thumbnail'] = $thumbnail;
                //}
                
                $response_item['mensaje'] = $mensaje;
                $response_item['mensaje_json'] = $mensaje_json;

                array_push($data,$response_item);
            }
        }

        send_response( $data );

    }

    function send_response( $data ){
        // set response code - 200 OK
	header('Content-Type: application/json; charset=utf-8');
	
        http_response_code(200);
       
        echo json_encode(
            $data, JSON_UNESCAPED_UNICODE
        );
    }

    function activity_years( $history=false ){

        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);
        if($history){
            $stmt = $activity->year_list_history(LOCALE);
        } else {
            $stmt = $activity->year_list(LOCALE);
        }
        

        $num = $stmt->rowCount();

        if($num>0){
            $conferences_arr=array();
        
            $years = [];
            $formattedYears = [];

            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                extract($row);
                
                if ($currentYear != $year){
                    $currentYear = $year;
                    $years[$currentYear] = [];
                }

                $format = new IntlDateFormatter(LOCALE, IntlDateFormatter::NONE, IntlDateFormatter::NONE, NULL, NULL, "MMMM");
                $monthName = datefmt_format($format, mktime(0, 0, 0, $month));

                array_push( $years[$currentYear], array('name'=>$monthName,'month'=>str_pad($month,2,'0',STR_PAD_LEFT),'count' => $total));

            }
        }

        $newYears = [];

        foreach($years as $year=>$months){
            $totalyear = 0;
            foreach($months as $month=>$count){
                $totalyear += $count['count'];
            }
            array_push($newYears, array('year'=>$year, 'count'=>$totalyear, 'months' => $months));
        }
                
        $data = array(
            'result' => array (
                'years' => $newYears
            )
        );


        send_response( $data );   
    }

    function activity_summary( $id ){
        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);

        $stmt = $activity->summary($id,LOCALE);

        $num = $stmt->rowCount();
        
        if($num>0){
            $conferences_arr = [];
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
                extract($row);

                $response_item=array(
                    "_id" => $ID,
                    "title" => $title,
                    "date" => $creation_date,
                    "slug" => $slug,
                    "activity" => $activity,
                    "lugar" => $lugar,
                    "city" => $city,
                    "state" => $state,
                    "country" => $country,
                    "bible_study" => $bible_study
                );

                array_push($conferences_arr, $response_item);

            }
        }

        $data = $conferences_arr;

        send_response( $data );

    }

    function activity_detail( $id ){
        
        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);

        if(is_numeric($id)){
            $stmt = $activity->detail($id,LOCALE);
        } else {
            $stmt = $activity->detailBySlug($id,LOCALE);
        }
        
        $num = $stmt->rowCount();
        
        if($num>0){
            $conferences_arr=array();
        
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){

                $date = '';
                $no_activity = '';
                $city = '';
                $state = '';
                $country = '';
                $thumbnail = '';

                extract($row);
                
                $response_item=array(
                    "_id" => $ID,
                    "title" => $title,
                    "body" => wpautop($content),
                    "slug" => $slug,
                    "hasText" => ($bodylength>0?true:false)
                );

                $response_item['mensaje'] = $mensaje;

                $translations = unserialize($translationmeta);

                foreach($translations as $translation_locale=>$translation_id){
                    $the_slug = $activity->translation_slug( $translation_locale, $translation_id);
                    $row = $the_slug->fetch(PDO::FETCH_ASSOC);
                    $translations[$translation_locale.'_slug'] = $row['slug'];
                }

                $response_item['translations'] = $translations;

                $confmeta = $activity->activity_meta( $ID );

                extract($confmeta);

                $response_item['bible_study'] = $numero_de_estudio_biblico;
                $response_item['activity'] = $actividad;
                $response_item['youtube'] = $youtube;
		        $response_item['date'] = $creation_date;
                $response_item['related_content'] = $related_content;

                $dt = new DateTime($creation_date);
                $formatter = new IntlDateFormatter(LOCALE, IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
                $formatter->setPattern( datePattern( $date ) );
                $response_item['nicedate'] = ucfirst($formatter->format($dt));
                $response_item['location'] = implode(', ',array_filter(array($city,$state,Locale::getDisplayRegion('-'.strtoupper($country), LOCALE ))));
                $response_item['duration'] = gmdate("H:i:s", (int)$duration);

                $fileData = $activity->get_activity_files( $ID );

                $files = $fileData->fetch(PDO::FETCH_ASSOC);

                //Get filedata
                $fileData = $activity->get_activity_files( $ID );
                $files = $fileData->fetch(PDO::FETCH_ASSOC);
                $fileTypes = ['videos','audios','textos','enlaces'];
                if($files['use_files']){

                    $tempFiles = [];

                    foreach($fileTypes as $type){
                        if(!is_array($tempFiles[$type])){
                            $tempFiles[$type] = [];
                        }
                        if($files[$type] > 0){
                            $t = $activity->get_files( $ID, $type, $files[$type]);
                            array_push($tempFiles[$type],$t);
                        }
                    }

                    $response_item['files'] = $tempFiles;

                }

                //Thumbnmail
                $response_item['thumbnail'] = $files['thumbnail'];
                
                //Translations
                $response_item['translations'] = $translations;

                //Image metadata for thumbnail use. TODO: Optimize this return array
                $response_item['meta'] = unserialize($meta);

                //Interventions
                $count = $activity->get_post_interventions($ID);
                $row = $count->fetch(PDO::FETCH_ASSOC);
                $interventions = $row['meta_value'];

                $temp = $activity->get_interventions($ID,$interventions);

                $response_item['interventions'] = [];

                foreach($temp as $t){
                    $t['texto'] = wpautop($t['texto']);
                    
                    array_push($response_item['interventions'],$t);
                }

                //Related content 
                if($related_content){
                    $response_item['related'] = $activity->get_related_content($ID,$related_content_count);

                }

                //Revisado
                $response_item['revisado'] = $revisado;

                array_push($conferences_arr, $response_item);

            }
        }

        $data = $conferences_arr;

        send_response( $data );
    }

    function listSearchActivities( $id ){
        
        $database = new Database();
        $db = $database->getConnection();

        $activity = new Actividad($db);

        $stmt = $activity->translation_list( $year, $month, null, false, LOCALE, null, false, false, 1000 );
        
        $num = $stmt->rowCount();
        
        if($num>0){
            $conferences_arr=array();
        
            while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){

                $date = '';
                $no_activity = '';
                $city = '';
                $state = '';
                $country = '';
                $thumbnail = '';

                extract($row);
                
                $response_item=array(
                    "_id" => $ID,
                    "title" => $title,
                    "body" => wpautop($content),
                    "slug" => $slug,
                    "hasText" => ($bodylength>0?true:false)
                );

                $response_item['mensaje'] = $mensaje;

                $translations = unserialize($translationmeta);

                foreach($translations as $translation_locale=>$translation_id){
                    $the_slug = $activity->translation_slug( $translation_locale, $translation_id);
                    $row = $the_slug->fetch(PDO::FETCH_ASSOC);
                    $translations[$translation_locale.'_slug'] = $row['slug'];
                }

                $response_item['translations'] = $translations;

                $confmeta = $activity->activity_meta( $ID );

                extract($confmeta);

                $response_item['bible_study'] = $numero_de_estudio_biblico;
                $response_item['activity'] = $actividad;
                $response_item['youtube'] = $youtube;
		        $response_item['date'] = $creation_date;
                $response_item['related_content'] = $related_content;

                $dt = new DateTime($creation_date);
                $formatter = new IntlDateFormatter(LOCALE, IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
                $formatter->setPattern( datePattern( $date ) );
                $response_item['nicedate'] = ucfirst($formatter->format($dt));
                $response_item['location'] = implode(', ',array_filter(array($city,$state,Locale::getDisplayRegion('-'.strtoupper($country), LOCALE ))));
                $response_item['duration'] = gmdate("H:i:s", (int)$duration);

                $fileData = $activity->get_activity_files( $ID );

                $files = $fileData->fetch(PDO::FETCH_ASSOC);

                //Get filedata
                $fileData = $activity->get_activity_files( $ID );
                $files = $fileData->fetch(PDO::FETCH_ASSOC);
                $fileTypes = ['videos','audios','textos','enlaces'];
                if($files['use_files']){

                    $tempFiles = [];

                    foreach($fileTypes as $type){
                        if(!is_array($tempFiles[$type])){
                            $tempFiles[$type] = [];
                        }
                        if($files[$type] > 0){
                            $t = $activity->get_files( $ID, $type, $files[$type]);
                            array_push($tempFiles[$type],$t);
                        }
                    }

                    $response_item['files'] = $tempFiles;

                }

                //Thumbnmail
                $response_item['thumbnail'] = $files['thumbnail'];
                
                //Translations
                $response_item['translations'] = $translations;

                //Image metadata for thumbnail use. TODO: Optimize this return array
                $response_item['meta'] = unserialize($meta);

                //Interventions
                $count = $activity->get_post_interventions($ID);
                $row = $count->fetch(PDO::FETCH_ASSOC);
                $interventions = $row['meta_value'];

                $temp = $activity->get_interventions($ID,$interventions);

                $response_item['interventions'] = [];

                foreach($temp as $t){
                    $t['texto'] = wpautop($t['texto']);
                    
                    array_push($response_item['interventions'],$t);
                }

                //Related content 
                if($related_content){
                    $response_item['related'] = $activity->get_related_content($ID,$related_content_count);

                }

                //Revisado
                $response_item['revisado'] = $revisado;

                array_push($conferences_arr, $response_item);

            }
        }

        $data = $conferences_arr;

        send_response( $data );
    }