]> git.mxchange.org Git - friendica-addons.git/blobdiff - jappixmini/jappix/php/functions.php
jappixmini: include jappix source
[friendica-addons.git] / jappixmini / jappix / php / functions.php
diff --git a/jappixmini/jappix/php/functions.php b/jappixmini/jappix/php/functions.php
new file mode 100644 (file)
index 0000000..af73777
--- /dev/null
@@ -0,0 +1,1427 @@
+<?php
+
+/*
+
+Jappix - An open social platform
+These are the PHP functions for Jappix
+
+-------------------------------------------------
+
+License: AGPL
+Authors: Vanaryon, LinkMauve, Mathieui, olivierm
+Last revision: 16/01/12
+
+*/
+
+// The function to check if Jappix is already installed
+function isInstalled() {
+       if(!file_exists(JAPPIX_BASE.'/store/conf/installed.xml'))
+               return false;
+       
+       return true;
+}
+
+// The function to check if a static host is defined
+function hasStatic() {
+       if(HOST_STATIC && (HOST_STATIC != '.'))
+               return true;
+       
+       return false;
+}
+
+// The function to check if this is a static server
+function isStatic() {
+       if(hasStatic() && (parse_url(HOST_STATIC, PHP_URL_HOST) == $_SERVER['HTTP_HOST']))
+               return true;
+       
+       return false;
+}
+
+// The function to check if this is an upload server
+function isUpload() {
+       if(HOST_UPLOAD && (parse_url(HOST_UPLOAD, PHP_URL_HOST) == $_SERVER['HTTP_HOST']))
+               return true;
+       
+       return false;
+}
+
+// The function to get the users.xml file hashed name
+function usersConfName() {
+       $conf_dir = JAPPIX_BASE.'/store/conf';
+       
+       // No conf folder?
+       if(!is_dir($conf_dir))
+               return '';
+       
+       // Read the conf folder
+       $conf_scan = scandir($conf_dir.'/');
+       $conf_name = '';
+       
+       // Loop the XML files
+       foreach($conf_scan as $current) {
+               if(preg_match('/(.+)(\.users\.xml)($)/', $current)) {
+                       $conf_name = $current;
+                       
+                       break;
+               }
+       }
+       
+       // Return the users file name
+       return $conf_name;
+}
+
+// The function to write a XML file
+function writeXML($type, $xmlns, $xml) {
+       // Generate the file path
+       $conf_path = JAPPIX_BASE.'/store/'.$type.'/';
+       $conf_name = $xmlns.'.xml';
+       
+       // Secured stored file?
+       if(($type == 'conf') && ($xmlns == 'users')) {
+               // Get the secured file name
+               $conf_secured = usersConfName();
+               
+               // Does this file exist?
+               if($conf_secured)
+                       $conf_name = $conf_secured;
+               else
+                       $conf_name = hash('sha256', rand(1, 99999999).time()).'.users.xml';
+       }
+       
+       // Generate the file complete path
+       $conf_file = $conf_path.$conf_name;
+       
+       // Write the installed marker
+       $gen_xml = '<?xml version="1.0" encoding="utf-8" ?>
+<jappix xmlns="jappix:'.$type.':'.$xmlns.'">
+       '.trim($xml).'
+</jappix>';
+       
+       file_put_contents($conf_file, $gen_xml);
+       
+       return true;
+}
+
+// The function to read a XML file
+function readXML($type, $xmlns) {
+       // Generate the file path
+       $conf_path = JAPPIX_BASE.'/store/'.$type.'/';
+       $conf_name = $xmlns.'.xml';
+       
+       // Secured stored file?
+       if(($type == 'conf') && ($xmlns == 'users')) {
+               // Get the secured file name
+               $conf_secured = usersConfName();
+               
+               // Does this file exist?
+               if($conf_secured)
+                       $conf_name = $conf_secured;
+       }
+       
+       // Generate the file complete path
+       $conf_file = $conf_path.$conf_name;
+       
+       if(file_exists($conf_file))
+               return file_get_contents($conf_file);
+       
+       return false;
+}
+
+// The function to read remote URLs
+function read_url($url) {
+       // Any cURL?
+       if(function_exists('curl_init')) {
+               $ch = curl_init();
+               curl_setopt($ch, CURLOPT_URL, $url);
+               curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+               curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
+               $data = curl_exec($ch);
+               curl_close($ch);
+       }
+       
+       // Default method
+       else
+               $data = @file_get_contents($url);
+       
+       return $data;
+}
+
+// The function to get the Jappix app. current version
+function getVersion() {
+       $file = file_get_contents(JAPPIX_BASE.'/VERSION');
+       $version = trim($file);
+       
+       return $version;
+}
+
+// The function to detect the user's language
+function checkLanguage() {
+       // If the user defined a language
+       if(isset($_GET['l']) && !empty($_GET['l'])) {
+               // We define some stuffs
+               $defined_lang = strtolower($_GET['l']);
+               $lang_file = JAPPIX_BASE.'/lang/'.$defined_lang.'/LC_MESSAGES/main.mo';
+               
+               if($defined_lang == 'en')
+                       $lang_found = true;
+               else
+                       $lang_found = file_exists($lang_file);
+               
+               // We check if the asked translation exists
+               if($lang_found) {
+                       $lang = $defined_lang;
+                       
+                       // Write a cookie
+                       setcookie('jappix_locale', $lang, (time() + 31536000));
+                       
+                       return $lang;
+               }
+       }
+       
+       // No language has been defined, but a cookie is stored
+       if(isset($_COOKIE['jappix_locale'])) {
+               $check_cookie = $_COOKIE['jappix_locale'];
+               
+               // The cookie has a value, check this value
+               if($check_cookie && (file_exists(JAPPIX_BASE.'/lang/'.$check_cookie.'/LC_MESSAGES/main.mo') || ($check_cookie == 'en')))
+                       return $check_cookie;
+       }
+       
+       // No cookie defined (or an unsupported value), naturally, we check the browser language
+       if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
+               return 'en';
+       
+       // We get the language of the browser
+       $nav_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+       $check_en = strtolower($nav_langs[0]);
+       
+       // We check if this is not english
+       if($check_en == 'en')
+               return 'en';
+       
+       $order = array();
+       
+       foreach($nav_langs as $entry) {
+               $indice = explode('=', $entry);
+               $lang = strtolower(substr(trim($indice[0]), 0, 2));
+               
+               if(!isset($indice[1]) || !$indice[1])
+                       $indice = 1;
+               else
+                       $indice = $indice[1];
+               
+               $order[$lang] = $indice;
+       }
+       
+       arsort($order);
+       
+       foreach($order as $nav_lang => $val) {
+               $lang_found = file_exists(JAPPIX_BASE.'/lang/'.$nav_lang.'/LC_MESSAGES/main.mo');
+               
+               if($lang_found)
+                       return $nav_lang;
+       }
+       
+       // If Jappix doen't know that language, we include the english translation
+       return 'en';
+}
+
+// The function to convert a ISO language code to its full name
+function getLanguageName($code) {
+       $code = strtolower($code);
+       
+       $known = array(
+               'aa' => 'Afaraf',
+               'ab' => 'Аҧсуа',
+               'ae' => 'Avesta',
+               'af' => 'Afrikaans',
+               'ak' => 'Akan',
+               'am' => 'አማርኛ',
+               'an' => 'Aragonés',
+               'ar' => 'العربية',
+               'as' => 'অসমীয়া',
+               'av' => 'авар мацӀ',
+               'ay' => 'Aymar aru',
+               'az' => 'Azərbaycan dili',
+               'ba' => 'башҡорт теле',
+               'be' => 'Беларуская',
+               'bg' => 'български',
+               'bh' => 'भोजपुरी',
+               'bi' => 'Bislama',
+               'bm' => 'Bamanankan',
+               'bn' => 'বাংলা',
+               'bo' => 'བོད་ཡིག',
+               'br' => 'Brezhoneg',
+               'bs' => 'Bosanski jezik',
+               'ca' => 'Català',
+               'ce' => 'нохчийн мотт',
+               'ch' => 'Chamoru',
+               'co' => 'Corsu',
+               'cr' => 'ᓀᐦᐃᔭᐍᐏᐣ',
+               'cs' => 'Česky',
+               'cu' => 'Словѣньскъ',
+               'cv' => 'чӑваш чӗлхи',
+               'cy' => 'Cymraeg',
+               'da' => 'Dansk',
+               'de' => 'Deutsch',
+               'dv' => 'ދިވެހި',
+               'dz' => 'རྫོང་ཁ',
+               'ee' => 'Ɛʋɛgbɛ',
+               'el' => 'Ελληνικά',
+               'en' => 'English',
+               'eo' => 'Esperanto',
+               'es' => 'Español',
+               'et' => 'Eesti keel',
+               'eu' => 'Euskara',
+               'fa' => 'فارسی',
+               'ff' => 'Fulfulde',
+               'fi' => 'Suomen kieli',
+               'fj' => 'Vosa Vakaviti',
+               'fo' => 'Føroyskt',
+               'fr' => 'Français',
+               'fy' => 'Frysk',
+               'ga' => 'Gaeilge',
+               'gd' => 'Gàidhlig',
+               'gl' => 'Galego',
+               'gn' => 'Avañe\'ẽ',
+               'gu' => 'ગુજરાતી',
+               'gv' => 'Ghaelg',
+               'ha' => 'هَوُسَ',
+               'he' => 'עברית',
+               'hi' => 'हिन्दी',
+               'ho' => 'Hiri Motu',
+               'hr' => 'Hrvatski',
+               'ht' => 'Kreyòl ayisyen',
+               'hu' => 'Magyar',
+               'hy' => 'Հայերեն',
+               'hz' => 'Otjiherero',
+               'ia' => 'Interlingua',
+               'id' => 'Bahasa',
+               'ie' => 'Interlingue',
+               'ig' => 'Igbo',
+               'ii' => 'ꆇꉙ',
+               'ik' => 'Iñupiaq',
+               'io' => 'Ido',
+               'is' => 'Íslenska',
+               'it' => 'Italiano',
+               'iu' => 'ᐃᓄᒃᑎᑐᑦ',
+               'ja' => '日本語',
+               'jv' => 'Basa Jawa',
+               'ka' => 'ქართული',
+               'kg' => 'KiKongo',
+               'ki' => 'Gĩkũyũ',
+               'kj' => 'Kuanyama',
+               'kk' => 'Қазақ тілі',
+               'kl' => 'Kalaallisut',
+               'km' => 'ភាសាខ្មែរ',
+               'kn' => 'ಕನ್ನಡ',
+               'ko' => '한 국어',
+               'kr' => 'Kanuri',
+               'ks' => 'कश्मीरी',
+               'ku' => 'Kurdî',
+               'kv' => 'коми кыв',
+               'kw' => 'Kernewek',
+               'ky' => 'кыргыз тили',
+               'la' => 'Latine',
+               'lb' => 'Lëtzebuergesch',
+               'lg' => 'Luganda',
+               'li' => 'Limburgs',
+               'ln' => 'Lingála',
+               'lo' => 'ພາສາລາວ',
+               'lt' => 'Lietuvių kalba',
+               'lu' => 'cilubà',
+               'lv' => 'Latviešu valoda',
+               'mg' => 'Fiteny malagasy',
+               'mh' => 'Kajin M̧ajeļ',
+               'mi' => 'Te reo Māori',
+               'mk' => 'македонски јазик',
+               'ml' => 'മലയാളം',
+               'mn' => 'Монгол',
+               'mo' => 'лимба молдовеняскэ',
+               'mr' => 'मराठी',
+               'ms' => 'Bahasa Melayu',
+               'mt' => 'Malti',
+               'my' => 'ဗမာစာ',
+               'na' => 'Ekakairũ Naoero',
+               'nb' => 'Norsk bokmål',
+               'nd' => 'isiNdebele',
+               'ne' => 'नेपाली',
+               'ng' => 'Owambo',
+               'nl' => 'Nederlands',
+               'nn' => 'Norsk nynorsk',
+               'no' => 'Norsk',
+               'nr' => 'Ndébélé',
+               'nv' => 'Diné bizaad',
+               'ny' => 'ChiCheŵa',
+               'oc' => 'Occitan',
+               'oj' => 'ᐊᓂᔑᓈᐯᒧᐎᓐ',
+               'om' => 'Afaan Oromoo',
+               'or' => 'ଓଡ଼ିଆ',
+               'os' => 'Ирон æвзаг',
+               'pa' => 'ਪੰਜਾਬੀ',
+               'pi' => 'पािऴ',
+               'pl' => 'Polski',
+               'ps' => 'پښتو',
+               'pt' => 'Português',
+               'pt-br' => 'Brasileiro',
+               'qu' => 'Runa Simi',
+               'rm' => 'Rumantsch grischun',
+               'rn' => 'kiRundi',
+               'ro' => 'Română',
+               'ru' => 'Русский',
+               'rw' => 'Kinyarwanda',
+               'sa' => 'संस्कृतम्',
+               'sc' => 'sardu',
+               'sd' => 'सिन्धी',
+               'se' => 'Davvisámegiella',
+               'sg' => 'Yângâ tî sängö',
+               'sh' => 'Српскохрватски',
+               'si' => 'සිංහල',
+               'sk' => 'Slovenčina',
+               'sl' => 'Slovenščina',
+               'sm' => 'Gagana fa\'a Samoa',
+               'sn' => 'chiShona',
+               'so' => 'Soomaaliga',
+               'sq' => 'Shqip',
+               'sr' => 'српски језик',
+               'ss' => 'SiSwati',
+               'st' => 'seSotho',
+               'su' => 'Basa Sunda',
+               'sv' => 'Svenska',
+               'sw' => 'Kiswahili',
+               'ta' => 'தமிழ்',
+               'te' => 'తెలుగు',
+               'tg' => 'тоҷикӣ',
+               'th' => 'ไทย',
+               'ti' => 'ትግርኛ',
+               'tk' => 'Türkmen',
+               'tl' => 'Tagalog',
+               'tn' => 'seTswana',
+               'to' => 'faka Tonga',
+               'tr' => 'Türkçe',
+               'ts' => 'xiTsonga',
+               'tt' => 'татарча',
+               'tw' => 'Twi',
+               'ty' => 'Reo Mā`ohi',
+               'ug' => 'Uyƣurqə',
+               'uk' => 'українська',
+               'ur' => 'اردو',
+               'uz' => 'O\'zbek',
+               've' => 'tshiVenḓa',
+               'vi' => 'Tiếng Việt',
+               'vo' => 'Volapük',
+               'wa' => 'Walon',
+               'wo' => 'Wollof',
+               'xh' => 'isiXhosa',
+               'yi' => 'ייִדיש',
+               'yo' => 'Yorùbá',
+               'za' => 'Saɯ cueŋƅ',
+               'zh' => '中文',
+               'zu' => 'isiZulu'
+       );
+       
+       if(isset($known[$code]))
+               return $known[$code];
+       
+       return null;
+}
+
+// The function to know if a language is right-to-left
+function isRTL($code) {
+       switch($code) {
+               // RTL language
+               case 'ar':
+               case 'he':
+               case 'dv':
+               case 'ur':
+                       $is_rtl = true;
+                       
+                       break;
+               
+               // LTR language
+               default:
+                       $is_rtl = false;
+                       
+                       break;
+       }
+       
+       return $is_rtl;
+}
+
+// The function to set the good localized <html /> tag
+function htmlTag($locale) {
+       // Initialize the tag
+       $html = '<html xml:lang="'.$locale.'" lang="'.$locale.'" dir="';
+       
+       // Set the good text direction (TODO)
+       /* if(isRTL($locale))
+               $html .= 'rtl';
+       else
+               $html .= 'ltr'; */
+       
+       $html .= 'ltr';
+       
+       // Close the tag
+       $html .= '">';
+       
+       echo($html);
+}
+
+// The function which generates the available locales list
+function availableLocales($active_locale) {
+       // Initialize
+       $scan = scandir(JAPPIX_BASE.'/lang/');
+       $list = array();
+       
+       // Loop the available languages
+       foreach($scan as $current_id) {
+               // Get the current language name
+               $current_name = getLanguageName($current_id);
+               
+               // Not valid?
+               if(($current_id == $active_locale) || ($current_name == null))
+                       continue;
+               
+               // Add this to the list
+               $list[$current_id] = $current_name;
+       }
+       
+       return $list;
+}
+
+// The function which generates the language switcher hidden part
+function languageSwitcher($active_locale) {
+       // Initialize
+       $keep_get = keepGet('l', false);
+       $list = availableLocales($active_locale);
+       $html = '';
+       
+       // Generate the HTML code
+       foreach($list as $current_id => $current_name)
+               $html .= '<a href="./?l='.$current_id.$keep_get.'">'.htmlspecialchars($current_name).'</a>, ';
+       
+       // Output the HTML code
+       return $html;
+}
+
+// The function to generate a strong hash
+function genStrongHash($string) {
+       // Initialize
+       $i = 0;
+       
+       // Loop to generate a incredibly strong hash (can be a bit slow)
+       while($i < 10) {
+               $string = hash('sha256', $string);
+               
+               $i++;
+       }
+       
+       return $string;
+}
+
+// The function to generate the version hash
+function genHash($version) {
+       // Get the configuration files path
+       $conf_path = JAPPIX_BASE.'/store/conf/';
+       $conf_main = $conf_path.'main.xml';
+       $conf_hosts = $conf_path.'hosts.xml';
+       $conf_background = $conf_path.'background.xml';
+       $logos_dir = JAPPIX_BASE.'/store/logos/';
+       
+       // Get the hash of the main configuration file
+       if(file_exists($conf_main))
+               $hash_main = md5_file($conf_main);
+       else
+               $hash_main = '0';
+       
+       // Get the hash of the main configuration file
+       if(file_exists($conf_hosts))
+               $hash_hosts = md5_file($conf_hosts);
+       else
+               $hash_hosts = '0';
+       
+       // Get the hash of the background configuration file
+       if(file_exists($conf_background))
+               $hash_background = md5_file($conf_background);
+       else
+               $hash_background = '0';
+       
+       // Get the hash of the logos folder
+       $hash_logos = '';
+       
+       if(is_dir($logos_dir)) {
+               $logos_scan = scandir($logos_dir.'/');
+               
+               foreach($logos_scan as $logos_current) {
+                       if(getFileExt($logos_current) == 'png')
+                               $hash_logos .= md5_file($logos_dir.$logos_current);
+               }
+       }
+       
+       return md5($version.$hash_main.$hash_hosts.$hash_background.$hash_logos);
+}
+
+// The function to hide the error messages
+function hideErrors() {
+       // Hide errors if not developer
+       if(!isDeveloper()) {
+               ini_set('display_errors', 'off');
+               ini_set('error_reporting', 0);
+       }
+       
+       // Developers need to get error reports!
+       else {
+               ini_set('display_errors', 'on');
+               ini_set('error_reporting', E_ALL);
+       }
+}
+
+// The function to check BOSH proxy is enabled
+function BOSHProxy() {
+       if(BOSH_PROXY == 'on')
+               return true;
+       
+       return false;
+}
+
+// The function to check compression is enabled
+function hasCompression() {
+       if(COMPRESSION != 'off')
+               return true;
+       
+       return false;
+}
+
+// The function to check compression is available with the current client
+function canCompress() {
+       // Compression allowed by admin & browser?
+       if(hasCompression() && (isset($_SERVER['HTTP_ACCEPT_ENCODING']) && substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')))
+               return true;
+       
+       return false;
+}
+
+// The function to check whether to show manager link or not
+function showManagerLink() {
+       if(MANAGER_LINK != 'off')
+               return true;
+       
+       return false;
+}
+
+// The function to check HTTPS storage is allowed
+function httpsStorage() {
+       if(HTTPS_STORAGE == 'on')
+               return true;
+       
+       return false;
+}
+
+// The function to check HTTPS storage must be forced
+function httpsForce() {
+       if((HTTPS_FORCE == 'on') && sslCheck())
+               return true;
+       
+       return false;
+}
+
+// The function to check we use HTTPS
+function useHttps() {
+       if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
+               return true;
+       
+       return false;
+}
+
+// The function to compress the output pages
+function compressThis() {
+       if(canCompress() && !isDeveloper())
+               ob_start('ob_gzhandler');
+}
+
+// The function to choose one file get with get.php or a liste of resources
+function multiFiles() {
+       if(MULTI_FILES == 'on')
+               return true;
+       
+       return false;
+}
+
+function getFiles($h, $l, $t, $g, $f) {
+       // Define the good path to the Get API
+       if(hasStatic())
+               $path_to = HOST_STATIC.'/';
+       else
+               $path_to = JAPPIX_BASE.'/';
+               
+       if(!multiFiles()) {
+               $values = array();
+               if ($h)
+                       $values[] = 'h='.$h;
+               if ($l)
+                       $values[] = 'l='.$l;
+               if ($t)
+                       $values[] = 't='.$t;
+               if ($g)
+                       $values[] = 'g='.$g;
+               if ($f)
+                       $values[] = 'f='.$f;
+               
+               return $path_to.'php/get.php?'.implode('&amp;', $values);
+       }
+       
+       if($g && !empty($g) && preg_match('/^(\S+)\.xml$/', $g) && preg_match('/^(css|js)$/', $t) && isSafe($g) && file_exists('xml/'.$g)) {
+               $xml_data = file_get_contents('xml/'.$g);
+               
+               // Any data?
+               if($xml_data) {
+                       $xml_read = new SimpleXMLElement($xml_data);
+                       $xml_parse = $xml_read->$t;
+                       
+                       // Files were added to the list before (with file var)?
+                       if($f)
+                               $f .= '~'.$xml_parse;
+                       else
+                               $f = $xml_parse;
+               }
+       }
+       
+       // Explode the f string
+       if(strpos($f, '~') != false)
+               $array = explode('~', $f);
+       else
+               $array = array($f);
+       
+       $a = array();
+       foreach($array as $file)
+               $a[] = $path_to.$t.'/'.$file;
+
+       if (count($a) == 1)
+               return $a[0];
+
+       return $a;
+}
+
+function echoGetFiles($h, $l, $t, $g, $f) {
+       if ($t == 'css')
+               $pattern = '<link rel="stylesheet" href="%s" type="text/css" media="all" />';
+       else if ($t == 'js')
+               $pattern = '<script type="text/javascript" src="%s"></script>';
+       
+       $files = getFiles($h, $l, $t, $g, $f);
+
+       if (is_string($files))
+               printf($pattern, $files);
+       else {
+               $c = count($files)-1;
+               for($i=0; $i<=$c; $i++) {
+                       if ($i)
+                               echo '  ';
+                       printf($pattern, $files[$i]);
+                       if ($i != $c)
+                               echo "\n";
+               }
+       }
+}
+
+// The function to check if anonymous mode is authorized
+function anonymousMode() {
+       if(isset($_GET['r']) && !empty($_GET['r']) && HOST_ANONYMOUS && (ANONYMOUS == 'on'))
+               return true;
+       else
+               return false;
+}
+
+// The function to quickly translate a string
+function _e($string) {
+       echo T_gettext($string);
+}
+
+// The function to check the encrypted mode
+function sslCheck() {
+       if(ENCRYPTION == 'on')
+               return true;
+       else
+               return false;
+}
+
+// The function to return the encrypted link
+function sslLink() {
+       // Using HTTPS?
+       if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'))
+               $link = '<a class="home-images unencrypted" href="http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'">'.T_('Unencrypted').'</a>';
+       
+       // Using HTTP?
+       else
+               $link = '<a class="home-images encrypted" href="https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'">'.T_('Encrypted').'</a>';
+       
+       return $link;
+}
+
+// The function to get the Jappix static URL
+function staticURL() {
+       // Check for HTTPS
+       $protocol = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
+       
+       // Full URL
+       $url = $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
+       
+       return $url;
+}
+
+// The function to get the Jappix location (only from Get API!)
+function staticLocation() {
+       // Filter the URL
+       return preg_replace('/((.+)\/)php\/get\.php(\S)+$/', '$1', staticURL());
+}
+
+// The function to include a translation file
+function includeTranslation($locale, $domain) {
+       T_setlocale(LC_MESSAGES, $locale);
+       T_bindtextdomain($domain, JAPPIX_BASE.'/lang');
+       T_bind_textdomain_codeset($domain, 'UTF-8');
+       T_textdomain($domain);
+}
+
+// The function to check the cache presence
+function hasCache($hash) {
+       if(file_exists(JAPPIX_BASE.'/store/cache/'.$hash.'.cache'))
+               return true;
+       else
+               return false;
+}
+
+// The function to check if developer mode is enabled
+function isDeveloper() {
+       if(DEVELOPER == 'on')
+               return true;
+       else
+               return false;
+}
+
+// The function to get a file extension
+function getFileExt($name) {
+       return strtolower(preg_replace('/^(.+)(\.)([^\.]+)$/i', '$3', $name));
+}
+
+// The function to get a file type
+function getFileType($ext) {
+       switch($ext) {
+               // Images
+               case 'jpg':
+               case 'jpeg':
+               case 'png':
+               case 'bmp':
+               case 'gif':
+               case 'tif':
+               case 'svg':
+               case 'psp':
+               case 'xcf':
+                       $file_type = 'image';
+                       
+                       break;
+               
+               // Videos
+               case 'ogv':
+               case 'mkv':
+               case 'avi':
+               case 'mov':
+               case 'mp4':
+               case 'm4v':
+               case 'wmv':
+               case 'asf':
+               case 'mpg':
+               case 'mpeg':
+               case 'ogm':
+               case 'rmvb':
+               case 'rmv':
+               case 'qt':
+               case 'flv':
+               case 'ram':
+               case '3gp':
+               case 'avc':
+                       $file_type = 'video';
+                       
+                       break;
+               
+               // Sounds
+               case 'oga':
+               case 'ogg':
+               case 'mka':
+               case 'flac':
+               case 'mp3':
+               case 'wav':
+               case 'm4a':
+               case 'wma':
+               case 'rmab':
+               case 'rma':
+               case 'bwf':
+               case 'aiff':
+               case 'caf':
+               case 'cda':
+               case 'atrac':
+               case 'vqf':
+               case 'au':
+               case 'aac':
+               case 'm3u':
+               case 'mid':
+               case 'mp2':
+               case 'snd':
+               case 'voc':
+                       $file_type = 'audio';
+                       
+                       break;
+               
+               // Documents
+               case 'pdf':
+               case 'odt':
+               case 'ott':
+               case 'sxw':
+               case 'stw':
+               case 'ots':
+               case 'sxc':
+               case 'stc':
+               case 'sxi':
+               case 'sti':
+               case 'pot':
+               case 'odp':
+               case 'ods':
+               case 'doc':
+               case 'docx':
+               case 'docm':
+               case 'xls':
+               case 'xlsx':
+               case 'xlsm':
+               case 'xlt':
+               case 'ppt':
+               case 'pptx':
+               case 'pptm':
+               case 'pps':
+               case 'odg':
+               case 'otp':
+               case 'sxd':
+               case 'std':
+               case 'std':
+               case 'rtf':
+               case 'txt':
+               case 'htm':
+               case 'html':
+               case 'shtml':
+               case 'dhtml':
+               case 'mshtml':
+                       $file_type = 'document';
+                       
+                       break;
+               
+               // Packages
+               case 'tgz':
+               case 'gz':
+               case 'tar':
+               case 'ar':
+               case 'cbz':
+               case 'jar':
+               case 'tar.7z':
+               case 'tar.bz2':
+               case 'tar.gz':
+               case 'tar.lzma':
+               case 'tar.xz':
+               case 'zip':
+               case 'xz':
+               case 'rar':
+               case 'bz':
+               case 'deb':
+               case 'rpm':
+               case '7z':
+               case 'ace':
+               case 'cab':
+               case 'arj':
+               case 'msi':
+                       $file_type = 'package';
+                       
+                       break;
+               
+               // Others
+               default:
+                       $file_type = 'other';
+                       
+                       break;
+       }
+       
+       return $file_type;
+}
+
+// The function to get the MIME type of a file
+function getFileMIME($path) {
+       $finfo = finfo_open(FILEINFO_MIME_TYPE);
+       $cmime = finfo_file($finfo, $path);
+       finfo_close($finfo);
+       
+       return $cmime;
+}
+
+// The function to keep the current GET vars
+function keepGet($current, $no_get) {
+       // Get the HTTP GET vars
+       $request = $_SERVER['REQUEST_URI'];
+       
+       if(strrpos($request, '?') === false)
+               $get = '';
+       
+       else {
+               $uri = explode('?', $request);
+               $get = $uri[1];
+       }
+       
+       // Remove the items we don't want here
+       $proper = str_replace('&', '&amp;', $get);
+       $proper = preg_replace('/((^)|(&amp;))(('.$current.'=)([^&]+))/i', '', $proper);
+       
+       // Nothing at the end?
+       if(!$proper)
+               return '';
+       
+       // We have no defined GET var
+       if($no_get) {
+               // Remove the first "&" if it appears
+               if(preg_match('/^(&(amp;)?)/i', $proper))
+                       $proper = preg_replace('/^(&(amp;)?)/i', '', $proper);
+               
+               // Add the first "?"
+               $proper = '?'.$proper;
+       }
+       
+       // Add a first "&" if there is no one and no defined GET var
+       else if(!$no_get && (substr($proper, 0, 1) != '&') && (substr($proper, 0, 5) != '&amp;'))
+               $proper = '&amp;'.$proper;
+       
+       return $proper;
+}
+
+// Escapes regex special characters for in-regex usage
+function escapeRegex($string) {
+       return preg_replace('/[-[\]{}()*+?.,\\^$|#]/', '\\$&', $string);
+}
+
+// Generates the security HTML code
+function securityHTML() {
+       return '<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+       <title>Jappix - Forbidden</title>
+</head>
+
+<body>
+       <h1>Forbidden</h1>
+       <h4>This is a private folder</h4>
+</body>
+
+</html>';
+}
+
+// Checks if a relative server path is safe
+function isSafe($path) {
+       // Mhh, someone is about to nasty stuffs (previous folder, or executable scripts)
+       if(preg_match('/\.\.\//', $path) || preg_match('/index\.html?$/', $path) || preg_match('/(\.)((php([0-9]+)?)|(aspx?)|(cgi)|(rb)|(py)|(pl)|(jsp)|(ssjs)|(lasso)|(dna)|(tpl)|(smx)|(cfm))$/i', $path))
+               return false;
+       
+       return true;
+}
+
+// Set the good unity for a size in bytes
+function formatBytes($bytes, $precision = 2) {
+       $units = array('B', 'KB', 'MB', 'GB', 'TB');
+       
+       $bytes = max($bytes, 0);
+       $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
+       $pow = min($pow, count($units) - 1);
+       
+       $bytes /= pow(1024, $pow);
+       
+       return round($bytes, $precision) . ' ' . $units[$pow];
+}
+
+// Converts a human-readable bytes value to a computer one
+function humanToBytes($string) {
+       // Values array
+       $values = array(
+                       'K' => '000',
+                       'M' => '000000',
+                       'G' => '000000000',
+                       'T' => '000000000000',
+                       'P' => '000000000000000',
+                       'E' => '000000000000000000',
+                       'Z' => '000000000000000000000',
+                       'Y' => '000000000000000000000000'
+                      );
+       
+       // Filter the string
+       foreach($values as $key => $zero)
+               $string = str_replace($key, $zero, $string);
+       
+       // Converts the string into an integer
+       $string = intval($string);
+       
+       return $string;
+}
+
+// Get the maximum file upload size
+function uploadMaxSize() {
+       // Not allowed to upload files?
+       if(ini_get('file_uploads') != 1)
+               return 0;
+       
+       // Upload maximum file size
+       $upload = humanToBytes(ini_get('upload_max_filesize'));
+       
+       // POST maximum size
+       $post = humanToBytes(ini_get('post_max_size'));
+       
+       // Return the lowest value
+       if($upload <= $post)
+               return $upload;
+       
+       return $post;
+}
+
+// Normalizes special chars
+function normalizeChars($string) {
+       $table = array(
+               'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',
+               'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
+               'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
+               'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
+               'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
+               'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
+               'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
+               'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r'
+       );
+       
+       return strtr($string, $table);
+}
+
+// Filters the XML special chars for the SVG drawer
+function filterSpecialXML($string) {
+       // Strange thing: when $string = 'Mises à jour' -> bug! but 'Mise à jour' -> ok!
+       $string = normalizeChars($string);
+       
+       // Encodes with HTML special chars
+       $string = htmlspecialchars($string);
+       
+       return $string;
+}
+
+// Writes the current visit in the total file
+function writeTotalVisit() {
+       // Get the current time stamp
+       $stamp = time();
+       
+       // Initialize the defaults
+       $array = array(
+                       'total' => 0,
+                       'stamp' => $stamp
+                     );
+       
+       // Try to read the saved data
+       $total_data = readXML('access', 'total');
+       
+       // Get the XML file values
+       if($total_data) {
+               // Initialize the visits reading
+               $read_xml = new SimpleXMLElement($total_data);
+               
+               // Loop the visit elements
+               foreach($read_xml->children() as $current_child)
+                       $array[$current_child->getName()] = intval($current_child);
+       }
+       
+       // Increment the total number of visits
+       $array['total']++;
+       
+       // Generate the new XML data
+       $total_xml = 
+       '<total>'.$array['total'].'</total>
+       <stamp>'.$array['stamp'].'</stamp>'
+       ;
+       
+       // Re-write the new values
+       writeXML('access', 'total', $total_xml);
+}
+
+// Writes the current visit in the months file
+function writeMonthsVisit() {
+       // Get the current month
+       $month = intval(date('m'));
+       
+       // Define the stats array
+       $array = array();
+       
+       // January to August period
+       if($month <= 8) {
+               for($i = 1; $i <= 8; $i++)
+                       $array['month_'.$i] = 0;
+       }
+       
+       // August to September period
+       else {
+               $i = 8;
+               $j = 1;
+               
+               while($j <= 3) {
+                       // Last year months
+                       if(($i >= 8) && ($i <= 12))
+                               $array['month_'.$i++] = 0;
+                       
+                       // First year months
+                       else
+                               $array['month_'.$j++] = 0;
+               }
+       }
+       
+       // Try to read the saved data
+       $months_data = readXML('access', 'months');
+       
+       // Get the XML file values
+       if($months_data) {
+               // Initialize the visits reading
+               $read_xml = new SimpleXMLElement($months_data);
+               
+               // Loop the visit elements
+               foreach($read_xml->children() as $current_child) {
+                       $current_month = $current_child->getName();
+                       
+                       // Parse the current month id
+                       $current_id = intval(preg_replace('/month_([0-9]+)/i', '$1', $current_month));
+                       
+                       // Is this month still valid?
+                       if((($month <= 8) && ($current_id <= $month)) || (($month >= 8) && ($current_id >= 8) && ($current_id <= $month)))
+                               $array[$current_month] = intval($current_child);
+               }
+       }
+       
+       // Increment the current month value
+       $array['month_'.$month]++;
+       
+       // Generate the new XML data
+       $months_xml = '';
+       
+       foreach($array as $array_key => $array_value)
+               $months_xml .= "\n".'   <'.$array_key.'>'.$array_value.'</'.$array_key.'>';
+       
+       // Re-write the new values
+       writeXML('access', 'months', $months_xml);
+}
+
+// Writes the current visit to the storage file
+function writeVisit() {
+       // Write total visits
+       writeTotalVisit();
+       
+       // Write months visits
+       writeMonthsVisit();
+}
+
+// Returns the default background array
+function defaultBackground() {
+       // Define the default values
+       $background_default = array(
+                               'type' => 'default',
+                               'image_file' => '',
+                               'image_repeat' => 'repeat-x',
+                               'image_horizontal' => 'center',
+                               'image_vertical' => 'top',
+                               'image_adapt' => 'off',
+                               'image_color' => '#cae1e9',
+                               'color_color' => '#cae1e9'
+                             );
+       
+       return $background_default;
+}
+
+// Reads the notice configuration
+function readNotice() {
+       // Read the notice configuration XML
+       $notice_data = readXML('conf', 'notice');
+       
+       // Define the default values
+       $notice_default = array(
+                               'type' => 'none',
+                               'notice' => ''
+                         );
+       
+       // Stored data array
+       $notice_conf = array();
+       
+       // Read the stored values
+       if($notice_data) {
+               // Initialize the notice configuration XML data
+               $notice_xml = new SimpleXMLElement($notice_data);
+               
+               // Loop the notice configuration elements
+               foreach($notice_xml->children() as $notice_child)
+                       $notice_conf[$notice_child->getName()] = utf8_decode($notice_child);
+       }
+       
+       // Checks no value is missing in the stored configuration
+       foreach($notice_default as $notice_name => $notice_value) {
+               if(!isset($notice_conf[$notice_name]) || empty($notice_conf[$notice_name]))
+                       $notice_conf[$notice_name] = $notice_default[$notice_name];
+       }
+       
+       return $notice_conf;
+}
+
+// The function to get the admin users
+function getUsers() {
+       // Try to read the XML file
+       $data = readXML('conf', 'users');
+       $array = array();
+       
+       // Any data?
+       if($data) {
+               $read = new SimpleXMLElement($data);
+               
+               // Check the submitted user exists
+               foreach($read->children() as $child) {
+                       // Get the node attributes
+                       $attributes = $child->attributes();
+                       
+                       // Push the attributes to the global array (converted into strings)
+                       $array[$attributes['name'].''] = $attributes['password'].'';
+               }
+       }
+       
+       return $array;
+}
+
+// Manages users
+function manageUsers($action, $array) {
+       // Try to read the old XML file
+       $users_array = getUsers();
+       
+       // What must we do?
+       switch($action) {
+               // Add some users
+               case 'add':
+                       foreach($array as $array_user => $array_password)
+                               $users_array[$array_user] = genStrongHash($array_password);
+                       
+                       break;
+               
+               // Remove some users
+               case 'remove':
+                       foreach($array as $array_user) {
+                               // Not the last user?
+                               if(count($users_array) > 1)
+                                       unset($users_array[$array_user]);
+                       }
+                       
+                       break;
+       }
+       
+       // Regenerate the XML
+       $users_xml = '';
+       
+       foreach($users_array as $users_name => $users_password)
+               $users_xml .= "\n".'    <user name="'.stripslashes(htmlspecialchars($users_name)).'" password="'.stripslashes($users_password).'" />';
+       
+       // Write the main configuration
+       writeXML('conf', 'users', $users_xml);
+}
+
+// Resize an image with GD
+function resizeImage($path, $ext, $width, $height) {
+       // No GD?
+       if(!function_exists('gd_info'))
+               return false;
+       
+       try {
+               // Initialize GD
+               switch($ext) {
+                       case 'png':
+                               $img_resize = imagecreatefrompng($path);
+                               
+                               break;
+                       
+                       case 'gif':
+                               $img_resize = imagecreatefromgif($path);
+                               
+                               break;
+                       
+                       default:
+                               $img_resize = imagecreatefromjpeg($path);
+               }
+               
+               // Get the image size
+               $img_size = getimagesize($path);
+               $img_width = $img_size[0];
+               $img_height = $img_size[1];
+       
+               // Necessary to change the image width
+               if($img_width > $width && ($img_width > $img_height)) {
+                       // Process the new sizes
+                       $new_width = $width;
+                       $img_process = (($new_width * 100) / $img_width);
+                       $new_height = (($img_height * $img_process) / 100);
+               }
+       
+               // Necessary to change the image height
+               else if($img_height > $height && ($img_width < $img_height)) {
+                       // Process the new sizes
+                       $new_height = $height;
+                       $img_process = (($new_height * 100) / $img_height);
+                       $new_width = (($img_width * $img_process) / 100);
+               }
+       
+               // Else, just use the old sizes
+               else {
+                       $new_width = $img_width;
+                       $new_height = $img_height;
+               }
+       
+               // Create the new image
+               $new_img = imagecreatetruecolor($new_width, $new_height);
+               
+               // Must keep alpha pixels?
+               if(($ext == 'png') || ($ext == 'gif')){
+                       imagealphablending($new_img, false);
+                       imagesavealpha($new_img, true);
+                       
+                       // Set transparent pixels
+                       $transparent = imagecolorallocatealpha($new_img, 255, 255, 255, 127);
+                       imagefilledrectangle($new_img, 0, 0, $new_width, $new_height, $transparent);
+               }
+               
+               // Copy the new image
+               imagecopyresampled($new_img, $img_resize, 0, 0, 0, 0, $new_width, $new_height, $img_size[0], $img_size[1]);
+       
+               // Destroy the old data
+               imagedestroy($img_resize);
+               unlink($path);
+       
+               // Write the new image
+               switch($ext) {
+                       case 'png':
+                               imagepng($new_img, $path);
+                               
+                               break;
+                       
+                       case 'gif':
+                               imagegif($new_img, $path);
+                               
+                               break;
+                       
+                       default:
+                               imagejpeg($new_img, $path, 85);
+               }
+               
+               return true;
+       }
+       
+       catch(Exception $e) {
+               return false;
+       }
+}
+
+?>