diff --git a/htdocs/lib/functions.lib.php b/htdocs/lib/functions.lib.php index dd28382ca08..d690d877de2 100644 --- a/htdocs/lib/functions.lib.php +++ b/htdocs/lib/functions.lib.php @@ -37,6 +37,16 @@ if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); +/** + * \brief Return value of a param into get or post variable + * \param paramname Name of parameter to found + * \return string Value found + */ +function GETPOST($paramname) +{ + return isset($_GET[$paramname])?$_GET[$paramname]:(isset($_POST[$paramname])?$_POST[$paramname]:''); +} + /** * \brief Create a clone of instance of object (new instance with same properties) * This function works for both PHP4 and PHP5 @@ -261,7 +271,7 @@ function dol_syslog($message, $level=LOG_INFO) { $filelog=SYSLOG_FILE; $filelog=preg_replace('/DOL_DATA_ROOT/i',DOL_DATA_ROOT,$filelog); - //print $filelog; + //print "filelog=".$filelog."\n"; if (defined("SYSLOG_FILE_NO_ERROR")) $file=@fopen($filelog,"a+"); else $file=fopen($filelog,"a+"); @@ -382,6 +392,15 @@ function dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='') if (! $notab) print "\n".'
'."\n"; } +/** + * \brief Show tab footer of a card + * \param notab 0=Add tab footer, 1=no tab footer + */ +function dol_fiche_end($notab=0) +{ + if (! $notab) print "\n
\n"; +} + /** * \brief Add a delay to a date @@ -425,17 +444,22 @@ function dol_print_date($time,$format='',$to_gmt=false,$outputlangs='',$encodeto { global $conf,$langs; + if (! is_object($outputlangs)) $outputlangs=$langs; + // Si format non defini, on prend $conf->format_date_text_short sinon %Y-%m-%d %H:%M:%S if (! $format) $format=(isset($conf->format_date_text_short) ? $conf->format_date_text_short : '%Y-%m-%d %H:%M:%S'); - if ($format == 'day') $format=$conf->format_date_short; - if ($format == 'hour') $format=$conf->format_hour_short; - if ($format == 'daytext') $format=$conf->format_date_text; - if ($format == 'daytextshort') $format=$conf->format_date_text_short; - if ($format == 'dayhour') $format=$conf->format_date_hour_short; - if ($format == 'dayhourtext') $format=$conf->format_date_hour_text; - if ($format == 'dayhourtextshort') $format=$conf->format_date_hour_text_short; + // Change predefined format into computer format. If found translation in lang file we use it, otherwise we use default. + if ($format == 'day') $format=($outputlangs->trans("FormatDateShort")!="FormatDateShort"?$outputlangs->trans("FormatDateShort"):$conf->format_date_short); + if ($format == 'hour') $format=($outputlangs->trans("FormatHourShort")!="FormatHourShort"?$outputlangs->trans("FormatHourShort"):$conf->format_hour_short); + if ($format == 'hourduration') $format=($outputlangs->trans("FormatHourShortDuration")!="FormatHourShortDuration"?$outputlangs->trans("FormatHourShortDuration"):$conf->format_hour_short_duration); + if ($format == 'daytext') $format=($outputlangs->trans("FormatDateText")!="FormatDateText"?$outputlangs->trans("FormatDateText"):$conf->format_date_text); + if ($format == 'daytextshort') $format=($outputlangs->trans("FormatDateTextShort")!="FormatDateTextShort"?$outputlangs->trans("FormatDateTextShort"):$conf->format_date_text_short); + if ($format == 'dayhour') $format=($outputlangs->trans("FormatDateHourShort")!="FormatDateHourShort"?$outputlangs->trans("FormatDateHourShort"):$conf->format_date_hour_short); + if ($format == 'dayhourtext') $format=($outputlangs->trans("FormatDateHourText")!="FormatDateHourText"?$outputlangs->trans("FormatDateHourText"):$conf->format_date_hour_text); + if ($format == 'dayhourtextshort') $format=($outputlangs->trans("FormatDateHourTextShort")!="FormatDateHourTextShort"?$outputlangs->trans("FormatDateHourTextShort"):$conf->format_date_hour_text_short); + // Format not sensitive to language if ($format == 'dayhourlog') $format='%Y%m%d%H%M%S'; if ($format == 'dayhourldap') $format='%Y%m%d%H%M%SZ'; if ($format == 'dayhourxcard') $format='%Y%m%dT%H%M%SZ'; @@ -485,8 +509,6 @@ function dol_print_date($time,$format='',$to_gmt=false,$outputlangs='',$encodeto else $ret='Bad value '.$time.' for date'; } - if (! is_object($outputlangs)) $outputlangs=$langs; - if (preg_match('/__b__/i',$format)) { // Here ret is string in PHP setup language (strftime was used). Now we convert to $outputlangs. @@ -535,7 +557,7 @@ function dol_stringtotime($string) if (preg_match('/^([0-9]+)\/([0-9]+)\/([0-9]+)\s?([0-9]+)?:?([0-9]+)?:?([0-9]+)?/i',$string,$reg)) { // This part of code should not be used. - dol_syslog("Functions.lib::dol_stringtotime call to function with deprecated parameter", LOG_WARN); + dol_syslog("Functions.lib::dol_stringtotime call to function with deprecated parameter", LOG_WARNING); // Date est au format 'DD/MM/YY' ou 'DD/MM/YY HH:MM:SS' // Date est au format 'DD/MM/YYYY' ou 'DD/MM/YYYY HH:MM:SS' $sday = $reg[1]; @@ -939,17 +961,17 @@ function isValidEmail($address) /** - * Make a strlen call. Works even in mbstring module not enabled + * Make a strlen call. Works even if mbstring module not enabled. * - * @param unknown_type $string - * @param unknown_type $stringencoding - * @return unknown + * @param $string + * @param $stringencoding + * @return int */ function dol_strlen($string,$stringencoding='') { global $langs; - if (empty($stringencoding)) $stringencoding=$langs->charset_output; + if (empty($stringencoding)) $stringencoding=(empty($langs->charset_output)?'UTF-8':$langs->charset_output); $ret=''; if (function_exists('mb_strlen')) @@ -966,11 +988,11 @@ function dol_strlen($string,$stringencoding='') /** * Make a substring. Works even in mbstring module not enabled * - * @param unknown_type $string - * @param unknown_type $start - * @param unknown_type $length - * @param unknown_type $stringencoding - * @return unknown + * @param $string + * @param $start + * @param $length + * @param $stringencoding + * @return string */ function dol_substr($string,$start,$length,$stringencoding='') { @@ -1530,7 +1552,7 @@ function info_admin($texte,$infoonimgalt=0) * If $_REQUEST['action'] defined, we also check write permission. * \param user User to check * \param features Features to check (in most cases, it's module name) - * \param objectid Object ID if we want to check permission on on object (optionnal) + * \param objectid Object ID if we want to check permission on a particular record (optionnal) * \param dbtablename Table name where object is stored. Not used if objectid is null (optionnal) * \param feature2 Feature to check (second level of permission) * \param dbt_keyfield Field name for socid foreign key if not fk_soc. (optionnal) @@ -1801,7 +1823,7 @@ function accessforbidden($message='',$printheader=1,$printfooter=1,$showonlymess global $conf, $db, $user, $langs; if (! is_object($langs)) { - include_once(DOL_DOCUMENT_ROOT.'/core/translate.class.php'); + include_once(DOL_DOCUMENT_ROOT.'/core/class/translate.class.php'); $langs=new Translate('',$conf); } @@ -1857,11 +1879,12 @@ function dol_print_error($db='',$error='') // Si erreur intervenue avant chargement langue if (! $langs) { - require_once(DOL_DOCUMENT_ROOT ."/core/translate.class.php"); + require_once(DOL_DOCUMENT_ROOT ."/core/class/translate.class.php"); $langs = new Translate("", $conf); $langs->load("main"); } - $langs->load("errors"); + $langs->load("main"); + $langs->load("errors"); if ($_SERVER['DOCUMENT_ROOT']) // Mode web { @@ -1870,13 +1893,19 @@ function dol_print_error($db='',$error='') $out.="You use an experimental level of features, so please do NOT report any bugs, anywhere, until going back to MAIN_FEATURES_LEVEL = 0.
\n"; $out.=$langs->trans("InformationToHelpDiagnose").":
\n"; + $out.="".$langs->trans("Date").": ".dol_print_date(time(),'dayhourlog')."
\n";; $out.="".$langs->trans("Dolibarr").": ".DOL_VERSION."
\n";; - $out.="".$langs->trans("Date").": ".dol_print_date(time(),'dayhourlog')."
\n";; if (isset($conf->global->MAIN_FEATURES_LEVEL)) $out.="".$langs->trans("LevelOfFeature").": ".$conf->global->MAIN_FEATURES_LEVEL."
\n";; + if (function_exists("phpversion")) + { + $out.="".$langs->trans("PHP").": ".phpversion()."
\n"; + //phpinfo(); // This is to show location of php.ini file + } $out.="".$langs->trans("Server").": ".$_SERVER["SERVER_SOFTWARE"]."
\n";; - $out.="".$langs->trans("Referer").": ".$_SERVER["HTTP_REFERER"]."
\n";; + $out.="
\n"; $out.="".$langs->trans("RequestedUrl").": ".$_SERVER["REQUEST_URI"]."
\n";; - $out.="".$langs->trans("MenuManager").": ".$conf->left_menu.'/'.$conf->top_menu."
\n"; + $out.="".$langs->trans("Referer").": ".$_SERVER["HTTP_REFERER"]."
\n";; + $out.="".$langs->trans("MenuManager").": ".$conf->top_menu.($conf->top_menu||$conf->left_menu?'/':'').$conf->left_menu."
\n"; $out.="
\n"; $syslog.="url=".$_SERVER["REQUEST_URI"]; $syslog.=", query_string=".$_SERVER["QUERY_STRING"]; @@ -1958,95 +1987,6 @@ function dol_print_error_email() } - -/** - * \brief Move an uploaded file after some controls. - * If there is errors (virus found, antivir in error, bad filename), file is not moved. - * \param src_file Source filename - * \param dest_file Target filename - * \param allowoverwrite Overwrite if exists - * \param disablevirusscan Disable virus scan - * \return int >0 if OK, <0 if KO (an array with virus or errors if virus found or errors) - */ -function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disablevirusscan=0) -{ - global $conf; - - $file_name = $dest_file; - - // If we need to make a virus scan - if (empty($disablevirusscan) && file_exists($src_file) && $conf->global->MAIN_ANTIVIRUS_COMMAND) - { - require_once(DOL_DOCUMENT_ROOT.'/lib/security.lib.php'); - require_once(DOL_DOCUMENT_ROOT.'/lib/antivir.class.php'); - $antivir=new AntiVir($db); - $result = $antivir->dol_avscan_file($src_file); - if ($result < 0) // If virus or error, we stop here - { - $reterrors=$antivir->errors; - dol_syslog("Functions.lib::dol_move_uploaded_file File ".$file_name." KO with antivir", LOG_WARNING); - //return $reterrors; - return -99; - } - } - - // Security: - // Disallow file with some extensions. We renamed them. - // Car si on a mis le rep documents dans un rep de la racine web (pas bien), cela permet d'executer du code a la demande. - if (preg_match('/\.htm|\.html|\.php|\.pl|\.cgi$/i',$file_name)) - { - $file_name.= '.noexe'; - } - - // Security: - // On interdit fichiers caches, remontees de repertoire ainsi que les pipes dans les noms de fichiers. - if (preg_match('/^\./',$src_file) || preg_match('/\.\./',$src_file) || preg_match('/[<>|]/',$src_file)) - { - dol_syslog("Refused to deliver file ".$src_file, LOG_WARNING); - return -1; - } - - // Security: - // On interdit fichiers caches, remontees de repertoire ainsi que les pipe dans - // les noms de fichiers. - if (preg_match('/^\./',$dest_file) || preg_match('/\.\./',$dest_file) || preg_match('/[<>|]/',$dest_file)) - { - dol_syslog("Refused to deliver file ".$dest_file, LOG_WARNING); - return -2; - } - - // The file functions must be in OS filesystem encoding. - $src_file_osencoded=dol_osencode($src_file); - $file_name_osencoded=dol_osencode($file_name); - - // Check if destination file already exists - if (! $allowoverwrite) - { - if (file_exists($file_name_osencoded)) - { - dol_syslog("Functions.lib::dol_move_uploaded_file File ".$file_name." already exists", LOG_WARNING); - return -3; - } - } - - // Move file - $return=move_uploaded_file($src_file_osencoded, $file_name_osencoded); - if ($return) - { - if (! empty($conf->global->MAIN_UMASK)) @chmod($file_name_osencoded, octdec($conf->global->MAIN_UMASK)); - dol_syslog("Functions.lib::dol_move_uploaded_file Success to move ".$src_file." to ".$file_name." - Umask=".$conf->global->MAIN_UMASK, LOG_DEBUG); - return 1; - } - else - { - dol_syslog("Functions.lib::dol_move_uploaded_file Failed to move ".$src_file." to ".$file_name, LOG_ERR); - return -4; - } - - return 1; -} - - /** * \brief Show title line of an array * \param name libelle champ @@ -2126,23 +2066,40 @@ function print_titre($titre) * \param id To force an id on html objects */ function print_fiche_titre($titre, $mesg='', $picto='title.png', $pictoisfullpath=0, $id='') +{ + print load_fiche_titre($titre, $mesg, $picto, $pictoisfullpath, $id); +} + +/** + * \brief Load a title with picto + * \param titre Title to show + * \param mesg Added message to show on right + * \param picto Icon to use before title (should be a 32x32 transparent png file) + * \param pictoisfullpath 1=Icon name is a full absolute url of image + * \param id To force an id on html objects + */ +function load_fiche_titre($titre, $mesg='', $picto='title.png', $pictoisfullpath=0, $id='') { global $conf; + $return=''; + if ($picto == 'setup') $picto='title.png'; if (empty($conf->browser->firefox) && $picto=='title.png') $picto='title.gif'; - print "\n"; - print ''; - if (empty($conf->browser->phone) && $picto && $titre) print ''; - print ''; + $return.= "\n"; + $return.= '
'.img_picto('',$picto, 'id="pictotitle"', $pictoisfullpath).''; - print '
'.$titre.'
'; - print '
'; + if (empty($conf->browser->phone) && $picto && $titre) $return.= ''; + $return.= ''; if (strlen($mesg)) { - print ''; + $return.= ''; } - print '
'.img_picto('',$picto, 'id="pictotitle"', $pictoisfullpath).''; + $return.= '
'.$titre.'
'; + $return.= '
'.$mesg.''.$mesg.'
'."\n"; + $return.= ''."\n"; + + return $return; } /** @@ -2545,14 +2502,21 @@ function price2num($amount,$rounding='',$alreadysqlnb=0) * \brief Return localtaxe rate for a particular tva * \param tva Vat taxe * \param local Local taxe to search and return - * \return int <0 if KO, localtax if found + * \return int 0 if not found, localtax if found */ -function get_localtax($tva, $local) +function get_localtax($tva, $local, $societe_acheteuse="") { global $db, $conf, $mysoc; $code_pays=$mysoc->pays_code; + if (is_object($societe_acheteuse)) + { + if ($code_pays!=$societe_acheteuse->pays_code) return 0; + if ($local==1 && !$societe_acheteuse->localtax1_assuj) return 0; + elseif ($local==2 && !$societe_acheteuse->localtax2_assuj) return 0; + } + // Search local taxes $sql = "SELECT t.localtax1, t.localtax2"; $sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_pays as p"; @@ -2568,11 +2532,11 @@ function get_localtax($tva, $local) elseif ($local==2) return $obj->localtax2; } - return -1; + return 0; } /** - * \brief Return vat rate of a product in a particular selling country + * Return vat rate of a product in a particular selling country. * TODO May be this should be better as a method of product class */ function get_product_vat_for_country($idprod, $countrycode) @@ -2589,7 +2553,7 @@ function get_product_vat_for_country($idprod, $countrycode) } /** - * \brief Return localtax rate of a product in a particular selling country + * Return localtax rate of a product in a particular selling country * TODO May be this should be better as a method of product class */ function get_product_localtax_for_country($idprod, $local, $countrycode) @@ -2615,16 +2579,15 @@ function get_product_localtax_for_country($idprod, $local, $countrycode) * Sinon TVA proposee par defaut=0. Fin de regle. * \param societe_vendeuse Objet societe vendeuse * \param societe_acheteuse Objet societe acheteuse - * \param taux_produit Taux par defaut du produit vendu (old way to get product vat rate) - * \param idprod Id product (new way to get product vat rate) + * \param idprod Id product * \return float Taux de tva a appliquer, -1 si ne peut etre determine */ -function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit, $idprod=0) +function get_default_tva($societe_vendeuse, $societe_acheteuse, $idprod=0) { if (!is_object($societe_vendeuse)) return -1; if (!is_object($societe_acheteuse)) return -1; - dol_syslog("get_default_tva vendeur_assujeti=".$societe_vendeuse->tva_assuj." pays_vendeur=".$societe_vendeuse->pays_code.", seller in cee=".$societe_vendeuse->isInEEC().", pays_acheteur=".$societe_acheteuse->pays_code.", buyer in cee=".$societe_acheteuse->isInEEC().", taux_produit(deprecated)=".$taux_produit.", idprod=".$idprod); + dol_syslog("get_default_tva seller use vat=".$societe_vendeuse->tva_assuj." seller country=".$societe_vendeuse->pays_code.", seller in cee=".$societe_vendeuse->isInEEC().", buyer country=".$societe_acheteuse->pays_code.", buyer in cee=".$societe_acheteuse->isInEEC().", idprod=".$idprod); // Si vendeur non assujeti a TVA (tva_assuj vaut 0/1 ou franchise/reel) if (is_numeric($societe_vendeuse->tva_assuj) && ! $societe_vendeuse->tva_assuj) return 0; @@ -2632,29 +2595,35 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit, $ // Si le (pays vendeur = pays acheteur) alors la TVA par defaut=TVA du produit vendu. Fin de regle. //if (is_object($societe_acheteuse) && ($societe_vendeuse->pays_id == $societe_acheteuse->pays_id) && ($societe_acheteuse->tva_assuj == 1 || $societe_acheteuse->tva_assuj == 'reel')) - // Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concercne si le test suivant n'est pas suffisant. - if ($societe_vendeuse->pays_id == $societe_acheteuse->pays_id) + // Le test ci-dessus ne devrait pas etre necessaire. Me signaler l'exemple du cas juridique concerne si le test suivant n'est pas suffisant. + if ($societe_vendeuse->pays_code == $societe_acheteuse->pays_code) // Warning ->pays_id not always defined { if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code); - if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut determiner taux tva - return $taux_produit; + return -1; // Si produit absent, on ne peut determiner taux tva } // Si (vendeur et acheteur dans Communaute europeenne) et (bien vendu = moyen de transports neuf comme auto, bateau, avion) alors TVA par defaut=0 (La TVA doit etre paye par l'acheteur au centre d'impots de son pays et non au vendeur). Fin de regle. // Non gere - // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier ou entreprise sans num TVA intra) alors TVA par defaut=TVA du produit vendu. Fin de regle - if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()) && ! $societe_acheteuse->tva_intra) + // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise) alors TVA par defaut=0. Fin de regle + // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = particulier) alors TVA par defaut=TVA du produit vendu. Fin de regle + if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC())) { - if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code); - if (strlen($taux_produit) == 0) return -1; // Si taux produit = '', on ne peut determiner taux tva - return $taux_produit; - } + // Define if third party is treated as company of not when nature is unknown + $isacompany=empty($conf->global->MAIN_UNKNOWN_CUSTOMERS_ARE_COMPANIES)?0:1; // 0 by default + if (! empty($societe_acheteuse->tva_intra)) $isacompany=1; + else if (! empty($societe_acheteuse->typent_code) && in_array($societe_acheteuse->typent_code,array('TE_PRIVATE'))) $isacompany=0; + else if (! empty($societe_acheteuse->typent_code) && in_array($societe_acheteuse->typent_code,array('TE_SMALL','TE_MEDIUM','TE_LARGE'))) $isacompany=1; - // Si (vendeur et acheteur dans Communaute europeenne) et (acheteur = entreprise avec num TVA intra) alors TVA par defaut=0. Fin de regle - if (($societe_vendeuse->isInEEC() && $societe_acheteuse->isInEEC()) && $societe_acheteuse->tva_intra) - { - return 0; + if ($isacompany) + { + return 0; + } + else + { + if ($idprod) return get_product_vat_for_country($idprod,$societe_vendeuse->pays_code); + return -1; // Si produit absent, on ne peut determiner taux tva + } } // Sinon la TVA proposee par defaut=0. Fin de regle. @@ -2673,10 +2642,10 @@ function get_default_tva($societe_vendeuse, $societe_acheteuse, $taux_produit, $ * Sinon TVA proposee par defaut=0. Fin de regle. * \param societe_vendeuse Objet societe vendeuse * \param societe_acheteuse Objet societe acheteuse - * \param taux_produit Taux par defaut du produit vendu + * \param idprod Id product * \return float 0 or 1 */ -function get_default_npr($societe_vendeuse, $societe_acheteuse, $taux_produit) +function get_default_npr($societe_vendeuse, $societe_acheteuse, $idprod) { return 0; } @@ -2685,8 +2654,8 @@ function get_default_npr($societe_vendeuse, $societe_acheteuse, $taux_produit) * \brief Function that return localtax of a product line (according to seller, buyer and product vat rate) * \param societe_vendeuse Objet societe vendeuse * \param societe_acheteuse Objet societe acheteuse - * \param local Localtax a traiter - * \param idprod Id product (way to get product localtax1 rate) + * \param local Localtax to process (1 or 2) + * \param idprod Id product * \return float Taux de localtax appliquer, -1 si ne peut etre determine */ function get_default_localtax($societe_vendeuse, $societe_acheteuse, $local, $idprod=0) @@ -3408,5 +3377,116 @@ function dol_eval($s) return 1; } +/** + * \brief For replace glob() function + */ +if (! function_exists('glob')) +{ + function glob($pattern) + { + #get pathname (everything up until the last / or \) + $path=$output=null; + if(PHP_OS=='WIN32') $slash='\\'; + else $slash='/'; + $lastpos=strrpos($pattern,$slash); + + if(!($lastpos===false)) + { + $path=substr($pattern,0,-$lastpos-1); + $pattern=substr($pattern,$lastpos); + } + else + { + #no dir info, use current dir + $path=getcwd(); + } + + $handle=@opendir($path); + if($handle===false) return false; + + while($dir=readdir($handle)) + { + if(pattern_match($pattern,$dir)) $output[]=$dir; + } + + closedir($handle); + + if(is_array($output)) return $output; + return false; + } +} + +/** + * \brief For dol_glob() function + */ +function pattern_match($pattern,$string) +{ + #basically prepare a regular expression + $out=null; + $chunks=explode(';',$pattern); + foreach($chunks as $pattern) + { + $escape=array('$','^','.','{','}','(',')','[',']','|'); + while(strpos($pattern,'**')!==false) $pattern=str_replace('**','*',$pattern); + + foreach($escape as $probe) $pattern=str_replace($probe,"\\$probe",$pattern); + + $pattern=str_replace('?*','*',str_replace('*?','*',str_replace('*',".*",str_replace('?','.{1,1}',$pattern)))); + $out[]=$pattern; + } + + if(count($out)==1) + { + return(preg_match('/^'.$out[0].'$/i',$string)); + } + else + { + foreach($out as $tester) + { + if(preg_match('/^'.$tester.'$/i',$string)) return true; + return false; + } + } +} + +/** + * \brief Return img flag of country for a language code or country code + * \param codelang Language code (en_IN, fr_CA...) or Country code (IN, FR) + * \return string HTML img string with flag. + */ +function picto_from_langcode($codelang) +{ + $ret=''; + if (! empty($codelang)) + { + if ($codelang == 'auto') $ret=img_picto('',DOL_URL_ROOT.'/theme/common/flags/int.png','',1); + else { + //print $codelang; + $langtocountryflag=array('da_DA'=>'dk','fr_CA'=>'mq','ca_ES'=>'catalonia','ar_AR'=>''); + $tmpcode=''; + if (isset($langtocountryflag[$codelang])) $tmpcode=$langtocountryflag[$codelang]; + else + { + $tmparray=explode('_',$codelang); + $tmpcode=empty($tmparray[1])?$tmparray[0]:$tmparray[1]; + } + if ($tmpcode) $ret.=img_picto($codelang,DOL_URL_ROOT.'/theme/common/flags/'.strtolower($tmpcode).'.png','',1); + } + } + return $ret; +} + +/** + * \brief Define the style of background color of line + */ +function bcStyle($impair='impair', $pair='pair') +{ + $bc=array(); + + $bc[0]='class="'.$impair.'"'; + $bc[1]='class="'.$pair.'"'; + + return $bc; +} ?> \ No newline at end of file