diff --git a/VERSION b/VERSION index c81aa44..d612b7f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.7 +0.9.7.1 diff --git a/config/config.php.example b/config/config.php.example index 566c9c7..27d56b2 100644 --- a/config/config.php.example +++ b/config/config.php.example @@ -337,4 +337,18 @@ $queries[$q]['base'] = 'dc=example,dc=com'; $queries[$q]['scope'] = 'sub'; $queries[$q]['filter'] = '(&(objectClass=sambaAccount)(uid=*$))'; $queries[$q]['attributes'] = 'uid, homeDirectory'; + +/** **/ +/** Date type attributes **/ +/** **/ +/* If you wish to use the jscalendar popup to select a date graphically, + define this array of date type attributes. + Modify the file htdocs/js/date_selector.js to set up the calendar format. + The default format is: + ifFormat : '%m/%e/%Y', // format of the input field + showsTime : false, // will display a time selector + singleClick : false, // double-click mode + align : 'BR', // alignement + step : 0 // show all years in drop-down boxes +*/ ?> diff --git a/htdocs/add_attr.php b/htdocs/add_attr.php index 861b4a4..65eda12 100644 --- a/htdocs/add_attr.php +++ b/htdocs/add_attr.php @@ -1,5 +1,5 @@ createSambaPasswords( $val ); - $val = $mkntPassword->valueOf($attr); +elseif (strcasecmp($attr,'sambaNTPassword') == 0) { + $sambapassword = new smbHash; + $val = $sambapassword->nthash($val); +} + +elseif (strcasecmp($attr,'sambaLMPassword') == 0) { + $sambapassword = new smbHash; + $val = $sambapassword->lmhash($val); } $new_entry = array( $attr => $val ); @@ -120,7 +125,7 @@ if ($result) $ldapserver->server_id,$encoded_dn,$encoded_attr)); else - pla_error( $lang['failed_to_add_attr'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect()) ); + pla_error( $lang['failed_to_add_attr'],$ldapserver->error(),$ldapserver->errno() ); /** * Check if we need to append the ;binary option to the name @@ -150,7 +155,7 @@ function is_binary_option_required( $ldapserver, $attr ) { //if( 0 == strcasecmp( $attr, $name ) ) //return true; - $schema_attr = get_schema_attribute( $ldapserver, $attr ); + $schema_attr = $ldapserver->getSchemaAttribute($attr); if( ! $schema_attr ) return false; diff --git a/htdocs/add_attr_form.php b/htdocs/add_attr_form.php index 3826902..6569e81 100644 --- a/htdocs/add_attr_form.php +++ b/htdocs/add_attr_form.php @@ -1,5 +1,5 @@ SchemaObjectClasses($dn); foreach( $oclasses as $oclass ) { - $schema_oclass = get_schema_objectclass( $ldapserver, $oclass, $dn ); + $schema_oclass = $ldapserver->getSchemaObjectClass($oclass,$dn); if( $schema_oclass && 0 == strcasecmp( 'objectclass', get_class( $schema_oclass ) ) ) $avail_attrs = array_merge( $schema_oclass->getMustAttrNames( $schema_oclasses ), diff --git a/htdocs/add_oclass.php b/htdocs/add_oclass.php index ac4f123..10a2fed 100644 --- a/htdocs/add_oclass.php +++ b/htdocs/add_oclass.php @@ -1,5 +1,5 @@ 0 ) $add_res = @ldap_mod_add( $ldapserver->connect(), $dn, $new_entry ); if (! $add_res) - pla_error($lang['could_not_perform_ldap_mod_add'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error($lang['could_not_perform_ldap_mod_add'],$ldapserver->error(),$ldapserver->errno()); else header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=objectclass',$ldapserver->server_id,$encoded_dn)); diff --git a/htdocs/add_oclass_form.php b/htdocs/add_oclass_form.php index 2b62009..72263c3 100644 --- a/htdocs/add_oclass_form.php +++ b/htdocs/add_oclass_form.php @@ -1,5 +1,5 @@ isReadOnly() ) if( ! $ldapserver->haveAuthInfo()) pla_error( $lang['not_enough_login_info'] ); +if (! isset($_POST['new_oclass'])) + pla_error( $lang['no_objectclasses_selected']); + $new_oclass = $_REQUEST['new_oclass']; $dn = rawurldecode( $_REQUEST['dn'] ); $encoded_dn = rawurlencode( $dn ); @@ -41,10 +45,10 @@ foreach( $entry as $attr => $junk ) $current_attrs[] = strtolower($attr); // grab the required attributes for the new objectClass -$schema_oclasses = get_schema_objectclasses( $ldapserver ); +$schema_oclasses = $ldapserver->SchemaObjectClasses(); $must_attrs = array(); foreach( $new_oclass as $oclass_name ) { - $oclass = get_schema_objectclass( $ldapserver, $oclass_name ); + $oclass = $ldapserver->getSchemaObjectClass($oclass_name); if( $oclass ) $must_attrs = array_merge( $must_attrs, $oclass->getMustAttrNames( $schema_oclasses ) ); } @@ -58,7 +62,7 @@ $must_attrs = array_unique( $must_attrs ); // but that the object does not currently contain $needed_attrs = array(); foreach( $must_attrs as $attr ) { - $attr = get_schema_attribute( $ldapserver, $attr ); + $attr = $ldapserver->getSchemaAttribute($attr); //echo "
"; var_dump( $attr ); echo "
"; @@ -124,7 +128,7 @@ if( count( $needed_attrs ) > 0 ) { $add_res = @ldap_mod_add( $ldapserver->connect(), $dn, array( 'objectClass' => $new_oclass ) ); if (! $add_res) pla_error("Could not perform ldap_mod_add operation.", - ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + $ldapserver->error(),$ldapserver->errno()); else header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=objectClass', $ldapserver->server_id,$encoded_dn)); diff --git a/htdocs/add_value.php b/htdocs/add_value.php index 46c41d4..d362015 100644 --- a/htdocs/add_value.php +++ b/htdocs/add_value.php @@ -1,5 +1,5 @@ $ldapserver->server_id, 'd if (! $add_result) pla_error($lang['could_not_perform_ldap_mod_add'], - ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + $ldapserver->error(),$ldapserver->errno()); } header(sprintf('Location: edit.php?server_id=%s&dn=%s&modified_attrs[]=%s', diff --git a/htdocs/add_value_form.php b/htdocs/add_value_form.php index 3e06798..0c93dcf 100644 --- a/htdocs/add_value_form.php +++ b/htdocs/add_value_form.php @@ -1,5 +1,5 @@ SchemaObjectClasses(); foreach( $current_values as $oclass ) unset( $schema_oclasses[ strtolower( $oclass ) ] ); } else { - $schema_attr = get_schema_attribute( $ldapserver, $attr ); + $schema_attr = $ldapserver->getSchemaAttribute($attr); } include './header.php'; ?> @@ -142,7 +142,7 @@ include './header.php'; ?> $oclass ) { // exclude any structural ones, as they'll only generate an LDAP_OBJECT_CLASS_VIOLATION - if ($oclass->type == "structural") continue; ?> + if ($oclass->getType() == "structural") continue; ?> diff --git a/htdocs/collapse.php b/htdocs/collapse.php index e4bb7c9..7fbb856 100644 --- a/htdocs/collapse.php +++ b/htdocs/collapse.php @@ -1,5 +1,5 @@ diff --git a/htdocs/compare.php b/htdocs/compare.php index 2801bae..e2b72b9 100644 --- a/htdocs/compare.php +++ b/htdocs/compare.php @@ -1,5 +1,5 @@ getSchemaAttribute($attr,$dn_src); + $schema_attr_dst = $ldapserver_dst->getSchemaAttribute($attr,$dn_dst); # Setup the $attr_note, which will be displayed to the right of the attr name (if any) $attr_note = ''; @@ -348,7 +348,7 @@ foreach ($attrs_all as $attr) { GetValue('appearance','obfuscate_password_display') || is_null( $enc_type ) ) { + if( obfuscate_password_display( $enc_type ) ) { echo htmlspecialchars( preg_replace( "/./", "*", $user_password ) ); } else { echo htmlspecialchars( $user_password ); @@ -430,9 +430,9 @@ foreach ($attrs_all as $attr) { - getSchemaObjectClass($val); - if ($schema_object->type == 'structural') { + if ($schema_object->getType() == 'structural') { echo "$val (" . $lang['structural'] . ")
"; if ($side == 'dst') {?> @@ -500,7 +500,7 @@ foreach ($attrs_all as $attr) { // First check if the required objectClass is in this DN $isOK = 0; $src_oclass = array(); - $attr_object = get_schema_attribute( $ldapserver_dst, $attr, $dn_dst ); + $attr_object = $ldapserver_dst->getSchemaAttribute($attr,$dn_dst); foreach ($attr_object->used_in_object_classes as $oclass) { if (in_array(strtolower($oclass),arrayLower($attrs_dst['objectClass']))) { $isOK = 1; diff --git a/htdocs/compare_form.php b/htdocs/compare_form.php index 9c915bc..27ea450 100644 --- a/htdocs/compare_form.php +++ b/htdocs/compare_form.php @@ -1,5 +1,5 @@ server_id,$ldapserver_dst->server_id,serialize($tree),$root_dn,$dn_dst),2); + if (DEBUG_ENABLED) + debug_log('r_copy_dn: Entered with (%s,%s,%s,%s,%s)',2, + $ldapserver_src->server_id,$ldapserver_dst->server_id,serialize($tree),$root_dn,$dn_dst); global $lang; @@ -160,8 +161,9 @@ function r_copy_dn($ldapserver_src,$ldapserver_dst,$tree,$root_dn,$dn_dst) { } function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) { - debug_log(sprintf('copy_dn: Entered with (%s,%s,%s,%s)', - $ldapserver_src->server_id,$ldapserver_dst->server_id,$dn_src,$dn_dst),2); + if (DEBUG_ENABLED) + debug_log('copy_dn: Entered with (%s,%s,%s,%s)',2, + $ldapserver_src->server_id,$ldapserver_dst->server_id,$dn_src,$dn_dst); global $lang; @@ -186,7 +188,7 @@ function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) { 'dn'=>$dn_dst,'attrs'=>$new_entry)); print '

'; - pla_error($lang['copy_failed'] . $dn_dst,ldap_error($ldapserver_dst->connect()),ldap_errno($ldapserver_dst->connect())); + pla_error($lang['copy_failed'] . $dn_dst,$ldapserver_dst->error(),$ldapserver_dst->errno()); } return $add_result; @@ -203,9 +205,6 @@ function copy_dn($ldapserver_src,$ldapserver_dst,$dn_src,$dn_dst) { * @param string $filter */ function build_tree($ldapserver,$dn,$tree,$filter='(objectClass=*)') { - debug_log(sprintf('build_tree: Entered with (%s,%s,%s,%s)', - $ldapserver->server_id,$dn,serialize($tree),$filter),2); - $children = get_container_contents($ldapserver,$dn,0,$filter); if (is_array($children) && count($children) > 0) { @@ -214,7 +213,10 @@ function build_tree($ldapserver,$dn,$tree,$filter='(objectClass=*)') { $tree = build_tree($ldapserver,$child_dn,$tree,$filter); } - debug_log(sprintf('build_tree: Returning (%s)',serialize($tree)),1); + if (DEBUG_ENABLED) + debug_log('build_tree: Entered with (%s,%s,%s,%s), Returning (%s)',1, + $ldapserver->server_id,$dn,serialize($tree),$filter,serialize($tree)); + return $tree; } ?> diff --git a/htdocs/copy_form.php b/htdocs/copy_form.php index 07a45ee..84c2ad7 100644 --- a/htdocs/copy_form.php +++ b/htdocs/copy_form.php @@ -1,5 +1,5 @@ connect() ), ldap_errno( $ldapserver->connect() ) ); + pla_error( $lang['create_could_not_add'], $ldapserver->error(), $ldapserver->errno() ); } ?> diff --git a/htdocs/create_form.php b/htdocs/create_form.php index f2444b9..dcf6649 100644 --- a/htdocs/create_form.php +++ b/htdocs/create_form.php @@ -1,5 +1,5 @@ server_id); if ($config->GetValue('template_engine','disable_old')) - $templates = $template_xml->_template; + $templates = $template_xml->getTemplates(); else - $templates = array_merge($template_xml->_template,$templates); + $templates = array_merge($template_xml->getTemplates(),$templates); } # Remove non-visable templates. diff --git a/htdocs/creation_template.php b/htdocs/creation_template.php index fa6c24d..dbe7bbd 100644 --- a/htdocs/creation_template.php +++ b/htdocs/creation_template.php @@ -1,5 +1,5 @@ ' . pretty_print_dn($dn) . ''), - ldap_error($ldapserver->connect()), ldap_errno($ldapserver->connect())); + $ldapserver->error(), $ldapserver->errno()); } ?> diff --git a/htdocs/delete_attr.php b/htdocs/delete_attr.php index 1fcf7dd..3801582 100644 --- a/htdocs/delete_attr.php +++ b/htdocs/delete_attr.php @@ -1,5 +1,5 @@ connect()),ldap_errno($ldapserver->connect())); + pla_error($lang['could_not_perform_ldap_modify'],$ldapserver->error(),$ldapserver->errno()); } ?> diff --git a/htdocs/delete_form.php b/htdocs/delete_form.php index dcd3597..f16da60 100644 --- a/htdocs/delete_form.php +++ b/htdocs/delete_form.php @@ -1,5 +1,5 @@ connect(),$dn,"(objectClass=*)",array($attr),0,0,0,$config->GetValue('deref','view')); if (! $search) - pla_error($lang['error_performing_search'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error($lang['error_performing_search'],$ldapserver->error(),$ldapserver->errno()); $entry = ldap_first_entry($ldapserver->connect(),$search); $attrs = ldap_get_attributes($ldapserver->connect(),$entry); diff --git a/htdocs/edit.php b/htdocs/edit.php index f7d7429..d9beb41 100644 --- a/htdocs/edit.php +++ b/htdocs/edit.php @@ -1,5 +1,5 @@ getBaseDN() as $base_dn) { - debug_log(sprintf('%s: Comparing BaseDN [%s] with container [%s]','entry_chooser.php',$base_dn,$container),9); + if (DEBUG_ENABLED) + debug_log('entry_chooser.php: Comparing BaseDN [%s] with container [%s]',9,$base_dn,$container); if (! pla_compare_dns($container,$base_dn)) { $parent_container = false; diff --git a/htdocs/expand.php b/htdocs/expand.php index c24ebaa..9fb4b82 100644 --- a/htdocs/expand.php +++ b/htdocs/expand.php @@ -1,5 +1,5 @@ \n"; + + + + + diff --git a/htdocs/help.php b/htdocs/help.php index 8152b8a..8aa6af6 100644 --- a/htdocs/help.php +++ b/htdocs/help.php @@ -1,5 +1,5 @@ + http://dynarch.com/mishoo/ + + This program is free software published under the + terms of the GNU Lesser General Public License. + + For the entire license text please refer to + http://www.gnu.org/licenses/lgpl.html + +Contents +--------- + + calendar.js -- the main program file + lang/*.js -- internalization files + *.css -- color themes + cal.html -- example usage file + doc/ -- documentation, in PDF and HTML + simple-1.html -- quick setup examples [popup calendars] + simple-2.html -- quick setup example for flat calendar + calendar.php -- PHP wrapper + test.php -- test file for the PHP wrapper + +Homepage +--------- + + For details and latest versions please refer to calendar + homepage, located on my website: + + http://dynarch.com/mishoo/calendar.epl + diff --git a/htdocs/js/jscalendar/calendar-blue.css b/htdocs/js/jscalendar/calendar-blue.css new file mode 100644 index 0000000..ca33cde --- /dev/null +++ b/htdocs/js/jscalendar/calendar-blue.css @@ -0,0 +1,232 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #556; + font-size: 11px; + color: #000; + cursor: default; + background: #eef; + font-family: tahoma,verdana,sans-serif; +} + +/* 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 */ +} + +.calendar .nav { + background: #778 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; + background: #fff; + color: #000; + padding: 2px; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + background: #778; + color: #fff; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #bdf; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #556; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #aaf; + color: #000; + border: 1px solid #04f; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #77c; + padding: 2px 0px 0px 2px; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #456; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #bbb; +} +.calendar tbody .day.othermonth.oweekend { + color: #fbb; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #bdf; +} + +.calendar tbody .rowhilite td { + background: #def; +} + +.calendar tbody .rowhilite td.wn { + background: #eef; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #def; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #cde; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fff; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { /* Cell showing selected date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #556; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #fff; + color: #445; + border-top: 1px solid #556; + padding: 1px; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #aaf; + border: 1px solid #04f; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #77c; + 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: 1px solid #655; + background: #def; + color: #000; + font-size: 90%; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: #acf; +} + +.calendar .combo .active { + border-top: 1px solid #46a; + border-bottom: 1px solid #46a; + background: #eef; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #f4f0e8; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #667; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-blue2.css b/htdocs/js/jscalendar/calendar-blue2.css new file mode 100644 index 0000000..47128ec --- /dev/null +++ b/htdocs/js/jscalendar/calendar-blue2.css @@ -0,0 +1,236 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #206A9B; + font-size: 11px; + color: #000; + cursor: default; + background: #F1F8FC; + font-family: tahoma,verdana,sans-serif; +} + +/* 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 */ +} + +.calendar .nav { + background: #007ED1 url(menuarrow2.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; + background: #000; + color: #fff; + padding: 2px; +} + +.calendar thead tr { /* Row containing navigation buttons */ + background: #007ED1; + color: #fff; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #C7E1F3; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #206A9B; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #34ABFA; + color: #000; + border: 1px solid #016DC5; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #006AA9; + border: 1px solid #008AFF; + padding: 2px 0px 0px 2px; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #456; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #bbb; +} +.calendar tbody .day.othermonth.oweekend { + color: #fbb; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #C7E1F3; +} + +.calendar tbody .rowhilite td { + background: #def; +} + +.calendar tbody .rowhilite td.wn { + background: #F1F8FC; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #def; + padding: 1px 3px 1px 1px; + border: 1px solid #8FC4E8; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #cde; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fff; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { /* Cell showing selected date */ + font-weight: bold; + color: #D50000; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #206A9B; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #000; + color: #fff; + border-top: 1px solid #206A9B; + padding: 1px; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #B8DAF0; + border: 1px solid #178AEB; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #006AA9; + 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: 1px solid #655; + background: #def; + color: #000; + font-size: 90%; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: #34ABFA; + border-top: 1px solid #46a; + border-bottom: 1px solid #46a; + font-weight: bold; +} + +.calendar .combo .active { + border-top: 1px solid #46a; + border-bottom: 1px solid #46a; + background: #F1F8FC; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #E3F0F9; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #F1F8FC; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #267DB7; + color: #fff; +} + +.calendar td.time span.active { + border-color: red; + background-color: #000; + color: #A5FF00; +} diff --git a/htdocs/js/jscalendar/calendar-brown.css b/htdocs/js/jscalendar/calendar-brown.css new file mode 100644 index 0000000..c42da5e --- /dev/null +++ b/htdocs/js/jscalendar/calendar-brown.css @@ -0,0 +1,225 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #655; + font-size: 11px; + color: #000; + cursor: default; + background: #ffd; + font-family: tahoma,verdana,sans-serif; +} + +/* 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 */ +} + +.calendar .nav { + background: #edc 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; + background: #654; + color: #fed; + padding: 2px; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + background: #edc; + color: #000; +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #655; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #faa; + color: #000; + border: 1px solid #f40; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #c77; + padding: 2px 0px 0px 2px; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #fed; +} + +/* 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.othermonth { + font-size: 80%; + color: #bbb; +} +.calendar tbody .day.othermonth.oweekend { + color: #fbb; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #fed; +} + +.calendar tbody .rowhilite td { + background: #ddf; +} + +.calendar tbody .rowhilite td.wn { + background: #efe; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #ffe; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #ddc; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fea; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { font-weight: bold; } + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #988; + color: #000; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + border-top: 1px solid #655; + background: #dcb; + color: #840; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #faa; + border: 1px solid #f40; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #c77; + 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: 1px solid #655; + background: #ffe; + color: #000; + font-size: 90%; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: #fc8; +} + +.calendar .combo .active { + border-top: 1px solid #a64; + border-bottom: 1px solid #a64; + background: #fee; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #a88; + padding: 1px 0px; + text-align: center; + background-color: #fed; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #988; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #866; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-green.css b/htdocs/js/jscalendar/calendar-green.css new file mode 100644 index 0000000..2e1867a --- /dev/null +++ b/htdocs/js/jscalendar/calendar-green.css @@ -0,0 +1,229 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #565; + font-size: 11px; + color: #000; + cursor: default; + background: #efe; + font-family: tahoma,verdana,sans-serif; +} + +/* 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 */ + background: #676; + color: #fff; + font-size: 90%; +} + +.calendar .nav { + background: #676 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; + padding: 2px; + background: #250; + color: #efa; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #565; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #a66; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #afa; + color: #000; + border: 1px solid #084; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #7c7; + padding: 2px 0px 0px 2px; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #dfb; +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + width: 2em; + color: #564; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #bbb; +} +.calendar tbody .day.othermonth.oweekend { + color: #fbb; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #8a8; + background: #dfb; +} + +.calendar tbody .rowhilite td { + background: #dfd; +} + +.calendar tbody .rowhilite td.wn { + background: #efe; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #efd; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #dec; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #f8fff8; + color: #000; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #a66; +} + +.calendar tbody td.today { font-weight: bold; color: #0a0; } + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #565; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + background: #250; + color: #efa; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #afa; + border: 1px solid #084; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #7c7; + 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: 1px solid #565; + background: #efd; + color: #000; + font-size: 90%; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: #af8; +} + +.calendar .combo .active { + border-top: 1px solid #6a4; + border-bottom: 1px solid #6a4; + background: #efe; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #8a8; + padding: 1px 0px; + text-align: center; + background-color: #dfb; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #898; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #686; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-setup.js b/htdocs/js/jscalendar/calendar-setup.js new file mode 100644 index 0000000..8513dd0 --- /dev/null +++ b/htdocs/js/jscalendar/calendar-setup.js @@ -0,0 +1,200 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * modify this code to suit your needs (this is recommended and much better + * than modifying calendar.js itself). + */ + +// $Id: calendar-setup.js,v 1.1.2.1 2005/10/09 05:45:23 wurley Exp $ + +/** + * This function "patches" an input field (or other element) to use a calendar + * widget for date selection. + * + * The "params" is a single object that can have the following properties: + * + * prop. name | description + * ------------------------------------------------------------------------------------------------- + * inputField | the ID of an input field to store the date + * displayArea | the ID of a DIV or other element to show the date + * button | ID of a button or other element that will trigger the calendar + * eventName | event that will trigger the calendar, without the "on" prefix (default: "click") + * ifFormat | date format that will be stored in the input field + * daFormat | the date format that will be used to display the date in displayArea + * singleClick | (true/false) wether the calendar is in single click mode or not (default: true) + * firstDay | numeric: 0 to 6. "0" means display Sunday first, "1" means display Monday first, etc. + * align | alignment (default: "Br"); if you don't know what's this see the calendar documentation + * range | array with 2 elements. Default: [1900, 2999] -- the range of years available + * weekNumbers | (true/false) if it's true (default) the calendar will display week numbers + * flat | null or element ID; if not null the calendar will be a flat calendar having the parent with the given ID + * flatCallback | function that receives a JS Date object and returns an URL to point the browser to (for flat calendar) + * disableFunc | function that receives a JS Date object and should return true if that date has to be disabled in the calendar + * onSelect | function that gets called when a date is selected. You don't _have_ to supply this (the default is generally okay) + * onClose | function that gets called when the calendar is closed. [default] + * onUpdate | function that gets called after the date is updated in the input field. Receives a reference to the calendar. + * date | the date that the calendar will be initially displayed to + * showsTime | default: false; if true the calendar will include a time selector + * timeFormat | the time format; can be "12" or "24", default is "12" + * electric | if true (default) then given fields/date areas are updated for each move; otherwise they're updated only on close + * step | configures the step of the years in drop-down boxes; default: 2 + * position | configures the calendar absolute position; default: null + * cache | if "true" (but default: "false") it will reuse the same calendar object, where possible + * showOthers | if "true" (but default: "false") it will show days from other months too + * + * None of them is required, they all have default values. However, if you + * pass none of "inputField", "displayArea" or "button" you'll get a warning + * saying "nothing to setup". + */ +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"]); // takes precedence if both are defined + 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/htdocs/js/jscalendar/calendar-setup_stripped.js b/htdocs/js/jscalendar/calendar-setup_stripped.js new file mode 100644 index 0000000..91c927f --- /dev/null +++ b/htdocs/js/jscalendar/calendar-setup_stripped.js @@ -0,0 +1,21 @@ +/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/ + * --------------------------------------------------------------------------- + * + * The DHTML Calendar + * + * Details and latest version at: + * http://dynarch.com/mishoo/calendar.epl + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + * + * This file defines helper functions for setting up the calendar. They are + * intended to help non-programmers get a working calendar on their site + * quickly. This script should not be seen as part of the calendar. It just + * shows you what one can do with the calendar, while in the same time + * providing a quick and simple method for setting it up. If you need + * exhaustive customization of the calendar creation process feel free to + * 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 diff --git a/htdocs/js/jscalendar/calendar-system.css b/htdocs/js/jscalendar/calendar-system.css new file mode 100644 index 0000000..b224885 --- /dev/null +++ b/htdocs/js/jscalendar/calendar-system.css @@ -0,0 +1,251 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border: 1px solid; + border-color: #fff #000 #000 #fff; + font-size: 11px; + cursor: default; + background: Window; + color: WindowText; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border: 1px solid; + border-color: #fff #000 #000 #fff; + font-size: 11px; + cursor: default; + background: Window; + color: WindowText; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; + background: ButtonFace; +} + +.calendar .nav { + background: ButtonFace url(menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: ActiveCaption; + color: CaptionText; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid ButtonShadow; + padding: 2px; + text-align: center; + background: ButtonFace; + color: ButtonText; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border: 2px solid; + padding: 0px; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + border-width: 1px; + padding: 2px 0px 0px 2px; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; +} + +/* 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.othermonth { + font-size: 80%; + color: #aaa; +} +.calendar tbody .day.othermonth.oweekend { + color: #faa; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid ButtonShadow; + background: ButtonFace; + color: ButtonText; +} + +.calendar tbody .rowhilite td { + background: Highlight; + color: HighlightText; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; + padding: 2px 2px 0px 2px; + background: ButtonFace; + color: ButtonText; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody td.disabled { color: GrayText; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: ButtonFace; + padding: 1px; + border: 1px solid; + border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow; + color: ButtonText; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #e4e0d8; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border: 1px solid; + border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; + background: Menu; + color: MenuText; + font-size: 90%; + padding: 1px; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .active { + padding: 0px; + border: 1px solid #000; +} + +.calendar .combo .hilite { + background: Highlight; + color: HighlightText; +} + +.calendar td.time { + border-top: 1px solid ButtonShadow; + padding: 1px 0px; + text-align: center; + background-color: ButtonFace; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: Menu; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: Highlight; + color: HighlightText; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-tas.css b/htdocs/js/jscalendar/calendar-tas.css new file mode 100644 index 0000000..c2f8721 --- /dev/null +++ b/htdocs/js/jscalendar/calendar-tas.css @@ -0,0 +1,239 @@ +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #655; + font-size: 11px; + color: #000; + cursor: default; + background: #ffd; + font-family: tahoma,verdana,sans-serif; + filter: +progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#DDDCCC,EndColorStr=#FFFFFF); +} + +/* 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:#363636; +} + +.calendar .nav { + background: #edc 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; + background: #654; + color: #363636; + padding: 2px; + filter: +progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#ffffff,EndColorStr=#dddccc); +} + +.calendar thead .headrow { /* Row containing navigation buttons */ + /*background: #3B86A0;*/ + color: #363636; + font-weight: bold; +filter: +progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#ffffff,EndColorStr=#3b86a0); +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #655; + padding: 2px; + text-align: center; + color: #363636; + filter: +progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#DDDCCC,EndColorStr=#FFFFFF); +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background-color: #ffcc86; + color: #000; + border: 1px solid #b59345; + padding: 1px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background-color: #c77; + padding: 2px 0px 0px 2px; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: #fed; +} + +/* 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.othermonth { + font-size: 80%; + color: #aaa; +} +.calendar tbody .day.othermonth.oweekend { + color: #faa; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #fed; +} + +.calendar tbody .rowhilite td { + background: #ddf; + +} + +.calendar tbody .rowhilite td.wn { + background: #efe; +} + +.calendar tbody td.hilite { /* Hovered cells */ + background: #ffe; + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + background: #ddc; + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.selected { /* Cell showing today date */ + font-weight: bold; + border: 1px solid #000; + padding: 1px 3px 1px 1px; + background: #fea; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { font-weight: bold; } + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #988; + color: #000; + +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + border-top: 1px solid #655; + background: #dcb; + color: #363636; + font-weight: bold; + filter: +progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#FFFFFF,EndColorStr=#DDDCCC); +} +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #faa; + border: 1px solid #f40; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #c77; + padding: 2px 0px 0px 2px; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.combo { + position: absolute; + display: none; + top: 0px; + left: 0px; + width: 4em; + cursor: default; + border: 1px solid #655; + background: #ffe; + color: #000; + font-size: smaller; + z-index: 100; +} + +.combo .label, +.combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.combo .label-IEfix { + width: 4em; +} + +.combo .hilite { + background: #fc8; +} + +.combo .active { + border-top: 1px solid #a64; + border-bottom: 1px solid #a64; + background: #fee; + font-weight: bold; +} + +.calendar td.time { + border-top: 1px solid #a88; + padding: 1px 0px; + text-align: center; + background-color: #fed; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #988; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #866; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-win2k-1.css b/htdocs/js/jscalendar/calendar-win2k-1.css new file mode 100644 index 0000000..8c5d026 --- /dev/null +++ b/htdocs/js/jscalendar/calendar-win2k-1.css @@ -0,0 +1,271 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #d4d0c8; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #d4d0c8; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar .nav { + background: transparent url(menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #848078; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #f4f0e8; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background-color: #e4e0d8; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background-color: #c4c0b8; +} + +/* 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.othermonth { + font-size: 80%; + color: #aaa; +} +.calendar tbody .day.othermonth.oweekend { + color: #faa; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #f4f0e8; +} + +.calendar tbody .rowhilite td { + background: #e4e0d8; +} + +.calendar tbody .rowhilite td.wn { + background: #d4d0c8; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + padding: 2px 2px 0px 2px; + background: #e4e0d8; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #f4f0e8; + padding: 1px; + border: 1px solid #000; + background: #848078; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #e4e0d8; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #e4e0d8; + font-size: 90%; + padding: 1px; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .active { + background: #c4c0b8; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar .combo .hilite { + background: #048; + color: #fea; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #f4f0e8; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #766; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-win2k-2.css b/htdocs/js/jscalendar/calendar-win2k-2.css new file mode 100644 index 0000000..6f37b7d --- /dev/null +++ b/htdocs/js/jscalendar/calendar-win2k-2.css @@ -0,0 +1,271 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #d4c8d0; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #d4c8d0; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar .nav { + background: transparent url(menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #847880; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #f4e8f0; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background-color: #e4d8e0; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background-color: #c4b8c0; +} + +/* 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.othermonth { + font-size: 80%; + color: #aaa; +} +.calendar tbody .day.othermonth.oweekend { + color: #faa; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #f4e8f0; +} + +.calendar tbody .rowhilite td { + background: #e4d8e0; +} + +.calendar tbody .rowhilite td.wn { + background: #d4c8d0; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + padding: 2px 2px 0px 2px; + background: #e4d8e0; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #f4e8f0; + padding: 1px; + border: 1px solid #000; + background: #847880; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #e4d8e0; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #e4d8e0; + font-size: 90%; + padding: 1px; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .active { + background: #d4c8d0; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar .combo .hilite { + background: #408; + color: #fea; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #f4f0e8; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #766; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-win2k-cold-1.css b/htdocs/js/jscalendar/calendar-win2k-cold-1.css new file mode 100644 index 0000000..fa5c093 --- /dev/null +++ b/htdocs/js/jscalendar/calendar-win2k-cold-1.css @@ -0,0 +1,265 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d0d4; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d0d4; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar .nav { + background: transparent url(menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #788084; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #e8f0f4; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background-color: #d8e0e4; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background-color: #b8c0c4; +} + +/* 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.othermonth { + font-size: 80%; + color: #aaa; +} +.calendar tbody .day.othermonth.oweekend { + color: #faa; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #e8f4f0; +} + +.calendar tbody .rowhilite td { + background: #d8e4e0; +} + +.calendar tbody .rowhilite td.wn { + background: #c8d4d0; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border: 1px solid; + border-color: #fff #000 #000 #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border: 1px solid; + border-color: #000 #fff #fff #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + padding: 2px 2px 0px 2px; + border: 1px solid; + border-color: #000 #fff #fff #000; + background: #d8e0e4; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #e8f0f4; + padding: 1px; + border: 1px solid #000; + background: #788084; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #d8e0e4; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #d8e0e4; + font-size: 90%; + padding: 1px; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .active { + background: #c8d0d4; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar .combo .hilite { + background: #048; + color: #aef; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #e8f0f4; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #667; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar-win2k-cold-2.css b/htdocs/js/jscalendar/calendar-win2k-cold-2.css new file mode 100644 index 0000000..8e930c8 --- /dev/null +++ b/htdocs/js/jscalendar/calendar-win2k-cold-2.css @@ -0,0 +1,271 @@ +/* The main calendar widget. DIV containing a table. */ + +.calendar { + position: relative; + display: none; + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d4d0; + font-family: tahoma,verdana,sans-serif; +} + +.calendar table { + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + font-size: 11px; + color: #000; + cursor: default; + background: #c8d4d0; + font-family: tahoma,verdana,sans-serif; +} + +/* Header part -- contains navigation buttons and day names. */ + +.calendar .button { /* "<<", "<", ">", ">>" buttons have this class */ + text-align: center; + padding: 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar .nav { + background: transparent url(menuarrow.gif) no-repeat 100% 100%; +} + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; + padding: 1px; + border: 1px solid #000; + background: #788480; + color: #fff; + text-align: center; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .daynames { /* Row containing the day names */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #000; + padding: 2px; + text-align: center; + background: #e8f4f0; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #f00; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + border-top: 2px solid #fff; + border-right: 2px solid #000; + border-bottom: 2px solid #000; + border-left: 2px solid #fff; + padding: 0px; + background-color: #d8e4e0; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + background-color: #b8c4c0; +} + +/* 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.othermonth { + font-size: 80%; + color: #aaa; +} +.calendar tbody .day.othermonth.oweekend { + color: #faa; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #000; + background: #e8f4f0; +} + +.calendar tbody .rowhilite td { + background: #d8e4e0; +} + +.calendar tbody .rowhilite td.wn { + background: #c8d4d0; +} + +.calendar tbody td.hilite { /* Hovered cells */ + padding: 1px 3px 1px 1px; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; + padding: 2px 2px 0px 2px; + background: #d8e4e0; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #f00; +} + +.calendar tbody td.today { /* Cell showing today date */ + font-weight: bold; + color: #00f; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + background: #e8f4f0; + padding: 1px; + border: 1px solid #000; + background: #788480; + color: #fff; + text-align: center; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + padding: 1px; + background: #d8e4e0; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + padding: 2px 0px 0px 2px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +/* Combo boxes (menus that display months/years for direct selection) */ + +.calendar .combo { + position: absolute; + display: none; + width: 4em; + top: 0px; + left: 0px; + cursor: default; + border-top: 1px solid #fff; + border-right: 1px solid #000; + border-bottom: 1px solid #000; + border-left: 1px solid #fff; + background: #d8e4e0; + font-size: 90%; + padding: 1px; + z-index: 100; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .active { + background: #c8d4d0; + padding: 0px; + border-top: 1px solid #000; + border-right: 1px solid #fff; + border-bottom: 1px solid #fff; + border-left: 1px solid #000; +} + +.calendar .combo .hilite { + background: #048; + color: #aef; +} + +.calendar td.time { + border-top: 1px solid #000; + padding: 1px 0px; + text-align: center; + background-color: #e8f0f4; +} + +.calendar td.time .hour, +.calendar td.time .minute, +.calendar td.time .ampm { + padding: 0px 3px 0px 4px; + border: 1px solid #889; + font-weight: bold; + background-color: #fff; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + border-color: #000; + background-color: #667; + color: #fff; +} + +.calendar td.time span.active { + border-color: #f00; + background-color: #000; + color: #0f0; +} diff --git a/htdocs/js/jscalendar/calendar.js b/htdocs/js/jscalendar/calendar.js new file mode 100644 index 0000000..293ce4b --- /dev/null +++ b/htdocs/js/jscalendar/calendar.js @@ -0,0 +1,1806 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * This script is distributed under the GNU Lesser General Public License. + * Read the entire license text here: http://www.gnu.org/licenses/lgpl.html + */ + +// $Id: calendar.js,v 1.1.2.1 2005/10/09 05:45:23 wurley Exp $ + +/** The Calendar object constructor. */ +Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) { + // member variables + 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; // 0 for Sunday, 1 for Monday, etc. + 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; + // HTML elements + this.table = null; + this.element = null; + this.tbody = null; + this.firstdayname = null; + // Combo boxes + this.monthsCombo = null; + this.yearsCombo = null; + this.hilitedMonth = null; + this.activeMonth = null; + this.hilitedYear = null; + this.activeYear = null; + // Information + this.dateClicked = false; + + // one-time initializations + if (typeof Calendar._SDN == "undefined") { + // table of short day names + 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; + // table of short month names + 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; + } +}; + +// ** constants + +/// "static", needed for event handlers. +Calendar._C = null; + +/// detect a special case of "web browser" +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) ); + +/// detect Opera browser +Calendar.is_opera = /opera/i.test(navigator.userAgent); + +/// detect KHTML-based browsers +Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent); + +// BEGIN: UTILITY FUNCTIONS; beware that these might be moved into a separate +// library, at some point. + +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; +}; + +// FIXME: the following 2 functions totally suck, are useless and should be replaced immediately. +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) { // IE + el.attachEvent("on" + evname, func); + } else if (el.addEventListener) { // Gecko / W3C + el.addEventListener(evname, func, true); + } else { + el["on" + evname] = func; + } +}; + +Calendar.removeEvent = function(el, evname, func) { + if (el.detachEvent) { // IE + el.detachEvent("on" + evname, func); + } else if (el.removeEventListener) { // Gecko / W3C + el.removeEventListener(evname, func, true); + } else { + el["on" + evname] = null; + } +}; + +Calendar.createElement = function(type, parent) { + var el = null; + if (document.createElementNS) { + // use the XHTML namespace; IE won't normally get here unless + // _they_ "fix" the DOM2 implementation. + el = document.createElementNS("http://www.w3.org/1999/xhtml", type); + } else { + el = document.createElement(type); + } + if (typeof parent != "undefined") { + parent.appendChild(el); + } + return el; +}; + +// END: UTILITY FUNCTIONS + +// BEGIN: CALENDAR STATIC FUNCTIONS + +/** Internal -- adds a set of events to make some element behave like a button. */ +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") + // Konqueror brain-dead techniques + 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") + // Konqueror brain-dead techniques + ycw = 50; + s.left = (cd.offsetLeft + cd.offsetWidth - ycw) + "px"; + } + s.top = (cd.offsetTop + cd.offsetHeight) + "px"; + } +}; + +// event handlers + +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); + } +}; + +/** + * A generic "click" handler :) handles all types of buttons defined in this + * calendar. + */ +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; + // a date was clicked + 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()); // TODAY + // unless "today" was clicked, we assume no date was clicked so + // the selected handler will know not to close the calenar when + // in single-click mode. + // cal.dateClicked = (el.navtype == 0); + 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 { + // FIXME: this should be removed as soon as lang files get updated! + 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: + // TODAY will bring us here + 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(); + } +}; + +// END: CALENDAR STATIC FUNCTIONS + +// BEGIN: CALENDAR OBJECT FUNCTIONS + +/** + * This function creates the calendar inside the given parent. If _par is + * null than it creates a popup calendar inside the BODY element. If _par is + * an element, be it BODY, then it creates a non-popup calendar (still + * hidden). Some properties need to be set before calling this function. + */ +Calendar.prototype.create = function (_par) { + var parent = null; + if (! _par) { + // default parent is the document body, in which case we create + // a popup calendar. + 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"]; + + // day names + 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); +}; + +/** keyboard navigation, only for popup calendars */ +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: // KEY left + act && Calendar.cellClick(cal._nav_pm); + break; + case 38: // KEY up + act && Calendar.cellClick(cal._nav_py); + break; + case 39: // KEY right + act && Calendar.cellClick(cal._nav_nm); + break; + case 40: // KEY down + act && Calendar.cellClick(cal._nav_ny); + break; + default: + return false; + } + } else switch (K) { + case 32: // KEY space (now) + Calendar.cellClick(cal._nav_now); + break; + case 27: // KEY esc + act && cal.callCloseHandler(); + break; + case 37: // KEY left + case 38: // KEY up + case 39: // KEY right + case 40: // KEY down + 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: // KEY left + if (--x >= 0) + ne = cal.ar_days[y][x]; + else { + x = 6; + K = 38; + continue; + } + break; + case 38: // KEY up + if (--y >= 0) + ne = cal.ar_days[y][x]; + else { + prevMonth(); + setVars(); + } + break; + case 39: // KEY right + if (++x < 7) + ne = cal.ar_days[y][x]; + else { + x = 0; + K = 40; + continue; + } + break; + case 40: // KEY down + 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: // KEY enter + if (act) + Calendar.cellClick(cal.currentDateEl, ev); + break; + default: + return false; + } + return Calendar.stopEvent(ev); +}; + +/** + * (RE)Initializes the calendar to the given date and firstDayOfWeek + */ +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(); + + // calendar voodoo for computing the first day that would actually be + // displayed in the calendar, even if it's from the previous month. + // WARNING: this is magic. ;-) + 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(); + // PROFILE + // this.tooltips.innerHTML = "Generated in " + ((new Date()) - today) + " ms"; +}; + +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; +}; + +/** + * Calls _init function above for going to a certain date (but only if the + * date is different than the currently selected one). + */ +Calendar.prototype.setDate = function (date) { + if (!date.equalsTo(this.date)) { + this._init(this.firstDayOfWeek, date); + } +}; + +/** + * Refreshes the calendar. Useful if the "disabledHandler" function is + * dynamic, meaning that the list of disabled date can change at runtime. + * Just * call this function if you think that the list of disabled dates + * should * change. + */ +Calendar.prototype.refresh = function () { + this._init(this.firstDayOfWeek, this.date); +}; + +/** Modifies the "firstDayOfWeek" parameter (pass 0 for Synday, 1 for Monday, etc.). */ +Calendar.prototype.setFirstDayOfWeek = function (firstDayOfWeek) { + this._init(firstDayOfWeek, this.date); + this._displayWeekdays(); +}; + +/** + * Allows customization of what dates are enabled. The "unaryFunction" + * parameter must be a function object that receives the date (as a JS Date + * object) and returns a boolean value. If the returned value is true then + * the passed date will be marked as disabled. + */ +Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (unaryFunction) { + this.getDateStatus = unaryFunction; +}; + +/** Customization of allowed year range for the calendar. */ +Calendar.prototype.setRange = function (a, z) { + this.minYear = a; + this.maxYear = z; +}; + +/** Calls the first user handler (selectedHandler). */ +Calendar.prototype.callHandler = function () { + if (this.onSelected) { + this.onSelected(this, this.date.print(this.dateFormat)); + } +}; + +/** Calls the second user handler (closeHandler). */ +Calendar.prototype.callCloseHandler = function () { + if (this.onClose) { + this.onClose(this); + } + this.hideShowCovered(); +}; + +/** Removes the calendar object from the DOM tree and destroys it. */ +Calendar.prototype.destroy = function () { + var el = this.element.parentNode; + el.removeChild(this.element); + Calendar._C = null; + window._dynarch_popupCalendar = null; +}; + +/** + * Moves the calendar element to a different section in the DOM tree (changes + * its parent). + */ +Calendar.prototype.reparent = function (new_parent) { + var el = this.element; + el.parentNode.removeChild(el); + new_parent.appendChild(el); +}; + +// This gets called when the user presses a mouse button anywhere in the +// document, if the calendar is shown. If the click was outside the open +// calendar this function closes it. +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) { + // calls closeHandler which should hide the calendar. + window._dynarch_popupCalendar.callCloseHandler(); + return Calendar.stopEvent(ev); + } +}; + +/** Shows the calendar. */ +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(); +}; + +/** + * Hides the calendar. Also removes any "hilite" from the class of any TD + * element. + */ +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(); +}; + +/** + * Shows the calendar at a given absolute position (beware that, depending on + * the calendar element style -- position property -- this might be relative + * to the parent's containing rectangle). + */ +Calendar.prototype.showAt = function (x, y) { + var s = this.element.style; + s.left = x + "px"; + s.top = y + "px"; + this.show(); +}; + +/** Shows the calendar near a given element. */ +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); + } + // vertical alignment + 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; // already there + } + // horizontal alignment + 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; // already there + } + 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(); +}; + +/** Customizes the date format. */ +Calendar.prototype.setDateFormat = function (str) { + this.dateFormat = str; +}; + +/** Customizes the tooltip date format. */ +Calendar.prototype.setTtDateFormat = function (str) { + this.ttDateFormat = str; +}; + +/** + * Tries to identify the date represented in a string. If successful it also + * calls this.setDate which moves the calendar to the given date. + */ +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") { // Gecko, W3C + if (!Calendar.is_khtml) + value = document.defaultView. + getComputedStyle(obj, "").getPropertyValue("visibility"); + else + value = ''; + } else if (obj.currentStyle) { // IE + 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"; + } + } + } +}; + +/** Internal function; it displays the bar with the names of the weekday. */ +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; + } +}; + +/** Internal function. Hides all combo boxes that might be displayed. */ +Calendar.prototype._hideCombos = function () { + this.monthsCombo.style.display = "none"; + this.yearsCombo.style.display = "none"; +}; + +/** Internal function. Starts dragging the element. */ +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); + } +}; + +// BEGIN: DATE OBJECT PATCHES + +/** Adds the number of days array to the Date object. */ +Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31); + +/** Constants used for time computations */ +Date.SECOND = 1000 /* milliseconds */; +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; +}; + +/** Returns the number of days in the current month */ +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]; + } +}; + +/** Returns the number of day in the year. */ +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); +}; + +/** Returns the number of the week in year, as defined in ISO 8601. */ +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); // Nearest Thu + var ms = d.valueOf(); // GMT + d.setMonth(0); + d.setDate(4); // Thu in Week 1 + return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1; +}; + +/** Checks date and time equality */ +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())); +}; + +/** Set only the year, month, date parts (keep existing time) */ +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()); +}; + +/** Prints the date in a string according to the given format. */ +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]; // abbreviated weekday name [FIXME: I18N] + s["%A"] = Calendar._DN[w]; // full weekday name + s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N] + s["%B"] = Calendar._MN[m]; // full month name + // FIXME: %c : preferred date and time representation for the current locale + s["%C"] = 1 + Math.floor(y / 100); // the century number + s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31) + s["%e"] = d; // the day of the month (range 1 to 31) + // FIXME: %D : american date style: %m/%d/%y + // FIXME: %E, %F, %G, %g, %h (man strftime) + s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format) + s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format) + s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366) + s["%k"] = hr; // hour, range 0 to 23 (24h format) + s["%l"] = ir; // hour, range 1 to 12 (12h format) + s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12 + s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59 + s["%n"] = "\n"; // a newline character + s["%p"] = pm ? "PM" : "AM"; + s["%P"] = pm ? "pm" : "am"; + // FIXME: %r : the time in am/pm notation %I:%M:%S %p + // FIXME: %R : the time in 24-hour notation %H:%M + s["%s"] = Math.floor(this.getTime() / 1000); + s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59 + s["%t"] = "\t"; // a tab character + // FIXME: %T : the time in 24-hour notation (%H:%M:%S) + s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn; + s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON) + s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN) + // FIXME: %x : preferred date representation for the current locale without the time + // FIXME: %X : preferred time representation for the current locale without the date + s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99) + s["%Y"] = y; // year with the century + s["%%"] = "%"; // a literal '%' character + + 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); +}; + +// END: DATE OBJECT PATCHES + + +// global object that remembers the calendar +window._dynarch_popupCalendar = null; diff --git a/htdocs/js/jscalendar/calendar.php b/htdocs/js/jscalendar/calendar.php new file mode 100644 index 0000000..5b9120d --- /dev/null +++ b/htdocs/js/jscalendar/calendar.php @@ -0,0 +1,119 @@ +calendar_file = 'calendar_stripped.js'; + $this->calendar_setup_file = 'calendar-setup_stripped.js'; + } else { + $this->calendar_file = 'calendar.js'; + $this->calendar_setup_file = 'calendar-setup.js'; + } + $this->calendar_lang_file = 'lang/calendar-' . $lang . '.js'; + $this->calendar_theme_file = $theme.'.css'; + $this->calendar_lib_path = preg_replace('/\/+$/', '/', $calendar_lib_path); + $this->calendar_options = array('ifFormat' => '%Y/%m/%d', + 'daFormat' => '%Y/%m/%d'); + } + + function set_option($name, $value) { + $this->calendar_options[$name] = $value; + } + + function load_files() { + echo $this->get_load_files_code(); + } + + function get_load_files_code() { + $code = ( '' . NEWLINE ); + $code .= ( '' . NEWLINE ); + $code .= ( '' . NEWLINE ); + $code .= ( '' ); + return $code; + } + + function _make_calendar($other_options = array()) { + $js_options = $this->_make_js_hash(array_merge($this->calendar_options, $other_options)); + $code = ( '' ); + return $code; + } + + function make_input_field($cal_options = array(), $field_attributes = array()) { + $id = $this->_gen_id(); + $attrstr = $this->_make_html_attr(array_merge($field_attributes, + array('id' => $this->_field_id($id), + 'type' => 'text'))); + echo ''; + echo '' . + ''; + + $options = array_merge($cal_options, + array('inputField' => $this->_field_id($id), + 'button' => $this->_trigger_id($id))); + echo $this->_make_calendar($options); + } + + /// PRIVATE SECTION + + function _field_id($id) { return 'f-calendar-field-' . $id; } + function _trigger_id($id) { return 'f-calendar-trigger-' . $id; } + function _gen_id() { static $id = 0; return ++$id; } + + function _make_js_hash($array) { + $jstr = ''; + reset($array); + while (list($key, $val) = each($array)) { + if (is_bool($val)) + $val = $val ? 'true' : 'false'; + else if (!is_numeric($val)) + $val = '"'.$val.'"'; + if ($jstr) $jstr .= ','; + $jstr .= '"' . $key . '":' . $val; + } + return $jstr; + } + + function _make_html_attr($array) { + $attrstr = ''; + reset($array); + while (list($key, $val) = each($array)) { + $attrstr .= $key . '="' . $val . '" '; + } + return $attrstr; + } +}; + +?> \ No newline at end of file diff --git a/htdocs/js/jscalendar/calendar_stripped.js b/htdocs/js/jscalendar/calendar_stripped.js new file mode 100644 index 0000000..4fe03f1 --- /dev/null +++ b/htdocs/js/jscalendar/calendar_stripped.js @@ -0,0 +1,14 @@ +/* Copyright Mihai Bazon, 2002-2005 | www.bazon.net/mishoo + * ----------------------------------------------------------- + * + * The DHTML Calendar, version 1.0 "It is happening again" + * + * Details and latest version at: + * www.dynarch.com/projects/calendar + * + * This script is developed by Dynarch.com. Visit us at www.dynarch.com. + * + * 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 +// Translator: Valentin Sheiretsky, +// Encoding: Windows-1251 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Íåäåëÿ", + "Ïîíåäåëíèê", + "Âòîðíèê", + "Ñðÿäà", + "×åòâúðòúê", + "Ïåòúê", + "Ñúáîòà", + "Íåäåëÿ"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Íåä", + "Ïîí", + "Âòî", + "Ñðÿ", + "×åò", + "Ïåò", + "Ñúá", + "Íåä"); + +// full month names +Calendar._MN = new Array +("ßíóàðè", + "Ôåâðóàðè", + "Ìàðò", + "Àïðèë", + "Ìàé", + "Þíè", + "Þëè", + "Àâãóñò", + "Ñåïòåìâðè", + "Îêòîìâðè", + "Íîåìâðè", + "Äåêåìâðè"); + +// short month names +Calendar._SMN = new Array +("ßíó", + "Ôåâ", + "Ìàð", + "Àïð", + "Ìàé", + "Þíè", + "Þëè", + "Àâã", + "Ñåï", + "Îêò", + "Íîå", + "Äåê"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Èíôîðìàöèÿ çà êàëåíäàðà"; + +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."; +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."; + +Calendar._TT["PREV_YEAR"] = "Ïðåäíà ãîäèíà (çàäðúæòå çà ìåíþ)"; +Calendar._TT["PREV_MONTH"] = "Ïðåäåí ìåñåö (çàäðúæòå çà ìåíþ)"; +Calendar._TT["GO_TODAY"] = "Èçáåðåòå äíåñ"; +Calendar._TT["NEXT_MONTH"] = "Ñëåäâàù ìåñåö (çàäðúæòå çà ìåíþ)"; +Calendar._TT["NEXT_YEAR"] = "Ñëåäâàùà ãîäèíà (çàäðúæòå çà ìåíþ)"; +Calendar._TT["SEL_DATE"] = "Èçáåðåòå äàòà"; +Calendar._TT["DRAG_TO_MOVE"] = "Ïðåìåñòâàíå"; +Calendar._TT["PART_TODAY"] = " (äíåñ)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "%s êàòî ïúðâè äåí"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Çàòâîðåòå"; +Calendar._TT["TODAY"] = "Äíåñ"; +Calendar._TT["TIME_PART"] = "(Shift-)Click èëè drag çà äà ïðîìåíèòå ñòîéíîñòòà"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%A - %e %B %Y"; + +Calendar._TT["WK"] = "Ñåäì"; +Calendar._TT["TIME"] = "×àñ:"; diff --git a/htdocs/js/jscalendar/lang/calendar-big5-utf8.js b/htdocs/js/jscalendar/lang/calendar-big5-utf8.js new file mode 100644 index 0000000..14e0d5d --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-big5-utf8.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar big5-utf8 language +// Author: Gary Fu, +// Encoding: utf8 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("星期日", + "星期一", + "星期二", + "星期三", + "星期四", + "星期五", + "星期六", + "星期日"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("æ—¥", + "一", + "二", + "三", + "å››", + "五", + "å…­", + "æ—¥"); + +// full month names +Calendar._MN = new Array +("一月", + "二月", + "三月", + "四月", + "五月", + "六月", + "七月", + "八月", + "ä¹æœˆ", + "å月", + "å一月", + "å二月"); + +// short month names +Calendar._SMN = new Array +("一月", + "二月", + "三月", + "四月", + "五月", + "六月", + "七月", + "八月", + "ä¹æœˆ", + "å月", + "å一月", + "å二月"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "關於"; + +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" + +"日期é¸æ“‡æ–¹æ³•:\n" + +"- 使用 \xab, \xbb 按鈕å¯é¸æ“‡å¹´ä»½\n" + +"- 使用 " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " 按鈕å¯é¸æ“‡æœˆä»½\n" + +"- 按ä½ä¸Šé¢çš„按鈕å¯ä»¥åŠ å¿«é¸å–"; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"時間é¸æ“‡æ–¹æ³•:\n" + +"- 點擊任何的時間部份å¯å¢žåŠ å…¶å€¼\n" + +"- åŒæ™‚按Shiftéµå†é»žæ“Šå¯æ¸›å°‘其值\n" + +"- 點擊並拖曳å¯åŠ å¿«æ”¹è®Šçš„值"; + +Calendar._TT["PREV_YEAR"] = "上一年 (按ä½é¸å–®)"; +Calendar._TT["PREV_MONTH"] = "下一年 (按ä½é¸å–®)"; +Calendar._TT["GO_TODAY"] = "到今日"; +Calendar._TT["NEXT_MONTH"] = "上一月 (按ä½é¸å–®)"; +Calendar._TT["NEXT_YEAR"] = "下一月 (按ä½é¸å–®)"; +Calendar._TT["SEL_DATE"] = "é¸æ“‡æ—¥æœŸ"; +Calendar._TT["DRAG_TO_MOVE"] = "拖曳"; +Calendar._TT["PART_TODAY"] = " (今日)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "å°‡ %s 顯示在å‰"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "關閉"; +Calendar._TT["TODAY"] = "今日"; +Calendar._TT["TIME_PART"] = "點擊or拖曳å¯æ”¹è®Šæ™‚é–“(åŒæ™‚按Shift為減)"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "週"; +Calendar._TT["TIME"] = "Time:"; diff --git a/htdocs/js/jscalendar/lang/calendar-big5.js b/htdocs/js/jscalendar/lang/calendar-big5.js new file mode 100644 index 0000000..a589358 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-big5.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar big5 language +// Author: Gary Fu, +// Encoding: big5 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("¬P´Á¤é", + "¬P´Á¤@", + "¬P´Á¤G", + "¬P´Á¤T", + "¬P´Á¥|", + "¬P´Á¤­", + "¬P´Á¤»", + "¬P´Á¤é"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("¤é", + "¤@", + "¤G", + "¤T", + "¥|", + "¤­", + "¤»", + "¤é"); + +// full month names +Calendar._MN = new Array +("¤@¤ë", + "¤G¤ë", + "¤T¤ë", + "¥|¤ë", + "¤­¤ë", + "¤»¤ë", + "¤C¤ë", + "¤K¤ë", + "¤E¤ë", + "¤Q¤ë", + "¤Q¤@¤ë", + "¤Q¤G¤ë"); + +// short month names +Calendar._SMN = new Array +("¤@¤ë", + "¤G¤ë", + "¤T¤ë", + "¥|¤ë", + "¤­¤ë", + "¤»¤ë", + "¤C¤ë", + "¤K¤ë", + "¤E¤ë", + "¤Q¤ë", + "¤Q¤@¤ë", + "¤Q¤G¤ë"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Ãö©ó"; + +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" + +"¤é´Á¿ï¾Ü¤èªk:\n" + +"- ¨Ï¥Î \xab, \xbb «ö¶s¥i¿ï¾Ü¦~¥÷\n" + +"- ¨Ï¥Î " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " «ö¶s¥i¿ï¾Ü¤ë¥÷\n" + +"- «ö¦í¤W­±ªº«ö¶s¥i¥H¥[§Ö¿ï¨ú"; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"®É¶¡¿ï¾Ü¤èªk:\n" + +"- ÂIÀ»¥ô¦óªº®É¶¡³¡¥÷¥i¼W¥[¨ä­È\n" + +"- ¦P®É«öShiftÁä¦AÂIÀ»¥i´î¤Ö¨ä­È\n" + +"- ÂIÀ»¨Ã©ì¦²¥i¥[§Ö§ïÅܪº­È"; + +Calendar._TT["PREV_YEAR"] = "¤W¤@¦~ («ö¦í¿ï³æ)"; +Calendar._TT["PREV_MONTH"] = "¤U¤@¦~ («ö¦í¿ï³æ)"; +Calendar._TT["GO_TODAY"] = "¨ì¤µ¤é"; +Calendar._TT["NEXT_MONTH"] = "¤W¤@¤ë («ö¦í¿ï³æ)"; +Calendar._TT["NEXT_YEAR"] = "¤U¤@¤ë («ö¦í¿ï³æ)"; +Calendar._TT["SEL_DATE"] = "¿ï¾Ü¤é´Á"; +Calendar._TT["DRAG_TO_MOVE"] = "©ì¦²"; +Calendar._TT["PART_TODAY"] = " (¤µ¤é)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "±N %s Åã¥Ü¦b«e"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Ãö³¬"; +Calendar._TT["TODAY"] = "¤µ¤é"; +Calendar._TT["TIME_PART"] = "ÂIÀ»or©ì¦²¥i§ïÅܮɶ¡(¦P®É«öShift¬°´î)"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "¶g"; +Calendar._TT["TIME"] = "Time:"; diff --git a/htdocs/js/jscalendar/lang/calendar-br.js b/htdocs/js/jscalendar/lang/calendar-br.js new file mode 100644 index 0000000..bfb0747 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-br.js @@ -0,0 +1,108 @@ +// ** I18N + +// Calendar pt-BR language +// Author: Fernando Dourado, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Domingo", + "Segunda", + "Terça", + "Quarta", + "Quinta", + "Sexta", + "Sabádo", + "Domingo"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +// [No changes using default values] + +// full month names +Calendar._MN = new Array +("Janeiro", + "Fevereiro", + "Março", + "Abril", + "Maio", + "Junho", + "Julho", + "Agosto", + "Setembro", + "Outubro", + "Novembro", + "Dezembro"); + +// short month names +// [No changes using default values] + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Sobre o calendário"; + +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" + +"Translate to portuguese Brazil (pt-BR) by Fernando Dourado (fernando.dourado@ig.com.br)\n" + +"Tradução para o português Brasil (pt-BR) por Fernando Dourado (fernando.dourado@ig.com.br)" + +"\n\n" + +"Selecionar data:\n" + +"- Use as teclas \xab, \xbb para selecionar o ano\n" + +"- Use as teclas " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mês\n" + +"- Clique e segure com o mouse em qualquer botão para selecionar rapidamente."; + +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Selecionar hora:\n" + +"- Clique em qualquer uma das partes da hora para aumentar\n" + +"- ou Shift-clique para diminuir\n" + +"- ou clique e arraste para selecionar rapidamente."; + +Calendar._TT["PREV_YEAR"] = "Ano anterior (clique e segure para menu)"; +Calendar._TT["PREV_MONTH"] = "Mês anterior (clique e segure para menu)"; +Calendar._TT["GO_TODAY"] = "Ir para a data atual"; +Calendar._TT["NEXT_MONTH"] = "Próximo mês (clique e segure para menu)"; +Calendar._TT["NEXT_YEAR"] = "Próximo ano (clique e segure para menu)"; +Calendar._TT["SEL_DATE"] = "Selecione uma data"; +Calendar._TT["DRAG_TO_MOVE"] = "Clique e segure para mover"; +Calendar._TT["PART_TODAY"] = " (hoje)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Exibir %s primeiro"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Fechar"; +Calendar._TT["TODAY"] = "Hoje"; +Calendar._TT["TIME_PART"] = "(Shift-)Clique ou arraste para mudar o valor"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%d de %B de %Y"; + +Calendar._TT["WK"] = "sem"; +Calendar._TT["TIME"] = "Hora:"; + diff --git a/htdocs/js/jscalendar/lang/calendar-ca.js b/htdocs/js/jscalendar/lang/calendar-ca.js new file mode 100644 index 0000000..a2121bc --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-ca.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar CA language +// Author: Mihai Bazon, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Diumenge", + "Dilluns", + "Dimarts", + "Dimecres", + "Dijous", + "Divendres", + "Dissabte", + "Diumenge"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Diu", + "Dil", + "Dmt", + "Dmc", + "Dij", + "Div", + "Dis", + "Diu"); + +// full month names +Calendar._MN = new Array +("Gener", + "Febrer", + "Març", + "Abril", + "Maig", + "Juny", + "Juliol", + "Agost", + "Setembre", + "Octubre", + "Novembre", + "Desembre"); + +// short month names +Calendar._SMN = new Array +("Gen", + "Feb", + "Mar", + "Abr", + "Mai", + "Jun", + "Jul", + "Ago", + "Set", + "Oct", + "Nov", + "Des"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Sobre el calendari"; + +Calendar._TT["ABOUT"] = +"DHTML Selector de Data/Hora\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" + +"Sel.lecció de Dates:\n" + +"- Fes servir els botons \xab, \xbb per sel.leccionar l'any\n" + +"- Fes servir els botons " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per se.lecciconar el mes\n" + +"- Manté el ratolí apretat en qualsevol dels anteriors per sel.lecció ràpida."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Time selection:\n" + +"- claca en qualsevol de les parts de la hora per augmentar-les\n" + +"- o Shift-click per decrementar-la\n" + +"- or click and arrastra per sel.lecció ràpida."; + +Calendar._TT["PREV_YEAR"] = "Any anterior (Mantenir per menu)"; +Calendar._TT["PREV_MONTH"] = "Mes anterior (Mantenir per menu)"; +Calendar._TT["GO_TODAY"] = "Anar a avui"; +Calendar._TT["NEXT_MONTH"] = "Mes següent (Mantenir per menu)"; +Calendar._TT["NEXT_YEAR"] = "Any següent (Mantenir per menu)"; +Calendar._TT["SEL_DATE"] = "Sel.leccionar data"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar per moure"; +Calendar._TT["PART_TODAY"] = " (avui)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Mostra %s primer"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Tanca"; +Calendar._TT["TODAY"] = "Avui"; +Calendar._TT["TIME_PART"] = "(Shift-)Click a arrastra per canviar el valor"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "st"; +Calendar._TT["TIME"] = "Hora:"; diff --git a/htdocs/js/jscalendar/lang/calendar-cs-utf8.js b/htdocs/js/jscalendar/lang/calendar-cs-utf8.js new file mode 100644 index 0000000..f6bbbeb --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-cs-utf8.js @@ -0,0 +1,65 @@ +/* + calendar-cs-win.js + language: Czech + encoding: windows-1250 + author: Lubos Jerabek (xnet@seznam.cz) + Jan Uhlir (espinosa@centrum.cz) +*/ + +// ** I18N +Calendar._DN = new Array('NedÄ›le','PondÄ›lí','Úterý','StÅ™eda','ÄŒtvrtek','Pátek','Sobota','NedÄ›le'); +Calendar._SDN = new Array('Ne','Po','Út','St','ÄŒt','Pá','So','Ne'); +Calendar._MN = new Array('Leden','Únor','BÅ™ezen','Duben','KvÄ›ten','ÄŒerven','ÄŒervenec','Srpen','Září','Říjen','Listopad','Prosinec'); +Calendar._SMN = new Array('Led','Úno','BÅ™e','Dub','KvÄ›','ÄŒrv','ÄŒvc','Srp','Zář','Říj','Lis','Pro'); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "O komponentÄ› kalendář"; +Calendar._TT["TOGGLE"] = "ZmÄ›na prvního dne v týdnu"; +Calendar._TT["PREV_YEAR"] = "PÅ™edchozí rok (pÅ™idrž pro menu)"; +Calendar._TT["PREV_MONTH"] = "PÅ™edchozí mÄ›síc (pÅ™idrž pro menu)"; +Calendar._TT["GO_TODAY"] = "DneÅ¡ní datum"; +Calendar._TT["NEXT_MONTH"] = "Další mÄ›síc (pÅ™idrž pro menu)"; +Calendar._TT["NEXT_YEAR"] = "Další rok (pÅ™idrž pro menu)"; +Calendar._TT["SEL_DATE"] = "Vyber datum"; +Calendar._TT["DRAG_TO_MOVE"] = "ChyÅ¥ a táhni, pro pÅ™esun"; +Calendar._TT["PART_TODAY"] = " (dnes)"; +Calendar._TT["MON_FIRST"] = "Ukaž jako první PondÄ›lí"; +//Calendar._TT["SUN_FIRST"] = "Ukaž jako první NedÄ›li"; + +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" + +"VýbÄ›r datumu:\n" + +"- Use the \xab, \xbb buttons to select year\n" + +"- Použijte tlaÄítka " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " k výbÄ›ru mÄ›síce\n" + +"- Podržte tlaÄítko myÅ¡i na jakémkoliv z tÄ›ch tlaÄítek pro rychlejší výbÄ›r."; + +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"VýbÄ›r Äasu:\n" + +"- KliknÄ›te na jakoukoliv z Äástí výbÄ›ru Äasu pro zvýšení.\n" + +"- nebo Shift-click pro snížení\n" + +"- nebo kliknÄ›te a táhnÄ›te pro rychlejší výbÄ›r."; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Zobraz %s první"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Zavřít"; +Calendar._TT["TODAY"] = "Dnes"; +Calendar._TT["TIME_PART"] = "(Shift-)Klikni nebo táhni pro zmÄ›nu hodnoty"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "d.m.yy"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "ÄŒas:"; diff --git a/htdocs/js/jscalendar/lang/calendar-cs-win.js b/htdocs/js/jscalendar/lang/calendar-cs-win.js new file mode 100644 index 0000000..140dff3 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-cs-win.js @@ -0,0 +1,65 @@ +/* + calendar-cs-win.js + language: Czech + encoding: windows-1250 + author: Lubos Jerabek (xnet@seznam.cz) + Jan Uhlir (espinosa@centrum.cz) +*/ + +// ** I18N +Calendar._DN = new Array('Nedìle','Pondìlí','Úterý','Støeda','Ètvrtek','Pátek','Sobota','Nedìle'); +Calendar._SDN = new Array('Ne','Po','Út','St','Èt','Pá','So','Ne'); +Calendar._MN = new Array('Leden','Únor','Bøezen','Duben','Kvìten','Èerven','Èervenec','Srpen','Záøí','Øíjen','Listopad','Prosinec'); +Calendar._SMN = new Array('Led','Úno','Bøe','Dub','Kvì','Èrv','Èvc','Srp','Záø','Øíj','Lis','Pro'); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "O komponentì kalendáø"; +Calendar._TT["TOGGLE"] = "Zmìna prvního dne v týdnu"; +Calendar._TT["PREV_YEAR"] = "Pøedchozí rok (pøidrž pro menu)"; +Calendar._TT["PREV_MONTH"] = "Pøedchozí mìsíc (pøidrž pro menu)"; +Calendar._TT["GO_TODAY"] = "Dnešní datum"; +Calendar._TT["NEXT_MONTH"] = "Další mìsíc (pøidrž pro menu)"; +Calendar._TT["NEXT_YEAR"] = "Další rok (pøidrž pro menu)"; +Calendar._TT["SEL_DATE"] = "Vyber datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Chy a táhni, pro pøesun"; +Calendar._TT["PART_TODAY"] = " (dnes)"; +Calendar._TT["MON_FIRST"] = "Ukaž jako první Pondìlí"; +//Calendar._TT["SUN_FIRST"] = "Ukaž jako první Nedìli"; + +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" + +"Výbìr datumu:\n" + +"- Use the \xab, \xbb buttons to select year\n" + +"- Použijte tlaèítka " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " k výbìru mìsíce\n" + +"- Podržte tlaèítko myši na jakémkoliv z tìch tlaèítek pro rychlejší výbìr."; + +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Výbìr èasu:\n" + +"- Kliknìte na jakoukoliv z èástí výbìru èasu pro zvýšení.\n" + +"- nebo Shift-click pro snížení\n" + +"- nebo kliknìte a táhnìte pro rychlejší výbìr."; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Zobraz %s první"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Zavøít"; +Calendar._TT["TODAY"] = "Dnes"; +Calendar._TT["TIME_PART"] = "(Shift-)Klikni nebo táhni pro zmìnu hodnoty"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "d.m.yy"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Èas:"; diff --git a/htdocs/js/jscalendar/lang/calendar-da.js b/htdocs/js/jscalendar/lang/calendar-da.js new file mode 100644 index 0000000..a99b598 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-da.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar DA language +// Author: Michael Thingmand Henriksen, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Søndag", +"Mandag", +"Tirsdag", +"Onsdag", +"Torsdag", +"Fredag", +"Lørdag", +"Søndag"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Søn", +"Man", +"Tir", +"Ons", +"Tor", +"Fre", +"Lør", +"Søn"); + +// full month names +Calendar._MN = new Array +("Januar", +"Februar", +"Marts", +"April", +"Maj", +"Juni", +"Juli", +"August", +"September", +"Oktober", +"November", +"December"); + +// short month names +Calendar._SMN = new Array +("Jan", +"Feb", +"Mar", +"Apr", +"Maj", +"Jun", +"Jul", +"Aug", +"Sep", +"Okt", +"Nov", +"Dec"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Om Kalenderen"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"For den seneste version besøg: http://www.dynarch.com/projects/calendar/\n"; + +"Distribueret under GNU LGPL. Se http://gnu.org/licenses/lgpl.html for detajler." + +"\n\n" + +"Valg af dato:\n" + +"- Brug \xab, \xbb knapperne for at vælge Ã¥r\n" + +"- Brug " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " knapperne for at vælge mÃ¥ned\n" + +"- Hold knappen pÃ¥ musen nede pÃ¥ knapperne ovenfor for hurtigere valg."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Valg af tid:\n" + +"- Klik pÃ¥ en vilkÃ¥rlig del for større værdi\n" + +"- eller Shift-klik for for mindre værdi\n" + +"- eller klik og træk for hurtigere valg."; + +Calendar._TT["PREV_YEAR"] = "Ét Ã¥r tilbage (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Én mÃ¥ned tilbage (hold for menu)"; +Calendar._TT["GO_TODAY"] = "GÃ¥ til i dag"; +Calendar._TT["NEXT_MONTH"] = "Én mÃ¥ned frem (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "Ét Ã¥r frem (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Vælg dag"; +Calendar._TT["DRAG_TO_MOVE"] = "Træk vinduet"; +Calendar._TT["PART_TODAY"] = " (i dag)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Vis %s først"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Luk"; +Calendar._TT["TODAY"] = "I dag"; +Calendar._TT["TIME_PART"] = "(Shift-)klik eller træk for at ændre værdi"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "Uge"; +Calendar._TT["TIME"] = "Tid:"; diff --git a/htdocs/js/jscalendar/lang/calendar-de.js b/htdocs/js/jscalendar/lang/calendar-de.js new file mode 100644 index 0000000..4bc1137 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-de.js @@ -0,0 +1,124 @@ +// ** I18N + +// Calendar DE language +// Author: Jack (tR), +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Sonntag", + "Montag", + "Dienstag", + "Mittwoch", + "Donnerstag", + "Freitag", + "Samstag", + "Sonntag"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("So", + "Mo", + "Di", + "Mi", + "Do", + "Fr", + "Sa", + "So"); + +// full month names +Calendar._MN = new Array +("Januar", + "Februar", + "M\u00e4rz", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Dezember"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "M\u00e4r", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Okt", + "Nov", + "Dez"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "\u00DCber dieses Kalendarmodul"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate 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" + +"Datum ausw\u00e4hlen:\n" + +"- Benutzen Sie die \xab, \xbb Buttons um das Jahr zu w\u00e4hlen\n" + +"- Benutzen Sie die " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " Buttons um den Monat zu w\u00e4hlen\n" + +"- F\u00fcr eine Schnellauswahl halten Sie die Maustaste \u00fcber diesen Buttons fest."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Zeit ausw\u00e4hlen:\n" + +"- Klicken Sie auf die Teile der Uhrzeit, um diese zu erh\u00F6hen\n" + +"- oder klicken Sie mit festgehaltener Shift-Taste um diese zu verringern\n" + +"- oder klicken und festhalten f\u00fcr Schnellauswahl."; + +Calendar._TT["TOGGLE"] = "Ersten Tag der Woche w\u00e4hlen"; +Calendar._TT["PREV_YEAR"] = "Voriges Jahr (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["PREV_MONTH"] = "Voriger Monat (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["GO_TODAY"] = "Heute ausw\u00e4hlen"; +Calendar._TT["NEXT_MONTH"] = "N\u00e4chst. Monat (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["NEXT_YEAR"] = "N\u00e4chst. Jahr (Festhalten f\u00fcr Schnellauswahl)"; +Calendar._TT["SEL_DATE"] = "Datum ausw\u00e4hlen"; +Calendar._TT["DRAG_TO_MOVE"] = "Zum Bewegen festhalten"; +Calendar._TT["PART_TODAY"] = " (Heute)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Woche beginnt mit %s "; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Schlie\u00dfen"; +Calendar._TT["TODAY"] = "Heute"; +Calendar._TT["TIME_PART"] = "(Shift-)Klick oder Festhalten und Ziehen um den Wert zu \u00e4ndern"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Zeit:"; diff --git a/htdocs/js/jscalendar/lang/calendar-du.js b/htdocs/js/jscalendar/lang/calendar-du.js new file mode 100644 index 0000000..2200448 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-du.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("Zondag", + "Maandag", + "Dinsdag", + "Woensdag", + "Donderdag", + "Vrijdag", + "Zaterdag", + "Zondag"); +Calendar._MN = new Array +("Januari", + "Februari", + "Maart", + "April", + "Mei", + "Juni", + "Juli", + "Augustus", + "September", + "Oktober", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Toggle startdag van de week"; +Calendar._TT["PREV_YEAR"] = "Vorig jaar (indrukken voor menu)"; +Calendar._TT["PREV_MONTH"] = "Vorige month (indrukken voor menu)"; +Calendar._TT["GO_TODAY"] = "Naar Vandaag"; +Calendar._TT["NEXT_MONTH"] = "Volgende Maand (indrukken voor menu)"; +Calendar._TT["NEXT_YEAR"] = "Volgend jaar (indrukken voor menu)"; +Calendar._TT["SEL_DATE"] = "Selecteer datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Sleep om te verplaatsen"; +Calendar._TT["PART_TODAY"] = " (vandaag)"; +Calendar._TT["MON_FIRST"] = "Toon Maandag eerst"; +Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst"; +Calendar._TT["CLOSE"] = "Sluiten"; +Calendar._TT["TODAY"] = "Vandaag"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "D, M d"; + +Calendar._TT["WK"] = "wk"; diff --git a/htdocs/js/jscalendar/lang/calendar-el.js b/htdocs/js/jscalendar/lang/calendar-el.js new file mode 100644 index 0000000..43a9b2c --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-el.js @@ -0,0 +1,89 @@ +// ** I18N +Calendar._DN = new Array +("ΚυÏιακή", + "ΔευτέÏα", + "ΤÏίτη", + "ΤετάÏτη", + "Πέμπτη", + "ΠαÏασκευή", + "Σάββατο", + "ΚυÏιακή"); + +Calendar._SDN = new Array +("Κυ", + "Δε", + "TÏ", + "Τε", + "Πε", + "Πα", + "Σα", + "Κυ"); + +Calendar._MN = new Array +("ΙανουάÏιος", + "ΦεβÏουάÏιος", + "ΜάÏτιος", + "ΑπÏίλιος", + "Μάϊος", + "ΙοÏνιος", + "ΙοÏλιος", + "ΑÏγουστος", + "ΣεπτέμβÏιος", + "ΟκτώβÏιος", + "ÎοέμβÏιος", + "ΔεκέμβÏιος"); + +Calendar._SMN = new Array +("Ιαν", + "Φεβ", + "ΜαÏ", + "ΑπÏ", + "Μαι", + "Ιουν", + "Ιουλ", + "Αυγ", + "Σεπ", + "Οκτ", + "Îοε", + "Δεκ"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Για το ημεÏολόγιο"; + +Calendar._TT["ABOUT"] = +"Επιλογέας ημεÏομηνίας/ÏŽÏας σε DHTML\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Για τελευταία έκδοση: http://www.dynarch.com/projects/calendar/\n" + +"Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + +"\n\n" + +"Επιλογή ημεÏομηνίας:\n" + +"- ΧÏησιμοποιείστε τα κουμπιά \xab, \xbb για επιλογή έτους\n" + +"- ΧÏησιμοποιείστε τα κουμπιά " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " για επιλογή μήνα\n" + +"- ΚÏατήστε κουμπί Ï€Î¿Î½Ï„Î¹ÎºÎ¿Ï Ï€Î±Ï„Î·Î¼Î­Î½Î¿ στα παÏαπάνω κουμπιά για πιο γÏήγοÏη επιλογή."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Επιλογή ÏŽÏας:\n" + +"- Κάντε κλικ σε ένα από τα μέÏη της ÏŽÏας για αÏξηση\n" + +"- ή Shift-κλικ για μείωση\n" + +"- ή κλικ και μετακίνηση για πιο γÏήγοÏη επιλογή."; +Calendar._TT["TOGGLE"] = "ΜπάÏα Ï€Ïώτης ημέÏας της εβδομάδας"; +Calendar._TT["PREV_YEAR"] = "ΠÏοηγ. έτος (κÏατήστε για το μενοÏ)"; +Calendar._TT["PREV_MONTH"] = "ΠÏοηγ. μήνας (κÏατήστε για το μενοÏ)"; +Calendar._TT["GO_TODAY"] = "ΣήμεÏα"; +Calendar._TT["NEXT_MONTH"] = "Επόμενος μήνας (κÏατήστε για το μενοÏ)"; +Calendar._TT["NEXT_YEAR"] = "Επόμενο έτος (κÏατήστε για το μενοÏ)"; +Calendar._TT["SEL_DATE"] = "Επιλέξτε ημεÏομηνία"; +Calendar._TT["DRAG_TO_MOVE"] = "ΣÏÏτε για να μετακινήσετε"; +Calendar._TT["PART_TODAY"] = " (σήμεÏα)"; +Calendar._TT["MON_FIRST"] = "Εμφάνιση ΔευτέÏας Ï€Ïώτα"; +Calendar._TT["SUN_FIRST"] = "Εμφάνιση ΚυÏιακής Ï€Ïώτα"; +Calendar._TT["CLOSE"] = "Κλείσιμο"; +Calendar._TT["TODAY"] = "ΣήμεÏα"; +Calendar._TT["TIME_PART"] = "(Shift-)κλικ ή μετακίνηση για αλλαγή"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "D, d M"; + +Calendar._TT["WK"] = "εβδ"; + diff --git a/htdocs/js/jscalendar/lang/calendar-en.js b/htdocs/js/jscalendar/lang/calendar-en.js new file mode 100644 index 0000000..0dbde79 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-en.js @@ -0,0 +1,127 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun"); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 0; + +// full month names +Calendar._MN = new Array +("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"); + +// 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."; +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."; + +Calendar._TT["PREV_YEAR"] = "Prev. year (hold for menu)"; +Calendar._TT["PREV_MONTH"] = "Prev. month (hold for menu)"; +Calendar._TT["GO_TODAY"] = "Go Today"; +Calendar._TT["NEXT_MONTH"] = "Next month (hold for menu)"; +Calendar._TT["NEXT_YEAR"] = "Next year (hold for menu)"; +Calendar._TT["SEL_DATE"] = "Select date"; +Calendar._TT["DRAG_TO_MOVE"] = "Drag to move"; +Calendar._TT["PART_TODAY"] = " (today)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Display %s first"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Close"; +Calendar._TT["TODAY"] = "Today"; +Calendar._TT["TIME_PART"] = "(Shift-)Click or drag to change value"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Time:"; diff --git a/htdocs/js/jscalendar/lang/calendar-es.js b/htdocs/js/jscalendar/lang/calendar-es.js new file mode 100644 index 0000000..19c1b30 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-es.js @@ -0,0 +1,129 @@ +// ** I18N + +// Calendar ES (spanish) language +// Author: Mihai Bazon, +// Updater: Servilio Afre Puentes +// Updated: 2004-06-03 +// Encoding: utf-8 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Domingo", + "Lunes", + "Martes", + "Miércoles", + "Jueves", + "Viernes", + "Sábado", + "Domingo"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Dom", + "Lun", + "Mar", + "Mié", + "Jue", + "Vie", + "Sáb", + "Dom"); + +// First day of the week. "0" means display Sunday first, "1" means display +// Monday first, etc. +Calendar._FD = 1; + +// full month names +Calendar._MN = new Array +("Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre"); + +// short month names +Calendar._SMN = new Array +("Ene", + "Feb", + "Mar", + "Abr", + "May", + "Jun", + "Jul", + "Ago", + "Sep", + "Oct", + "Nov", + "Dic"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Acerca del calendario"; + +Calendar._TT["ABOUT"] = +"Selector DHTML de Fecha/Hora\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Para conseguir la última versión visite: http://www.dynarch.com/projects/calendar/\n" + +"Distribuido bajo licencia GNU LGPL. Visite http://gnu.org/licenses/lgpl.html para más detalles." + +"\n\n" + +"Selección de fecha:\n" + +"- Use los botones \xab, \xbb para seleccionar el año\n" + +"- Use los botones " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" + +"- Mantenga pulsado el ratón en cualquiera de estos botones para una selección rápida."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Selección de hora:\n" + +"- Pulse en cualquiera de las partes de la hora para incrementarla\n" + +"- o pulse las mayúsculas mientras hace clic para decrementarla\n" + +"- o haga clic y arrastre el ratón para una selección más rápida."; + +Calendar._TT["PREV_YEAR"] = "Año anterior (mantener para menú)"; +Calendar._TT["PREV_MONTH"] = "Mes anterior (mantener para menú)"; +Calendar._TT["GO_TODAY"] = "Ir a hoy"; +Calendar._TT["NEXT_MONTH"] = "Mes siguiente (mantener para menú)"; +Calendar._TT["NEXT_YEAR"] = "Año siguiente (mantener para menú)"; +Calendar._TT["SEL_DATE"] = "Seleccionar fecha"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrastrar para mover"; +Calendar._TT["PART_TODAY"] = " (hoy)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Hacer %s primer día de la semana"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Cerrar"; +Calendar._TT["TODAY"] = "Hoy"; +Calendar._TT["TIME_PART"] = "(Mayúscula-)Clic o arrastre para cambiar valor"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y"; + +Calendar._TT["WK"] = "sem"; +Calendar._TT["TIME"] = "Hora:"; diff --git a/htdocs/js/jscalendar/lang/calendar-fi.js b/htdocs/js/jscalendar/lang/calendar-fi.js new file mode 100644 index 0000000..328eabb --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-fi.js @@ -0,0 +1,98 @@ +// ** I18N + +// Calendar FI language (Finnish, Suomi) +// Author: Jarno Käyhkö, +// Encoding: UTF-8 +// Distributed under the same terms as the calendar itself. + +// full day names +Calendar._DN = new Array +("Sunnuntai", + "Maanantai", + "Tiistai", + "Keskiviikko", + "Torstai", + "Perjantai", + "Lauantai", + "Sunnuntai"); + +// short day names +Calendar._SDN = new Array +("Su", + "Ma", + "Ti", + "Ke", + "To", + "Pe", + "La", + "Su"); + +// full month names +Calendar._MN = new Array +("Tammikuu", + "Helmikuu", + "Maaliskuu", + "Huhtikuu", + "Toukokuu", + "Kesäkuu", + "Heinäkuu", + "Elokuu", + "Syyskuu", + "Lokakuu", + "Marraskuu", + "Joulukuu"); + +// short month names +Calendar._SMN = new Array +("Tam", + "Hel", + "Maa", + "Huh", + "Tou", + "Kes", + "Hei", + "Elo", + "Syy", + "Lok", + "Mar", + "Jou"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Tietoja kalenterista"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Uusin versio osoitteessa: http://www.dynarch.com/projects/calendar/\n" + +"Julkaistu GNU LGPL lisenssin alaisuudessa. Lisätietoja osoitteessa http://gnu.org/licenses/lgpl.html" + +"\n\n" + +"Päivämäärä valinta:\n" + +"- Käytä \xab, \xbb painikkeita valitaksesi vuosi\n" + +"- Käytä " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " painikkeita valitaksesi kuukausi\n" + +"- Pitämällä hiiren painiketta minkä tahansa yllä olevan painikkeen kohdalla, saat näkyviin valikon nopeampaan siirtymiseen."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Ajan valinta:\n" + +"- Klikkaa kellonajan numeroita lisätäksesi aikaa\n" + +"- tai pitämällä Shift-näppäintä pohjassa saat aikaa taaksepäin\n" + +"- tai klikkaa ja pidä hiiren painike pohjassa sekä liikuta hiirtä muuttaaksesi aikaa nopeasti eteen- ja taaksepäin."; + +Calendar._TT["PREV_YEAR"] = "Edell. vuosi (paina hetki, näet valikon)"; +Calendar._TT["PREV_MONTH"] = "Edell. kuukausi (paina hetki, näet valikon)"; +Calendar._TT["GO_TODAY"] = "Siirry tähän päivään"; +Calendar._TT["NEXT_MONTH"] = "Seur. kuukausi (paina hetki, näet valikon)"; +Calendar._TT["NEXT_YEAR"] = "Seur. vuosi (paina hetki, näet valikon)"; +Calendar._TT["SEL_DATE"] = "Valitse päivämäärä"; +Calendar._TT["DRAG_TO_MOVE"] = "Siirrä kalenterin paikkaa"; +Calendar._TT["PART_TODAY"] = " (tänään)"; +Calendar._TT["MON_FIRST"] = "Näytä maanantai ensimmäisenä"; +Calendar._TT["SUN_FIRST"] = "Näytä sunnuntai ensimmäisenä"; +Calendar._TT["CLOSE"] = "Sulje"; +Calendar._TT["TODAY"] = "Tänään"; +Calendar._TT["TIME_PART"] = "(Shift-) Klikkaa tai liikuta muuttaaksesi aikaa"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%d.%m.%Y"; + +Calendar._TT["WK"] = "Vko"; diff --git a/htdocs/js/jscalendar/lang/calendar-fr.js b/htdocs/js/jscalendar/lang/calendar-fr.js new file mode 100644 index 0000000..2a9e0b2 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-fr.js @@ -0,0 +1,125 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// Translator: David Duret, from previous french version + +// full day names +Calendar._DN = new Array +("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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("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"); + +// short month names +Calendar._SMN = new Array +("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"; +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"; + +Calendar._TT["PREV_YEAR"] = "Année préc. (maintenir pour menu)"; +Calendar._TT["PREV_MONTH"] = "Mois préc. (maintenir pour menu)"; +Calendar._TT["GO_TODAY"] = "Atteindre la date du jour"; +Calendar._TT["NEXT_MONTH"] = "Mois suiv. (maintenir pour menu)"; +Calendar._TT["NEXT_YEAR"] = "Année suiv. (maintenir pour menu)"; +Calendar._TT["SEL_DATE"] = "Sélectionner une date"; +Calendar._TT["DRAG_TO_MOVE"] = "Déplacer"; +Calendar._TT["PART_TODAY"] = " (Aujourd'hui)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Afficher %s en premier"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Fermer"; +Calendar._TT["TODAY"] = "Aujourd'hui"; +Calendar._TT["TIME_PART"] = "(Maj-)Clic ou glisser pour modifier la valeur"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "Sem."; +Calendar._TT["TIME"] = "Heure :"; diff --git a/htdocs/js/jscalendar/lang/calendar-he-utf8.js b/htdocs/js/jscalendar/lang/calendar-he-utf8.js new file mode 100644 index 0000000..7861217 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-he-utf8.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar EN language +// Author: Idan Sofer, +// Encoding: UTF-8 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("ר×שון", + "שני", + "שלישי", + "רביעי", + "חמישי", + "שישי", + "שבת", + "ר×שון"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("×", + "ב", + "×’", + "ד", + "×”", + "ו", + "ש", + "×"); + +// full month names +Calendar._MN = new Array +("ינו×ר", + "פברו×ר", + "מרץ", + "×פריל", + "מ××™", + "יוני", + "יולי", + "×וגוסט", + "ספטמבר", + "×וקטובר", + "נובמבר", + "דצמבר"); + +// short month names +Calendar._SMN = new Array +("×™× ×", + "פבר", + "מרץ", + "×פר", + "מ××™", + "יונ", + "יול", + "×וג", + "ספט", + "×וק", + "נוב", + "דצמ"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "×ודות השנתון"; + +Calendar._TT["ABOUT"] = +"בחרן ת×ריך/שעה DHTML\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"×”×’×™×¨×¡× ×”×חרונה זמינה ב: http://www.dynarch.com/projects/calendar/\n" + +"מופץ תחת זיכיון ×” GNU LGPL. עיין ב http://gnu.org/licenses/lgpl.html ×œ×¤×¨×˜×™× × ×•×¡×¤×™×." + +"\n\n" + +בחירת ת×ריך:\n" + +"- השתמש ×‘×›×¤×ª×•×¨×™× \xab, \xbb לבחירת שנה\n" + +"- השתמש ×‘×›×¤×ª×•×¨×™× " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " לבחירת חודש\n" + +"- החזק העכבר לחוץ מעל ×”×›×¤×ª×•×¨×™× ×”×ž×•×–×›×¨×™× ×œ×¢×™×œ לבחירה מהירה יותר."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"בחירת זמן:\n" + +"- לחץ על כל ×חד מחלקי הזמן כדי להוסיף\n" + +"- ×ו shift בשילוב ×¢× ×œ×—×™×¦×” כדי להחסיר\n" + +"- ×ו לחץ וגרור לפעולה מהירה יותר."; + +Calendar._TT["PREV_YEAR"] = "שנה קודמת - החזק לקבלת תפריט"; +Calendar._TT["PREV_MONTH"] = "חודש ×§×•×“× - החזק לקבלת תפריט"; +Calendar._TT["GO_TODAY"] = "עבור להיו×"; +Calendar._TT["NEXT_MONTH"] = "חודש ×”×‘× - החזק לתפריט"; +Calendar._TT["NEXT_YEAR"] = "שנה הב××” - החזק לתפריט"; +Calendar._TT["SEL_DATE"] = "בחר ת×ריך"; +Calendar._TT["DRAG_TO_MOVE"] = "גרור להזזה"; +Calendar._TT["PART_TODAY"] = " )היו×("; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "הצג %s קוד×"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "6"; + +Calendar._TT["CLOSE"] = "סגור"; +Calendar._TT["TODAY"] = "היו×"; +Calendar._TT["TIME_PART"] = "(שיפט-)לחץ וגרור כדי לשנות ערך"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "שעה::"; diff --git a/htdocs/js/jscalendar/lang/calendar-hr-utf8.js b/htdocs/js/jscalendar/lang/calendar-hr-utf8.js new file mode 100644 index 0000000..d569cfd --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-hr-utf8.js @@ -0,0 +1,49 @@ +/* Croatian language file for the DHTML Calendar version 0.9.2 +* Author Krunoslav Zubrinic , June 2003. +* Feel free to use this script under the terms of the GNU Lesser General +* Public License, as long as you do not remove or alter this notice. +*/ +Calendar._DN = new Array +("Nedjelja", + "Ponedjeljak", + "Utorak", + "Srijeda", + "ÄŒetvrtak", + "Petak", + "Subota", + "Nedjelja"); +Calendar._MN = new Array +("SijeÄanj", + "VeljaÄa", + "Ožujak", + "Travanj", + "Svibanj", + "Lipanj", + "Srpanj", + "Kolovoz", + "Rujan", + "Listopad", + "Studeni", + "Prosinac"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Promjeni dan s kojim poÄinje tjedan"; +Calendar._TT["PREV_YEAR"] = "Prethodna godina (dugi pritisak za meni)"; +Calendar._TT["PREV_MONTH"] = "Prethodni mjesec (dugi pritisak za meni)"; +Calendar._TT["GO_TODAY"] = "Idi na tekući dan"; +Calendar._TT["NEXT_MONTH"] = "Slijedeći mjesec (dugi pritisak za meni)"; +Calendar._TT["NEXT_YEAR"] = "Slijedeća godina (dugi pritisak za meni)"; +Calendar._TT["SEL_DATE"] = "Izaberite datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Pritisni i povuci za promjenu pozicije"; +Calendar._TT["PART_TODAY"] = " (today)"; +Calendar._TT["MON_FIRST"] = "Prikaži ponedjeljak kao prvi dan"; +Calendar._TT["SUN_FIRST"] = "Prikaži nedjelju kao prvi dan"; +Calendar._TT["CLOSE"] = "Zatvori"; +Calendar._TT["TODAY"] = "Danas"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "DD, dd.mm.y"; + +Calendar._TT["WK"] = "Tje"; \ No newline at end of file diff --git a/htdocs/js/jscalendar/lang/calendar-hr.js b/htdocs/js/jscalendar/lang/calendar-hr.js new file mode 100644 index 0000000..6c27f60 Binary files /dev/null and b/htdocs/js/jscalendar/lang/calendar-hr.js differ diff --git a/htdocs/js/jscalendar/lang/calendar-hu.js b/htdocs/js/jscalendar/lang/calendar-hu.js new file mode 100644 index 0000000..f5bf057 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-hu.js @@ -0,0 +1,124 @@ +// ** I18N + +// Calendar HU language +// Author: ??? +// Modifier: KARASZI Istvan, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Vasárnap", + "Hétfõ", + "Kedd", + "Szerda", + "Csütörtök", + "Péntek", + "Szombat", + "Vasárnap"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("v", + "h", + "k", + "sze", + "cs", + "p", + "szo", + "v"); + +// full month names +Calendar._MN = new Array +("január", + "február", + "március", + "április", + "május", + "június", + "július", + "augusztus", + "szeptember", + "október", + "november", + "december"); + +// short month names +Calendar._SMN = new Array +("jan", + "feb", + "már", + "ápr", + "máj", + "jún", + "júl", + "aug", + "sze", + "okt", + "nov", + "dec"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "A kalendáriumról"; + +Calendar._TT["ABOUT"] = +"DHTML dátum/idõ kiválasztó\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"a legfrissebb verzió megtalálható: http://www.dynarch.com/projects/calendar/\n" + +"GNU LGPL alatt terjesztve. Lásd a http://gnu.org/licenses/lgpl.html oldalt a részletekhez." + +"\n\n" + +"Dátum választás:\n" + +"- használja a \xab, \xbb gombokat az év kiválasztásához\n" + +"- használja a " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gombokat a hónap kiválasztásához\n" + +"- tartsa lenyomva az egérgombot a gyors választáshoz."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Idõ választás:\n" + +"- kattintva növelheti az idõt\n" + +"- shift-tel kattintva csökkentheti\n" + +"- lenyomva tartva és húzva gyorsabban kiválaszthatja."; + +Calendar._TT["PREV_YEAR"] = "Elõzõ év (tartsa nyomva a menühöz)"; +Calendar._TT["PREV_MONTH"] = "Elõzõ hónap (tartsa nyomva a menühöz)"; +Calendar._TT["GO_TODAY"] = "Mai napra ugrás"; +Calendar._TT["NEXT_MONTH"] = "Köv. hónap (tartsa nyomva a menühöz)"; +Calendar._TT["NEXT_YEAR"] = "Köv. év (tartsa nyomva a menühöz)"; +Calendar._TT["SEL_DATE"] = "Válasszon dátumot"; +Calendar._TT["DRAG_TO_MOVE"] = "Húzza a mozgatáshoz"; +Calendar._TT["PART_TODAY"] = " (ma)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "%s legyen a hét elsõ napja"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Bezár"; +Calendar._TT["TODAY"] = "Ma"; +Calendar._TT["TIME_PART"] = "(Shift-)Klikk vagy húzás az érték változtatásához"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%b %e, %a"; + +Calendar._TT["WK"] = "hét"; +Calendar._TT["TIME"] = "idõ:"; diff --git a/htdocs/js/jscalendar/lang/calendar-it.js b/htdocs/js/jscalendar/lang/calendar-it.js new file mode 100644 index 0000000..7f84cde --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-it.js @@ -0,0 +1,124 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Translator: Fabio Di Bernardini, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Domenica", + "Lunedì", + "Martedì", + "Mercoledì", + "Giovedì", + "Venerdì", + "Sabato", + "Domenica"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Dom", + "Lun", + "Mar", + "Mer", + "Gio", + "Ven", + "Sab", + "Dom"); + +// full month names +Calendar._MN = new Array +("Gennaio", + "Febbraio", + "Marzo", + "Aprile", + "Maggio", + "Giugno", + "Luglio", + "Augosto", + "Settembre", + "Ottobre", + "Novembre", + "Dicembre"); + +// short month names +Calendar._SMN = new Array +("Gen", + "Feb", + "Mar", + "Apr", + "Mag", + "Giu", + "Lug", + "Ago", + "Set", + "Ott", + "Nov", + "Dic"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Informazioni sul calendario"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Per gli aggiornamenti: http://www.dynarch.com/projects/calendar/\n" + +"Distribuito sotto licenza GNU LGPL. Vedi http://gnu.org/licenses/lgpl.html per i dettagli." + +"\n\n" + +"Selezione data:\n" + +"- Usa \xab, \xbb per selezionare l'anno\n" + +"- Usa " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " per i mesi\n" + +"- Tieni premuto a lungo il mouse per accedere alle funzioni di selezione veloce."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Selezione orario:\n" + +"- Clicca sul numero per incrementarlo\n" + +"- o Shift+click per decrementarlo\n" + +"- o click e sinistra o destra per variarlo."; + +Calendar._TT["PREV_YEAR"] = "Anno prec.(clicca a lungo per il menù)"; +Calendar._TT["PREV_MONTH"] = "Mese prec. (clicca a lungo per il menù)"; +Calendar._TT["GO_TODAY"] = "Oggi"; +Calendar._TT["NEXT_MONTH"] = "Pross. mese (clicca a lungo per il menù)"; +Calendar._TT["NEXT_YEAR"] = "Pross. anno (clicca a lungo per il menù)"; +Calendar._TT["SEL_DATE"] = "Seleziona data"; +Calendar._TT["DRAG_TO_MOVE"] = "Trascina per spostarlo"; +Calendar._TT["PART_TODAY"] = " (oggi)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Mostra prima %s"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Chiudi"; +Calendar._TT["TODAY"] = "Oggi"; +Calendar._TT["TIME_PART"] = "(Shift-)Click o trascina per cambiare il valore"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a:%b:%e"; + +Calendar._TT["WK"] = "set"; +Calendar._TT["TIME"] = "Ora:"; diff --git a/htdocs/js/jscalendar/lang/calendar-jp.js b/htdocs/js/jscalendar/lang/calendar-jp.js new file mode 100644 index 0000000..3bca7eb --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-jp.js @@ -0,0 +1,45 @@ +// ** I18N +Calendar._DN = new Array +("“ú", + "ŒŽ", + "‰Î", + "…", + "–Ø", + "‹à", + "“y", + "“ú"); +Calendar._MN = new Array +("1ŒŽ", + "2ŒŽ", + "3ŒŽ", + "4ŒŽ", + "5ŒŽ", + "6ŒŽ", + "7ŒŽ", + "8ŒŽ", + "9ŒŽ", + "10ŒŽ", + "11ŒŽ", + "12ŒŽ"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "T‚Ìʼn‚Ì—j“ú‚ðØ‚è‘Ö‚¦"; +Calendar._TT["PREV_YEAR"] = "‘O”N"; +Calendar._TT["PREV_MONTH"] = "‘OŒŽ"; +Calendar._TT["GO_TODAY"] = "¡“ú"; +Calendar._TT["NEXT_MONTH"] = "—‚ŒŽ"; +Calendar._TT["NEXT_YEAR"] = "—‚”N"; +Calendar._TT["SEL_DATE"] = "“ú•t‘I‘ð"; +Calendar._TT["DRAG_TO_MOVE"] = "ƒEƒBƒ“ƒhƒE‚̈ړ®"; +Calendar._TT["PART_TODAY"] = " (¡“ú)"; +Calendar._TT["MON_FIRST"] = "ŒŽ—j“ú‚ð擪‚É"; +Calendar._TT["SUN_FIRST"] = "“ú—j“ú‚ð擪‚É"; +Calendar._TT["CLOSE"] = "•Â‚¶‚é"; +Calendar._TT["TODAY"] = "¡“ú"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "y-mm-dd"; +Calendar._TT["TT_DATE_FORMAT"] = "%mŒŽ %d“ú (%a)"; + +Calendar._TT["WK"] = "T"; diff --git a/htdocs/js/jscalendar/lang/calendar-ko-utf8.js b/htdocs/js/jscalendar/lang/calendar-ko-utf8.js new file mode 100644 index 0000000..035dd74 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-ko-utf8.js @@ -0,0 +1,120 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Translation: Yourim Yi +// Encoding: EUC-KR +// lang : ko +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names + +Calendar._DN = new Array +("ì¼ìš”ì¼", + "월요ì¼", + "화요ì¼", + "수요ì¼", + "목요ì¼", + "금요ì¼", + "토요ì¼", + "ì¼ìš”ì¼"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("ì¼", + "ì›”", + "í™”", + "수", + "목", + "금", + "토", + "ì¼"); + +// full month names +Calendar._MN = new Array +("1ì›”", + "2ì›”", + "3ì›”", + "4ì›”", + "5ì›”", + "6ì›”", + "7ì›”", + "8ì›”", + "9ì›”", + "10ì›”", + "11ì›”", + "12ì›”"); + +// short month names +Calendar._SMN = new Array +("1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "calendar ì— ëŒ€í•´ì„œ"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"\n"+ +"최신 ë²„ì „ì„ ë°›ìœ¼ì‹œë ¤ë©´ http://www.dynarch.com/projects/calendar/ ì— ë°©ë¬¸í•˜ì„¸ìš”\n" + +"\n"+ +"GNU LGPL ë¼ì´ì„¼ìŠ¤ë¡œ ë°°í¬ë©ë‹ˆë‹¤. \n"+ +"ë¼ì´ì„¼ìŠ¤ì— 대한 ìžì„¸í•œ ë‚´ìš©ì€ http://gnu.org/licenses/lgpl.html ì„ ì½ìœ¼ì„¸ìš”." + +"\n\n" + +"날짜 ì„ íƒ:\n" + +"- ì—°ë„를 ì„ íƒí•˜ë ¤ë©´ \xab, \xbb ë²„íŠ¼ì„ ì‚¬ìš©í•©ë‹ˆë‹¤\n" + +"- ë‹¬ì„ ì„ íƒí•˜ë ¤ë©´ " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " ë²„íŠ¼ì„ ëˆ„ë¥´ì„¸ìš”\n" + +"- ê³„ì† ëˆ„ë¥´ê³  있으면 위 ê°’ë“¤ì„ ë¹ ë¥´ê²Œ ì„ íƒí•˜ì‹¤ 수 있습니다."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"시간 ì„ íƒ:\n" + +"- 마우스로 누르면 ì‹œê°„ì´ ì¦ê°€í•©ë‹ˆë‹¤\n" + +"- Shift 키와 함께 누르면 ê°ì†Œí•©ë‹ˆë‹¤\n" + +"- 누른 ìƒíƒœì—ì„œ 마우스를 움ì§ì´ë©´ 좀 ë” ë¹ ë¥´ê²Œ ê°’ì´ ë³€í•©ë‹ˆë‹¤.\n"; + +Calendar._TT["PREV_YEAR"] = "지난 í•´ (길게 누르면 목ë¡)"; +Calendar._TT["PREV_MONTH"] = "지난 달 (길게 누르면 목ë¡)"; +Calendar._TT["GO_TODAY"] = "오늘 날짜로"; +Calendar._TT["NEXT_MONTH"] = "ë‹¤ìŒ ë‹¬ (길게 누르면 목ë¡)"; +Calendar._TT["NEXT_YEAR"] = "ë‹¤ìŒ í•´ (길게 누르면 목ë¡)"; +Calendar._TT["SEL_DATE"] = "날짜를 ì„ íƒí•˜ì„¸ìš”"; +Calendar._TT["DRAG_TO_MOVE"] = "마우스 드래그로 ì´ë™ 하세요"; +Calendar._TT["PART_TODAY"] = " (오늘)"; +Calendar._TT["MON_FIRST"] = "월요ì¼ì„ í•œ ì£¼ì˜ ì‹œìž‘ ìš”ì¼ë¡œ"; +Calendar._TT["SUN_FIRST"] = "ì¼ìš”ì¼ì„ í•œ ì£¼ì˜ ì‹œìž‘ ìš”ì¼ë¡œ"; +Calendar._TT["CLOSE"] = "닫기"; +Calendar._TT["TODAY"] = "오늘"; +Calendar._TT["TIME_PART"] = "(Shift-)í´ë¦­ ë˜ëŠ” 드래그 하세요"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]"; + +Calendar._TT["WK"] = "주"; diff --git a/htdocs/js/jscalendar/lang/calendar-ko.js b/htdocs/js/jscalendar/lang/calendar-ko.js new file mode 100644 index 0000000..8cddf58 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-ko.js @@ -0,0 +1,120 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Translation: Yourim Yi +// Encoding: EUC-KR +// lang : ko +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names + +Calendar._DN = new Array +("ÀÏ¿äÀÏ", + "¿ù¿äÀÏ", + "È­¿äÀÏ", + "¼ö¿äÀÏ", + "¸ñ¿äÀÏ", + "±Ý¿äÀÏ", + "Åä¿äÀÏ", + "ÀÏ¿äÀÏ"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("ÀÏ", + "¿ù", + "È­", + "¼ö", + "¸ñ", + "±Ý", + "Åä", + "ÀÏ"); + +// full month names +Calendar._MN = new Array +("1¿ù", + "2¿ù", + "3¿ù", + "4¿ù", + "5¿ù", + "6¿ù", + "7¿ù", + "8¿ù", + "9¿ù", + "10¿ù", + "11¿ù", + "12¿ù"); + +// short month names +Calendar._SMN = new Array +("1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "calendar ¿¡ ´ëÇؼ­"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"\n"+ +"ÃֽŠ¹öÀüÀ» ¹ÞÀ¸½Ã·Á¸é http://www.dynarch.com/projects/calendar/ ¿¡ ¹æ¹®Çϼ¼¿ä\n" + +"\n"+ +"GNU LGPL ¶óÀ̼¾½º·Î ¹èÆ÷µË´Ï´Ù. \n"+ +"¶óÀ̼¾½º¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº http://gnu.org/licenses/lgpl.html À» ÀÐÀ¸¼¼¿ä." + +"\n\n" + +"³¯Â¥ ¼±ÅÃ:\n" + +"- ¿¬µµ¸¦ ¼±ÅÃÇÏ·Á¸é \xab, \xbb ¹öÆ°À» »ç¿ëÇÕ´Ï´Ù\n" + +"- ´ÞÀ» ¼±ÅÃÇÏ·Á¸é " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " ¹öÆ°À» ´©¸£¼¼¿ä\n" + +"- °è¼Ó ´©¸£°í ÀÖÀ¸¸é À§ °ªµéÀ» ºü¸£°Ô ¼±ÅÃÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"½Ã°£ ¼±ÅÃ:\n" + +"- ¸¶¿ì½º·Î ´©¸£¸é ½Ã°£ÀÌ Áõ°¡ÇÕ´Ï´Ù\n" + +"- Shift Å°¿Í ÇÔ²² ´©¸£¸é °¨¼ÒÇÕ´Ï´Ù\n" + +"- ´©¸¥ »óÅ¿¡¼­ ¸¶¿ì½º¸¦ ¿òÁ÷À̸é Á» ´õ ºü¸£°Ô °ªÀÌ º¯ÇÕ´Ï´Ù.\n"; + +Calendar._TT["PREV_YEAR"] = "Áö³­ ÇØ (±æ°Ô ´©¸£¸é ¸ñ·Ï)"; +Calendar._TT["PREV_MONTH"] = "Áö³­ ´Þ (±æ°Ô ´©¸£¸é ¸ñ·Ï)"; +Calendar._TT["GO_TODAY"] = "¿À´Ã ³¯Â¥·Î"; +Calendar._TT["NEXT_MONTH"] = "´ÙÀ½ ´Þ (±æ°Ô ´©¸£¸é ¸ñ·Ï)"; +Calendar._TT["NEXT_YEAR"] = "´ÙÀ½ ÇØ (±æ°Ô ´©¸£¸é ¸ñ·Ï)"; +Calendar._TT["SEL_DATE"] = "³¯Â¥¸¦ ¼±ÅÃÇϼ¼¿ä"; +Calendar._TT["DRAG_TO_MOVE"] = "¸¶¿ì½º µå·¡±×·Î À̵¿ Çϼ¼¿ä"; +Calendar._TT["PART_TODAY"] = " (¿À´Ã)"; +Calendar._TT["MON_FIRST"] = "¿ù¿äÀÏÀ» ÇÑ ÁÖÀÇ ½ÃÀÛ ¿äÀÏ·Î"; +Calendar._TT["SUN_FIRST"] = "ÀÏ¿äÀÏÀ» ÇÑ ÁÖÀÇ ½ÃÀÛ ¿äÀÏ·Î"; +Calendar._TT["CLOSE"] = "´Ý±â"; +Calendar._TT["TODAY"] = "¿À´Ã"; +Calendar._TT["TIME_PART"] = "(Shift-)Ŭ¸¯ ¶Ç´Â µå·¡±× Çϼ¼¿ä"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%b/%e [%a]"; + +Calendar._TT["WK"] = "ÁÖ"; diff --git a/htdocs/js/jscalendar/lang/calendar-lt-utf8.js b/htdocs/js/jscalendar/lang/calendar-lt-utf8.js new file mode 100644 index 0000000..d39653b --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-lt-utf8.js @@ -0,0 +1,114 @@ +// ** I18N + +// Calendar LT language +// Author: Martynas Majeris, +// Encoding: UTF-8 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Sekmadienis", + "Pirmadienis", + "Antradienis", + "TreÄiadienis", + "Ketvirtadienis", + "Pentadienis", + "Å eÅ¡tadienis", + "Sekmadienis"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Sek", + "Pir", + "Ant", + "Tre", + "Ket", + "Pen", + "Å eÅ¡", + "Sek"); + +// full month names +Calendar._MN = new Array +("Sausis", + "Vasaris", + "Kovas", + "Balandis", + "Gegužė", + "Birželis", + "Liepa", + "RugpjÅ«tis", + "RugsÄ—jis", + "Spalis", + "Lapkritis", + "Gruodis"); + +// short month names +Calendar._SMN = new Array +("Sau", + "Vas", + "Kov", + "Bal", + "Geg", + "Bir", + "Lie", + "Rgp", + "Rgs", + "Spa", + "Lap", + "Gru"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Apie kalendorių"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"NaujausiÄ… versijÄ… rasite: http://www.dynarch.com/projects/calendar/\n" + +"Platinamas pagal GNU LGPL licencijÄ…. Aplankykite http://gnu.org/licenses/lgpl.html" + +"\n\n" + +"Datos pasirinkimas:\n" + +"- Metų pasirinkimas: \xab, \xbb\n" + +"- MÄ—nesio pasirinkimas: " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "\n" + +"- Nuspauskite ir laikykite pelÄ—s klaviÅ¡Ä… greitesniam pasirinkimui."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Laiko pasirinkimas:\n" + +"- Spustelkite ant valandų arba minuÄių - skaiÄius padidÄ—s vienetu.\n" + +"- Jei spausite kartu su Shift, skaiÄius sumažės.\n" + +"- Greitam pasirinkimui spustelkite ir pajudinkite pelÄ™."; + +Calendar._TT["PREV_YEAR"] = "Ankstesni metai (laikykite, jei norite meniu)"; +Calendar._TT["PREV_MONTH"] = "Ankstesnis mÄ—nuo (laikykite, jei norite meniu)"; +Calendar._TT["GO_TODAY"] = "Pasirinkti Å¡iandienÄ…"; +Calendar._TT["NEXT_MONTH"] = "Kitas mÄ—nuo (laikykite, jei norite meniu)"; +Calendar._TT["NEXT_YEAR"] = "Kiti metai (laikykite, jei norite meniu)"; +Calendar._TT["SEL_DATE"] = "Pasirinkite datÄ…"; +Calendar._TT["DRAG_TO_MOVE"] = "Tempkite"; +Calendar._TT["PART_TODAY"] = " (Å¡iandien)"; +Calendar._TT["MON_FIRST"] = "Pirma savaitÄ—s diena - pirmadienis"; +Calendar._TT["SUN_FIRST"] = "Pirma savaitÄ—s diena - sekmadienis"; +Calendar._TT["CLOSE"] = "Uždaryti"; +Calendar._TT["TODAY"] = "Å iandien"; +Calendar._TT["TIME_PART"] = "Spustelkite arba tempkite jei norite pakeisti"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %Y-%m-%d"; + +Calendar._TT["WK"] = "sav"; diff --git a/htdocs/js/jscalendar/lang/calendar-lt.js b/htdocs/js/jscalendar/lang/calendar-lt.js new file mode 100644 index 0000000..43b93d6 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-lt.js @@ -0,0 +1,114 @@ +// ** I18N + +// Calendar LT language +// Author: Martynas Majeris, +// Encoding: Windows-1257 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Sekmadienis", + "Pirmadienis", + "Antradienis", + "Treèiadienis", + "Ketvirtadienis", + "Pentadienis", + "Ðeðtadienis", + "Sekmadienis"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Sek", + "Pir", + "Ant", + "Tre", + "Ket", + "Pen", + "Ðeð", + "Sek"); + +// full month names +Calendar._MN = new Array +("Sausis", + "Vasaris", + "Kovas", + "Balandis", + "Geguþë", + "Birþelis", + "Liepa", + "Rugpjûtis", + "Rugsëjis", + "Spalis", + "Lapkritis", + "Gruodis"); + +// short month names +Calendar._SMN = new Array +("Sau", + "Vas", + "Kov", + "Bal", + "Geg", + "Bir", + "Lie", + "Rgp", + "Rgs", + "Spa", + "Lap", + "Gru"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Apie kalendoriø"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Naujausià versijà rasite: http://www.dynarch.com/projects/calendar/\n" + +"Platinamas pagal GNU LGPL licencijà. Aplankykite http://gnu.org/licenses/lgpl.html" + +"\n\n" + +"Datos pasirinkimas:\n" + +"- Metø pasirinkimas: \xab, \xbb\n" + +"- Mënesio pasirinkimas: " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "\n" + +"- Nuspauskite ir laikykite pelës klaviðà greitesniam pasirinkimui."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Laiko pasirinkimas:\n" + +"- Spustelkite ant valandø arba minuèiø - skaièus padidës vienetu.\n" + +"- Jei spausite kartu su Shift, skaièius sumaþës.\n" + +"- Greitam pasirinkimui spustelkite ir pajudinkite pelæ."; + +Calendar._TT["PREV_YEAR"] = "Ankstesni metai (laikykite, jei norite meniu)"; +Calendar._TT["PREV_MONTH"] = "Ankstesnis mënuo (laikykite, jei norite meniu)"; +Calendar._TT["GO_TODAY"] = "Pasirinkti ðiandienà"; +Calendar._TT["NEXT_MONTH"] = "Kitas mënuo (laikykite, jei norite meniu)"; +Calendar._TT["NEXT_YEAR"] = "Kiti metai (laikykite, jei norite meniu)"; +Calendar._TT["SEL_DATE"] = "Pasirinkite datà"; +Calendar._TT["DRAG_TO_MOVE"] = "Tempkite"; +Calendar._TT["PART_TODAY"] = " (ðiandien)"; +Calendar._TT["MON_FIRST"] = "Pirma savaitës diena - pirmadienis"; +Calendar._TT["SUN_FIRST"] = "Pirma savaitës diena - sekmadienis"; +Calendar._TT["CLOSE"] = "Uþdaryti"; +Calendar._TT["TODAY"] = "Ðiandien"; +Calendar._TT["TIME_PART"] = "Spustelkite arba tempkite jei norite pakeisti"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %Y-%m-%d"; + +Calendar._TT["WK"] = "sav"; diff --git a/htdocs/js/jscalendar/lang/calendar-lv.js b/htdocs/js/jscalendar/lang/calendar-lv.js new file mode 100644 index 0000000..407699d --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-lv.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar LV language +// Author: Juris Valdovskis, +// Encoding: cp1257 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Svçtdiena", + "Pirmdiena", + "Otrdiena", + "Treðdiena", + "Ceturdiena", + "Piektdiena", + "Sestdiena", + "Svçtdiena"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Sv", + "Pr", + "Ot", + "Tr", + "Ce", + "Pk", + "Se", + "Sv"); + +// full month names +Calendar._MN = new Array +("Janvâris", + "Februâris", + "Marts", + "Aprîlis", + "Maijs", + "Jûnijs", + "Jûlijs", + "Augusts", + "Septembris", + "Oktobris", + "Novembris", + "Decembris"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "Mar", + "Apr", + "Mai", + "Jûn", + "Jûl", + "Aug", + "Sep", + "Okt", + "Nov", + "Dec"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Par kalendâru"; + +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" + +"Datuma izvçle:\n" + +"- Izmanto \xab, \xbb pogas, lai izvçlçtos gadu\n" + +"- Izmanto " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "pogas, lai izvçlçtos mçnesi\n" + +"- Turi nospiestu peles pogu uz jebkuru no augstâk minçtajâm pogâm, lai paâtrinâtu izvçli."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Laika izvçle:\n" + +"- Uzklikðíini uz jebkuru no laika daïâm, lai palielinâtu to\n" + +"- vai Shift-klikðíis, lai samazinâtu to\n" + +"- vai noklikðíini un velc uz attiecîgo virzienu lai mainîtu âtrâk."; + +Calendar._TT["PREV_YEAR"] = "Iepr. gads (turi izvçlnei)"; +Calendar._TT["PREV_MONTH"] = "Iepr. mçnesis (turi izvçlnei)"; +Calendar._TT["GO_TODAY"] = "Ðodien"; +Calendar._TT["NEXT_MONTH"] = "Nâkoðais mçnesis (turi izvçlnei)"; +Calendar._TT["NEXT_YEAR"] = "Nâkoðais gads (turi izvçlnei)"; +Calendar._TT["SEL_DATE"] = "Izvçlies datumu"; +Calendar._TT["DRAG_TO_MOVE"] = "Velc, lai pârvietotu"; +Calendar._TT["PART_TODAY"] = " (ðodien)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Attçlot %s kâ pirmo"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "1,7"; + +Calendar._TT["CLOSE"] = "Aizvçrt"; +Calendar._TT["TODAY"] = "Ðodien"; +Calendar._TT["TIME_PART"] = "(Shift-)Klikðíis vai pârvieto, lai mainîtu"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Laiks:"; diff --git a/htdocs/js/jscalendar/lang/calendar-nl.js b/htdocs/js/jscalendar/lang/calendar-nl.js new file mode 100644 index 0000000..a1dea94 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-nl.js @@ -0,0 +1,73 @@ +// ** I18N +Calendar._DN = new Array +("Zondag", + "Maandag", + "Dinsdag", + "Woensdag", + "Donderdag", + "Vrijdag", + "Zaterdag", + "Zondag"); + +Calendar._SDN_len = 2; + +Calendar._MN = new Array +("Januari", + "Februari", + "Maart", + "April", + "Mei", + "Juni", + "Juli", + "Augustus", + "September", + "Oktober", + "November", + "December"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Info"; + +Calendar._TT["ABOUT"] = +"DHTML Datum/Tijd Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + +"Ga voor de meest recente versie naar: http://www.dynarch.com/projects/calendar/\n" + +"Verspreid onder de GNU LGPL. Zie http://gnu.org/licenses/lgpl.html voor details." + +"\n\n" + +"Datum selectie:\n" + +"- Gebruik de \xab \xbb knoppen om een jaar te selecteren\n" + +"- Gebruik de " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " knoppen om een maand te selecteren\n" + +"- Houd de muis ingedrukt op de genoemde knoppen voor een snellere selectie."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Tijd selectie:\n" + +"- Klik op een willekeurig onderdeel van het tijd gedeelte om het te verhogen\n" + +"- of Shift-klik om het te verlagen\n" + +"- of klik en sleep voor een snellere selectie."; + +//Calendar._TT["TOGGLE"] = "Selecteer de eerste week-dag"; +Calendar._TT["PREV_YEAR"] = "Vorig jaar (ingedrukt voor menu)"; +Calendar._TT["PREV_MONTH"] = "Vorige maand (ingedrukt voor menu)"; +Calendar._TT["GO_TODAY"] = "Ga naar Vandaag"; +Calendar._TT["NEXT_MONTH"] = "Volgende maand (ingedrukt voor menu)"; +Calendar._TT["NEXT_YEAR"] = "Volgend jaar (ingedrukt voor menu)"; +Calendar._TT["SEL_DATE"] = "Selecteer datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Klik en sleep om te verplaatsen"; +Calendar._TT["PART_TODAY"] = " (vandaag)"; +//Calendar._TT["MON_FIRST"] = "Toon Maandag eerst"; +//Calendar._TT["SUN_FIRST"] = "Toon Zondag eerst"; + +Calendar._TT["DAY_FIRST"] = "Toon %s eerst"; + +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Sluiten"; +Calendar._TT["TODAY"] = "(vandaag)"; +Calendar._TT["TIME_PART"] = "(Shift-)Klik of sleep om de waarde te veranderen"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b %Y"; + +Calendar._TT["WK"] = "wk"; +Calendar._TT["TIME"] = "Tijd:"; \ No newline at end of file diff --git a/htdocs/js/jscalendar/lang/calendar-no.js b/htdocs/js/jscalendar/lang/calendar-no.js new file mode 100644 index 0000000..d9297d1 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-no.js @@ -0,0 +1,114 @@ +// ** I18N + +// Calendar NO language +// Author: Daniel Holmen, +// Encoding: UTF-8 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Søndag", + "Mandag", + "Tirsdag", + "Onsdag", + "Torsdag", + "Fredag", + "Lørdag", + "Søndag"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Søn", + "Man", + "Tir", + "Ons", + "Tor", + "Fre", + "Lør", + "Søn"); + +// full month names +Calendar._MN = new Array +("Januar", + "Februar", + "Mars", + "April", + "Mai", + "Juni", + "Juli", + "August", + "September", + "Oktober", + "November", + "Desember"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "Mar", + "Apr", + "Mai", + "Jun", + "Jul", + "Aug", + "Sep", + "Okt", + "Nov", + "Des"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Om kalenderen"; + +Calendar._TT["ABOUT"] = +"DHTML Dato-/Tidsvelger\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"For nyeste versjon, gÃ¥ til: http://www.dynarch.com/projects/calendar/\n" + +"Distribuert under GNU LGPL. Se http://gnu.org/licenses/lgpl.html for detaljer." + +"\n\n" + +"Datovalg:\n" + +"- Bruk knappene \xab og \xbb for Ã¥ velge Ã¥r\n" + +"- Bruk knappene " + String.fromCharCode(0x2039) + " og " + String.fromCharCode(0x203a) + " for Ã¥ velge mÃ¥ned\n" + +"- Hold inne musknappen eller knappene over for raskere valg."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Tidsvalg:\n" + +"- Klikk pÃ¥ en av tidsdelene for Ã¥ øke den\n" + +"- eller Shift-klikk for Ã¥ senke verdien\n" + +"- eller klikk-og-dra for raskere valg.."; + +Calendar._TT["PREV_YEAR"] = "Forrige. Ã¥r (hold for meny)"; +Calendar._TT["PREV_MONTH"] = "Forrige. mÃ¥ned (hold for meny)"; +Calendar._TT["GO_TODAY"] = "GÃ¥ til idag"; +Calendar._TT["NEXT_MONTH"] = "Neste mÃ¥ned (hold for meny)"; +Calendar._TT["NEXT_YEAR"] = "Neste Ã¥r (hold for meny)"; +Calendar._TT["SEL_DATE"] = "Velg dato"; +Calendar._TT["DRAG_TO_MOVE"] = "Dra for Ã¥ flytte"; +Calendar._TT["PART_TODAY"] = " (idag)"; +Calendar._TT["MON_FIRST"] = "Vis mandag først"; +Calendar._TT["SUN_FIRST"] = "Vis søndag først"; +Calendar._TT["CLOSE"] = "Lukk"; +Calendar._TT["TODAY"] = "Idag"; +Calendar._TT["TIME_PART"] = "(Shift-)Klikk eller dra for Ã¥ endre verdi"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d.%m.%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "uke"; \ No newline at end of file diff --git a/htdocs/js/jscalendar/lang/calendar-pl-utf8.js b/htdocs/js/jscalendar/lang/calendar-pl-utf8.js new file mode 100644 index 0000000..6b8ca67 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-pl-utf8.js @@ -0,0 +1,93 @@ +// ** I18N + +// Calendar PL language +// Author: Dariusz Pietrzak, +// Author: Janusz Piwowarski, +// Encoding: utf-8 +// Distributed under the same terms as the calendar itself. + +Calendar._DN = new Array +("Niedziela", + "PoniedziaÅ‚ek", + "Wtorek", + "Åšroda", + "Czwartek", + "PiÄ…tek", + "Sobota", + "Niedziela"); +Calendar._SDN = new Array +("Nie", + "Pn", + "Wt", + "Åšr", + "Cz", + "Pt", + "So", + "Nie"); +Calendar._MN = new Array +("StyczeÅ„", + "Luty", + "Marzec", + "KwiecieÅ„", + "Maj", + "Czerwiec", + "Lipiec", + "SierpieÅ„", + "WrzesieÅ„", + "Październik", + "Listopad", + "GrudzieÅ„"); +Calendar._SMN = new Array +("Sty", + "Lut", + "Mar", + "Kwi", + "Maj", + "Cze", + "Lip", + "Sie", + "Wrz", + "Paź", + "Lis", + "Gru"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "O kalendarzu"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Aby pobrać najnowszÄ… wersjÄ™, odwiedź: http://www.dynarch.com/projects/calendar/\n" + +"DostÄ™pny na licencji GNU LGPL. Zobacz szczegóły na http://gnu.org/licenses/lgpl.html." + +"\n\n" + +"Wybór daty:\n" + +"- Użyj przycisków \xab, \xbb by wybrać rok\n" + +"- Użyj przycisków " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " by wybrać miesiÄ…c\n" + +"- Przytrzymaj klawisz myszy nad jednym z powyższych przycisków dla szybszego wyboru."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Wybór czasu:\n" + +"- Kliknij na jednym z pól czasu by zwiÄ™kszyć jego wartość\n" + +"- lub kliknij trzymajÄ…c Shift by zmiejszyć jego wartość\n" + +"- lub kliknij i przeciÄ…gnij dla szybszego wyboru."; + +//Calendar._TT["TOGGLE"] = "ZmieÅ„ pierwszy dzieÅ„ tygodnia"; +Calendar._TT["PREV_YEAR"] = "Poprzedni rok (przytrzymaj dla menu)"; +Calendar._TT["PREV_MONTH"] = "Poprzedni miesiÄ…c (przytrzymaj dla menu)"; +Calendar._TT["GO_TODAY"] = "Idź do dzisiaj"; +Calendar._TT["NEXT_MONTH"] = "NastÄ™pny miesiÄ…c (przytrzymaj dla menu)"; +Calendar._TT["NEXT_YEAR"] = "NastÄ™pny rok (przytrzymaj dla menu)"; +Calendar._TT["SEL_DATE"] = "Wybierz datÄ™"; +Calendar._TT["DRAG_TO_MOVE"] = "PrzeciÄ…gnij by przesunąć"; +Calendar._TT["PART_TODAY"] = " (dzisiaj)"; +Calendar._TT["MON_FIRST"] = "WyÅ›wietl poniedziaÅ‚ek jako pierwszy"; +Calendar._TT["SUN_FIRST"] = "WyÅ›wietl niedzielÄ™ jako pierwszÄ…"; +Calendar._TT["CLOSE"] = "Zamknij"; +Calendar._TT["TODAY"] = "Dzisiaj"; +Calendar._TT["TIME_PART"] = "(Shift-)Kliknij lub przeciÄ…gnij by zmienić wartość"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%e %B, %A"; + +Calendar._TT["WK"] = "ty"; diff --git a/htdocs/js/jscalendar/lang/calendar-pl.js b/htdocs/js/jscalendar/lang/calendar-pl.js new file mode 100644 index 0000000..76e0551 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-pl.js @@ -0,0 +1,56 @@ +// ** I18N +// Calendar PL language +// Author: Artur Filipiak, +// January, 2004 +// Encoding: UTF-8 +Calendar._DN = new Array +("Niedziela", "PoniedziaÅ‚ek", "Wtorek", "Åšroda", "Czwartek", "PiÄ…tek", "Sobota", "Niedziela"); + +Calendar._SDN = new Array +("N", "Pn", "Wt", "Åšr", "Cz", "Pt", "So", "N"); + +Calendar._MN = new Array +("StyczeÅ„", "Luty", "Marzec", "KwiecieÅ„", "Maj", "Czerwiec", "Lipiec", "SierpieÅ„", "WrzesieÅ„", "Październik", "Listopad", "GrudzieÅ„"); + +Calendar._SMN = new Array +("Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "O kalendarzu"; + +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" + +"Wybór daty:\n" + +"- aby wybrać rok użyj przycisków \xab, \xbb\n" + +"- aby wybrać miesiÄ…c użyj przycisków " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + "\n" + +"- aby przyspieszyć wybór przytrzymaj wciÅ›niÄ™ty przycisk myszy nad ww. przyciskami."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Wybór czasu:\n" + +"- aby zwiÄ™kszyć wartość kliknij na dowolnym elemencie selekcji czasu\n" + +"- aby zmniejszyć wartość użyj dodatkowo klawisza Shift\n" + +"- możesz również poruszać myszkÄ™ w lewo i prawo wraz z wciÅ›niÄ™tym lewym klawiszem."; + +Calendar._TT["PREV_YEAR"] = "Poprz. rok (przytrzymaj dla menu)"; +Calendar._TT["PREV_MONTH"] = "Poprz. miesiÄ…c (przytrzymaj dla menu)"; +Calendar._TT["GO_TODAY"] = "Pokaż dziÅ›"; +Calendar._TT["NEXT_MONTH"] = "Nast. miesiÄ…c (przytrzymaj dla menu)"; +Calendar._TT["NEXT_YEAR"] = "Nast. rok (przytrzymaj dla menu)"; +Calendar._TT["SEL_DATE"] = "Wybierz datÄ™"; +Calendar._TT["DRAG_TO_MOVE"] = "PrzesuÅ„ okienko"; +Calendar._TT["PART_TODAY"] = " (dziÅ›)"; +Calendar._TT["MON_FIRST"] = "Pokaż PoniedziaÅ‚ek jako pierwszy"; +Calendar._TT["SUN_FIRST"] = "Pokaż NiedzielÄ™ jako pierwszÄ…"; +Calendar._TT["CLOSE"] = "Zamknij"; +Calendar._TT["TODAY"] = "DziÅ›"; +Calendar._TT["TIME_PART"] = "(Shift-)klik | drag, aby zmienić wartość"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y.%m.%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "wk"; \ No newline at end of file diff --git a/htdocs/js/jscalendar/lang/calendar-pt.js b/htdocs/js/jscalendar/lang/calendar-pt.js new file mode 100644 index 0000000..deee8a1 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-pt.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar pt_BR language +// Author: Adalberto Machado, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Domingo", + "Segunda", + "Terca", + "Quarta", + "Quinta", + "Sexta", + "Sabado", + "Domingo"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("Dom", + "Seg", + "Ter", + "Qua", + "Qui", + "Sex", + "Sab", + "Dom"); + +// full month names +Calendar._MN = new Array +("Janeiro", + "Fevereiro", + "Marco", + "Abril", + "Maio", + "Junho", + "Julho", + "Agosto", + "Setembro", + "Outubro", + "Novembro", + "Dezembro"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Fev", + "Mar", + "Abr", + "Mai", + "Jun", + "Jul", + "Ago", + "Set", + "Out", + "Nov", + "Dez"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Sobre o calendario"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Ultima versao visite: http://www.dynarch.com/projects/calendar/\n" + +"Distribuido sobre GNU LGPL. Veja http://gnu.org/licenses/lgpl.html para detalhes." + +"\n\n" + +"Selecao de data:\n" + +"- Use os botoes \xab, \xbb para selecionar o ano\n" + +"- Use os botoes " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para selecionar o mes\n" + +"- Segure o botao do mouse em qualquer um desses botoes para selecao rapida."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Selecao de hora:\n" + +"- Clique em qualquer parte da hora para incrementar\n" + +"- ou Shift-click para decrementar\n" + +"- ou clique e segure para selecao rapida."; + +Calendar._TT["PREV_YEAR"] = "Ant. ano (segure para menu)"; +Calendar._TT["PREV_MONTH"] = "Ant. mes (segure para menu)"; +Calendar._TT["GO_TODAY"] = "Hoje"; +Calendar._TT["NEXT_MONTH"] = "Prox. mes (segure para menu)"; +Calendar._TT["NEXT_YEAR"] = "Prox. ano (segure para menu)"; +Calendar._TT["SEL_DATE"] = "Selecione a data"; +Calendar._TT["DRAG_TO_MOVE"] = "Arraste para mover"; +Calendar._TT["PART_TODAY"] = " (hoje)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Mostre %s primeiro"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Fechar"; +Calendar._TT["TODAY"] = "Hoje"; +Calendar._TT["TIME_PART"] = "(Shift-)Click ou arraste para mudar valor"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %e %b"; + +Calendar._TT["WK"] = "sm"; +Calendar._TT["TIME"] = "Hora:"; diff --git a/htdocs/js/jscalendar/lang/calendar-ro.js b/htdocs/js/jscalendar/lang/calendar-ro.js new file mode 100644 index 0000000..116e358 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-ro.js @@ -0,0 +1,66 @@ +// ** I18N +Calendar._DN = new Array +("Duminică", + "Luni", + "MarÅ£i", + "Miercuri", + "Joi", + "Vineri", + "Sâmbătă", + "Duminică"); +Calendar._SDN_len = 2; +Calendar._MN = new Array +("Ianuarie", + "Februarie", + "Martie", + "Aprilie", + "Mai", + "Iunie", + "Iulie", + "August", + "Septembrie", + "Octombrie", + "Noiembrie", + "Decembrie"); + +// tooltips +Calendar._TT = {}; + +Calendar._TT["INFO"] = "Despre calendar"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Pentru ultima versiune vizitaÅ£i: http://www.dynarch.com/projects/calendar/\n" + +"Distribuit sub GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + +"\n\n" + +"SelecÅ£ia datei:\n" + +"- FolosiÅ£i butoanele \xab, \xbb pentru a selecta anul\n" + +"- FolosiÅ£i butoanele " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pentru a selecta luna\n" + +"- TineÅ£i butonul mouse-ului apăsat pentru selecÅ£ie mai rapidă."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"SelecÅ£ia orei:\n" + +"- Click pe ora sau minut pentru a mări valoarea cu 1\n" + +"- Sau Shift-Click pentru a micÅŸora valoarea cu 1\n" + +"- Sau Click ÅŸi drag pentru a selecta mai repede."; + +Calendar._TT["PREV_YEAR"] = "Anul precedent (lung pt menu)"; +Calendar._TT["PREV_MONTH"] = "Luna precedentă (lung pt menu)"; +Calendar._TT["GO_TODAY"] = "Data de azi"; +Calendar._TT["NEXT_MONTH"] = "Luna următoare (lung pt menu)"; +Calendar._TT["NEXT_YEAR"] = "Anul următor (lung pt menu)"; +Calendar._TT["SEL_DATE"] = "Selectează data"; +Calendar._TT["DRAG_TO_MOVE"] = "Trage pentru a miÅŸca"; +Calendar._TT["PART_TODAY"] = " (astăzi)"; +Calendar._TT["DAY_FIRST"] = "AfiÅŸează %s prima zi"; +Calendar._TT["WEEKEND"] = "0,6"; +Calendar._TT["CLOSE"] = "ÃŽnchide"; +Calendar._TT["TODAY"] = "Astăzi"; +Calendar._TT["TIME_PART"] = "(Shift-)Click sau drag pentru a selecta"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%d-%m-%Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %d %B"; + +Calendar._TT["WK"] = "spt"; +Calendar._TT["TIME"] = "Ora:"; diff --git a/htdocs/js/jscalendar/lang/calendar-ru.js b/htdocs/js/jscalendar/lang/calendar-ru.js new file mode 100644 index 0000000..9f75a6a --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-ru.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar RU language +// Translation: Sly Golovanov, http://golovanov.net, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("воÑкреÑенье", + "понедельник", + "вторник", + "Ñреда", + "четверг", + "пÑтница", + "Ñуббота", + "воÑкреÑенье"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("вÑк", + "пон", + "втр", + "Ñрд", + "чет", + "пÑÑ‚", + "Ñуб", + "вÑк"); + +// full month names +Calendar._MN = new Array +("Ñнварь", + "февраль", + "март", + "апрель", + "май", + "июнь", + "июль", + "авгуÑÑ‚", + "ÑентÑбрь", + "октÑбрь", + "ноÑбрь", + "декабрь"); + +// short month names +Calendar._SMN = new Array +("Ñнв", + "фев", + "мар", + "апр", + "май", + "июн", + "июл", + "авг", + "Ñен", + "окт", + "ноÑ", + "дек"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "О календаре..."; + +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" + +"Как выбрать дату:\n" + +"- При помощи кнопок \xab, \xbb можно выбрать год\n" + +"- При помощи кнопок " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " можно выбрать меÑÑц\n" + +"- Подержите Ñти кнопки нажатыми, чтобы поÑвилоÑÑŒ меню быÑтрого выбора."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Как выбрать времÑ:\n" + +"- При клике на чаÑах или минутах они увеличиваютÑÑ\n" + +"- при клике Ñ Ð½Ð°Ð¶Ð°Ñ‚Ð¾Ð¹ клавишей Shift они уменьшаютÑÑ\n" + +"- еÑли нажать и двигать мышкой влево/вправо, они будут менÑÑ‚ÑŒÑÑ Ð±Ñ‹Ñтрее."; + +Calendar._TT["PREV_YEAR"] = "Ðа год назад (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)"; +Calendar._TT["PREV_MONTH"] = "Ðа меÑÑц назад (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)"; +Calendar._TT["GO_TODAY"] = "СегоднÑ"; +Calendar._TT["NEXT_MONTH"] = "Ðа меÑÑц вперед (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)"; +Calendar._TT["NEXT_YEAR"] = "Ðа год вперед (удерживать Ð´Ð»Ñ Ð¼ÐµÐ½ÑŽ)"; +Calendar._TT["SEL_DATE"] = "Выберите дату"; +Calendar._TT["DRAG_TO_MOVE"] = "ПеретаÑкивайте мышкой"; +Calendar._TT["PART_TODAY"] = " (ÑегоднÑ)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Первый день недели будет %s"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Закрыть"; +Calendar._TT["TODAY"] = "СегоднÑ"; +Calendar._TT["TIME_PART"] = "(Shift-)клик или нажать и двигать"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%e %b, %a"; + +Calendar._TT["WK"] = "нед"; +Calendar._TT["TIME"] = "ВремÑ:"; diff --git a/htdocs/js/jscalendar/lang/calendar-ru_win_.js b/htdocs/js/jscalendar/lang/calendar-ru_win_.js new file mode 100644 index 0000000..de455af --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-ru_win_.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar RU language +// Translation: Sly Golovanov, http://golovanov.net, +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("âîñêðåñåíüå", + "ïîíåäåëüíèê", + "âòîðíèê", + "ñðåäà", + "÷åòâåðã", + "ïÿòíèöà", + "ñóááîòà", + "âîñêðåñåíüå"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("âñê", + "ïîí", + "âòð", + "ñðä", + "÷åò", + "ïÿò", + "ñóá", + "âñê"); + +// full month names +Calendar._MN = new Array +("ÿíâàðü", + "ôåâðàëü", + "ìàðò", + "àïðåëü", + "ìàé", + "èþíü", + "èþëü", + "àâãóñò", + "ñåíòÿáðü", + "îêòÿáðü", + "íîÿáðü", + "äåêàáðü"); + +// short month names +Calendar._SMN = new Array +("ÿíâ", + "ôåâ", + "ìàð", + "àïð", + "ìàé", + "èþí", + "èþë", + "àâã", + "ñåí", + "îêò", + "íîÿ", + "äåê"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Î êàëåíäàðå..."; + +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" + +"Êàê âûáðàòü äàòó:\n" + +"- Ïðè ïîìîùè êíîïîê \xab, \xbb ìîæíî âûáðàòü ãîä\n" + +"- Ïðè ïîìîùè êíîïîê " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " ìîæíî âûáðàòü ìåñÿö\n" + +"- Ïîäåðæèòå ýòè êíîïêè íàæàòûìè, ÷òîáû ïîÿâèëîñü ìåíþ áûñòðîãî âûáîðà."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Êàê âûáðàòü âðåìÿ:\n" + +"- Ïðè êëèêå íà ÷àñàõ èëè ìèíóòàõ îíè óâåëè÷èâàþòñÿ\n" + +"- ïðè êëèêå ñ íàæàòîé êëàâèøåé Shift îíè óìåíüøàþòñÿ\n" + +"- åñëè íàæàòü è äâèãàòü ìûøêîé âëåâî/âïðàâî, îíè áóäóò ìåíÿòüñÿ áûñòðåå."; + +Calendar._TT["PREV_YEAR"] = "Íà ãîä íàçàä (óäåðæèâàòü äëÿ ìåíþ)"; +Calendar._TT["PREV_MONTH"] = "Íà ìåñÿö íàçàä (óäåðæèâàòü äëÿ ìåíþ)"; +Calendar._TT["GO_TODAY"] = "Ñåãîäíÿ"; +Calendar._TT["NEXT_MONTH"] = "Íà ìåñÿö âïåðåä (óäåðæèâàòü äëÿ ìåíþ)"; +Calendar._TT["NEXT_YEAR"] = "Íà ãîä âïåðåä (óäåðæèâàòü äëÿ ìåíþ)"; +Calendar._TT["SEL_DATE"] = "Âûáåðèòå äàòó"; +Calendar._TT["DRAG_TO_MOVE"] = "Ïåðåòàñêèâàéòå ìûøêîé"; +Calendar._TT["PART_TODAY"] = " (ñåãîäíÿ)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Ïåðâûé äåíü íåäåëè áóäåò %s"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Çàêðûòü"; +Calendar._TT["TODAY"] = "Ñåãîäíÿ"; +Calendar._TT["TIME_PART"] = "(Shift-)êëèê èëè íàæàòü è äâèãàòü"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%e %b, %a"; + +Calendar._TT["WK"] = "íåä"; +Calendar._TT["TIME"] = "Âðåìÿ:"; diff --git a/htdocs/js/jscalendar/lang/calendar-si.js b/htdocs/js/jscalendar/lang/calendar-si.js new file mode 100644 index 0000000..cb3dfb9 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-si.js @@ -0,0 +1,94 @@ +/* Slovenian language file for the DHTML Calendar version 0.9.2 +* Author David Milost , January 2004. +* Feel free to use this script under the terms of the GNU Lesser General +* Public License, as long as you do not remove or alter this notice. +*/ + // full day names +Calendar._DN = new Array +("Nedelja", + "Ponedeljek", + "Torek", + "Sreda", + "ÄŒetrtek", + "Petek", + "Sobota", + "Nedelja"); + // short day names + Calendar._SDN = new Array +("Ned", + "Pon", + "Tor", + "Sre", + "ÄŒet", + "Pet", + "Sob", + "Ned"); +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "Mar", + "Apr", + "Maj", + "Jun", + "Jul", + "Avg", + "Sep", + "Okt", + "Nov", + "Dec"); + // full month names +Calendar._MN = new Array +("Januar", + "Februar", + "Marec", + "April", + "Maj", + "Junij", + "Julij", + "Avgust", + "September", + "Oktober", + "November", + "December"); + +// tooltips +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "O koledarju"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Za zadnjo verzijo pojdine na naslov: http://www.dynarch.com/projects/calendar/\n" + +"Distribuirano pod GNU LGPL. Poglejte http://gnu.org/licenses/lgpl.html za podrobnosti." + +"\n\n" + +"Izbor datuma:\n" + +"- Uporabite \xab, \xbb gumbe za izbor leta\n" + +"- Uporabite " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " gumbe za izbor meseca\n" + +"- Zadržite klik na kateremkoli od zgornjih gumbov za hiter izbor."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Izbor ćasa:\n" + +"- Kliknite na katerikoli del ćasa za poveć. le-tega\n" + +"- ali Shift-click za zmanj. le-tega\n" + +"- ali kliknite in povlecite za hiter izbor."; + +Calendar._TT["TOGGLE"] = "Spremeni dan s katerim se prićne teden"; +Calendar._TT["PREV_YEAR"] = "Predhodnje leto (dolg klik za meni)"; +Calendar._TT["PREV_MONTH"] = "Predhodnji mesec (dolg klik za meni)"; +Calendar._TT["GO_TODAY"] = "Pojdi na tekoći dan"; +Calendar._TT["NEXT_MONTH"] = "Naslednji mesec (dolg klik za meni)"; +Calendar._TT["NEXT_YEAR"] = "Naslednje leto (dolg klik za meni)"; +Calendar._TT["SEL_DATE"] = "Izberite datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Pritisni in povleci za spremembo pozicije"; +Calendar._TT["PART_TODAY"] = " (danes)"; +Calendar._TT["MON_FIRST"] = "Prikaži ponedeljek kot prvi dan"; +Calendar._TT["SUN_FIRST"] = "Prikaži nedeljo kot prvi dan"; +Calendar._TT["CLOSE"] = "Zapri"; +Calendar._TT["TODAY"] = "Danes"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e"; + +Calendar._TT["WK"] = "Ted"; \ No newline at end of file diff --git a/htdocs/js/jscalendar/lang/calendar-sk.js b/htdocs/js/jscalendar/lang/calendar-sk.js new file mode 100644 index 0000000..4fe6a3c --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-sk.js @@ -0,0 +1,99 @@ +// ** I18N + +// Calendar SK language +// Author: Peter Valach (pvalach@gmx.net) +// Encoding: utf-8 +// Last update: 2003/10/29 +// Distributed under the same terms as the calendar itself. + +// full day names +Calendar._DN = new Array +("NedeÄľa", + "Pondelok", + "Utorok", + "Streda", + "Ĺ tvrtok", + "Piatok", + "Sobota", + "NedeÄľa"); + +// short day names +Calendar._SDN = new Array +("Ned", + "Pon", + "Uto", + "Str", + "Ĺ tv", + "Pia", + "Sob", + "Ned"); + +// full month names +Calendar._MN = new Array +("Január", + "Február", + "Marec", + "AprĂ­l", + "Máj", + "JÄ‚ÅŸn", + "JÄ‚ÅŸl", + "August", + "September", + "OktÄ‚Å‚ber", + "November", + "December"); + +// short month names +Calendar._SMN = new Array +("Jan", + "Feb", + "Mar", + "Apr", + "Máj", + "JÄ‚ÅŸn", + "JÄ‚ÅŸl", + "Aug", + "Sep", + "Okt", + "Nov", + "Dec"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "O kalendári"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + +"PoslednÄ‚ÅŸ verziu nájdete na: http://www.dynarch.com/projects/calendar/\n" + +"DistribuovanĂ© pod GNU LGPL. ViÄŹ http://gnu.org/licenses/lgpl.html pre detaily." + +"\n\n" + +"VÄ‚Ëber dátumu:\n" + +"- PouĹľite tlaÄŤidlá \xab, \xbb pre vÄ‚Ëber roku\n" + +"- PouĹľite tlaÄŤidlá " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " pre vÄ‚Ëber mesiaca\n" + +"- Ak ktorĂ©koÄľvek z tÄ‚Ëchto tlaÄŤidiel podržíte dlhšie, zobrazĂ­ sa rÄ‚Ëchly vÄ‚Ëber."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"VÄ‚Ëber ÄŤasu:\n" + +"- Kliknutie na niektorÄ‚ÅŸ poloĹľku ÄŤasu ju zvÄ‚Ëši\n" + +"- Shift-klik ju znĂ­Ĺľi\n" + +"- Ak podržíte tlaÄŤĂ­tko stlaÄŤenĂ©, posÄ‚ÅŸvanĂ­m menĂ­te hodnotu."; + +Calendar._TT["PREV_YEAR"] = "PredošlÄ‚Ë rok (podrĹľte pre menu)"; +Calendar._TT["PREV_MONTH"] = "PredošlÄ‚Ë mesiac (podrĹľte pre menu)"; +Calendar._TT["GO_TODAY"] = "PrejsĹĄ na dnešok"; +Calendar._TT["NEXT_MONTH"] = "Nasl. mesiac (podrĹľte pre menu)"; +Calendar._TT["NEXT_YEAR"] = "Nasl. rok (podrĹľte pre menu)"; +Calendar._TT["SEL_DATE"] = "ZvoÄľte dátum"; +Calendar._TT["DRAG_TO_MOVE"] = "PodrĹľanĂ­m tlaÄŤĂ­tka zmenĂ­te polohu"; +Calendar._TT["PART_TODAY"] = " (dnes)"; +Calendar._TT["MON_FIRST"] = "ZobraziĹĄ pondelok ako prvÄ‚Ë"; +Calendar._TT["SUN_FIRST"] = "ZobraziĹĄ nedeÄľu ako prvÄ‚ÅŸ"; +Calendar._TT["CLOSE"] = "ZavrieĹĄ"; +Calendar._TT["TODAY"] = "Dnes"; +Calendar._TT["TIME_PART"] = "(Shift-)klik/ĹĄahanie zmenĂ­ hodnotu"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "$d. %m. %Y"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %e. %b"; + +Calendar._TT["WK"] = "tÄ‚ËĹľ"; diff --git a/htdocs/js/jscalendar/lang/calendar-sp.js b/htdocs/js/jscalendar/lang/calendar-sp.js new file mode 100644 index 0000000..239d1b3 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-sp.js @@ -0,0 +1,110 @@ +// ** I18N + +// Calendar SP language +// Author: Rafael Velasco +// Encoding: any +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("Domingo", + "Lunes", + "Martes", + "Miercoles", + "Jueves", + "Viernes", + "Sabado", + "Domingo"); + +Calendar._SDN = new Array +("Dom", + "Lun", + "Mar", + "Mie", + "Jue", + "Vie", + "Sab", + "Dom"); + +// full month names +Calendar._MN = new Array +("Enero", + "Febrero", + "Marzo", + "Abril", + "Mayo", + "Junio", + "Julio", + "Agosto", + "Septiembre", + "Octubre", + "Noviembre", + "Diciembre"); + +// short month names +Calendar._SMN = new Array +("Ene", + "Feb", + "Mar", + "Abr", + "May", + "Jun", + "Jul", + "Ago", + "Sep", + "Oct", + "Nov", + "Dic"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Información del Calendario"; + +Calendar._TT["ABOUT"] = +"DHTML Date/Time Selector\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"Nuevas versiones en: http://www.dynarch.com/projects/calendar/\n" + +"Distribuida bajo licencia GNU LGPL. Para detalles vea http://gnu.org/licenses/lgpl.html ." + +"\n\n" + +"Selección de Fechas:\n" + +"- Use \xab, \xbb para seleccionar el año\n" + +"- Use " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " para seleccionar el mes\n" + +"- Mantenga presionado el botón del ratón en cualquiera de las opciones superiores para un acceso rapido ."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Selección del Reloj:\n" + +"- Seleccione la hora para cambiar el reloj\n" + +"- o presione Shift-click para disminuirlo\n" + +"- o presione click y arrastre del ratón para una selección rapida."; + +Calendar._TT["PREV_YEAR"] = "Año anterior (Presione para menu)"; +Calendar._TT["PREV_MONTH"] = "Mes Anterior (Presione para menu)"; +Calendar._TT["GO_TODAY"] = "Ir a Hoy"; +Calendar._TT["NEXT_MONTH"] = "Mes Siguiente (Presione para menu)"; +Calendar._TT["NEXT_YEAR"] = "Año Siguiente (Presione para menu)"; +Calendar._TT["SEL_DATE"] = "Seleccione fecha"; +Calendar._TT["DRAG_TO_MOVE"] = "Arrastre y mueva"; +Calendar._TT["PART_TODAY"] = " (Hoy)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "Mostrar %s primero"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "Cerrar"; +Calendar._TT["TODAY"] = "Hoy"; +Calendar._TT["TIME_PART"] = "(Shift-)Click o arrastra para cambar el valor"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%dd-%mm-%yy"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %e de %B de %Y"; + +Calendar._TT["WK"] = "Sm"; +Calendar._TT["TIME"] = "Hora:"; diff --git a/htdocs/js/jscalendar/lang/calendar-sv.js b/htdocs/js/jscalendar/lang/calendar-sv.js new file mode 100644 index 0000000..db1f4b8 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-sv.js @@ -0,0 +1,93 @@ +// ** I18N + +// Calendar SV language (Swedish, svenska) +// Author: Mihai Bazon, +// Translation team: +// Translator: Leonard Norrgård +// Last translator: Leonard Norrgård +// Encoding: iso-latin-1 +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("söndag", + "måndag", + "tisdag", + "onsdag", + "torsdag", + "fredag", + "lördag", + "söndag"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. +Calendar._SDN_len = 2; +Calendar._SMN_len = 3; + +// full month names +Calendar._MN = new Array +("januari", + "februari", + "mars", + "april", + "maj", + "juni", + "juli", + "augusti", + "september", + "oktober", + "november", + "december"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "Om kalendern"; + +Calendar._TT["ABOUT"] = +"DHTML Datum/tid-väljare\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"För senaste version gå till: http://www.dynarch.com/projects/calendar/\n" + +"Distribueras under GNU LGPL. Se http://gnu.org/licenses/lgpl.html för detaljer." + +"\n\n" + +"Val av datum:\n" + +"- Använd knapparna \xab, \xbb för att välja år\n" + +"- Använd knapparna " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " för att välja månad\n" + +"- Håll musknappen nedtryckt på någon av ovanstående knappar för snabbare val."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Val av tid:\n" + +"- Klicka på en del av tiden för att öka den delen\n" + +"- eller skift-klicka för att minska den\n" + +"- eller klicka och drag för snabbare val."; + +Calendar._TT["PREV_YEAR"] = "Föregående år (håll för menu)"; +Calendar._TT["PREV_MONTH"] = "Föregående månad (håll för menu)"; +Calendar._TT["GO_TODAY"] = "Gå till dagens datum"; +Calendar._TT["NEXT_MONTH"] = "Följande månad (håll för menu)"; +Calendar._TT["NEXT_YEAR"] = "Följande år (håll för menu)"; +Calendar._TT["SEL_DATE"] = "Välj datum"; +Calendar._TT["DRAG_TO_MOVE"] = "Drag för att flytta"; +Calendar._TT["PART_TODAY"] = " (idag)"; +Calendar._TT["MON_FIRST"] = "Visa måndag först"; +Calendar._TT["SUN_FIRST"] = "Visa söndag först"; +Calendar._TT["CLOSE"] = "Stäng"; +Calendar._TT["TODAY"] = "Idag"; +Calendar._TT["TIME_PART"] = "(Skift-)klicka eller drag för att ändra tid"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%A %d %b %Y"; + +Calendar._TT["WK"] = "vecka"; diff --git a/htdocs/js/jscalendar/lang/calendar-tr.js b/htdocs/js/jscalendar/lang/calendar-tr.js new file mode 100644 index 0000000..2164687 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-tr.js @@ -0,0 +1,58 @@ +////////////////////////////////////////////////////////////////////////////////////////////// +// Turkish Translation by Nuri AKMAN +// Location: Ankara/TURKEY +// e-mail : nuriakman@hotmail.com +// Date : April, 9 2003 +// +// Note: if Turkish Characters does not shown on you screen +// please include falowing line your html code: +// +// +// +////////////////////////////////////////////////////////////////////////////////////////////// + +// ** I18N +Calendar._DN = new Array +("Pazar", + "Pazartesi", + "Salý", + "Çarþamba", + "Perþembe", + "Cuma", + "Cumartesi", + "Pazar"); +Calendar._MN = new Array +("Ocak", + "Þubat", + "Mart", + "Nisan", + "Mayýs", + "Haziran", + "Temmuz", + "Aðustos", + "Eylül", + "Ekim", + "Kasým", + "Aralýk"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["TOGGLE"] = "Haftanýn ilk gününü kaydýr"; +Calendar._TT["PREV_YEAR"] = "Önceki Yýl (Menü için basýlý tutunuz)"; +Calendar._TT["PREV_MONTH"] = "Önceki Ay (Menü için basýlý tutunuz)"; +Calendar._TT["GO_TODAY"] = "Bugün'e git"; +Calendar._TT["NEXT_MONTH"] = "Sonraki Ay (Menü için basýlý tutunuz)"; +Calendar._TT["NEXT_YEAR"] = "Sonraki Yýl (Menü için basýlý tutunuz)"; +Calendar._TT["SEL_DATE"] = "Tarih seçiniz"; +Calendar._TT["DRAG_TO_MOVE"] = "Taþýmak için sürükleyiniz"; +Calendar._TT["PART_TODAY"] = " (bugün)"; +Calendar._TT["MON_FIRST"] = "Takvim Pazartesi gününden baþlasýn"; +Calendar._TT["SUN_FIRST"] = "Takvim Pazar gününden baþlasýn"; +Calendar._TT["CLOSE"] = "Kapat"; +Calendar._TT["TODAY"] = "Bugün"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "dd-mm-y"; +Calendar._TT["TT_DATE_FORMAT"] = "d MM y, DD"; + +Calendar._TT["WK"] = "Hafta"; diff --git a/htdocs/js/jscalendar/lang/calendar-zh.js b/htdocs/js/jscalendar/lang/calendar-zh.js new file mode 100644 index 0000000..4a0feb6 --- /dev/null +++ b/htdocs/js/jscalendar/lang/calendar-zh.js @@ -0,0 +1,119 @@ +// ** I18N + +// Calendar ZH language +// Author: muziq, +// Encoding: GB2312 or GBK +// Distributed under the same terms as the calendar itself. + +// full day names +Calendar._DN = new Array +("ÐÇÆÚÈÕ", + "ÐÇÆÚÒ»", + "ÐÇÆÚ¶þ", + "ÐÇÆÚÈý", + "ÐÇÆÚËÄ", + "ÐÇÆÚÎå", + "ÐÇÆÚÁù", + "ÐÇÆÚÈÕ"); + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("ÈÕ", + "Ò»", + "¶þ", + "Èý", + "ËÄ", + "Îå", + "Áù", + "ÈÕ"); + +// full month names +Calendar._MN = new Array +("Ò»ÔÂ", + "¶þÔÂ", + "ÈýÔÂ", + "ËÄÔÂ", + "ÎåÔÂ", + "ÁùÔÂ", + "ÆßÔÂ", + "°ËÔÂ", + "¾ÅÔÂ", + "Ê®ÔÂ", + "ʮһÔÂ", + "Ê®¶þÔÂ"); + +// short month names +Calendar._SMN = new Array +("Ò»ÔÂ", + "¶þÔÂ", + "ÈýÔÂ", + "ËÄÔÂ", + "ÎåÔÂ", + "ÁùÔÂ", + "ÆßÔÂ", + "°ËÔÂ", + "¾ÅÔÂ", + "Ê®ÔÂ", + "ʮһÔÂ", + "Ê®¶þÔÂ"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "°ïÖú"; + +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" + +"Ñ¡ÔñÈÕÆÚ:\n" + +"- µã»÷ \xab, \xbb °´Å¥Ñ¡ÔñÄê·Ý\n" + +"- µã»÷ " + String.fromCharCode(0x2039) + ", " + String.fromCharCode(0x203a) + " °´Å¥Ñ¡ÔñÔ·Ý\n" + +"- ³¤°´ÒÔÉÏ°´Å¥¿É´Ó²Ëµ¥ÖпìËÙÑ¡ÔñÄê·Ý»òÔ·Ý"; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"Ñ¡Ôñʱ¼ä:\n" + +"- µã»÷Сʱ»ò·ÖÖÓ¿Éʹ¸ÄÊýÖµ¼ÓÒ»\n" + +"- °´×¡Shift¼üµã»÷Сʱ»ò·ÖÖÓ¿Éʹ¸ÄÊýÖµ¼õÒ»\n" + +"- µã»÷Í϶¯Êó±ê¿É½øÐпìËÙÑ¡Ôñ"; + +Calendar._TT["PREV_YEAR"] = "ÉÏÒ»Äê (°´×¡³ö²Ëµ¥)"; +Calendar._TT["PREV_MONTH"] = "ÉÏÒ»Ô (°´×¡³ö²Ëµ¥)"; +Calendar._TT["GO_TODAY"] = "תµ½½ñÈÕ"; +Calendar._TT["NEXT_MONTH"] = "ÏÂÒ»Ô (°´×¡³ö²Ëµ¥)"; +Calendar._TT["NEXT_YEAR"] = "ÏÂÒ»Äê (°´×¡³ö²Ëµ¥)"; +Calendar._TT["SEL_DATE"] = "Ñ¡ÔñÈÕÆÚ"; +Calendar._TT["DRAG_TO_MOVE"] = "Í϶¯"; +Calendar._TT["PART_TODAY"] = " (½ñÈÕ)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "×î×ó±ßÏÔʾ%s"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "¹Ø±Õ"; +Calendar._TT["TODAY"] = "½ñÈÕ"; +Calendar._TT["TIME_PART"] = "(Shift-)µã»÷Êó±ê»òÍ϶¯¸Ä±äÖµ"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%A, %b %eÈÕ"; + +Calendar._TT["WK"] = "ÖÜ"; +Calendar._TT["TIME"] = "ʱ¼ä:"; diff --git a/htdocs/js/jscalendar/lang/cn_utf8.js b/htdocs/js/jscalendar/lang/cn_utf8.js new file mode 100644 index 0000000..a0ef7c6 --- /dev/null +++ b/htdocs/js/jscalendar/lang/cn_utf8.js @@ -0,0 +1,123 @@ +// ** I18N + +// Calendar EN language +// Author: Mihai Bazon, +// Encoding: any +// Translator : Niko +// Distributed under the same terms as the calendar itself. + +// For translators: please use UTF-8 if possible. We strongly believe that +// Unicode is the answer to a real internationalized world. Also please +// include your contact information in the header, as can be seen above. + +// full day names +Calendar._DN = new Array +("\u5468\u65e5",//\u5468\u65e5 + "\u5468\u4e00",//\u5468\u4e00 + "\u5468\u4e8c",//\u5468\u4e8c + "\u5468\u4e09",//\u5468\u4e09 + "\u5468\u56db",//\u5468\u56db + "\u5468\u4e94",//\u5468\u4e94 + "\u5468\u516d",//\u5468\u516d + "\u5468\u65e5");//\u5468\u65e5 + +// 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 +// for exemplification on how one can customize the short day names, but if +// they are simply the first N letters of the full name you can simply say: +// +// Calendar._SDN_len = N; // short day name length +// Calendar._SMN_len = N; // short month name length +// +// If N = 3 then this is not needed either since we assume a value of 3 if not +// present, to be compatible with translation files that were written before +// this feature. + +// short day names +Calendar._SDN = new Array +("\u5468\u65e5", + "\u5468\u4e00", + "\u5468\u4e8c", + "\u5468\u4e09", + "\u5468\u56db", + "\u5468\u4e94", + "\u5468\u516d", + "\u5468\u65e5"); + +// full month names +Calendar._MN = new Array +("\u4e00\u6708", + "\u4e8c\u6708", + "\u4e09\u6708", + "\u56db\u6708", + "\u4e94\u6708", + "\u516d\u6708", + "\u4e03\u6708", + "\u516b\u6708", + "\u4e5d\u6708", + "\u5341\u6708", + "\u5341\u4e00\u6708", + "\u5341\u4e8c\u6708"); + +// short month names +Calendar._SMN = new Array +("\u4e00\u6708", + "\u4e8c\u6708", + "\u4e09\u6708", + "\u56db\u6708", + "\u4e94\u6708", + "\u516d\u6708", + "\u4e03\u6708", + "\u516b\u6708", + "\u4e5d\u6708", + "\u5341\u6708", + "\u5341\u4e00\u6708", + "\u5341\u4e8c\u6708"); + +// tooltips +Calendar._TT = {}; +Calendar._TT["INFO"] = "\u5173\u4e8e"; + +Calendar._TT["ABOUT"] = +" DHTML \u65e5\u8d77/\u65f6\u95f4\u9009\u62e9\u63a7\u4ef6\n" + +"(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + // don't translate this this ;-) +"For latest version visit: \u6700\u65b0\u7248\u672c\u8bf7\u767b\u9646http://www.dynarch.com/projects/calendar/\u5bdf\u770b\n" + +"\u9075\u5faaGNU LGPL. \u7ec6\u8282\u53c2\u9605 http://gnu.org/licenses/lgpl.html" + +"\n\n" + +"\u65e5\u671f\u9009\u62e9:\n" + +"- \u70b9\u51fb\xab(\xbb)\u6309\u94ae\u9009\u62e9\u4e0a(\u4e0b)\u4e00\u5e74\u5ea6.\n" + +"- \u70b9\u51fb" + String.fromCharCode(0x2039) + "(" + String.fromCharCode(0x203a) + ")\u6309\u94ae\u9009\u62e9\u4e0a(\u4e0b)\u4e2a\u6708\u4efd.\n" + +"- \u957f\u65f6\u95f4\u6309\u7740\u6309\u94ae\u5c06\u51fa\u73b0\u66f4\u591a\u9009\u62e9\u9879."; +Calendar._TT["ABOUT_TIME"] = "\n\n" + +"\u65f6\u95f4\u9009\u62e9:\n" + +"-\u5728\u65f6\u95f4\u90e8\u5206(\u5206\u6216\u8005\u79d2)\u4e0a\u5355\u51fb\u9f20\u6807\u5de6\u952e\u6765\u589e\u52a0\u5f53\u524d\u65f6\u95f4\u90e8\u5206(\u5206\u6216\u8005\u79d2)\n" + +"-\u5728\u65f6\u95f4\u90e8\u5206(\u5206\u6216\u8005\u79d2)\u4e0a\u6309\u4f4fShift\u952e\u540e\u5355\u51fb\u9f20\u6807\u5de6\u952e\u6765\u51cf\u5c11\u5f53\u524d\u65f6\u95f4\u90e8\u5206(\u5206\u6216\u8005\u79d2)."; + +Calendar._TT["PREV_YEAR"] = "\u4e0a\u4e00\u5e74"; +Calendar._TT["PREV_MONTH"] = "\u4e0a\u4e2a\u6708"; +Calendar._TT["GO_TODAY"] = "\u5230\u4eca\u5929"; +Calendar._TT["NEXT_MONTH"] = "\u4e0b\u4e2a\u6708"; +Calendar._TT["NEXT_YEAR"] = "\u4e0b\u4e00\u5e74"; +Calendar._TT["SEL_DATE"] = "\u9009\u62e9\u65e5\u671f"; +Calendar._TT["DRAG_TO_MOVE"] = "\u62d6\u52a8"; +Calendar._TT["PART_TODAY"] = " (\u4eca\u5929)"; + +// the following is to inform that "%s" is to be the first day of week +// %s will be replaced with the day name. +Calendar._TT["DAY_FIRST"] = "%s\u4e3a\u8fd9\u5468\u7684\u7b2c\u4e00\u5929"; + +// This may be locale-dependent. It specifies the week-end days, as an array +// of comma-separated numbers. The numbers are from 0 to 6: 0 means Sunday, 1 +// means Monday, etc. +Calendar._TT["WEEKEND"] = "0,6"; + +Calendar._TT["CLOSE"] = "\u5173\u95ed"; +Calendar._TT["TODAY"] = "\u4eca\u5929"; +Calendar._TT["TIME_PART"] = "(\u6309\u7740Shift\u952e)\u5355\u51fb\u6216\u62d6\u52a8\u6539\u53d8\u503c"; + +// date formats +Calendar._TT["DEF_DATE_FORMAT"] = "%Y-%m-%d"; +Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e\u65e5"; + +Calendar._TT["WK"] = "\u5468"; +Calendar._TT["TIME"] = "\u65f6\u95f4:"; diff --git a/htdocs/js/jscalendar/menuarrow.gif b/htdocs/js/jscalendar/menuarrow.gif new file mode 100644 index 0000000..ed2dee0 Binary files /dev/null and b/htdocs/js/jscalendar/menuarrow.gif differ diff --git a/htdocs/js/jscalendar/menuarrow2.gif b/htdocs/js/jscalendar/menuarrow2.gif new file mode 100644 index 0000000..40c0aad Binary files /dev/null and b/htdocs/js/jscalendar/menuarrow2.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/active-bg.gif b/htdocs/js/jscalendar/skins/aqua/active-bg.gif new file mode 100644 index 0000000..d608c54 Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/active-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/dark-bg.gif b/htdocs/js/jscalendar/skins/aqua/dark-bg.gif new file mode 100644 index 0000000..1dea48a Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/dark-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/hover-bg.gif b/htdocs/js/jscalendar/skins/aqua/hover-bg.gif new file mode 100644 index 0000000..fbf94fc Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/hover-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/menuarrow.gif b/htdocs/js/jscalendar/skins/aqua/menuarrow.gif new file mode 100644 index 0000000..40c0aad Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/menuarrow.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/normal-bg.gif b/htdocs/js/jscalendar/skins/aqua/normal-bg.gif new file mode 100644 index 0000000..bdb5068 Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/normal-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/rowhover-bg.gif b/htdocs/js/jscalendar/skins/aqua/rowhover-bg.gif new file mode 100644 index 0000000..7715342 Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/rowhover-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/status-bg.gif b/htdocs/js/jscalendar/skins/aqua/status-bg.gif new file mode 100644 index 0000000..857108c Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/status-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/theme.css b/htdocs/js/jscalendar/skins/aqua/theme.css new file mode 100644 index 0000000..18dd6cf --- /dev/null +++ b/htdocs/js/jscalendar/skins/aqua/theme.css @@ -0,0 +1,236 @@ +/* Distributed as part of The Coolest DHTML Calendar + Author: Mihai Bazon, www.bazon.net/mishoo + Copyright Dynarch.com 2005, www.dynarch.com +*/ + +/* The main calendar widget. DIV containing a table. */ + +div.calendar { position: relative; } + +.calendar, .calendar table { + border: 1px solid #bdb2bf; + font-size: 11px; + color: #000; + cursor: default; + background: url("normal-bg.gif"); + font-family: "trebuchet ms",verdana,tahoma,sans-serif; +} + +.calendar { + border-color: #797979; +} + +/* 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 */ + background: url("title-bg.gif") repeat-x 0 100%; color: #000; + font-weight: bold; +} + +.calendar .nav { + font-family: verdana,tahoma,sans-serif; +} + +.calendar .nav div { + background: transparent url("menuarrow.gif") no-repeat 100% 100%; +} + +.calendar thead tr { background: url("title-bg.gif") repeat-x 0 100%; color: #000; } + +.calendar thead .title { /* This holds the current "month, year" */ + font-weight: bold; /* Pressing it will take you to the current date */ + text-align: center; + padding: 2px; + background: url("title-bg.gif") repeat-x 0 100%; color: #000; +} + +.calendar thead .headrow { /* Row containing navigation buttons */ +} + +.calendar thead .name { /* Cells containing the day names */ + border-bottom: 1px solid #797979; + padding: 2px; + text-align: center; + color: #000; +} + +.calendar thead .weekend { /* How a weekend day name shows in header */ + color: #c44; +} + +.calendar thead .hilite { /* How do the buttons in header appear when hover */ + background: url("hover-bg.gif"); + border-bottom: 1px solid #797979; + padding: 2px 2px 1px 2px; +} + +.calendar thead .active { /* Active (pressed) buttons in header */ + background: url("active-bg.gif"); color: #fff; + padding: 3px 1px 0px 3px; + border-bottom: 1px solid #797979; +} + +.calendar thead .daynames { /* Row containing the day names */ + background: url("dark-bg.gif"); +} + +/* The body part -- contains all the days in month. */ + +.calendar tbody .day { /* Cells containing month days dates */ + font-family: verdana,tahoma,sans-serif; + width: 2em; + color: #000; + text-align: right; + padding: 2px 4px 2px 2px; +} +.calendar tbody .day.othermonth { + font-size: 80%; + color: #999; +} +.calendar tbody .day.othermonth.oweekend { + color: #f99; +} + +.calendar table .wn { + padding: 2px 3px 2px 2px; + border-right: 1px solid #797979; + background: url("dark-bg.gif"); +} + +.calendar tbody .rowhilite td, +.calendar tbody .rowhilite td.wn { + background: url("rowhover-bg.gif"); +} + +.calendar tbody td.today { font-weight: bold; /* background: url("today-bg.gif") no-repeat 70% 50%; */ } + +.calendar tbody td.hilite { /* Hovered cells */ + background: url("hover-bg.gif"); + padding: 1px 3px 1px 1px; + border: 1px solid #bbb; +} + +.calendar tbody td.active { /* Active (pressed) cells */ + padding: 2px 2px 0px 2px; +} + +.calendar tbody td.weekend { /* Cells showing weekend days */ + color: #c44; +} + +.calendar tbody td.selected { /* Cell showing selected date */ + font-weight: bold; + border: 1px solid #797979; + padding: 1px 3px 1px 1px; + background: url("active-bg.gif"); color: #fff; +} + +.calendar tbody .disabled { color: #999; } + +.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; +} + +/* The footer part -- status bar and "Close" button */ + +.calendar tfoot .footrow { /* The in footer (only one right now) */ + text-align: center; + background: #565; + color: #fff; +} + +.calendar tfoot .ttip { /* Tooltip (status bar) cell */ + padding: 2px; + background: url("status-bg.gif") repeat-x 0 0; color: #000; +} + +.calendar tfoot .hilite { /* Hover style for buttons in footer */ + background: #afa; + border: 1px solid #084; + color: #000; + padding: 1px; +} + +.calendar tfoot .active { /* Active (pressed) style for buttons in footer */ + background: #7c7; + 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; + background: url("normal-bg.gif"); color: #000; + z-index: 100; + font-size: 90%; +} + +.calendar .combo .label, +.calendar .combo .label-IEfix { + text-align: center; + padding: 1px; +} + +.calendar .combo .label-IEfix { + width: 4em; +} + +.calendar .combo .hilite { + background: url("hover-bg.gif"); color: #000; +} + +.calendar .combo .active { + background: url("active-bg.gif"); color: #fff; + font-weight: bold; +} + +.calendar td.time { + 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; +} + +.calendar td.time .hour, +.calendar td.time .minute { + font-family: monospace; +} + +.calendar td.time .ampm { + text-align: center; +} + +.calendar td.time .colon { + padding: 0px 2px 0px 3px; + font-weight: bold; +} + +.calendar td.time span.hilite { + background: url("hover-bg.gif"); color: #000; +} + +.calendar td.time span.active { + background: url("active-bg.gif"); color: #fff; +} diff --git a/htdocs/js/jscalendar/skins/aqua/title-bg.gif b/htdocs/js/jscalendar/skins/aqua/title-bg.gif new file mode 100644 index 0000000..6a541b3 Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/title-bg.gif differ diff --git a/htdocs/js/jscalendar/skins/aqua/today-bg.gif b/htdocs/js/jscalendar/skins/aqua/today-bg.gif new file mode 100644 index 0000000..7161538 Binary files /dev/null and b/htdocs/js/jscalendar/skins/aqua/today-bg.gif differ diff --git a/htdocs/js/search_util.js b/htdocs/js/search_util.js index 4475171..f099b42 100644 --- a/htdocs/js/search_util.js +++ b/htdocs/js/search_util.js @@ -3,7 +3,7 @@ // This JavaScript file defines some functions used by the two search forms for // auto-populating the base DN dynamically when a server is selected from the // drop-down. -// $Header: /cvsroot/phpldapadmin/phpldapadmin/search_util.js,v 1.2 2004/03/19 20:17:51 i18phpldapadmin Exp $ +// $Header: /cvsroot/phpldapadmin/phpldapadmin/htdocs/js/search_util.js,v 1.2 2004/03/19 20:17:51 i18phpldapadmin Exp $ //the array to store the server var servers = new Array(); diff --git a/htdocs/ldif_import.php b/htdocs/ldif_import.php index 32d3fce..74f0dde 100644 --- a/htdocs/ldif_import.php +++ b/htdocs/ldif_import.php @@ -1,5 +1,5 @@ Instance($server_id); @@ -47,7 +45,7 @@ include './header.php'; ?>
".$lang['desc'].": ".$exception->message echo " ".$lang['success']."
"; else{ echo " ".$lang['failed']."
"; - echo "Error Code: ".ldap_errno($ldapserver->connect())."
"; - echo "".$lang['desc'].": ".ldap_error($ldapserver->connect())."
"; + echo "Error Code: ".$ldapserver->error()."
"; + echo "".$lang['desc'].": ".$ldapserver->error()."
"; } } if( 0 == $i % 5 ) @@ -126,7 +124,7 @@ while($entry = $ldifReader->readEntry()){ else{ echo " ".$lang['failed']."

"; reload_left_frame(); - pla_error( $actionErrorMsg[$changeType]. " " . htmlspecialchars( $entry->dn ), ldap_error( $ldapserver->connect() ), ldap_errno( $ldapserver->connect() ) ); + pla_error( $actionErrorMsg[$changeType]. " " . htmlspecialchars( $entry->dn ), $ldapserver->error(), $ldapserver->errno() ); } } diff --git a/htdocs/ldif_import_form.php b/htdocs/ldif_import_form.php index ad2f5aa..b052b6d 100644 --- a/htdocs/ldif_import_form.php +++ b/htdocs/ldif_import_form.php @@ -1,5 +1,5 @@ Instance($server_id); diff --git a/htdocs/login.php b/htdocs/login.php index 59f6131..fd5a1a3 100644 --- a/htdocs/login.php +++ b/htdocs/login.php @@ -1,5 +1,5 @@ auth_type; if ($anon_bind) { - debug_log(sprintf('Anonymous Login was posted [%s].',$anon_bind),4); + if (DEBUG_ENABLED) + debug_log('Anonymous Login was posted [%s].',4,$anon_bind); + $dn = null; $pass = null; @@ -52,7 +54,9 @@ if ($anon_bind) { # Is this a login string (printf-style) if( $ldapserver->isLoginStringEnabled() ) { $dn = str_replace( '', $uid, $ldapserver->getLoginString() ); - debug_log(sprintf('LoginStringDN: [%s]',$dn),3); + + if (DEBUG_ENABLED) + debug_log('LoginStringDN: [%s]',3,$dn); } else { # This is a standard login_attr @@ -75,14 +79,16 @@ if ($anon_bind) { # Got through each of the BASE DNs and test the login. foreach ($ldapserver->getBaseDN() as $base_dn) { - debug_log(sprintf('Searching LDAP with base [%s]',$base_dn),9); + if (DEBUG_ENABLED) + debug_log('Searching LDAP with base [%s]',9,$base_dn); $sr = @ldap_search($ldapserver->connect(false), $base_dn, $filter, array('dn'), 0, 1); $result = @ldap_get_entries($ldapserver->connect(false), $sr); $dn = isset( $result[0]['dn'] ) ? $result[0]['dn'] : false; if ($dn) { - debug_log(sprintf('Got DN [%s] for user ID [%s]',$dn,$uid),5); + if (DEBUG_ENABLED) + debug_log('Got DN [%s] for user ID [%s]',5,$dn,$uid); break; } } @@ -98,7 +104,8 @@ if ($anon_bind) { } # We fake a 'config' server auth_type to omit duplicated code -debug_log(sprintf('Setting login type to CONFIG with DN [%s]',$dn),9); +if (DEBUG_ENABLED) + debug_log('Setting login type to CONFIG with DN [%s]',9,$dn); $save_auth_type = $ldapserver->auth_type; $ldapserver->auth_type = 'config'; @@ -109,7 +116,8 @@ $ldapserver->login_pass = $pass; if (! userIsAllowedLogin($ldapserver,$dn)) pla_error( $lang['login_not_allowed'] ); -debug_log(sprintf('User is not prohibited from logging in - now bind with DN [%s]',$dn),9); +if (DEBUG_ENABLED) + debug_log('User is not prohibited from logging in - now bind with DN [%s]',9,$dn); # verify that the login is good if( is_null($dn) && is_null($pass)) @@ -117,7 +125,8 @@ if( is_null($dn) && is_null($pass)) else $ds = $ldapserver->connect(true,false,true); -debug_log(sprintf('Connection returned [%s]',$ds),9); +if (DEBUG_ENABLED) + debug_log('Connection returned [%s]',9,$ds); if (! is_resource($ds)) { if ($anon_bind) diff --git a/htdocs/login_form.php b/htdocs/login_form.php index ba84627..cfd6ba9 100644 --- a/htdocs/login_form.php +++ b/htdocs/login_form.php @@ -1,5 +1,5 @@ " . $lang['failed'] . "
.\n"; - echo "(" . ldap_error( $ldapserver->connect() ) . ")
\n"; + echo "(" . $ldapserver->error() . ")
\n"; $failed_dns[] = $dn; } } diff --git a/htdocs/password_checker.php b/htdocs/password_checker.php index 43543c5..1a1644e 100644 --- a/htdocs/password_checker.php +++ b/htdocs/password_checker.php @@ -1,5 +1,5 @@ '.htmlspecialchars($dn).''); } else { - pla_error(sprintf($lang['could_not_delete_entry'],htmlspecialchars($dn)), - ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error(sprintf($lang['could_not_delete_entry'],htmlspecialchars($dn)), + $ldapserver->error(),$ldapserver->errno()); } exit; @@ -104,8 +104,8 @@ function pla_rdelete($ldapserver,$dn) { return true; } else { - pla_error(sprintf($lang['failed_to_delete_entry'],htmlspecialchars($dn)), - ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error(sprintf($lang['failed_to_delete_entry'],htmlspecialchars($dn)), + $ldapserver->error(),$ldapserver->errno()); } } else { foreach ($children as $child_dn) { @@ -124,8 +124,8 @@ function pla_rdelete($ldapserver,$dn) { return true; } else { - pla_error(sprintf($lang['failed_to_delete_entry'],htmlspecialchars($dn)), - ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error(sprintf($lang['failed_to_delete_entry'],htmlspecialchars($dn)), + $ldapserver->error(),$ldapserver->errno()); } } } diff --git a/htdocs/refresh.php b/htdocs/refresh.php index 4d1284d..1b8ee11 100644 --- a/htdocs/refresh.php +++ b/htdocs/refresh.php @@ -1,5 +1,5 @@ isBranchRenameEnabled()) { - $children = get_container_contents($ldapserver,$dn,1); + $children = get_container_contents($ldapserver,$dn); if (count($children) > 0) pla_error($lang['non_leaf_nodes_cannot_be_renamed']); } @@ -61,8 +61,9 @@ if ($success) { $deleteoldrdn = $old_dn_attr == $new_dn_attr; if (! @ldap_rename($ldapserver->connect(), $dn, $new_rdn, $container, $deleteoldrdn ) ) { - pla_error($lang['could_not_rename'], ldap_error($ldapserver->connect() ), - ldap_errno($ldapserver->connect() ), false ); + pla_error($lang['could_not_rename'], + $ldapserver->error(), + $ldapserver->errno(), false ); } else $success = true; diff --git a/htdocs/rename_form.php b/htdocs/rename_form.php index d71a975..13d9fd4 100644 --- a/htdocs/rename_form.php +++ b/htdocs/rename_form.php @@ -1,5 +1,5 @@ SchemaSyntaxes(null,true); if (! $schema_syntaxes) pla_error($schema_error_str); @@ -102,8 +102,8 @@ switch($view) { break; case 'attributes': - $schema_attrs = get_schema_attributes($ldapserver,null,true); - $schema_object_classes = get_schema_objectclasses($ldapserver,null,true); + $schema_attrs = $ldapserver->SchemaAttributes(null,true); + $schema_object_classes = $ldapserver->SchemaObjectClasses(null,true); if (! $schema_attrs || ! $schema_object_classes) pla_error($schema_error_str); @@ -284,7 +284,7 @@ switch($view) { break; case 'matching_rules': - $schema_matching_rules = get_schema_matching_rules($ldapserver,null,true); + $schema_matching_rules = $ldapserver->MatchingRules(null,true); if (! $schema_matching_rules) pla_error($schema_error_str); @@ -363,7 +363,7 @@ switch($view) { break; case 'objectClasses': - $schema_oclasses = get_schema_objectclasses($ldapserver,null,true); + $schema_oclasses = $ldapserver->SchemaObjectClasses(null,true); if (! $schema_oclasses) pla_error($schema_error_str); ?> diff --git a/htdocs/search.php b/htdocs/search.php index 4ffbd22..e349df6 100644 --- a/htdocs/search.php +++ b/htdocs/search.php @@ -1,5 +1,5 @@ server_id),1); + if (DEBUG_ENABLED) + debug_log('BaseDN [%s] skipped as it doesnt exist in [%s].',1, + $base_dn,$ldapserver->server_id); + continue; } else { - debug_log(sprintf('Search with base DN [%s]',$base_dn),9); + if (DEBUG_ENABLED) + debug_log('Search with base DN [%s]',9,$base_dn); } if( $scope == 'base' ) $results = @ldap_read( $ldapserver->connect(false), $base_dn, $filter, $search_result_attributes, - 0, 0, 0, $config->GetValue('deref','search') ); + 0, 0, 0, $config->GetValue('deref','search') ); elseif( $scope == 'one' ) $results = @ldap_list( $ldapserver->connect(false), $base_dn, $filter, $search_result_attributes, - 0, 0, 0, $config->GetValue('deref','search') ); + 0, 0, 0, $config->GetValue('deref','search') ); else // scope == 'sub' $results = @ldap_search( $ldapserver->connect(false), $base_dn, $filter, $search_result_attributes, @@ -237,7 +241,8 @@ if( isset( $_GET['search'] ) ) { $errno = @ldap_errno( $ldapserver->connect(false) ); if( ! $results ) { - pla_error( $lang['error_performing_search'], ldap_error( $ldapserver->connect(false) ), ldap_errno( $ldapserver->connect(false) ) ); + pla_error( $lang['error_performing_search'], + $ldapserver->error(), $ldapserver->errno() ); } $time_end = utime(); diff --git a/htdocs/server_info.php b/htdocs/server_info.php index aa6350d..65bc5c8 100644 --- a/htdocs/server_info.php +++ b/htdocs/server_info.php @@ -1,5 +1,5 @@ haveAuthInfo()) # Fetch basic RootDSE attributes using the + and *. $r = @ldap_read($ldapserver->connect(),'','objectClass=*',array('+','*')); if (! $r) - pla_error($lang['could_not_fetch_server_info'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error($lang['could_not_fetch_server_info'], + $ldapserver->error(),$ldapserver->errno()); $entry = @ldap_first_entry($ldapserver->connect(),$r); if (! $entry) - pla_error($lang['could_not_fetch_server_info'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error($lang['could_not_fetch_server_info'], + $ldapserver->error(),$ldapserver->errno()); $attrs = @ldap_get_attributes($ldapserver->connect(),$entry); $count = @ldap_count_entries($ldapserver->connect(),$r); diff --git a/htdocs/template_engine.php b/htdocs/template_engine.php index ddd1ad7..d979925 100644 --- a/htdocs/template_engine.php +++ b/htdocs/template_engine.php @@ -1,5 +1,5 @@ lmhash($_REQUEST['form'][$attr]); + break; + case 'NT' : $value = $sambapassword->nthash($_REQUEST['form'][$attr]); + break; + default : + $value = null; + } + + $_REQUEST['form'][$attr] = $value; + break; + + case 'Join' : + preg_match_all('/%(\w+)(\|.+)?(\/[lU])?%/U',$matches[2],$matchall); + $matchattrs = explode(',',$matches[2]); + $char = $matchattrs[0]; + + $values = array(); + foreach ($matchall[1] as $joinattr) { + if (isset($_REQUEST['form'][$joinattr])) + $values[] = $_REQUEST['form'][$joinattr]; + + else if (isset($_REQUEST[$joinattr])) + $values[] = $_REQUEST[$joinattr]; + + else + pla_error($lang['template_post_join']); + + } + $value = implode($char,$values); + $_REQUEST['form'][$attr] = $value; + break; + default: #@todo: Error, unknown post funciton. } @@ -180,8 +218,7 @@ if (isset($_REQUEST['form'])) # Some conditional checking. # $detail['must'] & $detail['disable'] cannot be set at the same time. if (isset($detail['must']) && $detail['must'] && isset($detail['disable']) && $detail['disable']) { - # @todo: Need to make this a proper error message. - print "ERROR: Attribute is a MUST attribute, so it cannot be disabled."; + pla_error(printf($lang['template_mustattr'],$attr)); } # If this attribute is disabled, go to the next one. @@ -189,34 +226,42 @@ if (isset($_REQUEST['form'])) continue; # Evaluate our Default Value, if its a function call result. - if (isset($detail['default'])) { + if (isset($detail['value'])) { - if (is_array($detail['default'])) { + if (is_array($detail['value'])) { - # If default is an array, then it must a select list. + # If value is an array, then it must a select list. $type = 'select'; $defaultresult = sprintf(''; - $detail['default'] = $defaultresult; + $detail['value'] = $defaultresult; } else { - $detail['default'] = $templates->EvaluateDefault($ldapserver,$detail['default'],$_REQUEST['container']); + $detail['value'] = $templates->EvaluateDefault($ldapserver,$detail['value'],$_REQUEST['container'],null,(isset($detail['default']) ? $detail['default'] : null)); } #if the default has a select list, then change the type to select - if (preg_match('//i',$detail['value'])) $type = 'select'; } - # @todo: $detail['must'] && $detail['hidden'] must have $detail['default'] (with a value). - # @todo: if default is a select list, then it cannot be hidden. + # @todo: $detail['must'] && $detail['hidden'] must have $detail['value'] (with a value). + # @todo: if value is a select list, then it cannot be hidden. # If this is a hidden attribute, then set its value. if (isset($detail['hidden']) && $detail['hidden']) { - printf('','hidden',$attr,$attr,$detail['default']); + printf('','hidden',$attr,$attr,$detail['value']); continue; } @@ -225,11 +270,11 @@ if (isset($_REQUEST['form'])) if (isset($detail['must']) && $detail['must'] && ! isset($detail['presubmit'])) { $mustitems++; $mustitem = true; - $onBlur .= sprintf('reduceMust(this.form,%s,\'%s\');',$attr,$attr); + $onBlur .= sprintf("reduceMust(this.form,%s,'%s');",$attr,$attr); } # Display the icon if one is required. - if (isset($detail['icon'])) + if (isset($detail['icon']) && trim($detail['icon'])) printf('',$detail['icon']); else printf(''); @@ -262,13 +307,13 @@ if (isset($_REQUEST['form'])) if (in_array($type,array('text','password'))) { printf('', $type,$size,$attr,(isset($detail['array']) && ($detail['array'] > 1) ? '[]' : ''),$attr, - (isset($detail['default']) ? $detail['default'] : ''), + (isset($detail['value']) ? $detail['value'] : ''), ($onChange ? sprintf('onChange="%s"',$onChange) : '').($onBlur ? sprintf(' onBlur="%s"',$onBlur) : ''), (isset($detail['disable']) ? 'disabled' : ''), (isset($detail['maxlength']) ? sprintf(' maxlength="%s" ',$maxlength) : '')); } else if ($type == 'select') { - printf($detail['default'],$attr, + printf($detail['value'],$attr, ($onChange ? sprintf('onChange="%s"',$onChange) : '').($onBlur ? sprintf(' onBlur="%s"',$onBlur) : ''), (isset($detail['disable']) ? 'disabled' : '')); } @@ -314,7 +359,7 @@ if (isset($_REQUEST['form'])) if (in_array($type,array('text','password'))) { printf('', - $type,$attr."V",$attr."V",(isset($detail['default']) ? $detail['default'] : ''), + $type,$attr."V",$attr."V",(isset($detail['value']) ? $detail['value'] : ''), sprintf('onBlur="check(form.%s,form.%sV)"',$attr,$attr)); } @@ -328,7 +373,7 @@ if (isset($_REQUEST['form'])) printf('', $type,$attr,$attr.$i, - (isset($detail['default']) ? $detail['default'] : ''), + (isset($detail['value']) ? $detail['value'] : ''), ($onChange ? sprintf('onChange="%s"',$onChange) : '').($onBlur ? sprintf(' onBlur="%s"',$onBlur) : ''), isset($detail['disable']) ? 'disabled' : ''); @@ -375,7 +420,7 @@ if (isset($_REQUEST['form'])) # @todo: Proper error message required. if ($nextpage && ! $count) - print "ERROR: We are missing a page for [$nextpage] attributes.
"; + pla_error(sprintf($lang['template_nextpage'],$nextpage)); # If there is no count, display the summary if (! $count) { @@ -516,11 +561,14 @@ if (! isset($template)) # Sort these entries. uksort( $template['attrs'], 'sortAttrs' ); +$js_date_attrs = $config->GetValue('appearance','date_attrs'); +printf('',$config->GetValue('appearance','date')); + foreach( $template['attrs'] as $attr => $vals ) { flush(); - $schema_attr = get_schema_attribute( $ldapserver, $attr, $dn ); + $schema_attr = $ldapserver->getSchemaAttribute($attr,$dn); if( $schema_attr ) $attr_syntax = $schema_attr->getSyntaxOID(); else @@ -740,7 +788,6 @@ foreach( $template['attrs'] as $attr => $vals ) { } else { -debug_dump($_REQUEST,1); if( ! strcasecmp( $attr, 'userPassword' ) && obfuscate_password_display()) echo preg_replace( '/./', '*', $vals ) . "
"; else @@ -793,7 +840,12 @@ debug_dump($_REQUEST,1); } ?>
- + " name="new_values[userpassword]" value="" /> @@ -816,7 +868,7 @@ debug_dump($_REQUEST,1); if( is_attr_boolean( $ldapserver, $attr) ) { $val = $vals[0]; ?> - + + + + + + + + '; + + continue; + } /* * End of special case attributes (non plain text). @@ -858,9 +934,9 @@ debug_dump($_REQUEST,1); - getSchemaObjectClass($val); - if ($schema_object->type == 'structural') { + if ($schema_object->getType() == 'structural') { echo "$val (" . $lang['structural'] . ")
"; ?> @@ -895,13 +971,14 @@ debug_dump($_REQUEST,1); "; // draw a link for popping up the entry browser if this is the type of attribute // that houses DNs. if( is_dn_attr( $ldapserver, $attr ) ) draw_chooser_link( "edit_form.$input_id", false ); + echo '
'; + // If this is a gidNumber on a non-PosixGroup entry, lookup its name and description for convenience if( ! strcasecmp( $attr, 'gidNumber' ) && ! in_array_ignore_case( 'posixGroup', get_object_attr( $ldapserver, $dn, 'objectClass' ) ) ) { @@ -948,7 +1025,7 @@ debug_dump($_REQUEST,1); /* Draw the "add value" link under the list of values for this attributes */ if( ! $ldapserver->isReadOnly() && - ( $schema_attr = get_schema_attribute( $ldapserver, $attr, $dn ) ) && + ( $schema_attr = $ldapserver->getSchemaAttribute($attr,$dn)) && ! $schema_attr->getIsSingleValue() ) { $add_href = sprintf('add_value_form.php?server_id=%s&dn=%s&attr=%s', diff --git a/htdocs/tree.php b/htdocs/tree.php index a76f1df..cc32f75 100644 --- a/htdocs/tree.php +++ b/htdocs/tree.php @@ -1,5 +1,5 @@ $val) { pla_error(sprintf($lang['attr_is_read_only'],htmlspecialchars($attr_name))); } -$res = @ldap_modify($ldapserver->connect(),$dn,$update_array); +$res = $ldapserver->modify($dn,$update_array); if ($res) { // Fire the post modification event to the user's custom // callback function. foreach ($update_array as $attr_name => $val) { run_hook ('post_attr_modify',array('server_id' => $ldapserver->server_id, - 'dn' => $dn,'attr_name' => $attr_name,'new_value' => $val)); + 'dn' => $dn,'attr_name' => $attr_name,'new_value' => $val)); // Was this a user's password modification who is currently // logged in? If so, they need to logout and log back in @@ -126,6 +126,7 @@ if ($res) { header("Location: $redirect_url"); } else { - pla_error($lang['could_not_perform_ldap_modify'],ldap_error($ldapserver->connect()),ldap_errno($ldapserver->connect())); + pla_error($lang['could_not_perform_ldap_modify'], + $ldapserver->error(),$ldapserver->errno()); } ?> diff --git a/htdocs/update_confirm.php b/htdocs/update_confirm.php index 9809e1c..7caafb8 100644 --- a/htdocs/update_confirm.php +++ b/htdocs/update_confirm.php @@ -1,5 +1,5 @@ isReadOnly() ) pla_error( $lang['no_updates_in_read_only_mode'] ); @@ -25,8 +25,6 @@ $old_values = $_POST['old_values']; $new_values = $_POST['new_values']; $encoded_dn = rawurlencode( $dn ); $rdn = get_rdn( $dn ); -$mkntPassword = NULL; -$samba_password_step = 0; ?> @@ -53,17 +51,23 @@ foreach( $old_values as $attr => $old_val ) { if( 0 == strcasecmp( $attr, 'userPassword' ) && $new_val != '' ) { $new_val = password_hash( $new_val, $_POST['enc_type'] ); $password_already_hashed = true; - } // special case for samba password - else if (( 0 == strcasecmp($attr,'sambaNTPassword') || 0 == strcasecmp($attr,'sambaLMPassword')) - && trim($new_val[0]) != '' ) { + } else if (( 0 == strcasecmp($attr,'sambaNTPassword')) && trim($new_val[0]) != '' ) { - $mkntPassword = new MkntPasswdUtil(); - $mkntPassword->createSambaPasswords( $new_val[0] ) or pla_error($lang['unable_create_samba_pass']); - $new_val = $mkntPassword->valueOf($attr); + $sambapassword = new smbHash; + $new_val[0] = $sambapassword->nthash($new_val[0]); + + // special case for samba password + } else if ((0 == strcasecmp($attr,'sambaLMPassword')) && trim($new_val[0]) != '' ) { + + $sambapassword = new smbHash; + $new_val[0] = $sambapassword->lmhash($new_val[0]); } + if ($new_val == $old_val) + continue; + $update_array[ $attr ] = $new_val; } } @@ -143,7 +147,7 @@ if( count( $update_array ) > 0 ) { ?> echo nl2br( htmlspecialchars( $v ) ) . "
"; else if( 0 == strcasecmp( $attr, 'userPassword' ) - && ( $config->GetValue('appearance','obfuscate_password_display') || is_null( get_enc_type( $old_values[ $attr ] ) ) ) ) + && obfuscate_password_display( get_enc_type( $old_values[ $attr ] ) ) ) echo preg_replace( '/./', '*', $old_values[ $attr ] ) . "
"; @@ -176,7 +180,7 @@ if( count( $update_array ) > 0 ) { ?> elseif( $new_val != '' ) if( 0 == strcasecmp( $attr, 'userPassword' ) && - ( $config->GetValue('appearance','obfuscate_password_display') || is_null( get_enc_type( $new_values[ $attr ] ) ) ) ) + obfuscate_password_display( get_enc_type( $new_values[ $attr ] ) ) ) echo preg_replace( '/./', '*', $new_val ) . "
"; diff --git a/htdocs/view_jpeg_photo.php b/htdocs/view_jpeg_photo.php index cbf1eb4..ec3cede 100644 --- a/htdocs/view_jpeg_photo.php +++ b/htdocs/view_jpeg_photo.php @@ -1,5 +1,5 @@ diff --git a/lang/en.php b/lang/en.php index c52717a..d1a95e1 100644 --- a/lang/en.php +++ b/lang/en.php @@ -1,5 +1,5 @@ diff --git a/lang/fr.php b/lang/fr.php index 4fe56a0..a5c1d7d 100644 --- a/lang/fr.php +++ b/lang/fr.php @@ -1,17 +1,20 @@ ' . - 'défini une règle "EQUALITY" pour cet attribut auprès du serveur LDAP.'; -$lang['enter_value_to_add'] = 'Entrez la valeur que vous voulez ajouter:'; -$lang['new_required_attrs_note'] = 'Note: vous aurez peut-êre besoin d\'introduire de nouveaux attributs requis pour cette classe d\'objet'; +$lang['values_for_attribute'] = 'valeur(s) pour l\'attribut'; +$lang['inappropriate_matching_note'] = 'Note : vous obtiendrez une erreur « correspondance innapropriée » si vous n\'avez pas défini de règle d\'égalité sur votre serveur LDAP pour cette attribut.'; +$lang['enter_value_to_add'] = 'Saisissez la valeur que vous voulez ajouter :'; +$lang['new_required_attrs_note'] = 'Note : il peut vous être demandé de saisir les nouveaux attributs requis par ces objectClass'; $lang['syntax'] = 'Syntaxe'; -//Copy.php -$lang['copy_server_read_only'] = 'Des mises à jours ne peuvent pas être effectuées si le serveur est en lecture seule'; -$lang['copy_dest_dn_blank'] = 'Vous avez laissé le DN de destination vide.'; -$lang['copy_dest_already_exists'] = 'L\'entrée de destination (%s) existe déjà.'; +//copy.php +$lang['copy_server_read_only'] = 'Vous ne pouvez faire de mises à jour tantq ue le serveur est en lecture seule'; +$lang['copy_dest_dn_blank'] = 'Vopus avez laissé le DN de destination vide.'; +$lang['copy_dest_already_exists'] = 'L\'entrée de destination (%s)existe déjà.'; $lang['copy_dest_container_does_not_exist'] = 'Le conteneur de destination (%s) n\'existe pas.'; -$lang['copy_source_dest_dn_same'] = 'Le DN d\'origine et le DN de destination sont identiques.'; +$lang['copy_source_dest_dn_same'] = 'Les DN source et destination sont les mêmes.'; $lang['copy_copying'] = 'Copie '; -$lang['copy_recursive_copy_progress'] = 'Progression de la copie récursive'; -$lang['copy_building_snapshot'] = 'Construction de l\'image de l\'arborscence à copier... '; -$lang['copy_successful_like_to'] = 'Copie réussite! Voulez-vous '; -$lang['copy_view_new_entry'] = 'éditer cette nouvelle entrée'; -$lang['copy_failed'] = 'Echec lors de la copie de: '; +$lang['copy_recursive_copy_progress'] = 'progression de la copie récursive'; +$lang['copy_building_snapshot'] = 'Construction d\'un instantané de l\'arborescence à copier... '; +$lang['copy_successful_like_to'] = 'Copie avec succès ! Voulez-vous '; +$lang['copy_view_new_entry'] = 'afficher la nouvelle entrée'; +$lang['copy_failed'] = 'La copie du DN a échoué : '; //edit.php -$lang['missing_template_file'] = 'Avertissement: le fichier modèle est manquant, '; -$lang['using_default'] = 'Utilisation du modèle par défaut.'; +$lang['missing_template_file'] = 'Avertissement : fichier modèle manquant, '; +$lang['using_default'] = 'Utilisant les valeurs par défaut.'; $lang['template'] = 'Modèle'; $lang['must_choose_template'] = 'Vous devez choisir un modèle'; -$lang['invalid_template'] = '%s est un modèle non valide'; -$lang['using_template'] = 'Utilisation du modèle'; -$lang['go_to_dn'] = 'Aller à %s'; -$lang['structural_object_class_cannot_remove'] = 'Ceci est une \'objectclass\' de type structurelle et ne peut etre supprimé.'; -$lang['structural'] = 'structurelle'; - - - +$lang['invalid_template'] = '%s n\'est pas un modèle valide'; +$lang['using_template'] = 'en utilisant le modèle'; +$lang['go_to_dn'] = 'Aller vers %s'; +$lang['structural_object_class_cannot_remove'] = 'C\'est un ObjectClass structurel et il ne peut être supprimé.'; +$lang['structural'] = 'structurel'; //copy_form.php -$lang['copyf_title_copy'] = 'Copie de '; +$lang['copyf_title_copy'] = 'Copie '; $lang['copyf_to_new_object'] = 'vers un nouvel objet'; $lang['copyf_dest_dn'] = 'DN de destination'; -$lang['copyf_dest_dn_tooltip'] = 'Le DN de la nouvelle entrée à créer lors de la copie de l\'entrée source'; -$lang['copyf_dest_server'] = 'Destination Serveur'; -$lang['copyf_note'] = 'Note: La copie entre différents serveurs fonctionne seulement si il n\'y a pas de violation de schéma'; -$lang['copyf_recursive_copy'] = 'Copier récursivement les sous-entrées de cet object.'; +$lang['copyf_dest_dn_tooltip'] = 'Le DN complet de la nouvelle entrée a créer lors de la copie de l\'entrée source'; +$lang['copyf_dest_server'] = 'Serveur de destination'; +$lang['copyf_note'] = 'Astuce : la copie entre différents serveurs ne fonctionne que si il n\'y a aucune violations de schéma'; +$lang['copyf_recursive_copy'] = 'Copie récursive de toutes les sous-entrées de cet objet.'; $lang['recursive_copy'] = 'Copie récursive'; $lang['filter'] = 'Filtre'; -$lang['filter_tooltip'] = 'Lors d\'une copie récursive, seuls les entrées correspondant à ce filtre seront copiés'; -$lang['delete_after_copy'] = 'Suppresion après copie (déplacer):'; -$lang['delete_after_copy_warn'] = 'Soyez certain que votre filtre (ci-dessus) selectionnera tous les enregistrements enfants.'; - +$lang['filter_tooltip'] = 'Lors de la copie récursive, ne copier que les entrées qui correspondent à ce filtre'; +$lang['delete_after_copy'] = 'Supprimer après la copie (déplacement) :'; +$lang['delete_after_copy_warn'] = 'Veuillez vous assurer que vos filtres (ci-dessus) sélectionneront tous les enregistrements fils.'; //create.php -$lang['create_required_attribute'] = 'Une valeur n\'a pas été spécifiée pour l\'attribut requis %s.'; -$lang['redirecting'] = 'Redirection'; +$lang['create_required_attribute'] = 'Vous avez laissez une valeur blanche pour l\'attribut requis (%s).'; +$lang['redirecting'] = 'Redirection...'; $lang['here'] = 'ici'; -$lang['create_could_not_add'] = 'L\'ajout de l\'objet au serveur LDAP n\'a pu être effectuée.'; -$lang['rdn_field_blank'] = 'Vous avez laissé le champ du RDN vide.'; -$lang['container_does_not_exist'] = 'Le containeur que vous avez spécifié (%s) n\'existe pas. Veuillez, s\'il vous plaît recommencer.'; -$lang['no_objectclasses_selected'] = 'Vous n\'avez sélectionner aucun ObjectClasses pour cet objet. Veuillez s\'il vous plaît retourner à la page précédente et le faire.'; -$lang['hint_structural_oclass'] = 'Note: Vous devez choisir au moins une classe d\'objet de type structural'; +$lang['create_could_not_add'] = 'Impossible d\'ajouter l\'objet au serveur LDAP.'; //create_form.php -$lang['createf_create_object'] = 'Creation d\'un objet'; -$lang['createf_choose_temp'] = 'Choix d\'un modèle'; -$lang['createf_select_temp'] = 'Selectionner un modèle pour la procédure de création'; -$lang['save_as_file'] = 'Sauvegarder en tant que fichier'; -$lang['createf_proceed'] = 'Continuer'; -$lang['relative_distinguished_name'] = 'Relative Distinguished Name'; -$lang['rdn'] = 'RDN'; -$lang['rdn_example'] = '(exemple: cn=MyNewPerson)'; -$lang['container'] = 'Containeur'; -$lang['alias_for'] = 'Alias pour %s'; - +$lang['createf_create_object'] = 'Créer un objet'; +$lang['createf_choose_temp'] = 'Choisissez un modèle'; +$lang['createf_select_temp'] = 'Sélectionner un modèle pour le processus de création'; +$lang['save_as_file'] = 'Enregistrer dans un fichier'; +$lang['rdn_field_blank'] = 'Vous avez laissé le champ RDN vide.'; +$lang['container_does_not_exist'] = 'Le conteneur que vous avez spécifié (%s) n\'existe pas. Veuillez essayer de nouveau.'; +$lang['no_objectclasses_selected'] = 'Vous n\'avez pas sélectionné d\'objectClass pour cet objet. Veuillez revenir et le faire.'; +$lang['hint_structural_oclass'] = 'Astuce : vous devez choisir un seul objectClass structurel (affiché en gras ci-dessus)'; +$lang['template_restricted'] = 'Ce modèle n\'est pas autorisé dans ce conteneur.'; +$lang['template_invalid'] = 'Ce modèle a été désactivé, cela est sûrement du à un schéma manquant ou à des champs manquants dans le modèle XML.'; //creation_template.php $lang['ctemplate_on_server'] = 'Sur le serveur'; $lang['ctemplate_no_template'] = 'Aucun modèle spécifié dans les variables POST.'; -$lang['template_not_readable'] = 'Votre fichier de configuration définit un gestionnaire de "%s" pour ce \'template\' mais ce fichier ne possède pas les droits de lecture.'; -$lang['template_does_not_exist'] = 'Votre fichier de configuration définit un gestionnaire de "%s" pour ce \'template\' mais le gestionnaire n\'existe pas dans le répertoire templates/creation.'; -$lang['ctemplate_config_handler'] = 'Votre configuration scécifie un gestionnaire de'; -$lang['ctemplate_handler_does_not_exist'] = 'pour ce modèle. Cependant, ce gestionnaire n\'existe pas dans le répertoire \'templates/creation\'.'; -$lang['create_step1'] = 'Etape 1 de 2: Nom et classes d\'objet'; -$lang['create_step2'] = 'Etape 2 de 2: Définition des attributs et de leurs valeurs'; -//search.php -$lang['you_have_not_logged_into_server'] = 'Vous ne vous êtes pas encore loggé auprès du serveur sélectionné. Vous ne pouvez y effectuer des recherches.'; -$lang['click_to_go_to_login_form'] = 'Cliquer ici pour vous rendre au formulaire de login'; -$lang['unrecognized_criteria_option'] = 'Critère non reconnu: '; -$lang['if_you_want_to_add_criteria'] = 'Si vous voulez ajouter vos propres critère à la liste, soyez cetain d\'éditer search.php afin de pouvoir les gérer.'; -$lang['entries_found'] = 'Entrées trouvées: '; -$lang['filter_performed'] = 'Filtre utilisé: '; -$lang['search_duration'] = 'Recherche effectuée par phpLDAPadmin en'; +$lang['template_not_readable'] = 'Votre configuration spécifie un gestionnaire de « %s » pour ce modèle mais le fichier n\'est pas lisible car les permissions sont trop strictes..'; +$lang['template_does_not_exist'] = 'Votre configuration spécifie un gestionnaire de « %s » pour ce modèle mais ce gestionnaire n\'existe pas dans le répertoire de modèles/création.'; +$lang['create_step1'] = 'Étape 1 of 2 : nom et ObjectClass'; +$lang['create_step2'] = 'Étape 2 of 2 : spécifie les attributs et valeur'; +$lang['relative_distinguished_name'] = 'Nom distingué relatif'; +$lang['rdn'] = 'RDN'; +$lang['rdn_example'] = '(exemple : cn=MaNouvellePersonne)'; +$lang['container'] = 'Conteneur'; + +// search.php +$lang['you_have_not_logged_into_server'] = 'Vous n\'êtes pas encore connecté au serveur sélectionné, vous ne pouvez pas effectuer de recherche dessus.'; +$lang['click_to_go_to_login_form'] = 'Cliquez ici pour aller au formulaire de connexion'; +$lang['unrecognized_criteria_option'] = 'Option de critère non reconnue : '; +$lang['if_you_want_to_add_criteria'] = 'Si vous voulez ajouter vos propres critères dans la liste. Veuillez vous assurer d\'éditer search.php pour les gérer. Quitte.'; +$lang['entries_found'] = 'Entrées trouvées : '; +$lang['filter_performed'] = 'Filtrage effectué : '; +$lang['search_duration'] = 'Recherche effectuée par phpLDAPadmin dans'; $lang['seconds'] = 'secondes'; // search_form_advanced.php -$lang['scope_in_which_to_search'] = 'Portée de la recherche'; -$lang['scope_sub'] = 'Sub (le sous-arbre)'; -$lang['scope_one'] = 'One (un niveau sous la base)'; -$lang['scope_base'] = 'Base (le dn de base)'; -$lang['standard_ldap_search_filter'] = 'Un filtre standard de recherche LDAP. Exemple: (&(sn=Smith)(givenname=David))'; -$lang['search_filter'] = 'Filtre pour la recherche'; -$lang['list_of_attrs_to_display_in_results'] = 'Une liste des attributs à afficher dans les résultats(séparés par des virgules)'; -$lang['show_attributes'] = 'Attributs à afficher'; +$lang['scope_in_which_to_search'] = 'La portée dans laquelle effectuer la recherche'; +$lang['scope_sub'] = 'Sub (sous-arborescence entière)'; +$lang['scope_one'] = 'One (un niveau au-dessous de la base)'; +$lang['scope_base'] = 'Base (dn de base seulement)'; +$lang['standard_ldap_search_filter'] = 'Filtre de recherche LDAAP standard. Exemple : (&(sn=Smith)(givenname=David))'; +$lang['search_filter'] = 'Filtre de recherche'; +$lang['list_of_attrs_to_display_in_results'] = 'Une liste d\'attributs à afficher dans le résultat (séparé par des virgules)'; // search_form_simple.php -$lang['search_for_entries_whose'] = 'Chercher les entrées dont:'; -$lang['equals'] = 'est egal à;'; +$lang['equals'] = 'est égal à'; $lang['starts with'] = 'commence par'; $lang['contains'] = 'contient'; $lang['ends with'] = 'se termine par'; $lang['sounds like'] = 'ressemble à'; // server_info.php -$lang['could_not_fetch_server_info'] = 'Impossible de récupérer les informations concernant le serveur Ldap'; -$lang['server_info_for'] = 'Informations pour le serveur: '; -$lang['server_reports_following'] = 'Le serveur a rapporté les informations suivantes'; -$lang['nothing_to_report'] = 'Ce serveur n\'a aucunes informations a rapporter.'; +$lang['could_not_fetch_server_info'] = 'Impossible de récupérer les informations LDAP depuis le serveur. Ceci est sans doute du à une anomalie dans votre version de PHP ou peut-être que votre serveur LDAP a un contrôle d\'accès défini qui empèche les clients LDAP d\'accéder au RootDSE.'; +$lang['server_info_for'] = 'Info serveur pour : '; +$lang['server_reports_following'] = 'Le serveur rapporte les informations suivantes à propos de lui-même'; +$lang['nothing_to_report'] = 'Ce serveur n\'a rien à rapporter.'; //update.php -$lang['update_array_malformed'] = 'update_array n\'est pas bien formé. Ceci est peut-être un bogue de phpLDAPadmin. Pourriez-vous effectuer un rapport de bogue, s\'il vous plaît.'; -$lang['could_not_perform_ldap_modify'] = 'L\'opération ldap_modify n\'a pu être effectuée.'; +$lang['update_array_malformed'] = 'update_array est malformé. C\'est peut-être une anomalie de phpLDAPadmin. Veuillez la rapporter.'; +$lang['could_not_perform_ldap_modify'] = 'Impossible d\'effectuer une opération ldap_modify.'; // update_confirm.php -$lang['do_you_want_to_make_these_changes'] = 'Voulez-vous effectuer ces changements?'; +$lang['do_you_want_to_make_these_changes'] = 'Voulez-vous effectuer ces modifications ?'; $lang['attribute'] = 'Attribut'; -$lang['old_value'] = 'Ancienne Valeur'; -$lang['new_value'] = 'Nouvelle Valeur'; +$lang['old_value'] = 'Ancienne valeur'; +$lang['new_value'] = 'Nouvelle valeur'; $lang['attr_deleted'] = '[attribut supprimé]'; $lang['commit'] = 'Valider'; $lang['cancel'] = 'Annuler'; -$lang['you_made_no_changes'] = 'Aucun changement n\'a été effectué'; -$lang['go_back'] = 'Retour'; -$lang['unable_create_samba_pass'] = 'Impossible de créer le mot de passe samba. Veuillez vérifiez votre configuration dans le fichier template_config.php'; +$lang['you_made_no_changes'] = 'Vous n\'avez fait aucune modification'; +$lang['go_back'] = 'Revenir'; +$lang['unable_create_samba_pass'] = 'Impossible de créer le mot de passe Samba. Veuillez vérifier votre configuration dans template_config.php'; // welcome.php -$lang['welcome_note'] = 'Utilisez le menu de gauche pour la navigation'; +$lang['welcome_note'] = 'Utiliser le menu de gauche pour naviguer'; $lang['credits'] = 'Crédits'; $lang['changelog'] = 'ChangeLog'; +$lang['documentation'] = 'Documentation'; $lang['donate'] = 'Donation'; -$lang['pla_logo'] = 'phpLDAPadmin logo'; - +$lang['pla_logo'] = 'Logo phpLDAPadmim'; // Donate.php -$lang['donation_instructions'] = 'Pour effectuer une doantion au projet phpLDAadmin, veuillez utilisez un des boutons PayPal ci-dessous.'; +$lang['donation_instructions'] = 'Pour contribuer financièrement au projet phpLDAPadmin, utilisez un des boutons PayPal ci-dessous.'; $lang['donate_amount'] = 'Donner %s'; -$lang['purge_cache'] = 'Vider la cache'; -$lang['no_cache_to_purge'] = 'Aucune cache à vider.'; -$lang['done_purging_caches'] = 'Suppression de %s octets de la cache.'; -$lang['purge_cache_tooltip'] = 'Supprimer toutes les données en cache dans phpLDAPadmin, y compris les schemas serveur.'; + +$lang['purge_cache'] = 'Purger les caches'; +$lang['no_cache_to_purge'] = 'Aucun cache à purger.'; +$lang['done_purging_caches'] = '%s octets de cache purgés.'; +$lang['purge_cache_tooltip'] = 'Purge toutes les données cachées dans phpLDAPadmin, incluant les schémas de serveur.'; // view_jpeg_photo.php -$lang['unsafe_file_name'] = 'Nom de fichier non sûr: '; -$lang['no_such_file'] = 'Aucun fichier trouvé: '; +$lang['unsafe_file_name'] = 'Nom de fichier non sûr : '; +$lang['no_such_file'] = 'Pas de tel fichier : '; //function.php -$lang['auto_update_not_setup'] = '"auto_uid_numbers" a été activé pour %s dans votre configuration, - mais vous n\'avez pas spécifié le mécanisme "auto_uid_number_mechanism". Veuiller corriger +$lang['auto_update_not_setup'] = 'Vous avez activé auto_uid_numbers pour %s dans votre configuration, + mais vous n\'avez pas spécifié de mécanisme auto_uid_number_mechanism. Veuillez corriger ce problème.'; -$lang['uidpool_not_set'] = 'Vous avez spécifié lauto_uid_number_mechanism comme uidpool - dans la configuration du serveur %s, mais vous n\'avez pas spécifié de valeur pour - auto_uid_number_uid_pool_dn. Veuillez le spécifier avant de continuer.'; -$lang['uidpool_not_exist'] = 'Le uidPool que vous avez spécifié dans votre configuration (%s) +$lang['uidpool_not_set'] = 'Vous avez défini « auto_uid_number_mechanism » comme « uidpool » + dans votre configuration pour le serveur %s, mais vous n\'avez pas spécifié le + auto_uid_number_uid_pool_dn. Veuillez le spécifier avant de procéder.'; +$lang['uidpool_not_exist'] = 'Il semble que le uidPool que vous avez spécifié dans votre configuration (« %s ») n\'existe pas.'; -$lang['specified_uidpool'] = 'Le méchanisme "auto_uid_number_mechanism" a été défini à search dans votre - configuration pour le serveur %s, mais la directive "auto_uid_number_search_base" n\'est pad définie. Veuillez le spécifier avant de continuer.'; -$lang['auto_uid_invalid_credential'] = 'Impossible d\'effectuer un "bind" à %s avec vos droits pour "auto_uid". Veuillez S\'il vous plaît vérifier votre fichier de configuration.'; -$lang['bad_auto_uid_search_base'] = 'Votre fichier de configuration spécifie un invalide auto_uid_search_base pour le serveur %s'; -$lang['auto_uid_invalid_value'] = 'Une valeur non valide a été spécifiée pour le méchaninsme "auto_uid_number_mechanism" (%s) - dans votre configuration. Seul uidpool et search sont valides. +$lang['specified_uidpool'] = 'Vous avez spécifié le « auto_uid_number_mechanism » comme « search » dans votre + configuration du serveur %s, mais vous n\'avez pas spécifié le + « auto_uid_number_search_base ». Veuillez le spécifier avant de procéder.'; +$lang['auto_uid_invalid_credential'] = 'Incapable de se connecter à %s avec votre crédentiel auto_uid . Veuillez vérifier votre fichier de configuration.'; +$lang['bad_auto_uid_search_base'] = 'Votre configuration de phpLDAPadmin spécifie un auto_uid_search_base non valide pour le serveur %s'; +$lang['auto_uid_invalid_value'] = 'Vous avez spécifié une valeur non valide pour pour auto_uid_number_mechanism ("%s") + dans votre configuration. Seul « uidpool » et « search » sont valides. Veuillez corriger ce problème.'; -$lang['error_auth_type_config'] = 'Erreur: Vous avez une erreur dans votre fichier de configuration.Les valeurs - supportées pour \'auth_type\' sont \'config\' et \'form\' dans la section $servers. - Vous avez mis \'%s\', ce qui n\'est pas autorisé.'; -$lang['php_install_not_supports_tls'] = 'Votre installation PHP ne supporte pas TLS.'; -$lang['could_not_start_tls'] = 'Impossible de démarrer TLS.
Veuillez,s\'il vous plaît, vérifier la configuration de votre serveur LDAP.'; -$lang['could_not_bind_anon'] = 'Impossible d\'effectuer un "bind" anonyme.'; -$lang['anonymous_bind'] = 'Bind Anonyme'; -$lang['bad_user_name_or_password'] = 'Mauvais nom d\'utilisateur ou mot de passe. Veuillez recommencer s\'il vous plaît.'; -$lang['redirecting_click_if_nothing_happens'] = 'Redirection... Cliquez ici si rien ne se passe.'; -$lang['successfully_logged_in_to_server'] = 'Login réussi sur le serveur %s'; -$lang['could_not_set_cookie'] = 'Impossible d\'activer les cookies.'; -$lang['ldap_said'] = 'LDAP said: %s

'; +$lang['error_auth_type_config'] = 'Erreur : Vous avez une erreur dans votre fichier de configuration. Les seuls trois valeurs autorisées + pour auth_type dans la section $servers sont « session », « cookie », et « config ». Vous avez saisi « %s », + qui n\'est pas autorisée. '; +$lang['unique_attrs_invalid_credential'] = 'Impossible de se connecter à %s avec votre crédentiel unique_attrs. Veuillez vérifier votre fichier de configuration.'; +$lang['unique_attr_failed'] = 'Votre tentative d\'ajouter %s (%s) à
%s
n\'est pas autorisée. Cet attribut/valeur appartient à une autre entrée.

Vous souhaitez rechercher cette entrée.'; +$lang['php_install_not_supports_tls'] = 'Votre installation de PHP ne supporte pas TLS.'; +$lang['could_not_start_tls'] = 'Impossible de démarrer TLS. Veuillez vérifier la configuration de votre serveur LDAP.'; +$lang['could_not_bind_anon'] = 'Impossible de se connecter anonymement au serveur.'; +$lang['could_not_bind'] = 'Impossible de se connecter au serveur LDAP.'; +$lang['anonymous_bind'] = 'Connexion anonyme'; +$lang['bad_user_name_or_password'] = 'Mauvais nom d\'utilisateur ou mot de passe. Veuillez réessayer.'; +$lang['successfully_logged_in_to_server'] = 'Connexion au serveur %s avec succès'; +$lang['could_not_set_cookie'] = 'Impossible de définir le cookie.'; +$lang['ldap_said'] = 'LDAP dit : %s'; $lang['ferror_error'] = 'Erreur'; -$lang['fbrowse'] = 'naviguer'; +$lang['fbrowse'] = 'parcourir'; $lang['delete_photo'] = 'Supprimer la photo'; -$lang['install_not_support_blowfish'] = 'Votre installation PHP ne support pas l\'encryption blowfish.'; -$lang['install_no_mash'] = 'Votre installation PHP ne supporte pas la fonction mhash(). Impossible de créer un hash SHA.'; +$lang['install_not_support_ext_des'] = 'Votre bibliothèque système crypt ne supporte pas le chiffrement DES étendu.'; +$lang['install_not_support_blowfish'] = 'Votre bibliothèque système crypt ne supporte pas le chiffrement blowfish.'; +$lang['install_not_support_md5crypt'] = 'Votre bibliothèque système crypt ne supporte pas le chiffrement md5crypt.'; +$lang['install_no_mash'] = 'Votre installation PHP n\'a pas de fonction mhash(). Impossible de faire de signature SHA.'; $lang['jpeg_contains_errors'] = 'jpegPhoto contient des erreurs
'; -$lang['ferror_number'] = 'Numéro de l\'erreur: %s (%s)

'; -$lang['ferror_discription'] = 'Description: %s

'; -$lang['ferror_number_short'] = 'Numé de l\'erreur: %s

'; -$lang['ferror_discription_short'] = 'Description: (pas de description disponible)
'; -$lang['ferror_submit_bug'] = 'Est-ce un bogue de phpLDAPadmin? Si c\'est le cas,veuillez s\'il vous plaît le rapporter.'; -$lang['ferror_unrecognized_num'] = 'Numéro de l\'erreur non reconnu: '; +$lang['ferror_number'] = 'Erreur numéro : %s (%s)'; +$lang['ferror_discription'] = 'Description : %s

'; +$lang['ferror_number_short'] = 'Erreur numéro : %s

'; +$lang['ferror_discription_short'] = 'Description : (aucune description disponible)
'; +$lang['ferror_submit_bug'] = 'Est-ce une anomalie phpLDAPadmin ? Si c\'est le cas, veuillez la rapporter.'; +$lang['ferror_unrecognized_num'] = 'Numéro d\'erreur non reconnu: '; $lang['ferror_nonfatil_bug'] = '

-
- Vous avez trouvé un bogue non fatal dans phpLDAPAdmin!
Erreur:%s (%s)
Fichier:%s ligne %s, origine de l\'appel %s
Versions:PLA: %s, PHP: %s, SAPI: %s -
Serveur Web:%s
- S\'il vous plaît, veuillez rapporter ce bogue en cliquant ici.

'; -$lang['ferror_congrats_found_bug'] = 'Félicitations! Vous avez trouvé un bogue dans phpLDAPadmin.

+ Vous avez trouvé une anomalie phpLDAPadmin non fatale !Erreur :%s (%s)Fichier : + %s ligne %s, appelant %sVersions :PLA : %s, PHP : %s, SAPI : %s + Serveur Web :%s +
Veuillez vérifier et voir si cette anomalie a déjà été rapportée ici.
+
Si elle n\'a pas été rapportée, vous pouver rapporter cette anomalie en cliquant ici.
+
'; +$lang['ferror_congrats_found_bug'] = 'Félicitations ! Vous avez trouvé une anomalie dans phpLDAPadmin.

- - - - - - - - - + + + + + + + + +
Erreur:%s
Niveau:%s
Fichier:%s
Ligne:%s
Origine de l\'appel:%s
PLA Version:%s
PHP Version:%s
PHP SAPI:%s
Serveur Webr:%s
Erreur :%s
Niveau :%s
Fichier :%s
Ligne :%s
Appelant :%s
Version PLA :%s
Version PHP :%s
SAPI PHP :%s
Serveur Web :%s

- S\'il vous plaît, veuillez rapporter ce bogue en cliquant ici!'; + Veuillez rapporter cette anomalie en cliquant ci-dessous !'; //ldif_import_form -$lang['import_ldif_file_title'] = 'Import de fichier LDIF'; -$lang['select_ldif_file'] = 'Sélectionner un fichier LDIF:'; -$lang['select_ldif_file_proceed'] = 'Continuer >>'; +$lang['import_ldif_file_title'] = 'Importer un fichier LDIF'; +$lang['select_ldif_file'] = 'Sélectionner un fichier LDIF :'; +$lang['dont_stop_on_errors'] = 'Ne pas vous arrêter sur les erreurs'; -//lldif_import -$lang['add_action'] = 'Ajout de...'; -$lang['delete_action'] = 'Supression de...'; -$lang['rename_action'] = 'Renommage de...'; -$lang['modify_action'] = 'Modification de...'; -$lang['warning_no_ldif_version_found'] = 'Aucun numéro de version trouvé. Version 1 supposé.'; -$lang['valid_dn_line_required'] = 'Une ligne avec un dn valide est requis.'; -$lang['valid_dn_line_required'] = 'A valid dn line is required.'; -$lang['missing_uploaded_file'] = 'Le fichier est manquant.'; -$lang['no_ldif_file_specified.'] = 'Aucun fichier LDIFspécifié. Veuillez réessayer, s\'il vous plaît.'; -$lang['ldif_file_empty'] = 'Le fichier LDIF est vide.'; +//ldif_import +$lang['add_action'] = 'Ajout...'; +$lang['delete_action'] = 'Suppression...'; +$lang['rename_action'] = 'Renommage...'; +$lang['modify_action'] = 'Modification...'; +$lang['warning_no_ldif_version_found'] = 'Aucune version trouvé. Assume 1.'; +$lang['valid_dn_line_required'] = 'Une ligne dn valide est requise.'; +$lang['missing_uploaded_file'] = 'Fichier téléchargé manquant.'; +$lang['no_ldif_file_specified'] = 'Aucun fichier LDIF spécifié. Veuillez essayer de nouveau.'; +$lang['ldif_file_empty'] = 'Le fichier LDIF téléchargé est manquant.'; +$lang['empty'] = 'vide'; $lang['file'] = 'Fichier'; -$lang['number_bytes'] = '%s bytes'; +$lang['number_bytes'] = '%s octets'; -$lang['failed'] = 'échec'; -$lang['ldif_parse_error'] = 'Erreur lors de l\'analyse du fichier LDIF'; -$lang['ldif_could_not_add_object'] = 'Impossible d\'ajouter l\'objet:'; -$lang['ldif_could_not_rename_object'] = 'Impossible de renommer l\'objet:'; -$lang['ldif_could_not_delete_object'] = 'Impossible de supprimer l\'objet:'; -$lang['ldif_could_not_modify_object'] = 'Impossible de modifier l\'objet:'; -$lang['ldif_line_number'] = 'Numéro de ligne'; -$lang['ldif_line'] = 'Ligne'; - -//delete_form -$lang['sure_permanent_delete_object']='Etes-vous certain de vouloir supprimer définitivement cet objet?'; -$lang['list_of_entries_to_be_deleted'] = 'Liste des entrées à supprimer:'; -$lang['dn'] = 'DN'; +$lang['failed'] = 'Échoue'; +$lang['ldif_parse_error'] = 'Erreur d\'analyse LDIF'; +$lang['ldif_could_not_add_object'] = 'Impossible d\'ajouter un objet :'; +$lang['ldif_could_not_rename_object'] = 'Impossible de renommer l\'objet :'; +$lang['ldif_could_not_delete_object'] = 'Impossible de supprimer l\'objet :'; +$lang['ldif_could_not_modify_object'] = 'Impossible de modifier l\'objet :'; +$lang['ldif_line_number'] = 'Numéro de ligne :'; +$lang['ldif_line'] = 'Ligne :'; // Exports -$lang['export_format'] = 'Format'; -$lang['line_ends'] = 'Fin de ligne'; -$lang['must_choose_export_format'] = 'Vous devez sélectionner un format pour l\'exportation.'; -$lang['invalid_export_format'] = 'Format d\'exportation invalide'; -$lang['no_exporter_found'] = 'Aucun exporteur trouvé.'; -$lang['error_performing_search'] = 'Une erreur a eu lieu lors de la recherche.'; -$lang['showing_results_x_through_y'] = 'Affichage de %s à %s des résultats.'; -$lang['searching'] = 'Recherche...'; -$lang['size_limit_exceeded'] = 'Notice, la limite de taille pour la recherche est atteinte.'; +$lang['export_format'] = 'Format d\'exportation'; +$lang['line_ends'] = 'Les lignes se finissent par'; +$lang['must_choose_export_format'] = 'Vous devez choisir un format d\'exportation.'; +$lang['invalid_export_format'] = 'Format d\'exportation non valide'; +$lang['no_exporter_found'] = 'Aucun filtre d\'exportation trouvé.'; +$lang['error_performing_search'] = 'Une erreur est survenue lors de la recherche.'; +$lang['showing_results_x_through_y'] = 'Affichage des résultats %s à %s.'; +$lang['searching'] = 'Recherche en cours...'; +$lang['size_limit_exceeded'] = 'Attention, la taille limite de recherche est dépassée.'; $lang['entry'] = 'Entrée'; -$lang['ldif_export_for_dn'] = 'Export LDIF pour: %s'; -$lang['generated_on_date'] = 'Generé par phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) le %s'; -$lang['total_entries'] = 'Nombre d\'entrées'; -$lang['dsml_export_for_dn'] = 'Export DSML pour: %s'; - +$lang['ldif_export_for_dn'] = 'Exportation LDIF pour : %s'; +$lang['generated_on_date'] = 'Généré par phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) pour %s'; +$lang['total_entries'] = 'Entrées totales'; +$lang['dsml_export_for_dn'] = 'Exportation DSLM pour : %s'; +$lang['include_system_attrs'] = 'Inclure les attributs système'; +$lang['csv_spreadsheet'] = 'CSV (feuille de calcul)'; // logins -$lang['could_not_find_user'] = 'Impossible de trouver l\'utilisateur "%s"'; -$lang['password_blank'] = 'Le champ pour le mot de passe est vide.'; -$lang['login_cancelled'] = 'Login interrompu.'; -$lang['no_one_logged_in'] = 'Personne n\'est loggé à ce serveur.'; +$lang['password_blank'] = 'Vous avez laissé le mot de passe vide.'; +$lang['no_one_logged_in'] = 'Personne n\'est connecté sur ce serveur.'; $lang['could_not_logout'] = 'Impossible de se déconnecter.'; -$lang['unknown_auth_type'] = 'auth_type inconnu: %s'; -$lang['logged_out_successfully'] = 'Déconnection réussie du serveur %s'; -$lang['authenticate_to_server'] = 'Authentification au serveur %s'; -$lang['warning_this_web_connection_is_unencrypted'] = 'Attention: Cette connection web n\'est pas cryptée.'; -$lang['not_using_https'] = 'Vous n\'utilisez pas \'https\'. Le navigateur web transmettra les informations de login en clair.'; -$lang['login_dn'] = 'Login DN'; -$lang['user_name'] = 'Nom de l\'utilisateur'; +$lang['unknown_auth_type'] = 'auth_type inconnu : %s'; +$lang['logged_out_successfully'] = 'Déconnexion du serveur avec succès %s'; +$lang['authenticate_to_server'] = 'Authentification auprès du serveur %s'; +$lang['warning_this_web_connection_is_unencrypted'] = 'Avertissement : la connexion Web n\'est pas chiffré.'; +$lang['not_using_https'] = 'Vous n\'utilisez pas « https ». Le navigateur Web transmettra les informations de connexion en clair.'; +$lang['login_dn'] = 'DN de connexion'; +$lang['user_name'] = 'Nom d\'utilisateur'; $lang['password'] = 'Mot de passe'; $lang['authenticate'] = 'Authentification'; +$lang['login_not_allowed'] = 'Désolé, vous n\'êtes pas autorisé à utiliser phpLDAPadmin avec ce serveur LDAP.'; // Entry browser -$lang['entry_chooser_title'] = 'Sélection de l\'entrée'; +$lang['entry_chooser_title'] = 'Sélecteur d\'entrées'; // Index page -$lang['need_to_configure'] = 'phpLDAPadmin a besoin d\'être configuré.Pour cela, éditer le fichier \'config.php\' . Un exemple de fichier de configuration est fourni dans \'config.php.example\''; +$lang['need_to_configure'] = 'Vous avez besoin de configurer phpLDAPadmin. Éditez le fichier « config.php » pour le faire. un exemple de fichier de configuration est fournit dans « config.php.example »'; // Mass deletes -$lang['no_deletes_in_read_only'] = 'Les suppressions ne sont pas permises en mode lecure seule.'; -$lang['error_calling_mass_delete'] = 'Erreur lors de l\'appel à mass_delete.php. mass_delete est manquant dans les variables POST.'; -$lang['mass_delete_not_array'] = 'La variable POST mass_delete \'est pas un tableau.'; -$lang['mass_delete_not_enabled'] = 'La suppression de masse n\'est pas disponible. Veuillez l\'activer dans config.php avant de continuer.'; -$lang['mass_deleting'] = 'Suppression en masse'; -$lang['mass_delete_progress'] = 'Progrès de la suppression sur le serveur "%s"'; -$lang['malformed_mass_delete_array'] = 'Le tableau mass_delete n\'est pas bien formé.'; -$lang['no_entries_to_delete'] = 'Vous n\'avez sélectionné aucune entrées à effacer.'; -$lang['deleting_dn'] = 'Deleting %s'; -$lang['total_entries_failed'] = '%s des %s entrées n\'ont pu être supprimées.'; +$lang['no_deletes_in_read_only'] = 'Supprimer n\'est pas autorisé en lecture seule.'; +$lang['error_calling_mass_delete'] = 'Erreur lors de l\'applel de mass_delete.php. Il manque mass_delete dans les variables POST.'; +$lang['mass_delete_not_array'] = 'La variable POST mass_delete n\'est pas un tableau.'; +$lang['mass_delete_not_enabled'] = 'La suppression de masse n\'est pas activé. Veuillez l\'activer dans config.php avant de procéder.'; +$lang['mass_deleting'] = 'Suppression de masse'; +$lang['mass_delete_progress'] = 'Progression de la suppression sur le serveur « %s »'; +$lang['malformed_mass_delete_array'] = 'Tableau mass_delete malformé.'; +$lang['no_entries_to_delete'] = 'Vous n\'avez sélectionné aucune entrées à supprimer.'; +$lang['deleting_dn'] = 'Suppression de %s'; +$lang['total_entries_failed'] = '%s sur %s entrées n\'ont pu être effacées.'; $lang['all_entries_successful'] = 'Toutes les entrées ont été supprimées avec succès.'; -$lang['confirm_mass_delete'] = 'Confirmation de la suppression en masse de %s entrées sur le serveur %s'; -$lang['yes_delete'] = 'Oui, supprimer!'; +$lang['confirm_mass_delete'] = 'Confirmer la suppression de masse de %s entrées sur le serveur %s'; +$lang['yes_delete'] = 'Oui, supprimer !'; // Renaming entries -$lang['non_leaf_nodes_cannot_be_renamed'] = 'Vous ne pouvez pas renommer une entrée qui a des sous-entrées'; -$lang['no_rdn_change'] = 'Le RDN n\'a pas été modifié'; -$lang['invalid_rdn'] = 'Valeur invalide du RDN'; +$lang['non_leaf_nodes_cannot_be_renamed'] = 'Vous ne pouvez renommer une entrée qui a des sous-entrées (cad, l\'opération de renommage n\'est pas autorisé sur des entrées non terminales)'; +$lang['no_rdn_change'] = 'Vous n\'avez pas modifié le RDN'; +$lang['invalid_rdn'] = 'Valeur RDN non valide'; $lang['could_not_rename'] = 'Impossible de renommer l\'entrée'; -$lang['csv_spreadsheet'] = 'CSV (tableur)'; +// Password checker +$lang['passwords_match'] = 'Correspondance du mot de passe !'; +$lang['passwords_do_not_match'] = 'Les mots de passe ne correspondent pas !'; +$lang['password_checker_tool'] = 'Outil de vérification de mot de passe'; +$lang['to'] = 'Vers'; + +// Templates +$lang['using'] = 'En utilisant le'; +$lang['switch_to'] = 'Vous pouvez basculer vers '; +$lang['default_template'] = 'modèle par défaut'; + +// template_config +$lang['user_account'] = 'Compte utilisateur (posixAccount)'; +$lang['address_book_inet'] = 'Entrée de carnet d\'adresses (inetOrgPerson)'; +$lang['address_book_moz'] = 'Entrée de carnet d\'adresses (mozillaOrgPerson)'; +$lang['kolab_user'] = 'Entrée d\'utilisateur Kolab'; +$lang['organizational_unit'] = 'Unité organisationnelle'; +$lang['new_organizational_unit'] = 'Nouvelle unité organisationnelle'; +$lang['organizational_role'] = 'Rôle organisationnel'; +$lang['posix_group'] = 'Groupe Posix'; +$lang['samba_machine'] = 'Machine NT Samba'; +$lang['samba3_machine'] = 'Machine NT Samba 3'; +$lang['samba_user'] = 'Utilisateur Samba'; +$lang['samba3_user'] = 'Utilisateur Samba 3'; +$lang['samba3_group'] = 'Groupe de mappage Samba 3'; +$lang['dns_entry'] = 'Entrée DNS'; +$lang['simple_sec_object'] = 'Object de sécurité simple'; +$lang['courier_mail_account'] = 'Compte de messagerie'; +$lang['courier_mail_alias'] = 'Alias de compte de messagerie'; +$lang['ldap_alias'] = 'Alias LDAP'; +$lang['sendmail_cluster'] = 'Cluster Sendmail'; +$lang['sendmail_domain'] = 'Domaine Sendmail'; +$lang['sendmail_alias'] = 'Alias Sendmail'; +$lang['sendmail_virt_dom'] = 'Domaine virtuel Sendmail'; +$lang['sendmail_virt_users'] = 'Utilisateurs virtuels Sendmail'; +$lang['sendmail_relays'] = 'Relais Sendmail'; +$lang['custom'] = 'personnalisé'; +$lang['samba_domain_name'] = 'Mon nom de domaine Samba'; +$lang['administrators'] = 'Administrateurs'; +$lang['users'] = 'Utilisateurs'; +$lang['guests'] = 'Invités'; +$lang['power_users'] = 'Utilisateurs avec pouvoir'; +$lang['account_ops'] = 'Opérateurs de comptes'; +$lang['server_ops'] = 'Opérateurs de serveurs'; +$lang['print_ops'] = 'Opérateurs d\'impression'; +$lang['backup_ops'] = 'Opérateurs de sauvegarde'; +$lang['replicator'] = 'Duplicateurs'; +$lang['unable_smb_passwords'] = ' Impossible de créer les mots de passe Samba. Veuillez vérifier la configuration dans template_config.php'; +$lang['err_smb_conf'] = 'Erreur : vous avez une erreur dans votre confguration Samba.'; +$lang['err_smb_no_name_sid'] = 'Erreur : un nom et un sid doivent être fournit pour votre domaine Samba.'; +$lang['err_smb_no_name'] = 'Erreur : aucun nom fournit pour le domaine Samba.'; +$lang['err_smb_no_sid'] = 'Erreur : aucun sid fournit pour le domaine Samba.'; // Samba Account Template -$lang['samba_account'] = 'Samba Account'; -$lang['samba_account_lcase'] = 'samba account'; +$lang['samba_account'] = 'Compte Samba'; +$lang['samba_account_lcase'] = 'compte samba'; // New User (Posix) Account $lang['t_new_user_account'] = 'Nouveau compte utilisateur'; -$lang['t_hint_customize'] = 'Astuce: Pour personnaliser ce \'template\', éditez le fichier templates/creation/new_user_template.php'; +$lang['t_hint_customize'] = 'astuce : pour personnaliser ce modèle, éditez le fichier templates/creation/new_user_template.php'; $lang['t_name'] = 'Nom'; $lang['t_first_name'] = 'Prénom'; $lang['t_last_name'] = 'Nom de famille'; -$lang['t_first'] = 'first'; -$lang['t_last'] = 'last'; -$lang['t_common_name'] = 'Common name'; +$lang['t_first'] = 'premier'; +$lang['t_last'] = 'dernier'; +$lang['t_state'] = 'État'; +$lang['t_common_name'] = 'Nom commun'; $lang['t_user_name'] = 'Nom d\'utilisateur'; $lang['t_password'] = 'Mot de passe'; -$lang['t_encryption'] = 'Encryption'; -$lang['t_login_shell'] = 'Login Shell'; -$lang['t_home_dir'] = 'Home Directory'; -$lang['t_uid_number'] = 'UID Number'; +$lang['t_encryption'] = 'Chiffrement'; +$lang['t_login_shell'] = 'Shell de connexion'; +$lang['t_home_dir'] = 'Dossier personnel'; +$lang['t_uid_number'] = 'UID'; $lang['t_auto_det'] = '(déterminé automatiquement)'; $lang['t_group'] = 'Groupe'; -$lang['t_gid_number'] = 'GID Number'; -$lang['t_err_passwords'] = 'Les mots de passe ne correspondent pas. Veuillez revenir en arrière et recommencez.'; -$lang['t_err_field_blank'] = 'Le champ %s ne peut etre vide. Veuillez revenir en arrière et recommencez.'; -$lang['t_err_field_num'] = 'Seuls des valeurs numériques sont valides pour le champ %s. Veuillez revenir en arrière et recommencez.'; -$lang['t_err_bad_container'] = 'Le conténeur spécifié (%s) n\'existe pas. Veuillez revenir en arrière et recommencez.'; -$lang['t_confirm_account_creation'] = 'Confirmation de la création du compte'; +$lang['t_gid_number'] = 'GID'; +$lang['t_uid'] = 'ID utilisateur'; +$lang['t_err_passwords'] = 'Vos mots de passe ne correspondent pas. Veuillez revenir et réessayer.'; +$lang['t_err_field_blank'] = 'Vous ne pouvez laisser %s vide. Veuillez revenir et réessayer.'; +$lang['t_err_field_num'] = 'Vous ne pouvez entrez que des valeurs numériques pour le champ %s. Veuillez revenir et réessayer.'; +$lang['t_err_bad_container'] = 'Le conteneur que vous avez spécifié (%s) n\'existe pas. Veuillez revenir et réessayer.'; +$lang['t_confirm_account_creation'] = 'Confirmer la création du compte'; $lang['t_secret'] = '[secret]'; -$lang['t_create_account'] = 'Créer le compte'; +$lang['t_create_account'] = 'Créer un compte'; +$lang['t_verify'] = 'Vérifier'; + +// New Group (Posix) +$lang['t_new_posixgroup'] = 'Nouveau groupe Posix'; // New Address Template -$lang['t_new_address'] = 'New Address Book Entry'; +$lang['t_new_address'] = 'Nouvelle entrée de carnet d\'adresses'; $lang['t_organization'] = 'Organisation'; $lang['t_address'] = 'Adresse'; $lang['t_city'] = 'Ville'; $lang['t_postal_code'] = 'Code postal'; -$lang['t_street'] = 'rue'; -$lang['t_work_phone'] = 'Work phone'; +$lang['t_street'] = 'Rue'; +$lang['t_work_phone'] = 'Téléphone (bureau)'; $lang['t_fax'] = 'Fax'; $lang['t_mobile'] = 'Mobile'; -$lang['t_email'] = 'Email'; -$lang['t_container'] = 'Conténeur'; -$lang['t_err_cn_blank'] = 'Le champ \'Common Name\' ne peut etre vide. Veuillez revenir en arrière et recommencer.'; -$lang['t_confim_creation'] = 'Confirmation de la création de l\'entrée:'; -$lang['t_create_address'] = 'Create Address'; +$lang['t_email'] = 'Courriel'; +$lang['t_container'] = 'Conteneur'; +$lang['t_err_cn_blank'] = 'Vousne pouvez pas laissez le Nom commun vide. Veuiller revenir er réessayer.'; +$lang['t_confim_creation'] = 'Confirmer la création de l\'entrée :'; +$lang['t_create_address'] = 'Créer l\'adresse'; + +// default template +$lang['t_check_pass'] = 'Vérifier l\'adresse...'; +$lang['t_auto_submit'] = '(Évaluation automatique lors de la soumission.)'; // compare form $lang['compare'] = 'Comparer'; -$lang['comparing'] = 'Comparaison des DNs suivant:'; +$lang['comparing'] = 'Compararaison des DNs suivants'; $lang['compare_dn'] = 'Comparer un autre DN avec'; $lang['with'] = 'avec '; -$lang['compf_source_dn'] = 'DN Source'; -$lang['compf_dn_tooltip'] = 'Comparer ce DN avec un autre'; -$lang['switch_entry'] = 'Intervertir les entrées'; -$lang['no_value'] = 'Aucune Valeur'; +$lang['compf_source_dn'] = 'DN source'; +$lang['compf_dn_tooltip'] = 'Comparer cn DN avec un autre'; +$lang['switch_entry'] = 'Basculer l\'entrée'; +$lang['no_value'] = 'Aucune valeur'; $lang['compare_with'] = 'Comparer avec une autre entrée'; -$lang['need_oclass'] = 'You need one of the following ObjectClass(es) to add this attribute %s.'; +$lang['need_oclass'] = 'Vous avez besoin d\'un autre ObjectClass(es) pour ajouter cet attribut %s.'; // Time out page -$lang['session_timed_out_1'] = 'Votre session a expiré après'; +$lang['session_timed_out_1'] = 'Votre session s\'est terminé avec'; $lang['session_timed_out_2'] = 'min. d\'inactivité. Vous avez été automatiquement déconnecté.'; -$lang['log_back_in'] = 'Pour vous connecter à nouveau, cliquez sur le lien suivant:'; -$lang['session_timed_out_tree'] = '(Expiration de session. Déconnexion automatique.)'; +$lang['log_back_in'] = 'Pour vous reconnecter, veuillez cliquer sur le lien suivant :'; +$lang['session_timed_out_tree'] = '(Session expirée. Déconnexion automatique.)'; +$lang['timeout_at'] = 'L\'inactivité vous déconnectera à %s'; ?> diff --git a/lang/ja.php b/lang/ja.php index 4db12fd..748d68c 100644 --- a/lang/ja.php +++ b/lang/ja.php @@ -1,6 +1,6 @@ %s ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã«æˆåŠŸã—ã¾ã—ãŸ'; @@ -542,7 +548,6 @@ $lang['no_deletes_in_read_only'] = '読ã¿è¾¼ã¿å°‚用モードã§ã¯å‰Šé™¤ã¯ $lang['error_calling_mass_delete'] = 'mass_delete.php 呼ã³å‡ºã—中ã®ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚POST 値ã‹ã‚‰ mass_delete ãŒè¦‹ã‹ã‚Šã¾ã›ã‚“。'; $lang['mass_delete_not_array'] = 'mass_delete POST 辺りãŒé…列ã§ã¯ã‚ã‚Šã¾ã›ã‚“。'; $lang['mass_delete_not_enabled'] = '一括削除ãŒæœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。次ã«é€²ã‚€å‰ã« config.php ã§ãれを有効ã«ã—ã¦ãã ã•ã„。'; -$lang['search_attrs_wrong_count'] = 'config.php ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚The number of attributes in $search_attributes and $search_attributes_display is different'; $lang['mass_deleting'] = '一括削除中'; $lang['mass_delete_progress'] = 'サーãƒãƒ¼ "%s" ã‹ã‚‰å‰Šé™¤ä¸­'; $lang['malformed_mass_delete_array'] = 'ãŠã‹ã—ã„ mass_delete é…列ã§ã™ã€‚'; @@ -554,23 +559,19 @@ $lang['confirm_mass_delete'] = '%s エントリをサーãƒãƒ¼ %s ã‹ã‚‰ä¸€æ‹¬ $lang['yes_delete'] = 'ã¯ã„, 削除ã—ã¾ã™!'; // Renaming entries -$lang['non_leaf_nodes_cannot_be_renamed'] = 'å­ã‚¨ãƒ³ãƒˆãƒªã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯å称変更ã§ãã¾ã›ã‚“ (eg, the rename operation is not allowed on non-leaf entries)'; +$lang['non_leaf_nodes_cannot_be_renamed'] = 'å­ã‚¨ãƒ³ãƒˆãƒªã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯å称変更ã§ãã¾ã›ã‚“ (例ãˆã°å称変更ã®æ“作ã¯å­ã‚¨ãƒ³ãƒˆãƒªã§ãªã‘ã‚Œã°è¨±å¯ã•ã‚Œã¦ã„ãªã„)'; $lang['no_rdn_change'] = 'RDN を変更ã—ã¾ã›ã‚“ã§ã—ãŸ'; $lang['invalid_rdn'] = '無効㪠RDN 値'; -$lang['could_not_rename'] = 'エントリã®å称変更ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—ãŸ'; - -// General errors -$lang['mismatched_search_attr_config'] = '設定ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚$search_attributes 㯠$search_attributes_display ã®å±žæ€§ã¨åŒã˜æ•°ã‚’æŒãŸãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“。'; +$lang['could_not_rename'] = 'エントリã®å称変更ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ'; // Password checker $lang['passwords_match'] = 'パスワードãŒä¸€è‡´ã—ã¾ã—ãŸ!'; $lang['passwords_do_not_match'] = 'パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“!'; $lang['password_checker_tool'] = 'パスワードãƒã‚§ãƒƒã‚¯ãƒ„ール'; -$lang['compare'] = '比較'; $lang['to'] = 'To'; // Templates -$lang['using'] = 'Using the'; +$lang['using'] = '次を使用:'; $lang['switch_to'] = 'You may switch to the '; $lang['default_template'] = 'デフォルトテンプレート'; @@ -580,6 +581,7 @@ $lang['address_book_inet'] = 'アドレス帳エントリ (inetOrgPerson)'; $lang['address_book_moz'] = 'アドレス帳エントリ (mozillaOrgPerson)'; $lang['kolab_user'] = 'Kolab ユーザーエントリ'; $lang['organizational_unit'] = '所属組織'; +$lang['new_organizational_unit'] = 'æ–°è¦æ‰€å±žçµ„ç¹”'; $lang['organizational_role'] = '所属è·å‹™'; $lang['posix_group'] = 'Posix グループ'; $lang['samba_machine'] = 'Samba NT マシン'; @@ -627,6 +629,7 @@ $lang['t_first_name'] = 'åå‰'; $lang['t_last_name'] = 'è‹—å­—'; $lang['t_first'] = 'first'; $lang['t_last'] = 'last'; +$lang['t_state'] = 'State'; $lang['t_common_name'] = '共通å'; $lang['t_user_name'] = 'ユーザーå'; $lang['t_password'] = 'パスワード'; @@ -637,13 +640,18 @@ $lang['t_uid_number'] = 'UID 番å·'; $lang['t_auto_det'] = '(自動採決)'; $lang['t_group'] = 'グループ'; $lang['t_gid_number'] = 'GID 番å·'; +$lang['t_uid'] = 'ユーザー ID'; $lang['t_err_passwords'] = 'パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_err_field_blank'] = '%s ブランクを残ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; -$lang['t_err_field_num'] = 'フィールド %s ã¯æ•°å€¤ã®ã¿å…¥åŠ›ã§å‡ºæ¥ã¾ã™ã€‚戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; +$lang['t_err_field_num'] = 'フィールド %s ã¯æ•°å€¤ã®ã¿å…¥åŠ›ã§ã§ãã¾ã™ã€‚戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_err_bad_container'] = '指定ã—ãŸå†…容(%s)ã¯å­˜åœ¨ã—ã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_confirm_account_creation'] = 'アカウント作æˆç¢ºèª'; $lang['t_secret'] = '[secret]'; $lang['t_create_account'] = 'アカウント作æˆ'; +$lang['t_verify'] = '確èª'; + +// New Group (Posix) +$lang['t_new_posixgroup'] = 'æ–°è¦ Posix グループ'; // New Address Template $lang['t_new_address'] = 'æ–°è¦ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã‚¨ãƒ³ãƒˆãƒª'; @@ -657,17 +665,18 @@ $lang['t_fax'] = 'Fax'; $lang['t_mobile'] = 'æºå¸¯é›»è©±'; $lang['t_email'] = 'é›»å­ãƒ¡ãƒ¼ãƒ«'; $lang['t_container'] = 'コンテナー'; -$lang['t_err_cn_blank'] = '一般åを空ã«ã™ã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; +$lang['t_err_cn_blank'] = '一般åを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_confim_creation'] = 'エントリ作æˆã®ç¢ºèª:'; $lang['t_create_address'] = 'アドレス作æˆ'; // default template $lang['t_check_pass'] = 'パスワード検査...'; +$lang['t_auto_submit'] = '(Auto evalutated on submission.)'; // compare form $lang['compare'] = '比較'; $lang['comparing'] = '次㮠DN ã¨æ¯”較中'; -$lang['compare_dn'] = 'Compare another DN with'; +$lang['compare_dn'] = '次㮠DN ã¨åˆ¥ã® DN を比較ã™ã‚‹:'; $lang['with'] = 'with '; $lang['compf_source_dn'] = '元㮠DN'; $lang['compf_dn_tooltip'] = 'ã“ã® DN ã¨åˆ¥ã®ã‚‚ã®ã‚’比較'; @@ -682,4 +691,4 @@ $lang['session_timed_out_2'] = '分活動ã—ãªã‹ã£ãŸã®ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ $lang['log_back_in'] = 'å†ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯æ¬¡ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„:'; $lang['session_timed_out_tree'] = '(セッションã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã§ã™ã€‚自動ã§ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ)'; $lang['timeout_at'] = '%s ã¯æ´»å‹•çš„ã§ãªã‹ã£ãŸã®ã§ãƒ­ã‚°ã‚¢ã‚¦ãƒˆ'; -?> +?> \ No newline at end of file diff --git a/lang/pl.php b/lang/pl.php index d3da041..48a4753 100644 --- a/lang/pl.php +++ b/lang/pl.php @@ -1,5 +1,5 @@
Znalaz³e¶ b³±d w phpLDAPadmin (nie krytyczny) !
B³±d:%s (%s)
Plik: %s linia %s, wywo³ane z %s
Wersje:PLA: %s, PHP: %s, SAPI: %s
Serwer Web:%s
- Proszê zg³o¶ ten b³±d klikaj±c tutaj.

'; + Sprawd¼ proszê czy ten b³±d nie zosta³ ju¿ zg³oszony tutaj. +
Je¶li nie zosta³ jeszcze zg³oszony, to mo¿esz go zg³osiæ tutaj.
+
'; $lang['ferror_congrats_found_bug'] = 'Gratulacje ! Znalaz³e¶ b³±d w phpLDAPadmin.

@@ -529,7 +537,6 @@ $lang['no_deletes_in_read_only'] = 'Usuwanie jest niedozwolone w trybie tylko-do $lang['error_calling_mass_delete'] = 'B³±d podczas wywo³ania mass_delete.php. Brakuj±ca mass_delete w zmiennych POST.'; $lang['mass_delete_not_array'] = 'zmienna POST mass_delete nie jest w tablic±.'; $lang['mass_delete_not_enabled'] = 'Masowe usuwanie nie jest dozwolone. Odblokuj to proszê w config.php przed kontynuacj±.'; -$lang['search_attrs_wrong_count'] = 'Twój config.php zawiera b³±d. Ilo¶æ atrybutów w $search_attributes i$search_attributes_display jest ró¿na'; $lang['mass_deleting'] = 'Masowe usuwanie'; $lang['mass_delete_progress'] = 'Postêp usuwania na serwerze "%s"'; $lang['malformed_mass_delete_array'] = 'Zniekszta³cona tablica mass_delete.'; @@ -546,14 +553,10 @@ $lang['no_rdn_change'] = 'Nie zmieni $lang['invalid_rdn'] = 'B³êdna warto¶æ RDN'; $lang['could_not_rename'] = 'Nie mo¿na zmieniæ nazwy wpisu'; -// General errors -$lang['mismatched_search_attr_config'] = 'Twoja konfiguracja zawiera b³±d. $search_attributes musi posiadaæ t± sam± ilo¶æ atrybutów co $search_attributes_display.'; - // Password checker $lang['passwords_match'] = 'Has³a zgodne !'; $lang['passwords_do_not_match'] = 'Has³a nie zgadzaj± siê !'; $lang['password_checker_tool'] = 'Narzêdzie do sprawdzania hase³'; -$lang['compare'] = 'Porównaj'; $lang['to'] = 'Do'; // Templates @@ -567,6 +570,7 @@ $lang['address_book_inet'] = 'Wpis Ksi $lang['address_book_moz'] = 'Wpis Ksi±¿ki Adresowej (mozillaOrgPerson)'; $lang['kolab_user'] = 'Wpis U¿ytkownika Kolab'; $lang['organizational_unit'] = 'Jednostka Organizacyjna'; +$lang['new_organizational_unit'] = 'Nowa Jednostka Organizacyjna'; $lang['organizational_role'] = 'Rola w Organizacji'; $lang['posix_group'] = 'Grupa Posix'; $lang['samba_machine'] = 'Maszyna Samba NT'; @@ -614,6 +618,7 @@ $lang['t_first_name'] = 'Imi $lang['t_last_name'] = 'Nazwisko'; $lang['t_first'] = 'imiê'; $lang['t_last'] = 'nazwisko'; +$lang['t_state'] = 'Stan'; $lang['t_common_name'] = 'Nazwa'; $lang['t_user_name'] = 'Nazwa u¿ytkownika'; $lang['t_password'] = 'Has³o'; @@ -624,6 +629,7 @@ $lang['t_uid_number'] = 'Numer UID'; $lang['t_auto_det'] = '(automatycznie okre¶lony)'; $lang['t_group'] = 'Grupa'; $lang['t_gid_number'] = 'Numer GID'; +$lang['t_uid'] = 'ID U¿ytkownika'; $lang['t_err_passwords'] = 'Has³a nie zgadzaj± siê. Wróc i spróbuj ponownie.'; $lang['t_err_field_blank'] = 'Nie mo¿esz pozostawiæ pustego pola %s. Wróæ i spróbuj ponownie.'; $lang['t_err_field_num'] = 'Pole %s mo¿e zawieraæ tylko warto¶ci numeryczne. Wróæ i spróbuj ponownie.'; @@ -631,6 +637,10 @@ $lang['t_err_bad_container'] = 'Kontener kt $lang['t_confirm_account_creation'] = 'Potwierd¼ utworzenie konta'; $lang['t_secret'] = '[tajne]'; $lang['t_create_account'] = 'Utwórz konto'; +$lang['t_verify'] = 'Weryfikuj'; + +// New Group (Posix) +$lang['t_new_posixgroup'] = 'Nowa Grupa Posix'; // New Address Template $lang['t_new_address'] = 'Nowy wpis w Ksi±¿ce Adresowej'; @@ -650,6 +660,7 @@ $lang['t_create_address'] = 'Utw // default template $lang['t_check_pass'] = 'Sprawd¼ has³o'; +$lang['t_auto_submit'] = '(Automatycznie wyliczane przy wys³aniu)'; // '(Auto evalutated on submission.)'; // compare form $lang['compare'] = 'Porównaj'; diff --git a/lang/recoded/en.php b/lang/recoded/en.php index d87ba64..e30f15c 100644 --- a/lang/recoded/en.php +++ b/lang/recoded/en.php @@ -1,5 +1,5 @@ diff --git a/lang/recoded/fr.php b/lang/recoded/fr.php index cc94a5e..8484643 100644 --- a/lang/recoded/fr.php +++ b/lang/recoded/fr.php @@ -1,17 +1,20 @@ ' . - 'défini une règle "EQUALITY" pour cet attribut auprès du serveur LDAP.'; -$lang['enter_value_to_add'] = 'Entrez la valeur que vous voulez ajouter:'; -$lang['new_required_attrs_note'] = 'Note: vous aurez peut-êre besoin d\'introduire de nouveaux attributs requis pour cette classe d\'objet'; +$lang['values_for_attribute'] = 'valeur(s) pour l\'attribut'; +$lang['inappropriate_matching_note'] = 'Note : vous obtiendrez une erreur « correspondance innapropriée » si vous n\'avez pas défini de règle d\'égalité sur votre serveur LDAP pour cette attribut.'; +$lang['enter_value_to_add'] = 'Saisissez la valeur que vous voulez ajouter :'; +$lang['new_required_attrs_note'] = 'Note : il peut vous être demandé de saisir les nouveaux attributs requis par ces objectClass'; $lang['syntax'] = 'Syntaxe'; -//Copy.php -$lang['copy_server_read_only'] = 'Des mises à jours ne peuvent pas être effectuées si le serveur est en lecture seule'; -$lang['copy_dest_dn_blank'] = 'Vous avez laissé le DN de destination vide.'; -$lang['copy_dest_already_exists'] = 'L\'entrée de destination (%s) existe déjà.'; +//copy.php +$lang['copy_server_read_only'] = 'Vous ne pouvez faire de mises à jour tantq ue le serveur est en lecture seule'; +$lang['copy_dest_dn_blank'] = 'Vopus avez laissé le DN de destination vide.'; +$lang['copy_dest_already_exists'] = 'L\'entrée de destination (%s)existe déjà.'; $lang['copy_dest_container_does_not_exist'] = 'Le conteneur de destination (%s) n\'existe pas.'; -$lang['copy_source_dest_dn_same'] = 'Le DN d\'origine et le DN de destination sont identiques.'; +$lang['copy_source_dest_dn_same'] = 'Les DN source et destination sont les mêmes.'; $lang['copy_copying'] = 'Copie '; -$lang['copy_recursive_copy_progress'] = 'Progression de la copie récursive'; -$lang['copy_building_snapshot'] = 'Construction de l\'image de l\'arborscence à copier... '; -$lang['copy_successful_like_to'] = 'Copie réussite! Voulez-vous '; -$lang['copy_view_new_entry'] = 'éditer cette nouvelle entrée'; -$lang['copy_failed'] = 'Echec lors de la copie de: '; +$lang['copy_recursive_copy_progress'] = 'progression de la copie récursive'; +$lang['copy_building_snapshot'] = 'Construction d\'un instantané de l\'arborescence à copier... '; +$lang['copy_successful_like_to'] = 'Copie avec succès ! Voulez-vous '; +$lang['copy_view_new_entry'] = 'afficher la nouvelle entrée'; +$lang['copy_failed'] = 'La copie du DN a échoué : '; //edit.php -$lang['missing_template_file'] = 'Avertissement: le fichier modèle est manquant, '; -$lang['using_default'] = 'Utilisation du modèle par défaut.'; +$lang['missing_template_file'] = 'Avertissement : fichier modèle manquant, '; +$lang['using_default'] = 'Utilisant les valeurs par défaut.'; $lang['template'] = 'Modèle'; $lang['must_choose_template'] = 'Vous devez choisir un modèle'; -$lang['invalid_template'] = '%s est un modèle non valide'; -$lang['using_template'] = 'Utilisation du modèle'; -$lang['go_to_dn'] = 'Aller à %s'; -$lang['structural_object_class_cannot_remove'] = 'Ceci est une \'objectclass\' de type structurelle et ne peut etre supprimé.'; -$lang['structural'] = 'structurelle'; - - - +$lang['invalid_template'] = '%s n\'est pas un modèle valide'; +$lang['using_template'] = 'en utilisant le modèle'; +$lang['go_to_dn'] = 'Aller vers %s'; +$lang['structural_object_class_cannot_remove'] = 'C\'est un ObjectClass structurel et il ne peut être supprimé.'; +$lang['structural'] = 'structurel'; //copy_form.php -$lang['copyf_title_copy'] = 'Copie de '; +$lang['copyf_title_copy'] = 'Copie '; $lang['copyf_to_new_object'] = 'vers un nouvel objet'; $lang['copyf_dest_dn'] = 'DN de destination'; -$lang['copyf_dest_dn_tooltip'] = 'Le DN de la nouvelle entrée à créer lors de la copie de l\'entrée source'; -$lang['copyf_dest_server'] = 'Destination Serveur'; -$lang['copyf_note'] = 'Note: La copie entre différents serveurs fonctionne seulement si il n\'y a pas de violation de schéma'; -$lang['copyf_recursive_copy'] = 'Copier récursivement les sous-entrées de cet object.'; +$lang['copyf_dest_dn_tooltip'] = 'Le DN complet de la nouvelle entrée a créer lors de la copie de l\'entrée source'; +$lang['copyf_dest_server'] = 'Serveur de destination'; +$lang['copyf_note'] = 'Astuce : la copie entre différents serveurs ne fonctionne que si il n\'y a aucune violations de schéma'; +$lang['copyf_recursive_copy'] = 'Copie récursive de toutes les sous-entrées de cet objet.'; $lang['recursive_copy'] = 'Copie récursive'; $lang['filter'] = 'Filtre'; -$lang['filter_tooltip'] = 'Lors d\'une copie récursive, seuls les entrées correspondant à ce filtre seront copiés'; -$lang['delete_after_copy'] = 'Suppresion après copie (déplacer):'; -$lang['delete_after_copy_warn'] = 'Soyez certain que votre filtre (ci-dessus) selectionnera tous les enregistrements enfants.'; - +$lang['filter_tooltip'] = 'Lors de la copie récursive, ne copier que les entrées qui correspondent à ce filtre'; +$lang['delete_after_copy'] = 'Supprimer après la copie (déplacement) :'; +$lang['delete_after_copy_warn'] = 'Veuillez vous assurer que vos filtres (ci-dessus) sélectionneront tous les enregistrements fils.'; //create.php -$lang['create_required_attribute'] = 'Une valeur n\'a pas été spécifiée pour l\'attribut requis %s.'; -$lang['redirecting'] = 'Redirection'; +$lang['create_required_attribute'] = 'Vous avez laissez une valeur blanche pour l\'attribut requis (%s).'; +$lang['redirecting'] = 'Redirection...'; $lang['here'] = 'ici'; -$lang['create_could_not_add'] = 'L\'ajout de l\'objet au serveur LDAP n\'a pu être effectuée.'; -$lang['rdn_field_blank'] = 'Vous avez laissé le champ du RDN vide.'; -$lang['container_does_not_exist'] = 'Le containeur que vous avez spécifié (%s) n\'existe pas. Veuillez, s\'il vous plaît recommencer.'; -$lang['no_objectclasses_selected'] = 'Vous n\'avez sélectionner aucun ObjectClasses pour cet objet. Veuillez s\'il vous plaît retourner à la page précédente et le faire.'; -$lang['hint_structural_oclass'] = 'Note: Vous devez choisir au moins une classe d\'objet de type structural'; +$lang['create_could_not_add'] = 'Impossible d\'ajouter l\'objet au serveur LDAP.'; //create_form.php -$lang['createf_create_object'] = 'Creation d\'un objet'; -$lang['createf_choose_temp'] = 'Choix d\'un modèle'; -$lang['createf_select_temp'] = 'Selectionner un modèle pour la procédure de création'; -$lang['save_as_file'] = 'Sauvegarder en tant que fichier'; -$lang['createf_proceed'] = 'Continuer'; -$lang['relative_distinguished_name'] = 'Relative Distinguished Name'; -$lang['rdn'] = 'RDN'; -$lang['rdn_example'] = '(exemple: cn=MyNewPerson)'; -$lang['container'] = 'Containeur'; -$lang['alias_for'] = 'Alias pour %s'; - +$lang['createf_create_object'] = 'Créer un objet'; +$lang['createf_choose_temp'] = 'Choisissez un modèle'; +$lang['createf_select_temp'] = 'Sélectionner un modèle pour le processus de création'; +$lang['save_as_file'] = 'Enregistrer dans un fichier'; +$lang['rdn_field_blank'] = 'Vous avez laissé le champ RDN vide.'; +$lang['container_does_not_exist'] = 'Le conteneur que vous avez spécifié (%s) n\'existe pas. Veuillez essayer de nouveau.'; +$lang['no_objectclasses_selected'] = 'Vous n\'avez pas sélectionné d\'objectClass pour cet objet. Veuillez revenir et le faire.'; +$lang['hint_structural_oclass'] = 'Astuce : vous devez choisir un seul objectClass structurel (affiché en gras ci-dessus)'; +$lang['template_restricted'] = 'Ce modèle n\'est pas autorisé dans ce conteneur.'; +$lang['template_invalid'] = 'Ce modèle a été désactivé, cela est sûrement du à un schéma manquant ou à des champs manquants dans le modèle XML.'; //creation_template.php $lang['ctemplate_on_server'] = 'Sur le serveur'; $lang['ctemplate_no_template'] = 'Aucun modèle spécifié dans les variables POST.'; -$lang['template_not_readable'] = 'Votre fichier de configuration définit un gestionnaire de "%s" pour ce \'template\' mais ce fichier ne possède pas les droits de lecture.'; -$lang['template_does_not_exist'] = 'Votre fichier de configuration définit un gestionnaire de "%s" pour ce \'template\' mais le gestionnaire n\'existe pas dans le répertoire templates/creation.'; -$lang['ctemplate_config_handler'] = 'Votre configuration scécifie un gestionnaire de'; -$lang['ctemplate_handler_does_not_exist'] = 'pour ce modèle. Cependant, ce gestionnaire n\'existe pas dans le répertoire \'templates/creation\'.'; -$lang['create_step1'] = 'Etape 1 de 2: Nom et classes d\'objet'; -$lang['create_step2'] = 'Etape 2 de 2: Définition des attributs et de leurs valeurs'; -//search.php -$lang['you_have_not_logged_into_server'] = 'Vous ne vous êtes pas encore loggé auprès du serveur sélectionné. Vous ne pouvez y effectuer des recherches.'; -$lang['click_to_go_to_login_form'] = 'Cliquer ici pour vous rendre au formulaire de login'; -$lang['unrecognized_criteria_option'] = 'Critère non reconnu: '; -$lang['if_you_want_to_add_criteria'] = 'Si vous voulez ajouter vos propres critère à la liste, soyez cetain d\'éditer search.php afin de pouvoir les gérer.'; -$lang['entries_found'] = 'Entrées trouvées: '; -$lang['filter_performed'] = 'Filtre utilisé: '; -$lang['search_duration'] = 'Recherche effectuée par phpLDAPadmin en'; +$lang['template_not_readable'] = 'Votre configuration spécifie un gestionnaire de « %s » pour ce modèle mais le fichier n\'est pas lisible car les permissions sont trop strictes..'; +$lang['template_does_not_exist'] = 'Votre configuration spécifie un gestionnaire de « %s » pour ce modèle mais ce gestionnaire n\'existe pas dans le répertoire de modèles/création.'; +$lang['create_step1'] = 'Étape 1 of 2 : nom et ObjectClass'; +$lang['create_step2'] = 'Étape 2 of 2 : spécifie les attributs et valeur'; +$lang['relative_distinguished_name'] = 'Nom distingué relatif'; +$lang['rdn'] = 'RDN'; +$lang['rdn_example'] = '(exemple : cn=MaNouvellePersonne)'; +$lang['container'] = 'Conteneur'; + +// search.php +$lang['you_have_not_logged_into_server'] = 'Vous n\'êtes pas encore connecté au serveur sélectionné, vous ne pouvez pas effectuer de recherche dessus.'; +$lang['click_to_go_to_login_form'] = 'Cliquez ici pour aller au formulaire de connexion'; +$lang['unrecognized_criteria_option'] = 'Option de critère non reconnue : '; +$lang['if_you_want_to_add_criteria'] = 'Si vous voulez ajouter vos propres critères dans la liste. Veuillez vous assurer d\'éditer search.php pour les gérer. Quitte.'; +$lang['entries_found'] = 'Entrées trouvées : '; +$lang['filter_performed'] = 'Filtrage effectué : '; +$lang['search_duration'] = 'Recherche effectuée par phpLDAPadmin dans'; $lang['seconds'] = 'secondes'; // search_form_advanced.php -$lang['scope_in_which_to_search'] = 'Portée de la recherche'; -$lang['scope_sub'] = 'Sub (le sous-arbre)'; -$lang['scope_one'] = 'One (un niveau sous la base)'; -$lang['scope_base'] = 'Base (le dn de base)'; -$lang['standard_ldap_search_filter'] = 'Un filtre standard de recherche LDAP. Exemple: (&(sn=Smith)(givenname=David))'; -$lang['search_filter'] = 'Filtre pour la recherche'; -$lang['list_of_attrs_to_display_in_results'] = 'Une liste des attributs à afficher dans les résultats(séparés par des virgules)'; -$lang['show_attributes'] = 'Attributs à afficher'; +$lang['scope_in_which_to_search'] = 'La portée dans laquelle effectuer la recherche'; +$lang['scope_sub'] = 'Sub (sous-arborescence entière)'; +$lang['scope_one'] = 'One (un niveau au-dessous de la base)'; +$lang['scope_base'] = 'Base (dn de base seulement)'; +$lang['standard_ldap_search_filter'] = 'Filtre de recherche LDAAP standard. Exemple : (&(sn=Smith)(givenname=David))'; +$lang['search_filter'] = 'Filtre de recherche'; +$lang['list_of_attrs_to_display_in_results'] = 'Une liste d\'attributs à afficher dans le résultat (séparé par des virgules)'; // search_form_simple.php -$lang['search_for_entries_whose'] = 'Chercher les entrées dont:'; -$lang['equals'] = 'est egal à;'; +$lang['equals'] = 'est égal à'; $lang['starts with'] = 'commence par'; $lang['contains'] = 'contient'; $lang['ends with'] = 'se termine par'; $lang['sounds like'] = 'ressemble à'; // server_info.php -$lang['could_not_fetch_server_info'] = 'Impossible de récupérer les informations concernant le serveur Ldap'; -$lang['server_info_for'] = 'Informations pour le serveur: '; -$lang['server_reports_following'] = 'Le serveur a rapporté les informations suivantes'; -$lang['nothing_to_report'] = 'Ce serveur n\'a aucunes informations a rapporter.'; +$lang['could_not_fetch_server_info'] = 'Impossible de récupérer les informations LDAP depuis le serveur. Ceci est sans doute du à une anomalie dans votre version de PHP ou peut-être que votre serveur LDAP a un contrôle d\'accès défini qui empèche les clients LDAP d\'accéder au RootDSE.'; +$lang['server_info_for'] = 'Info serveur pour : '; +$lang['server_reports_following'] = 'Le serveur rapporte les informations suivantes à propos de lui-même'; +$lang['nothing_to_report'] = 'Ce serveur n\'a rien à rapporter.'; //update.php -$lang['update_array_malformed'] = 'update_array n\'est pas bien formé. Ceci est peut-être un bogue de phpLDAPadmin. Pourriez-vous effectuer un rapport de bogue, s\'il vous plaît.'; -$lang['could_not_perform_ldap_modify'] = 'L\'opération ldap_modify n\'a pu être effectuée.'; +$lang['update_array_malformed'] = 'update_array est malformé. C\'est peut-être une anomalie de phpLDAPadmin. Veuillez la rapporter.'; +$lang['could_not_perform_ldap_modify'] = 'Impossible d\'effectuer une opération ldap_modify.'; // update_confirm.php -$lang['do_you_want_to_make_these_changes'] = 'Voulez-vous effectuer ces changements?'; +$lang['do_you_want_to_make_these_changes'] = 'Voulez-vous effectuer ces modifications ?'; $lang['attribute'] = 'Attribut'; -$lang['old_value'] = 'Ancienne Valeur'; -$lang['new_value'] = 'Nouvelle Valeur'; +$lang['old_value'] = 'Ancienne valeur'; +$lang['new_value'] = 'Nouvelle valeur'; $lang['attr_deleted'] = '[attribut supprimé]'; $lang['commit'] = 'Valider'; $lang['cancel'] = 'Annuler'; -$lang['you_made_no_changes'] = 'Aucun changement n\'a été effectué'; -$lang['go_back'] = 'Retour'; -$lang['unable_create_samba_pass'] = 'Impossible de créer le mot de passe samba. Veuillez vérifiez votre configuration dans le fichier template_config.php'; +$lang['you_made_no_changes'] = 'Vous n\'avez fait aucune modification'; +$lang['go_back'] = 'Revenir'; +$lang['unable_create_samba_pass'] = 'Impossible de créer le mot de passe Samba. Veuillez vérifier votre configuration dans template_config.php'; // welcome.php -$lang['welcome_note'] = 'Utilisez le menu de gauche pour la navigation'; +$lang['welcome_note'] = 'Utiliser le menu de gauche pour naviguer'; $lang['credits'] = 'Crédits'; $lang['changelog'] = 'ChangeLog'; +$lang['documentation'] = 'Documentation'; $lang['donate'] = 'Donation'; -$lang['pla_logo'] = 'phpLDAPadmin logo'; - +$lang['pla_logo'] = 'Logo phpLDAPadmim'; // Donate.php -$lang['donation_instructions'] = 'Pour effectuer une doantion au projet phpLDAadmin, veuillez utilisez un des boutons PayPal ci-dessous.'; +$lang['donation_instructions'] = 'Pour contribuer financièrement au projet phpLDAPadmin, utilisez un des boutons PayPal ci-dessous.'; $lang['donate_amount'] = 'Donner %s'; -$lang['purge_cache'] = 'Vider la cache'; -$lang['no_cache_to_purge'] = 'Aucune cache à vider.'; -$lang['done_purging_caches'] = 'Suppression de %s octets de la cache.'; -$lang['purge_cache_tooltip'] = 'Supprimer toutes les données en cache dans phpLDAPadmin, y compris les schemas serveur.'; + +$lang['purge_cache'] = 'Purger les caches'; +$lang['no_cache_to_purge'] = 'Aucun cache à purger.'; +$lang['done_purging_caches'] = '%s octets de cache purgés.'; +$lang['purge_cache_tooltip'] = 'Purge toutes les données cachées dans phpLDAPadmin, incluant les schémas de serveur.'; // view_jpeg_photo.php -$lang['unsafe_file_name'] = 'Nom de fichier non sûr: '; -$lang['no_such_file'] = 'Aucun fichier trouvé: '; +$lang['unsafe_file_name'] = 'Nom de fichier non sûr : '; +$lang['no_such_file'] = 'Pas de tel fichier : '; //function.php -$lang['auto_update_not_setup'] = '"auto_uid_numbers" a été activé pour %s dans votre configuration, - mais vous n\'avez pas spécifié le mécanisme "auto_uid_number_mechanism". Veuiller corriger +$lang['auto_update_not_setup'] = 'Vous avez activé auto_uid_numbers pour %s dans votre configuration, + mais vous n\'avez pas spécifié de mécanisme auto_uid_number_mechanism. Veuillez corriger ce problème.'; -$lang['uidpool_not_set'] = 'Vous avez spécifié lauto_uid_number_mechanism comme uidpool - dans la configuration du serveur %s, mais vous n\'avez pas spécifié de valeur pour - auto_uid_number_uid_pool_dn. Veuillez le spécifier avant de continuer.'; -$lang['uidpool_not_exist'] = 'Le uidPool que vous avez spécifié dans votre configuration (%s) +$lang['uidpool_not_set'] = 'Vous avez défini « auto_uid_number_mechanism » comme « uidpool » + dans votre configuration pour le serveur %s, mais vous n\'avez pas spécifié le + auto_uid_number_uid_pool_dn. Veuillez le spécifier avant de procéder.'; +$lang['uidpool_not_exist'] = 'Il semble que le uidPool que vous avez spécifié dans votre configuration (« %s ») n\'existe pas.'; -$lang['specified_uidpool'] = 'Le méchanisme "auto_uid_number_mechanism" a été défini à search dans votre - configuration pour le serveur %s, mais la directive "auto_uid_number_search_base" n\'est pad définie. Veuillez le spécifier avant de continuer.'; -$lang['auto_uid_invalid_credential'] = 'Impossible d\'effectuer un "bind" à %s avec vos droits pour "auto_uid". Veuillez S\'il vous plaît vérifier votre fichier de configuration.'; -$lang['bad_auto_uid_search_base'] = 'Votre fichier de configuration spécifie un invalide auto_uid_search_base pour le serveur %s'; -$lang['auto_uid_invalid_value'] = 'Une valeur non valide a été spécifiée pour le méchaninsme "auto_uid_number_mechanism" (%s) - dans votre configuration. Seul uidpool et search sont valides. +$lang['specified_uidpool'] = 'Vous avez spécifié le « auto_uid_number_mechanism » comme « search » dans votre + configuration du serveur %s, mais vous n\'avez pas spécifié le + « auto_uid_number_search_base ». Veuillez le spécifier avant de procéder.'; +$lang['auto_uid_invalid_credential'] = 'Incapable de se connecter à %s avec votre crédentiel auto_uid . Veuillez vérifier votre fichier de configuration.'; +$lang['bad_auto_uid_search_base'] = 'Votre configuration de phpLDAPadmin spécifie un auto_uid_search_base non valide pour le serveur %s'; +$lang['auto_uid_invalid_value'] = 'Vous avez spécifié une valeur non valide pour pour auto_uid_number_mechanism ("%s") + dans votre configuration. Seul « uidpool » et « search » sont valides. Veuillez corriger ce problème.'; -$lang['error_auth_type_config'] = 'Erreur: Vous avez une erreur dans votre fichier de configuration.Les valeurs - supportées pour \'auth_type\' sont \'config\' et \'form\' dans la section $servers. - Vous avez mis \'%s\', ce qui n\'est pas autorisé.'; -$lang['php_install_not_supports_tls'] = 'Votre installation PHP ne supporte pas TLS.'; -$lang['could_not_start_tls'] = 'Impossible de démarrer TLS.
Veuillez,s\'il vous plaît, vérifier la configuration de votre serveur LDAP.'; -$lang['could_not_bind_anon'] = 'Impossible d\'effectuer un "bind" anonyme.'; -$lang['anonymous_bind'] = 'Bind Anonyme'; -$lang['bad_user_name_or_password'] = 'Mauvais nom d\'utilisateur ou mot de passe. Veuillez recommencer s\'il vous plaît.'; -$lang['redirecting_click_if_nothing_happens'] = 'Redirection... Cliquez ici si rien ne se passe.'; -$lang['successfully_logged_in_to_server'] = 'Login réussi sur le serveur %s'; -$lang['could_not_set_cookie'] = 'Impossible d\'activer les cookies.'; -$lang['ldap_said'] = 'LDAP said: %s

'; +$lang['error_auth_type_config'] = 'Erreur : Vous avez une erreur dans votre fichier de configuration. Les seuls trois valeurs autorisées + pour auth_type dans la section $servers sont « session », « cookie », et « config ». Vous avez saisi « %s », + qui n\'est pas autorisée. '; +$lang['unique_attrs_invalid_credential'] = 'Impossible de se connecter à %s avec votre crédentiel unique_attrs. Veuillez vérifier votre fichier de configuration.'; +$lang['unique_attr_failed'] = 'Votre tentative d\'ajouter %s (%s) à
%s
n\'est pas autorisée. Cet attribut/valeur appartient à une autre entrée.

Vous souhaitez rechercher cette entrée.'; +$lang['php_install_not_supports_tls'] = 'Votre installation de PHP ne supporte pas TLS.'; +$lang['could_not_start_tls'] = 'Impossible de démarrer TLS. Veuillez vérifier la configuration de votre serveur LDAP.'; +$lang['could_not_bind_anon'] = 'Impossible de se connecter anonymement au serveur.'; +$lang['could_not_bind'] = 'Impossible de se connecter au serveur LDAP.'; +$lang['anonymous_bind'] = 'Connexion anonyme'; +$lang['bad_user_name_or_password'] = 'Mauvais nom d\'utilisateur ou mot de passe. Veuillez réessayer.'; +$lang['successfully_logged_in_to_server'] = 'Connexion au serveur %s avec succès'; +$lang['could_not_set_cookie'] = 'Impossible de définir le cookie.'; +$lang['ldap_said'] = 'LDAP dit : %s'; $lang['ferror_error'] = 'Erreur'; -$lang['fbrowse'] = 'naviguer'; +$lang['fbrowse'] = 'parcourir'; $lang['delete_photo'] = 'Supprimer la photo'; -$lang['install_not_support_blowfish'] = 'Votre installation PHP ne support pas l\'encryption blowfish.'; -$lang['install_no_mash'] = 'Votre installation PHP ne supporte pas la fonction mhash(). Impossible de créer un hash SHA.'; +$lang['install_not_support_ext_des'] = 'Votre bibliothèque système crypt ne supporte pas le chiffrement DES étendu.'; +$lang['install_not_support_blowfish'] = 'Votre bibliothèque système crypt ne supporte pas le chiffrement blowfish.'; +$lang['install_not_support_md5crypt'] = 'Votre bibliothèque système crypt ne supporte pas le chiffrement md5crypt.'; +$lang['install_no_mash'] = 'Votre installation PHP n\'a pas de fonction mhash(). Impossible de faire de signature SHA.'; $lang['jpeg_contains_errors'] = 'jpegPhoto contient des erreurs
'; -$lang['ferror_number'] = 'Numéro de l\'erreur: %s (%s)

'; -$lang['ferror_discription'] = 'Description: %s

'; -$lang['ferror_number_short'] = 'Numé de l\'erreur: %s

'; -$lang['ferror_discription_short'] = 'Description: (pas de description disponible)
'; -$lang['ferror_submit_bug'] = 'Est-ce un bogue de phpLDAPadmin? Si c\'est le cas,veuillez s\'il vous plaît le rapporter.'; -$lang['ferror_unrecognized_num'] = 'Numéro de l\'erreur non reconnu: '; +$lang['ferror_number'] = 'Erreur numéro : %s (%s)'; +$lang['ferror_discription'] = 'Description : %s

'; +$lang['ferror_number_short'] = 'Erreur numéro : %s

'; +$lang['ferror_discription_short'] = 'Description : (aucune description disponible)
'; +$lang['ferror_submit_bug'] = 'Est-ce une anomalie phpLDAPadmin ? Si c\'est le cas, veuillez la rapporter.'; +$lang['ferror_unrecognized_num'] = 'Numéro d\'erreur non reconnu: '; $lang['ferror_nonfatil_bug'] = '

B³±d:%s
-
- Vous avez trouvé un bogue non fatal dans phpLDAPAdmin!
Erreur:%s (%s)
Fichier:%s ligne %s, origine de l\'appel %s
Versions:PLA: %s, PHP: %s, SAPI: %s -
Serveur Web:%s
- S\'il vous plaît, veuillez rapporter ce bogue en cliquant ici.

'; -$lang['ferror_congrats_found_bug'] = 'Félicitations! Vous avez trouvé un bogue dans phpLDAPadmin.

+ Vous avez trouvé une anomalie phpLDAPadmin non fatale !Erreur :%s (%s)Fichier : + %s ligne %s, appelant %sVersions :PLA : %s, PHP : %s, SAPI : %s + Serveur Web :%s +
Veuillez vérifier et voir si cette anomalie a déjà été rapportée ici.
+
Si elle n\'a pas été rapportée, vous pouver rapporter cette anomalie en cliquant ici.
+
'; +$lang['ferror_congrats_found_bug'] = 'Félicitations ! Vous avez trouvé une anomalie dans phpLDAPadmin.

- - - - - - - - - + + + + + + + + +
Erreur:%s
Niveau:%s
Fichier:%s
Ligne:%s
Origine de l\'appel:%s
PLA Version:%s
PHP Version:%s
PHP SAPI:%s
Serveur Webr:%s
Erreur :%s
Niveau :%s
Fichier :%s
Ligne :%s
Appelant :%s
Version PLA :%s
Version PHP :%s
SAPI PHP :%s
Serveur Web :%s

- S\'il vous plaît, veuillez rapporter ce bogue en cliquant ici!'; + Veuillez rapporter cette anomalie en cliquant ci-dessous !'; //ldif_import_form -$lang['import_ldif_file_title'] = 'Import de fichier LDIF'; -$lang['select_ldif_file'] = 'Sélectionner un fichier LDIF:'; -$lang['select_ldif_file_proceed'] = 'Continuer >>'; +$lang['import_ldif_file_title'] = 'Importer un fichier LDIF'; +$lang['select_ldif_file'] = 'Sélectionner un fichier LDIF :'; +$lang['dont_stop_on_errors'] = 'Ne pas vous arrêter sur les erreurs'; -//lldif_import -$lang['add_action'] = 'Ajout de...'; -$lang['delete_action'] = 'Supression de...'; -$lang['rename_action'] = 'Renommage de...'; -$lang['modify_action'] = 'Modification de...'; -$lang['warning_no_ldif_version_found'] = 'Aucun numéro de version trouvé. Version 1 supposé.'; -$lang['valid_dn_line_required'] = 'Une ligne avec un dn valide est requis.'; -$lang['valid_dn_line_required'] = 'A valid dn line is required.'; -$lang['missing_uploaded_file'] = 'Le fichier est manquant.'; -$lang['no_ldif_file_specified.'] = 'Aucun fichier LDIFspécifié. Veuillez réessayer, s\'il vous plaît.'; -$lang['ldif_file_empty'] = 'Le fichier LDIF est vide.'; +//ldif_import +$lang['add_action'] = 'Ajout...'; +$lang['delete_action'] = 'Suppression...'; +$lang['rename_action'] = 'Renommage...'; +$lang['modify_action'] = 'Modification...'; +$lang['warning_no_ldif_version_found'] = 'Aucune version trouvé. Assume 1.'; +$lang['valid_dn_line_required'] = 'Une ligne dn valide est requise.'; +$lang['missing_uploaded_file'] = 'Fichier téléchargé manquant.'; +$lang['no_ldif_file_specified'] = 'Aucun fichier LDIF spécifié. Veuillez essayer de nouveau.'; +$lang['ldif_file_empty'] = 'Le fichier LDIF téléchargé est manquant.'; +$lang['empty'] = 'vide'; $lang['file'] = 'Fichier'; -$lang['number_bytes'] = '%s bytes'; +$lang['number_bytes'] = '%s octets'; -$lang['failed'] = 'échec'; -$lang['ldif_parse_error'] = 'Erreur lors de l\'analyse du fichier LDIF'; -$lang['ldif_could_not_add_object'] = 'Impossible d\'ajouter l\'objet:'; -$lang['ldif_could_not_rename_object'] = 'Impossible de renommer l\'objet:'; -$lang['ldif_could_not_delete_object'] = 'Impossible de supprimer l\'objet:'; -$lang['ldif_could_not_modify_object'] = 'Impossible de modifier l\'objet:'; -$lang['ldif_line_number'] = 'Numéro de ligne'; -$lang['ldif_line'] = 'Ligne'; - -//delete_form -$lang['sure_permanent_delete_object']='Etes-vous certain de vouloir supprimer définitivement cet objet?'; -$lang['list_of_entries_to_be_deleted'] = 'Liste des entrées à supprimer:'; -$lang['dn'] = 'DN'; +$lang['failed'] = 'Échoue'; +$lang['ldif_parse_error'] = 'Erreur d\'analyse LDIF'; +$lang['ldif_could_not_add_object'] = 'Impossible d\'ajouter un objet :'; +$lang['ldif_could_not_rename_object'] = 'Impossible de renommer l\'objet :'; +$lang['ldif_could_not_delete_object'] = 'Impossible de supprimer l\'objet :'; +$lang['ldif_could_not_modify_object'] = 'Impossible de modifier l\'objet :'; +$lang['ldif_line_number'] = 'Numéro de ligne :'; +$lang['ldif_line'] = 'Ligne :'; // Exports -$lang['export_format'] = 'Format'; -$lang['line_ends'] = 'Fin de ligne'; -$lang['must_choose_export_format'] = 'Vous devez sélectionner un format pour l\'exportation.'; -$lang['invalid_export_format'] = 'Format d\'exportation invalide'; -$lang['no_exporter_found'] = 'Aucun exporteur trouvé.'; -$lang['error_performing_search'] = 'Une erreur a eu lieu lors de la recherche.'; -$lang['showing_results_x_through_y'] = 'Affichage de %s à %s des résultats.'; -$lang['searching'] = 'Recherche...'; -$lang['size_limit_exceeded'] = 'Notice, la limite de taille pour la recherche est atteinte.'; +$lang['export_format'] = 'Format d\'exportation'; +$lang['line_ends'] = 'Les lignes se finissent par'; +$lang['must_choose_export_format'] = 'Vous devez choisir un format d\'exportation.'; +$lang['invalid_export_format'] = 'Format d\'exportation non valide'; +$lang['no_exporter_found'] = 'Aucun filtre d\'exportation trouvé.'; +$lang['error_performing_search'] = 'Une erreur est survenue lors de la recherche.'; +$lang['showing_results_x_through_y'] = 'Affichage des résultats %s à %s.'; +$lang['searching'] = 'Recherche en cours...'; +$lang['size_limit_exceeded'] = 'Attention, la taille limite de recherche est dépassée.'; $lang['entry'] = 'Entrée'; -$lang['ldif_export_for_dn'] = 'Export LDIF pour: %s'; -$lang['generated_on_date'] = 'Generé par phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) le %s'; -$lang['total_entries'] = 'Nombre d\'entrées'; -$lang['dsml_export_for_dn'] = 'Export DSML pour: %s'; - +$lang['ldif_export_for_dn'] = 'Exportation LDIF pour : %s'; +$lang['generated_on_date'] = 'Généré par phpLDAPadmin ( http://phpldapadmin.sourceforge.net/ ) pour %s'; +$lang['total_entries'] = 'Entrées totales'; +$lang['dsml_export_for_dn'] = 'Exportation DSLM pour : %s'; +$lang['include_system_attrs'] = 'Inclure les attributs système'; +$lang['csv_spreadsheet'] = 'CSV (feuille de calcul)'; // logins -$lang['could_not_find_user'] = 'Impossible de trouver l\'utilisateur "%s"'; -$lang['password_blank'] = 'Le champ pour le mot de passe est vide.'; -$lang['login_cancelled'] = 'Login interrompu.'; -$lang['no_one_logged_in'] = 'Personne n\'est loggé à ce serveur.'; +$lang['password_blank'] = 'Vous avez laissé le mot de passe vide.'; +$lang['no_one_logged_in'] = 'Personne n\'est connecté sur ce serveur.'; $lang['could_not_logout'] = 'Impossible de se déconnecter.'; -$lang['unknown_auth_type'] = 'auth_type inconnu: %s'; -$lang['logged_out_successfully'] = 'Déconnection réussie du serveur %s'; -$lang['authenticate_to_server'] = 'Authentification au serveur %s'; -$lang['warning_this_web_connection_is_unencrypted'] = 'Attention: Cette connection web n\'est pas cryptée.'; -$lang['not_using_https'] = 'Vous n\'utilisez pas \'https\'. Le navigateur web transmettra les informations de login en clair.'; -$lang['login_dn'] = 'Login DN'; -$lang['user_name'] = 'Nom de l\'utilisateur'; +$lang['unknown_auth_type'] = 'auth_type inconnu : %s'; +$lang['logged_out_successfully'] = 'Déconnexion du serveur avec succès %s'; +$lang['authenticate_to_server'] = 'Authentification auprès du serveur %s'; +$lang['warning_this_web_connection_is_unencrypted'] = 'Avertissement : la connexion Web n\'est pas chiffré.'; +$lang['not_using_https'] = 'Vous n\'utilisez pas « https ». Le navigateur Web transmettra les informations de connexion en clair.'; +$lang['login_dn'] = 'DN de connexion'; +$lang['user_name'] = 'Nom d\'utilisateur'; $lang['password'] = 'Mot de passe'; $lang['authenticate'] = 'Authentification'; +$lang['login_not_allowed'] = 'Désolé, vous n\'êtes pas autorisé à utiliser phpLDAPadmin avec ce serveur LDAP.'; // Entry browser -$lang['entry_chooser_title'] = 'Sélection de l\'entrée'; +$lang['entry_chooser_title'] = 'Sélecteur d\'entrées'; // Index page -$lang['need_to_configure'] = 'phpLDAPadmin a besoin d\'être configuré.Pour cela, éditer le fichier \'config.php\' . Un exemple de fichier de configuration est fourni dans \'config.php.example\''; +$lang['need_to_configure'] = 'Vous avez besoin de configurer phpLDAPadmin. Éditez le fichier « config.php » pour le faire. un exemple de fichier de configuration est fournit dans « config.php.example »'; // Mass deletes -$lang['no_deletes_in_read_only'] = 'Les suppressions ne sont pas permises en mode lecure seule.'; -$lang['error_calling_mass_delete'] = 'Erreur lors de l\'appel à mass_delete.php. mass_delete est manquant dans les variables POST.'; -$lang['mass_delete_not_array'] = 'La variable POST mass_delete \'est pas un tableau.'; -$lang['mass_delete_not_enabled'] = 'La suppression de masse n\'est pas disponible. Veuillez l\'activer dans config.php avant de continuer.'; -$lang['mass_deleting'] = 'Suppression en masse'; -$lang['mass_delete_progress'] = 'Progrès de la suppression sur le serveur "%s"'; -$lang['malformed_mass_delete_array'] = 'Le tableau mass_delete n\'est pas bien formé.'; -$lang['no_entries_to_delete'] = 'Vous n\'avez sélectionné aucune entrées à effacer.'; -$lang['deleting_dn'] = 'Deleting %s'; -$lang['total_entries_failed'] = '%s des %s entrées n\'ont pu être supprimées.'; +$lang['no_deletes_in_read_only'] = 'Supprimer n\'est pas autorisé en lecture seule.'; +$lang['error_calling_mass_delete'] = 'Erreur lors de l\'applel de mass_delete.php. Il manque mass_delete dans les variables POST.'; +$lang['mass_delete_not_array'] = 'La variable POST mass_delete n\'est pas un tableau.'; +$lang['mass_delete_not_enabled'] = 'La suppression de masse n\'est pas activé. Veuillez l\'activer dans config.php avant de procéder.'; +$lang['mass_deleting'] = 'Suppression de masse'; +$lang['mass_delete_progress'] = 'Progression de la suppression sur le serveur « %s »'; +$lang['malformed_mass_delete_array'] = 'Tableau mass_delete malformé.'; +$lang['no_entries_to_delete'] = 'Vous n\'avez sélectionné aucune entrées à supprimer.'; +$lang['deleting_dn'] = 'Suppression de %s'; +$lang['total_entries_failed'] = '%s sur %s entrées n\'ont pu être effacées.'; $lang['all_entries_successful'] = 'Toutes les entrées ont été supprimées avec succès.'; -$lang['confirm_mass_delete'] = 'Confirmation de la suppression en masse de %s entrées sur le serveur %s'; -$lang['yes_delete'] = 'Oui, supprimer!'; +$lang['confirm_mass_delete'] = 'Confirmer la suppression de masse de %s entrées sur le serveur %s'; +$lang['yes_delete'] = 'Oui, supprimer !'; // Renaming entries -$lang['non_leaf_nodes_cannot_be_renamed'] = 'Vous ne pouvez pas renommer une entrée qui a des sous-entrées'; -$lang['no_rdn_change'] = 'Le RDN n\'a pas été modifié'; -$lang['invalid_rdn'] = 'Valeur invalide du RDN'; +$lang['non_leaf_nodes_cannot_be_renamed'] = 'Vous ne pouvez renommer une entrée qui a des sous-entrées (cad, l\'opération de renommage n\'est pas autorisé sur des entrées non terminales)'; +$lang['no_rdn_change'] = 'Vous n\'avez pas modifié le RDN'; +$lang['invalid_rdn'] = 'Valeur RDN non valide'; $lang['could_not_rename'] = 'Impossible de renommer l\'entrée'; -$lang['csv_spreadsheet'] = 'CSV (tableur)'; +// Password checker +$lang['passwords_match'] = 'Correspondance du mot de passe !'; +$lang['passwords_do_not_match'] = 'Les mots de passe ne correspondent pas !'; +$lang['password_checker_tool'] = 'Outil de vérification de mot de passe'; +$lang['to'] = 'Vers'; + +// Templates +$lang['using'] = 'En utilisant le'; +$lang['switch_to'] = 'Vous pouvez basculer vers '; +$lang['default_template'] = 'modèle par défaut'; + +// template_config +$lang['user_account'] = 'Compte utilisateur (posixAccount)'; +$lang['address_book_inet'] = 'Entrée de carnet d\'adresses (inetOrgPerson)'; +$lang['address_book_moz'] = 'Entrée de carnet d\'adresses (mozillaOrgPerson)'; +$lang['kolab_user'] = 'Entrée d\'utilisateur Kolab'; +$lang['organizational_unit'] = 'Unité organisationnelle'; +$lang['new_organizational_unit'] = 'Nouvelle unité organisationnelle'; +$lang['organizational_role'] = 'Rôle organisationnel'; +$lang['posix_group'] = 'Groupe Posix'; +$lang['samba_machine'] = 'Machine NT Samba'; +$lang['samba3_machine'] = 'Machine NT Samba 3'; +$lang['samba_user'] = 'Utilisateur Samba'; +$lang['samba3_user'] = 'Utilisateur Samba 3'; +$lang['samba3_group'] = 'Groupe de mappage Samba 3'; +$lang['dns_entry'] = 'Entrée DNS'; +$lang['simple_sec_object'] = 'Object de sécurité simple'; +$lang['courier_mail_account'] = 'Compte de messagerie'; +$lang['courier_mail_alias'] = 'Alias de compte de messagerie'; +$lang['ldap_alias'] = 'Alias LDAP'; +$lang['sendmail_cluster'] = 'Cluster Sendmail'; +$lang['sendmail_domain'] = 'Domaine Sendmail'; +$lang['sendmail_alias'] = 'Alias Sendmail'; +$lang['sendmail_virt_dom'] = 'Domaine virtuel Sendmail'; +$lang['sendmail_virt_users'] = 'Utilisateurs virtuels Sendmail'; +$lang['sendmail_relays'] = 'Relais Sendmail'; +$lang['custom'] = 'personnalisé'; +$lang['samba_domain_name'] = 'Mon nom de domaine Samba'; +$lang['administrators'] = 'Administrateurs'; +$lang['users'] = 'Utilisateurs'; +$lang['guests'] = 'Invités'; +$lang['power_users'] = 'Utilisateurs avec pouvoir'; +$lang['account_ops'] = 'Opérateurs de comptes'; +$lang['server_ops'] = 'Opérateurs de serveurs'; +$lang['print_ops'] = 'Opérateurs d\'impression'; +$lang['backup_ops'] = 'Opérateurs de sauvegarde'; +$lang['replicator'] = 'Duplicateurs'; +$lang['unable_smb_passwords'] = ' Impossible de créer les mots de passe Samba. Veuillez vérifier la configuration dans template_config.php'; +$lang['err_smb_conf'] = 'Erreur : vous avez une erreur dans votre confguration Samba.'; +$lang['err_smb_no_name_sid'] = 'Erreur : un nom et un sid doivent être fournit pour votre domaine Samba.'; +$lang['err_smb_no_name'] = 'Erreur : aucun nom fournit pour le domaine Samba.'; +$lang['err_smb_no_sid'] = 'Erreur : aucun sid fournit pour le domaine Samba.'; // Samba Account Template -$lang['samba_account'] = 'Samba Account'; -$lang['samba_account_lcase'] = 'samba account'; +$lang['samba_account'] = 'Compte Samba'; +$lang['samba_account_lcase'] = 'compte samba'; // New User (Posix) Account $lang['t_new_user_account'] = 'Nouveau compte utilisateur'; -$lang['t_hint_customize'] = 'Astuce: Pour personnaliser ce \'template\', éditez le fichier templates/creation/new_user_template.php'; +$lang['t_hint_customize'] = 'astuce : pour personnaliser ce modèle, éditez le fichier templates/creation/new_user_template.php'; $lang['t_name'] = 'Nom'; $lang['t_first_name'] = 'Prénom'; $lang['t_last_name'] = 'Nom de famille'; -$lang['t_first'] = 'first'; -$lang['t_last'] = 'last'; -$lang['t_common_name'] = 'Common name'; +$lang['t_first'] = 'premier'; +$lang['t_last'] = 'dernier'; +$lang['t_state'] = 'État'; +$lang['t_common_name'] = 'Nom commun'; $lang['t_user_name'] = 'Nom d\'utilisateur'; $lang['t_password'] = 'Mot de passe'; -$lang['t_encryption'] = 'Encryption'; -$lang['t_login_shell'] = 'Login Shell'; -$lang['t_home_dir'] = 'Home Directory'; -$lang['t_uid_number'] = 'UID Number'; +$lang['t_encryption'] = 'Chiffrement'; +$lang['t_login_shell'] = 'Shell de connexion'; +$lang['t_home_dir'] = 'Dossier personnel'; +$lang['t_uid_number'] = 'UID'; $lang['t_auto_det'] = '(déterminé automatiquement)'; $lang['t_group'] = 'Groupe'; -$lang['t_gid_number'] = 'GID Number'; -$lang['t_err_passwords'] = 'Les mots de passe ne correspondent pas. Veuillez revenir en arrière et recommencez.'; -$lang['t_err_field_blank'] = 'Le champ %s ne peut etre vide. Veuillez revenir en arrière et recommencez.'; -$lang['t_err_field_num'] = 'Seuls des valeurs numériques sont valides pour le champ %s. Veuillez revenir en arrière et recommencez.'; -$lang['t_err_bad_container'] = 'Le conténeur spécifié (%s) n\'existe pas. Veuillez revenir en arrière et recommencez.'; -$lang['t_confirm_account_creation'] = 'Confirmation de la création du compte'; +$lang['t_gid_number'] = 'GID'; +$lang['t_uid'] = 'ID utilisateur'; +$lang['t_err_passwords'] = 'Vos mots de passe ne correspondent pas. Veuillez revenir et réessayer.'; +$lang['t_err_field_blank'] = 'Vous ne pouvez laisser %s vide. Veuillez revenir et réessayer.'; +$lang['t_err_field_num'] = 'Vous ne pouvez entrez que des valeurs numériques pour le champ %s. Veuillez revenir et réessayer.'; +$lang['t_err_bad_container'] = 'Le conteneur que vous avez spécifié (%s) n\'existe pas. Veuillez revenir et réessayer.'; +$lang['t_confirm_account_creation'] = 'Confirmer la création du compte'; $lang['t_secret'] = '[secret]'; -$lang['t_create_account'] = 'Créer le compte'; +$lang['t_create_account'] = 'Créer un compte'; +$lang['t_verify'] = 'Vérifier'; + +// New Group (Posix) +$lang['t_new_posixgroup'] = 'Nouveau groupe Posix'; // New Address Template -$lang['t_new_address'] = 'New Address Book Entry'; +$lang['t_new_address'] = 'Nouvelle entrée de carnet d\'adresses'; $lang['t_organization'] = 'Organisation'; $lang['t_address'] = 'Adresse'; $lang['t_city'] = 'Ville'; $lang['t_postal_code'] = 'Code postal'; -$lang['t_street'] = 'rue'; -$lang['t_work_phone'] = 'Work phone'; +$lang['t_street'] = 'Rue'; +$lang['t_work_phone'] = 'Téléphone (bureau)'; $lang['t_fax'] = 'Fax'; $lang['t_mobile'] = 'Mobile'; -$lang['t_email'] = 'Email'; -$lang['t_container'] = 'Conténeur'; -$lang['t_err_cn_blank'] = 'Le champ \'Common Name\' ne peut etre vide. Veuillez revenir en arrière et recommencer.'; -$lang['t_confim_creation'] = 'Confirmation de la création de l\'entrée:'; -$lang['t_create_address'] = 'Create Address'; +$lang['t_email'] = 'Courriel'; +$lang['t_container'] = 'Conteneur'; +$lang['t_err_cn_blank'] = 'Vousne pouvez pas laissez le Nom commun vide. Veuiller revenir er réessayer.'; +$lang['t_confim_creation'] = 'Confirmer la création de l\'entrée :'; +$lang['t_create_address'] = 'Créer l\'adresse'; + +// default template +$lang['t_check_pass'] = 'Vérifier l\'adresse...'; +$lang['t_auto_submit'] = '(Évaluation automatique lors de la soumission.)'; // compare form $lang['compare'] = 'Comparer'; -$lang['comparing'] = 'Comparaison des DNs suivant:'; +$lang['comparing'] = 'Compararaison des DNs suivants'; $lang['compare_dn'] = 'Comparer un autre DN avec'; $lang['with'] = 'avec '; -$lang['compf_source_dn'] = 'DN Source'; -$lang['compf_dn_tooltip'] = 'Comparer ce DN avec un autre'; -$lang['switch_entry'] = 'Intervertir les entrées'; -$lang['no_value'] = 'Aucune Valeur'; +$lang['compf_source_dn'] = 'DN source'; +$lang['compf_dn_tooltip'] = 'Comparer cn DN avec un autre'; +$lang['switch_entry'] = 'Basculer l\'entrée'; +$lang['no_value'] = 'Aucune valeur'; $lang['compare_with'] = 'Comparer avec une autre entrée'; -$lang['need_oclass'] = 'You need one of the following ObjectClass(es) to add this attribute %s.'; +$lang['need_oclass'] = 'Vous avez besoin d\'un autre ObjectClass(es) pour ajouter cet attribut %s.'; // Time out page -$lang['session_timed_out_1'] = 'Votre session a expiré après'; +$lang['session_timed_out_1'] = 'Votre session s\'est terminé avec'; $lang['session_timed_out_2'] = 'min. d\'inactivité. Vous avez été automatiquement déconnecté.'; -$lang['log_back_in'] = 'Pour vous connecter à nouveau, cliquez sur le lien suivant:'; -$lang['session_timed_out_tree'] = '(Expiration de session. Déconnexion automatique.)'; +$lang['log_back_in'] = 'Pour vous reconnecter, veuillez cliquer sur le lien suivant :'; +$lang['session_timed_out_tree'] = '(Session expirée. Déconnexion automatique.)'; +$lang['timeout_at'] = 'L\'inactivité vous déconnectera à %s'; ?> diff --git a/lang/recoded/ja.php b/lang/recoded/ja.php index a1b93aa..762ebc0 100644 --- a/lang/recoded/ja.php +++ b/lang/recoded/ja.php @@ -1,6 +1,6 @@ %s ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã«æˆåŠŸã—ã¾ã—ãŸ'; @@ -542,7 +548,6 @@ $lang['no_deletes_in_read_only'] = '読ã¿è¾¼ã¿å°‚用モードã§ã¯å‰Šé™¤ã¯ $lang['error_calling_mass_delete'] = 'mass_delete.php 呼ã³å‡ºã—中ã®ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚POST 値ã‹ã‚‰ mass_delete ãŒè¦‹ã‹ã‚Šã¾ã›ã‚“。'; $lang['mass_delete_not_array'] = 'mass_delete POST 辺りãŒé…列ã§ã¯ã‚ã‚Šã¾ã›ã‚“。'; $lang['mass_delete_not_enabled'] = '一括削除ãŒæœ‰åŠ¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“。次ã«é€²ã‚€å‰ã« config.php ã§ãれを有効ã«ã—ã¦ãã ã•ã„。'; -$lang['search_attrs_wrong_count'] = 'config.php ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚The number of attributes in $search_attributes and $search_attributes_display is different'; $lang['mass_deleting'] = '一括削除中'; $lang['mass_delete_progress'] = 'サーãƒãƒ¼ "%s" ã‹ã‚‰å‰Šé™¤ä¸­'; $lang['malformed_mass_delete_array'] = 'ãŠã‹ã—ã„ mass_delete é…列ã§ã™ã€‚'; @@ -554,23 +559,19 @@ $lang['confirm_mass_delete'] = '%s エントリをサーãƒãƒ¼ %s ã‹ã‚‰ä¸€æ‹¬ $lang['yes_delete'] = 'ã¯ã„, 削除ã—ã¾ã™!'; // Renaming entries -$lang['non_leaf_nodes_cannot_be_renamed'] = 'å­ã‚¨ãƒ³ãƒˆãƒªã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯å称変更ã§ãã¾ã›ã‚“ (eg, the rename operation is not allowed on non-leaf entries)'; +$lang['non_leaf_nodes_cannot_be_renamed'] = 'å­ã‚¨ãƒ³ãƒˆãƒªã‚’æŒã¤ã‚¨ãƒ³ãƒˆãƒªã¯å称変更ã§ãã¾ã›ã‚“ (例ãˆã°å称変更ã®æ“作ã¯å­ã‚¨ãƒ³ãƒˆãƒªã§ãªã‘ã‚Œã°è¨±å¯ã•ã‚Œã¦ã„ãªã„)'; $lang['no_rdn_change'] = 'RDN を変更ã—ã¾ã›ã‚“ã§ã—ãŸ'; $lang['invalid_rdn'] = '無効㪠RDN 値'; -$lang['could_not_rename'] = 'エントリã®å称変更ãŒå‡ºæ¥ã¾ã›ã‚“ã§ã—ãŸ'; - -// General errors -$lang['mismatched_search_attr_config'] = '設定ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚Šã¾ã™ã€‚$search_attributes 㯠$search_attributes_display ã®å±žæ€§ã¨åŒã˜æ•°ã‚’æŒãŸãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“。'; +$lang['could_not_rename'] = 'エントリã®å称変更ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ'; // Password checker $lang['passwords_match'] = 'パスワードãŒä¸€è‡´ã—ã¾ã—ãŸ!'; $lang['passwords_do_not_match'] = 'パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“!'; $lang['password_checker_tool'] = 'パスワードãƒã‚§ãƒƒã‚¯ãƒ„ール'; -$lang['compare'] = '比較'; $lang['to'] = 'To'; // Templates -$lang['using'] = 'Using the'; +$lang['using'] = '次を使用:'; $lang['switch_to'] = 'You may switch to the '; $lang['default_template'] = 'デフォルトテンプレート'; @@ -580,6 +581,7 @@ $lang['address_book_inet'] = 'アドレス帳エントリ (inetOrgPerson)'; $lang['address_book_moz'] = 'アドレス帳エントリ (mozillaOrgPerson)'; $lang['kolab_user'] = 'Kolab ユーザーエントリ'; $lang['organizational_unit'] = '所属組織'; +$lang['new_organizational_unit'] = 'æ–°è¦æ‰€å±žçµ„ç¹”'; $lang['organizational_role'] = '所属è·å‹™'; $lang['posix_group'] = 'Posix グループ'; $lang['samba_machine'] = 'Samba NT マシン'; @@ -627,6 +629,7 @@ $lang['t_first_name'] = 'åå‰'; $lang['t_last_name'] = 'è‹—å­—'; $lang['t_first'] = 'first'; $lang['t_last'] = 'last'; +$lang['t_state'] = 'State'; $lang['t_common_name'] = '共通å'; $lang['t_user_name'] = 'ユーザーå'; $lang['t_password'] = 'パスワード'; @@ -637,13 +640,18 @@ $lang['t_uid_number'] = 'UID 番å·'; $lang['t_auto_det'] = '(自動採決)'; $lang['t_group'] = 'グループ'; $lang['t_gid_number'] = 'GID 番å·'; +$lang['t_uid'] = 'ユーザー ID'; $lang['t_err_passwords'] = 'パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_err_field_blank'] = '%s ブランクを残ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; -$lang['t_err_field_num'] = 'フィールド %s ã¯æ•°å€¤ã®ã¿å…¥åŠ›ã§å‡ºæ¥ã¾ã™ã€‚戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; +$lang['t_err_field_num'] = 'フィールド %s ã¯æ•°å€¤ã®ã¿å…¥åŠ›ã§ã§ãã¾ã™ã€‚戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_err_bad_container'] = '指定ã—ãŸå†…容(%s)ã¯å­˜åœ¨ã—ã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_confirm_account_creation'] = 'アカウント作æˆç¢ºèª'; $lang['t_secret'] = '[secret]'; $lang['t_create_account'] = 'アカウント作æˆ'; +$lang['t_verify'] = '確èª'; + +// New Group (Posix) +$lang['t_new_posixgroup'] = 'æ–°è¦ Posix グループ'; // New Address Template $lang['t_new_address'] = 'æ–°è¦ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã‚¨ãƒ³ãƒˆãƒª'; @@ -657,17 +665,18 @@ $lang['t_fax'] = 'Fax'; $lang['t_mobile'] = 'æºå¸¯é›»è©±'; $lang['t_email'] = 'é›»å­ãƒ¡ãƒ¼ãƒ«'; $lang['t_container'] = 'コンテナー'; -$lang['t_err_cn_blank'] = '一般åを空ã«ã™ã‚‹ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; +$lang['t_err_cn_blank'] = '一般åを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。戻ã£ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。'; $lang['t_confim_creation'] = 'エントリ作æˆã®ç¢ºèª:'; $lang['t_create_address'] = 'アドレス作æˆ'; // default template $lang['t_check_pass'] = 'パスワード検査...'; +$lang['t_auto_submit'] = '(Auto evalutated on submission.)'; // compare form $lang['compare'] = '比較'; $lang['comparing'] = '次㮠DN ã¨æ¯”較中'; -$lang['compare_dn'] = 'Compare another DN with'; +$lang['compare_dn'] = '次㮠DN ã¨åˆ¥ã® DN を比較ã™ã‚‹:'; $lang['with'] = 'with '; $lang['compf_source_dn'] = '元㮠DN'; $lang['compf_dn_tooltip'] = 'ã“ã® DN ã¨åˆ¥ã®ã‚‚ã®ã‚’比較'; @@ -682,4 +691,4 @@ $lang['session_timed_out_2'] = '分活動ã—ãªã‹ã£ãŸã®ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ $lang['log_back_in'] = 'å†ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã«ã¯æ¬¡ã®ãƒªãƒ³ã‚¯ã‚’クリックã—ã¦ãã ã•ã„:'; $lang['session_timed_out_tree'] = '(セッションã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã§ã™ã€‚自動ã§ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ)'; $lang['timeout_at'] = '%s ã¯æ´»å‹•çš„ã§ãªã‹ã£ãŸã®ã§ãƒ­ã‚°ã‚¢ã‚¦ãƒˆ'; -?> +?> \ No newline at end of file diff --git a/lang/recoded/pl.php b/lang/recoded/pl.php index 7403aae..fbcdaf8 100644 --- a/lang/recoded/pl.php +++ b/lang/recoded/pl.php @@ -1,5 +1,5 @@
Znalazłeś błąd w phpLDAPadmin (nie krytyczny) !
BÅ‚Ä…d:%s (%s)
Plik: %s linia %s, wywołane z %s
Wersje:PLA: %s, PHP: %s, SAPI: %s
Serwer Web:%s
- Proszę zgłoś ten błąd klikając tutaj.

'; + Sprawdź proszę czy ten błąd nie został już zgłoszony tutaj. +
Jeśli nie został jeszcze zgłoszony, to możesz go zgłosić tutaj.
+
'; $lang['ferror_congrats_found_bug'] = 'Gratulacje ! Znalazłeś błąd w phpLDAPadmin.

@@ -529,7 +537,6 @@ $lang['no_deletes_in_read_only'] = 'Usuwanie jest niedozwolone w trybie tylko-do $lang['error_calling_mass_delete'] = 'Błąd podczas wywołania mass_delete.php. Brakująca mass_delete w zmiennych POST.'; $lang['mass_delete_not_array'] = 'zmienna POST mass_delete nie jest w tablicą.'; $lang['mass_delete_not_enabled'] = 'Masowe usuwanie nie jest dozwolone. Odblokuj to proszę w config.php przed kontynuacją.'; -$lang['search_attrs_wrong_count'] = 'Twój config.php zawiera błąd. Ilość atrybutów w $search_attributes i$search_attributes_display jest różna'; $lang['mass_deleting'] = 'Masowe usuwanie'; $lang['mass_delete_progress'] = 'Postęp usuwania na serwerze "%s"'; $lang['malformed_mass_delete_array'] = 'Zniekształcona tablica mass_delete.'; @@ -546,14 +553,10 @@ $lang['no_rdn_change'] = 'Nie zmieniłeś/aś RDN'; $lang['invalid_rdn'] = 'Błędna wartość RDN'; $lang['could_not_rename'] = 'Nie można zmienić nazwy wpisu'; -// General errors -$lang['mismatched_search_attr_config'] = 'Twoja konfiguracja zawiera błąd. $search_attributes musi posiadać tą samą ilość atrybutów co $search_attributes_display.'; - // Password checker $lang['passwords_match'] = 'Hasła zgodne !'; $lang['passwords_do_not_match'] = 'Hasła nie zgadzają się !'; $lang['password_checker_tool'] = 'Narzędzie do sprawdzania haseł'; -$lang['compare'] = 'Porównaj'; $lang['to'] = 'Do'; // Templates @@ -567,6 +570,7 @@ $lang['address_book_inet'] = 'Wpis Książki Adresowej (inetOrgPerson)'; $lang['address_book_moz'] = 'Wpis Książki Adresowej (mozillaOrgPerson)'; $lang['kolab_user'] = 'Wpis Użytkownika Kolab'; $lang['organizational_unit'] = 'Jednostka Organizacyjna'; +$lang['new_organizational_unit'] = 'Nowa Jednostka Organizacyjna'; $lang['organizational_role'] = 'Rola w Organizacji'; $lang['posix_group'] = 'Grupa Posix'; $lang['samba_machine'] = 'Maszyna Samba NT'; @@ -614,6 +618,7 @@ $lang['t_first_name'] = 'Imię'; $lang['t_last_name'] = 'Nazwisko'; $lang['t_first'] = 'imię'; $lang['t_last'] = 'nazwisko'; +$lang['t_state'] = 'Stan'; $lang['t_common_name'] = 'Nazwa'; $lang['t_user_name'] = 'Nazwa użytkownika'; $lang['t_password'] = 'Hasło'; @@ -624,6 +629,7 @@ $lang['t_uid_number'] = 'Numer UID'; $lang['t_auto_det'] = '(automatycznie określony)'; $lang['t_group'] = 'Grupa'; $lang['t_gid_number'] = 'Numer GID'; +$lang['t_uid'] = 'ID Użytkownika'; $lang['t_err_passwords'] = 'Hasła nie zgadzają się. Wróc i spróbuj ponownie.'; $lang['t_err_field_blank'] = 'Nie możesz pozostawić pustego pola %s. Wróć i spróbuj ponownie.'; $lang['t_err_field_num'] = 'Pole %s może zawierać tylko wartości numeryczne. Wróć i spróbuj ponownie.'; @@ -631,6 +637,10 @@ $lang['t_err_bad_container'] = 'Kontener który wybrałeś/aś (%s) nie istnieje $lang['t_confirm_account_creation'] = 'Potwierdź utworzenie konta'; $lang['t_secret'] = '[tajne]'; $lang['t_create_account'] = 'Utwórz konto'; +$lang['t_verify'] = 'Weryfikuj'; + +// New Group (Posix) +$lang['t_new_posixgroup'] = 'Nowa Grupa Posix'; // New Address Template $lang['t_new_address'] = 'Nowy wpis w Książce Adresowej'; @@ -650,6 +660,7 @@ $lang['t_create_address'] = 'Utwórz adres'; // default template $lang['t_check_pass'] = 'Sprawdź hasło'; +$lang['t_auto_submit'] = '(Automatycznie wyliczane przy wysłaniu)'; // '(Auto evalutated on submission.)'; // compare form $lang['compare'] = 'Porównaj'; diff --git a/lib/blowfish.php b/lib/blowfish.php index de6dfb6..8d2199c 100644 --- a/lib/blowfish.php +++ b/lib/blowfish.php @@ -1,5 +1,5 @@ = "5") { - # Work-around to get PLA to work in PHP5 - ini_set( "zend.ze1_compatibility_mode", 1 ); - - # E_DEBUG is PHP5 specific and prevents warnings about using 'var' to declar class members - error_reporting( 'E_DEBUG' ); -} else - # For PHP4 - error_reporting( E_ALL ); +@define('LIBDIR','../lib/'); # For PHP5 backward/forward compatibility if (! defined('E_STRICT')) @@ -41,6 +30,8 @@ ob_end_clean(); /* Our custom error handler receives all error notices that pass the error_reporting() level set above. */ set_error_handler('pla_error_handler'); +# Disable error reporting until all our required functions are loaded. +error_reporting(0); /* Creates the language array which will be populated with localized strings based on the user-configured language. */ @@ -61,6 +52,18 @@ foreach ($pla_function_files as $file_name) { require_once realpath(LIBDIR.'config_default.php'); ob_end_clean(); +# We are now ready for error reporting. +# Turn on all notices and warnings. This helps us write cleaner code (we hope at least) +if (phpversion() >= "5") { + # Work-around to get PLA to work in PHP5 + ini_set( "zend.ze1_compatibility_mode", 1 ); + + # E_DEBUG is PHP5 specific and prevents warnings about using 'var' to declare class members + error_reporting( E_DEBUG ); +} else + # For PHP4 + error_reporting( E_ALL ); + /** * At this point we have read all our additional function PHP files and our configuration. */ @@ -75,7 +78,13 @@ if (pla_session_start()) * Language configuration. Auto or specified? * Shall we attempt to auto-determine the language? */ + $language = $config->GetValue('appearance','language'); +# Get english by default, in case there are tags that are missing. +ob_start(); +include LANGDIR."recoded/en.php"; +ob_end_clean(); + if ($language == "auto") { # Make sure their browser correctly reports language. If not, skip this. @@ -92,10 +101,11 @@ if ($language == "auto") { $HTTP_LANGS = array_merge ($HTTP_LANGS1, $HTTP_LANGS2); foreach( $HTTP_LANGS as $HTTP_LANG) { # try to grab one after the other the language file - if( file_exists( realpath( "lang/recoded/$HTTP_LANG.php" ) ) && - is_readable( realpath( "lang/recoded/$HTTP_LANG.php" ) ) ) { + $language_file = LANGDIR."recoded/$HTTP_LANG.php"; + if( file_exists($language_file) && + is_readable($language_file)) { ob_start(); - include realpath( "lang/recoded/$HTTP_LANG.php" ); + include $language_file; ob_end_clean(); break; } @@ -107,14 +117,15 @@ if ($language == "auto") { if( $language != null ) { if( 0 == strcmp( $language, 'english' ) ) $language = 'en'; - if( file_exists( realpath( "lang/recoded/$language.php" ) ) && - is_readable( realpath( "lang/recoded/$language.php" ) ) ) { + + $language_file = LANGDIR."recoded/$language.php"; + if( file_exists($language_file) && + is_readable($language_file)) { ob_start(); - include realpath( "lang/recoded/$language.php" ); + include $language_file; ob_end_clean(); } else { - pla_error( "Could not read language file 'lang/recoded/$language.php'. Either the file - does not exist, or its permissions do not allow phpLDAPadmin to read it." ); + pla_error(sprintf('Could not read language file "%s". Either the file does not exist, or its permissions do not allow phpLDAPadmin to read it.',$language_file)); } } } diff --git a/lib/config_default.php b/lib/config_default.php index 7a5bf7b..6684b32 100644 --- a/lib/config_default.php +++ b/lib/config_default.php @@ -1,5 +1,5 @@ '%A %e %B %Y'); //$date_format = "%A %e %B %Y"; + $this->default->appearance['date_attrs'] = array( + 'desc'=>'Array of attributes that should show a jscalendar', + 'default'=>array('shadowExpire'=>'%es','shadowInactive'=>'%es','shadowLastChange'=>'%es')); + $this->default->appearance['hide_configuration_management'] = array( 'desc'=>'Hide the Sourceforge related links', 'default'=>false); @@ -198,6 +202,10 @@ class Config { $this->default->debug['syslog'] = array( 'desc'=>'Whether to send debug messages to syslog', 'default'=>false); + + $this->default->debug['file'] = array( + 'desc'=>'Name of file to send debug output to', + 'default'=>null); //$use_syslog /** Temp Directories @@ -314,7 +322,8 @@ class Config { $value = null; if (! isset($this->default->$key)) - pla_error("A call was made to GetValue requesting [$key] that isnt predefined."); + pla_error(sprintf('A call was made in [%s] to GetValue requesting [%s] that isnt predefined.', + basename($_SERVER['PHP_SELF']),$key)); else $default = $this->default->$key; @@ -373,4 +382,9 @@ class Config { # Define our configuration variable. $config = new Config; require (CONFDIR.'config.php'); + +if (($config->GetValue('debug','syslog') || $config->GetValue('debug','file')) && $config->GetValue('debug','level')) + define('DEBUG_ENABLED',1); +else + define('DEBUG_ENABLED',0); ?> diff --git a/lib/createlm.php b/lib/createlm.php new file mode 100644 index 0000000..4e88fd5 --- /dev/null +++ b/lib/createlm.php @@ -0,0 +1,520 @@ +permute($key, $this->perm1, 56); + + $c = array(); + $d = array(); + for ($i = 0; $i < 28; $i++) { + $c[$i] = $pk1[$i]; + $d[$i] = $pk1[28 + $i]; + } + + for ($i = 0; $i < 16; $i++) { + $c = $this->lshift($this->sc[$i], $c); + $d = $this->lshift($this->sc[$i], $d); + + $cd = $c; + for ($k = 0; $k < sizeof($d); $k++) $cd[] = $d[$k]; + $ki[$i] = $this->permute($cd, $this->perm2, 48); + } + + $pd1 = $this->permute($in, $this->perm3, 64); + + $l = array(); + $r = array(); + for ($i = 0; $i < 32; $i++) { + $l[$i] = $pd1[$i]; + $r[$i] = $pd1[32 + $i]; + } + + for ($i = 0; $i < 16; $i++) { + $er = $this->permute($r, $this->perm4, 48); + if ($forw) $erk = $this->mxor($er, $ki[$i]); + else $erk = $this->mxor($er, $ki[15 - $i]); + + for ($j = 0; $j < 8; $j++) { + for ($k = 0; $k < 6; $k++) { + $b[$j][$k] = $erk[($j * 6) + $k]; + } + } + for ($j = 0; $j < 8; $j++) { + $m = array(); + $n = array(); + $m = ($b[$j][0] << 1) | $b[$j][5]; + $n = ($b[$j][1] << 3) | ($b[$j][2] << 2) | ($b[$j][3] << 1) | $b[$j][4]; + + for ($k = 0; $k < 4; $k++) { + $b[$j][$k]=($this->sbox[$j][$m][$n] & (1 << (3-$k)))?1:0; + } + } + + for ($j = 0; $j < 8; $j++) { + for ($k = 0; $k < 4; $k++) { + $cb[($j * 4) + $k] = $b[$j][$k]; + } + } + $pcb = $this->permute($cb, $this->perm5, 32); + $r2 = $this->mxor($l, $pcb); + for ($k = 0; $k < 32; $k++) $l[$k] = $r[$k]; + for ($k = 0; $k < 32; $k++) $r[$k] = $r2[$k]; + } + $rl = $r; + for ($i = 0; $i < sizeof($l); $i++) $rl[] = $l[$i]; + return $this->permute($rl, $this->perm6, 64); + } + + function str_to_key($str) { + $key[0] = $this->unsigned_shift_r($str[0], 1); + $key[1] = (($str[0]&0x01)<<6) | $this->unsigned_shift_r($str[1], 2); + $key[2] = (($str[1]&0x03)<<5) | $this->unsigned_shift_r($str[2], 3); + $key[3] = (($str[2]&0x07)<<4) | $this->unsigned_shift_r($str[3], 4); + $key[4] = (($str[3]&0x0F)<<3) | $this->unsigned_shift_r($str[4], 5); + $key[5] = (($str[4]&0x1F)<<2) | $this->unsigned_shift_r($str[5], 6); + $key[6] = (($str[5]&0x3F)<<1) | $this->unsigned_shift_r($str[6], 7); + $key[7] = $str[6]&0x7F; + for ($i = 0; $i < 8; $i++) { + $key[$i] = ($key[$i] << 1); + } + return $key; + } + + function smb_hash($in, $key, $forw){ + $key2 = $this->str_to_key($key); + + for ($i = 0; $i < 64; $i++) { + $inb[$i] = ($in[$i/8] & (1<<(7-($i%8)))) ? 1:0; + $keyb[$i] = ($key2[$i/8] & (1<<(7-($i%8)))) ? 1:0; + $outb[$i] = 0; + } + $outb = $this->dohash($inb, $keyb, $forw); + for ($i = 0; $i < 8; $i++) { + $out[$i] = 0; + } + for ($i = 0; $i < 65; $i++) { + if ( isset($outb[$i]) && $outb[$i] ) { + $out[$i/8] |= (1<<(7-($i%8))); + } + } + return $out; + } + + function E_P16($in) { + $p14 = array_values(unpack("C*",$in)); + $sp8 = array(0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25); + $p14_1 = array(); + $p14_2 = array(); + for ($i = 0; $i < 7; $i++) { + $p14_1[$i] = $p14[$i]; + $p14_2[$i] = $p14[$i + 7]; + } + $p16_1 = $this->smb_hash($sp8, $p14_1, true); + $p16_2 = $this->smb_hash($sp8, $p14_2, true); + $p16 = $p16_1; + for ($i = 0; $i < sizeof($p16_2); $i++) { + $p16[] = $p16_2[$i]; + } + return $p16; + } + + /** + * Calculates the LM hash of a given password. + * + * @param string $password password + * @return string hash value + */ + function lmhash($password = "") { + $password = strtoupper($password); + $password = substr($password,0,14); + $password = str_pad($password, 14, chr(0)); + $p16 = $this->E_P16($password); + for ($i = 0; $i < sizeof($p16); $i++) { + $p16[$i] = sprintf("%02X", $p16[$i]); + } + return join("", $p16); + } + + /** + * Calculates the NT hash of a given password. + * + * @param string $password password + * @return string hash value + */ + function nthash($password = "") { + $password = substr($password,0,128); + $password2 = ""; + for ($i = 0; $i < strlen($password); $i++) $password2 .= $password[$i] . chr(0); + $password = $password2; + $hex = $this->mdfour($password); + for ($i = 0; $i < sizeof($hex); $i++) { + $hex[$i] = sprintf("%02X", $hex[$i]); + } + return join("", $hex); + } + + # Support functions + # Ported from SAMBA/source/lib/md4.c:F,G and H respectfully + function F($X, $Y, $Z) { + return ($X&$Y) | ((~$X)&$Z); + } + + function G($X, $Y, $Z) { + return ($X&$Y) | ($X&$Z) | ($Y&$Z); + } + + function H($X, $Y, $Z) { + return $X^$Y^$Z; + } + + # Ported from SAMBA/source/lib/md4.c:mdfour + function mdfour($in) { + $in = unpack("C*",$in); + $in = array_values($in); + $b = sizeof($in) * 8; + $A = array(0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476); + while (sizeof($in) > 64 ) { + $M = $this->copy64($in); + $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); + $new_in = array(); + for ($i = 64; $i < sizeof($in); $i++) $new_in[] = $in[$i]; + $in = $new_in; + } + $buf = $in; + $buf[] = 0x80; + for ($i = sizeof($buf) - 1; $i < 127; $i++) $buf[] = 0; + if ( sizeof($in) <= 55 ) { + $temp = $this->copy4($b); + $buf[56] = $temp[0]; + $buf[57] = $temp[1]; + $buf[58] = $temp[2]; + $buf[59] = $temp[3]; + $M = $this->copy64($buf); + $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); + } + else { + $temp = $this->copy4($b); + $buf[120] = $temp[0]; + $buf[121] = $temp[1]; + $buf[122] = $temp[2]; + $buf[123] = $temp[3]; + $M = $this->copy64($buf); + $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); + $temp = array(); + for ($i = 64; $i < sizeof($buf); $i++) $temp[] = $buf[$i]; + $M = $this->copy64($temp); + $this->mdfour64($A[0], $A[1], $A[2], $A[3], $M); + } + $out = array(); + $temp = $this->copy4($A[0]); + for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; + $temp = $this->copy4($A[1]); + for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; + $temp = $this->copy4($A[2]); + for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; + $temp = $this->copy4($A[3]); + for ($i = 0; $i < 4; $i++) $out[] = $temp[$i]; + return $out; + } + + # Ported from SAMBA/source/lib/md4.c:copy4 + function copy4($x) { + $out = array(); + $out[0] = $x&0xFF; + $out[1] = $this->unsigned_shift_r($x, 8)&0xFF; + $out[2] = $this->unsigned_shift_r($x, 16)&0xFF; + $out[3] = $this->unsigned_shift_r($x, 24)&0xFF; + return $out; + } + + # Ported from SAMBA/source/lib/md4.c:copy64 + function copy64($in) { + for ($i = 0; $i < 16; $i++) { + $M[$i] = ($in[$i*4+3]<<24) | ($in[$i*4+2]<<16) | ($in[$i*4+1]<<8) | ($in[$i*4+0]<<0); + } + return $M; + } + + # Ported from SAMBA/source/lib/md4.c:mdfour64 + function mdfour64(&$A, &$B, &$C, &$D, $M) { + $X = array(); + for ($i = 0; $i < 16; $i++) $X[] = $M[$i]; + $AA=$A; + $BB=$B; + $CC=$C; + $DD=$D; + $this->ROUND1($A,$B,$C,$D, 0, 3, $X); + $this->ROUND1($D,$A,$B,$C, 1, 7, $X); + $this->ROUND1($C,$D,$A,$B, 2, 11, $X); + $this->ROUND1($B,$C,$D,$A, 3, 19, $X); + $this->ROUND1($A,$B,$C,$D, 4, 3, $X); $this->ROUND1($D,$A,$B,$C, 5, 7, $X); + $this->ROUND1($C,$D,$A,$B, 6, 11, $X); $this->ROUND1($B,$C,$D,$A, 7, 19, $X); + $this->ROUND1($A,$B,$C,$D, 8, 3, $X); $this->ROUND1($D,$A,$B,$C, 9, 7, $X); + $this->ROUND1($C,$D,$A,$B, 10, 11, $X); $this->ROUND1($B,$C,$D,$A, 11, 19, $X); + $this->ROUND1($A,$B,$C,$D, 12, 3, $X); $this->ROUND1($D,$A,$B,$C, 13, 7, $X); + $this->ROUND1($C,$D,$A,$B, 14, 11, $X); $this->ROUND1($B,$C,$D,$A, 15, 19, $X); + $this->ROUND2($A,$B,$C,$D, 0, 3, $X); $this->ROUND2($D,$A,$B,$C, 4, 5, $X); + $this->ROUND2($C,$D,$A,$B, 8, 9, $X); $this->ROUND2($B,$C,$D,$A, 12, 13, $X); + $this->ROUND2($A,$B,$C,$D, 1, 3, $X); $this->ROUND2($D,$A,$B,$C, 5, 5, $X); + $this->ROUND2($C,$D,$A,$B, 9, 9, $X); $this->ROUND2($B,$C,$D,$A, 13, 13, $X); + $this->ROUND2($A,$B,$C,$D, 2, 3, $X); $this->ROUND2($D,$A,$B,$C, 6, 5, $X); + $this->ROUND2($C,$D,$A,$B, 10, 9, $X); $this->ROUND2($B,$C,$D,$A, 14, 13, $X); + $this->ROUND2($A,$B,$C,$D, 3, 3, $X); $this->ROUND2($D,$A,$B,$C, 7, 5, $X); + $this->ROUND2($C,$D,$A,$B, 11, 9, $X); $this->ROUND2($B,$C,$D,$A, 15, 13, $X); + $this->ROUND3($A,$B,$C,$D, 0, 3, $X); $this->ROUND3($D,$A,$B,$C, 8, 9, $X); + $this->ROUND3($C,$D,$A,$B, 4, 11, $X); $this->ROUND3($B,$C,$D,$A, 12, 15, $X); + $this->ROUND3($A,$B,$C,$D, 2, 3, $X); $this->ROUND3($D,$A,$B,$C, 10, 9, $X); + $this->ROUND3($C,$D,$A,$B, 6, 11, $X); $this->ROUND3($B,$C,$D,$A, 14, 15, $X); + $this->ROUND3($A,$B,$C,$D, 1, 3, $X); $this->ROUND3($D,$A,$B,$C, 9, 9, $X); + $this->ROUND3($C,$D,$A,$B, 5, 11, $X); $this->ROUND3($B,$C,$D,$A, 13, 15, $X); + $this->ROUND3($A,$B,$C,$D, 3, 3, $X); $this->ROUND3($D,$A,$B,$C, 11, 9, $X); + $this->ROUND3($C,$D,$A,$B, 7, 11, $X); $this->ROUND3($B,$C,$D,$A, 15, 15, $X); + + $A = $this->add32(array($A, $AA)); $B = $this->add32(array($B, $BB)); + $C = $this->add32(array($C, $CC)); $D = $this->add32(array($D, $DD)); + } + + # Needed? because perl seems to choke on overflowing when doing bitwise + # operations on numbers larger than 32 bits. Well, it did on my machine =) + function add32($v) { + $sum = array(); + for ($i = 0; $i < sizeof($v); $i++) { + $v[$i] = array($this->unsigned_shift_r(($v[$i]&0xffff0000), 16), ($v[$i]&0xffff)); + } + for ($i = 0; $i < sizeof($v); $i++) { + @$sum[0] += $v[$i][0]; + @$sum[1] += $v[$i][1]; + } + $sum[0] += ($sum[1]&0xffff0000)>>16; + $sum[1] &= 0xffff; + $sum[0] &= 0xffff; + $ret = ($sum[0]<<16) | $sum[1]; + return $ret; + } + + # Ported from SAMBA/source/lib/md4.c:ROUND1 + function ROUND1(&$a,$b,$c,$d,$k,$s,$X) { + $a = $this->md4lshift($this->add32(array($a, $this->F($b,$c,$d), $X[$k])), $s); + return $a; + } + + # Ported from SAMBA/source/lib/md4.c:ROUND2 + function ROUND2(&$a,$b,$c,$d,$k,$s,$X) { + $a = $this->md4lshift($this->add32(array($a, $this->G($b,$c,$d), $X[$k] + 0x5A827999)), $s); + return $a; + } + + # Ported from SAMBA/source/lib/md4.c:ROUND3 + function ROUND3(&$a,$b,$c,$d,$k,$s,$X) { + $a = $this->md4lshift($this->add32(array($a + $this->H($b,$c,$d) + $X[$k] + 0x6ED9EBA1)), $s); + return $a; + } + + # Ported from SAMBA/source/lib/md4.c:lshift + # Renamed to prevent clash with SAMBA/source/libsmb/smbdes.c:lshift + function md4lshift($x, $s) { + $x &= 0xFFFFFFFF; + return ((($x<<$s)&0xFFFFFFFF) | $this->unsigned_shift_r($x, (32-$s))); + } + + /** + * Unsigned shift operation for 32bit values. + * + * PHP 4 only supports signed shifts by default. + */ + function unsigned_shift_r($a, $b) { + $z = 0x80000000; + if ($z & $a) { + $a = ($a >> 1); + $a &= (~$z); + $a |= 0x40000000; + $a = ($a >> ($b - 1)); + } + else { + $a = ($a >> $b); + } + return $a; + } + +} + +?> diff --git a/lib/custom_functions.php b/lib/custom_functions.php index 1a032ff..baea17d 100644 --- a/lib/custom_functions.php +++ b/lib/custom_functions.php @@ -1,5 +1,5 @@ entry_array; } @@ -355,7 +355,7 @@ class PlaLdapExporter extends PlaAbstractExporter{ //iterate over the attributes while( $attr ){ - if( is_attr_binary( $this,$attr ) ){ + if( is_attr_binary( $this->ldap_info->ldapserver,$attr ) ){ $this->entry_array[$attr] = @ldap_get_values_len( $this->ds,$this->entry_id,$attr ); } else{ @@ -378,7 +378,7 @@ class PlaLdapExporter extends PlaAbstractExporter{ } /** - * May be call when the processing is finished + * May be called when the processing is finished * and to free some ressources. * @return bool true or false if any errors is encountered * @todo This could break something, so need to add a method to LDAPServer to close connection and reset $connected. @@ -520,7 +520,7 @@ class PlaDsmlExporter extends PlaExporter{ /** * Export the entries to DSML */ - function export(){ + function export(){ global $lang; $pla_ldap_info = $this->pla_get_ldap_info(); // not very elegant, but do the job for the moment as we have just 4 level @@ -597,18 +597,18 @@ class PlaVcardExporter extends PlaExporter{ // mappping one to one attribute var $vcardMapping = array('cn' => 'FN', - 'title' => 'TITLE', - 'homePhone' => 'TEL;HOME', - 'mobile' => 'TEL;CELL', - 'mail' => 'EMAIL;Internet', - 'labeledURI' =>'URL', - 'o' => 'ORG', - 'audio' => 'SOUND', - 'facsmileTelephoneNumber' =>'TEL;WORK;HOME;VOICE;FAX', - 'jpegPhoto' => 'PHOTO;ENCODING=BASE64', - 'businessCategory' => 'ROLE', - 'description' => 'NOTE' - ); + 'title' => 'TITLE', + 'homePhone' => 'TEL;HOME', + 'mobile' => 'TEL;CELL', + 'mail' => 'EMAIL;Internet', + 'labeledURI' =>'URL', + 'o' => 'ORG', + 'audio' => 'SOUND', + 'facsmileTelephoneNumber' =>'TEL;WORK;HOME;VOICE;FAX', + 'jpegPhoto' => 'PHOTO;ENCODING=BASE64', + 'businessCategory' => 'ROLE', + 'description' => 'NOTE' + ); var $deliveryAddress = array("postOfficeBox", "street", @@ -824,7 +824,7 @@ class PlaCSVExporter extends PlaExporter{ class MyCustomExporter extends PlaExporter{ - function MyCutsomExporter($exporter){ + function MyCustomExporter($exporter){ $this->exporter = $exporter; } diff --git a/lib/functions.php b/lib/functions.php index 2e52a05..a226881 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -1,5 +1,5 @@ GetValue('appearance','multi_line_attributes'); $multi_line_syntax_oids = $config->GetValue('appearance','multi_line_syntax_oids'); @@ -90,20 +92,22 @@ function is_multi_line_attr( $attr_name, $val=null, $server_id=null ) { if (! $return && ! is_null($server_id)) { $ldapserver = $ldapservers->Instance($server_id); - $schema_attr = get_schema_attribute($ldapserver,$attr_name); + $schema_attr = $ldapserver->getSchemaAttribute($attr_name); if ($schema_attr) { - $syntax_oid = $schema_attr->getSyntaxOID(); + $syntax_oid = $schema_attr->getSyntaxOID(); - if ($syntax_oid) + if ($syntax_oid) foreach($multi_line_syntax_oids as $multi_line_syntax_oid) if ($multi_line_syntax_oid == $syntax_oid) { $return = true; break; } } - } + } + + if (DEBUG_ENABLED) + debug_log('is_multi_line_attr(): Entered with (%s,%s,%s), Returning (%s)',1,$attr_name,$val,$server_id,$return); - debug_log(sprintf('is_multi_line_attr(): Returning (%s)',$return),1); return $return; } @@ -117,7 +121,7 @@ function is_multi_line_attr( $attr_name, $val=null, $server_id=null ) { * @deprecated */ function get_view_deref_setting() { - global $config; + global $config; return $config->GetValue('deref','view'); } @@ -134,7 +138,6 @@ function get_view_deref_setting() { * @return bool */ function obfuscate_password_display($enc=null) { - debug_log(sprintf('obfuscate_password_display(): Entered with ()'),2); global $config; if ($config->GetValue('appearance','obfuscate_password_display')) @@ -146,7 +149,9 @@ function obfuscate_password_display($enc=null) { else $return = false; - debug_log(sprintf('obfuscate_password_display(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('obfuscate_password_display(): Entered with (%s), Returning (%s)',1,$enc,$return); + return $return; } @@ -161,16 +166,17 @@ function obfuscate_password_display($enc=null) { * @return string */ function pretty_print_dn( $dn ) { - debug_log(sprintf('pretty_print_dn(): Entered with (%s)',$dn),2); + if (DEBUG_ENABLED) + debug_log('pretty_print_dn(): Entered with (%s)',2,$dn); $dn = pla_explode_dn( $dn ); foreach( $dn as $i => $element ) { - $element = htmlspecialchars( $element ); - $element = explode( '=', $element, 2 ); - $element = implode( '=', $element ); + $element = htmlspecialchars($element); + $element = explode('=',$element,2); + $element = implode('=',$element); $dn[$i] = $element; } - $dn = implode( ',', $dn ); + $dn = implode(',',$dn); return $dn; } @@ -185,7 +191,8 @@ function pretty_print_dn( $dn ) { * @todo Move this to an LDAPServer object method. */ function is_dn_attr( $ldapserver, $attr_name ) { - debug_log(sprintf('is_dn_attr(): Entered with (%s,%s)',$ldapserver->server_id,$attr_name),2); + if (DEBUG_ENABLED) + debug_log('is_dn_attr(): Entered with (%s,%s)',2,$ldapserver->server_id,$attr_name); // Simple test first $dn_attrs = array( "aliasedObjectName" ); @@ -194,7 +201,7 @@ function is_dn_attr( $ldapserver, $attr_name ) { return true; // Now look at the schema OID - $attr_schema = get_schema_attribute( $ldapserver, $attr_name ); + $attr_schema = $ldapserver->getSchemaAttribute($attr_name); if( ! $attr_schema ) return false; @@ -204,8 +211,8 @@ function is_dn_attr( $ldapserver, $attr_name ) { if( '1.3.6.1.4.1.1466.115.121.1.34' == $syntax_oid ) return true; - $syntaxes = get_schema_syntaxes( $ldapserver ); - if( ! isset( $syntaxes[ $syntax_oid ] ) ) + $syntaxes = $ldapserver->SchemaSyntaxes(); + if (! isset($syntaxes[$syntax_oid])) return false; $syntax_desc = $syntaxes[ $syntax_oid ]->getDescription(); @@ -226,33 +233,35 @@ function is_dn_attr( $ldapserver, $attr_name ) { * @see unit_test.php * @return bool */ -function is_dn_string( $str ) { - debug_log(sprintf('is_dn_string(): Entered with (%s)',$str),2); +function is_dn_string($str) { + if (DEBUG_ENABLED) + debug_log('is_dn_string(): Entered with (%s)',2,$str); - // Try to break the string into its component parts if it can be done - // ie, "uid=Manager" "dc=example" and "dc=com" - $parts = pla_explode_dn( $str ); - if( ! is_array( $parts ) ) - return false; - if( 0 == count( $parts ) ) - return false; + /* Try to break the string into its component parts if it can be done + ie, "uid=Manager" "dc=example" and "dc=com" */ + $parts = pla_explode_dn($str); + if (! is_array($parts) || ! count($parts)) + return false; - // Foreach of the "parts", look for an "=" character, - // and make sure neither the left nor the right is empty - foreach( $parts as $part ) { - if( false === strpos( $part, "=" ) ) - return false; - $sub_parts = explode( "=", $part, 2 ); - $left = $sub_parts[0]; - $right = $sub_parts[1]; - if( 0 == strlen( trim( $left ) ) || 0 == strlen( trim( $right ) ) ) - return false; - if( false !== strpos( $left, '#' ) ) - return false; - } + /* Foreach of the "parts", look for an "=" character, + and make sure neither the left nor the right is empty */ + foreach ($parts as $part) { + if (! strpos($part,"=")) + return false; - // We survived the above rigor. This is a bonified DN string. - return true; + $sub_parts = explode("=",$part,2); + $left = $sub_parts[0]; + $right = $sub_parts[1]; + + if ( ! strlen(trim($left)) || ! strlen(trim($right))) + return false; + + if (strpos($left,'#') !== false) + return false; + } + + # We survived the above rigor. This is a bonified DN string. + return true; } /** @@ -262,14 +271,16 @@ function is_dn_string( $str ) { * @return bool Returns true if the specified string looks like * an email address or false otherwise. */ -function is_mail_string( $str ) { - debug_log(sprintf('is_mail_string(): Entered with (%s)',$str),2); +function is_mail_string($str) { + if (DEBUG_ENABLED) + debug_log('is_mail_string(): Entered with (%s)',2,$str); - $mail_regex = "/^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*$/"; - if( preg_match( $mail_regex, $str ) ) - return true; - else - return false; + $mail_regex = "/^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*$/"; + + if (preg_match($mail_regex,$str)) + return true; + else + return false; } /** @@ -279,14 +290,16 @@ function is_mail_string( $str ) { * @return bool Returns true if the specified string looks like * a web URL or false otherwise. */ -function is_url_string( $str ) { - debug_log(sprintf('is_url_string(): Entered with (%s)',$str),2); +function is_url_string($str) { + if (DEBUG_ENABLED) + debug_log('is_url_string(): Entered with (%s)',2,$str); - $url_regex = '/(ftp|https?):\/\/+[\w\.\-\/\?\=\&]*\w+/'; - if( preg_match( $url_regex, $str ) ) - return true; - else - return false; + $url_regex = '/(ftp|https?):\/\/+[\w\.\-\/\?\=\&]*\w+/'; + + if (preg_match($url_regex,$str)) + return true; + else + return false; } /** @@ -304,8 +317,6 @@ function is_url_string( $str ) { * @return bool */ function pla_set_cookie( $name, $val, $expire=null, $dir=null ) { - debug_log(sprintf('pla_set_cookie(): Entered with (%s,%s,%s,%s)',$name,$val,$expire,$dir),2); - global $config; # Set default return @@ -324,7 +335,9 @@ function pla_set_cookie( $name, $val, $expire=null, $dir=null ) { $return = true; } - debug_log(sprintf('pla_set_cookie(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('pla_set_cookie(): Entered with (%s,%s,%s,%s), Returning (%s)',1,$name,$val,$expire,$dir,$return); + return $return; } @@ -350,49 +363,51 @@ function pla_set_cookie( $name, $val, $expire=null, $dir=null ) { * @see unset_login_dn */ function set_login_dn($ldapserver,$dn,$password,$anon_bind) { - debug_log(sprintf('set_login_dn(): Entered with (%s,%s,%s,%s)', - $ldapserver->server_id,$dn,$password,$anon_bind),2); + if (DEBUG_ENABLED) + debug_log('set_login_dn(): Entered with (%s,%s,%s,%s)',2,$ldapserver->server_id,$dn,$password,$anon_bind); if (! $ldapserver->auth_type) return false; - switch( $ldapserver->auth_type ) - { + switch ($ldapserver->auth_type) { case 'cookie': $cookie_dn_name = sprintf("pla_login_dn_%s",$ldapserver->server_id); $cookie_pass_name = sprintf("pla_login_pass_%s",$ldapserver->server_id); - // we set the cookie password to 0 for anonymous binds. - if( $anon_bind ) { + # we set the cookie password to 0 for anonymous binds. + if ($anon_bind) { $dn = 'anonymous'; $password = '0'; } - $res1 = pla_set_cookie( $cookie_dn_name, pla_blowfish_encrypt( $dn ) ); - $res2 = pla_set_cookie( $cookie_pass_name, pla_blowfish_encrypt( $password ) ); - if( $res1 && $res2 ) + $res1 = pla_set_cookie($cookie_dn_name,pla_blowfish_encrypt($dn)); + $res2 = pla_set_cookie($cookie_pass_name,pla_blowfish_encrypt($password)); + if ($res1 && $res2) return true; else return false; + break; case 'session': $sess_var_dn_name = sprintf("pla_login_dn_%s",$ldapserver->server_id); $sess_var_pass_name = sprintf("pla_login_pass_%s",$ldapserver->server_id); - // we set the cookie password to 0 for anonymous binds. - if( $anon_bind ) { + # we set the cookie password to 0 for anonymous binds. + if ($anon_bind) { $dn = 'anonymous'; $password = '0'; } - $_SESSION[ $sess_var_dn_name ] = pla_blowfish_encrypt( $dn ); - $_SESSION[ $sess_var_pass_name ] = pla_blowfish_encrypt ( $password ); + $_SESSION[$sess_var_dn_name] = pla_blowfish_encrypt($dn); + $_SESSION[$sess_var_pass_name] = pla_blowfish_encrypt($password); return true; + break; + default: global $lang; - pla_error( sprintf( $lang['unknown_auth_type'], htmlspecialchars( $ldapserver->auth_type ) ) ); + pla_error(sprintf($lang['unknown_auth_type'],htmlspecialchars($ldapserver->auth_type))); break; } } @@ -409,62 +424,65 @@ function set_login_dn($ldapserver,$dn,$password,$anon_bind) { * @see set_login_dn */ function unset_login_dn( $ldapserver ) { - debug_log(sprintf('unset_login_dn(): Entered with (%s)',$ldapserver->server_id),2); + if (DEBUG_ENABLED) + debug_log('unset_login_dn(): Entered with (%s)',2,$ldapserver->server_id); if (! $ldapserver->auth_type) return false; - switch( $ldapserver->auth_type ) - { + switch ($ldapserver->auth_type) { case 'cookie': - $logged_in_dn = get_logged_in_dn( $ldapserver ); - if( ! $logged_in_dn ) + $logged_in_dn = get_logged_in_dn($ldapserver); + if (! $logged_in_dn) return false; - $logged_in_pass = get_logged_in_pass( $ldapserver ); + $logged_in_pass = get_logged_in_pass($ldapserver); $anon_bind = $logged_in_dn == 'anonymous' ? true : false; - // set cookie with expire time already passed to erase cookie from client + # set cookie with expire time already passed to erase cookie from client $expire = time()-3600; $cookie_dn_name = sprintf("pla_login_dn_%s",$ldapserver->server_id); $cookie_pass_name = sprintf("pla_login_pass_%s",$ldapserver->server_id); - if( $anon_bind ) { - $res1 = pla_set_cookie( $cookie_dn_name, 'anonymous', $expire ); - $res2 = pla_set_cookie( $cookie_pass_name, '0', $expire ); + if ($anon_bind) { + $res1 = pla_set_cookie($cookie_dn_name,'anonymous',$expire); + $res2 = pla_set_cookie($cookie_pass_name,'0',$expire); + } else { - $res1 = pla_set_cookie( $cookie_dn_name, pla_blowfish_encrypt( $logged_in_dn ), $expire ); - $res2 = pla_set_cookie( $cookie_pass_name, pla_blowfish_encrypt( $logged_in_pass ), $expire ); + $res1 = pla_set_cookie($cookie_dn_name,pla_blowfish_encrypt($logged_in_dn),$expire); + $res2 = pla_set_cookie($cookie_pass_name,pla_blowfish_encrypt($logged_in_pass),$expire); } # Need to unset the cookies too, since they are still set if further processing occurs (eg: Timeout) unset($_COOKIE[$cookie_dn_name]); unset($_COOKIE[$cookie_pass_name]); - if( ! $res1 || ! $res2 ) + if (! $res1 || ! $res2) return false; else return true; + break; case 'session': - // unset session variables + # unset session variables $session_var_dn_name = sprintf("pla_login_dn_%s",$ldapserver->server_id); $session_var_pass_name = sprintf("pla_login_pass_%s",$ldapserver->server_id); - if( array_key_exists( $session_var_dn_name, $_SESSION ) ) - unset( $_SESSION[ $session_var_dn_name ] ); + if (array_key_exists($session_var_dn_name,$_SESSION)) + unset($_SESSION[$session_var_dn_name]); - if( array_key_exists( $session_var_pass_name, $_SESSION ) ) - unset( $_SESSION[ "$session_var_pass_name" ] ); + if (array_key_exists($session_var_pass_name,$_SESSION)) + unset($_SESSION[$session_var_pass_name]); session_write_close(); return true; + break; default: global $lang; - pla_error( sprintf( $lang['unknown_auth_type'], htmlspecialchars( $auth_type ) ) ); + pla_error(sprintf($lang['unknown_auth_type'],htmlspecialchars($auth_type))); break; } } @@ -479,8 +497,6 @@ function unset_login_dn( $ldapserver ) { * @return string The customized filename, if exists, or the standard one */ function get_custom_file($server_id,$filename,$path) { - debug_log(sprintf('get_custom_file(): Entered with (%s,%s,%s)',$server_id,$filename,$path),2); - global $ldapservers; # Set default return @@ -490,7 +506,9 @@ function get_custom_file($server_id,$filename,$path) { if (! is_null($custom) && is_file(realpath($path.$custom.$filename))) $return = $path.$custom.$filename; - debug_log(sprintf('get_custom_file(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('get_custom_file(): Entered with (%s,%s,%s), Returning (%s)',1,$server_id,$filename,$path,$return); + return $return; } @@ -503,8 +521,6 @@ function get_custom_file($server_id,$filename,$path) { * @return any The result of the called function */ function call_custom_function( $server_id, $function ) { - debug_log(sprintf('call_custom_function(): Entered with (%s,%s)',$server_id,$function),2); - global $ldapservers; # Set default return @@ -514,7 +530,9 @@ function call_custom_function( $server_id, $function ) { if (! is_null($custom) && function_exists($custom.$function)) $return = $custom.$filename; - debug_log(sprintf('get_custom_file(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('get_custom_file(): Entered with (%s,%s), Returning (%s)',1,$server_id,$function,$return); + return call_user_func($return ); } @@ -549,53 +567,56 @@ function call_custom_function( $server_id, $function ) { * @param string $dn2 The second of two DNs to compare * @return int */ -function pla_compare_dns( $dn1, $dn2 ) { - debug_log(sprintf('pla_compare_dns(): Entered with (%s,%s)',$dn1,$dn2),2); +function pla_compare_dns($dn1,$dn2) { + if (DEBUG_ENABLED) + debug_log('pla_compare_dns(): Entered with (%s,%s)',2,$dn1,$dn2); - // If they are obviously the same, return immediately - if( 0 === strcasecmp( $dn1, $dn2 ) ) + # If they are obviously the same, return immediately + if (! strcasecmp($dn1,$dn2)) return 0; - $dn1_parts = pla_explode_dn( pla_reverse_dn($dn1) ); - $dn2_parts = pla_explode_dn( pla_reverse_dn($dn2) ); - assert( is_array( $dn1_parts ) ); - assert( is_array( $dn2_parts ) ); + $dn1_parts = pla_explode_dn(pla_reverse_dn($dn1)); + $dn2_parts = pla_explode_dn(pla_reverse_dn($dn2)); + assert(is_array($dn1_parts)); + assert(is_array($dn2_parts)); - // Foreach of the "parts" of the smaller DN - for( $i=0; $i count($dn2_parts) ) { - return 1; - } elseif( count( $dn2_parts ) > count( $dn1_parts ) ) { - return -1; - } else { - return 0; - } + /* If we iterated through all entries in the smaller of the two DNs + (ie, the one with fewer parts), and the entries are different sized, + then, the smaller of the two must be "less than" than the larger. */ + if (count($dn1_parts) > count($dn2_parts)) { + return 1; + + } elseif (count($dn2_parts) > count($dn1_parts)) { + return -1; + + } else { + return 0; + } } /** @@ -607,10 +628,11 @@ function pla_compare_dns( $dn1, $dn2 ) { * @param string $attr_name The name of the attribute to examine. * @return string */ -function real_attr_name( $attr_name ) { - debug_log(sprintf('real_attr_name(): Entered with (%s)',$attr_name),2); +function real_attr_name($attr_name) { + if (DEBUG_ENABLED) + debug_log('real_attr_name(): Entered with (%s)',2,$attr_name); - $attr_name = preg_replace( "/;.*$/U", "", $attr_name ); + $attr_name = preg_replace('/;.*$/U','',$attr_name); return $attr_name; } @@ -637,7 +659,8 @@ function show_hints() { * @return bool True if auto uidNumbers are enabled, false otherwise. */ function auto_uid_numbers_enabled($server_id) { - debug_log(sprintf('auto_uid_numbers_enabled(): Entered with (%s)',$server_id),2); + if (DEBUG_ENABLED) + debug_log('auto_uid_numbers_enabled(): Entered with (%s)',2,$server_id); global $ldapservers; return $ldapservers->GetValue($server_id,'auto_number','enable'); @@ -671,12 +694,12 @@ function auto_uid_numbers_enabled($server_id) { * @todo Must turn off auto_uid|gid in template if config is disabled. */ function get_next_uid_number($ldapserver,$startbase='',$type='uid') { - global $config; $config->custom->debug['level'] = 9; $config->custom->debug['syslog'] = true; - debug_log(sprintf('get_next_uid_number(): Entered with (%s,%s,%s)',$ldapserver->server_id,$startbase,$type),2); + if (DEBUG_ENABLED) + debug_log('get_next_uid_number(): Entered with (%s,%s,%s)',2,$ldapserver->server_id,$startbase,$type); - global $ldapservers,$servers,$lang; + global $config,$ldapservers,$lang; - if (! auto_uid_numbers_enabled($ldapserver->server_id)) + if (! $ldapservers->GetValue($ldapserver->server_id,'auto_number','enable')) return false; # Based on the configured mechanism, go get the next available uidNumber! @@ -826,26 +849,23 @@ function get_next_uid_number($ldapserver,$startbase='',$type='uid') { * @see draw_jpeg_photos * @todo Move this to an LDAPServer object method. */ -function is_jpeg_photo( $ldapserver, $attr_name ) { - debug_log(sprintf('is_jpeg_photo(): Entered with (%s,%s)',$ldapserver->server_id,$attr_name),2); +function is_jpeg_photo($ldapserver,$attr_name) { + if (DEBUG_ENABLED) + debug_log('is_jpeg_photo(): Entered with (%s,%s)',2,$ldapserver->server_id,$attr_name); - // easy quick check - if( 0 == strcasecmp( $attr_name, 'jpegPhoto' ) || - 0 == strcasecmp( $attr_name, 'photo' ) ) - return true; + # easy quick check + if (! strcasecmp($attr_name,'jpegPhoto') || ! strcasecmp($attr_name,'photo')) + return true; - // go to the schema and get the Syntax OID - // require_once realpath( 'schema_functions.php' ); - $schema_attr = get_schema_attribute( $ldapserver, $attr_name ); - if( ! $schema_attr ) + # go to the schema and get the Syntax OID + $schema_attr = $ldapserver->getSchemaAttribute($attr_name); + if (! $schema_attr) return false; $oid = $schema_attr->getSyntaxOID(); $type = $schema_attr->getType(); - if( 0 == strcasecmp( $type, 'JPEG' ) ) - return true; - if( $oid == '1.3.6.1.4.1.1466.115.121.1.28' ) + if (! strcasecmp($type,'JPEG') || ($oid == '1.3.6.1.4.1.1466.115.121.1.28')) return true; return false; @@ -863,15 +883,15 @@ function is_jpeg_photo( $ldapserver, $attr_name ) { * @return bool * @todo Move this to an LDAPServer object method. */ -function is_attr_boolean( $ldapserver, $attr_name ) { - debug_log(sprintf('is_attr_boolean(): Entered with (%s,%s)',$ldapserver->server_id,$attr_name),2); +function is_attr_boolean($ldapserver,$attr_name) { + if (DEBUG_ENABLED) + debug_log('is_attr_boolean(): Entered with (%s,%s)',2,$ldapserver->server_id,$attr_name); - $type = ( $schema_attr = get_schema_attribute( $ldapserver, $attr_name ) ) ? - $schema_attr->getType() : null; + $type = ($schema_attr = $ldapserver->getSchemaAttribute($attr_name)) ? $schema_attr->getType() : null; - if( 0 == strcasecmp( 'boolean', $type ) || - 0 == strcasecmp( 'isCriticalSystemObject', $attr_name ) || - 0 == strcasecmp( 'showInAdvancedViewOnly', $attr_name ) ) + if (! strcasecmp('boolean',$type ) || + ! strcasecmp('isCriticalSystemObject',$attr_name) || + ! strcasecmp('showInAdvancedViewOnly',$attr_name)) return true; else @@ -892,10 +912,11 @@ function is_attr_boolean( $ldapserver, $attr_name ) { * @see is_jpeg_photo * @todo Move this to an LDAPServer object method. */ -function is_attr_binary( $ldapserver, $attr_name ) { - debug_log(sprintf('is_attr_binary(): Entered with (%s,%s)',$ldapserver->server_id,$attr_name),2); +function is_attr_binary($ldapserver,$attr_name) { + if (DEBUG_ENABLED) + debug_log('is_attr_binary(): Entered with (%s,%s)',2,$ldapserver->server_id,$attr_name); - $attr_name = strtolower( $attr_name ); + $attr_name = strtolower($attr_name); /** * Determining if an attribute is binary can be an expensive operation. * We cache the results for each attr name on each server in the $attr_cache @@ -927,7 +948,7 @@ function is_attr_binary( $ldapserver, $attr_name ) { } // See what the server schema says about this attribute - $schema_attr = get_schema_attribute( $ldapserver, $attr_name ); + $schema_attr = $ldapserver->getSchemaAttribute($attr_name); if( ! $schema_attr ) { // Strangely, some attributeTypes may not show up in the server @@ -975,7 +996,8 @@ function is_attr_binary( $ldapserver, $attr_name ) { * @todo Move this to an LDAPServer object method. */ function is_attr_read_only( $ldapserver, $attr ) { - debug_log(sprintf('is_attr_read_only(): Entered with (%s,%s)',$ldapserver->server_id,$attr),2); + if (DEBUG_ENABLED) + debug_log('is_attr_read_only(): Entered with (%s,%s)',2,$ldapserver->server_id,$attr); global $read_only_attrs, $read_only_except_dn; @@ -1016,7 +1038,8 @@ function is_attr_read_only( $ldapserver, $attr ) { * @return bool */ function is_attr_hidden( $ldapserver, $attr ) { - debug_log(sprintf('is_attr_hidden(): Entered with (%s,%s)',$ldapserver->server_id,$attr),2); + if (DEBUG_ENABLED) + debug_log('is_attr_hidden(): Entered with (%s,%s)',2,$ldapserver->server_id,$attr); global $hidden_attrs, $hidden_attrs_ro, $hidden_except_dn; @@ -1103,7 +1126,8 @@ function is_server_read_only( $server_id ) { * @return string */ function get_icon( $ldapserver, $dn ) { - debug_log(sprintf('get_icon(): Entered with (%s,%s)',$ldapserver->server_id,$dn),2); + if (DEBUG_ENABLED) + debug_log('get_icon(): Entered with (%s,%s)',2,$ldapserver->server_id,$dn); // fetch and lowercase all the objectClasses in an array $object_classes = get_object_attr( $ldapserver, $dn, 'objectClass', true ); @@ -1132,7 +1156,7 @@ function get_icon( $ldapserver, $dn ) { in_array( 'organizationalperson', $object_classes ) || in_array( 'inetorgperson', $object_classes ) || in_array( 'account', $object_classes ) || - in_array( 'posixaccount', $object_classes ) ) + in_array( 'posixaccount', $object_classes ) ) return 'user.png'; @@ -1288,7 +1312,8 @@ function get_icon( $ldapserver, $dn ) { * @see get_icon */ function get_icon_use_cache( $ldapserver, $dn ) { - debug_log(sprintf('get_icon_use_cache(): Entered with (%s,%s)',$ldapserver->server_id,$dn),2); + if (DEBUG_ENABLED) + debug_log('get_icon_use_cache(): Entered with (%s,%s)',2,$ldapserver->server_id,$dn); initialize_session_tree(); @@ -1362,7 +1387,8 @@ function have_auth_info( $server_id ) * @see get_logged_in_dn */ function get_logged_in_pass( $ldapserver ) { - debug_log(sprintf('get_logged_in_pass(): Entered with (%s)',$ldapserver->server_id),2); + if (DEBUG_ENABLED) + debug_log('get_logged_in_pass(): Entered with (%s)',2,$ldapserver->server_id); if (! $ldapserver->auth_type) return false; @@ -1414,8 +1440,6 @@ function get_logged_in_pass( $ldapserver ) { * @see get_logged_in_pass */ function get_logged_in_dn($ldapserver) { - debug_log(sprintf('get_logged_in_dn(): Entered with (%s)',$ldapserver->server_id),2); - # Set default return $return = false; @@ -1451,37 +1475,34 @@ function get_logged_in_dn($ldapserver) { } } - debug_log(sprintf('get_logged_in_dn(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('get_logged_in_dn(): Entered with (%s), Returning (%s)',1,$ldapserver->server_id,$return); + return $return; } /** * Appends a servers base to a "sub" dn or returns the base. * - * If $get_base is true, return at least the base, otherwise null. - * @param object $ldapserver The LDAPServer object of the server which the user hsa logged in. - * @return string|null - * @todo This function no longer return the base, since the LDAP server could have multiple bases. + * @param string $base The baseDN to be added if the DN is relative + * @param string $sub_dn The DN to be made absolute + * @return string|null Returns null if both base is null and sub_dn is null or empty */ -function expand_dn_with_base( $ldapserver,$sub_dn,$get_base=true ) { - debug_log(sprintf('expand_dn_with_base(): Entered with (%s,%s,%s)',$ldapserver->server_id,$sub_dn,$get_base),2); +function expand_dn_with_base( $base,$sub_dn ) { + if (DEBUG_ENABLED) + debug_log('expand_dn_with_base(): Entered with (%s,%s)',2,$base,$sub_dn); $empty_str = ( is_null($sub_dn) || ( ( $len = strlen( trim( $sub_dn ) ) ) == 0 ) ); if ( $empty_str ) { - // If we have no string and want not base - if ( ! $get_base ) - return null; + return $base; - } elseif ( $sub_dn[$len - 1] != ',' ) + } elseif ( $sub_dn[$len - 1] != ',' ) { // If we have a string which doesn't need a base return $sub_dn; - - if( ( $empty_str && $get_base ) || ! $empty_str ) { - if ( $ldapserver->getBaseDN() ) - return ( ! $empty_str ) ? $sub_dn . $ldapserver->getBaseDN() : $ldapserver->getBaseDN(); + } else { + return $sub_dn . $base; } - return null; } /** @@ -1518,8 +1539,9 @@ function expand_dn_with_base( $ldapserver,$sub_dn,$get_base=true ) { * @todo Move this to an LDAPServer object method. */ function get_container_contents( $ldapserver, $dn, $size_limit=0, $filter='(objectClass=*)', $deref=LDAP_DEREF_ALWAYS ) { - debug_log(sprintf('get_container_contents(): Entered with (%s,%s,%s,%s,%s)', - $ldapserver->server_id,$dn,$size_limit,$filter,$deref),2); + if (DEBUG_ENABLED) + debug_log('get_container_contents(): Entered with (%s,%s,%s,%s,%s)',2, + $ldapserver->server_id,$dn,$size_limit,$filter,$deref); $search = @ldap_list( $ldapserver->connect(), $dn, $filter, array( 'dn' ), 1, $size_limit, 0, $deref ); if( ! $search ) @@ -1552,7 +1574,8 @@ function get_container_contents( $ldapserver, $dn, $size_limit=0, $filter='(obje * automated method for setting up the initial structure for the tree viewer. */ function build_initial_tree() { - debug_log(sprintf('build_initial_tree(): Entered with ()'),2); + if (DEBUG_ENABLED) + debug_log('build_initial_tree(): Entered with ()',2); global $ldapservers; $return = array(); @@ -1564,7 +1587,9 @@ function build_initial_tree() { $return[$id] = array(); } - debug_log(sprintf('build_initial_tree(): Returning (%s)',serialize($return)),1); + if (DEBUG_ENABLED) + debug_log('build_initial_tree(): Returning (%s)',1,serialize($return)); + return $return; } @@ -1589,9 +1614,8 @@ function build_initial_tree() { * setting up the initial data structure for the tree viewer's icon cache. */ function build_initial_tree_icons() { - debug_log(sprintf('build_initial_tree_icons(): Entered with ()'),2); - global $ldapservers; + $return = array(); # initialize an empty array for each server @@ -1606,7 +1630,9 @@ function build_initial_tree_icons() { $return[$id][$base_dn] = get_icon($ldapserver,$base_dn); } - debug_log(sprintf('build_initial_tree_icons(): Returning (%s)',serialize($return)),1); + if (DEBUG_ENABLED) + debug_log('build_initial_tree_icons(): Entered with (), Returning (%s)',1,serialize($return)); + return $return; } @@ -1617,11 +1643,12 @@ function build_initial_tree_icons() { * automated method for checking the initial data structure of the session. */ function initialize_session_tree() { - debug_log(sprintf('initialize_session_tree(): Entered with ()'),2); + if (DEBUG_ENABLED) + debug_log('initialize_session_tree(): Entered with ()',2); // From the PHP manual: If you use $_SESSION don't use // session_register(), session_is_registered() or session_unregister()! - if( ! array_key_exists( 'tree', $_SESSION ) ) + if( ! array_key_exists( 'tree', $_SESSION ) ) $_SESSION['tree'] = build_initial_tree(); if( ! array_key_exists( 'tree_icons', $_SESSION ) ) $_SESSION['tree_icons'] = build_initial_tree_icons(); @@ -1667,10 +1694,11 @@ function initialize_session_tree() { * @todo Move this to an LDAPServer object method. */ function get_entry_system_attrs( $ldapserver, $dn, $deref=LDAP_DEREF_NEVER ) { - debug_log(sprintf('get_entry_system_attrs(): Entered with (%s,%s,%s)',$ldapserver->server_id,$dn,$deref),2); + if (DEBUG_ENABLED) + debug_log('get_entry_system_attrs(): Entered with (%s,%s,%s)',2,$ldapserver->server_id,$dn,$deref); $attrs = array( 'creatorsname', 'createtimestamp', 'modifiersname', - 'structuralObjectClass', 'entryUUID', 'modifytimestamp', + 'structuralObjectClass', 'entryUUID', 'modifytimestamp', 'subschemaSubentry', 'hasSubordinates', '+' ); $search = @ldap_read( $ldapserver->connect(), $dn, '(objectClass=*)', $attrs, 0, 0, 0, $deref ); @@ -1678,8 +1706,8 @@ function get_entry_system_attrs( $ldapserver, $dn, $deref=LDAP_DEREF_NEVER ) { return false; $entry = ldap_first_entry( $ldapserver->connect(), $search ); - if( ! $entry) - return false; + if (! $entry) + return false; $attrs = ldap_get_attributes( $ldapserver->connect(), $entry ); if( ! $attrs ) @@ -1748,8 +1776,9 @@ function get_entry_system_attrs( $ldapserver, $dn, $deref=LDAP_DEREF_NEVER ) { * @todo Move this to an LDAPServer object method. */ function get_object_attrs( $ldapserver, $dn, $lower_case_attr_names=false, $deref=LDAP_DEREF_NEVER ) { - debug_log(sprintf('get_object_attrs(): Entered with (%s,%s,%s,%s)', - $ldapserver->server_id,$dn,$lower_case_attr_names,$deref),2); + if (DEBUG_ENABLED) + debug_log('get_object_attrs(): Entered with (%s,%s,%s,%s)',2, + $ldapserver->server_id,$dn,$lower_case_attr_names,$deref); $search = @ldap_read( $ldapserver->connect(), $dn, '(objectClass=*)', array( ), 0, 0, 0, $deref ); if( ! $search ) @@ -1792,7 +1821,8 @@ function get_object_attrs( $ldapserver, $dn, $lower_case_attr_names=false, $dere * returns false. */ function is_printable_str($temp) { - debug_log(sprintf('is_printable_str(): Entered with (%s)',$temp),2); + if (DEBUG_ENABLED) + debug_log('is_printable_str(): Entered with (%s)',2,$temp); $len = strlen($temp); @@ -1840,8 +1870,9 @@ function is_printable_str($temp) { * @todo Move this to an LDAPServer object method. */ function get_object_attr( $ldapserver, $dn, $attr, $lower_case_attr_names=false, $deref=LDAP_DEREF_NEVER ) { - debug_log(sprintf('get_object_attr(): Entered with (%s,%s,%s,%s,%s)', - $ldapserver->server_id,$dn,$attr,$lower_case_attr_names,$deref),2); + if (DEBUG_ENABLED) + debug_log('get_object_attr(): Entered with (%s,%s,%s,%s,%s)',2, + $ldapserver->server_id,$dn,$attr,$lower_case_attr_names,$deref); if ($lower_case_attr_names) $attr = strtolower( $attr ); @@ -1920,11 +1951,16 @@ function get_object_attr( $ldapserver, $dn, $attr, $lower_case_attr_names=false, * @todo Move this to an LDAPServer object method. */ function pla_ldap_search( $ldapserver, $filter, $base_dn=null, $attrs=array(), $scope='sub', $sort_results=true, $deref=LDAP_DEREF_ALWAYS ) { - debug_log(sprintf('pla_ldap_search(): Entered with (%s,%s,%s,%s,%s,%s,%s)', - $ldapserver->server_id,$filter,$base_dn,count($attrs),$scope,$sort_results,$deref),2); + if (DEBUG_ENABLED) + debug_log('pla_ldap_search(): Entered with (%s,%s,%s,%s,%s,%s,%s)',2, + $ldapserver->server_id,$filter,$base_dn,count($attrs),$scope,$sort_results,$deref); - if( is_null($base_dn)) - $base_dn = $ldapserver->getBaseDN(); + if( is_null($base_dn)) { + foreach ($ldapserver->getBaseDN() as $baseDN) { + $base_dn = $baseDN; + break; + } + } switch( $scope ) { case 'base': @@ -1997,7 +2033,8 @@ function pla_ldap_search( $ldapserver, $filter, $base_dn=null, $attrs=array(), $ * @todo expand_dn_with_base no longer knows what the base_dn is, so you need to pass it the base, need to fix this function. */ function get_cleaned_up_predefined_search( $query_id ) { - debug_log(sprintf('get_cleaned_up_predefined_search(): Entered with (%s)',$query_id),2); + if (DEBUG_ENABLED) + debug_log('get_cleaned_up_predefined_search(): Entered with (%s)',2,$query_id); global $ldapservers,$queries; @@ -2013,7 +2050,10 @@ function get_cleaned_up_predefined_search( $query_id ) { $ldapserver = $ldapservers->Instance($server_id); $base = ( isset( $query['base'] ) ) ? $query['base'] : null; - $base = expand_dn_with_base( $ldapserver, $base ); + // Multiple base strings mean we can't do this properly + // Could just take the first entry or return an array rather than a string + // Ignore for now + // $base = expand_dn_with_base( $ldapserver, $base ); if( isset( $query['filter'] ) && strlen( trim( $query['filter'] ) ) > 0 ) $filter = $query['filter']; @@ -2063,7 +2103,8 @@ function check_server_id( $server_id ) { * @return string The generated salt string. */ function random_salt( $length ) { - debug_log(sprintf('random_salt(): Entered with (%s)',$length),2); + if (DEBUG_ENABLED) + debug_log('random_salt(): Entered with (%s)',2,$length); $possible = '0123456789'. 'abcdefghijklmnopqrstuvwxyz'. @@ -2072,8 +2113,8 @@ function random_salt( $length ) { $str = ""; mt_srand((double)microtime() * 1000000); - while( strlen( $str ) < $length ) - $str .= substr( $possible, ( rand() % strlen( $possible ) ), 1 ); + while( strlen( $str ) < $length ) + $str .= substr( $possible, ( rand() % strlen( $possible ) ), 1 ); /** * Commented out following line because of problem @@ -2097,7 +2138,8 @@ function random_salt( $length ) { * @see get_container */ function get_rdn( $dn, $include_attrs=0 ) { - debug_log(sprintf('get_rdn(): Entered with (%s,%s)',$dn,$include_attrs),2); + if (DEBUG_ENABLED) + debug_log('get_rdn(): Entered with (%s,%s)',2,$dn,$include_attrs); if( $dn == null ) return null; @@ -2121,7 +2163,8 @@ function get_rdn( $dn, $include_attrs=0 ) { * @see get_rdn */ function get_container( $dn ) { - debug_log(sprintf('get_container(): Entered with (%s)',$dn),2); + if (DEBUG_ENABLED) + debug_log('get_container(): Entered with (%s)',2,$dn); $parts = pla_explode_dn( $dn ); if( count( $parts ) <= 1 ) @@ -2134,35 +2177,43 @@ function get_container( $dn ) { /** * Given a DN string, this returns the top container portion of the string. + * @param object $ldapserver The LDAPserver being used. * @param string $dn The DN whose container string to return. * @return string The container * @see get_rdn * @see get_container * @todo: need to fix this, it should just produce the base_dn for the DN entered, not the top . */ -function get_container_top ( $dn ) { - debug_log(sprintf('get_container_top(): Entered with (%s)',$dn),2); +function get_container_top($ldapserver,$dn) { + # First determine which base this DN belongs to. + foreach ($ldapserver->getBaseDN() as $base_dn) { + if (preg_match("/${base_dn}$/",$dn)) { + $return = $base_dn; + break; + } + } - $parts = pla_explode_dn( $dn ); - if( count( $parts ) <= 1 ) - return $dn; - $container = $parts[count($parts)-1]; - return $container; + debug_log(sprintf('get_container_top(): Entered with (%s), Returning (%s)',$dn,$return),1); + return $return; } /** * Given a DN string and a path like syntax, this returns the parent container portion of the string. + * @param object $ldapserver The LDAPserver being used. * @param string $dn The DN whose container string to return. * @param string $path Either '/', '.' or a series of '../' * @return string The container * @see get_rdn * @see get_container */ -function get_container_parent ( $container, $path ) { - debug_log(sprintf('get_container_parent(): Entered with (%s,%s)',$container,$path),2); +function get_container_parent($ldapserver,$container,$path) { + if (DEBUG_ENABLED) + debug_log('get_container_parent(): Entered with (%s,%s)',2,$container,$path); + + $top = get_container_top($ldapserver,$container); if ($path == '/') { - return get_container_top($container); + return $top; } elseif ($path == '.') { return $container; @@ -2175,6 +2226,9 @@ function get_container_parent ( $container, $path ) { if (get_container($container)) $container = get_container($container); + if ($container == $top) + break; + } else { break; } @@ -2200,88 +2254,72 @@ function get_container_parent ( $container, $path ) { * */ function pla_verbose_error( $err_no ) { - debug_log(sprintf('pla_verbose_error(): Entered with (%s)',$err_no),2); + if (DEBUG_ENABLED) + debug_log('pla_verbose_error(): Entered with (%s)',2,$err_no); static $err_codes; - if( count($err_codes) > 0 ) { - if( isset( $err_codes[ $err_no ] ) ) - return $err_codes[ $err_no ]; - else - return array( 'title' => null, 'desc' => null ); + + if( count($err_codes) <= 0 ) { + $err_codes_file = LIBDIR.'ldap_error_codes.txt'; + + if (! file_exists($err_codes_file) || ! is_readable($err_codes_file) || ! ($f = fopen($err_codes_file,'r'))) + return false; + + $contents = fread( $f, filesize( $err_codes_file ) ); + fclose( $f ); + $entries = array(); + preg_match_all( "/0x[A-Fa-f0-9][A-Za-z0-9]\s+[0-9A-Za-z_]+\s+\"[^\"]*\"\n/", + $contents, $entries ); + $err_codes = array(); + foreach( $entries[0] as $e ) { + $entry = array(); + preg_match( "/(0x[A-Za-z0-9][A-Za-z0-9])\s+([0-9A-Za-z_]+)\s+\"([^\"]*)\"/", $e, $entry ); + $hex_code = isset( $entry[1] ) ? $entry[1] : null; + $title = isset( $entry[2] ) ? $entry[2] : null; + $desc = isset( $entry[3] ) ? $entry[3] : null; + $desc = preg_replace( "/\s+/", " ", $desc ); + $err_codes[ "$hex_code" ] = array( 'title' => $title, 'desc' => $desc ); + } } - $err_codes_file = LIBDIR.'ldap_error_codes.txt'; - - if( ! file_exists($err_codes_file)) - return false; - if( ! is_readable($err_codes_file)) - return false; - if( ! ($f = fopen($err_codes_file,'r'))) - return false; - - $contents = fread( $f, filesize( $err_codes_file ) ); - fclose( $f ); - $entries = array(); - preg_match_all( "/0x[A-Fa-f0-9][A-Za-z0-9]\s+[0-9A-Za-z_]+\s+\"[^\"]*\"\n/", $contents, $entries ); - $err_codes = array(); - foreach( $entries[0] as $e ) { - $entry = array(); - preg_match( "/(0x[A-Za-z0-9][A-Za-z0-9])\s+([0-9A-Za-z_]+)\s+\"([^\"]*)\"/", $e, $entry ); - $hex_code = isset( $entry[1] ) ? $entry[1] : null; - $title = isset( $entry[2] ) ? $entry[2] : null; - $desc = isset( $entry[3] ) ? $entry[3] : null; - $desc = preg_replace( "/\s+/", " ", $desc ); - $err_codes[ "$hex_code" ] = array( 'title' => $title, 'desc' => $desc ); - } - - // Sanity check - if( isset( $err_codes[ $err_no ] ) ) - return $err_codes[ $err_no ]; - else - return array( 'title' => null, 'desc' => null ); + if( isset( $err_codes[ $err_no ] ) ) + return $err_codes[ $err_no ]; + else + return array( 'title' => null, 'desc' => null ); } // @todo: describe this function function support_oid_to_text($oid_id) { - debug_log(sprintf('support_oid_to_text(): Entered with (%s)',$oid_id),2); + if (DEBUG_ENABLED) + debug_log('support_oid_to_text(): Entered with (%s)',2,$oid_id); static $oid; - if( count($oid) > 0 ) { - if( isset( $oid[ $oid_id ] ) ) - return $oid[ $oid_id ]; - else - return null; - } + if( count($oid) <= 0 ) { + $oid_codes_file = LIBDIR.'ldap_supported_oids.txt'; - $oid_codes_file = LIBDIR.'ldap_supported_oids.txt'; + if(! file_exists($oid_codes_file) || ! is_readable($oid_codes_file) || ! ($f = fopen($oid_codes_file,'r'))) + return false; - if( ! file_exists($oid_codes_file)) - return false; - if( ! is_readable($oid_codes_file)) - return false; - if( ! ($f = fopen($oid_codes_file,'r'))) - return false; + $contents = fread( $f, filesize( $oid_codes_file ) ); + fclose( $f ); + $entries = array(); + preg_match_all( "/[0-9]\..+\s+\"[^\"]*\"\n/", $contents, $entries ); + $err_codes = array(); + foreach( $entries[0] as $e ) { + $entry = array(); + preg_match( "/([0-9]\.([0-9]+\.)*[0-9]+)(\s+\"([^\"]*)\")?(\s+\"([^\"]*)\")?(\s+\"([^\"]*)\")?/", $e, $entry ); + $oid_id_a = isset( $entry[1] ) ? $entry[1] : null; - $contents = fread( $f, filesize( $oid_codes_file ) ); - fclose( $f ); - $entries = array(); - preg_match_all( "/[0-9]\..+\s+\"[^\"]*\"\n/", $contents, $entries ); - $err_codes = array(); - foreach( $entries[0] as $e ) { - $entry = array(); - preg_match( "/([0-9]\.([0-9]+\.)*[0-9]+)(\s+\"([^\"]*)\")?(\s+\"([^\"]*)\")?(\s+\"([^\"]*)\")?/", $e, $entry ); - $oid_id_a = isset( $entry[1] ) ? $entry[1] : null; - - if ($oid_id_a) { - $oid[$oid_id_a]['title'] = isset( $entry[4] ) ? $entry[4] : null; - $oid[$oid_id_a]['ref'] = isset( $entry[6] ) ? $entry[6] : null; - $desc = isset( $entry[8] ) ? $entry[8] : null; - $oid[$oid_id_a]['desc'] = preg_replace( "/\s+/", " ", $desc ); + if ($oid_id_a) { + $oid[$oid_id_a]['title'] = isset( $entry[4] ) ? $entry[4] : null; + $oid[$oid_id_a]['ref'] = isset( $entry[6] ) ? $entry[6] : null; + $desc = isset( $entry[8] ) ? $entry[8] : null; + $oid[$oid_id_a]['desc'] = preg_replace( "/\s+/", " ", $desc ); + } } } - // Sanity check if( isset( $oid[ $oid_id ] ) ) return $oid[ $oid_id ]; else @@ -2304,9 +2342,10 @@ function support_oid_to_text($oid_id) { * @see pla_verbose_error */ function pla_error( $msg, $ldap_err_msg=null, $ldap_err_no=-1, $fatal=true ) { - debug_log(sprintf('pla_error(): Entered with (%s,%s,%s,%s)',$msg,$ldap_err_msg,$ldap_err_no,$fatal),2); + if (defined('DEBUG_ENABLED') && (DEBUG_ENABLED)) + debug_log('pla_error(): Entered with (%s,%s,%s,%s)',2,$msg,$ldap_err_msg,$ldap_err_no,$fatal); - @include_once './header.php'; + @include_once HTDOCDIR.'header.php'; global $lang, $config; ?> @@ -2318,7 +2357,8 @@ function pla_error( $msg, $ldap_err_msg=null, $ldap_err_no=-1, $fatal=true ) {

@@ -2383,7 +2424,8 @@ function pla_error( $msg, $ldap_err_msg=null, $ldap_err_no=-1, $fatal=true ) { * @see set_error_handler */ function pla_error_handler( $errno, $errstr, $file, $lineno ) { - debug_log(sprintf('pla_error_handler(): Entered with (%s,%s,%s,%s)',$errno,$errstr,$file,$lineno),2); + if (DEBUG_ENABLED) + debug_log('pla_error_handler(): Entered with (%s,%s,%s,%s)',2,$errno,$errstr,$file,$lineno); global $lang; @@ -2398,7 +2440,7 @@ function pla_error_handler( $errno, $errstr, $file, $lineno ) { $caller = basename( $_SERVER['PHP_SELF'] ); $errtype = ""; switch( $errno ) { - case E_STRICT: $errtype = "E_STRICT"; break; + case E_STRICT: $errtype = "E_STRICT"; break; case E_ERROR: $errtype = "E_ERROR"; break; case E_WARNING: $errtype = "E_WARNING"; break; case E_PARSE: $errtype = "E_PARSE"; break; @@ -2435,8 +2477,9 @@ function pla_error_handler( $errno, $errstr, $file, $lineno ) { * in config.php. This is simply used so we can more easily lookup user-friendly * attributes configured by the admin. */ -function process_friendly_attr_table() { - debug_log(sprintf('process_friendly_attr_table(): Entered with ()'),2); +function process_friendly_attr_table() { + if (DEBUG_ENABLED) + debug_log('process_friendly_attr_table(): Entered with ()',2); // require 'config.php'; global $friendly_attrs; @@ -2454,7 +2497,8 @@ function process_friendly_attr_table() { * Show friendly attribute. */ function show_friendly_attribute($attr) { - debug_log(sprintf('show_friendly_attribute(): Entered with (%s)',$attr),2); + if (DEBUG_ENABLED) + debug_log('show_friendly_attribute(): Entered with (%s)',2,$attr); $friendly_attrs = process_friendly_attr_table(); @@ -2463,7 +2507,8 @@ function show_friendly_attribute($attr) { else $return = $attr; - debug_log(sprintf('show_friendly_attribute(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('show_friendly_attribute(): Returning (%s)',1,$return); return $return; } @@ -2478,13 +2523,11 @@ function show_friendly_attribute($attr) { * @todo Move this to an LDAPServer object method. */ function dn_exists($ldapserver,$dn) { - debug_log(sprintf('dn_exists(): Entered with (%s,%s)',$ldapserver->server_id,$dn),2); - - $search_result = @ldap_read($ldapserver->connect(false),$dn,'objectClass=*',array('dn')); - # Set default return $return = false; + $search_result = @ldap_read($ldapserver->connect(false),$dn,'objectClass=*',array('dn')); + if ($search_result) { $num_entries = ldap_count_entries($ldapserver->connect(false),$search_result); @@ -2494,7 +2537,9 @@ function dn_exists($ldapserver,$dn) { $return = false; } - debug_log(sprintf('dn_exists(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('dn_exists(): Entered with (%s,%s), Returning (%s)',1,$ldapserver->server_id,$dn,$return); + return $return; } @@ -2521,9 +2566,11 @@ function dn_exists($ldapserver,$dn) { */ function draw_jpeg_photos( $ldapserver, $dn, $attr_name='jpegPhoto', $draw_delete_buttons=false, $draw_bytes_and_size=true, $table_html_attrs='align="left"', $img_html_attrs='' ) { - debug_log(sprintf('draw_jpeg_photos(): Entered with (%s,%s,%s,%s,%s,%s,%s)', - $ldapserver->server_id,$dn,$attr_name,$draw_delete_buttons,$draw_bytes_and_size, - $table_html_attrs,$img_html_attrs),2); + + if (DEBUG_ENABLED) + debug_log('draw_jpeg_photos(): Entered with (%s,%s,%s,%s,%s,%s,%s)',2, + $ldapserver->server_id,$dn,$attr_name,$draw_delete_buttons, + $draw_bytes_and_size,$table_html_attrs,$img_html_attrs); global $config, $lang; @@ -2628,7 +2675,8 @@ function draw_jpeg_photos( $ldapserver, $dn, $attr_name='jpegPhoto', $draw_delet * @return string The hashed password. */ function password_hash( $password_clear, $enc_type ) { - debug_log(sprintf('password_hash(): Entered with (%s,%s)',$password_clear,$enc_type),2); + if (DEBUG_ENABLED) + debug_log('password_hash(): Entered with (%s,%s)',2,$password_clear,$enc_type); global $lang; @@ -2718,7 +2766,8 @@ function password_hash( $password_clear, $enc_type ) { * @return Boolean True if the clear password matches the hash, and false otherwise. */ function password_check( $cryptedpassword, $plainpassword ) { - debug_log(sprintf('password_check(): Entered with (%s,%s)',$cryptedpassword,$plainpassword),2); + if (DEBUG_ENABLED) + debug_log('password_check(): Entered with (%s,%s)',2,$cryptedpassword,$plainpassword); global $lang; @@ -2727,7 +2776,7 @@ function password_check( $cryptedpassword, $plainpassword ) { $cryptedpassword = $cypher[2]; $_cypher = strtolower($cypher[1]); - } else { + } else { $_cypher = NULL; } @@ -2861,7 +2910,8 @@ function password_check( $cryptedpassword, $plainpassword ) { * @return string */ function get_enc_type( $user_password ) { - debug_log(sprintf('get_enc_type(): Entered with (%s)',$user_password),2); + if (DEBUG_ENABLED) + debug_log('get_enc_type(): Entered with (%s)',2,$user_password); /* Capture the stuff in the { } to determine if this is crypt, md5, etc. */ $enc_type = null; @@ -2898,7 +2948,8 @@ function get_enc_type( $user_password ) { * @return String The enc_type, like 'sha', 'md5', 'ssha', 'md5crypt', for example. */ function get_default_hash($server_id) { - debug_log(sprintf('get_default_hash(): Entered with (%s)',$server_id),2); + if (DEBUG_ENABLED) + debug_log('get_default_hash(): Entered with (%s)',2,$server_id); global $ldapservers; return $ldapservers->GetValue($server_id,'appearance','password_hash'); @@ -2911,9 +2962,10 @@ function get_default_hash($server_id) { * @return string The current version as read from the VERSION file. */ function pla_version() { - debug_log(sprintf('pla_version(): Entered with ()'),2); + if (DEBUG_ENABLED) + debug_log('pla_version(): Entered with ()',2); - $version_file = realpath('./VERSION'); + $version_file = realpath('../VERSION'); if (! file_exists($version_file)) return 'unknown version'; @@ -2934,7 +2986,8 @@ function pla_version() { * @param bool $include_choose_text (optional) If true, the function draws the localized text "choose" to the right of the button. */ function draw_chooser_link( $form_element, $include_choose_text=true, $rdn="none" ) { - debug_log(sprintf('draw_chooser_link(): Entered with (%s,%s,%s)',$form_element,$include_choose_text,$rdn),2); + if (DEBUG_ENABLED) + debug_log('draw_chooser_link(): Entered with (%s,%s,%s)',2,$form_element,$include_choose_text,$rdn); global $lang; @@ -2964,7 +3017,7 @@ function draw_chooser_link( $form_element, $include_choose_text=true, $rdn="none * * @return array An array of RDN parts of this format: * - * Array + * Array * ( * [0] => uid=ppratt * [1] => ou=People @@ -2974,19 +3027,20 @@ function draw_chooser_link( $form_element, $include_choose_text=true, $rdn="none * */ function pla_explode_dn( $dn, $with_attributes=0 ) { - debug_log(sprintf('pla_explode_dn(): Entered with (%s,%s)',$dn,$with_attributes),2); + # replace "\," with the hexadecimal value for safe split + $var = preg_replace("/\\\,/","\\\\\\\\2C",$dn); - // replace "\," with the hexadecimal value for safe split - $var = preg_replace("/\\\,/","\\\\\\\\2C",$dn); + # split the dn + $result = explode(",",$var); - // split the dn - $result = explode(",",$var); + # translate hex code into ascii for display + foreach( $result as $key => $value ) + $result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value); - //translate hex code into ascii for display - foreach( $result as $key => $value ) - $result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value); + if (DEBUG_ENABLED) + debug_log('pla_explode_dn(): Entered with (%s,%s), Returning (%s)',1,$dn,$with_attributes,serialize($result)); - return $result; + return $result; } /** @@ -2998,12 +3052,11 @@ function pla_explode_dn( $dn, $with_attributes=0 ) { * @return string The URL to the requested item. */ function get_href( $type, $extra_info='' ) { - debug_log(sprintf('get_href(): Entered with (%s,%s)',$type,$extra_info),2); - $group_id = "61828"; $bug_atid = "498546"; $rfe_atid = "498549"; $forum_id = "34809"; + switch( $type ) { case 'open_bugs': return "https://sourceforge.net/tracker/?group_id=$group_id&atid=$bug_atid"; case 'add_bug': return "https://sourceforge.net/tracker/?func=add&group_id=$group_id&atid=$bug_atid"; @@ -3022,9 +3075,7 @@ function get_href( $type, $extra_info='' ) { * @return double The current time in seconds since the beginning of the UNIX epoch (Midnight Jan. 1, 1970) */ function utime () { - debug_log(sprintf('utime(): Entered with ()'),2); - - $time = explode( " ", microtime()); + $time = explode(' ',microtime()); $usec = (double)$time[0]; $sec = (double)$time[1]; return $sec + $usec; @@ -3055,8 +3106,9 @@ function utime () { * @return string The string created from the array. */ function array_to_query_string( $array, $exclude_vars=array(), $url_encode_ampersands=true ) { - debug_log(sprintf('array_to_query_string(): Entered with (%s,%s,%s)', - count($array),count($exclude_vars),$url_encode_ampersands),2); + if (DEBUG_ENABLED) + debug_log('array_to_query_string(): Entered with (%s,%s,%s)',2, + count($array),count($exclude_vars),$url_encode_ampersands); if( ! is_array( $array ) ) return ''; @@ -3097,7 +3149,8 @@ function array_to_query_string( $array, $exclude_vars=array(), $url_encode_amper * @see pla_compare_dns */ function pla_reverse_dn($dn) { - debug_log(sprintf('pla_reverse_dn(): Entered with (%s)',$dn),2); + if (DEBUG_ENABLED) + debug_log('pla_reverse_dn(): Entered with (%s)',2,$dn); foreach (pla_explode_dn($dn) as $key => $branch) { @@ -3120,7 +3173,8 @@ function pla_reverse_dn($dn) { * otherwise. */ function is_unique_attr( $attr_name ) { - debug_log(sprintf('is_unique_attr(): Entered with (%s)',$attr_name),2); + if (DEBUG_ENABLED) + debug_log('is_unique_attr(): Entered with (%s)',2,$attr_name); global $unique_attrs; if( isset( $unique_attrs ) && is_array( $unique_attrs ) ) { @@ -3146,8 +3200,9 @@ function is_unique_attr( $attr_name ) { * @todo Move this to an LDAPServer object method. */ function checkUniqueAttr( $ldapserver, $dn, $attr_name, $new_value ) { - debug_log(sprintf('checkUniqueAttr(): Entered with (%s,%s,%s,%s)', - $ldapserver->server_id,$dn,$attr_name,count($new_value)),2); + if (DEBUG_ENABLED) + debug_log('checkUniqueAttr(): Entered with (%s,%s,%s,%s)',2, + $ldapserver->server_id,$dn,$attr_name,count($new_value)); global $ldapservers,$lang; @@ -3238,7 +3293,8 @@ function checkUniqueAttr( $ldapserver, $dn, $attr_name, $new_value ) { */ function sortAttrs($a,$b) { - debug_log(sprintf('sortAttrs(): Entered with (%s,%s)',$a,$b),2); + if (DEBUG_ENABLED) + debug_log('sortAttrs(): Entered with (%s,%s)',2,$a,$b); global $friendly_attrs, $attrs_display_order; @@ -3290,7 +3346,8 @@ function sortAttrs($a,$b) { * @todo Move this to an LDAPServer object method. */ function userIsMember($ldapserver,$user,$group) { - debug_log(sprintf('userIsMember(): Entered with (%s,%s,%s)',$ldapserver->server_id,$user,$group),2); + if (DEBUG_ENABLED) + debug_log('userIsMember(): Entered with (%s,%s,%s)',2,$ldapserver->server_id,$user,$group); $group = get_object_attrs( $ldapserver, $group, false, $deref=LDAP_DEREF_NEVER ); @@ -3310,7 +3367,8 @@ function userIsMember($ldapserver,$user,$group) { * @todo Move this to an LDAPServer object method. */ function userIsAllowedLogin($ldapserver,$user) { - debug_log(sprintf('userIsAllowedLogin(): Entered with (%s,%s)',$ldapserver->server_id,$user),2); + if (DEBUG_ENABLED) + debug_log('userIsAllowedLogin(): Entered with (%s,%s)',2,$ldapserver->server_id,$user); global $ldapservers; @@ -3320,18 +3378,22 @@ function userIsAllowedLogin($ldapserver,$user) { return true; foreach ($ldapservers->GetValue($ldapserver->server_id,'login','allowed_dns') as $login_allowed_dn) { - debug_log(sprintf('userIsAllowedLogin: Working through (%s)',$login_allowed_dn),9); + if (DEBUG_ENABLED) + debug_log('userIsAllowedLogin: Working through (%s)',9,$login_allowed_dn); // Check if $login_allowed_dn is an ldap search filter // Is first occurence of 'filter=' (case ensitive) at position 0 ? if ( preg_match('/^\([&|]\(/',$login_allowed_dn) ) { $filter = $login_allowed_dn; - foreach($ldapserver->getBaseDN() as $base_dn) { + foreach($ldapserver->getBaseDN() as $base_dn) { $results = array(); $results = pla_ldap_search( $ldapserver, $filter, $base_dn, array('dn') ); - debug_log(sprintf('userIsAllowedLogin: Search, Filter [%s], BaseDN [%s] Results [%s]', - $filter, $base_dn, is_array($results)),9); + + if (DEBUG_ENABLED) + debug_log('userIsAllowedLogin: Search, Filter [%s], BaseDN [%s] Results [%s]',9, + $filter, $base_dn, is_array($results)); + $dn_array = array(); if ($results) { @@ -3341,8 +3403,8 @@ function userIsAllowedLogin($ldapserver,$user) { if( count( $dn_array ) !== 0 ) foreach($dn_array as $result_dn) { - debug_log(sprintf('userIsAllowedLogin: Comparing with [%s]', - $result_dn),9); + if (DEBUG_ENABLED) + debug_log('userIsAllowedLogin: Comparing with [%s]',9,$result_dn); // Check if $result_dn is a user DN if ( 0 == strcasecmp( trim($user), trim(strtolower($result_dn)) ) ) @@ -3373,7 +3435,8 @@ function userIsAllowedLogin($ldapserver,$user) { * @returns array Array with values converted to lowercase. */ function arrayLower($array) { - debug_log(sprintf('arrayLower(): Entered with (%s)',serialize($array)),2); + if (DEBUG_ENABLED) + debug_log('arrayLower(): Entered with (%s)',2,serialize($array)); if (! is_array($array)) return $array; @@ -3392,7 +3455,8 @@ function arrayLower($array) { * $_GET, $_POST, or $_COOKIE. */ function array_stripslashes(&$array) { - debug_log(sprintf('array_stripslashes(): Entered with (%s)',serialize($array)),2); + if (DEBUG_ENABLED) + debug_log('array_stripslashes(): Entered with (%s)',2,serialize($array)); if (is_array($array)) while (list($key) = each($array)) @@ -3408,14 +3472,14 @@ function array_stripslashes(&$array) { * @return string|false The user agent string as reported by the browser. */ function get_user_agent_string() { - debug_log(sprintf('get_user_agent_string(): Entered with ()'),2); + if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) + $return = strtolower( $_SERVER['HTTP_USER_AGENT'] ); + else + $return = false; - if( isset( $_SERVER['HTTP_USER_AGENT'] ) ) - $return = strtolower( $_SERVER['HTTP_USER_AGENT'] ); - else - $return = false; + if (DEBUG_ENABLED) + debug_log('get_user_agent_string(): Entered with (), Returning (%s)',1,$return); - debug_log(sprintf('get_user_agent_string(): Returning (%s)',$return),1); return $return; } @@ -3424,8 +3488,6 @@ function get_user_agent_string() { * @return boolean True if the brower's OS is UNIX, false otherwise. */ function is_browser_os_unix() { - debug_log(sprintf('is_browser_os_unix(): Entered with ()'),2); - $agent_strs = array( 'sunos','sunos 4','sunos 5', 'i86', @@ -3443,7 +3505,9 @@ function is_browser_os_unix() { $return = string_in_array_value(get_user_agent_string(),$agent_strs); - debug_log(sprintf('is_browser_os_unix(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('is_browser_os_unix(): Entered with (), Returning (%s)',1,$return); + return $return; } @@ -3452,12 +3516,10 @@ function is_browser_os_unix() { * @return boolean True if the brower's OS is Windows, false otherwise. */ function is_browser_os_windows() { - debug_log(sprintf('is_browser_os_windows(): Entered with ()'),2); - $agent_strs = array( 'win','win95','windows 95', 'win16','windows 3.1','windows 16-bit','windows','win31','win16','winme', - 'win2k','winxp', + 'win2k','winxp', 'win98','windows 98','win9x', 'winnt','windows nt','win32', '32bit' @@ -3465,7 +3527,9 @@ function is_browser_os_windows() { $return = string_in_array_value(get_user_agent_string(),$agent_strs); - debug_log(sprintf('is_browser_os_windows(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('is_browser_os_windows(): Entered with (), Returning (%s)',1,$return); + return $return; } @@ -3474,15 +3538,15 @@ function is_browser_os_windows() { * @return boolean True if the brower's OS is mac, false otherwise. */ function is_browser_os_mac() { - debug_log(sprintf('is_browser_os_mac(): Entered with ()'),2); - $agent_strs = array( 'mac','68000','ppc','powerpc' - ); + ); $return = string_in_array_value(get_user_agent_string(),$agent_strs); - debug_log(sprintf('is_browser_os_windows(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('is_browser_os_windows(): Entered with (), Returning (%s)',1,$return); + return $return; } @@ -3494,10 +3558,8 @@ function is_browser_os_mac() { * @deprecated */ function get_posix_groups($ldapserver,$base_dn=null) { - debug_log(sprintf('get_posix_groups(): Entered with (%s,%s)',$ldapserver->server_id,$base_dn),2); - - if (is_null($base_dn)) - $base_dn = $ldapserver->getBaseDN(); + if (DEBUG_ENABLED) + debug_log('get_posix_groups(): Entered with (%s,%s)',2,$ldapserver->server_id,$base_dn); $results = pla_ldap_search($ldapserver,"objectclass=posixGroup",$base_dn,array()); @@ -3513,7 +3575,8 @@ function get_posix_groups($ldapserver,$base_dn=null) { * @return string The format to use. */ function get_default_search_display() { - debug_log(sprintf('get_default_search_display(): Entered with ()'),2); + if (DEBUG_ENABLED) + debug_log('get_default_search_display(): Entered with ()',2); global $default_search_display, $lang; @@ -3538,7 +3601,8 @@ function get_default_search_display() { * @return bool True if its there, false if its not. */ function in_array_ignore_case( $needle, $haystack ) { - debug_log(sprintf('in_array_ignore_case(): Entered with (%s,%s)',$needle,serialize($haystack)),2); + if (DEBUG_ENABLED) + debug_log('in_array_ignore_case(): Entered with (%s,%s)',2,$needle,serialize($haystack)); if( ! is_array( $haystack ) ) return false; @@ -3560,8 +3624,6 @@ function in_array_ignore_case( $needle, $haystack ) { * @return bool True if its there, false if its not. */ function string_in_array_value( $needle, $haystack ) { - debug_log(sprintf('string_in_array_value(): Entered with (%s,%s)',$needle,serialize($haystack)),2); - # Set default return $return = false; @@ -3574,7 +3636,9 @@ function string_in_array_value( $needle, $haystack ) { break; } - debug_log(sprintf('string_in_array_value(): Returning (%s)',$return),1); + if (DEBUG_ENABLED) + debug_log('string_in_array_value(): Entered with (%s,%s), Returning (%s)',1,$needle,serialize($haystack),$return); + return $return; } @@ -3589,44 +3653,27 @@ function string_in_array_value( $needle, $haystack ) { * @return string the padded string */ function full_str_pad($input, $pad_length, $pad_string = '', $pad_type = 0) { - debug_log(sprintf('full_str_pad(): Entered with (%s,%s,%s,%s)',$input,$pad_length,$pad_string,$pad_type),2); + if (DEBUG_ENABLED) + debug_log('full_str_pad(): Entered with (%s,%s,%s,%s)',2,$input,$pad_length,$pad_string,$pad_type); - $str = ''; - $length = $pad_length - strlen($input); - if ($length > 0) { // str_repeat doesn't like negatives - if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1 - $str = $input.str_repeat($pad_string, $length); - } elseif ($pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2 - $str = str_repeat($pad_string, floor($length/2)); - $str .= $input; - $str .= str_repeat($pad_string, ceil($length/2)); - } else { // defaults to STR_PAD_LEFT == 0 - $str = str_repeat($pad_string, $length).$input; - } - } else { // if $length is negative or zero we don't need to do anything - $str = $input; - } - return $str; -} + $str = ''; + $length = $pad_length - strlen($input); -/** - * Gets the user configured session blowfish secret from config.php. - * - * @return string|error Return the blowfish secret, or jump to an error. - */ -function get_blowfish_secret() { - debug_log(sprintf('get_blowfish_secret(): Entered with ()'),2); + if ($length > 0) { // str_repeat doesn't like negatives + if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1 + $str = $input.str_repeat($pad_string, $length); + } elseif ($pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2 + $str = str_repeat($pad_string, floor($length/2)); + $str .= $input; + $str .= str_repeat($pad_string, ceil($length/2)); + } else { // defaults to STR_PAD_LEFT == 0 + $str = str_repeat($pad_string, $length).$input; + } - global $config, $lang; - - $return = $config->GetValue('session','blowfish'); - - # If our default is blank, then generate an error. - if (! trim($return)) - pla_error( $lang['no_blowfish_secret'] ); - - debug_log(sprintf('get_blowfish_secret(): Returned (%s)',is_null($return)),2); - return $return; + } else { // if $length is negative or zero we don't need to do anything + $str = $input; + } + return $str; } /** @@ -3642,11 +3689,18 @@ function get_blowfish_secret() { * @author lem9 (taken from the phpMyAdmin source) */ function pla_blowfish_encrypt( $data, $secret=null ) { - debug_log(sprintf('pla_blowfish_encrypt(): Entered with (%s,%s)',$data,$secret),2); + if (DEBUG_ENABLED) + debug_log('pla_blowfish_encrypt(): Entered with (%s,%s)',2,$data,$secret); + + global $config; # If our secret is null or blank, get the default. if( $secret === null || ! trim($secret)) - $secret = get_blowfish_secret(); + $secret = $config->GetValue('session','blowfish'); + + # If the secret isnt set, then just return the data. + if (! trim($secret)) + return $data; require_once LIBDIR.'blowfish.php'; @@ -3677,7 +3731,10 @@ function pla_blowfish_encrypt( $data, $secret=null ) { * @author lem9 (taken from the phpMyAdmin source) */ function pla_blowfish_decrypt( $encdata, $secret=null ) { - debug_log(sprintf('pla_blowfish_decrypt(): Entered with (%s,%s)',$encdata,$secret),2); + if (DEBUG_ENABLED) + debug_log('pla_blowfish_decrypt(): Entered with (%s,%s)',2,$encdata,$secret); + + global $config; // This cache gives major speed up for stupid callers :) static $cache = array(); @@ -3687,7 +3744,11 @@ function pla_blowfish_decrypt( $encdata, $secret=null ) { # If our secret is null or blank, get the default. if( $secret === null || ! trim($secret)) - $secret = get_blowfish_secret(); + $secret = $config->GetValue('session','blowfish'); + + # If the secret isnt set, then just return the data. + if (! trim($secret)) + return $encdata; require_once LIBDIR.'blowfish.php'; @@ -3708,36 +3769,44 @@ function pla_blowfish_decrypt( $encdata, $secret=null ) { * Gets a DN string using the user-configured tree_display_format string to format it. */ function draw_formatted_dn( $ldapserver, $dn ) { - debug_log(sprintf('draw_formatted_dn(): Entered with (%s,%s)',$ldapserver->server_id,$dn),2); + if (DEBUG_ENABLED) + debug_log('draw_formatted_dn(): Entered with (%s,%s)',2,$ldapserver->server_id,$dn); global $config; - $format = $config->GetValue('appearance','tree_display_format'); - preg_match_all( "/%[a-zA-Z_0-9]+/", $format, $tokens ); - $tokens = $tokens[0]; - foreach( $tokens as $token ) { - if( 0 == strcasecmp( $token, '%dn' ) ) - $format = str_replace( $token, pretty_print_dn( $dn ), $format ); - elseif( 0 == strcasecmp( $token, '%rdn' ) ) - $format = str_replace( $token, pretty_print_dn( get_rdn( $dn ) ), $format ); - elseif( 0 == strcasecmp( $token, '%rdnvalue' ) ) { - $rdn = get_rdn( $dn ); - $rdn_value = explode( '=', $rdn, 2 ); - $rdn_value = $rdn_value[1]; - $format = str_replace( $token, $rdn_value, $format ); - } else { - $attr_name = str_replace( '%', '', $token ); - $attr_values = get_object_attr( $ldapserver, $dn, $attr_name ); - if( null == $attr_values ) - $display = 'none'; - elseif( is_array( $attr_values ) ) - $display = htmlspecialchars( implode( ', ', $attr_values ) ); - else - $display = htmlspecialchars( $attr_values ); - $format = str_replace( $token, $display, $format ); - } - } - echo $format; + $format = $config->GetValue('appearance','tree_display_format'); + preg_match_all( "/%[a-zA-Z_0-9]+/", $format, $tokens ); + $tokens = $tokens[0]; + foreach( $tokens as $token ) { + if( 0 == strcasecmp( $token, '%dn' ) ) + $format = str_replace( $token, pretty_print_dn( $dn ), $format ); + + elseif( 0 == strcasecmp( $token, '%rdn' ) ) + $format = str_replace( $token, pretty_print_dn( get_rdn( $dn ) ), $format ); + + elseif( 0 == strcasecmp( $token, '%rdnvalue' ) ) { + $rdn = get_rdn( $dn ); + $rdn_value = explode( '=', $rdn, 2 ); + $rdn_value = $rdn_value[1]; + $format = str_replace( $token, $rdn_value, $format ); + + } else { + $attr_name = str_replace( '%', '', $token ); + $attr_values = get_object_attr( $ldapserver, $dn, $attr_name ); + + if( null == $attr_values ) + $display = 'none'; + + elseif( is_array( $attr_values ) ) + $display = htmlspecialchars( implode( ', ', $attr_values ) ); + + else + $display = htmlspecialchars( $attr_values ); + + $format = str_replace( $token, $display, $format ); + } + } + echo $format; } /** @@ -3745,7 +3814,8 @@ function draw_formatted_dn( $ldapserver, $dn ) { * @deprecated */ function get_date_format() { - debug_log(sprintf('get_date_format(): Entered with ()'),2); + if (DEBUG_ENABLED) + debug_log('get_date_format(): Entered with ()',2); global $config; @@ -3756,13 +3826,14 @@ function get_date_format() { * Takes a shadow* attribute and returns the date as an integer. */ function shadow_date( $attrs, $attr) { - debug_log(sprintf('shadow_date(): Entered with (%s,%s)',serialize($attrs),$attr),2); + if (DEBUG_ENABLED) + debug_log('shadow_date(): Entered with (%s,%s)',2,serialize($attrs),$attr); $shadowLastChange = isset($attrs['shadowLastChange']) ? $attrs['shadowLastChange'][0] : null; $shadowMax = isset($attrs['shadowMax']) ? $attrs['shadowMax'][0] : null; if( 0 == strcasecmp( $attr, 'shadowLastChange' ) && $shadowLastChange) - $shadow_date = $shadowLastChange; + $shadow_date = $shadowLastChange; elseif ( 0 == strcasecmp( $attr, 'shadowMax' ) && ($shadowMax > 0) && $shadowLastChange ) $shadow_date = $shadowLastChange+$shadowMax; @@ -3792,7 +3863,8 @@ function shadow_date( $attrs, $attr) { * @return string $result String that is ready for the search filter. */ function clean_search_vals( $val ) { - debug_log(sprintf('clean_search_vals(): Entered with (%s)',$val),2); + if (DEBUG_ENABLED) + debug_log('clean_search_vals(): Entered with (%s)',2,$val); # Remove any escaped brackets already. $val = preg_replace("/\\\\([\(\)])/","$1",$val); @@ -3809,8 +3881,8 @@ function clean_search_vals( $val ) { * Server html select list */ function server_select_list ($select_id=null,$only_logged_on=true,$select_name='server_id',$js_script=null) { - debug_log(sprintf('server_select_list(): Entered with (%s,%s,%s,%s)', - $select_id,$only_logged_on,$select_name,$js_script),2); + if (DEBUG_ENABLED) + debug_log('server_select_list(): Entered with (%s,%s,%s,%s)',2,$select_id,$only_logged_on,$select_name,$js_script); global $ldapservers; @@ -3848,8 +3920,6 @@ function server_select_list ($select_id=null,$only_logged_on=true,$select_name=' } function server_info_list() { - debug_log(sprintf('server_info_list(): Entered with ()'),2); - global $ldapservers; $server_info_list = array(); @@ -3862,10 +3932,12 @@ function server_info_list() { $server_info_list[$id]['id'] = $id; $server_info_list[$id]['name'] = $ldapserver->name; - $server_info_list[$id]['base_dn'] = $ldapserver->getBaseDN(); + $server_info_list[$id]['base_dns'] = $ldapserver->getBaseDN(); } - debug_log(sprintf('server_info_list(): Returning (%s)',serialize($server_info_list)),1); + if (DEBUG_ENABLED) + debug_log('server_info_list(): Entered with (), Returning (%s)',1,serialize($server_info_list)); + return $server_info_list; } @@ -3875,6 +3947,11 @@ function server_info_list() { * If the log level of the message is less than the log level of the debug setting in the config file * then log the message to syslog. * + * This has been extended to allow multiple arguments after the level. + * If this form is used then the $msg is treated as a sprintf format + * and the remaining arguments are passed to this. The advantage of this + * is that the string is only composed if the message is going to be logged. + * * Suggested logging level messages: * 1 = Return results from function calls. * 2 = Entry parameters to function calls. @@ -3888,24 +3965,47 @@ function server_info_list() { */ function debug_log($msg,$level=0) { - global $config; + global $config,$debug_file; - # In case we are called before we are fully initialised. - if (! isset($config)) + # In case we are called before we are fully initialised or if debugging is not set. + if (! isset($config) || ! ($config->GetValue('debug','file') || $config->GetValue('debug','syslog'))) return false; $debug_level = $config->GetValue('debug','level'); - - $caller = basename( $_SERVER['PHP_SELF'] ); if (! $debug_level) $debug_level = -1; + if ($level > $debug_level) + return false; + + $caller = basename( $_SERVER['PHP_SELF'] ); - if ($level <= $debug_level) - return syslog_notice( sprintf('%s(%s): %s',$caller,$level,$msg) ); + if (func_num_args() > 2) { + $args = func_get_args(); + unset($args[0]); + unset($args[1]); + $msg = vsprintf($msg, array_values($args)); + } + + if ($level <= $debug_level) { + $debug_message = sprintf('%s(%s): %s',basename($_SERVER['PHP_SELF']),$level,substr($msg,0,200)); + + if ($debug_file || $config->GetValue('debug','file')) { + if (! $debug_file) + $debug_file = fopen($config->GetValue('debug','file'),'w'); +//@todo: change this to append. + + fwrite($debug_file,$debug_message."\n"); + } + + if ($config->GetValue('debug','syslog')) + syslog_notice($debug_message); + } + return syslog_notice( sprintf('%s(%s): %s',$caller,$level,$msg) ); } -function enc_type_select_list($enc_type) { - debug_log(sprintf('enc_type_select_list(): Entered with (%s)',$enc_type),2); +function enc_type_select_list($enc_type) { + if (DEBUG_ENABLED) + debug_log('enc_type_select_list(): Entered with (%s)',2,$enc_type); $html = '',$args[2]); + $detail['value'] = sprintf(''; + $detail['value'] .= ''; break; case 'RandomPassword' : - $detail['default'] = password_generate(); + $detail['value'] = password_generate(); printf('', - $lang['random_password'],$detail['default']); + $lang['random_password'],$detail['value']); break; case 'DrawChooserLink' : - $detail['default'] = draw_chooser_link(sprintf("template_form.%s%s",$args[0],$counter),$args[1]); + $detail['value'] = draw_chooser_link(sprintf("template_form.%s%s",$args[0],$counter),$args[1]); break; @@ -494,31 +551,36 @@ class Templates { # Call the PHP function if exists (PHP 4 >= 4.0.4, PHP 5) if (function_exists($function_name)) - $detail['default'] = call_user_func_array($function_name,$args); + $detail['value'] = call_user_func_array($function_name,$args); break; - default : $detail['default'] = 'UNKNOWN'; + default : $detail['value'] = 'UNKNOWN'; } - $return = $detail['default']; + $return = $detail['value']; } else { - $return = $default; + $return = $value; } - debug_log(sprintf('%s::EvaluateDefault(): Returning (%s)',get_class($this),serialize($return)),1); + if (DEBUG_ENABLED) + debug_log('%s::EvaluateDefault(): Returning (%s)',1,get_class($this),serialize($return)); return $return; } function HelperValue($helper,$id='',$container='',$ldapserver='',$counter='',$default='') { - debug_log(sprintf('%s::HelperValue(): Entered with (%s,%s,%s,%s,%s,%s)', - get_class($this),count($helper),$id,$container,$ldapserver->server_id,$counter,$default),2); - - $html = ''; + if (DEBUG_ENABLED) + debug_log('%s::HelperValue(): Entered with (%s,%s,%s,%s,%s,%s)',2, + get_class($this),serialize($helper),$id,$container,$ldapserver->server_id,$counter,$default); if ($container && $ldapserver && ! is_array($helper)) { - return $this->EvaluateDefault($ldapserver,$helper,$container,$counter); + if (preg_match('/^=php./',$helper)) + return $this->EvaluateDefault($ldapserver,$helper,$container,$counter); + + else + # @todo: Enable size and width configuration in template + $html = sprintf('',$id); } else { if (is_array($helper)) { diff --git a/lib/timeout_functions.php b/lib/timeout_functions.php index a12f9be..33efad0 100644 --- a/lib/timeout_functions.php +++ b/lib/timeout_functions.php @@ -17,7 +17,8 @@ * @return bool */ function set_lastactivity( $ldapserver ) { - debug_log(sprintf('set_lastactivity(): Entered with (%s)',$ldapserver->server_id),2); + if (DEBUG_ENABLED) + debug_log('set_lastactivity(): Entered with (%s)',2,$ldapserver->server_id); $_SESSION['activity']['server'][$ldapserver->server_id] = time(); $_SESSION['activity']['rightframe_server_id'] = $ldapserver->server_id; @@ -31,7 +32,8 @@ function set_lastactivity( $ldapserver ) { * @param object $ldapserver The LDAPServer object of the server which the user has logged in. */ function unset_lastactivity( $ldapserver ) { - debug_log(sprintf('unset_lastactivity(): Entered with (%s)',$ldapserver->server_id),2); + if (DEBUG_ENABLED) + debug_log('unset_lastactivity(): Entered with (%s)',2,$ldapserver->server_id); if (isset($_SESSION['activity']['server'][$ldapserver->server_id])) { unset($_SESSION['activity']['server'][$ldapserver->server_id]); @@ -51,7 +53,8 @@ function unset_lastactivity( $ldapserver ) { * @return bool true on success, false on failure. */ function session_timed_out( $ldapserver ) { - debug_log(sprintf('session_timed_out(): Entered with (%s)',$ldapserver->server_id),2); + if (DEBUG_ENABLED) + debug_log('session_timed_out(): Entered with (%s)',2,$ldapserver->server_id); global $lang; diff --git a/lib/tree_functions.php b/lib/tree_functions.php index 9e25210..bb9331a 100644 --- a/lib/tree_functions.php +++ b/lib/tree_functions.php @@ -1,5 +1,5 @@ + diff --git a/templates/courierMailAccount.xml b/templates/courierMailAccount.xml index 2840850..79216a7 100644 --- a/templates/courierMailAccount.xml +++ b/templates/courierMailAccount.xml @@ -1,3 +1,5 @@ + + - diff --git a/templates/courierMailAlias.xml b/templates/courierMailAlias.xml index ef1e196..0a4a2ec 100644 --- a/templates/courierMailAlias.xml +++ b/templates/courierMailAlias.xml @@ -1,3 +1,5 @@ + +
BÅ‚Ä…d:%s