<?php
/*
*    get-invia-xml.php    v0.5            Milan Kryl | http://kryl.info | 25. 12. 2016
*    --------------------------------------------------------------------------------------------------
*    Soubor pro stahovani XML exportu serveru Invia a jeho zobrazeni v PHP.
*    Kod je mozne dale upravovat a sirit bez omezeni. Puvodni kod a pripadne
*    aktualizace lze nalezt na adrese http://kryl.info/invia/
*
*    INSTRUKCE PRO INSTALACI
*    =========================
*    1. nahradte nize text URL_XML_SOUBORU_INVIA adresou vygenerovanou v administracnim rozhrani Invia.cz
*    2. nakopirujte tento soubor na server
*    3. vytvorte adresar pro docasne ukladani reklamy invia-cache
*    4. pridejte adresari prava pro zapis (CHMOD 777 / rwxrwxrwx)
*    5. vlozte nasledujici kod do PHP stranky, kde chcete nabidky zobrazovat
        <?php
            $invia_select = 'invia';        // nastav jmeno odkazu v konfiguraci
            // $invia_maxcount = 10;        // nastaveni maximalniho poctu polozek
            // $invia_config[] = "NOUNIQUEPHOTO";    // vystup NEfiltrovat unikatni fotografie
            // $invia_config[] = "NOSORT";        // vystup NEtridit dle data
            // $invia_config[] = "IGNOREDEFAULT";    // vyhodit nerelevantni zajezdy 
            require($_SERVER['DOCUMENT_ROOT'].'/get-invia-xml.php');
        ?>
*
*    6. Pritomnost parametru v promenne invia_config zamezi trideni dle data odjezdu NOSORT nebo
*       zunikatneni dle fotografie NOUNIQUEPHOTO. Vychozi nastaveni tridi a odstranuje duplicity
*
*    WHAT'S NEW
*    =======================
*    25.12. 2016    podpora stahovani exportu z https
*    19. 3. 2013    aktualizace pro novy format XML 2013 (prvni verze)
*    26.11. 2008    offer default=1 filtr (pro rychlou aktualizace promazte invia-cache adresar)
*     8. 5. 2008    Pridano parsovani poplatku (tax)
*    28. 3. 2008    Osetreni neexistujiciho souboru v cache pri nepovedenem importu
*    26.12. 2007    FIX pouziti cache, kdyz invia nefunguje
*    23.12. 2007    zobrazeni terminu i kdy je aktivovan NOSORT
*    22.12. 2007    oprava pro vkladani do Wordpressu pres Exec-PHP
*     3. 7. 2007    uprava formatu terminu term => from, to, destination & price, currency
*    26. 6. 2007    podpora vice XML souboru
*/


if ( ! isset($invia_config) ) { $invia_config = array(); }

if ( ! isset(
$INVIA_CONFIG) )
    
$INVIA_CONFIG = array(
            
"invia" => "URL_XML_SOUBORU_INVIA",
            
"empty" => ""    // ignorujte :) pro pridani dalsiho zaznamu kopirujte predchozi radek
                    // a vyplnte jine pojmenovani (viz vychozi "invia")
        
);
if (!isset(
$invia_cache)) {
    
$CACHE_DIRECTORY $_SERVER['DOCUMENT_ROOT'].'/invia-cache';    // jmeno adresare (bez koncoveho lomitka!), kde jsou docasne ukladany stazene XML kody (na 4 hodiny)
} else {
    
$CACHE_DIRECTORY $invia_cache;
}

if (! isset(
$invia_maxcount) ) { $invia_maxcount 0; }
if (! isset(
$invia_encoding) ) { $invia_encoding 'utf-8'; }


/*
*    NEMODIFIKUJTE do dalsiho odelovace
*
*    --------------------------------------------------------------------------------------------------
*
*
*/


    
if (isset($invia_select) && ($INVIA_CONFIG[$invia_select]) && $INVIA_CONFIG[$invia_select] == '') {
        
// get first if none selected
        
list($invia_select$input_url) = each($INVIA_CONFIG);
    } else {
        
$input_url $INVIA_CONFIG[$invia_select];
    }

    
$local_xml_file $CACHE_DIRECTORY.'/'.$invia_select.'.xml';

    
$defined_items = array('image''photos''destination''hotel''term''price''tax''totalprice''discount''food''transportation''airports''url''tourtypes''hotelinfo''actionattributes');
    
$items_structure = array(
                    
'photos' => array('photo'),
                    
'destination' => array('country''locality'),
                    
'term' => array('from''to''length'),
                    
'airports' => array('airport'),
                    
'tourtypes' => array('type'),
                    
'hotelinfo' => array('id''stars''rating''lat''lng'),
                    
'actionattributes' => array('attr'),
                );

    
$currency = array(
                
"" => ",-",
                
"CZK" => "Kč",
                
"Kč" => "Kč",
            );

    if (!
file_exists($CACHE_DIRECTORY)) die('<b>CHYBA:</b> vytvorte adresar '.$CACHE_DIRECTORY.' - postupujte podle navodu ve skriptu!');
    if (!
is_writable($CACHE_DIRECTORY)) die('<b>CHYBA:</b> nastavte adresari prava zapisu - postupujte podle navodu ve skriptu!');


    
/* thanks to dgx ! http://www.dgx.cz/trine/ */
    // function 'file_put_contents' is missing in PHP 4
    
if (!function_exists('file_put_contents')) {
      function 
file_put_contents($fileName$s)
      {
        
$f fopen($fileName'w');
        
fwrite($f$s);
        
fclose($f);
      }
    }


    function 
echoarr($a$sep ', ') {

        
$out '';

        if ( isset(
$a) ) {
            if ( 
is_array($a) ) {
                
$out .= implode$sep$a );
            } else {
                
$out .= $a;
            }
        }

        return 
$out;
    }

    function 
get_content_from_url($url$timeout 3) {

        
$result "";
        
$url parse_url($url);
        if (
$url['scheme'] == 'https') {
            
$fs = @fsockopen ('ssl://'.$url['host'], 443); 
        } else {
            
$fs = @fsockopen ($url['host'], 80); 
        }

        if (
$fs) {

            if ( 
function_exists("socket_set_timeout") ) {
                
socket_set_timeout($fs$timeout0);
            } else if ( 
function_exists("stream_set_timeout") ) {
                
stream_set_timeout($fs$timeout0);
            }

            
$http_get_cmd "GET ".$url['path'].( isset($url['query']) ? "?".$url['query'] : '' )." HTTP/1.0\r\n".
                            
"Host: ".$url['host']."\r\n".
                            
"Connection: Close\r\n\r\n";

            
fwrite ($fs$http_get_cmd);
            while (!
feof($fs)) {
                
$result .= @fread($fs40960);
            }
            
fclose($fs);

            
// remove headers
            
$t explode("\r\n\r\n"trim($result), 2);
            if ( 
count($t) > ) {
                
$result $t[1];
            } else {
                
$result '';
            }

            return 
$result;

        } else {

            return 
false;

        }
    }

    function 
parse_invia_xml($xml_content$defined_items$items_structure) {

        global 
$invia_config;

        
preg_match_all('~<offer(.*?)>(.*?)</offer>~sim'$xml_content$items);

        
$offer $items[2];
        
$offer_params $items[1];

        
$items = array();

        foreach (
$offer as $k => $v) {

            
// parse each offer

            
if ( ( is_array($invia_config) && in_array("IGNOREDEFAULT"$invia_config) ) && preg_match('/default="1"/si'$offer_params[$k]) ) { continue; }

            
$off = array();
            foreach (
$defined_items as $l => $u) {

                
preg_match("~<$u(.*?)>(.*?)</$u>~si"$v$temp);

                
// parse atributes
                
if (isset($temp[1]) && $temp[1] != '') {

                    
preg_match_all('~[ ]*([^ ]*)="([^"]*)"~si'$temp[1], $params);

                    foreach (
$params[1] as $m => $w) {
                        
$off[$u."_".$w] = $params[2][$m];
                    }
                }

                
// parse value and store

                
if ( (isset($items_structure[$u])) && (is_array($items_structure[$u])) && (count($items_structure[$u]) > 0) ) {

                    foreach (
$items_structure[$u] as $j) {

                        if ( isset(
$temp[2]) ) {
                            
preg_match_all("~<$j(.*?)>(.*?)</$j>~si"trim($temp[2]), $stemp);

                            
$a = array();

                            foreach (
$stemp[0] as $key => $val) {

                                if (
$stemp[1][$key] != '') {
                                    
preg_match_all('~[ ]*([^ ]*)="([^"]*)"~si'$stemp[1][$key], $params);

                                    foreach (
$params[1] as $m => $w) {
                                        
$a[$u."_".$w][$key] = $params[2][$m];
                                    }
                                }

                                if (
$stemp[2][$key] != ''$a[$j][$key] = trim($stemp[2][$key]);

                            }

                            if ( isset(
$a[$j]) && count($a[$j]) > ) {
                                
$off[$u][$j] = $a[$j];
                            } else {
                                if ( isset(
$a[$j]) ) {
                                    foreach (
$a as $key => $val) {
                                        
$off[$u][$key] = $val[0];
                                    }
                                }
                            }
                        }
                    }

                } else {

                    if (isset(
$temp[2]) && $temp[2] != '') { $off[$u] = trim($temp[2]); }

                }
            }

            if ( isset(
$off[$defined_items[0]]) && $off[$defined_items[0]] != '' $items[] = $off;
        }

        return 
$items;
    }


    
$offers = array();

    if ( ( !
file_exists($local_xml_file) || filemtime($local_xml_file) < (time() - 3600*24) || filesize($local_xml_file) < 15 ) ) {

        if ( ( 
$xml_content get_content_from_url($input_url) ) == true ) {

            
$offers parse_invia_xml($xml_content$defined_items$items_structure);

        }
        if (
count($offers) > 0) {
            
file_put_contents($local_xml_fileserialize($offers));
        }
    } 

    if ( (
file_exists($local_xml_file)) && (count($offers) < 1) && (( $xml_content file_get_contents($local_xml_file) ) == true ) ) {
        
$offers unserialize($xml_content);
    }
    

    
// uniq offers
    
if (! is_array($invia_config) || ! in_array("NOUNIQUEPHOTO"$invia_config) ) {
        
$uniq_offers = array();
        foreach (
$offers as $k => $v) {
            
// $photo = (( is_array($v['photos']['photo']) ) ? $v['photos']['photo'][0] : $v['photos']['photo']);
            
$photo = ( isset($v['image']) ) ? $v['image'] : '';
            
$uniq_offers[$photo] = $v;
        }
        
$offers $uniq_offers;
    }

    
// parse terms
    
$sort_offers = array();
    
$i 0;
    foreach (
$offers as $k => $v) {
        
// parse FROM date
        
if ( preg_match('/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/'$v['term']['from'], $t) ) {
            
$fy $t[1];
            
$fm $t[2];
            
$fd $t[3];
        }

        
// parse TO date
        
if ( preg_match('/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/'$v['term']['to'], $t) ) {
            
$ty $t[1];
            
$tm $t[2];
            
$td $t[3];
        }


        if ( (
$fy != '') && ($ty != '') ) {

            
$timehash $ty.$tm.$td.$fy.$fm.$fd.'-'.$i;
            
$fd intval($fd);
            
$fm intval($fm);
            
$fy intval($fy);

            
$td intval($td);
            
$tm intval($tm);
            
$ty intval($ty);

            
$v['term']['from-to'] = $fd.'.'.$fm.'.'.(($fy != $ty)?$fy:"").'-'.$td.'.'.$tm.'.'.$ty.' ';

            
$sort_offers[$timehash] = $v;
            
$offers[$k] = $v;
            
$i++;
        }
    }
    
// sort offers
    
if (! is_array($invia_config) || ! in_array("NOSORT"$invia_config) ) {
        
$offers $sort_offers;
        
ksort($offers);
    }

    if (
$invia_maxcount 0$offers array_slice($offers0$invia_maxcount);


if (
count($offers) > 0) {

/*
*    kod nize MUZETE zmenit pro zmenu formatu vypisu
*    --------------------------------------------------------------------------------------------------
*    pripadne kod nize smazte a ve strance pokracujte ve zpracovani vytvoreneho pole $offers
*/

function print_offer($v$currency) {

    
$out '';

    if (isset(
$v['url']) ) {


        
$out .= '<tr>';
        
$out .= '<td colspan="2">';
        
$out .= '<h3><a href="' $v['url'] . '">' $v['hotel'] . '</a></h3>';
        
$out .= '</td>';
        
$out .= '</tr>';
        
$out .= '<tr>';
        
$out .= '<td style="width: 270px; vertical-align: top;">';

        
$photo = ( isset($v['image']) ) ? $v['image'] : '';
        
$out .= '<a href="'.$v['url'].'"><img src="'.$photo.'" alt="'.((isset($v['image_alt']))?$v['image_alt']:"").'" class="foto" width="250" /></a>';
        
$out .= '</td>';
        
        
$out .= '<td>';

        if ( isset(
$v['destination']['locality']) ) { 
            
$out .= $v['destination']['locality'].", ".$v['destination']['country']."<br />";
        }

        
$out .= $v['term']['from-to']."<br />";
        
$out .= $v['food']."<br />";
        
$out .= "<b>".number_format($v['price'], 0','' ')." ".$currency[$v['price_currency']]."</b><br />";

        
$out .= "<br />";
        if ( isset(
$v['actionattributes']) ) { $out .= echoarr($v['tourtypes']['type']). ", "; }
        if ( isset(
$v['actionattributes']) ) { $out .= echoarr($v['actionattributes']['attr']). "<br>"; }
        
$out .= "Doprava: ".$v['transportation']." ";
        if ( isset(
$v['airports']) ) { $out .= "("echoarr($v['airports']['airport']). ")<br />"; }

        if ( isset(
$v['hotelinfo']) ) {
            if ( isset(
$v['hotelinfo']['stars']) ) $out .= "Hvězdiček: <b>".$v['hotelinfo']['stars']."</b>";
            if ( isset(
$v['hotelinfo']['rating']) ) $out .= ", Hodnocení: <b>".$v['hotelinfo']['rating']."</b>";
            
$out .= "<br />";
            if ( isset(
$v['hotelinfo']['lat']) && isset($v['hotelinfo']['lng']) ) $out .= '<a href="http://maps.google.com/?q='.$v['hotelinfo']['lat'].','.$v['hotelinfo']['lng'].'">Hotel na mapě</a>'."<br />";
        }


        
$out .= '</td></tr>';
    }

    return 
$out;

}




        
$out '';

        
$out .= '<table class="invia-table" style="width: 100%;">';
        foreach (
$offers as $k => $v) {

            
$out .= print_offer($v$currency);

        }
        
$out .= '<tr><td colspan="2" style="text-align: right;">Zájezdy od <a href="http://www.invia.cz/?aid=173016&adata1=xml-script">INVIA.cz</a></td></tr>';
        
$out .= "</table>";

            echo 
$out;
/*
*    --------------------------------------------------------------------------------------------------
*/

// end if (count($offers) > 0)