diff --git a/includes/qms_html.php b/includes/qms_html.php index 69a5bfc..016ff5d 100644 --- a/includes/qms_html.php +++ b/includes/qms_html.php @@ -121,7 +121,7 @@ function get_tooltip($gtarget, $gtype, $from_popup = 0, $id = 0, $member = 0) if ($type == "Joueur" || $type == "Alliance") { $individual_ranking = ($type == 'Joueur') ? galaxy_show_ranking_unique_player($target) : galaxy_show_ranking_unique_ally($target); while ($ranking = current($individual_ranking)) { - $datadate = strftime($lang['qms_classement_date'], key($individual_ranking)); + $datadate = date($lang['qms_classement_date'], key($individual_ranking)) . "h"; $general_rank = isset($ranking["general"]) ? formate_number($ranking["general"]["rank"]) : " "; $general_points = isset($ranking["general"]) ? formate_number($ranking["general"]["points"]) : " "; $eco_rank = isset($ranking["eco"]) ? formate_number($ranking["eco"]["rank"]) : " "; diff --git a/includes/qms_main.php b/includes/qms_main.php index 16b1e3d..0ce289c 100644 --- a/includes/qms_main.php +++ b/includes/qms_main.php @@ -1,4 +1,5 @@ sql_query($query_limit); - $nb = $db->sql_numrows($result); - list($valeur)=$db->sql_fetch_row($result); - if(!$valeur && $userid!=0 && $strict==0){ - $query_limit = "SELECT `valeur` FROM `".TABLE_QMS_config."` WHERE `config` = '".$key."' AND `user_id`= 0"; - $result=$db->sql_query($query_limit); - $nb = $db->sql_numrows($result); - list($valeur)=$db->sql_fetch_row($result); - $count=$db->sql_numrows($result); - } - return (!$valeur?false:$valeur); +function get_qms_config($key, $userid = 0, $strict = 0) +{ // Renvoi la valeur de la configuration "$key" + global $db, $result; + $where = 'AND `user_id`= ' . $userid; + $query_limit = "SELECT `valeur` FROM `" . TABLE_QMS_config . "` WHERE `config` = '" . $key . "' " . $where; + $result = $db->sql_query($query_limit); + $nb = $db->sql_numrows($result); + list($valeur) = $db->sql_fetch_row($result); + if (!$valeur && $userid != 0 && $strict == 0) { + $query_limit = "SELECT `valeur` FROM `" . TABLE_QMS_config . "` WHERE `config` = '" . $key . "' AND `user_id`= 0"; + $result = $db->sql_query($query_limit); + $nb = $db->sql_numrows($result); + list($valeur) = $db->sql_fetch_row($result); + $count = $db->sql_numrows($result); + } + return (!$valeur ? false : $valeur); } -function set_qms_config($value,$key,$userid=0){ // Modifie la valeur de la configuration "$key" - global $db; - $test=get_qms_config($key,$userid,1); - qms_debug("set_qms_config : La valeur ".$test); - if($test!=false) - $query = "UPDATE `".TABLE_QMS_config."` SET `valeur` = '".stripslashes($value)."' WHERE `config`= '".$key."' AND `user_id`= ".$userid; - else - $query = "INSERT INTO ".TABLE_QMS_config." ( `user_id`,`config` , `valeur`) VALUES ( '".$userid."' , '".$key."' , '".$value."' )"; - $result=$db->sql_query($query); - return $result; +function set_qms_config($value, $key, $userid = 0) +{ // Modifie la valeur de la configuration "$key" + global $db; + $test = get_qms_config($key, $userid, 1); + qms_debug("set_qms_config : La valeur " . $test); + if ($test != false) + $query = "UPDATE `" . TABLE_QMS_config . "` SET `valeur` = '" . stripslashes($value) . "' WHERE `config`= '" . $key . "' AND `user_id`= " . $userid; + else + $query = "INSERT INTO " . TABLE_QMS_config . " ( `user_id`,`config` , `valeur`) VALUES ( '" . $userid . "' , '" . $key . "' , '" . $value . "' )"; + $result = $db->sql_query($query); + return $result; } -function get_coord($position){ // Renvoi le rang de la planète par rapport à une position formatée GG:SS:RR - $dPoint = strpos($position,":"); - $galaxy = substr ($position,0,$dPoint); - $tmp = substr ($position,$dPoint+1); - $dPoint2 = strpos($tmp,":"); - $system = substr($tmp,0,$dPoint2); - $row = substr ($tmp,$dPoint2+1); - return array($galaxy,$system,$row); +function get_coord($position) +{ // Renvoi le rang de la planète par rapport à une position formatée GG:SS:RR + $dPoint = strpos($position, ":"); + $galaxy = substr($position, 0, $dPoint); + $tmp = substr($position, $dPoint + 1); + $dPoint2 = strpos($tmp, ":"); + $system = substr($tmp, 0, $dPoint2); + $row = substr($tmp, $dPoint2 + 1); + return array($galaxy, $system, $row); } -function get_distance($depart,$arrive){ // Renvoi la distance entre 2 planètes - $c_dep=get_coord($depart); - $c_arr=get_coord($arrive); - if($c_dep[0]==$c_arr[0]) // De la meme galaxie - if($c_dep[1]==$c_arr[1]) // Du meme système - $dist=1000+abs($c_dep[2]-$c_arr[2])*5; // Distance entre 2 planètes d'un meme systèmes. - else // Pas du même système - $dist=2700+abs($c_dep[1]-$c_arr[1])*95; // Distance entre 2 systèmes. - else // Pas la même galaxie. - $dist=abs($c_dep[0]-$c_arr[0])*20000; // Distance entre 2 Galaxie. - return $dist; +function get_distance($depart, $arrive) +{ // Renvoi la distance entre 2 planètes + $c_dep = get_coord($depart); + $c_arr = get_coord($arrive); + if ($c_dep[0] == $c_arr[0]) // De la meme galaxie + if ($c_dep[1] == $c_arr[1]) // Du meme système + $dist = 1000 + abs($c_dep[2] - $c_arr[2]) * 5; // Distance entre 2 planètes d'un meme systèmes. + else // Pas du même système + $dist = 2700 + abs($c_dep[1] - $c_arr[1]) * 95; // Distance entre 2 systèmes. + else // Pas la même galaxie. + $dist = abs($c_dep[0] - $c_arr[0]) * 20000; // Distance entre 2 Galaxie. + return $dist; } -function prepare_espionnage($pub_espionage){ // Préparer un espionnage à l'importation (MERCI SANTORY!!!!) - global $lang, $bd; - $pub_espionage = $db->sql_escape_string($pub_espionage); - $pub_espionage = trim($pub_espionage); - //Compatibilité UNIX/Windows - $pub_espionage = str_replace("\r\n","\n",$pub_espionage); - //Compatibilité IE/Firefox - $pub_espionage = str_replace("\t",' ',$pub_espionage); - $retour = 0; - //on recupere un tableau avec tous les raports. - preg_match_all($lang['regex_import_spy'], $pub_espionage,$matches); - foreach ($matches[1] as $key => $val) - $retour = add_espionnage($matches[0][$key]); - return (($retour==0)?$lang['qms_insertion_error']:(($retour==2)?$lang['qms_insertion_doublon']:$lang['qms_insertion_ok'])); +function prepare_espionnage($pub_espionage) +{ // Préparer un espionnage à l'importation (MERCI SANTORY!!!!) + global $lang, $bd; + $pub_espionage = $db->sql_escape_string($pub_espionage); + $pub_espionage = trim($pub_espionage); + //Compatibilité UNIX/Windows + $pub_espionage = str_replace("\r\n", "\n", $pub_espionage); + //Compatibilité IE/Firefox + $pub_espionage = str_replace("\t", ' ', $pub_espionage); + $retour = 0; + //on recupere un tableau avec tous les raports. + preg_match_all($lang['regex_import_spy'], $pub_espionage, $matches); + foreach ($matches[1] as $key => $val) + $retour = add_espionnage($matches[0][$key]); + return (($retour == 0) ? $lang['qms_insertion_error'] : (($retour == 2) ? $lang['qms_insertion_doublon'] : $lang['qms_insertion_ok'])); } -function quimsonde_log($message){ - $fichier = "log_".date("ymd").'.log'; - $line = "/*".date("d/m/Y H:i:s")."*/ [QuiMSonde] - ".$message; - write_file(PATH_LOG_TODAY.$fichier, "a", $line); +function quimsonde_log($message) +{ + $fichier = "log_" . date("ymd") . '.log'; + $line = "/*" . date("d/m/Y H:i:s") . "*/ [QuiMSonde] - " . $message; + write_file(PATH_LOG_TODAY . $fichier, "a", $line); } -function qms_debug($string= "") { - if (!defined('QMS_DEBUG')) return 0; - global $qms_debug_out; - if ($string!=""){ - $test = $string; - if (is_array($test)){ - $string = ""; - foreach ($test as $key => $value) { - $string .= "[$key] => "; - if (is_array($value)){ - $string .= " { "; - foreach ($value as $key2 => $value2) { - $string .= "[$key2] => "; - if (is_array($value2)){ - $string .= " { "; - foreach ($value2 as $key3 => $value3) { - $string .= "[$key3] => $value3 "; - } - $string .= " } "; - }else { - $string .= "$value2 "; +function qms_debug($string = "") +{ + if (!defined('QMS_DEBUG')) return 0; + global $qms_debug_out; + if ($string != "") { + $test = $string; + if (is_array($test)) { + $string = ""; + foreach ($test as $key => $value) { + $string .= "[$key] => "; + if (is_array($value)) { + $string .= " { "; + foreach ($value as $key2 => $value2) { + $string .= "[$key2] => "; + if (is_array($value2)) { + $string .= " { "; + foreach ($value2 as $key3 => $value3) { + $string .= "[$key3] => $value3 "; + } + $string .= " } "; + } else { + $string .= "$value2 "; } - } - $string .= " }
"; - }else { - $string .= " $value
"; + } + $string .= " }
"; + } else { + $string .= " $value
"; } - } - } - return $qms_debug_out .= "\n
".$string; - }else { - print($qms_debug_out); + } + } + return $qms_debug_out .= "\n
" . $string; + } else { + print($qms_debug_out); } } -function get_search_list(){ - $search_idlist = get_qms_config("searchID"); - if($search_idlist!=""){ - $search_idlist = explode('|',$search_idlist); - foreach($search_idlist as $id){ - $search = (get_qms_config("search", $id)); - list($name,$link,$type,$actif) = explode("<|>",$search); - $return[] = array('id'=>$id,'name'=>addslashes($name),'link'=>addslashes($link),'type'=>$type,'actif'=>$actif); - } - } else return false; - return $return; +function get_search_list() +{ + $search_idlist = get_qms_config("searchID"); + if ($search_idlist != "") { + $search_idlist = explode('|', $search_idlist); + foreach ($search_idlist as $id) { + $search = (get_qms_config("search", $id)); + list($name, $link, $type, $actif) = explode("<|>", $search); + $return[] = array('id' => $id, 'name' => addslashes($name), 'link' => addslashes($link), 'type' => $type, 'actif' => $actif); + } + } else return false; + return $return; } -function set_new_search($name,$link,$type){ - $newid = 0; $found=false; - $searchID = get_qms_config("searchID"); - $searchID_list = explode('|',$searchID); - do{ - $newid++; - }while(in_array($newid,$searchID_list)); - set_qms_config($name."<|>".$link."<|>".$type."<|>1","search",$newid); - $searchID = ($searchID!="")?$searchID."|".$newid:$newid; - set_qms_config($searchID,"searchID",0); - return true; +function set_new_search($name, $link, $type) +{ + $newid = 0; + $found = false; + $searchID = get_qms_config("searchID"); + $searchID_list = explode('|', $searchID); + do { + $newid++; + } while (in_array($newid, $searchID_list)); + set_qms_config($name . "<|>" . $link . "<|>" . $type . "<|>1", "search", $newid); + $searchID = ($searchID != "") ? $searchID . "|" . $newid : $newid; + set_qms_config($searchID, "searchID", 0); + return true; } -function update_search(){ - if(($searchs=get_search_list())==true){ - foreach($searchs as $s){ - global ${'pub_search_name'.$s['id']}; - global ${'pub_search_link'.$s['id']}; - global ${'pub_search_type'.$s['id']}; - global ${'pub_search_actif'.$s['id']}; - set_qms_config( - addslashes(${'pub_search_name'.$s['id']})."<|>". - ${'pub_search_link'.$s['id']}."<|>". - ${'pub_search_type'.$s['id']}."<|>". - (isset(${'pub_search_actif'.$s['id']})?'1':'0'),"search",$s['id']); - } - } else return false; - return true; +function update_search() +{ + if (($searchs = get_search_list()) == true) { + foreach ($searchs as $s) { + global ${'pub_search_name' . $s['id']}; + global ${'pub_search_link' . $s['id']}; + global ${'pub_search_type' . $s['id']}; + global ${'pub_search_actif' . $s['id']}; + set_qms_config( + addslashes(${'pub_search_name' . $s['id']}) . "<|>" . + ${'pub_search_link' . $s['id']} . "<|>" . + ${'pub_search_type' . $s['id']} . "<|>" . + (isset(${'pub_search_actif' . $s['id']}) ? '1' : '0'), + "search", + $s['id'] + ); + } + } else return false; + return true; } -function check_for_newnames(){ // Recherche les noms des espions inconnus - global $db,$lang; - $query = "SELECT `id`,`position` FROM ".TABLE_QMS." WHERE `joueur`='?'"; - $result=$db->sql_query($query); - if($result=$db->sql_numrows($result)==0) - $retour = "".$lang['qms_func_sql_no_unknown'].""; - else{ - $i = 0; - while(list($id, $position)=$db->sql_fetch_row($result)){ - $temp['id'][$i]=$id; - $temp['position'][$i]=$position; - $i++; - } - $nb_rec=$i; - for($i=0;$i<$nb_rec;$i++){ - $tmp=get_user_id($temp['position'][$i]); - if ($tmp[0]=="") $tmp[0]="?"; - $temp['joueur'][$i]=$tmp[0]; - $temp['alliance'][$i]=$tmp[1]; - } - $count=0; - for($i=0;$i<$nb_rec;$i++){ - if($temp['joueur']!="?"){ - $query = "UPDATE `".TABLE_QMS."` SET `joueur` = '".$temp['joueur'][$i]."', `alliance`='".$temp['alliance'][$i]."' WHERE `id`= '".$temp["id"][$i]."'"; - $db->sql_query($query) or die(sql_error()); - $count++; - } - } - if($count==1) - $retour = "".$lang['qms_func_sql_only_one_updated'].""; - elseif($count>1) - $retour = "".sprintf($lang['qms_func_sql_many_updated'],$count).""; - else - $retour = "".$lang['qms_func_sql_none_updated'].""; - } - return $retour; +function check_for_newnames() +{ // Recherche les noms des espions inconnus + global $db, $lang; + $query = "SELECT `id`,`position` FROM " . TABLE_QMS . " WHERE `joueur`='?'"; + $result = $db->sql_query($query); + if ($result = $db->sql_numrows($result) == 0) + $retour = "" . $lang['qms_func_sql_no_unknown'] . ""; + else { + $i = 0; + while (list($id, $position) = $db->sql_fetch_row($result)) { + $temp['id'][$i] = $id; + $temp['position'][$i] = $position; + $i++; + } + $nb_rec = $i; + for ($i = 0; $i < $nb_rec; $i++) { + $tmp = get_user_id($temp['position'][$i]); + if ($tmp[0] == "") $tmp[0] = "?"; + $temp['joueur'][$i] = $tmp[0]; + $temp['alliance'][$i] = $tmp[1]; + } + $count = 0; + for ($i = 0; $i < $nb_rec; $i++) { + if ($temp['joueur'] != "?") { + $query = "UPDATE `" . TABLE_QMS . "` SET `joueur` = '" . $temp['joueur'][$i] . "', `alliance`='" . $temp['alliance'][$i] . "' WHERE `id`= '" . $temp["id"][$i] . "'"; + $db->sql_query($query) or die(sql_error()); + $count++; + } + } + if ($count == 1) + $retour = "" . $lang['qms_func_sql_only_one_updated'] . ""; + elseif ($count > 1) + $retour = "" . sprintf($lang['qms_func_sql_many_updated'], $count) . ""; + else + $retour = "" . $lang['qms_func_sql_none_updated'] . ""; + } + return $retour; } -function import_from_qmo(){ // Importation des espionnages de la base de donnée QuiMObserve - global $db; global $table_prefix,$lang; - $nb_jours=get_qms_config('jours'); - $timestamp = time()-(24*60*60*$nb_jours); - $datadate = mktime (0,0,0,date("m",$timestamp),date("d",$timestamp),date("y",$timestamp)); - $query_limit = "SELECT `spy_planetteEspion`,`spy_maplanette`,`sender_id`,`datadate`,`pourcentage` FROM `".$table_prefix."MOD_quimobserve` WHERE `datadate`>=$datadate ORDER BY `datadate` DESC"; - $result=$db->sql_query($query_limit); - if($result=$db->sql_numrows($result)==0) - $retour = ''.$lang['qms_func_sql_import_from_quimobserve_none'].''; - else{ - $i = 0; - while(list($position, $cible, $sender_id, $datadate, $pourcentage)=$db->sql_fetch_row($result)){ - $tab['sender_id'][$i] = $sender_id; - $tab['position'][$i] = $position; - $tab['cible'][$i] = $cible; - $tab['datadate'][$i] = $datadate; - $tab['pourcentage'][$i] = $pourcentage; - $i++; - } - $nb_rec=$i; - for($i=0;$i<$nb_rec;$i++){ - $tmp=get_user_id($tab['position'][$i]); - $tab['joueur'][$i] = $tmp[0]; - $tab['alliance'][$i] = $tmp[1]; - if($tab['joueur'][$i]=="") $tab['joueur'][$i] = "?"; - } - for($i=0;$i<$nb_rec;$i++){ - $query = "SELECT `id` FROM ".TABLE_QMS." WHERE `sender_id`='".$tab['sender_id'][$i]."' AND `datadate`='".$tab['datadate'][$i]."' AND cible='".$tab['cible'][$i]."' "; - $result = $db->sql_query($query); - $nb = $db->sql_numrows($result); - if($nb!=0) $tab['datadate'][$i]=0; - } - $dejafait=0; - for($i=0;$i<$nb_rec;$i++){ - if($tab['datadate'][$i]!=0){ - $table_spy['distance'][$i] = get_distance($table_spy['position'][$i],$table_spy['cible'][$i]); - $query = "INSERT INTO ".TABLE_QMS." ( `id` , `sender_id` , `position` , `joueur`,`alliance`,`distance`,`cible` , `datadate`, `pourcentage`) VALUES ( NULL, '".$tab['sender_id'][$i]."' , '".$tab['position'][$i]."', '".$tab['joueur'][$i]."', '".$tab['alliance'][$i]."', '".$tab['distance'][$i]."', '".$tab['cible'][$i]."', '".$tab['datadate'][$i]."', '".$tab['pourcentage'][$i]."' )"; - $db->sql_query($query); - } else - $dejafait++; - } - $nb_add=$nb_rec-$dejafait; - $retour = ''.sprintf($lang['qms_func_sql_import_from_quimobserve_ok'],$nb_add,$nb_rec,$nb_jours).''; - } - return $retour; +function import_from_qmo() +{ // Importation des espionnages de la base de donnée QuiMObserve + global $db; + global $table_prefix, $lang; + $nb_jours = get_qms_config('jours'); + $timestamp = time() - (24 * 60 * 60 * $nb_jours); + $datadate = mktime(0, 0, 0, date("m", $timestamp), date("d", $timestamp), date("y", $timestamp)); + $query_limit = "SELECT `spy_planetteEspion`,`spy_maplanette`,`sender_id`,`datadate`,`pourcentage` FROM `" . $table_prefix . "MOD_quimobserve` WHERE `datadate`>=$datadate ORDER BY `datadate` DESC"; + $result = $db->sql_query($query_limit); + if ($result = $db->sql_numrows($result) == 0) + $retour = '' . $lang['qms_func_sql_import_from_quimobserve_none'] . ''; + else { + $i = 0; + while (list($position, $cible, $sender_id, $datadate, $pourcentage) = $db->sql_fetch_row($result)) { + $tab['sender_id'][$i] = $sender_id; + $tab['position'][$i] = $position; + $tab['cible'][$i] = $cible; + $tab['datadate'][$i] = $datadate; + $tab['pourcentage'][$i] = $pourcentage; + $i++; + } + $nb_rec = $i; + for ($i = 0; $i < $nb_rec; $i++) { + $tmp = get_user_id($tab['position'][$i]); + $tab['joueur'][$i] = $tmp[0]; + $tab['alliance'][$i] = $tmp[1]; + if ($tab['joueur'][$i] == "") $tab['joueur'][$i] = "?"; + } + for ($i = 0; $i < $nb_rec; $i++) { + $query = "SELECT `id` FROM " . TABLE_QMS . " WHERE `sender_id`='" . $tab['sender_id'][$i] . "' AND `datadate`='" . $tab['datadate'][$i] . "' AND cible='" . $tab['cible'][$i] . "' "; + $result = $db->sql_query($query); + $nb = $db->sql_numrows($result); + if ($nb != 0) $tab['datadate'][$i] = 0; + } + $dejafait = 0; + for ($i = 0; $i < $nb_rec; $i++) { + if ($tab['datadate'][$i] != 0) { + $table_spy['distance'][$i] = get_distance($table_spy['position'][$i], $table_spy['cible'][$i]); + $query = "INSERT INTO " . TABLE_QMS . " ( `id` , `sender_id` , `position` , `joueur`,`alliance`,`distance`,`cible` , `datadate`, `pourcentage`) VALUES ( NULL, '" . $tab['sender_id'][$i] . "' , '" . $tab['position'][$i] . "', '" . $tab['joueur'][$i] . "', '" . $tab['alliance'][$i] . "', '" . $tab['distance'][$i] . "', '" . $tab['cible'][$i] . "', '" . $tab['datadate'][$i] . "', '" . $tab['pourcentage'][$i] . "' )"; + $db->sql_query($query); + } else + $dejafait++; + } + $nb_add = $nb_rec - $dejafait; + $retour = '' . sprintf($lang['qms_func_sql_import_from_quimobserve_ok'], $nb_add, $nb_rec, $nb_jours) . ''; + } + return $retour; } -function clear_old_rapport(){ // efface les rapports trop ancien (en fonction du nombre de jour choisi par l'admin) - global $db; - $nb_jours=get_qms_config('jours'); - if(!$nb_jours) $nb_jours = 365; - $timestamp = time()-(24*60*60*$nb_jours); - $datadate = mktime (0,0,0,date("m",$timestamp),date("d",$timestamp),date("y",$timestamp)); - $query = "SELECT `id` FROM ".TABLE_QMS." WHERE `datadate`<$datadate"; - $result=$db->sql_query($query); - if($result=$db->sql_numrows($result)==0){ - // Pas d'espionnages a effacer. - }else{ - $i=0; - while(list($id)=$db->sql_fetch_row($result)){ - $tab[$i]=$id; - $i++; - } - foreach($tab as $spyindex) - delete_espionnage($spyindex); - } +function clear_old_rapport() +{ // efface les rapports trop ancien (en fonction du nombre de jour choisi par l'admin) + global $db; + $nb_jours = get_qms_config('jours'); + if (!$nb_jours) $nb_jours = 365; + $timestamp = time() - (24 * 60 * 60 * $nb_jours); + $datadate = mktime(0, 0, 0, date("m", $timestamp), date("d", $timestamp), date("y", $timestamp)); + $query = "SELECT `id` FROM " . TABLE_QMS . " WHERE `datadate`<$datadate"; + $result = $db->sql_query($query); + if ($result = $db->sql_numrows($result) == 0) { + // Pas d'espionnages a effacer. + } else { + $i = 0; + while (list($id) = $db->sql_fetch_row($result)) { + $tab[$i] = $id; + $i++; + } + foreach ($tab as $spyindex) + delete_espionnage($spyindex); + } } -function add_espionnage($string,$fp=""){ // Ajoute un rapport d'espionnage dans la table sql - global $db, $user_data, $lang; - //on recupere heure date et probabilité. - preg_match_all($lang['regex_xtense1_date_heure'], $string,$out); - //on verifie si le mois en cours est inferieur au mois du sondage (pour eviter le bug du changement d année) - $year = date('Y'); - if(date('m') < $out[2][0]) $year -= 1; - $date = mktime($out[4][0],$out[5][0],$out[6][0],$out[2][0],$out[3][0],$year); - //on recherche les coordonnées - $test = preg_match_all($lang['regex_xtense1_coord'],$out[7][0],$position); - $esp_name = $position[1][0]; - $esp_coor = $position[2][0]; - $cib_name = $position[1][1]; - $cib_coor = $position[2][1]; - if((strlen($esp_coor)+strlen($cib_coor)>=10)){ // si on a bien trouve les position - $retour = 2; - $real_sender_id = get_real_sender_id($cib_coor); - if($real_sender_id==0) $real_sender_id = $user_data['user_id']; - $where = "sender_id='".$real_sender_id."' AND datadate='".$date."' AND position='".$esp_coor."'"; - $query = "SELECT id FROM ".TABLE_QMS." WHERE ".$where; - $result = $db->sql_query($query); - $nb = $db->sql_numrows($result); - if ($nb == 0){ // et que le rapport n'existe pas deja - $userid=get_user_id($esp_coor); - if(!$userid[0]) $userid[0]="?"; - // on l'ajoute à la table - $distance=get_distance($esp_coor,$cib_coor); - $query = "INSERT INTO ".TABLE_QMS." ( `id` , `sender_id` , `position` , `position_name`, `joueur`,`alliance`,`distance`,`cible` , `cible_name`, `datadate`, `pourcentage`) VALUES ( NULL, '".$real_sender_id."' , '".$esp_coor."', '".$esp_name."', '".$userid[0]."', '".$userid[1]."', '".$distance."', '".$cib_coor."', '".$cib_name."', '".$date."', '".$out[8][0]."' )"; - $result = $db->sql_query($query); - $retour=1;//$result; - } else { // Si le rapport existe déjà, bah on met à jour les planètes au cas où le 1er envoi s'est fait par xtense et que le nom des planetes n'a pas été renvoyé - $query = "UPDATE ".TABLE_QMS." SET `position_name`='".$esp_name."',`cible_name`='".$cib_name."' WHERE ".$where; - $result = $db->sql_query($query); - } - } else - $retour = 0; - return $retour; +function add_espionnage($string, $fp = "") +{ // Ajoute un rapport d'espionnage dans la table sql + global $db, $user_data, $lang; + //on recupere heure date et probabilité. + preg_match_all($lang['regex_xtense1_date_heure'], $string, $out); + //on verifie si le mois en cours est inferieur au mois du sondage (pour eviter le bug du changement d année) + $year = date('Y'); + if (date('m') < $out[2][0]) $year -= 1; + $date = mktime($out[4][0], $out[5][0], $out[6][0], $out[2][0], $out[3][0], $year); + //on recherche les coordonnées + $test = preg_match_all($lang['regex_xtense1_coord'], $out[7][0], $position); + $esp_name = $position[1][0]; + $esp_coor = $position[2][0]; + $cib_name = $position[1][1]; + $cib_coor = $position[2][1]; + if ((strlen($esp_coor) + strlen($cib_coor) >= 10)) { // si on a bien trouve les position + $retour = 2; + $real_sender_id = get_real_sender_id($cib_coor); + if ($real_sender_id == 0) $real_sender_id = $user_data['user_id']; + $where = "sender_id='" . $real_sender_id . "' AND datadate='" . $date . "' AND position='" . $esp_coor . "'"; + $query = "SELECT id FROM " . TABLE_QMS . " WHERE " . $where; + $result = $db->sql_query($query); + $nb = $db->sql_numrows($result); + if ($nb == 0) { // et que le rapport n'existe pas deja + $userid = get_user_id($esp_coor); + if (!$userid[0]) $userid[0] = "?"; + // on l'ajoute à la table + $distance = get_distance($esp_coor, $cib_coor); + $query = "INSERT INTO " . TABLE_QMS . " ( `id` , `sender_id` , `position` , `position_name`, `joueur`,`alliance`,`distance`,`cible` , `cible_name`, `datadate`, `pourcentage`) VALUES ( NULL, '" . $real_sender_id . "' , '" . $esp_coor . "', '" . $esp_name . "', '" . $userid[0] . "', '" . $userid[1] . "', '" . $distance . "', '" . $cib_coor . "', '" . $cib_name . "', '" . $date . "', '" . $out[8][0] . "' )"; + $result = $db->sql_query($query); + $retour = 1; //$result; + } else { // Si le rapport existe déjà, bah on met à jour les planètes au cas où le 1er envoi s'est fait par xtense et que le nom des planetes n'a pas été renvoyé + $query = "UPDATE " . TABLE_QMS . " SET `position_name`='" . $esp_name . "',`cible_name`='" . $cib_name . "' WHERE " . $where; + $result = $db->sql_query($query); + } + } else + $retour = 0; + return $retour; } -function get_QMS_version(){ // Renvoi le numéro de version - global $db; global $mod_name; - $result = $db->sql_query("SELECT version FROM ".TABLE_MOD." WHERE action='$mod_name'"); - list($version) = $db->sql_fetch_row($result); - return $version; +function get_QMS_version() +{ // Renvoi le numéro de version + global $db; + global $mod_name; + $result = $db->sql_query("SELECT version FROM " . TABLE_MOD . " WHERE action='$mod_name'"); + list($version) = $db->sql_fetch_row($result); + return $version; } - -?> diff --git a/includes/qms_statistique.php b/includes/qms_statistique.php index 4047fa9..e0087f2 100644 --- a/includes/qms_statistique.php +++ b/includes/qms_statistique.php @@ -1,4 +1,5 @@ ',$filtre_data))>1) - list($userID,$filtre,$filtre_data) = Array(get_user_id_by_name(trim($test[1])),"",""); - $where = "WHERE `sender_id` ".($userID==0?"<>":"=")." '$userID'"; - $where .= ($filtre!=""?" AND `$filtre`":"").($filtre_data!=""?"='$filtre_data'":""); - $query = "SELECT * FROM ".TABLE_QMS . " " . $where; - qms_debug("get_espionnage_count : ".$query); - $result=$db->sql_query($query); - $result=$db->sql_numrows($result); + if ($userID == 0 && $filtre == 'cible' && count($test = explode('>', $filtre_data)) > 1) + list($userID, $filtre, $filtre_data) = array(get_user_id_by_name(trim($test[1])), "", ""); + $where = "WHERE `sender_id` " . ($userID == 0 ? "<>" : "=") . " '$userID'"; + $where .= ($filtre != "" ? " AND `$filtre`" : "") . ($filtre_data != "" ? "='$filtre_data'" : ""); + $query = "SELECT * FROM " . TABLE_QMS . " " . $where; + qms_debug("get_espionnage_count : " . $query); + $result = $db->sql_query($query); + $result = $db->sql_numrows($result); return $result; } -function get_list($type,$private,$filtre_where=""){ // Renvoi la liste de tous les $type different - global $db,$user_data; - $where = ($private==1?"WHERE `sender_id` = ".$user_data['user_id']:""); - if($filtre_where!="") - if($where=="") - $where = "WHERE ".$filtre_where; +function get_list($type, $private, $filtre_where = "") +{ // Renvoi la liste de tous les $type different + global $db, $user_data; + $where = ($private == 1 ? "WHERE `sender_id` = " . $user_data['user_id'] : ""); + if ($filtre_where != "") + if ($where == "") + $where = "WHERE " . $filtre_where; else - $where .= " AND ".$filtre_where; - if($type=='cible') - $query_limit = "SELECT DISTINCT `$type`,`sender_id` FROM `".TABLE_QMS."` $where ORDER BY `sender_id` ASC"; + $where .= " AND " . $filtre_where; + if ($type == 'cible') + $query_limit = "SELECT DISTINCT `$type`,`sender_id` FROM `" . TABLE_QMS . "` $where ORDER BY `sender_id` ASC"; else - $query_limit = "SELECT DISTINCT `$type` FROM `".TABLE_QMS."` $where ORDER BY `$type` ASC"; - $result=$db->sql_query($query_limit); - if($result=$db->sql_numrows($result)==0) - $tab = Array ("",""); - else{ - if($type=='cible' && $private!=1){ - $i = 0; $previd = 0; - while(list($type_data,$sender_id_data)=$db->sql_fetch_row($result)){ - if($sender_id_data!=$previd) - $tab[$i++] = "---> ".$sender_id_data; + $query_limit = "SELECT DISTINCT `$type` FROM `" . TABLE_QMS . "` $where ORDER BY `$type` ASC"; + $result = $db->sql_query($query_limit); + if ($result = $db->sql_numrows($result) == 0) + $tab = array("", ""); + else { + if ($type == 'cible' && $private != 1) { + $i = 0; + $previd = 0; + while (list($type_data, $sender_id_data) = $db->sql_fetch_row($result)) { + if ($sender_id_data != $previd) + $tab[$i++] = "---> " . $sender_id_data; $tab[$i++] = $type_data; $previd = $sender_id_data; } - for($j=0;$j',$tab[$j]))>1) - $tab[$j] = '---> '.get_user_name_by_id($getsid[1]); - }else{ + for ($j = 0; $j < count($tab); $j++) + if (count($getsid = explode('>', $tab[$j])) > 1) + $tab[$j] = '---> ' . get_user_name_by_id($getsid[1]); + } else { $i = 0; - while(list($type_data)=$db->sql_fetch_row($result)) + while (list($type_data) = $db->sql_fetch_row($result)) $tab[$i++] = $type_data; } } return $tab; } -function get_most($data, $tableau) { //Renvoi de la valeur et le nombre de $data le plus trouvé +function get_most($data, $tableau) +{ //Renvoi de la valeur et le nombre de $data le plus trouvé static $top1, $cnt1, $top2, $cnt2, $top3, $cnt3; if (isset($tableau)) { - $max_spy = count($tableau[$data]); + $max_spy = count($tableau[$data]); } else { $max_spy = 0; } - $i=0; + $i = 0; // On defile tous les champ du tableau - for ($a=0; $a<$max_spy; $a++) { + for ($a = 0; $a < $max_spy; $a++) { // On recupére le champ de la donnée $data - $cible=$tableau[$data][$a]; + $cible = $tableau[$data][$a]; // Si l'on a une donnée if ($cible) { - $ok=0; + $ok = 0; // On regarde dans le tableau $tmp si elle y est deja - for ($j=0; $j<$i; $j++) { - if ($tmp['data'][$j]==$cible) { + for ($j = 0; $j < $i; $j++) { + if ($tmp['data'][$j] == $cible) { // Si oui, on incrémente le compte - $tmp['cnt'][$j]+=1; - $ok=1; + $tmp['cnt'][$j] += 1; + $ok = 1; } } if (!$ok) { // Si non, on ajoute la donnée a la fin du tableau $tmp, - $tmp['data'][$i]=$cible; + $tmp['data'][$i] = $cible; // Et avec un count à 1. - $tmp['cnt'][$i]=1; - $i+=1; + $tmp['cnt'][$i] = 1; + $i += 1; } } } - if(isset($tmp)) { + if (isset($tmp)) { array_multisort($tmp['cnt'], SORT_DESC, SORT_NUMERIC, $tmp['data'], SORT_ASC); - return $tmp;//array($top1,$cnt1,$top2,$cnt2,$top3,$cnt3); - }else + return $tmp; //array($top1,$cnt1,$top2,$cnt2,$top3,$cnt3); + } else return false; } -function get_list_order($tableau,$sort="",$ord=""){ //Classer le tableau en fonction d'une donnée ($sort) et d'un sens ($ord) - if(($sort=='')||($sort=='date')) $sort='datadate'; - if($ord=='') $ord='desc'; - $max_spy=count($tableau[$sort]); - for($i=0;$i<$max_spy;$i++) +function get_list_order($tableau, $sort = "", $ord = "") +{ //Classer le tableau en fonction d'une donnée ($sort) et d'un sens ($ord) + if (($sort == '') || ($sort == 'date')) $sort = 'datadate'; + if ($ord == '') $ord = 'desc'; + $max_spy = count($tableau[$sort]); + for ($i = 0; $i < $max_spy; $i++) $tableau_index[$i] = $i; - for($i=0;$i<$max_spy;$i++){ - $w=$i; - for($j=$i+1;$j<$max_spy;$j++) { - if($sort=="distance"){ - $a=get_distance($tableau["position"][$tableau_index[$j]],$tableau["cible"][$tableau_index[$j]]); - $b=get_distance($tableau["position"][$tableau_index[$w]],$tableau["cible"][$tableau_index[$w]]); - }else{ - $a=strtolower($tableau[$sort][$tableau_index[$j]]); - $b=strtolower($tableau[$sort][$tableau_index[$w]]); + for ($i = 0; $i < $max_spy; $i++) { + $w = $i; + for ($j = $i + 1; $j < $max_spy; $j++) { + if ($sort == "distance") { + $a = get_distance($tableau["position"][$tableau_index[$j]], $tableau["cible"][$tableau_index[$j]]); + $b = get_distance($tableau["position"][$tableau_index[$w]], $tableau["cible"][$tableau_index[$w]]); + } else { + $a = strtolower($tableau[$sort][$tableau_index[$j]]); + $b = strtolower($tableau[$sort][$tableau_index[$w]]); } - if( ($a > $b) && ($ord=="desc") ){ - $w=$j; + if (($a > $b) && ($ord == "desc")) { + $w = $j; } - if( ($a < $b) && ($ord=="asc") ) { - $w=$j; + if (($a < $b) && ($ord == "asc")) { + $w = $j; } } - if($w!=$i){ - $k=$tableau_index[$i]; - $tableau_index[$i]=$tableau_index[$w]; - $tableau_index[$w]=$k; + if ($w != $i) { + $k = $tableau_index[$i]; + $tableau_index[$i] = $tableau_index[$w]; + $tableau_index[$w] = $k; } } return $tableau_index; } -function get_distance_moyen($tableau){ // Calcul de la distance moyenne des espionnages du $tableau - $cnt=0; $total=0; - $max_spy=count($tableau['cible']); - for($i=0;$i<$max_spy;$i++){ - $dist=get_distance($tableau["cible"][$i],$tableau["position"][$i]); - $total+=$dist; +function get_distance_moyen($tableau) +{ // Calcul de la distance moyenne des espionnages du $tableau + $cnt = 0; + $total = 0; + $max_spy = count($tableau['cible']); + for ($i = 0; $i < $max_spy; $i++) { + $dist = get_distance($tableau["cible"][$i], $tableau["position"][$i]); + $total += $dist; $cnt++; } - if($cnt!=0) - $retour = ceil($total/$cnt); + if ($cnt != 0) + $retour = ceil($total / $cnt); else $retour = 0; return $retour; } -function get_pourcentage_moyen($tableau){ // Renvoi le pourcentage de destruction moyen du $tableau - $cnt=0; $total=0; - if(count($tableau['pourcentage'])>0){ - foreach($tableau['pourcentage'] as $pourcent){ - $total+=$pourcent; +function get_pourcentage_moyen($tableau) +{ // Renvoi le pourcentage de destruction moyen du $tableau + $cnt = 0; + $total = 0; + if (count($tableau['pourcentage']) > 0) { + foreach ($tableau['pourcentage'] as $pourcent) { + $total += $pourcent; $cnt++; } } - if($cnt!=0) $retour = ceil($total/$cnt); + if ($cnt != 0) $retour = ceil($total / $cnt); else $retour = 0; return $retour; } -function get_time_analyse($tableau){ // Renvoi la période sans espionnage la plus longue -// retour : -// [0] : Période tranquille la plus longue -// [1] : tag de pour popup sur la période la plus tranquille (qui donne les 3 plus longues période) -// [2] : Temps depuis lequel il n'y a pas eu d'espionnage -// [3] : tag de pour un popup donnant le temps moyen entre les espionnages +function get_time_analyse($tableau) +{ // Renvoi la période sans espionnage la plus longue + // retour : + // [0] : Période tranquille la plus longue + // [1] : tag de pour popup sur la période la plus tranquille (qui donne les 3 plus longues période) + // [2] : Temps depuis lequel il n'y a pas eu d'espionnage + // [3] : tag de pour un popup donnant le temps moyen entre les espionnages global $lang; - $best_time1=Array(0,0,0,""); - $best_time2=Array(0,0,0,""); - $best_time3=Array(0,0,0,""); - $prev=0; + $best_time1 = array(0, 0, 0, ""); + $best_time2 = array(0, 0, 0, ""); + $best_time3 = array(0, 0, 0, ""); + $prev = 0; $moyenne_total = 0; $moyenne = 0; - if(count($tableau['id'])>1){ - // $tab=get_list_order($tableau); - // foreach($tab as $i){ - for($i=0;$i 1) { + // $tab=get_list_order($tableau); + // foreach($tab as $i){ + for ($i = 0; $i < count($tableau['id']); $i++) { + $now = $tableau['datadate'][$i]; + $diff = $prev - $now; + if ($prev != 0) { $moyenne_total += $diff; - if($best_time1[0]<$diff){ + if ($best_time1[0] < $diff) { $best_time3 = $best_time2; $best_time2 = $best_time1; - $best_time1 = Array( $diff, $now, $prev); - }else if($best_time2[0]<$diff){ + $best_time1 = array($diff, $now, $prev); + } else if ($best_time2[0] < $diff) { $best_time3 = $best_time2; - $best_time2 = Array( $diff, $now, $prev); - }else if($best_time3[0]<$diff){ - $best_time3 = Array( $diff, $now, $prev); + $best_time2 = array($diff, $now, $prev); + } else if ($best_time3[0] < $diff) { + $best_time3 = array($diff, $now, $prev); } } $prev = $now; } - $moyenne = $moyenne_total/count($tableau['datadate']); + $moyenne = $moyenne_total / count($tableau['datadate']); } $last = $tableau['datadate'][0]; - if($last>0){ + if ($last > 0) { $now = time(); - $last_cool_time = $now-$last; + $last_cool_time = $now - $last; $last_cool_time = get_format_time($last_cool_time); } else $last_cool_time = "-"; - $link=""; - if($best_time1[0]>0) { + $link = ""; + if ($best_time1[0] > 0) { $best_time1[3] = get_format_time($best_time1[0]); - if($best_time2[0]>0) $best_time2[3] = get_format_time($best_time2[0]); - if($best_time3[0]>0) $best_time3[3] = get_format_time($best_time3[0]); + if ($best_time2[0] > 0) $best_time2[3] = get_format_time($best_time2[0]); + if ($best_time3[0] > 0) $best_time3[3] = get_format_time($best_time3[0]); $link = ""; - $link .= ""; - $link .= ""; - $link .= ""; + $link .= ""; + $link .= ""; + $link .= ""; $link .= ""; - $link .= ""; - if($best_time2[0]>0){ + if ($best_time2[0] > 0) { $link .= ""; - $link .= ""; } - if($best_time3[0]>0){ + if ($best_time3[0] > 0) { $link .= ""; - $link .= ""; } $link .= "
".$lang['qms_time_analyse_duree']."".$lang['qms_time_analyse_du']."".$lang['qms_time_analyse_au']."" . $lang['qms_time_analyse_duree'] . "" . $lang['qms_time_analyse_du'] . "" . $lang['qms_time_analyse_au'] . "
".$best_time1[3].""; - $link .= "".date($lang['qms_format_full'], $best_time1[1]).""; - $link .= "".date($lang['qms_format_full'], $best_time1[2]).""; + $link .= "" . $best_time1[3] . ""; + $link .= "" . date($lang['qms_format_full'], $best_time1[1]) . ""; + $link .= "" . date($lang['qms_format_full'], $best_time1[2]) . ""; $link .= "
".$best_time2[3].""; - $link .= "".date($lang['qms_format_full'], $best_time2[1]).""; - $link .= "".date($lang['qms_format_full'], $best_time2[2]).""; + $link .= "" . $best_time2[3] . ""; + $link .= "" . date($lang['qms_format_full'], $best_time2[1]) . ""; + $link .= "" . date($lang['qms_format_full'], $best_time2[2]) . ""; $link .= "
".$best_time3[3].""; - $link .= "".date($lang['qms_format_full'], $best_time3[1]).""; - $link .= "".date($lang['qms_format_full'], $best_time3[2]).""; + $link .= "" . $best_time3[3] . ""; + $link .= "" . date($lang['qms_format_full'], $best_time3[1]) . ""; + $link .= "" . date($lang['qms_format_full'], $best_time3[2]) . ""; $link .= "
"; $link = htmlentities($link); - $link = " onmouseover=\"this.T_WIDTH=260;this.T_TEMP=15000;return escape('".$link."')\""; + $link = " onmouseover=\"this.T_WIDTH=260;this.T_TEMP=15000;return escape('" . $link . "')\""; } else $best_time1[3] = "-"; - if($moyenne>0){ + if ($moyenne > 0) { $link2 = ""; - $link2 .= ""; - $link2 .= ""; + $link2 .= ""; + $link2 .= ""; $link2 .= "
".$lang['qms_time_analyse_temps_moy']."
".get_format_time($moyenne)."
" . $lang['qms_time_analyse_temps_moy'] . "
" . get_format_time($moyenne) . "
"; $link2 = htmlentities($link2); - $link2 = " onmouseover=\"this.T_WIDTH=180;this.T_TEMP=15000;return escape('".$link2."')\""; + $link2 = " onmouseover=\"this.T_WIDTH=180;this.T_TEMP=15000;return escape('" . $link2 . "')\""; } else $link2 = ""; - return Array("+cool" => $best_time1[3],"link_table+cool" => $link, "since" => $last_cool_time,"link_moyenne" => $link2); + return array("+cool" => $best_time1[3], "link_table+cool" => $link, "since" => $last_cool_time, "link_moyenne" => $link2); } -function get_format_time($time){ // Renvoi une durée sous la forme de xj xh xm xs. +function get_format_time($time) +{ // Renvoi une durée sous la forme de xj xh xm xs. $retour = ""; $time -= 3600; - if(date("z",$time)>0) $retour .= date("z",$time)."j "; - if(date("h",$time)>0) $retour .= date("H",$time)."h "; - if(date("i",$time)>0) $retour .= date("i",$time)."m "; - $retour .= date("s",$time)."s "; + if (date("z", $time) > 0) $retour .= date("z", $time) . "j "; + if (date("h", $time) > 0) $retour .= date("H", $time) . "h "; + if (date("i", $time) > 0) $retour .= date("i", $time) . "m "; + $retour .= date("s", $time) . "s "; return $retour; } -function get_color($poucentage,$mini=0,$max=100){ // Renvoi la couleur en fonction du pourcentage (0% = blanc, 100% = rouge) - $valeur = (int) $poucentage - $mini; - $div=$max-$mini; - if($div<1) $div=1; - $couleur=255-($valeur*255/($div)); - if($couleur>16) $couleur=dechex($couleur); - else $couleur="0".dechex($couleur); - $couleurHexa="FF".$couleur.$couleur; - return $couleurHexa; +function get_color($poucentage, $mini = 0, $max = 100) +{ // Renvoi la couleur en fonction du pourcentage (0% = blanc, 100% = rouge) + $valeur = (int) $poucentage - $mini; + $div = $max - $mini; + if ($div < 1) $div = 1; + $couleur = 255 - ($valeur * 255 / ($div)); + if ($couleur > 16) $couleur = dechex($couleur); + else $couleur = "0" . dechex($couleur); + $couleurHexa = "FF" . $couleur . $couleur; + return $couleurHexa; } -function get_clear_distance($distance){ // Renvoi le nombre de système, galaxie ou planetes correspondant à une distance +function get_clear_distance($distance) +{ // Renvoi le nombre de système, galaxie ou planetes correspondant à une distance global $lang; - if($distance>=20000){ + if ($distance >= 20000) { // Plusieurs galaxie - $retour['nb'] = $distance/20000; - $retour['type'] = $retour['nb']==1?$lang['qms_galaxie']:$lang['qms_galaxies']; - }elseif($distance<=1070){ + $retour['nb'] = $distance / 20000; + $retour['type'] = $retour['nb'] == 1 ? $lang['qms_galaxie'] : $lang['qms_galaxies']; + } elseif ($distance <= 1070) { // Meme systeme - $retour['nb'] = ($distance-1000)/5; - $retour['type'] = $retour['nb']==1?$lang['qms_position']:$lang['qms_positions']; - }else{ + $retour['nb'] = ($distance - 1000) / 5; + $retour['type'] = $retour['nb'] == 1 ? $lang['qms_position'] : $lang['qms_positions']; + } else { // Plusieurs système - $retour['nb'] = ($distance-2700)/95; - $retour['type'] = $retour['nb']==1?$lang['qms_systeme']:$lang['qms_systemes']; + $retour['nb'] = ($distance - 2700) / 95; + $retour['type'] = $retour['nb'] == 1 ? $lang['qms_systeme'] : $lang['qms_systemes']; } - return round($retour['nb'])." ".$retour['type']; + return round($retour['nb']) . " " . $retour['type']; } diff --git a/js/calendar/calendar-en.js b/js/calendar/calendar-en.js index 0dbde79..69d24d2 100644 --- a/js/calendar/calendar-en.js +++ b/js/calendar/calendar-en.js @@ -11,14 +11,14 @@ // full day names Calendar._DN = new Array -("Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday"); + ("Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + "Sunday"); // Please note that the following array of short day names (and the same goes // for short month names, _SMN) isn't absolutely necessary. We give it here @@ -34,14 +34,14 @@ Calendar._DN = new Array // short day names Calendar._SDN = new Array -("Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun"); + ("Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun"); // First day of the week. "0" means display Sunday first, "1" means display // Monday first, etc. @@ -49,53 +49,53 @@ Calendar._FD = 0; // full month names Calendar._MN = new Array -("January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December"); + ("January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"); // short month names Calendar._SMN = new Array -("Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec"); + ("Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"); // tooltips Calendar._TT = {}; Calendar._TT["INFO"] = "About the calendar"; Calendar._TT["ABOUT"] = -"DHTML Date/Time Selector\n" + -"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) -"For latest version visit: http://www.dynarch.com/projects/calendar/\n" + -"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + -"\n\n" + -"Date selection:\n" + -"- Use the \xab, \xbb buttons to select year\n" + -"- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + -"- Hold mouse button on any of the above buttons for faster selection."; + "DHTML Date/Time Selector\n" + + "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) + "For latest version visit: http://www.dynarch.com/projects/calendar/\n" + + "Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + + "\n\n" + + "Date selection:\n" + + "- Use the \xab, \xbb buttons to select year\n" + + "- Use the " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " buttons to select month\n" + + "- Hold mouse button on any of the above buttons for faster selection."; Calendar._TT["ABOUT_TIME"] = "\n\n" + -"Time selection:\n" + -"- Click on any of the time parts to increase it\n" + -"- or Shift-click to decrease it\n" + -"- or click and drag for faster selection."; + "Time selection:\n" + + "- Click on any of the time parts to increase it\n" + + "- or Shift-click to decrease it\n" + + "- or click and drag for faster selection."; Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)"; Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)"; diff --git a/js/calendar/calendar-fr.js b/js/calendar/calendar-fr.js index 1c91583..f418947 100644 --- a/js/calendar/calendar-fr.js +++ b/js/calendar/calendar-fr.js @@ -13,14 +13,14 @@ // full day names Calendar._DN = new Array -("Dimanche", - "Lundi", - "Mardi", - "Mercredi", - "Jeudi", - "Vendredi", - "Samedi", - "Dimanche"); + ("Dimanche", + "Lundi", + "Mardi", + "Mercredi", + "Jeudi", + "Vendredi", + "Samedi", + "Dimanche"); // Please note that the following array of short day names (and the same goes // for short month names, _SMN) isn't absolutely necessary. We give it here @@ -38,64 +38,64 @@ Calendar._FD = 1; // short day names Calendar._SDN = new Array -("Dim", - "Lun", - "Mar", - "Mar", - "Jeu", - "Ven", - "Sam", - "Dim"); + ("Dim", + "Lun", + "Mar", + "Mar", + "Jeu", + "Ven", + "Sam", + "Dim"); // full month names Calendar._MN = new Array -("Janvier", - "Février", - "Mars", - "Avril", - "Mai", - "Juin", - "Juillet", - "Août", - "Septembre", - "Octobre", - "Novembre", - "Décembre"); + ("Janvier", + "Février", + "Mars", + "Avril", + "Mai", + "Juin", + "Juillet", + "Août", + "Septembre", + "Octobre", + "Novembre", + "Décembre"); // short month names Calendar._SMN = new Array -("Jan", - "Fev", - "Mar", - "Avr", - "Mai", - "Juin", - "Juil", - "Aout", - "Sep", - "Oct", - "Nov", - "Dec"); + ("Jan", + "Fev", + "Mar", + "Avr", + "Mai", + "Juin", + "Juil", + "Aout", + "Sep", + "Oct", + "Nov", + "Dec"); // tooltips Calendar._TT = {}; Calendar._TT["INFO"] = "A propos du calendrier"; Calendar._TT["ABOUT"] = -"DHTML Date/Heure Selecteur\n" + -"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) -"Pour la derniere version visitez : http://www.dynarch.com/projects/calendar/\n" + -"Distribué par GNU LGPL. Voir http://gnu.org/licenses/lgpl.html pour les details." + -"\n\n" + -"Selection de la date :\n" + -"- Utiliser les bouttons \xab, \xbb pour selectionner l\'annee\n" + -"- Utiliser les bouttons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pour selectionner les mois\n" + -"- Garder la souris sur n'importe quels boutons pour une selection plus rapide"; + "DHTML Date/Heure Selecteur\n" + + "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) + "Pour la derniere version visitez : http://www.dynarch.com/projects/calendar/\n" + + "Distribué par GNU LGPL. Voir http://gnu.org/licenses/lgpl.html pour les details." + + "\n\n" + + "Selection de la date :\n" + + "- Utiliser les bouttons \xab, \xbb pour selectionner l\'annee\n" + + "- Utiliser les bouttons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pour selectionner les mois\n" + + "- Garder la souris sur n'importe quels boutons pour une selection plus rapide"; Calendar._TT["ABOUT_TIME"] = "\n\n" + -"Selection de l\'heure :\n" + -"- Cliquer sur heures ou minutes pour incrementer\n" + -"- ou Maj-clic pour decrementer\n" + -"- ou clic et glisser-deplacer pour une selection plus rapide"; + "Selection de l\'heure :\n" + + "- Cliquer sur heures ou minutes pour incrementer\n" + + "- ou Maj-clic pour decrementer\n" + + "- ou clic et glisser-deplacer pour une selection plus rapide"; Calendar._TT["PREV_YEAR"] = "Année préc. (maintenir pour menu)"; Calendar._TT["PREV_MONTH"] = "Mois préc. (maintenir pour menu)"; diff --git a/js/calendar/calendar-setup.js b/js/calendar/calendar-setup.js index 91c927f..cb19a5e 100644 --- a/js/calendar/calendar-setup.js +++ b/js/calendar/calendar-setup.js @@ -18,4 +18,4 @@ * modify this code to suit your needs (this is recommended and much better * than modifying calendar.js itself). */ - Calendar.setup=function(params){function param_default(pname,def){if(typeof params[pname]=="undefined"){params[pname]=def;}};param_default("inputField",null);param_default("displayArea",null);param_default("button",null);param_default("eventName","click");param_default("ifFormat","%Y/%m/%d");param_default("daFormat","%Y/%m/%d");param_default("singleClick",true);param_default("disableFunc",null);param_default("dateStatusFunc",params["disableFunc"]);param_default("dateText",null);param_default("firstDay",null);param_default("align","Br");param_default("range",[1900,2999]);param_default("weekNumbers",true);param_default("flat",null);param_default("flatCallback",null);param_default("onSelect",null);param_default("onClose",null);param_default("onUpdate",null);param_default("date",null);param_default("showsTime",false);param_default("timeFormat","24");param_default("electric",true);param_default("step",2);param_default("position",null);param_default("cache",false);param_default("showOthers",false);param_default("multiple",null);var tmp=["inputField","displayArea","button"];for(var i in tmp){if(typeof params[tmp[i]]=="string"){params[tmp[i]]=document.getElementById(params[tmp[i]]);}}if(!(params.flat||params.multiple||params.inputField||params.displayArea||params.button)){alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code");return false;}function onSelect(cal){var p=cal.params;var update=(cal.dateClicked||p.electric);if(update&&p.inputField){p.inputField.value=cal.date.print(p.ifFormat);if(typeof p.inputField.onchange=="function")p.inputField.onchange();}if(update&&p.displayArea)p.displayArea.innerHTML=cal.date.print(p.daFormat);if(update&&typeof p.onUpdate=="function")p.onUpdate(cal);if(update&&p.flat){if(typeof p.flatCallback=="function")p.flatCallback(cal);}if(update&&p.singleClick&&cal.dateClicked)cal.callCloseHandler();};if(params.flat!=null){if(typeof params.flat=="string")params.flat=document.getElementById(params.flat);if(!params.flat){alert("Calendar.setup:\n Flat specified but can't find parent.");return false;}var cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect);cal.showsOtherMonths=params.showOthers;cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.params=params;cal.weekNumbers=params.weekNumbers;cal.setRange(params.range[0],params.range[1]);cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;if(params.ifFormat){cal.setDateFormat(params.ifFormat);}if(params.inputField&&typeof params.inputField.value=="string"){cal.parseDate(params.inputField.value);}cal.create(params.flat);cal.show();return false;}var triggerEl=params.button||params.displayArea||params.inputField;triggerEl["on"+params.eventName]=function(){var dateEl=params.inputField||params.displayArea;var dateFmt=params.inputField?params.ifFormat:params.daFormat;var mustCreate=false;var cal=window.calendar;if(dateEl)params.date=Date.parseDate(dateEl.value||dateEl.innerHTML,dateFmt);if(!(cal&¶ms.cache)){window.calendar=cal=new Calendar(params.firstDay,params.date,params.onSelect||onSelect,params.onClose||function(cal){cal.hide();});cal.showsTime=params.showsTime;cal.time24=(params.timeFormat=="24");cal.weekNumbers=params.weekNumbers;mustCreate=true;}else{if(params.date)cal.setDate(params.date);cal.hide();}if(params.multiple){cal.multiple={};for(var i=params.multiple.length;--i>=0;){var d=params.multiple[i];var ds=d.print("%Y%m%d");cal.multiple[ds]=d;}}cal.showsOtherMonths=params.showOthers;cal.yearStep=params.step;cal.setRange(params.range[0],params.range[1]);cal.params=params;cal.setDateStatusHandler(params.dateStatusFunc);cal.getDateText=params.dateText;cal.setDateFormat(dateFmt);if(mustCreate)cal.create();cal.refresh();if(!params.position)cal.showAtElement(params.button||params.displayArea||params.inputField,params.align);else cal.showAt(params.position[0],params.position[1]);return false;};return cal;}; \ No newline at end of file +Calendar.setup = function (params) { function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } }; param_default("inputField", null); param_default("displayArea", null); param_default("button", null); param_default("eventName", "click"); param_default("ifFormat", "%Y/%m/%d"); param_default("daFormat", "%Y/%m/%d"); param_default("singleClick", true); param_default("disableFunc", null); param_default("dateStatusFunc", params["disableFunc"]); param_default("dateText", null); param_default("firstDay", null); param_default("align", "Br"); param_default("range", [1900, 2999]); param_default("weekNumbers", true); param_default("flat", null); param_default("flatCallback", null); param_default("onSelect", null); param_default("onClose", null); param_default("onUpdate", null); param_default("date", null); param_default("showsTime", false); param_default("timeFormat", "24"); param_default("electric", true); param_default("step", 2); param_default("position", null); param_default("cache", false); param_default("showOthers", false); param_default("multiple", null); var tmp = ["inputField", "displayArea", "button"]; for (var i in tmp) { if (typeof params[tmp[i]] == "string") { params[tmp[i]] = document.getElementById(params[tmp[i]]); } } if (!(params.flat || params.multiple || params.inputField || params.displayArea || params.button)) { alert("Calendar.setup:\n Nothing to setup (no fields found). Please check your code"); return false; } function onSelect(cal) { var p = cal.params; var update = (cal.dateClicked || p.electric); if (update && p.inputField) { p.inputField.value = cal.date.print(p.ifFormat); if (typeof p.inputField.onchange == "function") p.inputField.onchange(); } if (update && p.displayArea) p.displayArea.innerHTML = cal.date.print(p.daFormat); if (update && typeof p.onUpdate == "function") p.onUpdate(cal); if (update && p.flat) { if (typeof p.flatCallback == "function") p.flatCallback(cal); } if (update && p.singleClick && cal.dateClicked) cal.callCloseHandler(); }; if (params.flat != null) { if (typeof params.flat == "string") params.flat = document.getElementById(params.flat); if (!params.flat) { alert("Calendar.setup:\n Flat specified but can't find parent."); return false; } var cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect); cal.showsOtherMonths = params.showOthers; cal.showsTime = params.showsTime; cal.time24 = (params.timeFormat == "24"); cal.params = params; cal.weekNumbers = params.weekNumbers; cal.setRange(params.range[0], params.range[1]); cal.setDateStatusHandler(params.dateStatusFunc); cal.getDateText = params.dateText; if (params.ifFormat) { cal.setDateFormat(params.ifFormat); } if (params.inputField && typeof params.inputField.value == "string") { cal.parseDate(params.inputField.value); } cal.create(params.flat); cal.show(); return false; } var triggerEl = params.button || params.displayArea || params.inputField; triggerEl["on" + params.eventName] = function () { var dateEl = params.inputField || params.displayArea; var dateFmt = params.inputField ? params.ifFormat : params.daFormat; var mustCreate = false; var cal = window.calendar; if (dateEl) params.date = Date.parseDate(dateEl.value || dateEl.innerHTML, dateFmt); if (!(cal && params.cache)) { window.calendar = cal = new Calendar(params.firstDay, params.date, params.onSelect || onSelect, params.onClose || function (cal) { cal.hide(); }); cal.showsTime = params.showsTime; cal.time24 = (params.timeFormat == "24"); cal.weekNumbers = params.weekNumbers; mustCreate = true; } else { if (params.date) cal.setDate(params.date); cal.hide(); } if (params.multiple) { cal.multiple = {}; for (var i = params.multiple.length; --i >= 0;) { var d = params.multiple[i]; var ds = d.print("%Y%m%d"); cal.multiple[ds] = d; } } cal.showsOtherMonths = params.showOthers; cal.yearStep = params.step; cal.setRange(params.range[0], params.range[1]); cal.params = params; cal.setDateStatusHandler(params.dateStatusFunc); cal.getDateText = params.dateText; cal.setDateFormat(dateFmt); if (mustCreate) cal.create(); cal.refresh(); if (!params.position) cal.showAtElement(params.button || params.displayArea || params.inputField, params.align); else cal.showAt(params.position[0], params.position[1]); return false; }; return cal; }; diff --git a/js/calendar/calendar.js b/js/calendar/calendar.js index 4fe03f1..a19497c 100644 --- a/js/calendar/calendar.js +++ b/js/calendar/calendar.js @@ -11,4 +11,4 @@ * This script is distributed under the GNU Lesser General Public License. * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html */ - Calendar=function(firstDayOfWeek,dateStr,onSelected,onClose){this.activeDiv=null;this.currentDateEl=null;this.getDateStatus=null;this.getDateToolTip=null;this.getDateText=null;this.timeout=null;this.onSelected=onSelected||null;this.onClose=onClose||null;this.dragging=false;this.hidden=false;this.minYear=1970;this.maxYear=2050;this.dateFormat=Calendar._TT["DEF_DATE_FORMAT"];this.ttDateFormat=Calendar._TT["TT_DATE_FORMAT"];this.isPopup=true;this.weekNumbers=true;this.firstDayOfWeek=typeof firstDayOfWeek=="number"?firstDayOfWeek:Calendar._FD;this.showsOtherMonths=false;this.dateStr=dateStr;this.ar_days=null;this.showsTime=false;this.time24=true;this.yearStep=2;this.hiliteToday=true;this.multiple=null;this.table=null;this.element=null;this.tbody=null;this.firstdayname=null;this.monthsCombo=null;this.yearsCombo=null;this.hilitedMonth=null;this.activeMonth=null;this.hilitedYear=null;this.activeYear=null;this.dateClicked=false;if(typeof Calendar._SDN=="undefined"){if(typeof Calendar._SDN_len=="undefined")Calendar._SDN_len=3;var ar=new Array();for(var i=8;i>0;){ar[--i]=Calendar._DN[i].substr(0,Calendar._SDN_len);}Calendar._SDN=ar;if(typeof Calendar._SMN_len=="undefined")Calendar._SMN_len=3;ar=new Array();for(var i=12;i>0;){ar[--i]=Calendar._MN[i].substr(0,Calendar._SMN_len);}Calendar._SMN=ar;}};Calendar._C=null;Calendar.is_ie=(/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent));Calendar.is_ie5=(Calendar.is_ie&&/msie 5\.0/i.test(navigator.userAgent));Calendar.is_opera=/opera/i.test(navigator.userAgent);Calendar.is_khtml=/Konqueror|Safari|KHTML/i.test(navigator.userAgent);Calendar.getAbsolutePos=function(el){var SL=0,ST=0;var is_div=/^div$/i.test(el.tagName);if(is_div&&el.scrollLeft)SL=el.scrollLeft;if(is_div&&el.scrollTop)ST=el.scrollTop;var r={x:el.offsetLeft-SL,y:el.offsetTop-ST};if(el.offsetParent){var tmp=this.getAbsolutePos(el.offsetParent);r.x+=tmp.x;r.y+=tmp.y;}return r;};Calendar.isRelated=function(el,evt){var related=evt.relatedTarget;if(!related){var type=evt.type;if(type=="mouseover"){related=evt.fromElement;}else if(type=="mouseout"){related=evt.toElement;}}while(related){if(related==el){return true;}related=related.parentNode;}return false;};Calendar.removeClass=function(el,className){if(!(el&&el.className)){return;}var cls=el.className.split(" ");var ar=new Array();for(var i=cls.length;i>0;){if(cls[--i]!=className){ar[ar.length]=cls[i];}}el.className=ar.join(" ");};Calendar.addClass=function(el,className){Calendar.removeClass(el,className);el.className+=" "+className;};Calendar.getElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.currentTarget;while(f.nodeType!=1||/^div$/i.test(f.tagName))f=f.parentNode;return f;};Calendar.getTargetElement=function(ev){var f=Calendar.is_ie?window.event.srcElement:ev.target;while(f.nodeType!=1)f=f.parentNode;return f;};Calendar.stopEvent=function(ev){ev||(ev=window.event);if(Calendar.is_ie){ev.cancelBubble=true;ev.returnValue=false;}else{ev.preventDefault();ev.stopPropagation();}return false;};Calendar.addEvent=function(el,evname,func){if(el.attachEvent){el.attachEvent("on"+evname,func);}else if(el.addEventListener){el.addEventListener(evname,func,true);}else{el["on"+evname]=func;}};Calendar.removeEvent=function(el,evname,func){if(el.detachEvent){el.detachEvent("on"+evname,func);}else if(el.removeEventListener){el.removeEventListener(evname,func,true);}else{el["on"+evname]=null;}};Calendar.createElement=function(type,parent){var el=null;if(document.createElementNS){el=document.createElementNS("http://www.w3.org/1999/xhtml",type);}else{el=document.createElement(type);}if(typeof parent!="undefined"){parent.appendChild(el);}return el;};Calendar._add_evs=function(el){with(Calendar){addEvent(el,"mouseover",dayMouseOver);addEvent(el,"mousedown",dayMouseDown);addEvent(el,"mouseout",dayMouseOut);if(is_ie){addEvent(el,"dblclick",dayMouseDblClick);el.setAttribute("unselectable",true);}}};Calendar.findMonth=function(el){if(typeof el.month!="undefined"){return el;}else if(typeof el.parentNode.month!="undefined"){return el.parentNode;}return null;};Calendar.findYear=function(el){if(typeof el.year!="undefined"){return el;}else if(typeof el.parentNode.year!="undefined"){return el.parentNode;}return null;};Calendar.showMonthsCombo=function(){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var mc=cal.monthsCombo;if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}if(cal.activeMonth){Calendar.removeClass(cal.activeMonth,"active");}var mon=cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()];Calendar.addClass(mon,"active");cal.activeMonth=mon;var s=mc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var mcw=mc.offsetWidth;if(typeof mcw=="undefined")mcw=50;s.left=(cd.offsetLeft+cd.offsetWidth-mcw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";};Calendar.showYearsCombo=function(fwd){var cal=Calendar._C;if(!cal){return false;}var cal=cal;var cd=cal.activeDiv;var yc=cal.yearsCombo;if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}if(cal.activeYear){Calendar.removeClass(cal.activeYear,"active");}cal.activeYear=null;var Y=cal.date.getFullYear()+(fwd?1:-1);var yr=yc.firstChild;var show=false;for(var i=12;i>0;--i){if(Y>=cal.minYear&&Y<=cal.maxYear){yr.innerHTML=Y;yr.year=Y;yr.style.display="block";show=true;}else{yr.style.display="none";}yr=yr.nextSibling;Y+=fwd?cal.yearStep:-cal.yearStep;}if(show){var s=yc.style;s.display="block";if(cd.navtype<0)s.left=cd.offsetLeft+"px";else{var ycw=yc.offsetWidth;if(typeof ycw=="undefined")ycw=50;s.left=(cd.offsetLeft+cd.offsetWidth-ycw)+"px";}s.top=(cd.offsetTop+cd.offsetHeight)+"px";}};Calendar.tableMouseUp=function(ev){var cal=Calendar._C;if(!cal){return false;}if(cal.timeout){clearTimeout(cal.timeout);}var el=cal.activeDiv;if(!el){return false;}var target=Calendar.getTargetElement(ev);ev||(ev=window.event);Calendar.removeClass(el,"active");if(target==el||target.parentNode==el){Calendar.cellClick(el,ev);}var mon=Calendar.findMonth(target);var date=null;if(mon){date=new Date(cal.date);if(mon.month!=date.getMonth()){date.setMonth(mon.month);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}else{var year=Calendar.findYear(target);if(year){date=new Date(cal.date);if(year.year!=date.getFullYear()){date.setFullYear(year.year);cal.setDate(date);cal.dateClicked=false;cal.callHandler();}}}with(Calendar){removeEvent(document,"mouseup",tableMouseUp);removeEvent(document,"mouseover",tableMouseOver);removeEvent(document,"mousemove",tableMouseOver);cal._hideCombos();_C=null;return stopEvent(ev);}};Calendar.tableMouseOver=function(ev){var cal=Calendar._C;if(!cal){return;}var el=cal.activeDiv;var target=Calendar.getTargetElement(ev);if(target==el||target.parentNode==el){Calendar.addClass(el,"hilite active");Calendar.addClass(el.parentNode,"rowhilite");}else{if(typeof el.navtype=="undefined"||(el.navtype!=50&&(el.navtype==0||Math.abs(el.navtype)>2)))Calendar.removeClass(el,"active");Calendar.removeClass(el,"hilite");Calendar.removeClass(el.parentNode,"rowhilite");}ev||(ev=window.event);if(el.navtype==50&&target!=el){var pos=Calendar.getAbsolutePos(el);var w=el.offsetWidth;var x=ev.clientX;var dx;var decrease=true;if(x>pos.x+w){dx=x-pos.x-w;decrease=false;}else dx=pos.x-x;if(dx<0)dx=0;var range=el._range;var current=el._current;var count=Math.floor(dx/10)%range.length;for(var i=range.length;--i>=0;)if(range[i]==current)break;while(count-->0)if(decrease){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();}var mon=Calendar.findMonth(target);if(mon){if(mon.month!=cal.date.getMonth()){if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}Calendar.addClass(mon,"hilite");cal.hilitedMonth=mon;}else if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}}else{if(cal.hilitedMonth){Calendar.removeClass(cal.hilitedMonth,"hilite");}var year=Calendar.findYear(target);if(year){if(year.year!=cal.date.getFullYear()){if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}Calendar.addClass(year,"hilite");cal.hilitedYear=year;}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}else if(cal.hilitedYear){Calendar.removeClass(cal.hilitedYear,"hilite");}}return Calendar.stopEvent(ev);};Calendar.tableMouseDown=function(ev){if(Calendar.getTargetElement(ev)==Calendar.getElement(ev)){return Calendar.stopEvent(ev);}};Calendar.calDragIt=function(ev){var cal=Calendar._C;if(!(cal&&cal.dragging)){return false;}var posX;var posY;if(Calendar.is_ie){posY=window.event.clientY+document.body.scrollTop;posX=window.event.clientX+document.body.scrollLeft;}else{posX=ev.pageX;posY=ev.pageY;}cal.hideShowCovered();var st=cal.element.style;st.left=(posX-cal.xOffs)+"px";st.top=(posY-cal.yOffs)+"px";return Calendar.stopEvent(ev);};Calendar.calDragEnd=function(ev){var cal=Calendar._C;if(!cal){return false;}cal.dragging=false;with(Calendar){removeEvent(document,"mousemove",calDragIt);removeEvent(document,"mouseup",calDragEnd);tableMouseUp(ev);}cal.hideShowCovered();};Calendar.dayMouseDown=function(ev){var el=Calendar.getElement(ev);if(el.disabled){return false;}var cal=el.calendar;cal.activeDiv=el;Calendar._C=cal;if(el.navtype!=300)with(Calendar){if(el.navtype==50){el._current=el.innerHTML;addEvent(document,"mousemove",tableMouseOver);}else addEvent(document,Calendar.is_ie5?"mousemove":"mouseover",tableMouseOver);addClass(el,"hilite active");addEvent(document,"mouseup",tableMouseUp);}else if(cal.isPopup){cal._dragStart(ev);}if(el.navtype==-1||el.navtype==1){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout("Calendar.showMonthsCombo()",250);}else if(el.navtype==-2||el.navtype==2){if(cal.timeout)clearTimeout(cal.timeout);cal.timeout=setTimeout((el.navtype>0)?"Calendar.showYearsCombo(true)":"Calendar.showYearsCombo(false)",250);}else{cal.timeout=null;}return Calendar.stopEvent(ev);};Calendar.dayMouseDblClick=function(ev){Calendar.cellClick(Calendar.getElement(ev),ev||window.event);if(Calendar.is_ie){document.selection.empty();}};Calendar.dayMouseOver=function(ev){var el=Calendar.getElement(ev);if(Calendar.isRelated(el,ev)||Calendar._C||el.disabled){return false;}if(el.ttip){if(el.ttip.substr(0,1)=="_"){el.ttip=el.caldate.print(el.calendar.ttDateFormat)+el.ttip.substr(1);}el.calendar.tooltips.innerHTML=el.ttip;}if(el.navtype!=300){Calendar.addClass(el,"hilite");if(el.caldate){Calendar.addClass(el.parentNode,"rowhilite");}}return Calendar.stopEvent(ev);};Calendar.dayMouseOut=function(ev){with(Calendar){var el=getElement(ev);if(isRelated(el,ev)||_C||el.disabled)return false;removeClass(el,"hilite");if(el.caldate)removeClass(el.parentNode,"rowhilite");if(el.calendar)el.calendar.tooltips.innerHTML=_TT["SEL_DATE"];return stopEvent(ev);}};Calendar.cellClick=function(el,ev){var cal=el.calendar;var closing=false;var newdate=false;var date=null;if(typeof el.navtype=="undefined"){if(cal.currentDateEl){Calendar.removeClass(cal.currentDateEl,"selected");Calendar.addClass(el,"selected");closing=(cal.currentDateEl==el);if(!closing){cal.currentDateEl=el;}}cal.date.setDateOnly(el.caldate);date=cal.date;var other_month=!(cal.dateClicked=!el.otherMonth);if(!other_month&&!cal.currentDateEl)cal._toggleMultipleDate(new Date(date));else newdate=!el.disabled;if(other_month)cal._init(cal.firstDayOfWeek,date);}else{if(el.navtype==200){Calendar.removeClass(el,"hilite");cal.callCloseHandler();return;}date=new Date(cal.date);if(el.navtype==0)date.setDateOnly(new Date());cal.dateClicked=false;var year=date.getFullYear();var mon=date.getMonth();function setMonth(m){var day=date.getDate();var max=date.getMonthDays(m);if(day>max){date.setDate(max);}date.setMonth(m);};switch(el.navtype){case 400:Calendar.removeClass(el,"hilite");var text=Calendar._TT["ABOUT"];if(typeof text!="undefined"){text+=cal.showsTime?Calendar._TT["ABOUT_TIME"]:"";}else{text="Help and about box text is not translated into this language.\n"+"If you know this language and you feel generous please update\n"+"the corresponding file in \"lang\" subdir to match calendar-en.js\n"+"and send it back to to get it into the distribution ;-)\n\n"+"Thank you!\n"+"http://dynarch.com/mishoo/calendar.epl\n";}alert(text);return;case-2:if(year>cal.minYear){date.setFullYear(year-1);}break;case-1:if(mon>0){setMonth(mon-1);}else if(year-->cal.minYear){date.setFullYear(year);setMonth(11);}break;case 1:if(mon<11){setMonth(mon+1);}else if(year=0;)if(range[i]==current)break;if(ev&&ev.shiftKey){if(--i<0)i=range.length-1;}else if(++i>=range.length)i=0;var newval=range[i];el.innerHTML=newval;cal.onUpdateTime();return;case 0:if((typeof cal.getDateStatus=="function")&&cal.getDateStatus(date,date.getFullYear(),date.getMonth(),date.getDate())){return false;}break;}if(!date.equalsTo(cal.date)){cal.setDate(date);newdate=true;}else if(el.navtype==0)newdate=closing=true;}if(newdate){ev&&cal.callHandler();}if(closing){Calendar.removeClass(el,"hilite");ev&&cal.callCloseHandler();}};Calendar.prototype.create=function(_par){var parent=null;if(!_par){parent=document.getElementsByTagName("body")[0];this.isPopup=true;}else{parent=_par;this.isPopup=false;}this.date=this.dateStr?new Date(this.dateStr):new Date();var table=Calendar.createElement("table");this.table=table;table.cellSpacing=0;table.cellPadding=0;table.calendar=this;Calendar.addEvent(table,"mousedown",Calendar.tableMouseDown);var div=Calendar.createElement("div");this.element=div;div.className="calendar";if(this.isPopup){div.style.position="absolute";div.style.display="none";}div.appendChild(table);var thead=Calendar.createElement("thead",table);var cell=null;var row=null;var cal=this;var hh=function(text,cs,navtype){cell=Calendar.createElement("td",row);cell.colSpan=cs;cell.className="button";if(navtype!=0&&Math.abs(navtype)<=2)cell.className+=" nav";Calendar._add_evs(cell);cell.calendar=cal;cell.navtype=navtype;cell.innerHTML="
"+text+"
";return cell;};row=Calendar.createElement("tr",thead);var title_length=6;(this.isPopup)&&--title_length;(this.weekNumbers)&&++title_length;hh("?",1,400).ttip=Calendar._TT["INFO"];this.title=hh("",title_length,300);this.title.className="title";if(this.isPopup){this.title.ttip=Calendar._TT["DRAG_TO_MOVE"];this.title.style.cursor="move";hh("×",1,200).ttip=Calendar._TT["CLOSE"];}row=Calendar.createElement("tr",thead);row.className="headrow";this._nav_py=hh("«",1,-2);this._nav_py.ttip=Calendar._TT["PREV_YEAR"];this._nav_pm=hh("‹",1,-1);this._nav_pm.ttip=Calendar._TT["PREV_MONTH"];this._nav_now=hh(Calendar._TT["TODAY"],this.weekNumbers?4:3,0);this._nav_now.ttip=Calendar._TT["GO_TODAY"];this._nav_nm=hh("›",1,1);this._nav_nm.ttip=Calendar._TT["NEXT_MONTH"];this._nav_ny=hh("»",1,2);this._nav_ny.ttip=Calendar._TT["NEXT_YEAR"];row=Calendar.createElement("tr",thead);row.className="daynames";if(this.weekNumbers){cell=Calendar.createElement("td",row);cell.className="name wn";cell.innerHTML=Calendar._TT["WK"];}for(var i=7;i>0;--i){cell=Calendar.createElement("td",row);if(!i){cell.navtype=100;cell.calendar=this;Calendar._add_evs(cell);}}this.firstdayname=(this.weekNumbers)?row.firstChild.nextSibling:row.firstChild;this._displayWeekdays();var tbody=Calendar.createElement("tbody",table);this.tbody=tbody;for(i=6;i>0;--i){row=Calendar.createElement("tr",tbody);if(this.weekNumbers){cell=Calendar.createElement("td",row);}for(var j=7;j>0;--j){cell=Calendar.createElement("td",row);cell.calendar=this;Calendar._add_evs(cell);}}if(this.showsTime){row=Calendar.createElement("tr",tbody);row.className="time";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;cell.innerHTML=Calendar._TT["TIME"]||" ";cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=this.weekNumbers?4:3;(function(){function makeTimePart(className,init,range_start,range_end){var part=Calendar.createElement("span",cell);part.className=className;part.innerHTML=init;part.calendar=cal;part.ttip=Calendar._TT["TIME_PART"];part.navtype=50;part._range=[];if(typeof range_start!="number")part._range=range_start;else{for(var i=range_start;i<=range_end;++i){var txt;if(i<10&&range_end>=10)txt='0'+i;else txt=''+i;part._range[part._range.length]=txt;}}Calendar._add_evs(part);return part;};var hrs=cal.date.getHours();var mins=cal.date.getMinutes();var t12=!cal.time24;var pm=(hrs>12);if(t12&&pm)hrs-=12;var H=makeTimePart("hour",hrs,t12?1:0,t12?12:23);var span=Calendar.createElement("span",cell);span.innerHTML=":";span.className="colon";var M=makeTimePart("minute",mins,0,59);var AP=null;cell=Calendar.createElement("td",row);cell.className="time";cell.colSpan=2;if(t12)AP=makeTimePart("ampm",pm?"pm":"am",["am","pm"]);else cell.innerHTML=" ";cal.onSetTime=function(){var pm,hrs=this.date.getHours(),mins=this.date.getMinutes();if(t12){pm=(hrs>=12);if(pm)hrs-=12;if(hrs==0)hrs=12;AP.innerHTML=pm?"pm":"am";}H.innerHTML=(hrs<10)?("0"+hrs):hrs;M.innerHTML=(mins<10)?("0"+mins):mins;};cal.onUpdateTime=function(){var date=this.date;var h=parseInt(H.innerHTML,10);if(t12){if(/pm/i.test(AP.innerHTML)&&h<12)h+=12;else if(/am/i.test(AP.innerHTML)&&h==12)h=0;}var d=date.getDate();var m=date.getMonth();var y=date.getFullYear();date.setHours(h);date.setMinutes(parseInt(M.innerHTML,10));date.setFullYear(y);date.setMonth(m);date.setDate(d);this.dateClicked=false;this.callHandler();};})();}else{this.onSetTime=this.onUpdateTime=function(){};}var tfoot=Calendar.createElement("tfoot",table);row=Calendar.createElement("tr",tfoot);row.className="footrow";cell=hh(Calendar._TT["SEL_DATE"],this.weekNumbers?8:7,300);cell.className="ttip";if(this.isPopup){cell.ttip=Calendar._TT["DRAG_TO_MOVE"];cell.style.cursor="move";}this.tooltips=cell;div=Calendar.createElement("div",this.element);this.monthsCombo=div;div.className="combo";for(i=0;i0;--i){var yr=Calendar.createElement("div");yr.className=Calendar.is_ie?"label-IEfix":"label";div.appendChild(yr);}this._init(this.firstDayOfWeek,this.date);parent.appendChild(this.element);};Calendar._keyEvent=function(ev){var cal=window._dynarch_popupCalendar;if(!cal||cal.multiple)return false;(Calendar.is_ie)&&(ev=window.event);var act=(Calendar.is_ie||ev.type=="keypress"),K=ev.keyCode;if(ev.ctrlKey){switch(K){case 37:act&&Calendar.cellClick(cal._nav_pm);break;case 38:act&&Calendar.cellClick(cal._nav_py);break;case 39:act&&Calendar.cellClick(cal._nav_nm);break;case 40:act&&Calendar.cellClick(cal._nav_ny);break;default:return false;}}else switch(K){case 32:Calendar.cellClick(cal._nav_now);break;case 27:act&&cal.callCloseHandler();break;case 37:case 38:case 39:case 40:if(act){var prev,x,y,ne,el,step;prev=K==37||K==38;step=(K==37||K==39)?1:7;function setVars(){el=cal.currentDateEl;var p=el.pos;x=p&15;y=p>>4;ne=cal.ar_days[y][x];};setVars();function prevMonth(){var date=new Date(cal.date);date.setDate(date.getDate()-step);cal.setDate(date);};function nextMonth(){var date=new Date(cal.date);date.setDate(date.getDate()+step);cal.setDate(date);};while(1){switch(K){case 37:if(--x>=0)ne=cal.ar_days[y][x];else{x=6;K=38;continue;}break;case 38:if(--y>=0)ne=cal.ar_days[y][x];else{prevMonth();setVars();}break;case 39:if(++x<7)ne=cal.ar_days[y][x];else{x=0;K=40;continue;}break;case 40:if(++ythis.maxYear){year=this.maxYear;date.setFullYear(year);}this.firstDayOfWeek=firstDayOfWeek;this.date=new Date(date);var month=date.getMonth();var mday=date.getDate();var no_days=date.getMonthDays();date.setDate(1);var day1=(date.getDay()-this.firstDayOfWeek)%7;if(day1<0)day1+=7;date.setDate(-day1);date.setDate(date.getDate()+1);var row=this.tbody.firstChild;var MN=Calendar._SMN[month];var ar_days=this.ar_days=new Array();var weekend=Calendar._TT["WEEKEND"];var dates=this.multiple?(this.datesCells={}):null;for(var i=0;i<6;++i,row=row.nextSibling){var cell=row.firstChild;if(this.weekNumbers){cell.className="day wn";cell.innerHTML=date.getWeekNumber();cell=cell.nextSibling;}row.className="daysrow";var hasdays=false,iday,dpos=ar_days[i]=[];for(var j=0;j<7;++j,cell=cell.nextSibling,date.setDate(iday+1)){iday=date.getDate();var wday=date.getDay();cell.className="day";cell.pos=i<<4|j;dpos[j]=cell;var current_month=(date.getMonth()==month);if(!current_month){if(this.showsOtherMonths){cell.className+=" othermonth";cell.otherMonth=true;}else{cell.className="emptycell";cell.innerHTML=" ";cell.disabled=true;continue;}}else{cell.otherMonth=false;hasdays=true;}cell.disabled=false;cell.innerHTML=this.getDateText?this.getDateText(date,iday):iday;if(dates)dates[date.print("%Y%m%d")]=cell;if(this.getDateStatus){var status=this.getDateStatus(date,year,month,iday);if(this.getDateToolTip){var toolTip=this.getDateToolTip(date,year,month,iday);if(toolTip)cell.title=toolTip;}if(status===true){cell.className+=" disabled";cell.disabled=true;}else{if(/disabled/i.test(status))cell.disabled=true;cell.className+=" "+status;}}if(!cell.disabled){cell.caldate=new Date(date);cell.ttip="_";if(!this.multiple&¤t_month&&iday==mday&&this.hiliteToday){cell.className+=" selected";this.currentDateEl=cell;}if(date.getFullYear()==TY&&date.getMonth()==TM&&iday==TD){cell.className+=" today";cell.ttip+=Calendar._TT["PART_TODAY"];}if(weekend.indexOf(wday.toString())!=-1)cell.className+=cell.otherMonth?" oweekend":" weekend";}}if(!(hasdays||this.showsOtherMonths))row.className="emptyrow";}this.title.innerHTML=Calendar._MN[month]+", "+year;this.onSetTime();this.table.style.visibility="visible";this._initMultipleDates();};Calendar.prototype._initMultipleDates=function(){if(this.multiple){for(var i in this.multiple){var cell=this.datesCells[i];var d=this.multiple[i];if(!d)continue;if(cell)cell.className+=" selected";}}};Calendar.prototype._toggleMultipleDate=function(date){if(this.multiple){var ds=date.print("%Y%m%d");var cell=this.datesCells[ds];if(cell){var d=this.multiple[ds];if(!d){Calendar.addClass(cell,"selected");this.multiple[ds]=date;}else{Calendar.removeClass(cell,"selected");delete this.multiple[ds];}}}};Calendar.prototype.setDateToolTipHandler=function(unaryFunction){this.getDateToolTip=unaryFunction;};Calendar.prototype.setDate=function(date){if(!date.equalsTo(this.date)){this._init(this.firstDayOfWeek,date);}};Calendar.prototype.refresh=function(){this._init(this.firstDayOfWeek,this.date);};Calendar.prototype.setFirstDayOfWeek=function(firstDayOfWeek){this._init(firstDayOfWeek,this.date);this._displayWeekdays();};Calendar.prototype.setDateStatusHandler=Calendar.prototype.setDisabledHandler=function(unaryFunction){this.getDateStatus=unaryFunction;};Calendar.prototype.setRange=function(a,z){this.minYear=a;this.maxYear=z;};Calendar.prototype.callHandler=function(){if(this.onSelected){this.onSelected(this,this.date.print(this.dateFormat));}};Calendar.prototype.callCloseHandler=function(){if(this.onClose){this.onClose(this);}this.hideShowCovered();};Calendar.prototype.destroy=function(){var el=this.element.parentNode;el.removeChild(this.element);Calendar._C=null;window._dynarch_popupCalendar=null;};Calendar.prototype.reparent=function(new_parent){var el=this.element;el.parentNode.removeChild(el);new_parent.appendChild(el);};Calendar._checkCalendar=function(ev){var calendar=window._dynarch_popupCalendar;if(!calendar){return false;}var el=Calendar.is_ie?Calendar.getElement(ev):Calendar.getTargetElement(ev);for(;el!=null&&el!=calendar.element;el=el.parentNode);if(el==null){window._dynarch_popupCalendar.callCloseHandler();return Calendar.stopEvent(ev);}};Calendar.prototype.show=function(){var rows=this.table.getElementsByTagName("tr");for(var i=rows.length;i>0;){var row=rows[--i];Calendar.removeClass(row,"rowhilite");var cells=row.getElementsByTagName("td");for(var j=cells.length;j>0;){var cell=cells[--j];Calendar.removeClass(cell,"hilite");Calendar.removeClass(cell,"active");}}this.element.style.display="block";this.hidden=false;if(this.isPopup){window._dynarch_popupCalendar=this;Calendar.addEvent(document,"keydown",Calendar._keyEvent);Calendar.addEvent(document,"keypress",Calendar._keyEvent);Calendar.addEvent(document,"mousedown",Calendar._checkCalendar);}this.hideShowCovered();};Calendar.prototype.hide=function(){if(this.isPopup){Calendar.removeEvent(document,"keydown",Calendar._keyEvent);Calendar.removeEvent(document,"keypress",Calendar._keyEvent);Calendar.removeEvent(document,"mousedown",Calendar._checkCalendar);}this.element.style.display="none";this.hidden=true;this.hideShowCovered();};Calendar.prototype.showAt=function(x,y){var s=this.element.style;s.left=x+"px";s.top=y+"px";this.show();};Calendar.prototype.showAtElement=function(el,opts){var self=this;var p=Calendar.getAbsolutePos(el);if(!opts||typeof opts!="string"){this.showAt(p.x,p.y+el.offsetHeight);return true;}function fixPosition(box){if(box.x<0)box.x=0;if(box.y<0)box.y=0;var cp=document.createElement("div");var s=cp.style;s.position="absolute";s.right=s.bottom=s.width=s.height="0px";document.body.appendChild(cp);var br=Calendar.getAbsolutePos(cp);document.body.removeChild(cp);if(Calendar.is_ie){br.y+=document.body.scrollTop;br.x+=document.body.scrollLeft;}else{br.y+=window.scrollY;br.x+=window.scrollX;}var tmp=box.x+box.width-br.x;if(tmp>0)box.x-=tmp;tmp=box.y+box.height-br.y;if(tmp>0)box.y-=tmp;};this.element.style.display="block";Calendar.continuation_for_the_fucking_khtml_browser=function(){var w=self.element.offsetWidth;var h=self.element.offsetHeight;self.element.style.display="none";var valign=opts.substr(0,1);var halign="l";if(opts.length>1){halign=opts.substr(1,1);}switch(valign){case "T":p.y-=h;break;case "B":p.y+=el.offsetHeight;break;case "C":p.y+=(el.offsetHeight-h)/2;break;case "t":p.y+=el.offsetHeight-h;break;case "b":break;}switch(halign){case "L":p.x-=w;break;case "R":p.x+=el.offsetWidth;break;case "C":p.x+=(el.offsetWidth-w)/2;break;case "l":p.x+=el.offsetWidth-w;break;case "r":break;}p.width=w;p.height=h+40;self.monthsCombo.style.display="none";fixPosition(p);self.showAt(p.x,p.y);};if(Calendar.is_khtml)setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()",10);else Calendar.continuation_for_the_fucking_khtml_browser();};Calendar.prototype.setDateFormat=function(str){this.dateFormat=str;};Calendar.prototype.setTtDateFormat=function(str){this.ttDateFormat=str;};Calendar.prototype.parseDate=function(str,fmt){if(!fmt)fmt=this.dateFormat;this.setDate(Date.parseDate(str,fmt));};Calendar.prototype.hideShowCovered=function(){if(!Calendar.is_ie&&!Calendar.is_opera)return;function getVisib(obj){var value=obj.style.visibility;if(!value){if(document.defaultView&&typeof(document.defaultView.getComputedStyle)=="function"){if(!Calendar.is_khtml)value=document.defaultView. getComputedStyle(obj,"").getPropertyValue("visibility");else value='';}else if(obj.currentStyle){value=obj.currentStyle.visibility;}else value='';}return value;};var tags=new Array("applet","iframe","select");var el=this.element;var p=Calendar.getAbsolutePos(el);var EX1=p.x;var EX2=el.offsetWidth+EX1;var EY1=p.y;var EY2=el.offsetHeight+EY1;for(var k=tags.length;k>0;){var ar=document.getElementsByTagName(tags[--k]);var cc=null;for(var i=ar.length;i>0;){cc=ar[--i];p=Calendar.getAbsolutePos(cc);var CX1=p.x;var CX2=cc.offsetWidth+CX1;var CY1=p.y;var CY2=cc.offsetHeight+CY1;if(this.hidden||(CX1>EX2)||(CX2EY2)||(CY229)?1900:2000);break;case "%b":case "%B":for(j=0;j<12;++j){if(Calendar._MN[j].substr(0,a[i].length).toLowerCase()==a[i].toLowerCase()){m=j;break;}}break;case "%H":case "%I":case "%k":case "%l":hr=parseInt(a[i],10);break;case "%P":case "%p":if(/pm/i.test(a[i])&&hr<12)hr+=12;else if(/am/i.test(a[i])&&hr>=12)hr-=12;break;case "%M":min=parseInt(a[i],10);break;}}if(isNaN(y))y=today.getFullYear();if(isNaN(m))m=today.getMonth();if(isNaN(d))d=today.getDate();if(isNaN(hr))hr=today.getHours();if(isNaN(min))min=today.getMinutes();if(y!=0&&m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);y=0;m=-1;d=0;for(i=0;i31&&y==0){y=parseInt(a[i],10);(y<100)&&(y+=(y>29)?1900:2000);}else if(d==0){d=a[i];}}if(y==0)y=today.getFullYear();if(m!=-1&&d!=0)return new Date(y,m,d,hr,min,0);return today;};Date.prototype.getMonthDays=function(month){var year=this.getFullYear();if(typeof month=="undefined"){month=this.getMonth();}if(((0==(year%4))&&((0!=(year%100))||(0==(year%400))))&&month==1){return 29;}else{return Date._MD[month];}};Date.prototype.getDayOfYear=function(){var now=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var then=new Date(this.getFullYear(),0,0,0,0,0);var time=now-then;return Math.floor(time/Date.DAY);};Date.prototype.getWeekNumber=function(){var d=new Date(this.getFullYear(),this.getMonth(),this.getDate(),0,0,0);var DoW=d.getDay();d.setDate(d.getDate()-(DoW+6)%7+3);var ms=d.valueOf();d.setMonth(0);d.setDate(4);return Math.round((ms-d.valueOf())/(7*864e5))+1;};Date.prototype.equalsTo=function(date){return((this.getFullYear()==date.getFullYear())&&(this.getMonth()==date.getMonth())&&(this.getDate()==date.getDate())&&(this.getHours()==date.getHours())&&(this.getMinutes()==date.getMinutes()));};Date.prototype.setDateOnly=function(date){var tmp=new Date(date);this.setDate(1);this.setFullYear(tmp.getFullYear());this.setMonth(tmp.getMonth());this.setDate(tmp.getDate());};Date.prototype.print=function(str){var m=this.getMonth();var d=this.getDate();var y=this.getFullYear();var wn=this.getWeekNumber();var w=this.getDay();var s={};var hr=this.getHours();var pm=(hr>=12);var ir=(pm)?(hr-12):hr;var dy=this.getDayOfYear();if(ir==0)ir=12;var min=this.getMinutes();var sec=this.getSeconds();s["%a"]=Calendar._SDN[w];s["%A"]=Calendar._DN[w];s["%b"]=Calendar._SMN[m];s["%B"]=Calendar._MN[m];s["%C"]=1+Math.floor(y/100);s["%d"]=(d<10)?("0"+d):d;s["%e"]=d;s["%H"]=(hr<10)?("0"+hr):hr;s["%I"]=(ir<10)?("0"+ir):ir;s["%j"]=(dy<100)?((dy<10)?("00"+dy):("0"+dy)):dy;s["%k"]=hr;s["%l"]=ir;s["%m"]=(m<9)?("0"+(1+m)):(1+m);s["%M"]=(min<10)?("0"+min):min;s["%n"]="\n";s["%p"]=pm?"PM":"AM";s["%P"]=pm?"pm":"am";s["%s"]=Math.floor(this.getTime()/1000);s["%S"]=(sec<10)?("0"+sec):sec;s["%t"]="\t";s["%U"]=s["%W"]=s["%V"]=(wn<10)?("0"+wn):wn;s["%u"]=w+1;s["%w"]=w;s["%y"]=(''+y).substr(2,2);s["%Y"]=y;s["%%"]="%";var re=/%./g;if(!Calendar.is_ie5&&!Calendar.is_khtml)return str.replace(re,function(par){return s[par]||par;});var a=str.match(re);for(var i=0;i 0;) { ar[--i] = Calendar._DN[i].substr(0, Calendar._SDN_len); } Calendar._SDN = ar; if (typeof Calendar._SMN_len == "undefined") Calendar._SMN_len = 3; ar = new Array(); for (var i = 12; i > 0;) { ar[--i] = Calendar._MN[i].substr(0, Calendar._SMN_len); } Calendar._SMN = ar; } }; Calendar._C = null; Calendar.is_ie = (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)); Calendar.is_ie5 = (Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent)); Calendar.is_opera = /opera/i.test(navigator.userAgent); Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); Calendar.getAbsolutePos = function (el) { var SL = 0, ST = 0; var is_div = /^div$/i.test(el.tagName); if (is_div && el.scrollLeft) SL = el.scrollLeft; if (is_div && el.scrollTop) ST = el.scrollTop; var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST }; if (el.offsetParent) { var tmp = this.getAbsolutePos(el.offsetParent); r.x += tmp.x; r.y += tmp.y; } return r; }; Calendar.isRelated = function (el, evt) { var related = evt.relatedTarget; if (!related) { var type = evt.type; if (type == "mouseover") { related = evt.fromElement; } else if (type == "mouseout") { related = evt.toElement; } } while (related) { if (related == el) { return true; } related = related.parentNode; } return false; }; Calendar.removeClass = function (el, className) { if (!(el && el.className)) { return; } var cls = el.className.split(" "); var ar = new Array(); for (var i = cls.length; i > 0;) { if (cls[--i] != className) { ar[ar.length] = cls[i]; } } el.className = ar.join(" "); }; Calendar.addClass = function (el, className) { Calendar.removeClass(el, className); el.className += " " + className; }; Calendar.getElement = function (ev) { var f = Calendar.is_ie ? window.event.srcElement : ev.currentTarget; while (f.nodeType != 1 || /^div$/i.test(f.tagName)) f = f.parentNode; return f; }; Calendar.getTargetElement = function (ev) { var f = Calendar.is_ie ? window.event.srcElement : ev.target; while (f.nodeType != 1) f = f.parentNode; return f; }; Calendar.stopEvent = function (ev) { ev || (ev = window.event); if (Calendar.is_ie) { ev.cancelBubble = true; ev.returnValue = false; } else { ev.preventDefault(); ev.stopPropagation(); } return false; }; Calendar.addEvent = function (el, evname, func) { if (el.attachEvent) { el.attachEvent("on" + evname, func); } else if (el.addEventListener) { el.addEventListener(evname, func, true); } else { el["on" + evname] = func; } }; Calendar.removeEvent = function (el, evname, func) { if (el.detachEvent) { el.detachEvent("on" + evname, func); } else if (el.removeEventListener) { el.removeEventListener(evname, func, true); } else { el["on" + evname] = null; } }; Calendar.createElement = function (type, parent) { var el = null; if (document.createElementNS) { el = document.createElementNS("http://www.w3.org/1999/xhtml", type); } else { el = document.createElement(type); } if (typeof parent != "undefined") { parent.appendChild(el); } return el; }; Calendar._add_evs = function (el) { with (Calendar) { addEvent(el, "mouseover", dayMouseOver); addEvent(el, "mousedown", dayMouseDown); addEvent(el, "mouseout", dayMouseOut); if (is_ie) { addEvent(el, "dblclick", dayMouseDblClick); el.setAttribute("unselectable", true); } } }; Calendar.findMonth = function (el) { if (typeof el.month != "undefined") { return el; } else if (typeof el.parentNode.month != "undefined") { return el.parentNode; } return null; }; Calendar.findYear = function (el) { if (typeof el.year != "undefined") { return el; } else if (typeof el.parentNode.year != "undefined") { return el.parentNode; } return null; }; Calendar.showMonthsCombo = function () { var cal = Calendar._C; if (!cal) { return false; } var cal = cal; var cd = cal.activeDiv; var mc = cal.monthsCombo; if (cal.hilitedMonth) { Calendar.removeClass(cal.hilitedMonth, "hilite"); } if (cal.activeMonth) { Calendar.removeClass(cal.activeMonth, "active"); } var mon = cal.monthsCombo.getElementsByTagName("div")[cal.date.getMonth()]; Calendar.addClass(mon, "active"); cal.activeMonth = mon; var s = mc.style; s.display = "block"; if (cd.navtype < 0) s.left = cd.offsetLeft + "px"; else { var mcw = mc.offsetWidth; if (typeof mcw == "undefined") mcw = 50; s.left = (cd.offsetLeft + cd.offsetWidth - mcw) + "px"; } s.top = (cd.offsetTop + cd.offsetHeight) + "px"; }; Calendar.showYearsCombo = function (fwd) { var cal = Calendar._C; if (!cal) { return false; } var cal = cal; var cd = cal.activeDiv; var yc = cal.yearsCombo; if (cal.hilitedYear) { Calendar.removeClass(cal.hilitedYear, "hilite"); } if (cal.activeYear) { Calendar.removeClass(cal.activeYear, "active"); } cal.activeYear = null; var Y = cal.date.getFullYear() + (fwd ? 1 : -1); var yr = yc.firstChild; var show = false; for (var i = 12; i > 0; --i) { if (Y >= cal.minYear && Y <= cal.maxYear) { yr.innerHTML = Y; yr.year = Y; yr.style.display = "block"; show = true; } else { yr.style.display = "none"; } yr = yr.nextSibling; Y += fwd ? cal.yearStep : -cal.yearStep; } if (show) { var s = yc.style; s.display = "block"; if (cd.navtype < 0) s.left = cd.offsetLeft + "px"; else { var ycw = yc.offsetWidth; if (typeof ycw == "undefined") ycw = 50; s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; } s.top = (cd.offsetTop + cd.offsetHeight) + "px"; } }; Calendar.tableMouseUp = function (ev) { var cal = Calendar._C; if (!cal) { return false; } if (cal.timeout) { clearTimeout(cal.timeout); } var el = cal.activeDiv; if (!el) { return false; } var target = Calendar.getTargetElement(ev); ev || (ev = window.event); Calendar.removeClass(el, "active"); if (target == el || target.parentNode == el) { Calendar.cellClick(el, ev); } var mon = Calendar.findMonth(target); var date = null; if (mon) { date = new Date(cal.date); if (mon.month != date.getMonth()) { date.setMonth(mon.month); cal.setDate(date); cal.dateClicked = false; cal.callHandler(); } } else { var year = Calendar.findYear(target); if (year) { date = new Date(cal.date); if (year.year != date.getFullYear()) { date.setFullYear(year.year); cal.setDate(date); cal.dateClicked = false; cal.callHandler(); } } } with (Calendar) { removeEvent(document, "mouseup", tableMouseUp); removeEvent(document, "mouseover", tableMouseOver); removeEvent(document, "mousemove", tableMouseOver); cal._hideCombos(); _C = null; return stopEvent(ev); } }; Calendar.tableMouseOver = function (ev) { var cal = Calendar._C; if (!cal) { return; } var el = cal.activeDiv; var target = Calendar.getTargetElement(ev); if (target == el || target.parentNode == el) { Calendar.addClass(el, "hilite active"); Calendar.addClass(el.parentNode, "rowhilite"); } else { if (typeof el.navtype == "undefined" || (el.navtype != 50 && (el.navtype == 0 || Math.abs(el.navtype) > 2))) Calendar.removeClass(el, "active"); Calendar.removeClass(el, "hilite"); Calendar.removeClass(el.parentNode, "rowhilite"); } ev || (ev = window.event); if (el.navtype == 50 && target != el) { var pos = Calendar.getAbsolutePos(el); var w = el.offsetWidth; var x = ev.clientX; var dx; var decrease = true; if (x > pos.x + w) { dx = x - pos.x - w; decrease = false; } else dx = pos.x - x; if (dx < 0) dx = 0; var range = el._range; var current = el._current; var count = Math.floor(dx / 10) % range.length; for (var i = range.length; --i >= 0;)if (range[i] == current) break; while (count-- > 0) if (decrease) { if (--i < 0) i = range.length - 1; } else if (++i >= range.length) i = 0; var newval = range[i]; el.innerHTML = newval; cal.onUpdateTime(); } var mon = Calendar.findMonth(target); if (mon) { if (mon.month != cal.date.getMonth()) { if (cal.hilitedMonth) { Calendar.removeClass(cal.hilitedMonth, "hilite"); } Calendar.addClass(mon, "hilite"); cal.hilitedMonth = mon; } else if (cal.hilitedMonth) { Calendar.removeClass(cal.hilitedMonth, "hilite"); } } else { if (cal.hilitedMonth) { Calendar.removeClass(cal.hilitedMonth, "hilite"); } var year = Calendar.findYear(target); if (year) { if (year.year != cal.date.getFullYear()) { if (cal.hilitedYear) { Calendar.removeClass(cal.hilitedYear, "hilite"); } Calendar.addClass(year, "hilite"); cal.hilitedYear = year; } else if (cal.hilitedYear) { Calendar.removeClass(cal.hilitedYear, "hilite"); } } else if (cal.hilitedYear) { Calendar.removeClass(cal.hilitedYear, "hilite"); } } return Calendar.stopEvent(ev); }; Calendar.tableMouseDown = function (ev) { if (Calendar.getTargetElement(ev) == Calendar.getElement(ev)) { return Calendar.stopEvent(ev); } }; Calendar.calDragIt = function (ev) { var cal = Calendar._C; if (!(cal && cal.dragging)) { return false; } var posX; var posY; if (Calendar.is_ie) { posY = window.event.clientY + document.body.scrollTop; posX = window.event.clientX + document.body.scrollLeft; } else { posX = ev.pageX; posY = ev.pageY; } cal.hideShowCovered(); var st = cal.element.style; st.left = (posX - cal.xOffs) + "px"; st.top = (posY - cal.yOffs) + "px"; return Calendar.stopEvent(ev); }; Calendar.calDragEnd = function (ev) { var cal = Calendar._C; if (!cal) { return false; } cal.dragging = false; with (Calendar) { removeEvent(document, "mousemove", calDragIt); removeEvent(document, "mouseup", calDragEnd); tableMouseUp(ev); } cal.hideShowCovered(); }; Calendar.dayMouseDown = function (ev) { var el = Calendar.getElement(ev); if (el.disabled) { return false; } var cal = el.calendar; cal.activeDiv = el; Calendar._C = cal; if (el.navtype != 300) with (Calendar) { if (el.navtype == 50) { el._current = el.innerHTML; addEvent(document, "mousemove", tableMouseOver); } else addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver); addClass(el, "hilite active"); addEvent(document, "mouseup", tableMouseUp); } else if (cal.isPopup) { cal._dragStart(ev); } if (el.navtype == -1 || el.navtype == 1) { if (cal.timeout) clearTimeout(cal.timeout); cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250); } else if (el.navtype == -2 || el.navtype == 2) { if (cal.timeout) clearTimeout(cal.timeout); cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250); } else { cal.timeout = null; } return Calendar.stopEvent(ev); }; Calendar.dayMouseDblClick = function (ev) { Calendar.cellClick(Calendar.getElement(ev), ev || window.event); if (Calendar.is_ie) { document.selection.empty(); } }; Calendar.dayMouseOver = function (ev) { var el = Calendar.getElement(ev); if (Calendar.isRelated(el, ev) || Calendar._C || el.disabled) { return false; } if (el.ttip) { if (el.ttip.substr(0, 1) == "_") { el.ttip = el.caldate.print(el.calendar.ttDateFormat) + el.ttip.substr(1); } el.calendar.tooltips.innerHTML = el.ttip; } if (el.navtype != 300) { Calendar.addClass(el, "hilite"); if (el.caldate) { Calendar.addClass(el.parentNode, "rowhilite"); } } return Calendar.stopEvent(ev); }; Calendar.dayMouseOut = function (ev) { with (Calendar) { var el = getElement(ev); if (isRelated(el, ev) || _C || el.disabled) return false; removeClass(el, "hilite"); if (el.caldate) removeClass(el.parentNode, "rowhilite"); if (el.calendar) el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]; return stopEvent(ev); } }; Calendar.cellClick = function (el, ev) { var cal = el.calendar; var closing = false; var newdate = false; var date = null; if (typeof el.navtype == "undefined") { if (cal.currentDateEl) { Calendar.removeClass(cal.currentDateEl, "selected"); Calendar.addClass(el, "selected"); closing = (cal.currentDateEl == el); if (!closing) { cal.currentDateEl = el; } } cal.date.setDateOnly(el.caldate); date = cal.date; var other_month = !(cal.dateClicked = !el.otherMonth); if (!other_month && !cal.currentDateEl) cal._toggleMultipleDate(new Date(date)); else newdate = !el.disabled; if (other_month) cal._init(cal.firstDayOfWeek, date); } else { if (el.navtype == 200) { Calendar.removeClass(el, "hilite"); cal.callCloseHandler(); return; } date = new Date(cal.date); if (el.navtype == 0) date.setDateOnly(new Date()); cal.dateClicked = false; var year = date.getFullYear(); var mon = date.getMonth(); function setMonth(m) { var day = date.getDate(); var max = date.getMonthDays(m); if (day > max) { date.setDate(max); } date.setMonth(m); }; switch (el.navtype) { case 400: Calendar.removeClass(el, "hilite"); var text = Calendar._TT["ABOUT"]; if (typeof text != "undefined") { text += cal.showsTime ? Calendar._TT["ABOUT_TIME"] : ""; } else { text = "Help and about box text is not translated into this language.\n" + "If you know this language and you feel generous please update\n" + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + "and send it back to to get it into the distribution ;-)\n\n" + "Thank you!\n" + "http://dynarch.com/mishoo/calendar.epl\n"; } alert(text); return; case -2: if (year > cal.minYear) { date.setFullYear(year - 1); } break; case -1: if (mon > 0) { setMonth(mon - 1); } else if (year-- > cal.minYear) { date.setFullYear(year); setMonth(11); } break; case 1: if (mon < 11) { setMonth(mon + 1); } else if (year < cal.maxYear) { date.setFullYear(year + 1); setMonth(0); } break; case 2: if (year < cal.maxYear) { date.setFullYear(year + 1); } break; case 100: cal.setFirstDayOfWeek(el.fdow); return; case 50: var range = el._range; var current = el.innerHTML; for (var i = range.length; --i >= 0;)if (range[i] == current) break; if (ev && ev.shiftKey) { if (--i < 0) i = range.length - 1; } else if (++i >= range.length) i = 0; var newval = range[i]; el.innerHTML = newval; cal.onUpdateTime(); return; case 0: if ((typeof cal.getDateStatus == "function") && cal.getDateStatus(date, date.getFullYear(), date.getMonth(), date.getDate())) { return false; } break; }if (!date.equalsTo(cal.date)) { cal.setDate(date); newdate = true; } else if (el.navtype == 0) newdate = closing = true; } if (newdate) { ev && cal.callHandler(); } if (closing) { Calendar.removeClass(el, "hilite"); ev && cal.callCloseHandler(); } }; Calendar.prototype.create = function (_par) { var parent = null; if (!_par) { parent = document.getElementsByTagName("body")[0]; this.isPopup = true; } else { parent = _par; this.isPopup = false; } this.date = this.dateStr ? new Date(this.dateStr) : new Date(); var table = Calendar.createElement("table"); this.table = table; table.cellSpacing = 0; table.cellPadding = 0; table.calendar = this; Calendar.addEvent(table, "mousedown", Calendar.tableMouseDown); var div = Calendar.createElement("div"); this.element = div; div.className = "calendar"; if (this.isPopup) { div.style.position = "absolute"; div.style.display = "none"; } div.appendChild(table); var thead = Calendar.createElement("thead", table); var cell = null; var row = null; var cal = this; var hh = function (text, cs, navtype) { cell = Calendar.createElement("td", row); cell.colSpan = cs; cell.className = "button"; if (navtype != 0 && Math.abs(navtype) <= 2) cell.className += " nav"; Calendar._add_evs(cell); cell.calendar = cal; cell.navtype = navtype; cell.innerHTML = "
" + text + "
"; return cell; }; row = Calendar.createElement("tr", thead); var title_length = 6; (this.isPopup) && --title_length; (this.weekNumbers) && ++title_length; hh("?", 1, 400).ttip = Calendar._TT["INFO"]; this.title = hh("", title_length, 300); this.title.className = "title"; if (this.isPopup) { this.title.ttip = Calendar._TT["DRAG_TO_MOVE"]; this.title.style.cursor = "move"; hh("×", 1, 200).ttip = Calendar._TT["CLOSE"]; } row = Calendar.createElement("tr", thead); row.className = "headrow"; this._nav_py = hh("«", 1, -2); this._nav_py.ttip = Calendar._TT["PREV_YEAR"]; this._nav_pm = hh("‹", 1, -1); this._nav_pm.ttip = Calendar._TT["PREV_MONTH"]; this._nav_now = hh(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0); this._nav_now.ttip = Calendar._TT["GO_TODAY"]; this._nav_nm = hh("›", 1, 1); this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"]; this._nav_ny = hh("»", 1, 2); this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"]; row = Calendar.createElement("tr", thead); row.className = "daynames"; if (this.weekNumbers) { cell = Calendar.createElement("td", row); cell.className = "name wn"; cell.innerHTML = Calendar._TT["WK"]; } for (var i = 7; i > 0; --i) { cell = Calendar.createElement("td", row); if (!i) { cell.navtype = 100; cell.calendar = this; Calendar._add_evs(cell); } } this.firstdayname = (this.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; this._displayWeekdays(); var tbody = Calendar.createElement("tbody", table); this.tbody = tbody; for (i = 6; i > 0; --i) { row = Calendar.createElement("tr", tbody); if (this.weekNumbers) { cell = Calendar.createElement("td", row); } for (var j = 7; j > 0; --j) { cell = Calendar.createElement("td", row); cell.calendar = this; Calendar._add_evs(cell); } } if (this.showsTime) { row = Calendar.createElement("tr", tbody); row.className = "time"; cell = Calendar.createElement("td", row); cell.className = "time"; cell.colSpan = 2; cell.innerHTML = Calendar._TT["TIME"] || " "; cell = Calendar.createElement("td", row); cell.className = "time"; cell.colSpan = this.weekNumbers ? 4 : 3; (function () { function makeTimePart(className, init, range_start, range_end) { var part = Calendar.createElement("span", cell); part.className = className; part.innerHTML = init; part.calendar = cal; part.ttip = Calendar._TT["TIME_PART"]; part.navtype = 50; part._range = []; if (typeof range_start != "number") part._range = range_start; else { for (var i = range_start; i <= range_end; ++i) { var txt; if (i < 10 && range_end >= 10) txt = '0' + i; else txt = '' + i; part._range[part._range.length] = txt; } } Calendar._add_evs(part); return part; }; var hrs = cal.date.getHours(); var mins = cal.date.getMinutes(); var t12 = !cal.time24; var pm = (hrs > 12); if (t12 && pm) hrs -= 12; var H = makeTimePart("hour", hrs, t12 ? 1 : 0, t12 ? 12 : 23); var span = Calendar.createElement("span", cell); span.innerHTML = ":"; span.className = "colon"; var M = makeTimePart("minute", mins, 0, 59); var AP = null; cell = Calendar.createElement("td", row); cell.className = "time"; cell.colSpan = 2; if (t12) AP = makeTimePart("ampm", pm ? "pm" : "am", ["am", "pm"]); else cell.innerHTML = " "; cal.onSetTime = function () { var pm, hrs = this.date.getHours(), mins = this.date.getMinutes(); if (t12) { pm = (hrs >= 12); if (pm) hrs -= 12; if (hrs == 0) hrs = 12; AP.innerHTML = pm ? "pm" : "am"; } H.innerHTML = (hrs < 10) ? ("0" + hrs) : hrs; M.innerHTML = (mins < 10) ? ("0" + mins) : mins; }; cal.onUpdateTime = function () { var date = this.date; var h = parseInt(H.innerHTML, 10); if (t12) { if (/pm/i.test(AP.innerHTML) && h < 12) h += 12; else if (/am/i.test(AP.innerHTML) && h == 12) h = 0; } var d = date.getDate(); var m = date.getMonth(); var y = date.getFullYear(); date.setHours(h); date.setMinutes(parseInt(M.innerHTML, 10)); date.setFullYear(y); date.setMonth(m); date.setDate(d); this.dateClicked = false; this.callHandler(); }; })(); } else { this.onSetTime = this.onUpdateTime = function () { }; } var tfoot = Calendar.createElement("tfoot", table); row = Calendar.createElement("tr", tfoot); row.className = "footrow"; cell = hh(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300); cell.className = "ttip"; if (this.isPopup) { cell.ttip = Calendar._TT["DRAG_TO_MOVE"]; cell.style.cursor = "move"; } this.tooltips = cell; div = Calendar.createElement("div", this.element); this.monthsCombo = div; div.className = "combo"; for (i = 0; i < Calendar._MN.length; ++i) { var mn = Calendar.createElement("div"); mn.className = Calendar.is_ie ? "label-IEfix" : "label"; mn.month = i; mn.innerHTML = Calendar._SMN[i]; div.appendChild(mn); } div = Calendar.createElement("div", this.element); this.yearsCombo = div; div.className = "combo"; for (i = 12; i > 0; --i) { var yr = Calendar.createElement("div"); yr.className = Calendar.is_ie ? "label-IEfix" : "label"; div.appendChild(yr); } this._init(this.firstDayOfWeek, this.date); parent.appendChild(this.element); }; Calendar._keyEvent = function (ev) { var cal = window._dynarch_popupCalendar; if (!cal || cal.multiple) return false; (Calendar.is_ie) && (ev = window.event); var act = (Calendar.is_ie || ev.type == "keypress"), K = ev.keyCode; if (ev.ctrlKey) { switch (K) { case 37: act && Calendar.cellClick(cal._nav_pm); break; case 38: act && Calendar.cellClick(cal._nav_py); break; case 39: act && Calendar.cellClick(cal._nav_nm); break; case 40: act && Calendar.cellClick(cal._nav_ny); break; default: return false; } } else switch (K) { case 32: Calendar.cellClick(cal._nav_now); break; case 27: act && cal.callCloseHandler(); break; case 37: case 38: case 39: case 40: if (act) { var prev, x, y, ne, el, step; prev = K == 37 || K == 38; step = (K == 37 || K == 39) ? 1 : 7; function setVars() { el = cal.currentDateEl; var p = el.pos; x = p & 15; y = p >> 4; ne = cal.ar_days[y][x]; }; setVars(); function prevMonth() { var date = new Date(cal.date); date.setDate(date.getDate() - step); cal.setDate(date); }; function nextMonth() { var date = new Date(cal.date); date.setDate(date.getDate() + step); cal.setDate(date); }; while (1) { switch (K) { case 37: if (--x >= 0) ne = cal.ar_days[y][x]; else { x = 6; K = 38; continue; } break; case 38: if (--y >= 0) ne = cal.ar_days[y][x]; else { prevMonth(); setVars(); } break; case 39: if (++x < 7) ne = cal.ar_days[y][x]; else { x = 0; K = 40; continue; } break; case 40: if (++y < cal.ar_days.length) ne = cal.ar_days[y][x]; else { nextMonth(); setVars(); } break; }break; } if (ne) { if (!ne.disabled) Calendar.cellClick(ne); else if (prev) prevMonth(); else nextMonth(); } } break; case 13: if (act) Calendar.cellClick(cal.currentDateEl, ev); break; default: return false; }return Calendar.stopEvent(ev); }; Calendar.prototype._init = function (firstDayOfWeek, date) { var today = new Date(), TY = today.getFullYear(), TM = today.getMonth(), TD = today.getDate(); this.table.style.visibility = "hidden"; var year = date.getFullYear(); if (year < this.minYear) { year = this.minYear; date.setFullYear(year); } else if (year > this.maxYear) { year = this.maxYear; date.setFullYear(year); } this.firstDayOfWeek = firstDayOfWeek; this.date = new Date(date); var month = date.getMonth(); var mday = date.getDate(); var no_days = date.getMonthDays(); date.setDate(1); var day1 = (date.getDay() - this.firstDayOfWeek) % 7; if (day1 < 0) day1 += 7; date.setDate(-day1); date.setDate(date.getDate() + 1); var row = this.tbody.firstChild; var MN = Calendar._SMN[month]; var ar_days = this.ar_days = new Array(); var weekend = Calendar._TT["WEEKEND"]; var dates = this.multiple ? (this.datesCells = {}) : null; for (var i = 0; i < 6; ++i, row = row.nextSibling) { var cell = row.firstChild; if (this.weekNumbers) { cell.className = "day wn"; cell.innerHTML = date.getWeekNumber(); cell = cell.nextSibling; } row.className = "daysrow"; var hasdays = false, iday, dpos = ar_days[i] = []; for (var j = 0; j < 7; ++j, cell = cell.nextSibling, date.setDate(iday + 1)) { iday = date.getDate(); var wday = date.getDay(); cell.className = "day"; cell.pos = i << 4 | j; dpos[j] = cell; var current_month = (date.getMonth() == month); if (!current_month) { if (this.showsOtherMonths) { cell.className += " othermonth"; cell.otherMonth = true; } else { cell.className = "emptycell"; cell.innerHTML = " "; cell.disabled = true; continue; } } else { cell.otherMonth = false; hasdays = true; } cell.disabled = false; cell.innerHTML = this.getDateText ? this.getDateText(date, iday) : iday; if (dates) dates[date.print("%Y%m%d")] = cell; if (this.getDateStatus) { var status = this.getDateStatus(date, year, month, iday); if (this.getDateToolTip) { var toolTip = this.getDateToolTip(date, year, month, iday); if (toolTip) cell.title = toolTip; } if (status === true) { cell.className += " disabled"; cell.disabled = true; } else { if (/disabled/i.test(status)) cell.disabled = true; cell.className += " " + status; } } if (!cell.disabled) { cell.caldate = new Date(date); cell.ttip = "_"; if (!this.multiple && current_month && iday == mday && this.hiliteToday) { cell.className += " selected"; this.currentDateEl = cell; } if (date.getFullYear() == TY && date.getMonth() == TM && iday == TD) { cell.className += " today"; cell.ttip += Calendar._TT["PART_TODAY"]; } if (weekend.indexOf(wday.toString()) != -1) cell.className += cell.otherMonth ? " oweekend" : " weekend"; } } if (!(hasdays || this.showsOtherMonths)) row.className = "emptyrow"; } this.title.innerHTML = Calendar._MN[month] + ", " + year; this.onSetTime(); this.table.style.visibility = "visible"; this._initMultipleDates(); }; Calendar.prototype._initMultipleDates = function () { if (this.multiple) { for (var i in this.multiple) { var cell = this.datesCells[i]; var d = this.multiple[i]; if (!d) continue; if (cell) cell.className += " selected"; } } }; Calendar.prototype._toggleMultipleDate = function (date) { if (this.multiple) { var ds = date.print("%Y%m%d"); var cell = this.datesCells[ds]; if (cell) { var d = this.multiple[ds]; if (!d) { Calendar.addClass(cell, "selected"); this.multiple[ds] = date; } else { Calendar.removeClass(cell, "selected"); delete this.multiple[ds]; } } } }; Calendar.prototype.setDateToolTipHandler = function (unaryFunction) { this.getDateToolTip = unaryFunction; }; Calendar.prototype.setDate = function (date) { if (!date.equalsTo(this.date)) { this._init(this.firstDayOfWeek, date); } }; Calendar.prototype.refresh = function () { this._init(this.firstDayOfWeek, this.date); }; Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { this._init(firstDayOfWeek, this.date); this._displayWeekdays(); }; Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { this.getDateStatus = unaryFunction; }; Calendar.prototype.setRange = function (a, z) { this.minYear = a; this.maxYear = z; }; Calendar.prototype.callHandler = function () { if (this.onSelected) { this.onSelected(this, this.date.print(this.dateFormat)); } }; Calendar.prototype.callCloseHandler = function () { if (this.onClose) { this.onClose(this); } this.hideShowCovered(); }; Calendar.prototype.destroy = function () { var el = this.element.parentNode; el.removeChild(this.element); Calendar._C = null; window._dynarch_popupCalendar = null; }; Calendar.prototype.reparent = function (new_parent) { var el = this.element; el.parentNode.removeChild(el); new_parent.appendChild(el); }; Calendar._checkCalendar = function (ev) { var calendar = window._dynarch_popupCalendar; if (!calendar) { return false; } var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev); for (; el != null && el != calendar.element; el = el.parentNode); if (el == null) { window._dynarch_popupCalendar.callCloseHandler(); return Calendar.stopEvent(ev); } }; Calendar.prototype.show = function () { var rows = this.table.getElementsByTagName("tr"); for (var i = rows.length; i > 0;) { var row = rows[--i]; Calendar.removeClass(row, "rowhilite"); var cells = row.getElementsByTagName("td"); for (var j = cells.length; j > 0;) { var cell = cells[--j]; Calendar.removeClass(cell, "hilite"); Calendar.removeClass(cell, "active"); } } this.element.style.display = "block"; this.hidden = false; if (this.isPopup) { window._dynarch_popupCalendar = this; Calendar.addEvent(document, "keydown", Calendar._keyEvent); Calendar.addEvent(document, "keypress", Calendar._keyEvent); Calendar.addEvent(document, "mousedown", Calendar._checkCalendar); } this.hideShowCovered(); }; Calendar.prototype.hide = function () { if (this.isPopup) { Calendar.removeEvent(document, "keydown", Calendar._keyEvent); Calendar.removeEvent(document, "keypress", Calendar._keyEvent); Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar); } this.element.style.display = "none"; this.hidden = true; this.hideShowCovered(); }; Calendar.prototype.showAt = function (x, y) { var s = this.element.style; s.left = x + "px"; s.top = y + "px"; this.show(); }; Calendar.prototype.showAtElement = function (el, opts) { var self = this; var p = Calendar.getAbsolutePos(el); if (!opts || typeof opts != "string") { this.showAt(p.x, p.y + el.offsetHeight); return true; } function fixPosition(box) { if (box.x < 0) box.x = 0; if (box.y < 0) box.y = 0; var cp = document.createElement("div"); var s = cp.style; s.position = "absolute"; s.right = s.bottom = s.width = s.height = "0px"; document.body.appendChild(cp); var br = Calendar.getAbsolutePos(cp); document.body.removeChild(cp); if (Calendar.is_ie) { br.y += document.body.scrollTop; br.x += document.body.scrollLeft; } else { br.y += window.scrollY; br.x += window.scrollX; } var tmp = box.x + box.width - br.x; if (tmp > 0) box.x -= tmp; tmp = box.y + box.height - br.y; if (tmp > 0) box.y -= tmp; }; this.element.style.display = "block"; Calendar.continuation_for_the_fucking_khtml_browser = function () { var w = self.element.offsetWidth; var h = self.element.offsetHeight; self.element.style.display = "none"; var valign = opts.substr(0, 1); var halign = "l"; if (opts.length > 1) { halign = opts.substr(1, 1); } switch (valign) { case "T": p.y -= h; break; case "B": p.y += el.offsetHeight; break; case "C": p.y += (el.offsetHeight - h) / 2; break; case "t": p.y += el.offsetHeight - h; break; case "b": break; }switch (halign) { case "L": p.x -= w; break; case "R": p.x += el.offsetWidth; break; case "C": p.x += (el.offsetWidth - w) / 2; break; case "l": p.x += el.offsetWidth - w; break; case "r": break; }p.width = w; p.height = h + 40; self.monthsCombo.style.display = "none"; fixPosition(p); self.showAt(p.x, p.y); }; if (Calendar.is_khtml) setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10); else Calendar.continuation_for_the_fucking_khtml_browser(); }; Calendar.prototype.setDateFormat = function (str) { this.dateFormat = str; }; Calendar.prototype.setTtDateFormat = function (str) { this.ttDateFormat = str; }; Calendar.prototype.parseDate = function (str, fmt) { if (!fmt) fmt = this.dateFormat; this.setDate(Date.parseDate(str, fmt)); }; Calendar.prototype.hideShowCovered = function () { if (!Calendar.is_ie && !Calendar.is_opera) return; function getVisib(obj) { var value = obj.style.visibility; if (!value) { if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { if (!Calendar.is_khtml) value = document.defaultView.getComputedStyle(obj, "").getPropertyValue("visibility"); else value = ''; } else if (obj.currentStyle) { value = obj.currentStyle.visibility; } else value = ''; } return value; }; var tags = new Array("applet", "iframe", "select"); var el = this.element; var p = Calendar.getAbsolutePos(el); var EX1 = p.x; var EX2 = el.offsetWidth + EX1; var EY1 = p.y; var EY2 = el.offsetHeight + EY1; for (var k = tags.length; k > 0;) { var ar = document.getElementsByTagName(tags[--k]); var cc = null; for (var i = ar.length; i > 0;) { cc = ar[--i]; p = Calendar.getAbsolutePos(cc); var CX1 = p.x; var CX2 = cc.offsetWidth + CX1; var CY1 = p.y; var CY2 = cc.offsetHeight + CY1; if (this.hidden || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) { if (!cc.__msh_save_visibility) { cc.__msh_save_visibility = getVisib(cc); } cc.style.visibility = cc.__msh_save_visibility; } else { if (!cc.__msh_save_visibility) { cc.__msh_save_visibility = getVisib(cc); } cc.style.visibility = "hidden"; } } } }; Calendar.prototype._displayWeekdays = function () { var fdow = this.firstDayOfWeek; var cell = this.firstdayname; var weekend = Calendar._TT["WEEKEND"]; for (var i = 0; i < 7; ++i) { cell.className = "day name"; var realday = (i + fdow) % 7; if (i) { cell.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[realday]); cell.navtype = 100; cell.calendar = this; cell.fdow = realday; Calendar._add_evs(cell); } if (weekend.indexOf(realday.toString()) != -1) { Calendar.addClass(cell, "weekend"); } cell.innerHTML = Calendar._SDN[(i + fdow) % 7]; cell = cell.nextSibling; } }; Calendar.prototype._hideCombos = function () { this.monthsCombo.style.display = "none"; this.yearsCombo.style.display = "none"; }; Calendar.prototype._dragStart = function (ev) { if (this.dragging) { return; } this.dragging = true; var posX; var posY; if (Calendar.is_ie) { posY = window.event.clientY + document.body.scrollTop; posX = window.event.clientX + document.body.scrollLeft; } else { posY = ev.clientY + window.scrollY; posX = ev.clientX + window.scrollX; } var st = this.element.style; this.xOffs = posX - parseInt(st.left); this.yOffs = posY - parseInt(st.top); with (Calendar) { addEvent(document, "mousemove", calDragIt); addEvent(document, "mouseup", calDragEnd); } }; Date._MD = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); Date.SECOND = 1000; Date.MINUTE = 60 * Date.SECOND; Date.HOUR = 60 * Date.MINUTE; Date.DAY = 24 * Date.HOUR; Date.WEEK = 7 * Date.DAY; Date.parseDate = function (str, fmt) { var today = new Date(); var y = 0; var m = -1; var d = 0; var a = str.split(/\W+/); var b = fmt.match(/%./g); var i = 0, j = 0; var hr = 0; var min = 0; for (i = 0; i < a.length; ++i) { if (!a[i]) continue; switch (b[i]) { case "%d": case "%e": d = parseInt(a[i], 10); break; case "%m": m = parseInt(a[i], 10) - 1; break; case "%Y": case "%y": y = parseInt(a[i], 10); (y < 100) && (y += (y > 29) ? 1900 : 2000); break; case "%b": case "%B": for (j = 0; j < 12; ++j) { if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; } } break; case "%H": case "%I": case "%k": case "%l": hr = parseInt(a[i], 10); break; case "%P": case "%p": if (/pm/i.test(a[i]) && hr < 12) hr += 12; else if (/am/i.test(a[i]) && hr >= 12) hr -= 12; break; case "%M": min = parseInt(a[i], 10); break; } } if (isNaN(y)) y = today.getFullYear(); if (isNaN(m)) m = today.getMonth(); if (isNaN(d)) d = today.getDate(); if (isNaN(hr)) hr = today.getHours(); if (isNaN(min)) min = today.getMinutes(); if (y != 0 && m != -1 && d != 0) return new Date(y, m, d, hr, min, 0); y = 0; m = -1; d = 0; for (i = 0; i < a.length; ++i) { if (a[i].search(/[a-zA-Z]+/) != -1) { var t = -1; for (j = 0; j < 12; ++j) { if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; } } if (t != -1) { if (m != -1) { d = m + 1; } m = t; } } else if (parseInt(a[i], 10) <= 12 && m == -1) { m = a[i] - 1; } else if (parseInt(a[i], 10) > 31 && y == 0) { y = parseInt(a[i], 10); (y < 100) && (y += (y > 29) ? 1900 : 2000); } else if (d == 0) { d = a[i]; } } if (y == 0) y = today.getFullYear(); if (m != -1 && d != 0) return new Date(y, m, d, hr, min, 0); return today; }; Date.prototype.getMonthDays = function (month) { var year = this.getFullYear(); if (typeof month == "undefined") { month = this.getMonth(); } if (((0 == (year % 4)) && ((0 != (year % 100)) || (0 == (year % 400)))) && month == 1) { return 29; } else { return Date._MD[month]; } }; Date.prototype.getDayOfYear = function () { var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0); var time = now - then; return Math.floor(time / Date.DAY); }; Date.prototype.getWeekNumber = function () { var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0); var DoW = d.getDay(); d.setDate(d.getDate() - (DoW + 6) % 7 + 3); var ms = d.valueOf(); d.setMonth(0); d.setDate(4); return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; }; Date.prototype.equalsTo = function (date) { return ((this.getFullYear() == date.getFullYear()) && (this.getMonth() == date.getMonth()) && (this.getDate() == date.getDate()) && (this.getHours() == date.getHours()) && (this.getMinutes() == date.getMinutes())); }; Date.prototype.setDateOnly = function (date) { var tmp = new Date(date); this.setDate(1); this.setFullYear(tmp.getFullYear()); this.setMonth(tmp.getMonth()); this.setDate(tmp.getDate()); }; Date.prototype.print = function (str) { var m = this.getMonth(); var d = this.getDate(); var y = this.getFullYear(); var wn = this.getWeekNumber(); var w = this.getDay(); var s = {}; var hr = this.getHours(); var pm = (hr >= 12); var ir = (pm) ? (hr - 12) : hr; var dy = this.getDayOfYear(); if (ir == 0) ir = 12; var min = this.getMinutes(); var sec = this.getSeconds(); s["%a"] = Calendar._SDN[w]; s["%A"] = Calendar._DN[w]; s["%b"] = Calendar._SMN[m]; s["%B"] = Calendar._MN[m]; s["%C"] = 1 + Math.floor(y / 100); s["%d"] = (d < 10) ? ("0" + d) : d; s["%e"] = d; s["%H"] = (hr < 10) ? ("0" + hr) : hr; s["%I"] = (ir < 10) ? ("0" + ir) : ir; s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; s["%k"] = hr; s["%l"] = ir; s["%m"] = (m < 9) ? ("0" + (1 + m)) : (1 + m); s["%M"] = (min < 10) ? ("0" + min) : min; s["%n"] = "\n"; s["%p"] = pm ? "PM" : "AM"; s["%P"] = pm ? "pm" : "am"; s["%s"] = Math.floor(this.getTime() / 1000); s["%S"] = (sec < 10) ? ("0" + sec) : sec; s["%t"] = "\t"; s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; s["%u"] = w + 1; s["%w"] = w; s["%y"] = ('' + y).substr(2, 2); s["%Y"] = y; s["%%"] = "%"; var re = /%./g; if (!Calendar.is_ie5 && !Calendar.is_khtml) return str.replace(re, function (par) { return s[par] || par; }); var a = str.match(re); for (var i = 0; i < a.length; i++) { var tmp = s[a[i]]; if (tmp) { re = new RegExp(a[i], 'g'); str = str.replace(re, tmp); } } return str; }; Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; Date.prototype.setFullYear = function (y) { var d = new Date(this); d.__msh_oldSetFullYear(y); if (d.getMonth() != this.getMonth()) this.setDate(28); this.__msh_oldSetFullYear(y); }; window._dynarch_popupCalendar = null; diff --git a/js/calendar/theme.css b/js/calendar/theme.css index 4a027a1..8c70be5 100644 --- a/js/calendar/theme.css +++ b/js/calendar/theme.css @@ -5,212 +5,247 @@ /* The main calendar widget. DIV containing a table. */ -div.calendar { position: relative; } +div.calendar { + position: relative; +} -.calendar, .calendar table { - background: #FFF; - border: 1px solid #AAA; - font-size: 11px; - color: #000; - cursor: default; +.calendar, +.calendar table { + background: #FFF; + border: 1px solid #AAA; + font-size: 11px; + color: #000; + cursor: default; } /* Header part -- contains navigation buttons and day names. */ -.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ - text-align: center; /* They are the navigation buttons */ - padding: 2px; /* Make the buttons seem like they're pressing */ - color: #000; - font-weight: bold; +.calendar .button { + /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + /* They are the navigation buttons */ + padding: 2px; + /* Make the buttons seem like they're pressing */ + color: #000; + font-weight: bold; } .calendar .nav div { - background: transparent url("menuarrow.gif") no-repeat 100% 100%; + background: transparent url("menuarrow.gif") no-repeat 100% 100%; } -.calendar thead .title { /* This holds the current "month, year" */ - font-weight: bold; /* Pressing it will take you to the current date */ - text-align: center; - color: #F90; - padding: 2px; +.calendar thead .title { + /* This holds the current "month, year" */ + font-weight: bold; + /* Pressing it will take you to the current date */ + text-align: center; + color: #F90; + padding: 2px; } -.calendar thead .headrow { /* Row containing navigation buttons */ +.calendar thead .headrow { + /* Row containing navigation buttons */ } -.calendar thead .name { /* Cells containing the day names */ - border-bottom: 1px solid #888; - padding: 2px; - text-align: center; +.calendar thead .name { + /* Cells containing the day names */ + border-bottom: 1px solid #888; + padding: 2px; + text-align: center; } -.calendar thead .weekend { /* How a weekend day name shows in header */ - color: #999; +.calendar thead .weekend { + /* How a weekend day name shows in header */ + color: #999; } -.calendar thead .hilite { /* How do the buttons in header appear when hover */ - background: #EEE; - color: #93B300; +.calendar thead .hilite { + /* How do the buttons in header appear when hover */ + background: #EEE; + color: #93B300; } -.calendar thead .active { /* Active (pressed) buttons in header */ - color: #F90; +.calendar thead .active { + /* Active (pressed) buttons in header */ + color: #F90; } -.calendar thead .daynames { /* Row containing the day names */ - /*background: #EEE;*/ - color: #666; +.calendar thead .daynames { + /* Row containing the day names */ + /*background: #EEE;*/ + color: #666; } /* The body part -- contains all the days in month. */ -.calendar tbody .day { /* Cells containing month days dates */ - width: 2em; - text-align: right; - padding: 2px 4px 2px 2px; +.calendar tbody .day { + /* Cells containing month days dates */ + width: 2em; + text-align: right; + padding: 2px 4px 2px 2px; } -.calendar tbody .day.othermonth { - font-size: 80%; - color: #999; + +.calendar tbody .day.othermonth { + font-size: 80%; + color: #999; } + .calendar tbody .day.othermonth.oweekend { - color: #f99; + color: #f99; } .calendar table .wn { - background: color; - border-right: 1px solid #888; - padding: 2px 3px 2px 2px; + background: color; + border-right: 1px solid #888; + padding: 2px 3px 2px 2px; } .calendar tbody .rowhilite td, .calendar tbody .rowhilite td.wn { - /*background: #BBB;*/ + /*background: #BBB;*/ } -.calendar tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ } +.calendar tbody td.today { + font-weight: bold; + /* background: url("today-bg.gif") no-repeat 70% 50%; */ +} -.calendar tbody td.hilite { /* Hovered cells */ -color: #93B300; -font-weight: bold; +.calendar tbody td.hilite { + /* Hovered cells */ + color: #93B300; + font-weight: bold; } -.calendar tbody td.active { /* Active (pressed) cells */ - color: #F90; +.calendar tbody td.active { + /* Active (pressed) cells */ + color: #F90; } -.calendar tbody td.weekend { /* Cells showing weekend days */ - color: #c44; +.calendar tbody td.weekend { + /* Cells showing weekend days */ + color: #c44; } -.calendar tbody td.selected { /* Cell showing selected date */ - font-weight: bold; - color: #F90; - border: 1px solid #93B300; +.calendar tbody td.selected { + /* Cell showing selected date */ + font-weight: bold; + color: #F90; + border: 1px solid #93B300; } -.calendar tbody .disabled { color: #999; } +.calendar tbody .disabled { + color: #999; +} -.calendar tbody .emptycell { /* Empty cells (the best is to hide them) */ - visibility: hidden; +.calendar tbody .emptycell { + /* Empty cells (the best is to hide them) */ + visibility: hidden; } -.calendar tbody .emptyrow { /* Empty row (some months need less than 6 rows) */ - display: none; +.calendar tbody .emptyrow { + /* Empty row (some months need less than 6 rows) */ + display: none; } /* The footer part -- status bar and "Close" button */ -.calendar tfoot .footrow { /* The in footer (only one right now) */ - text-align: center; - color: #999; +.calendar tfoot .footrow { + /* The in footer (only one right now) */ + text-align: center; + color: #999; } -.calendar tfoot .ttip { /* Tooltip (status bar) cell */ - padding: 2px; +.calendar tfoot .ttip { + /* Tooltip (status bar) cell */ + padding: 2px; } -.calendar tfoot .hilite { /* Hover style for buttons in footer */ - border: 1px solid #084; - color: #000; - padding: 1px; - border-top: 1px solid #888; +.calendar tfoot .hilite { + /* Hover style for buttons in footer */ + border: 1px solid #084; + color: #000; + padding: 1px; + border-top: 1px solid #888; } -.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ - padding: 2px 0px 0px 2px; +.calendar tfoot .active { + /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; } /* Combo boxes (menus that display months/years for direct selection) */ .calendar .combo { - position: absolute; - display: none; - top: 0px; - left: 0px; - width: 4em; - cursor: default; - border-width: 0 1px 1px 1px; - border-style: solid; - border-color: #797979; - z-index: 100; - font-size: 90%; - background: #FFF; + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border-width: 0 1px 1px 1px; + border-style: solid; + border-color: #797979; + z-index: 100; + font-size: 90%; + background: #FFF; } .calendar .combo .label, .calendar .combo .label-IEfix { - text-align: center; - padding: 1px; + text-align: center; + padding: 1px; } .calendar .combo .label-IEfix { - width: 4em; + width: 4em; } .calendar .combo .hilite { - color: #93B300; + color: #93B300; } .calendar .combo .active { - color: #F90; - font-weight: bold; + color: #F90; + font-weight: bold; } .calendar td.time { - border-top: 1px solid #797979; - padding: 1px 0px; - text-align: center; - background: url("dark-bg.gif"); + border-top: 1px solid #797979; + padding: 1px 0px; + text-align: center; + background: url("dark-bg.gif"); } .calendar td.time .hour, .calendar td.time .minute, .calendar td.time .ampm { - padding: 0px 5px 0px 6px; - font-weight: bold; - background: url("normal-bg.gif"); color: #000; + padding: 0px 5px 0px 6px; + font-weight: bold; + background: url("normal-bg.gif"); + color: #000; } .calendar td.time .hour, .calendar td.time .minute { - font-family: monospace; + font-family: monospace; } .calendar td.time .ampm { - text-align: center; + text-align: center; } .calendar td.time .colon { - padding: 0px 2px 0px 3px; - font-weight: bold; + padding: 0px 2px 0px 3px; + font-weight: bold; } .calendar td.time span.hilite { - background: url("hover-bg.gif"); color: #000; + background: url("hover-bg.gif"); + color: #000; } .calendar td.time span.active { - background: url("active-bg.gif"); color: #fff; + background: url("active-bg.gif"); + color: #fff; } diff --git a/lang/lang_french.php b/lang/lang_french.php index aaa9a06..70f3870 100644 --- a/lang/lang_french.php +++ b/lang/lang_french.php @@ -1,6 +1,7 @@ 'Lundi','2'=>'Mardi','3'=>'Mercredi','4'=>'Jeudi','5'=>'Vendredi','6'=>'Samedi','7'=>'Total','0'=>'Dimanche'); +$day_array = array('1' => 'Lundi', '2' => 'Mardi', '3' => 'Mercredi', '4' => 'Jeudi', '5' => 'Vendredi', '6' => 'Samedi', '7' => 'Total', '0' => 'Dimanche'); // Variable (pour les helps) -$h_rapport = isset($pub_nb_rapport)?$pub_nb_rapport:0; -$h_period = isset($pub_periodes)?$pub_periodes:""; -$h_target = isset($pub_target)?$pub_target:""; +$h_rapport = isset($pub_nb_rapport) ? $pub_nb_rapport : 0; +$h_period = isset($pub_periodes) ? $pub_periodes : ""; +$h_target = isset($pub_target) ? $pub_target : ""; // Bulles d'aides -$help['qms_accueil'] = "Page d'accueil du module
Résumé de vos espionnages, et rappel des 3 derniers."; -$help['qms_admin'] = "Choisissez les réglages par défaut pour les options de chaque page."; -$help['qms_ajouter rapport'] = "Vous pouvez ajouter les rapports d'espionnages en copiant le texte de la page des messages OGame et en le collant dans la zone texte.
N'oubliez pas d'inclure la date."; -$help['qms_analyses'] = "Recoupage des espionnages enregistrés en fonction du nombre d\'espionnages réalisé par une planète, un joueur ou une alliance sur vous-même ou sur tous les membres du serveur.
Choisissez un nombre d'espionnage minimum réalisé, le nombre de jour à compter d'aujourd'hui et le type de données à recouper : Joueur Alliance ou Planète."; -$help['qms_analyses nombre requis'] = "Choisissez le nombre d'espionnage minimum à partir duquel il faut tenir compte du résultat."; -$help['qms_analyses periode'] = "Choisissez la période en jour à compter d'aujourd'hui sur laquelle porter l'analyse."; -$help['qms_analyses affichage'] = "Choisissez le critique a prendre en compte, Joueur, Alliance ou Planète."; -$help['qms_analyses rechercher'] = "Choisissez si vous voulez analyser sur seulement les espionnages qui vous concernent, ou sur tous les espionnages de tous les membres du serveur."; -$help['qms_callbacks'] = "Si pour une raison X ou Y, QuiMSonde n'est pas reconnu par XTense2: cliquez sur ce bouton."; -$help['qms_check_newnames'] = "Rechercher le nom des joueurs inconnus affiché avec un \"?\" dans la liste, à l'aide de la base de donnée de l'univers. Si le système n'a toujours pas été scanné, la recherche ne donnera rien.
ATTENTION! Si le joueur a changé de nom, où a décolonisé sa planète la recherche donnera le nouveau nom comme si c'etait le joueur actuellement en place qui avait lancé l'espionnage, indépendament de la date."; -$help['qms_config'] = "Choisissez vos réglages personnels, indépendament des réglages des autres utlisateurs."; -$help['qms_delete_oldspies'] = "Les rapports d'espionnages des membres dont le compte a été effacés sont toujours stocké dans la base. Cliquez sur \"Effacer\" pour les enlever, la recherche sur tout le serveur sera d'autant plus pertinante."; -$help['qms_hall of fame'] = "Statistiques de tous les espionnages enresgitrés sur le serveur sur l'intervalle de temps choisi.
Vous pouvez voir et exporter vers un forum toutes ces données."; -$help['qms_impoter'] = "Importer les espionnages enregistrés dans la base de donnée du module Qui M'Observe de Santory"; -$help['qms_insertion sur accueil'] = "Si cette option est activé, la zone texte où coller vos espionnages sera en bas de la page d'accueil."; -$help['qms_jours max'] = "Nombre de jours pendant lesquels les rapports sont conservés. Au delà de ce nombre de jours, les rapports sont perdus."; -$help['qms_les espions'] = "Liste complète de tous les espionnages enregistrés sur ce serveur.
Vous pouvez trier et filtrer ces espionnages en fonction des données
Vous ne pouvez modifier ou supprimer uniquement les espionnages qui vous consernent."; -$help['qms_membres utilisant'] = "Liste des membres qui utilisent ce module"; -$help['qms_mes détails'] = "Statistiques de vos espionnages sur l'intervalle de temps choisi
Vous pouvez voir et exporter vers un forum différentes données et top5."; -$help['qms_mes espionnages'] = "Liste complète de vos espionnages
Vous pouvez trier et filtrer les espionnages comme bon vous sembles.
Les espionnages sont effacés au bout du nombre de jours choisi dans les options."; -$help['qms_nombre de ligne'] = "Nombre d'espionnages à afficher par page dans la liste de la page d'accueil"; -$help['qms_nombre total'] = "Le nombre total de rapports d'espionnage enregistrés."; -$help['qms_resultat analyse alliances'] = "Résultat de l'analyse des alliances espionnes dans vos espionnages sur $h_period avec un minimum de $h_rapport rapport(s)"; -$help['qms_resultat analyse alliances global'] = "Résultat de l'analyse des alliances espionnes dans tous les espionnages du serveur sur $h_period jour(s) avec un minimum de $h_rapport rapports"; -$help['qms_resultat analyse joueurs'] = "Résultat de l'analyse des joueurs espions dans vos espionnages sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; -$help['qms_resultat analyse joueurs global'] = "Résultat de l'analyse des joueurs espions dans tous les espionnages du serveur sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; -$help['qms_resultat analyse planetes'] = "Résultat de l'analyse des planètes espionnes dans vos espionnages sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; -$help['qms_resultat analyse planetes global'] = "Résultat de l'analyse des planètes espionnes dans tous les espionnages du serveur sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; -$help['qms_search'] = "Système permettant de rajouter des liens dans les popups sur les joueurs et/ou position et/ou alliance. Renseigner le lien qui vous convient."; -$help['qms_search_actif'] = "Seules les recherches actives (qui ont donc cette case de cochés) seront utilisées dans les Popups."; -$help['qms_search_add'] = "Utiliser ce formulaire pour créer de nouvelle recherches."; -$help['qms_search_link'] = "Lien qui sera associé à cette recherche.
Dans ce lien, les variables sont entre crochets { }."; -$help['qms_search_nom'] = "Le nom qui représentera la recherche"; -$help['qms_search_type'] = "Le type de recherche.
Cela défini sur quel popup sera affiché la recherche, et quelle sera la variable.
Type Joueur : le nom du joueur est {joueur}
Type Alliance : le nom de l'alliance est {alliance}
Type Position : Utiliser {galaxy} {system} et {row}."; -$help['qms_user_lignes'] = "Le nombre de rapport à afficher sur les pages Mes Espions, et Les Espions."; -$help['qms_user_nbrapport'] = "Le nombre de rapport à prendre en compte dans la page analyser."; -$help['qms_user_periode'] = "Le nombre de jours jusqu'à aujourd'hui, pris en compte dans l'analyse choisie."; -$help['qms_user_time_start'] = "La date de départ pour le calcul de Mes Détails ou de la page HOF."; -$help['qms_user_time_end'] = "La date de fin pour le calcul de Mes Détails ou de la page HOF."; -$help['qms_user_add_home'] = "Faut-il afficher le cadre d'insertion sur la page d'accueil ou non ?"; -$help['qms_user_banniere'] = "Faut-il afficher l'image au dessus du menu ?"; -$help['qms_user_imgmenu'] = "Faut-il afficher les images pour le menu ?"; -$help['qms_admin_lignes'] = "Le nombre de rapport à afficher sur les pages Mes Espions, et Les Espions.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; -$help['qms_admin_nbrapport'] = "Le nombre de rapport à prendre en compte dans la page analyser.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; -$help['qms_admin_periode'] = "Le nombre de jours jusqu'à aujourd'hui, pris en compte dans l'analyse choisie.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; -$help['qms_admin_time_start'] = "La date de départ pour le calcul de Mes Détails ou de la page HOF.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; -$help['qms_admin_time_end'] = "La date de fin pour le calcul de Mes Détails ou de la page HOF.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; -$help['qms_admin_add_home'] = "Faut-il afficher le cadre d'insertion sur la page d'accueil ou non ?
Valeur par défaut pour les membres qui n'ont encore rien réglé."; -$help['qms_admin_banniere'] = "Faut-il afficher l'image au dessus du menu ?"; -$help['qms_admin_imgmenu'] = "Faut-il afficher les images pour le menu ?"; -$help['qms_vue detail'] = "Analyse en détail de l'espionnage #$h_target"; - -// Regex -$lang['regex_import_spy'] = - "#((\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})\s+Contrôle\saérospatial(.*?)Probabilité\sde\sdestruction\sde\sla\sflotte\sd(.*?)espionnage\s:\s(\d+)\s%)#si"; +$help['qms_accueil'] = "Page d'accueil du module
Résumé de vos espionnages, et rappel des 3 derniers."; +$help['qms_admin'] = "Choisissez les réglages par défaut pour les options de chaque page."; +$help['qms_ajouter rapport'] = "Vous pouvez ajouter les rapports d'espionnages en copiant le texte de la page des messages OGame et en le collant dans la zone texte.
N'oubliez pas d'inclure la date."; +$help['qms_analyses'] = "Recoupage des espionnages enregistrés en fonction du nombre d\'espionnages réalisé par une planète, un joueur ou une alliance sur vous-même ou sur tous les membres du serveur.
Choisissez un nombre d'espionnage minimum réalisé, le nombre de jour à compter d'aujourd'hui et le type de données à recouper : Joueur Alliance ou Planète."; +$help['qms_analyses nombre requis'] = "Choisissez le nombre d'espionnage minimum à partir duquel il faut tenir compte du résultat."; +$help['qms_analyses periode'] = "Choisissez la période en jour à compter d'aujourd'hui sur laquelle porter l'analyse."; +$help['qms_analyses affichage'] = "Choisissez le critique a prendre en compte, Joueur, Alliance ou Planète."; +$help['qms_analyses rechercher'] = "Choisissez si vous voulez analyser sur seulement les espionnages qui vous concernent, ou sur tous les espionnages de tous les membres du serveur."; +$help['qms_callbacks'] = "Si pour une raison X ou Y, QuiMSonde n'est pas reconnu par XTense2: cliquez sur ce bouton."; +$help['qms_check_newnames'] = "Rechercher le nom des joueurs inconnus affiché avec un \"?\" dans la liste, à l'aide de la base de donnée de l'univers. Si le système n'a toujours pas été scanné, la recherche ne donnera rien.
ATTENTION! Si le joueur a changé de nom, où a décolonisé sa planète la recherche donnera le nouveau nom comme si c'etait le joueur actuellement en place qui avait lancé l'espionnage, indépendament de la date."; +$help['qms_config'] = "Choisissez vos réglages personnels, indépendament des réglages des autres utlisateurs."; +$help['qms_delete_oldspies'] = "Les rapports d'espionnages des membres dont le compte a été effacés sont toujours stocké dans la base. Cliquez sur \"Effacer\" pour les enlever, la recherche sur tout le serveur sera d'autant plus pertinante."; +$help['qms_hall of fame'] = "Statistiques de tous les espionnages enresgitrés sur le serveur sur l'intervalle de temps choisi.
Vous pouvez voir et exporter vers un forum toutes ces données."; +$help['qms_impoter'] = "Importer les espionnages enregistrés dans la base de donnée du module Qui M'Observe de Santory"; +$help['qms_insertion sur accueil'] = "Si cette option est activé, la zone texte où coller vos espionnages sera en bas de la page d'accueil."; +$help['qms_jours max'] = "Nombre de jours pendant lesquels les rapports sont conservés. Au delà de ce nombre de jours, les rapports sont perdus."; +$help['qms_les espions'] = "Liste complète de tous les espionnages enregistrés sur ce serveur.
Vous pouvez trier et filtrer ces espionnages en fonction des données
Vous ne pouvez modifier ou supprimer uniquement les espionnages qui vous consernent."; +$help['qms_membres utilisant'] = "Liste des membres qui utilisent ce module"; +$help['qms_mes détails'] = "Statistiques de vos espionnages sur l'intervalle de temps choisi
Vous pouvez voir et exporter vers un forum différentes données et top5."; +$help['qms_mes espionnages'] = "Liste complète de vos espionnages
Vous pouvez trier et filtrer les espionnages comme bon vous sembles.
Les espionnages sont effacés au bout du nombre de jours choisi dans les options."; +$help['qms_nombre de ligne'] = "Nombre d'espionnages à afficher par page dans la liste de la page d'accueil"; +$help['qms_nombre total'] = "Le nombre total de rapports d'espionnage enregistrés."; +$help['qms_resultat analyse alliances'] = "Résultat de l'analyse des alliances espionnes dans vos espionnages sur $h_period avec un minimum de $h_rapport rapport(s)"; +$help['qms_resultat analyse alliances global'] = "Résultat de l'analyse des alliances espionnes dans tous les espionnages du serveur sur $h_period jour(s) avec un minimum de $h_rapport rapports"; +$help['qms_resultat analyse joueurs'] = "Résultat de l'analyse des joueurs espions dans vos espionnages sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; +$help['qms_resultat analyse joueurs global'] = "Résultat de l'analyse des joueurs espions dans tous les espionnages du serveur sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; +$help['qms_resultat analyse planetes'] = "Résultat de l'analyse des planètes espionnes dans vos espionnages sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; +$help['qms_resultat analyse planetes global'] = "Résultat de l'analyse des planètes espionnes dans tous les espionnages du serveur sur $h_period jour(s) avec un minimum de $h_rapport rapport(s)"; +$help['qms_search'] = "Système permettant de rajouter des liens dans les popups sur les joueurs et/ou position et/ou alliance. Renseigner le lien qui vous convient."; +$help['qms_search_actif'] = "Seules les recherches actives (qui ont donc cette case de cochés) seront utilisées dans les Popups."; +$help['qms_search_add'] = "Utiliser ce formulaire pour créer de nouvelle recherches."; +$help['qms_search_link'] = "Lien qui sera associé à cette recherche.
Dans ce lien, les variables sont entre crochets { }."; +$help['qms_search_nom'] = "Le nom qui représentera la recherche"; +$help['qms_search_type'] = "Le type de recherche.
Cela défini sur quel popup sera affiché la recherche, et quelle sera la variable.
Type Joueur : le nom du joueur est {joueur}
Type Alliance : le nom de l'alliance est {alliance}
Type Position : Utiliser {galaxy} {system} et {row}."; +$help['qms_user_lignes'] = "Le nombre de rapport à afficher sur les pages Mes Espions, et Les Espions."; +$help['qms_user_nbrapport'] = "Le nombre de rapport à prendre en compte dans la page analyser."; +$help['qms_user_periode'] = "Le nombre de jours jusqu'à aujourd'hui, pris en compte dans l'analyse choisie."; +$help['qms_user_time_start'] = "La date de départ pour le calcul de Mes Détails ou de la page HOF."; +$help['qms_user_time_end'] = "La date de fin pour le calcul de Mes Détails ou de la page HOF."; +$help['qms_user_add_home'] = "Faut-il afficher le cadre d'insertion sur la page d'accueil ou non ?"; +$help['qms_user_banniere'] = "Faut-il afficher l'image au dessus du menu ?"; +$help['qms_user_imgmenu'] = "Faut-il afficher les images pour le menu ?"; +$help['qms_admin_lignes'] = "Le nombre de rapport à afficher sur les pages Mes Espions, et Les Espions.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; +$help['qms_admin_nbrapport'] = "Le nombre de rapport à prendre en compte dans la page analyser.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; +$help['qms_admin_periode'] = "Le nombre de jours jusqu'à aujourd'hui, pris en compte dans l'analyse choisie.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; +$help['qms_admin_time_start'] = "La date de départ pour le calcul de Mes Détails ou de la page HOF.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; +$help['qms_admin_time_end'] = "La date de fin pour le calcul de Mes Détails ou de la page HOF.
Valeur par défaut pour les membres qui n'ont encore rien réglé."; +$help['qms_admin_add_home'] = "Faut-il afficher le cadre d'insertion sur la page d'accueil ou non ?
Valeur par défaut pour les membres qui n'ont encore rien réglé."; +$help['qms_admin_banniere'] = "Faut-il afficher l'image au dessus du menu ?"; +$help['qms_admin_imgmenu'] = "Faut-il afficher les images pour le menu ?"; +$help['qms_vue detail'] = "Analyse en détail de l'espionnage #$h_target"; + +// Regex +$lang['regex_import_spy'] = + "#((\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})\s+Contrôle\saérospatial(.*?)Probabilité\sde\sdestruction\sde\sla\sflotte\sd(.*?)espionnage\s:\s(\d+)\s%)#si"; $lang['regex_xtense1_date_heure'] = "#((\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})\s+Contrôle\saérospatial(.*?)pionnage\s:\s(\d+)\s%)#si"; $lang['regex_xtense1_coord'] = "`plan.te\s(.*?)\s\[(\d+\:\d+\:\d+)\]`"; -$lang['regex_xtense2_coord'] = "`Une flotte .+trang.+re de la plan.+te (.*) a .+t.+ rep.+r.+e .+ proximit.+ de votre plan.+te (.*)`";//"`Une flot.*la plan.te (.*) a .t. aper.*re plan.te (.*)`"; +$lang['regex_xtense2_coord'] = "`Une flotte .+trang.+re de la plan.+te (.*) a .+t.+ rep.+r.+e .+ proximit.+ de votre plan.+te (.*)`"; //"`Une flot.*la plan.te (.*) a .t. aper.*re plan.te (.*)`"; //Une flotte ennemie de la planète the skyline a été aperçue à proximité de votre planète Starlight (Lune) // Titre des menus : -$lang['qms_menu_accueil'] = "Accueil"; -$lang['qms_menu_mes_espions'] = "Mes Espions"; -$lang['qms_menu_mes_details'] = "Mes Détails"; -$lang['qms_menu_les_espions'] = "LES Espions"; -$lang['qms_menu_hall_of_fame'] = "Hall Of Fame"; -$lang['qms_menu_analyse'] = "Analyses"; -$lang['qms_menu_insertion'] = "Insertion"; -$lang['qms_menu_config'] = "Config"; -$lang['qms_menu_config_long'] = "Configuration"; -$lang['qms_menu_admin'] = "Admin"; -$lang['qms_menu_admin_long'] = "Administration"; +$lang['qms_menu_accueil'] = "Accueil"; +$lang['qms_menu_mes_espions'] = "Mes Espions"; +$lang['qms_menu_mes_details'] = "Mes Détails"; +$lang['qms_menu_les_espions'] = "LES Espions"; +$lang['qms_menu_hall_of_fame'] = "Hall Of Fame"; +$lang['qms_menu_analyse'] = "Analyses"; +$lang['qms_menu_insertion'] = "Insertion"; +$lang['qms_menu_config'] = "Config"; +$lang['qms_menu_config_long'] = "Configuration"; +$lang['qms_menu_admin'] = "Admin"; +$lang['qms_menu_admin_long'] = "Administration"; // Titre des configs : -$lang['qms_config_titre1'] = "Pages Mes Espions et Les Espions"; -$lang['qms_config_lignes'] = "Nombre de ligne par page"; -$lang['qms_config_titre2'] = "Page Analyse"; -$lang['qms_config_nbrapport'] = "Nombre minimal d'espionnages requis"; -$lang['qms_config_periode'] = "Période en jours à analyser"; -$lang['qms_config_titre3'] = "Pages Mes Détails et HOF"; -$lang['qms_config_time_start'] = "Date de début"; -$lang['qms_config_time_end'] = "Date de fin"; -$lang['qms_config_titre4'] = "Options"; -$lang['qms_config_add_home'] = "Insertion depuis la page d'accueil"; -$lang['qms_config_banniere'] = "Affichage de la bannière"; -$lang['qms_config_imgmenu'] = "Menu graphique"; +$lang['qms_config_titre1'] = "Pages Mes Espions et Les Espions"; +$lang['qms_config_lignes'] = "Nombre de ligne par page"; +$lang['qms_config_titre2'] = "Page Analyse"; +$lang['qms_config_nbrapport'] = "Nombre minimal d'espionnages requis"; +$lang['qms_config_periode'] = "Période en jours à analyser"; +$lang['qms_config_titre3'] = "Pages Mes Détails et HOF"; +$lang['qms_config_time_start'] = "Date de début"; +$lang['qms_config_time_end'] = "Date de fin"; +$lang['qms_config_titre4'] = "Options"; +$lang['qms_config_add_home'] = "Insertion depuis la page d'accueil"; +$lang['qms_config_banniere'] = "Affichage de la bannière"; +$lang['qms_config_imgmenu'] = "Menu graphique"; // %1 = $max_spy, %2 = $most['joueur_cnt'], %3 = $most['joueur'], %4 = $most['cible_cnt'], %5 = $most['cible'] -$lang['qms_resume_rien_du_tout'] = - "Tes espionnages en 2 lignes :
". - "...pas en 2 lignes, mais en 2 mots : Aucun Espionnage!.". - "
"; -$lang['qms_resume_2_lignes'] = - "Tes espionnages en 2 lignes :
". - "Il y a actuellement %1\$d espionnages enregistrés, ". - "dont %2\$d du joueur %3\$s, ". - "et %4\$d à destination de ta planète %5\$s.". - "
"; -$lang['qms_les3derniers'] = "les %d derniers"; // If nb > 1 -$lang['qms_le_dernier'] = "le dernier"; // else +$lang['qms_resume_rien_du_tout'] = + "Tes espionnages en 2 lignes :
" . + "...pas en 2 lignes, mais en 2 mots : Aucun Espionnage!." . + "
"; +$lang['qms_resume_2_lignes'] = + "Tes espionnages en 2 lignes :
" . + "Il y a actuellement %1\$d espionnages enregistrés, " . + "dont %2\$d du joueur %3\$s, " . + "et %4\$d à destination de ta planète %5\$s." . + "
"; +$lang['qms_les3derniers'] = "les %d derniers"; // If nb > 1 +$lang['qms_le_dernier'] = "le dernier"; // else $lang['qms_format_date'] = "d/m/Y"; $lang['qms_format_full'] = "d M y à H:i:s"; $lang['qms_format_date_ogame'] = "m-d H:i:s"; $lang['qms_format_spy_title_ogame'] = "Contrôle aérospatial Activité d'espionnage"; // %1 = joueur, %2 = alliance, %3 = position, %4 = nom de la cible, %5 = position, %6 = probabilité -$lang['qms_format_spy_content_ogame'] = - "Une flotte ennemie de %1\$s %2\$s depuis %3\$s a été aperçue ". - "à proximité de votre planète %4\$s [%5\$s]. Probabilité de destruction de la flotte d'espionnage : %6\$s"; +$lang['qms_format_spy_content_ogame'] = + "Une flotte ennemie de %1\$s %2\$s depuis %3\$s a été aperçue " . + "à proximité de votre planète %4\$s [%5\$s]. Probabilité de destruction de la flotte d'espionnage : %6\$s"; $lang['qms_format_date_regex'] = "#(.*)/(.*)/(.*)#"; $lang['qms_classement_of'] = "Classement du %s"; // (%s = date, cf. qms_classement_date) -$lang['qms_classement_date'] = "%d %b %Y à %Hh"; +$lang['qms_classement_date'] = "d M Y H"; $lang['qms_classement_general'] = "Général"; $lang['qms_classement_economique'] = "Economique"; $lang['qms_classement_technologie'] = "Recherche"; @@ -245,7 +246,7 @@ $lang['qms_analyse_no_spy_for_this_periode'] = "Aucun espion n'a espionné plus de %1\$s membres différents ces %2\$s derniers jours."; // %1 = date de départ, %2 = date de fin -$lang['qms_details_date_error'] = "La date de départ (%1\$s) doit etre antérieur à la date de fin (%2\$s), il y a eu inversion.
"; +$lang['qms_details_date_error'] = "La date de départ (%1\$s) doit etre antérieur à la date de fin (%2\$s), il y a eu inversion.
"; $lang['qms_details_intervalle'] = "intervalle d'étude : "; $lang['qms_details_graphic_of'] = "Graphique des "; $lang['qms_details_top5_player'] = "Top 5 des Joueurs les plus curieux"; @@ -315,12 +316,12 @@ $lang['qms_popup_bbcode_titre'] = "{tr}{th}{chaine_date}{/th}{th}Contrôle aérospatial{/th}{th}[color=#ff9933]Activité d'espionnage[/color]{/th}{/tr}"; $lang['qms_popup_bbcode_1'] = "{tr}{td_span}Une flotte ennemie de {link_joueur}[color={color_spy}][b]{chaine_joueur}[/b][/color]{link_end} "; $lang['qms_popup_bbcode_2'] = "{link_alliance}[color={color_spy}]([b]{chaine_allliance}[/b])[/color]{link_end} "; -$lang['qms_popup_bbcode_3'] = - "depuis {link_position}[color={color_spy}][b]{chaine_position}[/b][/color]{link_end} a été aperçue à proximité de la planète ". - "{link_cible}[color={color_cbl}][b]{chaine_nomcible}[/b] [{chaine_cible}][/color]{link_end} de ". - "{link_victim}[color={color_cbl}][b]{chaine_victim}[/b][/color]{link_end}\n". - "Probabilité de destruction de la flotte d'espionnage : [color={color_proba}][b]{chaine_proba}[/b][/color] %"; - "{/td}{/tr}{/table}"; +$lang['qms_popup_bbcode_3'] = + "depuis {link_position}[color={color_spy}][b]{chaine_position}[/b][/color]{link_end} a été aperçue à proximité de la planète " . + "{link_cible}[color={color_cbl}][b]{chaine_nomcible}[/b] [{chaine_cible}][/color]{link_end} de " . + "{link_victim}[color={color_cbl}][b]{chaine_victim}[/b][/color]{link_end}\n" . + "Probabilité de destruction de la flotte d'espionnage : [color={color_proba}][b]{chaine_proba}[/b][/color] %"; +"{/td}{/tr}{/table}"; $lang['qms_popup_table_hour_1st_case'] = "Jour \ Heure"; $lang['qms_popup_table_hour_case'] = "%d h"; @@ -367,232 +368,230 @@ $lang['qms_func_sql_many_updated'] = "%d rapports d'espionnage ont été complètés."; $lang['qms_func_sql_none_updated'] = "Aucun rapport d'espionnage a été complètés."; $lang['qms_func_sql_import_from_quimobserve_none'] = "La base de donnée de QuiMObserve est vide ou aucun rapport n\'est suffisament récent!"; -$lang['qms_func_sql_import_from_quimobserve_ok'] = -"Importation réalisée avec succès!
%1\$d rapport(s) ajouté(s) sur %2\$d rapport(s) datant de moins de %3\$d jours. "; - -$lang['qms_insertion_desc'] = - "". - "Pour ajouter un ou plusieurs espionnages :
". - "Copiez le texte, en incluant la date et l'heure, depuis la page message de OGame,
". - "collez le tout dans la zone texte ci-dessous, puis ensuite, cliquez sur 'Ajouter'.". - "

"; +$lang['qms_func_sql_import_from_quimobserve_ok'] = + "Importation réalisée avec succès!
%1\$d rapport(s) ajouté(s) sur %2\$d rapport(s) datant de moins de %3\$d jours. "; + +$lang['qms_insertion_desc'] = + "" . + "Pour ajouter un ou plusieurs espionnages :
" . + "Copiez le texte, en incluant la date et l'heure, depuis la page message de OGame,
" . + "collez le tout dans la zone texte ci-dessous, puis ensuite, cliquez sur 'Ajouter'." . + "

"; $lang['qms_insertion_submit'] = "Ajouter"; $lang['qms_insertion_error'] = "Enregistrement ERROR
"; $lang['qms_insertion_doublon'] = "Enregistrement Annulé : Doublon
"; $lang['qms_insertion_ok'] = "Enregistrement OK
"; -$lang['qms_changelog'] = Array ( - "
Version 1.8 : (03/01/12)". - "

". - "- [fix] Bug de calcul des distances
". - "- [fix] Lien pour les RE des joueurs qui nous sondent
". - "- [fix] Permettre l'édition des dates dans la config
". - "- [fix] Correction lien du changelog
". - "- [add] Compatibilité avec les nouveaux classements
". - "

", - - "
Version 1.6a : (09/11/08)". - "

". - "- [fix] Divers petits bugs.
". - "- [add] Compatibilité Xtense 2.1.
". - "

", - - "
Version 1.5b : (11/08/08)". - "

". - "- [fix] Divers petits bugs.
". - "- [fix] Un caractère spécial dans le nom de la base de donnée créait une erreur SQL.
". - "- [fix] Erreur PHP-8 : Double define des dossiers dans _xtense.php.
". - "- [fix] Mail & lien dans le pied de page.
". - "- [fix] Problème de calcul de la distance dans les insertions manuelles.
". - "- [mod] Simplification de la page ChangeLog.
". - "

", - - "
Version 1.5 : (10/08/08)". - "

". - "- [add] Enregistrement du nom des planètes, permet de savoir si on parle de lunes. ". - "(mod xtense 2.0b6 non compatible).
". - "- [add] Controle des données saisies par java puis php.
". - "- [add] Affichage de la bannière optionnel pour chaque utilisateur. (caché par défaut)
". - "- [add] Menu graphique optionnel pour chaque utilisateur. (caché par défaut)
". - "- [add] Fichier de langage, possibilité de traduire le mod.
". - "- [add] Affichage des boutons de défilement des pages en haut si y'a plus de 50 lignes.
". - "- [fix] Erreurs PHP lorsqu'il n'y a aucun RE dans la base.
". - "- [fix] Apperçu du BBCode toujours centré alors que le BBCode ne l'est plus.
". - "

", - - "
Version 1.4b : (08/04/08)". - "

". - "- [mod] Nouveau style de BBCode inspiré des conseils avisés de Louwok.
". - "- [fix] Installation du CallBack pour XTense2.
". - "- [add] Ajout d'un bouton qui permet à l'admin de forcer l'installation du CallBack XTense2.
". - "

", - - "
Version 1.4a : (06/04/08)". - "

". - "- [fix] Bug qui bloquait la multi-sélection sur les pages >1.
". - "- [fix] Bug qui rendait impossible de changer le nombre de jours de conservation des rapports.
". - "- [fix] Bug qui demandait une version de XTense qui n'est pas encore sortie.
". - "

", - - "
Version 1.4 : (06/04/08)". - "

". - "- [add] Possibilité de faire des liens supplémentaire vers d'autre mods en ajoutant le texte du lien.
". - "- [add] Page de configuration accessible à tous permettant de voir modifier et sauvegarder ses options.
". - "- [add] Le choix des dates passe par un script Calendrier en Java.
". - "- [add] Possibiliter d'afficher le bloc d'insertion en bas de la page d'accueil ou non (option dans la page admin).
". - "- [add] Ajout des liens analyser et filtrer dans les popups.
". - "- [add] Possibilité de filtrer par rapport à une planète espion.
". - "- [add] Amélioration de la liste d'espionnage : possibilité de multi-séléction.
". - "- [add] Compatibilité avec le mod XTense 2.0b5.
". - "- [fix] Erreur de Syntaxe.
". - "- [fix] BBCode & Graphique de la page détails/hof.
". - "- [fix] Réinstaller sur une table <1.0.
". - "- [fix] Erreur \"Undefined offset\" lorsqu'on importe un scan parti d'une galaxie non importée.
". - "- [mod] Uniformisation des bulles d'aides.
". - "- [mod] Le popup a été totalement repensé et recodé, le tableau affiche maintenant les heures en fonction des jours de la semaine.
". - "- [mod] Simplification du script d'analyse des coordonnées.
". - "- [mod] L'exportation BBCode a été repensée entièrement, un aperçu à été ajouté pour les tableaux.
". - "- [mod] Les graphiques s'agrandissent, s'affichent sur clic et dans un bloc fixé.
". - "

", - - "
Version 1.3b : (19/02/08)". - "

". - "- [fix] Erreur \"Undefined offset\" lorsqu'on a moins de 10 espionnages enregistrés.
". - "- [fix] Correction de grosse fautes de français (toutes? nan, surement pas...).
". - "

", - - "
Version 1.3 : (19/02/08)". - "

". - "- [add] Possibilité de filtrer la liste de tous les espionnages en fonction d'un membre.
". - "- [mod] Refonte des codes de mise à jour, installation et désinstallation.
". - "- [add] Ajout d'images pour le menu et l'en-tête.
". - "- [mod] Regroupement des 3 pages d'analyse (analyse des planètes, interpolation, et analyse globale) en une seule et unique page Analyse.
". - "- [mod] Création des dossiers 'includes' et 'pages' pour séparer les fichiers .PHP qui commencent à devenir nombreux.
". - "- [mod] Ajout de la page \"Insertion\" qui permet d'insérer manuellement un ou plusieurs espionnages.
". - "- [add] Ajout de la page \"mes Détails\" qui affiche les statistiques, ainsi que 6 \" Top5 \" : Espions, Alliances, Planètes, Jours et Heures.
". - "- [add] Ajout de la page \"Hall Of Fame\" qui affiche les statistiques générales de tous les membres confondus ainsi que les Top5 globaux.
". - "- [add] Possibilité d'exporter les Top5 et les Statistiques vers un forum.
". - "- [mod] Modification de la page d'accueil: Suppression de la zone d'ajout manuel d'espionnage, et allègement des statistiques. L'insertion se fait maintenant dans une page dédiée, et les statisques sont détaillées dans la page \"Mes Détails\".
". - "- [add] Compatibilité avec XTense v2.
". - "

", - - "
Version 1.2 : (19/01/08)". - "

". - "- [add] Possibilité d'ajouter des RE d'un autre membre de OGSpy. (dans le cas d'un sitting ou d'un envoie pas message collectif).
". - "- [fix] La remise à zéro des statistiques à l'import d'un RE par XTense faisait bugger la barre d'outils.
". - "

", - - "
Version 1.1a : (02/01/08)". - "

". - "- [fix] Bug sur la page de détail. Le 2e graphique intégrait les valeurs du 1er graphique.
". - "

", - - "
Version 1.1 : (02/01/08)". - "

". - "- [add] Possibilité de modifier tous les espionnages d'une page d'un seul clic.
". - "- [fix] Les satistiques se mettent maintenant à jour quand il faut.
". - "- [fix] Bug au niveau des graphiques.
". - "

", - - "
Version 1.0 : (09/12/07)". - "

". - "- Chaque utilisateur peut désormais choisir individuellement le nombre d'espionnage à afficher par page, par défaut sera utilisé le nombre choisi par l'administrateur.
". - "- Ajout d'une icone information qui ouvre une nouvelle fenetre offrant plus de détails sur un seul espion.
". - "- Possibilité d'exporter un espionnage sous forme BBCode pour un forum, ou HTML pour autre.
". - "- Plus besoin de cliquer sur les `<<<` ou les `>>>` pour changer de page, un clic dans la case suffit.
". - "- Il est possible de mettre à jour un espionnage affiché dans les 3 derniers de la page d'accueil.
". - "- Maintenant, il n'y aura plus affiché les 2 noms, lorsqu'un joueur en a changé. Par contre, une icone apparait à gauche. Un survole pour vous dire ce qui a changé, et un clic pour modifier si c'est toujours le même, sinon... la poubelle est à droite.
". - "- Modification des icônes d'effacement et d'édition.
". - "- Amélioration de l'algorithme d'affichage... C'est plus rapide, non?
". - "- Modification de la base de donnée. Ajout du champ `distance` et du champ `user_id` dans la table de config. Maintenant, la distance est calculé à l'enregistrement de l'espionnage, les statistiques des utilisateurs ne sont calculées qu'une seule fois, et chaque membre peut avoir des configurations privées.
". - "

", - - "
Version 0.91 : (16/11/07)". - "

". - "- Petite revue du code d'inportation et des fonctions.
". - "- Refonte de la page Accueil avec l'ajout des 3 derniers rapports.
". - "- Ajout d'une page n'affichant que la liste d'espionnage.
". - "- Ajout d'une page affichant les espionnages de tous les membres.
". - "- Gestion des filtres améliorée.
". - "- Gestion des pages améliorée.
". - "- Possibilité de mettre à jour un espion qui a changé.
". - "

", - - "
Version 0.8 : (29/10/07)". - "

". - "- La donnée \"Tranquille depuis\" était erronée. [fix].
". - "- Compatibilité avec FireSpy.
". - "

", - - "
Version 0.7 : (14/10/07)". - "

". - "- Ajout du \"Graphique d'Espionnage\" dans les popups des Top Heures qui permet une vue rapide des espionnages en fonction des heures de la journée.
". - "- Ajout d'un popup sur \"tranquille depuis\" qui donne la moyenne entre 2 sondages.
". - "- Le popup sur la période tranquille la plus longue donne maintenant les 3 intervals les plus longs.
". - "- Il n'y a plus de \"-\" devant le temps écoulé.
". - "- \"Warning\" lorsqu'il n'y a pas d'espionnage, sur les serveurs Free [fix].
". - "

", - - "
Version 0.6a : (07/10/07)". - "

". - "- Division par zéro quand il n'y a pas d'espionnage stockés [fix].
". - "

", - - "
Version 0.6 : (07/10/07)". - "

". - "- Ajout du script de liaison avec XTense.
". - "- Ajout de la gestion du temps dans le bilan: notion de tranquillité et d'intensité.
". - "- Ajout d'une confirmation avant d'effacement un espionnage.
". - "- Nouveau look de la liste d'espionnage.
". - "

", - - "
Version 0.5 : (30/09/07)". - "

". - "- La page d'admin fonctionne enfin comme il faut.
". - "- Correction du bug des 94%.
". - "- Les dates n'etaient pas bonne dans le changelog.
". - "

", - - "
Version 0.4a : (28/09/07)". - "

". - "- Correction du bug de la page Admin.
". - "

", - - "
Version 0.4 : (27/09/07)". - "

". - "- Les popups qui s'affichent dans la page galaxie sur le nom du joueur et de l'alliance s'affichent désormais également dans la liste des espionnages.
". - "- S'il y a des espionnages sur la planète de l'espion, un lien s'affiche alors dans la liste d'espionnage, toujours comme dans la page galaxie.
". - "- Il est maintenant possible d'analyser les espionnages en prenant en compte les enregistrements de tous les membres du serveur et ce, par joueurs ou par alliances.". - "

", - - "
Version 0.3 : (25/09/07)". - "

". - "- Ajout d'un contrôle d'erreur dans la recherche de l'alliance et du pseudo dans la base de donnée de l'univers.
". - "

", - - "
Version 0.2a : (24/09/07)". - "

". - "- Ajout de la possibilité de filtrer la liste d'espionnage par Joueur, Alliance ou planète Cible.
". - "

", - - "
Version 0.1 : (23/09/07)". - "

". - "Après de nombreuses modifications du mod QuiMObserve de Santory, j'ai finalement décidé d'en faire un nouveau indépendant.

". - "- Enregistrement de la planète d'où vient l'espionnage, du nom et de l'alliance de l'espion (si le système à été scanné), de la planète espionnée, ". - "du pourcentage de chance de destruction et de l'heure et date de l'espionnage.
". - "- Affichage de la liste des espionnages enregistrés.
". - "- Possibilité de trier la liste en fonction de chaque colones.
". - "- Affichage du bilan : Joueur le plus curieux, alliance la plus curieuse, planète la plus sondé, moyenne de pourcentage de destruction et nombre total d'espionnage.
". - "- Interpolation en fonction du Joueur ou de l'alliance, fonction très largement inspiré du module de Santory.
". - "- Analyse de l'espionnage par planète, fonction très largement inspiré du module de Santory.
". - "

" +$lang['qms_changelog'] = array( + "
Version 1.8 : (03/01/12)" . + "

" . + "- [fix] Bug de calcul des distances
" . + "- [fix] Lien pour les RE des joueurs qui nous sondent
" . + "- [fix] Permettre l'édition des dates dans la config
" . + "- [fix] Correction lien du changelog
" . + "- [add] Compatibilité avec les nouveaux classements
" . + "

", + + "
Version 1.6a : (09/11/08)" . + "

" . + "- [fix] Divers petits bugs.
" . + "- [add] Compatibilité Xtense 2.1.
" . + "

", + + "
Version 1.5b : (11/08/08)" . + "

" . + "- [fix] Divers petits bugs.
" . + "- [fix] Un caractère spécial dans le nom de la base de donnée créait une erreur SQL.
" . + "- [fix] Erreur PHP-8 : Double define des dossiers dans _xtense.php.
" . + "- [fix] Mail & lien dans le pied de page.
" . + "- [fix] Problème de calcul de la distance dans les insertions manuelles.
" . + "- [mod] Simplification de la page ChangeLog.
" . + "

", + + "
Version 1.5 : (10/08/08)" . + "

" . + "- [add] Enregistrement du nom des planètes, permet de savoir si on parle de lunes. " . + "(mod xtense 2.0b6 non compatible).
" . + "- [add] Controle des données saisies par java puis php.
" . + "- [add] Affichage de la bannière optionnel pour chaque utilisateur. (caché par défaut)
" . + "- [add] Menu graphique optionnel pour chaque utilisateur. (caché par défaut)
" . + "- [add] Fichier de langage, possibilité de traduire le mod.
" . + "- [add] Affichage des boutons de défilement des pages en haut si y'a plus de 50 lignes.
" . + "- [fix] Erreurs PHP lorsqu'il n'y a aucun RE dans la base.
" . + "- [fix] Apperçu du BBCode toujours centré alors que le BBCode ne l'est plus.
" . + "

", + + "
Version 1.4b : (08/04/08)" . + "

" . + "- [mod] Nouveau style de BBCode inspiré des conseils avisés de Louwok.
" . + "- [fix] Installation du CallBack pour XTense2.
" . + "- [add] Ajout d'un bouton qui permet à l'admin de forcer l'installation du CallBack XTense2.
" . + "

", + + "
Version 1.4a : (06/04/08)" . + "

" . + "- [fix] Bug qui bloquait la multi-sélection sur les pages >1.
" . + "- [fix] Bug qui rendait impossible de changer le nombre de jours de conservation des rapports.
" . + "- [fix] Bug qui demandait une version de XTense qui n'est pas encore sortie.
" . + "

", + + "
Version 1.4 : (06/04/08)" . + "

" . + "- [add] Possibilité de faire des liens supplémentaire vers d'autre mods en ajoutant le texte du lien.
" . + "- [add] Page de configuration accessible à tous permettant de voir modifier et sauvegarder ses options.
" . + "- [add] Le choix des dates passe par un script Calendrier en Java.
" . + "- [add] Possibiliter d'afficher le bloc d'insertion en bas de la page d'accueil ou non (option dans la page admin).
" . + "- [add] Ajout des liens analyser et filtrer dans les popups.
" . + "- [add] Possibilité de filtrer par rapport à une planète espion.
" . + "- [add] Amélioration de la liste d'espionnage : possibilité de multi-séléction.
" . + "- [add] Compatibilité avec le mod XTense 2.0b5.
" . + "- [fix] Erreur de Syntaxe.
" . + "- [fix] BBCode & Graphique de la page détails/hof.
" . + "- [fix] Réinstaller sur une table <1.0.
" . + "- [fix] Erreur \"Undefined offset\" lorsqu'on importe un scan parti d'une galaxie non importée.
" . + "- [mod] Uniformisation des bulles d'aides.
" . + "- [mod] Le popup a été totalement repensé et recodé, le tableau affiche maintenant les heures en fonction des jours de la semaine.
" . + "- [mod] Simplification du script d'analyse des coordonnées.
" . + "- [mod] L'exportation BBCode a été repensée entièrement, un aperçu à été ajouté pour les tableaux.
" . + "- [mod] Les graphiques s'agrandissent, s'affichent sur clic et dans un bloc fixé.
" . + "

", + + "
Version 1.3b : (19/02/08)" . + "

" . + "- [fix] Erreur \"Undefined offset\" lorsqu'on a moins de 10 espionnages enregistrés.
" . + "- [fix] Correction de grosse fautes de français (toutes? nan, surement pas...).
" . + "

", + + "
Version 1.3 : (19/02/08)" . + "

" . + "- [add] Possibilité de filtrer la liste de tous les espionnages en fonction d'un membre.
" . + "- [mod] Refonte des codes de mise à jour, installation et désinstallation.
" . + "- [add] Ajout d'images pour le menu et l'en-tête.
" . + "- [mod] Regroupement des 3 pages d'analyse (analyse des planètes, interpolation, et analyse globale) en une seule et unique page Analyse.
" . + "- [mod] Création des dossiers 'includes' et 'pages' pour séparer les fichiers .PHP qui commencent à devenir nombreux.
" . + "- [mod] Ajout de la page \"Insertion\" qui permet d'insérer manuellement un ou plusieurs espionnages.
" . + "- [add] Ajout de la page \"mes Détails\" qui affiche les statistiques, ainsi que 6 \" Top5 \" : Espions, Alliances, Planètes, Jours et Heures.
" . + "- [add] Ajout de la page \"Hall Of Fame\" qui affiche les statistiques générales de tous les membres confondus ainsi que les Top5 globaux.
" . + "- [add] Possibilité d'exporter les Top5 et les Statistiques vers un forum.
" . + "- [mod] Modification de la page d'accueil: Suppression de la zone d'ajout manuel d'espionnage, et allègement des statistiques. L'insertion se fait maintenant dans une page dédiée, et les statisques sont détaillées dans la page \"Mes Détails\".
" . + "- [add] Compatibilité avec XTense v2.
" . + "

", + + "
Version 1.2 : (19/01/08)" . + "

" . + "- [add] Possibilité d'ajouter des RE d'un autre membre de OGSpy. (dans le cas d'un sitting ou d'un envoie pas message collectif).
" . + "- [fix] La remise à zéro des statistiques à l'import d'un RE par XTense faisait bugger la barre d'outils.
" . + "

", + + "
Version 1.1a : (02/01/08)" . + "

" . + "- [fix] Bug sur la page de détail. Le 2e graphique intégrait les valeurs du 1er graphique.
" . + "

", + + "
Version 1.1 : (02/01/08)" . + "

" . + "- [add] Possibilité de modifier tous les espionnages d'une page d'un seul clic.
" . + "- [fix] Les satistiques se mettent maintenant à jour quand il faut.
" . + "- [fix] Bug au niveau des graphiques.
" . + "

", + + "
Version 1.0 : (09/12/07)" . + "

" . + "- Chaque utilisateur peut désormais choisir individuellement le nombre d'espionnage à afficher par page, par défaut sera utilisé le nombre choisi par l'administrateur.
" . + "- Ajout d'une icone information qui ouvre une nouvelle fenetre offrant plus de détails sur un seul espion.
" . + "- Possibilité d'exporter un espionnage sous forme BBCode pour un forum, ou HTML pour autre.
" . + "- Plus besoin de cliquer sur les `<<<` ou les `>>>` pour changer de page, un clic dans la case suffit.
" . + "- Il est possible de mettre à jour un espionnage affiché dans les 3 derniers de la page d'accueil.
" . + "- Maintenant, il n'y aura plus affiché les 2 noms, lorsqu'un joueur en a changé. Par contre, une icone apparait à gauche. Un survole pour vous dire ce qui a changé, et un clic pour modifier si c'est toujours le même, sinon... la poubelle est à droite.
" . + "- Modification des icônes d'effacement et d'édition.
" . + "- Amélioration de l'algorithme d'affichage... C'est plus rapide, non?
" . + "- Modification de la base de donnée. Ajout du champ `distance` et du champ `user_id` dans la table de config. Maintenant, la distance est calculé à l'enregistrement de l'espionnage, les statistiques des utilisateurs ne sont calculées qu'une seule fois, et chaque membre peut avoir des configurations privées.
" . + "

", + + "
Version 0.91 : (16/11/07)" . + "

" . + "- Petite revue du code d'inportation et des fonctions.
" . + "- Refonte de la page Accueil avec l'ajout des 3 derniers rapports.
" . + "- Ajout d'une page n'affichant que la liste d'espionnage.
" . + "- Ajout d'une page affichant les espionnages de tous les membres.
" . + "- Gestion des filtres améliorée.
" . + "- Gestion des pages améliorée.
" . + "- Possibilité de mettre à jour un espion qui a changé.
" . + "

", + + "
Version 0.8 : (29/10/07)" . + "

" . + "- La donnée \"Tranquille depuis\" était erronée. [fix].
" . + "- Compatibilité avec FireSpy.
" . + "

", + + "
Version 0.7 : (14/10/07)" . + "

" . + "- Ajout du \"Graphique d'Espionnage\" dans les popups des Top Heures qui permet une vue rapide des espionnages en fonction des heures de la journée.
" . + "- Ajout d'un popup sur \"tranquille depuis\" qui donne la moyenne entre 2 sondages.
" . + "- Le popup sur la période tranquille la plus longue donne maintenant les 3 intervals les plus longs.
" . + "- Il n'y a plus de \"-\" devant le temps écoulé.
" . + "- \"Warning\" lorsqu'il n'y a pas d'espionnage, sur les serveurs Free [fix].
" . + "

", + + "
Version 0.6a : (07/10/07)" . + "

" . + "- Division par zéro quand il n'y a pas d'espionnage stockés [fix].
" . + "

", + + "
Version 0.6 : (07/10/07)" . + "

" . + "- Ajout du script de liaison avec XTense.
" . + "- Ajout de la gestion du temps dans le bilan: notion de tranquillité et d'intensité.
" . + "- Ajout d'une confirmation avant d'effacement un espionnage.
" . + "- Nouveau look de la liste d'espionnage.
" . + "

", + + "
Version 0.5 : (30/09/07)" . + "

" . + "- La page d'admin fonctionne enfin comme il faut.
" . + "- Correction du bug des 94%.
" . + "- Les dates n'etaient pas bonne dans le changelog.
" . + "

", + + "
Version 0.4a : (28/09/07)" . + "

" . + "- Correction du bug de la page Admin.
" . + "

", + + "
Version 0.4 : (27/09/07)" . + "

" . + "- Les popups qui s'affichent dans la page galaxie sur le nom du joueur et de l'alliance s'affichent désormais également dans la liste des espionnages.
" . + "- S'il y a des espionnages sur la planète de l'espion, un lien s'affiche alors dans la liste d'espionnage, toujours comme dans la page galaxie.
" . + "- Il est maintenant possible d'analyser les espionnages en prenant en compte les enregistrements de tous les membres du serveur et ce, par joueurs ou par alliances." . + "

", + + "
Version 0.3 : (25/09/07)" . + "

" . + "- Ajout d'un contrôle d'erreur dans la recherche de l'alliance et du pseudo dans la base de donnée de l'univers.
" . + "

", + + "
Version 0.2a : (24/09/07)" . + "

" . + "- Ajout de la possibilité de filtrer la liste d'espionnage par Joueur, Alliance ou planète Cible.
" . + "

", + + "
Version 0.1 : (23/09/07)" . + "

" . + "Après de nombreuses modifications du mod QuiMObserve de Santory, j'ai finalement décidé d'en faire un nouveau indépendant.

" . + "- Enregistrement de la planète d'où vient l'espionnage, du nom et de l'alliance de l'espion (si le système à été scanné), de la planète espionnée, " . + "du pourcentage de chance de destruction et de l'heure et date de l'espionnage.
" . + "- Affichage de la liste des espionnages enregistrés.
" . + "- Possibilité de trier la liste en fonction de chaque colones.
" . + "- Affichage du bilan : Joueur le plus curieux, alliance la plus curieuse, planète la plus sondé, moyenne de pourcentage de destruction et nombre total d'espionnage.
" . + "- Interpolation en fonction du Joueur ou de l'alliance, fonction très largement inspiré du module de Santory.
" . + "- Analyse de l'espionnage par planète, fonction très largement inspiré du module de Santory.
" . + "

" ); -$lang['qms_footer'] = - "
%1\$s v%2\$s by Sylar © 2008
\n". - "Mod de Gestion des Espionnages subits
". - "ChangeLog / ". - "plus d'infos

\n"; - -?> +$lang['qms_footer'] = + "
%1\$s v%2\$s by Sylar © 2008
\n" . + "Mod de Gestion des Espionnages subits
" . + "ChangeLog / " . + "plus d'infos

\n"; diff --git a/pages/footer.php b/pages/footer.php index 0638dd6..9ca1468 100644 --- a/pages/footer.php +++ b/pages/footer.php @@ -1,4 +1,5 @@ \n"; -echo sprintf($lang['qms_footer'],$mod_name,$version); +echo sprintf($lang['qms_footer'], $mod_name, $version); echo "\n\n\n"; diff --git a/pages/own_details.php b/pages/own_details.php index c20642a..628397b 100644 --- a/pages/own_details.php +++ b/pages/own_details.php @@ -335,7 +335,7 @@ function get_spy_type_tooltip($table, $limite, $titre, $ttLeft = 0) else $value .= "_x_" . $table['count'][$i]; if ($legend == "") $legend = $data_tmp; else - if (!$notab) + if (!$notab) $legend .= "_x_" . $data_tmp; else { $cnt++; diff --git a/pages/spy_list_public.php b/pages/spy_list_public.php index 4e10534..67b30c3 100644 --- a/pages/spy_list_public.php +++ b/pages/spy_list_public.php @@ -1,4 +1,5 @@