Subversion Repositories Transart

Compare Revisions

No changes between revisions

Ignore whitespace Rev 1 → Rev 2

/kalender/CHANGELOG.TXT
0,0 → 1,34
[v1.33 -> 1.34]
+ bugfix: broken hyperlinks in event info box
+ bugfix: auto insert linebreaks
+ config: var $language_auto_select for control auto lang detection
+ bugfix: Pic-Selector did not work correctly (if more pics than table cols)
+ bugfix: JavaScripts did not work if script was called from external directory
 
 
[v1.31 -> 1.33]
+ bugfix: page break
+ bugfix: mozilla support for status icon selector
+ bugfix: problems using quotes in event-title/description
+ admin: returns to selected index-page after delete, change
+ admin: dates in reverse chronological order (latest first)
+ Back-Button in date's detail view
+ admin: confirmation for deleting entries
+ Printable view (Clean4Print)
+ Search functionality
+ introduced global var $base_url["jax_cal"] for setting base dir
+ auto update system (for updating csv files from versions less v1.33 to v1.33)
 
 
[v1.26 -> 1.31]
 
+ Restructuring of directory structures
+ changes language files (all variables included in array loc_lang)
please send me your language file translation if made one!
+ improved calendar control:
+ prev. year + next year button
+ quick select for prev/next years, prev/next months
+ integration of mishoos dhtml calendar in admin frontend
+ icon for status field
+ selectable views: year, month, day
+ configurable start day of the week
/kalender/admin/calendar.admin.php
0,0 → 1,589
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 
<?php
 
/*
Jax Calendar v1.34 - Copyright (c) 2002-2004, Andreas John aka Jack (tR)
This program and it's moduls are Open Source in terms of General Public Licens (GPL) v2.0
 
calendar.admin.php (admin system)
*/
// fit if nescessary:
define( "PATH_TO_SCRIPT", "../" );
 
// global variables (have to be fitted)
require ( dirname(__FILE__) . "/".PATH_TO_SCRIPT."settings/calendar.settings.inc.php");
 
// (If exists) include localization file for the favoured language
if ( file_exists( dirname(__FILE__) . "/".PATH_TO_SCRIPT."languages/" . $language . ".inc.php" ) )
define( "LOC_LANG", $language );
else
define( "LOC_LANG", $default_language );
 
require_once ( dirname(__FILE__) ."/".PATH_TO_SCRIPT."languages/" . LOC_LANG . ".inc.php" );
 
if (!empty( $_SERVER["PHP_SELF"] )) $PHP_SELF = $_SERVER["PHP_SELF"];
?>
 
<head>
<title><?php echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $charset ?>">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">
 
<link rel="stylesheet" href="<?php echo PATH_TO_SCRIPT; ?>css/admin.css">
</head>
 
<body >
<div class="admin">
<div class="title"><?php echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></div>
 
<?php
 
if ( $data_source == "mysql" )
{
// include class for database support
require ( PATH_TO_SCRIPT."modules/classes/mysql.inc.php" );
 
// prepare objects for database access
// list of subscribers which signed in/off
$calendar_list = new mysql;
$calendar_list->name = $calendar_file;
$calendar_list->server = $db_server;
$calendar_list->login = $db_login;
$calendar_list->password = $db_password;
$calendar_list->database = $db_database;
$calendar_list->init();
$calendar_list->order_criterion = "ORDER BY 'event_start' DESC";
 
$event_list = new mysql;
$event_list->name = $event_file;
$event_list->server = $db_server;
$event_list->login = $db_login;
$event_list->password = $db_password;
$event_list->database = $db_database;
$event_list->init();
 
}
 
if ( $data_source == "csvfile" )
{
// include class for CSV-textfile support
require ( PATH_TO_SCRIPT."modules/classes/csvfile.inc.php" );
 
// prepeare objects for file access
// list of subscribers which signed in/off
$calendar_list = new csvfile;
$calendar_list->name = PATH_TO_SCRIPT.'cal_data/'.$calendar_file;
$calendar_list->init();
$event_list = new csvfile;
$event_list->name = PATH_TO_SCRIPT.'cal_data/'.$event_file;
$event_list->init();
}
 
if ( !empty( $_GET[ "do" ] ) ) { $do = $_GET[ "do" ]; } else { $do = "list"; }
if ( !empty( $_GET[ "id" ] ) ) { $id = $_GET[ "id" ]; } else { $id = 0; }
if ( !empty( $_GET[ "start" ] ) ) { $start = $_GET[ "start" ]; } else { $start = 0; }
 
$ox_tail = "cal_id=$cal_id&language=$language&start=$start";
 
 
$js_cal_format = split ('[/.-]', $_js_calendar_format);
 
$keys = array_keys( $js_cal_format );
foreach ($keys as $key)
{
$val = $js_cal_format[$key];
$js_date_trans[$val] = $key;
}
 
function _translate_date_format( $date_str, $hour, $min )
{
global $js_date_trans;
$date_split = list ( $part[0], $part[1], $part[2]) = split ('[/.-]', $date_str );
$stamp = gmmktime( $hour, $min, 0,
$part[ $js_date_trans["%m"] ],
$part[ $js_date_trans["%d"] ],
$part[ $js_date_trans["%Y"] ] );
return $stamp;
}
 
if ( $do == "list" )
{
$num_dates = $calendar_list->entries();
$red_data = array();
$calendar_list->get_entry(0,$red_data);
echo <<<TABLEHEAD
<table class="index" width="100%" cellpadding="0" cellspacing="0">
<tr>
<td class="icons">&nbsp;</td>
<td class="icons">&nbsp;</td>
<th>{$loc_lang["date"]}</th>
<th>{$loc_lang["event"]}</th>
</tr>
TABLEHEAD;
 
$start_ofs = $start * $admin_page_break;
$last_page = floor($num_dates / $admin_page_break)+1;
if ($start < $last_page-1 )
{
$start_next = $start+1;
$link_next = "<a href=\"$PHP_SELF?$ox_tail&start=$start_next\">{$loc_lang["next_page"]}</a> &gt;";
}
else
{
$start_next = $start;
$link_next = "";
}
 
if ($start > 0 )
{
$start_prev = $start-1;
$link_prev = "&lt; <a href=\"$PHP_SELF?$ox_tail&start=$start_prev\"> {$loc_lang["prev_page"]}</a>";
}
else
{
$start_prev = 0;
$link_prev = "";
}
 
$ii = 1;
for ($i=1;$i<=$num_dates;$i++)
{
$new_id=$i-1;
if ($i > $start_ofs)
{
echo '<tr valign="top" class="line_color'.($ii%2).'">'."\n"
." <td class=\"icons\">".'<a href="'.$PHP_SELF.'?do=edit_entry&id='.$new_id."&$ox_tail".'"><IMG SRC="'.PATH_TO_SCRIPT.'images/edit_entry.gif" border="0" alt="'.$loc_lang["change"].'">'."</a></td>\n"
." <td class=\"icons\">".'<a href="'.$PHP_SELF.'?do=delete_entry&id='.$new_id."&$ox_tail".'"><IMG SRC="'.PATH_TO_SCRIPT.'images/delete_entry.gif" border="0" alt="'.$loc_lang["delete"].'">'."</a></td>\n"
." <td class=\"date\">".'<nobr>'.gmdate("d.m.Y H:i",$red_data["event_start"])."</nobr></td>\n"
." <td>".$red_data["event_title"]."</td>\n</tr>\n";
$ii++;
}
$calendar_list->get_next_entry( $red_data );
if ($i >= $start_ofs + $admin_page_break ) break;
}
echo "</table>\n";
$start++;
echo '<div class="footline"><a href="'.$PHP_SELF."?do=new_entry&$ox_tail".'"><img src="'.PATH_TO_SCRIPT.'images/new_entry.gif" alt="'.$loc_lang["new_entry"].'" border="0">'."</a> &nbsp; {$loc_lang["new_entry"]}\n";
echo "<div class=\"nav_page\" align=\"center\"><table><tr><td>$link_prev</td><td> | $start {$loc_lang["of_pages"]} $last_page | </td><td>$link_next</td></tr></table></div></div>";
}
 
 
if ( $do == "new_entry" )
{
$entry1 = array();
$entry2 = array();
 
$mode = "create";
$do = "edit_entry";
}
 
function clean_quotes( $input )
{
$input = ereg_replace( '"', "&quot;", $input );
return $input;
}
 
 
if ( $do == "edit_entry" )
{
if ( !empty( $mode ) && ($mode == "create" ))
{
$nowww = gmmktime();
$nowww_year = gmdate( "Y", $nowww );
$nowww_month = gmdate( "m", $nowww );
$nowww_day = gmdate( "d", $nowww);
 
$old_starts = intval(gmmktime(0,0,0,$nowww_month,$nowww_day,$nowww_year));
$old_ends = $old_starts + 86399;
$old_x24 = "1";
$old_rem_start = $old_starts;
$old_rem_stop = $old_starts + 86399;
$old_status = "";
$old_event_title = "";
$old_event_key = "";
$old_event_description = "";
}
else
{
$mode = "update";
$entry1 = array();
$calendar_list->get_entry( $id, $entry1 );
$old_starts = $entry1["event_start"];
$old_ends = $entry1["event_end"];
$old_x24 = $entry1["x24"];
$old_rem_start = $entry1["reminder_start"];
$old_rem_stop = $entry1["reminder_end"];
$old_status = $entry1["status"];
$old_event_title = clean_quotes( $entry1["event_title"] );
$old_event_key = $entry1["event_key"];
 
$search_pattern = array(); $red_data = array();
$search_pattern["event_key"] = $old_event_key;
$pos = $event_list->find_entry( $search_pattern );
$event_list->get_entry( $pos, $red_data );
$old_event_description = ereg_replace("<br>", "\r\n", $red_data[ "event_description" ] );
// $old_event_description = ( $red_data["event_description"] );
}
 
$old_start_date = gmdate( $_local_date_format, $old_starts );
$old_start_hour = gmdate( "H", $old_starts );
$old_start_min = gmdate( "i", $old_starts );
 
$old_end_date = gmdate( $_local_date_format, $old_ends );
$old_end_hour = gmdate( "H", $old_ends );
$old_end_min = gmdate( "i", $old_ends );
 
$old_rem_start_date = gmdate( $_local_date_format, $old_rem_start );
$old_rem_start_hour = gmdate( "H", $old_rem_start );
$old_rem_start_min = gmdate( "i", $old_rem_start );
 
$old_rem_stop_date = gmdate( $_local_date_format, $old_rem_stop );
$old_rem_end_hour = gmdate( "H", $old_rem_stop );
$old_rem_end_min = gmdate( "i", $old_rem_stop );
if ($old_x24 == 1) $x24_chk = "checked"; else $x24_chk = "";
 
$html_area_path = PATH_TO_SCRIPT."modules";
echo <<< FORMSHEET
<script language="Javascript1.2"><!-- // load htmlarea
_editor_url = "$html_area_path/htmlarea/"; // URL to htmlarea files
var win_ie_ver = parseFloat(navigator.appVersion.split("MSIE")[1]);
if (navigator.userAgent.indexOf('Mac') >= 0) { win_ie_ver = 0; }
if (navigator.userAgent.indexOf('Windows CE') >= 0) { win_ie_ver = 0; }
if (navigator.userAgent.indexOf('Opera') >= 0) { win_ie_ver = 0; }
if (win_ie_ver >= 5.5) {
document.write('<scr' + 'ipt src="' +_editor_url+ 'editor.js"');
document.write(' language="Javascript1.2"></scr' + 'ipt>');
} else
{ document.write('<scr'+'ipt>function editor_generate() { return false; }</scr'+'ipt>'); }
// --></script>
 
<!-- calendar stylesheet -->
<link rel="stylesheet" type="text/css" media="all" href="../modules/jscalendar/calendar.css" title="win2k-cold-1" />
<!-- main calendar program -->
<script type="text/javascript" src="../modules/jscalendar/calendar.js"></script>
<!-- language for the calendar -->
<script type="text/javascript" src="../modules/jscalendar/lang/$_js_calendar_lang_file"></script>
<!-- the following script defines the Calendar.setup helper function, which makes
adding a calendar a matter of 1 or 2 lines of code. -->
<script type="text/javascript" src="../modules/jscalendar/calendar-setup.js"></script>
<form name="form_news" method="post" action="$PHP_SELF?do=$mode&id=$id&$ox_tail">
<table cellspacing="0" class="input_box" align="center">
<tr>
<td>
<table width="100%" border="0">
<tr>
<td colspan="5">&nbsp;</td>
</tr>
<tr>
<td>&nbsp;
<input type="hidden" name="old_event_key" value="$old_event_key">
</td>
<td><b>{$loc_lang["event_span"]}</b></td>
<td>$_local_date_format</td>
<td>hh:mm</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["start"]}:</td>
<td>
<input type="text" name="new_start_date" id="f_new_start_date" value="$old_start_date" onchange="document.form_news.new_rem_start_date.value=document.form_news.new_start_date.value">
<img src="../modules/jscalendar/img.gif" id="trigger_new_start_date" style="cursor: pointer; border: none;" title="{$loc_lang["date_select"]}"></td>
<td>
<input type="text" name="new_start_hour" maxlength="2" size="3" value="$old_start_hour">
:
<input type="text" name="new_start_min" maxlength="2" size="3" value="$old_start_min">
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["end"]}:</td>
<td>
<input type="text" name="new_end_date" id="f_new_end_date" value="$old_end_date" onchange="document.form_news.new_rem_end_date.value=document.form_news.new_end_date.value">
<img src="../modules/jscalendar/img.gif" id="trigger_new_end_date" style="cursor: pointer; border: none;" title="{$loc_lang["date_select"]}"></td>
<td>
<input type="text" name="new_end_hour" maxlength="2" size="3" value="$old_end_hour">
:
<input type="text" name="new_end_min" maxlength="2" size="3" value="$old_end_min">
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["whole_day"]}: </td>
<td colspan="3">
<input type="checkbox" name="new_x24" value="1" $x24_chk>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td colspan="3">&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["state"]}:</td>
<td colspan="3">
<input type="text" name="new_status" maxlength="100" size="50" value="$old_status">&nbsp;<a href="../modules/pic_selector.php?image_list=categories" onclick="JavaScript: window.open( this.href,'PicSelector', 'width=400,height=280,left=100,top=50,resizable=yes');" target="PicSelector"><img src="../images/sel_img.gif" width="24" height="24" border="0"></a>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td colspan="3">&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["title"]}:</td>
<td colspan="3">
<input type="text" name="new_event_title" size="50" value="$old_event_title">
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["detailed_info"]}:</td>
<td colspan="3">
<textarea name="new_event_description" cols="40" rows="5">$old_event_description</textarea>
</td>
</tr>
<tr>
<td colspan="5">&nbsp;</td>
</tr>
<tr>
<td colspan="5">
<div align="center">
<input type="submit" name="sendbutton" value="{$loc_lang["change"]}">
</div>
</td>
</tr>
<tr>
<td colspan="5">&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><b>{$loc_lang["display_span"]}</b></td>
<td>$_local_date_format</td>
<td>hh:mm</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["start"]}:</td>
<td>
<input type="text" name="new_rem_start_date" id="f_new_rem_start_date" value="$old_rem_start_date">
<img src="../modules/jscalendar/img.gif" id="trigger_new_rem_start_date" style="cursor: pointer; border: none;" title="{$loc_lang["date_select"]}"></td>
<td>
<input type="text" name="new_rem_start_hour" maxlength="2" size="3" value="$old_rem_start_hour">
:
<input type="text" name="new_rem_start_min" maxlength="2" size="3" value="$old_rem_start_min">
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>{$loc_lang["end"]}:</td>
<td>
<input type="text" name="new_rem_end_date" id="f_new_rem_end_date" value="$old_rem_stop_date">
<img src="../modules/jscalendar/img.gif" id="trigger_new_rem_end_date" style="cursor: pointer; border: none;" title="{$loc_lang["date_select"]}"></td>
<td>
<input type="text" name="new_rem_end_hour" maxlength="2" size="3" value="$old_rem_end_hour">
:
<input type="text" name="new_rem_end_min" maxlength="2" size="3" value="$old_rem_end_min">
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="5">&nbsp;</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
 
<script type="text/javascript">
Calendar.setup({
inputField : "f_new_start_date",
ifFormat : "$_js_calendar_format",
button : "trigger_new_start_date",
singleClick : false
});
Calendar.setup({
inputField : "f_new_end_date",
ifFormat : "$_js_calendar_format",
button : "trigger_new_end_date",
singleClick : false
});
Calendar.setup({
inputField : "f_new_rem_start_date",
ifFormat : "$_js_calendar_format",
button : "trigger_new_rem_start_date",
singleClick : false
});
Calendar.setup({
inputField : "f_new_rem_end_date",
ifFormat : "$_js_calendar_format",
button : "trigger_new_rem_end_date",
singleClick : false
});
</script>
 
<script language="JavaScript1.2" defer>
editor_generate('new_event_description');
</script>
FORMSHEET;
exit;
}
 
 
if ( $do == "delete_entry" )
{
echo "<p>{$loc_lang["delete_entry_confrm"]}</p>";
echo "<p><a href=\"$PHP_SELF?do=remove_entry&id=$id&$ox_tail\">{$loc_lang["yes"]}</a></p>";
echo "<p><a href=\"$PHP_SELF?$ox_tail\">{$loc_lang["no"]}</a></p><p>&nbsp;</p>";
 
exit;
}
 
if ( $do == "remove_entry" )
{
$entry1 = array();
$calendar_list->get_entry( $id, $entry1 );
$old_event_key = $entry1["event_key"];
$calendar_list->delete( $id );
 
$search_pattern = array();
$search_pattern["event_key"] = $old_event_key;
$pos = $event_list->find_entry( $search_pattern );
$event_list->delete( $pos );
 
echo '<meta http-equiv="refresh" content="0;URL='.$PHP_SELF."?do=list&$ox_tail".'">';
exit;
}
 
 
if ( $do == "create" || $do == "update" )
{
$old_event_key = $_POST[ "old_event_key" ];
 
$new_event_start = _translate_date_format( $_POST["new_start_date"], $_POST["new_start_hour"], $_POST["new_start_min"] );
 
$new_event_end = _translate_date_format( $_POST["new_end_date"], $_POST["new_end_hour"], $_POST["new_end_min"] );
$new_reminder_start = _translate_date_format( $_POST["new_rem_start_date"], $_POST["new_rem_start_hour"], $_POST["new_rem_start_min"] );
$new_reminder_end = _translate_date_format( $_POST["new_rem_end_date"], $_POST["new_rem_end_hour"], $_POST["new_rem_end_min"] );
if ( empty( $_POST[ "new_x24" ] ) ) $new_x24 = 0; else $new_x24 = $_POST[ "new_x24" ];
 
$new_status = $_POST[ "new_status" ];
$new_event_title = clean_quotes( $_POST[ "new_event_title" ] );
if ($data_source == "csvfile") $new_event_description = ereg_replace("(\r\n|\n|\r)", "<br>", $_POST[ "new_event_description" ] );
else $new_event_description = $_POST[ "new_event_description" ];
$new_event_key = md5( strval( $new_event_start . $new_event_end . $new_event_title ) );
}
 
 
if ( $do == "update" )
{
$calendar_list->delete( $id );
 
$search_pattern = array();
$search_pattern["event_key"] = $old_event_key;
$pos = $event_list->find_entry( $search_pattern );
$event_list->delete( $pos );
$do = "create";
}
 
 
if ( $do == "create" )
{
$num_dates = $calendar_list->entries();
$red_data = array();
$calendar_list->get_entry(0,$red_data);
 
$i = 0;
while ( $i<$num_dates && $new_event_start <= $red_data["event_start"] )
{
$calendar_list->get_next_entry( $red_data );
$i++;
}
$to_cal = array();
$to_cal["event_start"] = $new_event_start;
$to_cal["event_end"] = $new_event_end;
$to_cal["x24"] = $new_x24;
$to_cal["reminder_start"] = $new_reminder_start;
$to_cal["reminder_end"] = $new_reminder_end;
$to_cal["status"] = $new_status;
$to_cal["event_title"] = $new_event_title;
$to_cal["event_key"] = $new_event_key;
$calendar_list->insert( $i, $to_cal );
$to_evt = array();
$to_evt["event_key"] = $new_event_key;
$to_evt["event_description"] = $new_event_description;
$event_list->append( $to_evt );
echo '<meta http-equiv="refresh" content="0;URL='.$PHP_SELF."?do=list&$ox_tail".'">';
exit;
}
 
?>
</div>
<!-- Please don't remove the link to the author's website!!! -->
<p class="author_info">Jax Calendar v1.34 by Jack (tR), <a href="http://www.jtr.de/scripting/php">www.jtr.de/scripting/php</a></p>
</body>
 
</html>
/kalender/admin/dbupdate.php
0,0 → 1,161
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 
<?php
 
/*
Jax Calendar v1.33 - Copyright (c) 2002-2004, Andreas John aka Jack (tR)
This program and it's moduls are Open Source in terms of General Public Licens (GPL) v2.0
 
dbupdate.php (CSV data update system)
*/
$update_at_once = 30;
// fit if nescessary:
define( "PATH_TO_SCRIPT", "../" );
 
// global variables (have to be fitted)
require ( dirname(__FILE__) . "/".PATH_TO_SCRIPT."settings/calendar.settings.inc.php");
 
// (If exists) include localization file for the favoured language
if ( file_exists( dirname(__FILE__) . "/".PATH_TO_SCRIPT."languages/" . $language . ".inc.php" ) )
define( "LOC_LANG", $language );
else
define( "LOC_LANG", $default_language );
 
require_once ( dirname(__FILE__) ."/".PATH_TO_SCRIPT."languages/" . LOC_LANG . ".inc.php" );
 
if (!empty( $_SERVER["PHP_SELF"] )) $PHP_SELF = $_SERVER["PHP_SELF"];
$ox_tail = "cal_id=$cal_id&language=$language";
?>
 
<head>
<title><?php echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></title>
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $charset ?>">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">
 
<link rel="stylesheet" href="<?php echo PATH_TO_SCRIPT; ?>css/admin.css">
</head>
 
<body >
<div class="admin">
<div class="title"><?php echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></div>
 
<?php
 
if ( $data_source != "csvfile" ) { echo "Datasource is no CSV file!"; exit; }
else
{
 
// include class for CSV-textfile support
require ( PATH_TO_SCRIPT."modules/classes/csvfile.inc.php" );
 
// prepeare objects for file access
// list of subscribers which signed in/off
$calendar_list = new csvfile;
$calendar_list->name = PATH_TO_SCRIPT.'cal_data/'.$calendar_file;
$calendar_list->init();
$event_list = new csvfile;
$event_list->name = PATH_TO_SCRIPT.'cal_data/'.$event_file;
$event_list->init();
}
 
if (!empty( $_GET["do"] ) ) $do = $_GET["do"]; else $do = "start";
if ( $do == "start" )
{
echo "<p>This programm will update your .CSV file for cal_id=$cal_id and save results to a dummy copy file!</p><p>&nbsp;</p>";
if (!$fh = fopen( "dummy_copy.csv","w" ) )
die ("<p>&nbsp;</p><font color=\"red\"><b>Cannot open file 'admin/dummy_copy.csv' ... Write access is required for this file! Please CHMOD 777!</b></font><p>&nbsp;</p>");
fclose( $fh );
$do = "continue";
}
if ( $do == "continue" )
{
$new_calendar_list = new csvfile;
$new_calendar_list->name = "dummy_copy.csv";
$new_calendar_list->init();
$src_entries = $calendar_list->entries(); if ($src_entries == 0) exit;
 
$src_red_data = array();
if (!empty($_GET["start_at"])) $i = $_GET["start_at"]; else $i = 0;
echo "<p>Conversion in progress... $i of $src_entries</p>";
$processed = 0;
$calendar_list->get_entry( $i, $src_red_data );
do
{
 
$new_event_start = $src_red_data["event_start"];
//----------------------------------------------------------------
 
$dst_red_data = array();
$dst_entries = $new_calendar_list->entries();
 
$new_calendar_list->get_entry($j,$dst_red_data);
$pos = 0;
 
while ( $pos<=$dst_entries && ($new_event_start < $dst_red_data["event_start"] ) )
{
$new_calendar_list->get_next_entry( $dst_red_data );
$pos++;
}
$new_calendar_list->insert( $pos, $src_red_data );
$processed++;
if ($processed >= $update_at_once)
{
echo '<meta http-equiv="refresh" content="0;URL='.$PHP_SELF."?$ox_tail&do=continue&start_at=".($i+1).'">';
exit;
}
//---------------------------------------------------------------------
$calendar_list->get_next_entry( $src_red_data );
$i++;
} while ($i<$src_entries);
echo "<p><b>Process completed!</b><br></p><p>&nbsp;</p>";
echo '<meta http-equiv="refresh" content="0;URL='.$PHP_SELF."?$ox_tail&do=recopy".'">';
}
if ( $do == "recopy" )
{
$csvcontent = file( "dummy_copy.csv" );
$cal_file = fopen( PATH_TO_SCRIPT.'cal_data/'.$calendar_file, "w" );
fwrite( $cal_file, ereg_replace( "\r", "", implode( "", $csvcontent ) ) );
fclose( $cal_file );
 
echo "<p><b>Update completed!</b><br></p><p>&nbsp;</p>";
echo '<meta http-equiv="refresh" content="10;URL=index.php?$ox_tail"'.'">';
echo '<p><a href="index.php?$ox_tail">Return to Admin System</a></p>';
}
 
?>
</div>
<!-- Please don't remove the link to the author's website!!! -->
<p class="author_info">Jax Calendar v1.33 by Jack (tR), <a href="http://www.jtr.de/scripting/php">www.jtr.de/scripting/php</a></p>
</body>
 
</html>
/kalender/admin/dummy_copy.csv
0,0 → 1,0
"event_start","event_end","x24","reminder_start","reminder_end","status","event_title","event_key"
/kalender/admin/index.php
0,0 → 1,136
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 
<?php
 
/*
Jax Calendar v1.34 - Copyright (c) 2002-2004, Andreas John aka Jack (tR)
This program and it's moduls are Open Source in terms of General Public Licens (GPL) v2.0
 
index.php (function index for admin system)
*/
// fit if nescessary:
define( "PATH_TO_SCRIPT", "../" );
 
// global variables (have to be fitted)
require ( dirname(__FILE__) . "/".PATH_TO_SCRIPT."settings/calendar.settings.inc.php");
 
// language localization
if ( empty( $_GET[ "language" ] ) && $language_auto_select )
{
echo "\n".'<script language="JavaScript" type="Text/JavaScript" src="'.PATH_TO_SCRIPT.'/modules/lang_auto_select.js"></script>'."\n";
$language = $default_language;
}
else
$language = strtolower( $_GET[ "language" ] );
// (If exists) include localization file for the favoured language
if ( file_exists( dirname(__FILE__) . "/".PATH_TO_SCRIPT."languages/" . $language . ".inc.php" ) )
define( "LOC_LANG", $language );
else
define( "LOC_LANG", $default_language );
 
require_once ( dirname(__FILE__) ."/".PATH_TO_SCRIPT."languages/" . LOC_LANG . ".inc.php" );
 
$ox_tail = "cal_id=$cal_id&language=$language";
?>
 
<head>
<title><?php echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></title>
<link rel="stylesheet" href="<?php echo PATH_TO_SCRIPT; ?>css/admin.css">
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $charset ?>">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
 
 
 
<body>
 
<?php
 
if ( $data_source == "csvfile" )
{
// include class for CSV-textfile support
require ( PATH_TO_SCRIPT."modules/classes/csvfile.inc.php" );
 
// prepeare objects for file access
// list of subscribers which signed in/off
$calendar_list = new csvfile;
$calendar_list->name = PATH_TO_SCRIPT.'cal_data/'.$calendar_file;
$calendar_list->init();
$event_list = new csvfile;
$event_list->name = PATH_TO_SCRIPT.'cal_data/'.$event_file;
$event_list->init();
/**
* @return void
* @desc Checks whether database is generated by older version (checks order of entries)
*/
function old_database()
{
global $calendar_list;
 
$entries = $calendar_list->entries(); if ($entries == 0) return false;
 
$red_data = array();
$calendar_list->get_entry(0, $red_data);
$last_event_start = $red_data["event_start"];
for ($i=2; $i<=$entries; $i++)
{
$calendar_list->get_entry($i, $red_data);
if ($red_data["event_start"] > $last_event_start)
return true;
else
$last_event_start = $red_data["event_start"];
}
return false;
}
if (old_database() )
{
echo <<<MSG
<div style="border: 1px solid black; background-color: white; color: red; padding: 20px;">
<b>Warning!</b><br> The internal data format of Jax Calendar has changed since version 1.33!<br>
You will need to update your csv database file!
<p>Please <b><u>BACKUP YOUR CSV FILE(S)!!!</u></b> before running:</p>
<p>Bitte <b><u>SICHERN SIE IHRE CSV DATEI(EN)!!!</u></b> und starten Sie dann:</p>
<br>
<p><a href="dbupdate.php?$ox_tail">CSV auto update system</a></p>
</div>
MSG;
}
}
 
?>
 
<div class="admin">
<div class="title"><?php echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></div>
<p><br></p>
<table border="0" valign="middle" align="center" width="100%"><tr><td align="center">
<table border="0">
<tr><td><a href="calendar.admin.php<? echo "?cal_id=$cal_id&language=$language" ?>"></a></td><td>&nbsp;</td>
<td><a href="calendar.admin.php<? echo "?cal_id=$cal_id&language=$language" ?>"><? echo $loc_lang["calendar"]." - ".$loc_lang["admin_program"]; ?></a></td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td>
<td><img src="http://www.jtr.de/scripting/php/updates/updateinfo.php?current_version=134&img=status&project_id=calendar">&nbsp;&nbsp;<?php echo "<a href=\"http://www.jtr.de/scripting/php/updates/updateinfo.php?current_version=134&language=$language&project_id=calendar\">{$loc_lang["check_for_updates"]}</a>"; ?></td></tr>
</table>
</td><tr></table>
<!-- Please don't remove the link to the author's website!!! -->
<p class="author_info">Jax Calendar v1.34, by Jack (tR), <a href="http://www.jtr.de/scripting/php">www.jtr.de/scripting/php</a></p>
</div>
 
</body>
 
</html>
/kalender/cal_data/mycalendar
0,0 → 1,9
"event_start","event_end","x24","reminder_start","reminder_end","status","event_title","event_key"
"1081468800","1084147140","1","1081468800","1084147140","","Langer Termin von Mitte April bis Mai","ef2e547863c6821e92ca171ca5c02b46"
"1080604800","1080691140","1","1080604800","1080691140","","für 30. März","5fa169f112edf6a33456d64688df71ce"
"1079740800","1079827140","1","1079740800","1079827140","","Fertigstellung Jax Calendar v1.3","c3926bb8539b182f27b9e4877cae034a"
"1078617600","1078703940","1","1078444800","1078703940","image::bell.gif","Birthday-Party","77971955df169578ece9e0cd68d35c5e"
"1052524800","1052783940","1","1051747200","1053388800","","Checkit!","f93bbacd22cfe30f7f9a6ba2bb086af0"
"1045513800","1045521000","0","1045440000","1045526340","","Testtermin für den 17. Februar","4da48318cd49110965a5b38c78b5f9b6"
"1030838400","1062374400","1","1030838400","1062374400","Frist","Beispiel-Frist","aad557217407e8daddbb507fbef0d7d2"
"1030374000","1030374000","1","1030320000","1030406340","!","Erster Termin","c5990accc19d921bc038f0f9048959bf"
/kalender/cal_data/mycalendar2
0,0 → 1,11
"event_start","event_end","x24","reminder_start","reminder_end","status","event_title","event_key"
"1083369600","1083455940","1","1083369600","1083455940","",""Maifestspiele" am Mariannenplatz in Berlin Kreuzberg","1d3a5d1d2cfa9fbc40663582ccb971e6"
"1082419200","1082505540","1","1082419200","1082505540","","Testeintrag für 20. April","b2d46975fc393ba047afc2e671d69abd"
"1081468800","1084147140","1","1081468800","1084147140","","Langer Termin von Mitte April bis Mai","ef2e547863c6821e92ca171ca5c02b46"
"1080604800","1080691140","1","1080604800","1080691140","","für 30. März","5fa169f112edf6a33456d64688df71ce"
"1079740800","1079827140","1","1079740800","1079827140","","Fertigstellung Jax Calendar v1.3","c3926bb8539b182f27b9e4877cae034a"
"1078617600","1078703940","1","1078444800","1078703940","image::bell.gif","Birthday-Party","77971955df169578ece9e0cd68d35c5e"
"1052524800","1052783940","1","1051747200","1053388800","","Checkit!","363b1b59db6118a73e204d35cdedd164"
"1045513800","1045521000","0","1045440000","1045526340","","Testtermin für den 17. Februar","4da48318cd49110965a5b38c78b5f9b6"
"1030838400","1062374400","1","1030838400","1062374400","Frist","Beispiel-Frist","aad557217407e8daddbb507fbef0d7d2"
"1030374000","1030374000","1","1030320000","1030406340","!","Erster Termin","aa97dac91b3de18651cd5f60a88fb673"
/kalender/cal_data/myevents
0,0 → 1,9
"event_key","event_description"
"c5990accc19d921bc038f0f9048959bf","Dies ist der erste Termin überhaupt, der mit Jax Calendar angelegt wurde... (und hier nur aus historischen Gründen beibehalten wurde! ;-) "
"aad557217407e8daddbb507fbef0d7d2","Dies ist ein Beispiel für eine <STRONG>Frist</STRONG> von einem Jahr! (<FONT color=#ff0000>09-2002...09-2003</FONT>)<BR>"
"4da48318cd49110965a5b38c78b5f9b6","Dies ist ein <FONT size=4><STRONG>Testtermin</STRONG></FONT>, der am 17. Februar angezeigt werden soll! "
"f93bbacd22cfe30f7f9a6ba2bb086af0","<P>Dies ist der Nächste!</P>"
"77971955df169578ece9e0cd68d35c5e","<P>Vorbereitungen!</P>"
"c3926bb8539b182f27b9e4877cae034a","<P>An diesem Tag wurde das Update für Jax Calendar v1.3 veröffentlicht</P>"
"5fa169f112edf6a33456d64688df71ce","<P>sollte in der Monatsansicht mit angezeigt werden!</P>"
"ef2e547863c6821e92ca171ca5c02b46","<P>Dies ist ein Langer Termin, der über die Monatsgrenze hinweg geht...</P>"
/kalender/cal_data/myevents2
0,0 → 1,11
"event_key","event_description"
"aa97dac91b3de18651cd5f60a88fb673","Dies ist der erste Termin überhaupt, der mit Jax Calendar angelegt wurde... (und hier nur aus historischen Gründen beibehalten wurde! ;-) "
"363b1b59db6118a73e204d35cdedd164","<P>Dies ist der Nächste!</P>"
"aad557217407e8daddbb507fbef0d7d2","Dies ist ein Beispiel für eine <STRONG>Frist</STRONG> von einem Jahr! (<FONT color=#ff0000>09-2002...09-2003</FONT>)<BR>"
"4da48318cd49110965a5b38c78b5f9b6","Dies ist ein <FONT size=4><STRONG>Testtermin</STRONG></FONT>, der am 17. Februar angezeigt werden soll! "
"c3926bb8539b182f27b9e4877cae034a","<P>An diesem Tag wurde das Update für Jax Calendar v1.3 veröffentlicht</P>"
"b2d46975fc393ba047afc2e671d69abd","<P>blah blah 20. April</P>"
"5fa169f112edf6a33456d64688df71ce","<P>sollte in der Monatsansicht mit angezeigt werden!</P>"
"1d3a5d1d2cfa9fbc40663582ccb971e6","<P>die Polizei ist auch herzlichst eingeladen!</P>"
"77971955df169578ece9e0cd68d35c5e","<P>Vorbereitungen!</P>"
"ef2e547863c6821e92ca171ca5c02b46","<P>Dies ist ein Langer Termin, der über die Monatsgrenze hinweg geht...</P>"
/kalender/css/admin.css
0,0 → 1,94
/* Appearance of Jax Calendar Administration Frontend */
body {
background-color : #307D9A;
color : White;
}
 
.admin {
background-color : #C6D3E3;
border : 1px solid Black;
width : 100%;
}
 
.admin .title {
background-color : Silver;
color : White;
font : 180% Verdana, Geneva, Arial, Helvetica, sans-serif;
text-align : center;
border-bottom : 1px solid Black;
padding : 3px;
}
 
.admin .footline {
background-color : Silver;
color : White;
border-top : 1px solid Black;
padding : 10px;
}
 
.admin .footline A {
color : #307D9A;
}
 
 
.admin .index {
background-color : #C6D3E3;
padding-left : 5px;
}
 
.admin .index .icons {
width: 30px;
padding-left: 3px;
padding-right: 3px;
text-align : center;
}
 
.admin .index .date {
padding-left: 3px;
padding-right: 3px;
font : 75% Arial, Helvetica, sans-serif;
}
 
.admin .index .event {
font : 100% "Times New Roman", Times, serif;
}
 
.admin .index th {
text-align : left;
font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
font-weight : bold;
padding-top : 10px;
padding-bottom : 10px;
}
.nav_page{
text-align : center;
}
 
.input_box {
padding: 10px;
color: white;
border : 2px solid Black;
background-color : #307D9A;
}
 
.line_color0 {
background-color: #C6D3E3;
color: #000000;
}
 
.line_color1 {
background-color: #D9E1EC;
color: #000000;
}
 
.author_info {
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: xx-small;
color: #CCCCCC;
text-align : center;
}
.author_info A {
color: #CAB109;
}
 
/kalender/css/clean4print.css
0,0 → 1,12
.clean4print
{
width: 100%;
border: 1px dotted;
padding: 5px;
}
 
.clean4print .headings
{
border: 1px solid;
font-weight: bolder;
}
/kalender/css/default.css
0,0 → 1,297
/* Appearance of the Calendar-Modul */
 
.calendar
{
width : 180px;
height: 180px;
}
 
.calendar .headline {
color: #FFFFFF;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
background-color: #006699;
border-bottom : 1pt solid Black;
border-left : 1pt solid Black;
border-right: 1pt solid Black;
border-top : 1pt solid Black;
/* background : url(ice.jpg);*/
}
 
.calendar .headline A:link {
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .headline A:visited {
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .headline A:hover {
color: #FF0000;
text-decoration: none;
}
 
.calendar .headline .today_select {
background-color: #77AADD;
border-top: 1pt solid Black;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-weight: normal;
text-align : center;
text-decoration: underline;
font-size: 65%;
}
 
 
.calendar .overview {
background-color: #FEFADE;
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
text-align : center;
border-left : 1pt solid Black;
border-right: 1pt solid Black;
border-bottom : 1pt solid Black;
height: 100%;
width: 100%;
}
 
.calendar .overview A:link {
text-decoration: none;
}
 
.calendar .overview A:visited {
text-decoration: none;
}
 
.calendar .overview A:hover{
background-color: #FF0000;
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .overview .last_month {
color: #CCCCCC;
}
 
.calendar .overview .next_month {
color: #CCCCCC;
}
 
.calendar .overview #today {
color: #FFFFFF;
background-color: #FF9933;
}
 
.calendar .overview #selected {
color: #FFFFFF;
background-color: #FF0000;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .overview .dayname {
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .overview .reserved {
font-weight: bold;
font-size: 120%;
text-decoration: underline;
}
 
/* Appearance of the Eventlist */
 
.event_list_title {
font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 16px;
color: #006699;
background-color: #FFFFFF;
}
 
.event_list {
width : 98%;
height: auto;
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
border : 1pt solid Black;
}
 
.event_list .headings {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: #FFFFFF;
font-size: 100%;
background-color: #006699;
/* background : url(ice.jpg);*/
}
 
.event_list .col_status {
width: 50pt;
}
 
.event_list .col_date {
width: 100pt;
}
 
.event_list .col_event {
width: auto;
}
 
.event_list .status {
font-size: 80%;
color: Red;
font-weight: bold;
vertical-align : top;
}
 
.event_list .date {
font-size: 75%;
color: #888888;
font-family: Arial, Helvetica, sans-serif;
}
 
.event_list .event {
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
vertical-align : top;
}
 
.event_list A {
text-decoration: none;
}
 
.event_list A:hover {
text-decoration: underline;
}
 
.event_list .error_message {
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
margin-left : auto;
margin-right : auto;
padding-left : 10pt;
padding-right : 10pt;
padding-top: 10pt;
padding-bottom: 10pt;
background-color: #EAF0FF;
}
.cal_view_select {
margin: 5px;
}
 
/* Appearance for Event-Infos */
 
.event_info {
width : 500px;
height: auto;
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
border : 1pt solid;
}
 
.event_info .headings {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: #FFFFFF;
font-size: 100%;
background-color: #006699;
padding: 5pt 5pt 5pt 5pt;
/* background : url(ice.jpg);*/
}
 
.event_info .title {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
border-bottom : 1pt solid #000000;
}
 
.event_info .date {
background-color: #EAF0FF;
color: #006699;
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
width: 100pt;
border-bottom : 1pt solid #000000;
}
 
.event_info .description {
font-family: Arial, Helvetica, sans-serif;
padding: 10pt 10pt 10pt 10pt;
font-size: 80%;
}
 
.line_color0 {
background-color: #DDE7FF;
padding-top:3pt;
padding-bottom:3pt;
}
 
.line_color1 {
background-color: #EAF0FF;
padding-top:3pt;
padding-bottom:3pt;
}
 
.author_info {
font-family: Arial;
font-size: xx-small;
color: #CCCCCC;
}
 
.author_info A {
color: #CCCCCC;
}
 
.next_event_select {
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
background-color: #FFFFFF;
text-align : left;
}
 
.next_event_select A {
font-size: 100%;
color: #82C4F4;
background-color: #FFFFFF;
text-align : center;
text-decoration: underline;
}
 
 
.qs_months, .qs_prev_years, .qs_next_years {
zindex : 1000;
position : absolute;
width:50px;
background-color: #77AADD;
border: 1pt solid Black;
padding-left: 5px;
padding-right: 5px;
visibility: hidden;
}
 
.qs_months table, .qs_prev_years table, .qs_next_years table {
font-family: Arial, Helvetica, sans-serif;
font-size: 75%;
}
 
.qs_months table A, .qs_prev_years table A, .qs_next_years table A {
display:block; width: 30px;
text-decoration : none;
color: black;
}
 
.qs_months table A:hover, .qs_prev_years table A:hover, .qs_next_years table A:hover {
display:block; width: 30px;
background-color: red;
color: white;
}
 
/kalender/css/huber.css
0,0 → 1,270
/* Appearance of the Calendar-Modul */
 
/*body
{
background-color : Blue;
background-image : test.jpg;
background-position : center;
background-repeat : no-repeat;
}*/
 
.calendar
{
width : 180px;
height : 180px;
}
 
.calendar .headline {
color: #FFFFFF;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
background-color: #3300FF;
border-bottom : 1pt solid Black;
border-left : 1pt dashed Black;
border-right: 1pt dashed Black;
border-top : 1pt dashed Black;
/* background : url(ice.jpg);*/
}
 
.calendar .headline A:link {
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .headline A:visited {
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .headline A:hover {
color: #FF0000;
text-decoration: none;
}
 
.calendar .overview {
background-color: #FEFADE;
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
text-align : center;
border-left : 1pt dashed Black;
border-right: 1pt dashed Black;
border-bottom : 1pt dashed Black;
height: 100%;
width: 100%;
}
 
.calendar .overview A:link {
text-decoration: none;
}
 
.calendar .overview A:visited {
text-decoration: none;
}
 
.calendar .overview A:hover{
background-color: #FF0000;
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .overview .last_month {
color: #CCCCCC;
}
 
.calendar .overview .next_month {
color: #CCCCCC;
}
 
.calendar .overview #today {
color: #FFFFFF;
background-color: #FF9933;
}
 
.calendar .overview #selected {
color: #FFFFFF;
background-color: #FF0000;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .overview .dayname {
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .overview .reserved {
font-weight: bold;
font-size: 120%;
text-decoration: underline;
}
 
.calendar .today_select {
background-color: #FFFFFF;
text-align : right;
text-decoration: underline;
}
 
.calendar .today_select A {
font-size: 80%;
color: #82C4F4;
background-color: #FFFFFF;
text-align : center;
text-decoration: underline;
}
 
/* Appearance of the Eventlist */
 
.event_list_title {
color: #3300FF;
background-color: #FFFFFF;
font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
}
 
.event_list {
width : 500px;
height: auto;
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
border-bottom : 1pt dashed Black;
border-left : 1pt dashed Black;
border-right: 1pt dashed Black;
border-top : 1pt dashed Black;
}
 
.event_list .headings {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: #FFFFFF;
font-size: 100%;
background-color: #3300FF;
/* background : url(ice.jpg);*/
}
 
.event_list .col_status {
width: 50pt;
}
 
.event_list .col_date {
width: 100pt;
}
 
.event_list .col_event {
width: auto;
}
 
.event_list .status {
font-size: 80%;
color: Red;
font-weight: bold;
vertical-align : top;
}
 
.event_list .date {
font-size: 75%;
color: #888888;
font-family: Arial, Helvetica, sans-serif;
}
 
.event_list .event {
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
vertical-align : top;
}
 
.event_list A {
text-decoration: none;
}
 
.event_list A:hover {
text-decoration: underline;
}
 
.event_list .error_message {
font-size: 100%;
font-family: Arial, Helvetica, sans-serif;
margin-left : auto;
margin-right : auto;
padding-left : 10pt;
padding-right : 10pt;
padding-top: 10pt;
padding-bottom: 10pt;
background-color: #EAF0FF;
}
 
/* Appearance for Event-Infos */
 
.event_info {
width : 500px;
height: auto;
background-color: #FBFBFB;
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
border : 1pt solid;
}
 
.event_info .headings {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: #FFFFFF;
font-size: 100%;
background-color: Blue;
padding: 5pt 5pt 5pt 5pt;
/* background : url(ice.jpg);*/
}
 
.event_info .title {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
border-bottom : 1pt solid #000000;
}
 
.event_info .date {
background-color: White;
color: Blue;
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
width: 100pt;
border-bottom : 1pt solid #000000;
}
 
.event_info .description {
font-family: Arial, Helvetica, sans-serif;
padding: 10pt 10pt 10pt 10pt;
font-size: 80%;
}
 
.line_color0 {
background-color: #EFEFEF;
padding-top:3pt;
padding-bottom:3pt;
}
 
.line_color1 {
background-color: #FDFDFD;
padding-top:3pt;
padding-bottom:3pt;
}
 
.author_info {
font-size: xx-small;
color: #CCCCCC;
}
 
.next_event_select {
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
background-color: #FFFFFF;
text-align : left;
}
 
.next_event_select A {
font-size: 100%;
color: #82C4F4;
background-color: #FFFFFF;
text-align : center;
text-decoration: underline;
}
/kalender/css/ice.css
0,0 → 1,268
/* Appearance of the Calendar-Modul */
 
/*body
{
background-color : Blue;
background-image : test.jpg;
background-position : center;
background-repeat : no-repeat;
}*/
 
.calendar
{
width : 180px;
height : 180px;
}
 
.calendar .headline {
color: #FFFFFF;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
background-color: #006699;
border-bottom : 1pt solid Black;
border-left : 1pt dashed Black;
border-right: 1pt dashed Black;
border-top : 1pt dashed Black;
background : url(ice.jpg);
}
 
.calendar .headline A:link {
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .headline A:visited {
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .headline A:hover {
color: #FF0000;
text-decoration: none;
}
 
.calendar .overview {
background-color: #FEFADE;
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
text-align : center;
border-left : 1pt dashed Black;
border-right: 1pt dashed Black;
border-bottom : 1pt dashed Black;
height: 100%;
width: 100%;
}
 
.calendar .overview A:link {
text-decoration: none;
}
 
.calendar .overview A:visited {
text-decoration: none;
}
 
.calendar .overview A:hover{
background-color: #FF0000;
color: #FFFFFF;
text-decoration: none;
}
 
.calendar .overview .last_month {
color: #CCCCCC;
}
 
.calendar .overview .next_month {
color: #CCCCCC;
}
 
.calendar .overview #today {
color: #FFFFFF;
background-color: #FF9933;
}
 
.calendar .overview #selected {
color: #FFFFFF;
background-color: #FF0000;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .overview .dayname {
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .overview .reserved {
color: #FFFFFF;
background-color: #FF0000;
margin-top: auto;
margin-bottom: auto;
}
 
.calendar .today_select {
background-color: #FFFFFF;
text-align : right;
text-decoration: underline;
}
 
.calendar .today_select A {
font-size: 80%;
color: #82C4F4;
background-color: #FFFFFF;
text-align : center;
text-decoration: underline;
}
 
/* Appearance of the Eventlist */
 
.event_list_title {
color: #006699;
background-color: #FFFFFF;
font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
}
 
.event_list {
width : 500px;
height: auto;
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
border-bottom : 1pt dashed Black;
border-left : 1pt dashed Black;
border-right: 1pt dashed Black;
border-top : 1pt dashed Black;
}
 
.event_list .headings {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: #FFFFFF;
font-size: 100%;
background-color: #006699;
background : url(ice.jpg);
}
 
.event_list .col_status {
width: 50pt;
}
 
.event_list .col_date {
width: 100pt;
}
 
.event_list .col_event {
width: auto;
}
 
.event_list .status {
font-size: 80%;
color: Red;
font-weight: bold;
vertical-align : top;
}
 
.event_list .date {
font-size: 75%;
color: #888888;
font-family: Arial, Helvetica, sans-serif;
}
 
.event_list .event {
font-size: 80%;
font-family: Arial, Helvetica, sans-serif;
vertical-align : top;
}
 
.event_list A {
text-decoration: none;
}
 
.event_list A:hover {
text-decoration: underline;
}
 
.event_list .error_message {
font-size: 100%;
font-family: Arial, Helvetica, sans-serif;
margin-left : auto;
margin-right : auto;
padding-left : 10pt;
padding-right : 10pt;
padding-top: 10pt;
padding-bottom: 10pt;
background-color: #EAF0FF;
}
 
/* Appearance for Event-Infos */
 
.event_info {
width : 500px;
height: auto;
background-color: #FEFADE;
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
border : 1pt solid;
}
 
.event_info .headings {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
color: #FFFFFF;
font-size: 100%;
background-color: #006699;
padding: 5pt 5pt 5pt 5pt;
/* background : url(ice.jpg);*/
}
 
.event_info .title {
font-family: Arial, Helvetica, sans-serif;
font-weight: bold;
}
 
.event_info .date {
background-color: #EAF0FF;
color: #006699;
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
width: 100pt;
}
 
.event_info .description {
font-family: Arial, Helvetica, sans-serif;
padding: 10pt 10pt 10pt 10pt;
}
 
.line_color0 {
background-color: #DDE7FF;
padding-top:3pt;
padding-bottom:3pt;
}
 
.line_color1 {
background-color: #EAF0FF;
padding-top:3pt;
padding-bottom:3pt;
}
 
.author_info {
font-size: xx-small;
color: #CCCCCC;
}
 
.next_event_select {
font-family: Arial, Helvetica, sans-serif;
font-size: 80%;
background-color: #FFFFFF;
text-align : left;
}
 
.next_event_select A {
font-size: 100%;
color: #82C4F4;
background-color: #FFFFFF;
text-align : center;
text-decoration: underline;
}
/kalender/css/ice.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/1x1.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/back.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/back_today.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/delete_entry.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/edit_entry.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/magnglass.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/new_entry.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/next_month_wb.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/next_year_wb.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/prev_month_wb.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/prev_year_wb.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/printer.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/sel_img.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/status_pics/bell.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/status_pics/mozilla.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/images/status_pics/pics.index
0,0 → 1,2
"filename","return_value","comment"
"mozilla.gif","mozilla.gif","Mozilla Logo"
/kalender/images/status_pics/smiley.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/jax_calendar.php
0,0 → 1,25
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 
<head>
<title>Jax Calendar Demo</title>
</head>
 
<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" valign="top">&nbsp;</td>
<td align="right" valign="top">&nbsp;</td>
</tr>
<tr>
<td align="left" valign="top"><?php /*$base_url["jax_cal"] = "http://www/_jax_calendar";*/ require( "modules/eventlist.inc.php" ); /*require( "modules/nextevent.inc.php" ); /*displays the Event Kalendar!*/ ?></td>
<td align="right" valign="top"><?php require( "modules/calendar.inc.php" ); /*displays the calendar control!*/ ?></td>
</tr>
</table>
 
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</body>
 
</html>
/kalender/languages/catalan.inc.php
0,0 → 1,81
<?php
// Jax Calendar v1.33
// Traducción al castellano por www.riojawebs.com
 
$charset = "iso-8859-1";
$GMT_ofs = 0;
 
$_local_date_format = "A-m-d";
$_local_time_format = "h:i A";
$_js_calendar_format = "%A-%m-%d";
$_js_calendar_lang_file = "calendar-en.js";
$loc_lang["mo"] = "Lu";
$loc_lang["tu"] = "Ma";
$loc_lang["we"] = "Mi";
$loc_lang["th"] = "Ju";
$loc_lang["fr"] = "Vi";
$loc_lang["sa"] = "Sa";
$loc_lang["su"] = "Do";
 
$loc_lang["dates_and_events"] = "Fechas y Eventos";
$loc_lang["date"] = "Fecha";
$loc_lang["event"] = "Evento";
$loc_lang["calendar"] = "Calendario";
$loc_lang["admin_program"] = "Herramienta de Administración";
$loc_lang["delete"] = "Borrar";
$loc_lang["change"] = "Cambiar";
$loc_lang["new_entry"] = "Nueva Entrada";
$loc_lang["check_for_updates"] = "Chequear para actualizarse";
$loc_lang["no_entries"] = "No hay nuevas entradas seleccionadas";
$loc_lang["today"] = "Hoy";
$loc_lang["next_event"] = "Próximo evento";
$loc_lang["date_select"] = "Seleccionar Fecha";
 
$loc_lang["next_page"] = "Próxima página";
$loc_lang["prev_page"] = "Página Anterior";
$loc_lang["of_pages"] = "de";
 
$loc_lang["event_span"] = "Fecha del evento";
$loc_lang["display_span"] = "Hora";
$loc_lang["start"] = "Empieza";
$loc_lang["end"] = "Finaliza";
$loc_lang["whole_day"] = "Día completo";
$loc_lang["state"] = "Estado";
$loc_lang["title"] = "Título";
$loc_lang["detailed_info"] = "En Detalle";
$loc_lang["view_quick_select"] = "Si mantienes el botón pulsado podrás seleccionar el mes y el año";
$loc_lang["calendar_view"] = "Visualizar Datos referentes a";
$loc_lang["view_day"] = "1 Día";
$loc_lang["view_week"] = "1 Semana";
$loc_lang["view_2week"] = "14 Días";
$loc_lang["view_month"] = "1 Mes";
$loc_lang["view_3months"] = "3 Meses";
$loc_lang["view_6months"] = "6 Meses";
$loc_lang["view_1year"] = "1 Año";
$month_name = array();
$month_name[1] = "Ene";
$month_name[2] = "Feb";
$month_name[3] = "Mar";
$month_name[4] = "Abr";
$month_name[5] = "May";
$month_name[6] = "Jun";
$month_name[7] = "Jul";
$month_name[8] = "Ago";
$month_name[9] = "Sep";
$month_name[10] = "Oct";
$month_name[11] = "Nov";
$month_name[12] = "Dic";
$loc_lang["back_to_index"] = "back to index";
$loc_lang["delete_entry_confrm"] = "Really wan't to delete this entry?";
$loc_lang["yes"] = "Yes";
$loc_lang["no"] = "No";
$loc_lang["prepare_printing"] = "Print Version";
$loc_lang["search_dates"] = "Search Dates";
$loc_lang["found_dates"] = "Found Dates";
$loc_lang["err_no_dates_found"] = "Search term not found";
 
?>
/kalender/languages/english.inc.php
0,0 → 1,81
<?php
// Jax Calendar v1.33
// English translation (2004-03-18) by Jack (tR) [jack@jtr.de]
 
$charset = "iso-8859-1";
$GMT_ofs = 0;
 
$_local_date_format = "Y-m-d";
$_local_time_format = "h:i A";
$_js_calendar_format = "%Y-%m-%d";
$_js_calendar_lang_file = "calendar-en.js";
$loc_lang["mo"] = "Mo";
$loc_lang["tu"] = "Tu";
$loc_lang["we"] = "We";
$loc_lang["th"] = "Th";
$loc_lang["fr"] = "Fr";
$loc_lang["sa"] = "Sa";
$loc_lang["su"] = "Su";
 
$loc_lang["dates_and_events"] = "Dates & Events";
$loc_lang["date"] = "Date";
$loc_lang["event"] = "Event";
$loc_lang["calendar"] = "Calendar";
$loc_lang["admin_program"] = "Admin Tool";
$loc_lang["delete"] = "Delete";
$loc_lang["change"] = "Change";
$loc_lang["new_entry"] = "New Entry";
$loc_lang["check_for_updates"] = "Check for updates";
$loc_lang["no_entries"] = "There are no dates/events on selected date";
$loc_lang["today"] = "today";
$loc_lang["next_event"] = "next event";
$loc_lang["date_select"] = "Select Date";
$loc_lang["next_page"] = "next page";
$loc_lang["prev_page"] = "previous page";
$loc_lang["of_pages"] = "of";
 
$loc_lang["event_span"] = "Event time";
$loc_lang["display_span"] = "Display time";
$loc_lang["start"] = "Start";
$loc_lang["end"] = "End";
$loc_lang["whole_day"] = "whole day";
$loc_lang["state"] = "State";
$loc_lang["title"] = "Title";
$loc_lang["detailed_info"] = "Detailed Infos";
$loc_lang["view_quick_select"] = "Keep pressed mouse button for Quick Selection";
$loc_lang["calendar_view"] = "Overview";
$loc_lang["view_day"] = "1 Day";
$loc_lang["view_week"] = "1 Week";
$loc_lang["view_2week"] = "14 Days";
$loc_lang["view_month"] = "1 Month";
$loc_lang["view_3months"] = "3 Months";
$loc_lang["view_6months"] = "6 Months";
$loc_lang["view_1year"] = "1 Year";
$month_name = array();
$month_name[1] = "Jan";
$month_name[2] = "Feb";
$month_name[3] = "Mar";
$month_name[4] = "Apr";
$month_name[5] = "May";
$month_name[6] = "Jun";
$month_name[7] = "Jul";
$month_name[8] = "Aug";
$month_name[9] = "Sep";
$month_name[10] = "Oct";
$month_name[11] = "Nov";
$month_name[12] = "Dec";
$loc_lang["back_to_index"] = "back to index";
$loc_lang["delete_entry_confrm"] = "Really wan't to delete this entry?";
$loc_lang["yes"] = "Yes";
$loc_lang["no"] = "No";
$loc_lang["prepare_printing"] = "Print Version";
$loc_lang["search_dates"] = "Search Dates";
$loc_lang["found_dates"] = "Found Dates";
$loc_lang["err_no_dates_found"] = "Search term not found";
 
?>
/kalender/languages/finnish.inc.php
0,0 → 1,81
+?>
\ No newline at end of file
/kalender/languages/german.inc.php
0,0 → 1,84
<?php
// Jax Calendar v1.33
// German version (2004-03-18) by Jack (tR) [jack@jtr.de]
 
$charset = "iso-8859-1";
$GMT_ofs = -1;
 
$_local_date_format = "d.m.Y";
$_local_time_format = "H:i";
$_js_calendar_format = "%d.%m.%Y";
$_js_calendar_lang_file = "calendar-de.js";
$loc_lang["mo"] = "Mo";
$loc_lang["tu"] = "Di";
$loc_lang["we"] = "Mi";
$loc_lang["th"] = "Do";
$loc_lang["fr"] = "Fr";
$loc_lang["sa"] = "Sa";
$loc_lang["su"] = "So";
$loc_lang["dates_and_events"] = "Termine & Veranstaltungen";
$loc_lang["date"] = "Datum";
$loc_lang["event"] = "Termin / Ereignis";
$loc_lang["calendar"] = "Kalender";
$loc_lang["admin_program"] = "Verwaltungsprogramm";
$loc_lang["delete"] = "Löschen";
$loc_lang["change"] = "Ändern";
$loc_lang["new_entry"] = "Neuer Eintrag";
$loc_lang["check_for_updates"] = "Nach Updates suchen";
$loc_lang["no_entries"] = "Es stehen keine Termine für den ausgewählten Zeitpunkt an";
$loc_lang["today"] = "Heute";
$loc_lang["next_event"] = "Nächstes Ereignis";
$loc_lang["date_select"] = "Datum auswählen";
 
$loc_lang["next_page"] = "Nächste Seite";
$loc_lang["prev_page"] = "Vorherige Seite";
$loc_lang["of_pages"] = "von";
$loc_lang["start"] = "Beginn";
$loc_lang["end"] = "Ende";
 
$loc_lang["event_span"] = "Ereigniszeitraum";
$loc_lang["display_span"] = "Anzeigezeitraum";
$loc_lang["start"] = "Anfang";
$loc_lang["end"] = "Ende";
$loc_lang["whole_day"] = "ganztägig";
$loc_lang["state"] = "Status";
$loc_lang["title"] = "Titel";
$loc_lang["detailed_info"] = "ausführlich";
$loc_lang["view_quick_select"] = "Maustaste gedrückt halten für Schnellauswahl";
$loc_lang["calendar_view"] = "Zeitraum";
$loc_lang["view_day"] = "1 Tag";
$loc_lang["view_week"] = "1 Woche";
$loc_lang["view_2week"] = "14 Tage";
$loc_lang["view_month"] = "1 Monat";
$loc_lang["view_3months"] = "3 Monate";
$loc_lang["view_6months"] = "6 Monate";
$loc_lang["view_1year"] = "1 Jahr";
$month_name = array();
$month_name[1] = "Jan";
$month_name[2] = "Feb";
$month_name[3] = "Mär";
$month_name[4] = "Apr";
$month_name[5] = "Mai";
$month_name[6] = "Jun";
$month_name[7] = "Jul";
$month_name[8] = "Aug";
$month_name[9] = "Sep";
$month_name[10] = "Okt";
$month_name[11] = "Nov";
$month_name[12] = "Dez";
 
$loc_lang["back_to_index"] = "zurück zur Übersicht";
$loc_lang["delete_entry_confrm"] = "Wollen Sie diesen Eintrag wirklich löschen?";
$loc_lang["yes"] = "Ja";
$loc_lang["no"] = "Nein";
$loc_lang["prepare_printing"] = "Druckversion";
$loc_lang["search_dates"] = "Suche Termine";
$loc_lang["found_dates"] = "Gefundene Termine";
$loc_lang["err_no_dates_found"] = "Keine entsprechenden Einträge gefunden";
?>
/kalender/languages/hungarian.inc.php
0,0 → 1,81
<?php
// Jax Calendar v1.33
// English translation (2004-03-18) by Jack (tR) [jack@jtr.de]
 
$charset = "iso-8859-1";
$GMT_ofs = 0;
 
$_local_date_format = "Y.m.d";
$_local_time_format = "h:i A";
$_js_calendar_format = "%Y.%m.%d";
$_js_calendar_lang_file = "calendar-hu.js";
$loc_lang["mo"] = "Hé";
$loc_lang["tu"] = "Ke";
$loc_lang["we"] = "Sz";
$loc_lang["th"] = "Cs";
$loc_lang["fr"] = "Pé";
$loc_lang["sa"] = "Sz";
$loc_lang["su"] = "Va";
 
$loc_lang["dates_and_events"] = "Dátum és Esemény";
$loc_lang["date"] = "Dátum";
$loc_lang["event"] = "Esemény";
$loc_lang["calendar"] = "Naptár";
$loc_lang["admin_program"] = "Adminisztráció";
$loc_lang["delete"] = "Törlés";
$loc_lang["change"] = "Változtatás";
$loc_lang["new_entry"] = "új adat";
$loc_lang["check_for_updates"] = "Update keresés";
$loc_lang["no_entries"] = "Nincs esemény a kiválasztott idõben";
$loc_lang["today"] = "ma";
$loc_lang["next_event"] = "következö esemény";
$loc_lang["date_select"] = "Dátum kiválasztása";
$loc_lang["calendar_view"] = "Nézet";
$loc_lang["next_page"] = "következõ oldal";
$loc_lang["prev_page"] = "elõzõ oldal";
$loc_lang["of_pages"] = "-";
 
$loc_lang["event_span"] = "Esemény ideje";
$loc_lang["display_span"] = "Idõtartam";
$loc_lang["start"] = "Kezdés";
$loc_lang["end"] = "Vége";
$loc_lang["whole_day"] = "egész nap";
$loc_lang["state"] = "állapot";
$loc_lang["title"] = "Cím";
$loc_lang["detailed_info"] = "Részletes információ";
$loc_lang["view_quick_select"] = "Gyors választáshoz tartsa nyomva az egérgombot";
$loc_lang["view_day"] = "1 nap";
$loc_lang["view_week"] = "1 hét";
$loc_lang["view_2week"] = "14 nap";
$loc_lang["view_month"] = "1 hónap";
$loc_lang["view_3months"] = "3 hónap";
$loc_lang["view_6months"] = "6 hónap";
$loc_lang["view_1year"] = "1 év";
$month_name = array();
$month_name[1] = "Jan";
$month_name[2] = "Feb";
$month_name[3] = "Már";
$month_name[4] = "Ápr";
$month_name[5] = "Máj";
$month_name[6] = "Jún";
$month_name[7] = "Júl";
$month_name[8] = "Aug";
$month_name[9] = "Szep";
$month_name[10] = "Okt";
$month_name[11] = "Nov";
$month_name[12] = "Dec";
 
$loc_lang["back_to_index"] = "back to index";
$loc_lang["delete_entry_confrm"] = "Really wan't to delete this entry?";
$loc_lang["yes"] = "Yes";
$loc_lang["no"] = "No";
$loc_lang["prepare_printing"] = "Print Version";
$loc_lang["search_dates"] = "Search Dates";
$loc_lang["found_dates"] = "Found Dates";
$loc_lang["err_no_dates_found"] = "Search term not found";
?>
/kalender/languages/norwegian.inc.php
0,0 → 1,81
<?php
// Jax Calendar v1.33
// Norsk oversettelse (2004-05-26) av Harald H. Soleng [harald.soleng@nr.no]
 
$charset = "iso-8859-1";
$GMT_ofs = 0;
 
$_local_date_format = "Y-m-d";
$_local_time_format = "h:i A";
$_js_calendar_format = "%Y-%m-%d";
$_js_calendar_lang_file = "calendar-no.js";
 
$loc_lang["mo"] = "Ma";
$loc_lang["tu"] = "Ti";
$loc_lang["we"] = "On";
$loc_lang["th"] = "To";
$loc_lang["fr"] = "Fr";
$loc_lang["sa"] = "Lø";
$loc_lang["su"] = "Sø";
 
$loc_lang["dates_and_events"] = "Terminliste";
$loc_lang["date"] = "Dato";
$loc_lang["event"] = "Begivenhet";
$loc_lang["calendar"] = "Kalender";
$loc_lang["admin_program"] = "Admin. verktøy";
$loc_lang["delete"] = "Slett";
$loc_lang["change"] = "Oppdater";
$loc_lang["new_entry"] = "Ny";
$loc_lang["check_for_updates"] = "Sjekk for oppdateringer";
$loc_lang["no_entries"] = "Det er ingen begivenher på angitt dato";
$loc_lang["today"] = "i dag";
$loc_lang["next_event"] = "neste hendelse";
$loc_lang["date_select"] = "velg dato";
 
$loc_lang["next_page"] = "neste side";
$loc_lang["prev_page"] = "forrige side";
$loc_lang["of_pages"] = "av";
 
$loc_lang["event_span"] = "Tidspunkt";
$loc_lang["display_span"] = "Vis tid";
$loc_lang["start"] = "Start";
$loc_lang["end"] = "Slutt";
$loc_lang["whole_day"] = "Hele dagen";
$loc_lang["state"] = "Tilstand";
$loc_lang["title"] = "Tittel";
$loc_lang["detailed_info"] = "Detaljert info";
$loc_lang["view_quick_select"] = "Hold musknappen for hurtigvalg";
 
$loc_lang["calendar_view"] = "Oversikt";
$loc_lang["view_day"] = "1 dag";
$loc_lang["view_week"] = "1 uke";
$loc_lang["view_2week"] = "14 dager";
$loc_lang["view_month"] = "1 måned";
$loc_lang["view_3months"] = "3 måneder";
$loc_lang["view_6months"] = "6 måneder";
$loc_lang["view_1year"] = "1 år";
 
$month_name = array();
$month_name[1] = "Jan";
$month_name[2] = "Feb";
$month_name[3] = "Mar";
$month_name[4] = "Apr";
$month_name[5] = "Mai";
$month_name[6] = "Jun";
$month_name[7] = "Jul";
$month_name[8] = "Aug";
$month_name[9] = "Sep";
$month_name[10] = "Okt";
$month_name[11] = "Nov";
$month_name[12] = "Des";
 
$loc_lang["back_to_index"] = "back to index";
$loc_lang["delete_entry_confrm"] = "Really wan't to delete this entry?";
$loc_lang["yes"] = "Yes";
$loc_lang["no"] = "No";
$loc_lang["prepare_printing"] = "Print Version";
$loc_lang["search_dates"] = "Search Dates";
$loc_lang["found_dates"] = "Found Dates";
$loc_lang["err_no_dates_found"] = "Search term not found";
?>
/kalender/languages/spanish.inc.php
0,0 → 1,81
<?php
// Jax Calendar v1.33
// Traducción al Español (2004-06-08) by David Navarro Gallego [david@jerica.com]
 
$charset = "iso-8859-1";
$GMT_ofs = 0;
 
$_local_date_format = "Y-m-d";
$_local_time_format = "h:i A";
$_js_calendar_format = "%Y-%m-%d";
$_js_calendar_lang_file = "calendar-es.js";
$loc_lang["mo"] = "Lu";
$loc_lang["tu"] = "Ma";
$loc_lang["we"] = "Mi";
$loc_lang["th"] = "Ju";
$loc_lang["fr"] = "Vi";
$loc_lang["sa"] = "Sa";
$loc_lang["su"] = "Do";
 
$loc_lang["dates_and_events"] = "Fechas y eventos";
$loc_lang["date"] = "Fecha";
$loc_lang["event"] = "Evento";
$loc_lang["calendar"] = "Calendario";
$loc_lang["admin_program"] = "Herramientas de administración";
$loc_lang["delete"] = "Borrar";
$loc_lang["change"] = "Cambiar";
$loc_lang["new_entry"] = "Nueva entrada";
$loc_lang["check_for_updates"] = "Check for updates";
$loc_lang["no_entries"] = "No hay fechas/eventos en la selección";
$loc_lang["today"] = "hoy";
$loc_lang["next_event"] = "próximo evento";
$loc_lang["date_select"] = "Selecciona Fecha";
$loc_lang["next_page"] = "página siguiente";
$loc_lang["prev_page"] = "página anterior";
$loc_lang["of_pages"] = "de";
 
$loc_lang["event_span"] = "Hora del evento";
$loc_lang["display_span"] = "Mostrar hora";
$loc_lang["start"] = "Comiezo";
$loc_lang["end"] = "Fin";
$loc_lang["whole_day"] = "día íntegro";
$loc_lang["state"] = "Provincia";
$loc_lang["title"] = "Título";
$loc_lang["detailed_info"] = "información detallada";
$loc_lang["view_quick_select"] = "Mantén presionado el botón del ratón para una rápida selección";
$loc_lang["calendar_view"] = "Información general";
$loc_lang["view_day"] = "1 Día";
$loc_lang["view_week"] = "1 Semana";
$loc_lang["view_2week"] = "14 Días";
$loc_lang["view_month"] = "1 Mes";
$loc_lang["view_3months"] = "3 Meses";
$loc_lang["view_6months"] = "6 Meses";
$loc_lang["view_1year"] = "1 Año";
$month_name = array();
$month_name[1] = "Ene";
$month_name[2] = "Feb";
$month_name[3] = "Mar";
$month_name[4] = "Abr";
$month_name[5] = "May";
$month_name[6] = "Jun";
$month_name[7] = "Jul";
$month_name[8] = "Ago";
$month_name[9] = "Sep";
$month_name[10] = "Oct";
$month_name[11] = "Nov";
$month_name[12] = "Dic";
 
$loc_lang["back_to_index"] = "back to index";
$loc_lang["delete_entry_confrm"] = "Really wan't to delete this entry?";
$loc_lang["yes"] = "Yes";
$loc_lang["no"] = "No";
$loc_lang["prepare_printing"] = "Print Version";
$loc_lang["search_dates"] = "Search Dates";
$loc_lang["found_dates"] = "Found Dates";
$loc_lang["err_no_dates_found"] = "Search term not found";
?>
/kalender/manual.html
0,0 → 1,16
<html>
<head>
<title>Newsletter README</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
 
<body bgcolor="#FFFFFF" text="#000000">
 
<p>&nbsp;</p>
<p>Manuals:</p>
<p><a href="manuals/readme.html">English</a></p>
<p><a href="manuals/liesmich.html">German</a></p>
<p><a href="manuals/readme_fi.html">Finnish</a></p>
<p><a href="manuals/gpl.txt">License (GPL)</a></p>
</body>
</html>
/kalender/manuals/contact_addy.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/manuals/gpl.txt
0,0 → 1,342
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
 
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
Preamble
 
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
 
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
 
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
 
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
 
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
 
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
 
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
 
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
 
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
 
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
 
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
 
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
 
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
 
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
 
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
 
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
 
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
 
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
 
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
 
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
 
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
 
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
 
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
 
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
 
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
 
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
 
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
 
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
 
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
 
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
 
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
 
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
 
NO WARRANTY
 
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
 
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
 
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
 
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
 
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
 
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 
Also add information on how to contact you by electronic and paper mail.
 
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
 
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
 
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
 
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
 
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
 
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
 
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
 
 
/kalender/manuals/liesmich.html
0,0 → 1,862
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Jax Calendar v1.31 - Dokumentation</title>
<meta name="keywords" content="Jax Calendar, Online Kalendar, PHP Kalender, PHP Terminverwaltung, Dokumentation, Bedienungsanleitung, Installationsanleitung">
<meta name="description" content="Auf dieser Seite stehen alle wichtigen Informationen zur Installation und Nutzung von Jax Calendar.">
<meta name="author" content="Andreas John aka Jack (tR)">
<meta name="DC.Title" content="Benutzerhandbuch f&uuml;r Jax Calendar v1.31">
<meta name="DC.Creator" content="Andreas John aka Jack (tR)">
<meta name="DC.Subject" content="Benutzerhandbuch">
<meta name="DC.Description" content="Auf dieser Seite stehen alle wichtigen Informationen zur Installation und Nutzung von Jax Calendar.">
<meta name="DC.Publisher" content="Andreas John">
<meta name="DC.Contributor" content="Andreas John">
<meta name="DC.Date" content="2004-04-09">
<meta name="DC.Type" content="Text">
<meta name="DC.Format" content="text/html">
<meta name="DC.Identifier" content="http://www.jtr.de/scripting/php/calendar">
<meta name="DC.Source" content="Benutzerhandbuch">
<meta name="DC.Language" content="de">
<meta name="DC.Relation" content="Quelle">
<meta name="DC.Coverage" content="Berlin">
<meta name="DC.Rights" content="Alle Rechte vorbehalten.">
<style type="text/css">
<!--
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
margin: 10%;
}
 
.title {
font-family: "Arial Black", Arial, Helvetica, sans-serif;
font-size: 200%;
font-weight: bolder;
text-align: center
}
 
.prog_info {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
padding: 5%;
border : 2px solid #000000;
background-color : #FDFAF4;
}
 
.index {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
padding: 5%;
border : 1pt dashed #000000;
background-color : #E3EEFD;
}
 
.index A {
text-decoration: none;
}
 
.index A:hover {
text-decoration: underline;
}
 
 
.source_view {
font-family: "Courier New", Courier, mono;
font-size: 80%;
text-align: left;
padding: 3%;
border : 1pt dashed #000000;
background-color : #EEEEEE;
}
 
h1, h2, h3, h4, h5, h6 {
font-family: Arial, Helvetica, sans-serif;
font-weight: bolder;
}
 
h1, h2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 180%;
}
 
h3, h4 {
font-size: 120%;
}
 
h5, h6 {
font-size: 120%;
}
 
 
.index h3 {
 
text-align: left
}
 
.index .sub {
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
font-weight: bolder;
text-align: left;
margin-left: 5%;
}
 
.inputs_outputs, .file_name {
font-size: 100%;
font-family: "Courier New", Courier, mono;
}
 
.urls {
font-size: 100%;
font-family: "Courier New", Courier, mono;
}
 
.sec_note {
font-weight: bolder;
color: red;
}
.file_name { color: #3399CC }
-->
</style>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p class="title">Jax Calendar v1.31<br>
Dokumentation</p>
<p>&nbsp;</p>
<div class="index">
<h3>O. Allgemeine Informationen</h3>
<div class="sub">
<p><a href="#program_and_author">Programm und Autor</a><br>
<a href="#credits">Danksagungen</a></p>
</div>
<h3>I. Einleitung</h3>
<div class="sub">
<p><a href="#about">Was ist Jax Calendar? - Wozu braucht man es?<br>
</a><a href="#features">Leistungsmerkmale (Features)</a><br>
<a href="#requirements">Systemvoraussetzungen</a><br>
<a href="#license">Lizenz</a></p>
</div>
<h3>II. Installation</h3>
<div class="sub">
<p><a href="#install_without_mysql">ohne MySQL-Unterst&uuml;tzung<br>
</a><a href="#install_with_mysql">mit MySQL-Unterst&uuml;tzung</a></p>
</div>
<h3>III. Anwendung</h3>
<div class="sub">
<p><a href="#calendar_admin">Umgang mit dem Kalendarverwaltungssystem</a><br>
<a href="#howtolink">Anwendung / Einbindung des Skriptes</a></p>
</div>
<h3>IV. H&auml;ufig gestellte Fragen (FAQs)</h3>
<div class="sub">
<p><a href="#include_modules">Wie kann man das Kalender-Steuerelement direkt
in seine eigene Webseite einbauen?</a><br>
<a href="#fonts_and_colors">Wie kann man die Farben und Schriftarten anpassen?</a><br>
<a href="#faq_timespan">Wie kann man die Zeitraumbeschr&auml;nkung an/abschalten?<br>
Wie &ouml;ffne ich die Eventliste in einem eigenen Fenster?<br>
</a><a href="#multiple_calendars">Wie kann man mehrere Kalendarien gleichzeitig
betreiben?<br>
</a><a href="#file_permissions">Wie &auml;ndert man die Datei-Zugriffsrechte
auf dem Webserver?<br>
</a><a href="#max_entries">Wieviele Einträge kann Jax Calendar speichern?<br>
</a><a href="#updates">Wo erhalte ich Informationen &uuml;ber Updates und
&Auml;nderungen?</a><br>
</p>
</div>
<h3>V. Bekannte Fehler und Probleme (Troubleshooting)</h3>
<div class="sub">
<p><a href="#bugs_mysql">Probleme mit MySQL<br>
</a></p>
</div>
<h3>VI. Liste der &Auml;nderungen (ChangeLog)</h3>
<div class="sub"> <a href="#changelog_v130">v1.3</a> ,<a href="#changelog_v127">v1.27</a>
,<a href="#changelog_v126">v1.26</a> ,<a href="#changelog_v125">v1.25</a>,
<a href="#changelog_v120">v1.2</a></div>
</div>
<h3>&nbsp;</h3>
<h1>O. Allgemeine Informationen</h1>
<p>&nbsp;</p>
<h3><a name="program_and_author"></a>Programm und Autor</h3>
<div class="prog_info">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Projekt:</td>
<td>&nbsp;</td>
<td>Jax Calendar (Online Event-Kalendar) </td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Version: </td>
<td>&nbsp;</td>
<td>1.31</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Interpreter:</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>PHP 4.3+</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Code:</td>
<td>&nbsp;</td>
<td>Andreas John</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Design:</td>
<td>&nbsp;</td>
<td>Andreas John</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Homepage:</td>
<td>&nbsp;</td>
<td><a href="http://www.jtr.de/scripting/php/calendar" target="_blank" class="urls">www.jtr.de/scripting/php/calendar/</a></td>
</tr>
<tr>
<td valign="top">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td valign="top">Lizenz:</td>
<td>&nbsp;</td>
<td>
<p>Copyright (C) 2002-2004, Andreas John [ Jack (tR) ]</p>
<p>Dieses Programm ist Freeware im Sinne der "General Public License"
Version 2 oder neuer! Den genauen Wortlaut dieser Lizenz finden Sie
in der beiliegenden Datei gpl.txt, bzw. auf der Website der Free Software
Foundation unter <a href="http://www.fsf.org/copyleft/gpl.html" target="_blank" class="urls">http://www.fsf.org/copyleft/gpl.html</a><br>
</p>
<p>Bitte beachten Sie, dass ich keinerlei Haftung f&uuml;r Sch&auml;den
&uuml;bernehme, die im Zusammenhang mit der Nutzung dieser Software
auftreten...</p>
</td>
</tr>
</table>
</div>
<p>&nbsp;</p>
<h3><a name="credits"></a>Danksagungen</h3>
<p>Ich m&ouml;chte allen Leuten ein gro&szlig;es Dankesch&ouml;n aussprechen,
die dieses und viele andere Open Source Projekte durch ihre Hinweise, &Uuml;bersetzungen,
liebevollen Anpassungen und Links auf ihren Webseiten unterst&uuml;tzen...</p>
<p>Mein pers&ouml;nliches Dankesch&ouml;n geht vor allem an:</p>
<table border="0" width="100%">
<tr>
<td>
<p> Bela-Andreas Bargel <a href="http://www.fuldas-tauchertreff.de" target="_blank" class="urls">
<br>
</a></p>
</td>
<td><a href="http://www.fuldas-tauchertreff.de" target="_blank" class="urls">http://www.fuldas-tauchertreff.de</a></td>
</tr>
<tr>
<td>Carmine Santoro <a href="http://www.webdomus.net" target="_blank" class="urls">
</a><br>
</td>
<td><a href="http://www.webdomus.net" target="_blank" class="urls">http://www.webdomus.net</a></td>
</tr>
<tr>
<td>Daniele MORO</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Eduardo H. Sabbi <a href="http://www.drgate.com.br/" target="_blank" class="urls"><br>
</a></td>
<td><a href="http://www.drgate.com.br/" target="_blank" class="urls">http://www.drgate.com.br/</a></td>
</tr>
<tr>
<td>Gerard Farr&agrave;s Ballabriga </td>
<td><a href="http://www.ctfc.es" target="_blank" class="urls">http://www.ctfc.es</a></td>
</tr>
<tr>
<td>Guttorm Hveem</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Helge Larsen</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Jarno Ristaniemi </td>
<td><a href="http://www.vihrealiitto.fi/lappi" class="urls">http://www.vihrealiitto.fi/lappi</a></td>
</tr>
<tr>
<td>Jan Br&uuml;nig</td>
<td class="urls"><a href="http://www.stb-vs-devils.de" target="_blank">http://www.stb-vs-devils.de</a></td>
</tr>
<tr>
<td>Jan van Thiel</td>
<td><a href="http://www.taveres.nl" target="_blank" class="urls">http://www.taveres.nl</a></td>
</tr>
<tr>
<td>Klaus-Peter Lexow</td>
<td><a href="http://www.hell-is-open.de" target="_blank" class="urls">http://www.hell-is-open.de</a>
</td>
</tr>
<tr>
<td>Marc Gavage</td>
<td><a href="http://portix.be" target="_blank" class="urls">http://portix.be</a></td>
</tr>
<tr>
<td>Martin Sondermann </td>
<td><a href="http://www.kunstphotografie.de" target="_blank" class="urls">http://www.kunstphotografie.de</a></td>
</tr>
<tr>
<td>Mitsuhiro Yoshida</td>
<td><a href="http://mitstek.com/" target="_blank" class="urls">http://mitstek.com/</a></td>
</tr>
<tr>
<td>Nikityuk Victor</td>
<td><a href="http://nikvic.mlcorp.ru" target="_blank" class="urls">http://nikvic.mlcorp.ru</a></td>
</tr>
<tr>
<td>Pawel Wagner </td>
<td><a href="http://www.gry.skokinarciarskie.com" target="_blank" class="urls">http://www.gry.skokinarciarskie.com</a></td>
</tr>
<tr>
<td>Peter Dauth</td>
<td><a href="http://www.action-sport.de" target="_blank" class="urls">http://www.action-sport.de</a></td>
</tr>
<tr>
<td>Roberto Lizana Ramirez (TreYDo)<br>
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Roger Simestad </td>
<td><a href="http://www.rsweben.net" target="_blank" class="urls">http://www.rsweben.net</a></td>
</tr>
<tr>
<td>Sigrid Henning-Bellwinkel </td>
<td><a href="http://bellwinkel.de" target="_blank" class="urls">http://bellwinkel.de</a></td>
</tr>
<tr>
<td>Wojciech Dorosz</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>InteractiveTools.com (bzw. die Entwickler von <a href="http://www.interactivetools.com/products/htmlarea/index.html" target="_blank" class="urls">HTMLarea</a>)</td>
<td><a href="http://www.interactivetools.com" class="urls">http://www.interactivetools.com/</a></td>
</tr>
<tr>
<td>Mihai Bazon (Entwickler des DHTML Kalendar)</td>
<td><a href="http://students.infoiasi.ro/%7Emishoo/" target="_blank" class="urls">http://students.infoiasi.ro/~mishoo/</a></td>
</tr>
</table>
<p>&nbsp;</p>
<h1>I. Einleitung</h1>
<p>&nbsp;</p>
<h3><a name="about"></a>Was ist Jax Calendar? - Wozu braucht man es?</h3>
<p>Jax Calendar ist ein Online-Event-Kalendersystem, das Sie ohne Programmiererfahrungen
in Ihre Homepage einbauen und beliebig anpassen k&ouml;nnen.</p>
<p>In einem Online-Event-Kalender können Sie die Termine und Fristen bevorstehender
Ereignisse eintragen. Je nach aktuellem Datum bekommen Ihre Besucher eine entsprechend
zusammengefasste Liste der bevorstehenden Ereignisse pr&auml;sentiert. </p>
<p>Eine Demoversion von Jax Calendar finden Sie unter: <a href="http://www.jtr.de/scripting/php/calendar/calendar/jax_calendar.php" target="_blank" class="urls">http://www.jtr.de/scripting/php/calendar/calendar/jax_calendar.php</a></p>
<h3>&nbsp;</h3>
<h3><a name="features"></a>Leistungsmerkmale (Features)</h3>
<p>Jax Calendar bietet Ihnen neben den typischen Funktionen eines WWW-Kalendars
viele zus&auml;tzliche Leistungsmerkmale. Besonders hervorzuheben ist an dieser
Stelle die sehr flexible Unterst&uuml;tzung <b>verschiedener Datenquellen</b>,
die es Ihnen erm&ouml;glicht, das Kalendarsystem sowohl mit einfachen CSV-Textdateien
als auch mit einem MySQL-Datenbanksystem zu betreiben.</p>
<p>Nachfolgend finden Sie eine &Uuml;bersicht der wesentlichen Leistungsmerkmale
von Jax Calendar:</p>
<ul>
<li> <b>Unterst&uuml;tzung verschiedener Datenquellen</b> (MySQL und CSV-Textdateien)<br>
<br>
</li>
<li>M&ouml;glichkeit<b> mehrere Kalendare </b>mit demselben Skript zu betreiben
<br>
<br>
</li>
<li>modernes, ansprechendes Erscheinungsbild (&quot;Look &amp; Feel&quot;)<br>
<b>Schriften und Farben sind individuell via Cascading Stylesheets (CSS) anpassbar</b><br>
<br>
</li>
<li> <b>Unterst&uuml;tzung f&uuml;r mehrere Sprachen</b><br>
(Vorlagen f&uuml;r: Deutsch, D&auml;nisch, Englisch, Finnisch, Franz&ouml;sisch,
Holl&auml;ndisch, Japanisch, Polnisch, Spanisch)<br>
<br>
</li>
<li><b>Verschiedene Ansichten</b> <br>
(Jahres-/Monats-/Tages&uuml;bersicht)<br>
<br>
</li>
<li>modularer Aufbau (Kalendarsteuerelement und Event-Liste lassen sich voneinander
getrennt einbauen) <br>
<br>
</li>
<li><b>komfortables Verwaltungsprogramm</b><br>
<br>
</li>
<li> <b>ausf&uuml;hrliche Bedienungsanleitung</b><br>
<br>
</li>
<li>optische <b>Update Benachrichtigung</b> (im Administrationsprogramm)<br>
<br>
</li>
<li><b>kostenlos </b>und frei erh&auml;ltlich (GPL)!</li>
</ul>
<p>&nbsp;</p>
<h3><a name="requirements"></a>Systemvoraussetzungen</h3>
<p>Jax Calendar wurde in PHP 4 geschrieben, einer serverseitigen Programmiersprache,
mit der man dynamisch erzeugte Webseiten erstellen kann! (Fragen Sie gegebenenfalls
Ihren Web-Provider nach <b>PHP-Unterstützung</b>!) </p>
<p>Jax Calendar ist in der Lage, die Daten sowohl in einfachen Textdateien, alsauch
in einem MySQL-Datenbanksystem abzulegen, dadurch <b> l&auml;uft es auch ohne
MySQL-Datenbank-Anbindung! </b></p>
<p>&nbsp;</p>
<h3><a name="license"></a>Lizenz</h3>
<p>Jax Calendar und seine Einzel-Bestandteile unterliegen den Bedingungen der
<b>GPL - General Public License in der <nobr>Version 2</nobr> oder neuer!</b>
Den genauen Wortlaut dieser Lizenz finden Sie in der beiliegenden Datei <span class="file_name">gpl.txt</span>,
bzw. auf der Website der Free Software Foundation unter <a href="http://www.fsf.org/copyleft/gpl.html" target="_blank" class="urls">http://www.fsf.org/copyleft/gpl.html</a></p>
<p>Diese Lizenz erlaubt es Ihnen vor allem, die Software frei weiterzugeben und
nat&uuml;rlich weiterzuentwickeln. Desweiteren sind Sie hiermit verpflichtet,
einen Copyrighthinweis, bzw. einen Link zum Originalskript (<a href="http://www.jtr.de/scripting/php/calendar" target="_parent" class="urls">http://www.jtr.de/scripting/php/calendar</a>)
beizubehalten!</p>
<p>Jax Calendar enth&auml;lt ausserdem das Modul <a href="http://www.interactivetools.com/products/htmlarea/index.html" target="_blank" class="urls">htmlArea</a>,
das einer BSD-&auml;hnlichen Lizenz unterliegt, die sie evtl. gesondert ber&uuml;cksichtigen
m&uuml;ssen.</p>
<p>&nbsp;</p>
<h1>II. Installation</h1>
<p>&nbsp;</p>
<h3><a name="install_without_mysql"></a>Installation ohne MySQL-Unterst&uuml;tzung</h3>
<p>Jax Calendar wurde in PHP 4 geschrieben, einer serverseitigen Programmiersprache,
mit der man dynamisch erzeugte Webseiten erstellen kann! (Fragen Sie gegebenenfalls
Ihren Web-Provider nach <b>PHP-Unterstützung</b>!) </p>
<p>Jax Calendar ist in der Lage, die Daten in einfachen Textdateien, sowie in
einem MySQL-Datenbanksystem abzulegen, es <b> l&auml;uft auch ohne MySQL-Datenbank-Anbindung!
</b></p>
<p><br>
Verfügen Sie f&uuml;r Ihre Website bereits über PHP-Unterstützung, dann tun
Sie bitte folgendes:</p>
<ol>
<li> Laden Sie sich die aktuelle Version von Jax Calendar herunter <a href="http:/www.jtr.de/scripting/php/calendar/" target="_blank" class="urls">http:/www.jtr.de/scripting/php/calendar/</a>
! <br>
<br>
</li>
<li> Entpacken Sie das .zip-Archiv! (inklusive aller Unterverzeichnisse!)<br>
<br>
</li>
<li> Öffnen Sie die Datei <span class="file_name">calendar.settings.inc.php</span>
(im Verzeichnis calendar) mit einem Texteditor und passen Sie die Variablen
Ihren Bed&uuml;rfnissen an!<br>
<br>
Das Admin-Programm hei&szlig;t <b class="file_name">calendar.admin.php</b>
und befindet sich standardm&auml;&szlig;ig im Verzeichnis <span class="file_name">admin</span>
(relativ zum Pfad Ihres Kalendarskripts).<br>
<br>
Wenn Sie Jax Calendar also beispielsweise im Hauptverzeichnis Ihrer Website
unterbringen (/) finden Sie das Verwaltungsprogramm unter <span class="urls"><br>
<br>
http://www.ihredomain.de/calendar/admin/calendar.admin.php</span><br>
<br>
</li>
<li> Laden Sie alle Verzeichnisse und Dateien von Jax Calendar auf Ihre Website!<br>
<br>
Nachdem Sie das Skript auf Ihren Webspace hochgeladen haben, stellen Sie mit
Ihrem FTP-Client die <a href="#file_permissions">Zugriffsrechte</a> für die
.csv-Dateien (standardm&auml;&szlig;ig "<span class="file_name">mycalendar</span>"
und "<span class="file_name">myevents</span>") so ein, dass das Skript vollen
Schreibzugriff darauf hat! Sonst meldet Ihnen das Skript beim Start den Fehler
<i><b><span class="inputs_outputs">&quot;Warning: fopen(..): failed to open
stream: Permission denied&quot;</span></b></i><br>
<br>
</li>
<li>Wenn Sie alle Dateien hochgeladen haben, und die Zugriffsrechte korrekt
gesetzt haben, k&ouml;nnen Sie das Skript auf Ihrer Website verlinken. z.b.
<br>
<br>
<span class="urls">http://www.ihredomain.de/calendar/jax_calendar.php?language=French<br>
<br>
</span>Der Parameter <b class="inputs_outputs">language</b> ... gibt dem Skript
explizit vor, welche Sprache verwendet werden soll. (F&uuml;r diese muss nat&uuml;rlich
eine entsprechende Sprachvorlagedatei im Verzeichnis <span class="file_name">languages</span>
existieren, ansonsten wird automatisch die Sprache gew&auml;hlt, die &uuml;ber
das Konfigurationsprogramm eingestellt wurde!)<br>
<br>
<br>
</li>
<li><span class="sec_note">Wichtiger Hinweis zur Sicherheit:</span> <b><br>
</b>Jax Calendar besitzt keinen eigenen Passwort-Schutz! Stellen Sie also
bitte &uuml;ber das Konfigurationssystem Ihres Webspace sicher, dass niemand
ausser Ihnen Zugriff auf das Verzeichnis mit dem Administrationsskript (<span class="file_name">admin/calendar.admin.php</span>)
hat!<br>
<br>
</li>
</ol>
<h3>&nbsp;</h3>
<h3><a name="install_with_mysql"></a>Installation mit MySQL-Unterst&uuml;tzung</h3>
<p>Jax Calendar wurde so entworfen, dass es sowohl einfache Textdateien, als auch
MySQL-Datenbanktabellen zur Speicherung der Eintr&auml;ge verwenden kann. Der
Betrieb mit einem MySQL-Datenbanksystem ist bei gro&szlig;en Kalendarien mit
mehreren tausend Eintr&auml;gen in der Regel schneller als die CSV-Variante...</p>
<p>Verf&uuml;gen Sie &uuml;ber MySQL-Unterst&uuml;tzung dann tun Sie bitte folgendes:</p>
<ol>
<li>Installieren Sie Jax Calendar (wie bei &quot;<a href="#install_without_mysql">Installation
ohne MySQL</a>&quot;)...<br>
<br>
</li>
<li>Setzen Sie in der Datei <span class="file_name">calendar.settings.inc.php</span>
die Datenquelle auf MySQL und tragen Sie die Zugriffsdaten (Server, Datenbankname,
Benutzerkennung und Passwort) f&uuml;r Ihren MySQL-Server ein:<br>
<br>
<br>
<span class="source_view">$calendars[0]-&gt;data_source = &quot;mysql&quot;;</span><br>
<br>
<br>
</li>
<li>Starten Sie phpMyAdmin (oder ein Monitorprogramm f&uuml;r Ihren MySQL-Server)
und legen Sie die folgenden Tabellenstrukturen an:<br>
<pre class="inputs_outputs">CREATE TABLE mycalendar (<br> id int(11) NOT NULL auto_increment,<br> event_start varchar(30) default NULL,<br> event_end varchar(30) default NULL,<br> x24 int(11) NOT NULL default '0',<br> reminder_start varchar(30) default NULL,<br> reminder_end varchar(30) default NULL,<br> status varchar(30) NOT NULL default '',<br> event_title varchar(255) NOT NULL default '',<br> event_key varchar(32) NOT NULL default '',<br> PRIMARY KEY (id)<br>) TYPE=MyISAM;
 
CREATE TABLE myevents (<br> id int(11) NOT NULL auto_increment,<br> event_key varchar(32) NOT NULL default '',<br> event_description text NOT NULL,<br> PRIMARY KEY (id)<br>) TYPE=MyISAM;
</pre>
</li>
<li><span class="sec_note">Wichtiger Hinweis zur Sicherheit:</span> <b><br>
</b>Jax Calendar besitzt keinen eigenen Passwort-Schutz! Stellen Sie also
bitte &uuml;ber das Konfigurationssystem Ihres Webspace sicher, dass niemand
ausser Ihnen Zugriff auf das Verzeichnis mit dem Administrationsskript (<span class="file_name">admin/calendar.admin.php</span>)
hat!</li>
</ol>
<p>&nbsp;</p>
<h1>III. Anwendung</h1>
<p>&nbsp;</p>
<h3><a name="calendar_admin"></a>Umgang mit dem Kalendarverwaltungssystem</h3>
<p>Beim Anlegen von neuen Terminen <b>im Kalendar-Verwaltungssystem</b> wird zwischen
zwei verschiedenen Arten von Zeitr&auml;umen unterschieden:</p>
<p><b>1. Ereigniszeitraum</b></p>
<p>Der Ereigniszeitraum gibt an, von wann bis wann ein Ereignis stattfindet. Diese
Information ist nur Inhaltlich von Bedeutung, <b>beeinflusst den Zeitpunkt der
Anzeige der Termine nicht!</b></p>
<p>Wird bei einem Termin das H&auml;kchen bei &quot;<b>ganzt&auml;gig</b>&quot;
gesetzt, so wird f&uuml;r den Termin sp&auml;ter nur das Datum, ohne Uhrzeit
in der Eventliste des Kalendars angezeigt. Ist der Startzeitpunkt gleich dem
Endzeitpunkt, so wird nur der Startzeitpunkt angezeigt.</p>
<p><b>2. Erinnerungszeitraum</b></p>
<p>Der Erinnerungszeitraum gibt an, von wann bis wann der Termin in der Eventliste
angezeigt werden soll! Dieser d&uuml;rfte in der Mehrzahl der F&auml;lle identisch
mit dem Ereigniszeitraum sein. </p>
<p><b><i>Seit der v1.3 werden die Werte vom Ereigniszeitraum automatisch f&uuml;r
den Erinnerungszeitraum &uuml;bernommen. </i></b></p>
<p>&Auml;ndern Sie den Erinnerungszeitraum nur, wenn Sie genau wissen, wozu! Mit
diesem Wert k&ouml;nnen Sie die Anzeige eines Ereignisses auch &uuml;ber den
Ansichtszeitraum-Filter hinweg erzwingen. &Auml;nderungen an diesen Werten f&uuml;hren
damit evtl. dazu, dass das Ereignis angezeigt wird, obwohl es eigentlich nicht
in die Ansicht geh&ouml;rt. (z.B. kann ein Termin (in der Tages-&Uuml;bersicht)
an jedem Tag innerhalb des aktuellen Monats angezeigt werden, obwohl es nur
an einem Tag stattfindet)</p>
<p><b>Beispiel:</b></p>
<p>Sie m&ouml;chten einen Termin f&uuml;r die Internationale Gr&uuml;ne Woche,
die vom 17. bis 26. Januar 2003 in Berlin stattfindet in Ihren Kalendar eintragen,
und m&ouml;chten, dass dieser Termin mind. 3 Monate vor der Messe angezeigt
wird.</p>
<p>In diesem Fall tragen Sie als Ereigniszeitraum die Zeit vom 17.1.2003 -26.1.2003
ein, machen ein H&auml;kchen bei ganzt&auml;gig und tragen als Erinnerungszeitraum
die Zeit vom 17.10.2002-26.1.2003 ein...</p>
<p>&nbsp;</p>
<p>Das Feld <b>Status</b> ist im Moment &uuml;brigens noch nicht vollst&auml;ndig
implementiert. Bisher haben Sie die M&ouml;glichkeit dort Buchstabenk&uuml;rzel
einzugeben, um Ihre Termine zu kennzeichnen, bzw. hervorzuheben. F&uuml;r die
n&auml;chste Version ist die &quot;Best&uuml;ckung&quot; mit benutzerdefinierten
Icons geplant. Ihre bisherigen Buchstaben-Eintr&auml;ge werden dadurch nat&uuml;rlich
nicht beeinflusst.</p>
<p>&nbsp;</p>
<h3><a name="howtolink"></a>Anwendung / Einbindung des Skriptes</h3>
<p>Nachdem Sie den Kalendar wie in Kapitel II beschrieben installiert haben, k&ouml;nnen
Sie Ihre Webseiten mit dem Skript verlinken. Dabei haben Sie die M&ouml;glichkeit,
&uuml;ber die Parameter nach dem Fragezeichen Einfluss auf die Ausgaben des
Skript zu nehmen.</p>
<p class="urls">http://www.meinedomain.tld/calendar/jax_calendar.php?<b>Y</b>=2003&amp;<b>m</b>=4&amp;d=17&amp;<b>cal_id=</b>0&amp;<b>language</b>=english</p>
<p>&Uuml;ber die Parameter <b class="inputs_outputs">Y </b>und <b class="inputs_outputs">m
</b>k&ouml;nnen Sie festlegen f&uuml;r welches Jahr und f&uuml;r welchen Monat
der Kalendar angezeigt werden soll.</p>
<p><b class="inputs_outputs">cal_id</b> gibt den verwendeten Kalendar an (falls
Sie mehrere Kalendarien &uuml;ber das Skript verwalten -&gt; siehe <a href="#multiple_calendars">FAQ:
Verwaltung mehrerer Kalendarien</a>)</p>
<p><b><span class="inputs_outputs">language</span></b> gibt die Sprache an, in
der die Wochentage und Meldungen des Kalendars angezeigt werden sollen. Wichtig
ist, dass f&uuml;r die in der URL angegebene Sprache auch eine entsprechende
Sprachvorlage im Verzeichnis <span class="file_name">languages</span> existiert!
Andernfalls wird die Sprache gew&auml;hlt, die in <span class="file_name">calendar.settings.inc.php</span>
festgelegt wurde. </p>
<p>&nbsp;</p>
<p>&nbsp; </p>
<h1>IV. H&auml;ufig gestellte Fragen (FAQs)</h1>
<p>&nbsp;</p>
<h3><a name="include_modules"></a>Wie kann man das Kalender-Steuerelement direkt
in seine Homepage einbauen?</h3>
<p>Jax Calendar besteht aus zwei Modulen. Die Module <span class="file_name">calendar.inc.php</span>
und <span class="file_name">eventlist.inc.php</span> stellen jeweils die beiden
Steuerelemente f&uuml;r den Kalendar und die Eventliste bereit. Wie Sie die
Module am einfachsten einbinden, ist in der Datei <span class="file_name">jax_calendar.php</span>
anschaulich demonstriert. </p>
<p>Wenn Sie die Module von einer Datei, in einem anderen Verzeichnis als dem Standardverzeichnis
<span class="file_name"><b>calendar</b>/jax_calendar.php</span> aufrufen wollen,
m&uuml;ssen Sie mit dem HTML-Tag &lt;BASE href=&quot;www.yourdomain.tld/..../calendar&quot;&gt;
sicherstellen, dass die Stylesheets und JavaScriptdateien im richtigen Verzeichnis
gefunden werden!</p>
<p>Falls Sie die Module direkt in Ihre eigenen Webseiten einbinden m&ouml;chten,
vergessen Sie bitte nicht den Urheberrechtsvermerk, bzw. einen Link zur Download-Seite
von Jax Calendar mitzu&uuml;bernehmen!</p>
<p>&nbsp;</p>
<h3><a name="fonts_and_colors"></a>Wie kann man die Farben und Schriftarten anpassen?</h3>
<p>Daf&uuml;r stehen im Verzeichnis <span class="file_name">css</span> verschiedene
vordefinierte Stylesheets zur Verf&uuml;gung, die man nach Belieben mit einem
Texteditor ver&auml;ndern kann. </p>
<p>&nbsp;</p>
<h3><a name="faq_timespan"></a>Wie kann man den Anzeigezeitraum vorgeben?</h3>
<p>F&uuml;r den Anzeigezeitraum sind zurzeit 3 Ansichten vordefiniert. (Tag, Monats-,
Jahresansicht). Diese Ansichten werden &uuml;ber den GET-Parameter view gesteuert.</p>
<p><span class="inputs_outputs">http://../jax_calendar.php?cal_id=1&amp;<b>view=d1</b></span></p>
<p>Wenn Sie eine Ansicht (z.B. auf Jahresansicht) vordefinieren m&ouml;chten,
&auml;ndern Sie in der calendar.settings.inc.php folgende Zeile:</p>
<p class="source_view">$view_default = "m12";</p>
<p>&nbsp;</p>
<h3><a name="faq_separatewindow"></a>Wie &ouml;ffne ich die Eventliste in einem
eigenen Fenster?</h3>
<p>Wenn Sie die Eventliste in einem Fenster, getrennt vom Calendar-Steuerelement
&ouml;ffnen m&ouml;chten, tun sie folgendes:</p>
<p>1. Bereiten Sie eine php-Datei vor (z.B. <span class="file_name">myeventlist.php</span>)
die NUR die Datei <span class="file_name">eventlist.inc.php </span>einbindet.</p>
<p>2. &Auml;ndern Sie die folgenden Zeilen in <span class="file_name">calendar.settings.inc.php</span>:</p>
<p class="source_view">$calendar_open_url = "http://.../myeventlist.php";<br>
$calendar_open_target = "_blank";</p>
<p>&nbsp;</p>
<h3><a name="multiple_calendars"></a>Wie kann man mehrere Kalendare gleichzeitig
betreiben?</h3>
<p>M&ouml;chten Sie dem Skript mehr als einen Kalendar betreiben, k&ouml;nnen
Sie den entsprechenden Kalendar mit dem Parameter <span class="inputs_outputs">cal_id</span>
ausw&auml;hlen. z.B:</p>
<blockquote>
<p class="urls">http://../jax_calendar.php<b>?cal_id=1</b></p>
</blockquote>
<p>Aus Sicherheitsgr&uuml;nden kann der Dateiname des Kalendars nicht direkt mit
der URL weitergegeben werden. Die Zuordnung zwischen Kalender-ID und Kalendername
m&uuml;ssen Sie zur Zeit noch von Hand in der Datei <b class="file_name">calendar.settings.inc.php</b>
vornehmen.</p>
<div class="source_view">
<p>...</p>
<p>// Title and Data Source<br>
$calendars[0]-&gt;title = &quot;Jax Calendar&quot;;<br>
$calendars[0]-&gt;data_source = &quot;csvfile&quot;;</p>
<p>$calendars[1]-&gt;title = &quot;Ein zweiter Kalendar&quot;;<br>
$calendars[1]-&gt;data_source = &quot;mysql&quot;;</p>
<p>$calendars[0]-&gt;css = &quot;styles/default.css&quot;;<br>
$calendars[1]-&gt;css = &quot;styles/ice.css&quot;;</p>
<p>$calendars[0]-&gt;calendar_file = &quot;mycalendar&quot;;<br>
$calendars[0]-&gt;event_file = &quot;myevents&quot;;</p>
<p>$calendars[1]-&gt;calendar_file = &quot;mycalendar&quot;;<br>
$calendars[1]-&gt;event_file = &quot;myevents&quot;;</p>
<p>...</p>
</div>
<p>Im Beispiel wird ein weiterer Kalendar mit dem selben Skript benutzt:</p>
<p>Ein Kalendar auf Basis der MySQL-Tabelle <span class="file_name">secondbook</span>
ist &uuml;ber die URL</p>
<blockquote>
<p><span class="urls">http://../jax_calendar.php?<b>calendar_id=1</b></span><b>
</b></p>
</blockquote>
<p>erreichbar &Auml;quivalent wird mit der URL</p>
<blockquote>
<p><span class="urls">http://../jax_calendar.php?<b>calendar_id=2</b></span>
</p>
</blockquote>
<p>eine dritte Kalendardatei zur Speicherung verwendet, usw...</p>
<p>Sie k&ouml;nnen f&uuml;r jeden einzelnen Kalendar die Datenquelle (<span class="inputs_outputs">mysql</span>/<span class="inputs_outputs">csvfile</span>)
frei w&auml;hlen!</p>
<p>&nbsp;</p>
<h3><a name="file_permissions"></a>Wie &auml;ndert man die Datei-Zugriffsrechte
auf dem Webserver?</h3>
<p>Wenn Ihr Webserver unter Unix arbeitet (Apache) m&uuml;ssen Sie den Unix-Befehl
<b class="inputs_outputs">chmod</b> zum &Auml;ndern der Dateirechte verwenden.
(Wie Sie das bequem von Ihrem FTP-Client aus machen k&ouml;nnen, ist weiter
unten beschrieben) </p>
<p>Die Syntax von <span class="inputs_outputs">chmod</span> lautet:<br>
<br>
<b><span class="inputs_outputs">chmod</span></b> <span class="file_name"><font color="#FF0000">rwx</font><font color="#0000FF">rwx</font><font color="#006600">rwx</font>
filename </span><br>
<br>
r = lesen<br>
w = schreiben<br>
x = ausf&uuml;hren<br>
<br>
Der Befehl erwartet drei 3er-Tupel welche die Zugriffsrechte f&uuml;r die &quot;Gruppen&quot;
angeben: [rwx][rwx][rwx]<br>
<br>
Die Gruppen von rechts nach links:<br>
<br>
Alle Benutzer<br>
Alle Benutzer der gleichen Gruppe wie Besitzer<br>
Nur der Besitzer<br>
<br>
Die Tupel kann man sich auch in Bin&auml;rdarstellung vorstellen:<br>
<br>
<span class="inputs_outputs">chmod [rwx][rwx][rwx]</span><br>
<br>
w&auml;re &auml;quivalent mit<br>
<br>
<span class="inputs_outputs">chmod [111][111][111]</span><br>
<br>
bzw. in dezimalschreibweise mit<br>
<br>
<span class="inputs_outputs">chmod [7][7][7]</span><br>
<br>
und da haben wir auch schon den fertigen <span class="inputs_outputs">chmod</span>
Befehl um &quot;allen&quot; Zugriff auf die Dateien zu geben:<br>
<br>
<span class="inputs_outputs">chmod 777 </span><span class="file_name">calendar<font face="Courier New, Courier, mono">.csv</font></span><font face="Courier New, Courier, mono"><br>
</font><br>
(Die ben&ouml;tigten Dateirechte h&auml;ngen von der Webserver-Konfiguration
ab. Wenn Sie misstrauisch sind, und dem Skript nicht die vollen Rechte (777)
geben wollen, erh&ouml;hen Sie die Rechte langsam, bis das Skript fehlerfrei
l&auml;uft!)<br>
<br>
Die meisten FTP-Clients, wie z.B. <b><a href="http://www.wsftp.com/downloads/index.html" target="_blank">WS-FTP</a></b>
unterst&uuml;zen den <span class="inputs_outputs">chmod</span>-Befehl bequem
von der Oberfl&auml;che aus. Man muss bei <b>WS-FTP</b> z.B. nur mit der rechten
Maustaste auf eine Datei im Ftp-Fenster klicken, dann auf chmod, dann die zu
setzenden Attribute usw...<br>
</p>
<p>&nbsp;</p>
<h3><a name="max_entries"></a>Wie viele Einträge kann Jax Calendar speichern?</h3>
<p>Zur Zeit teste ich das Skript auf einer meiner Websiten mit ca. 200 Terminen
im CSV-Format. Theoretisch müsste das Skript in Abh&auml;ngigkeit von der verfügbaren
Rechenzeit/-leistung ihres Webservers und der Datenquelle problemlos mehrere
1000 Einträge verwalten können. F&uuml;r gr&ouml;&szlig;ere Kalendare bietet
sich die Verwendung von MySQL als Datenquelle an... </p>
<p>&nbsp;</p>
<h3><a name="updates"></a>Wo erhalte ich Informationen &uuml;ber Updates und &Auml;nderungen?</h3>
<ol>
<li> Auf der Website (<a href="http://www.jtr.de/scripting/php/calendar" target="_blank" class="urls">http://www.jtr.de/scripting/php/calendar</a>)
nat&uuml;rlich! ;-)<br>
<br>
</li>
<li>Im Admin-Skript gibt es einen Link &quot;Auf Updates &uuml;berpr&uuml;fen&quot;.
Links neben dem Link ist ein kleiner gr&uuml;ner Punkt. Blinkt dieser gr&uuml;n-gelb,
gibt es ein neues Update. Blinkt dieser rot-gelb, gibt es ein sicherheitsrelevantes
Update, dessen Installation wichtig ist! <br>
<br>
</li>
<li>Tragen Sie sich in den &quot;JtR News&quot;-Newsletter ein! (<a href="http://www.jtr.de/scripting/php/newsletter/newsletter" target="_blank" class="urls">http://www.jtr.de/scripting/php/newsletter/newsletter</a><br>
<br>
</li>
<li>
<p>Nutzen Sie das Forum f&uuml;r Jax Calendar:<br>
unter http://boards.jtr.de habe ich ein kleines deutschsprachiges phpBB-Forum
aufgesetzt, in dem Sie Fragen oder Erkenntnisse mit andern Anwendern teilen
k&ouml;nnen. </p>
</li>
</ol>
<p>&nbsp;</p>
<h1>V. Bekannte Fehler und Probleme</h1>
<p>&nbsp;</p>
<h3><a name="bugs_mysql"></a>Probleme mit MySQL</h3>
<p>Jax Calendar <b>speichert nur einen Eintrag</b>, bzw. zeigt immer den gleichen
Eintrag an!<br>
<br>
Sie haben wahrscheinlich nicht die Beispieltabellen (im admin-Verzeichnis) verwendet,
und vergessen das Feld &quot;<span class="inputs_outputs"><b>id</b></span>&quot;
(Pflichtfeld!!) anzulegen</p>
<h3>&nbsp;</h3>
<h1>VI. Liste der &Auml;nderungen (Change Log)</h1>
<p>&nbsp;</p>
<h3><a name="changelog_v131"></a>&Auml;nderungen in Version 1.31: </h3>
<ul>
<li>
<p>Bugfix: verschobener Wochentag im Kalendermodul</p>
</li>
</ul>
<h3><a name="changelog_v130"></a>&Auml;nderungen in Version 1.3: </h3>
<ul>
<li> <b>Resturukturierung der Verzeichnisse<br>
</b>Konfigurationsdatei ist jetzt <span class="file_name">settings/calendar.settings.inc.php</span>
</li>
<li><b>Verbessertes Kalendar-Control</b><br>
Schalter f&uuml;r vorhergehendes + n&auml;chstes Jahr<br>
Schnallauswahl f&uuml;r vorhergehende und n&auml;chste Monate/Jahre<br>
</li>
<li><b>Einbindung von Mishoos DHTML Calendar</b> im Adminsystem</li>
<li> <b>Icon f&uuml;r das Statusfeld</b><br>
</li>
<li><b> W&auml;hlbare Ansichten<br>
</b>Jahres-, Monats-, Tages&uuml;bersicht<br>
</li>
</ul>
<h3><a name="changelog_v127"></a>&Auml;nderungen in Version 1.27: </h3>
<ul>
<li><b>Bugfix: Fehler im Kalendarmodul</b><br>
(Auf einigen Systemen wurde der falsche Wochentag angezeigt) </li>
</ul>
<h3><a name="changelog_v126"></a>&Auml;nderungen in Version 1.26: </h3>
<ul>
<li><b>Bugfix: Abwechselnde Zeilenfarbe</b><br>
(Der Farbwechsel mehrerer aufeinanderfolgender Zeilen in der Eventliste war
fehlerhaft) </li>
<li><b>Bugfix: Eventkey jetzt &quot;zuf&auml;llig&quot;</b><br>
(Der Eventkey wurde vorher aus der Zeit generiert, so dass Eintr&auml;ge mit
den gleichen Zeiten evtl. dieselbe Beschreibung erhielten...)</li>
<li>neues Modul (<span class="file_name">nextevent.inc.php</span>) f&uuml;r
die Navigation zum &quot;N&auml;chsten Termin&quot;</li>
</ul>
<h3><a name="changelog_v125"></a>&Auml;nderungen in Version 1.25: </h3>
<ul>
<li><b>Bugfix: Termindarstellung in Eventliste</b><br>
(kurze Termine innerhalb eines Tages wurden in der Eventliste nicht angezeigt,
falls die Erinnerungs-Urzeit bereits &uuml;berschritten war)</li>
</ul>
<h3><a name="changelog_v120"></a>&Auml;nderungen in Version 1.2: </h3>
<ul>
<li>komplette <b>&Uuml;berarbeitung der Stylesheets</b></li>
<li><b>Trennung in einzelne Module</b> (<span class="file_name">main.inc.php</span>,
<span class="file_name">calendar.inc.php</span>, <span class="file_name">eventlist.inc.php</span>)</li>
<li> <b>Bugfix im MySQL-Modul</b> (<span class="file_name"><b>mysql.inc.php</b></span>)</li>
<li><b>&Uuml;berarbeitung des Administrationssystems</b></li>
</ul>
<p>&nbsp;</p>
<hr size="1" noshade>
<p>Sollten Sie Fehler finden, oder haben Sie Fragen oder Verbesserungsvorschläge,
zögern Sie bitte nicht, und wenden Sie sich einfach direkt an mich! </p>
<p><img src="contact_addy.gif" width="199" height="30"></p>
<p><span class="sec_note">RTFM !!! :</span><br>
Leider habe ich keine Zeit kostenlosen Installationssupport f&uuml;r dieses
Programm zu leisten! Wenn Sie ein Problem haben dessen L&ouml;sung durch diese
Dokumentation beschrieben oder ausreichend angedeutet wird, sehe ich mich aus
Zeitgr&uuml;nden gezwungen, Ihre e-mail-Anfrage komplett zu ignorieren... </p>
<p>Bitte sparen Sie mir und sich die Zeit und lesen Sie sich vor dem Kontakt unbedingt
die Dokumentation vollst&auml;ndig durch! Hinweise auf fehlende Erkl&auml;rungen
in dieser Dokumentation nehme ich jedoch gern entgegen...</p>
<hr size="1" noshade>
<p align="right">Berlin, 09.04.2004 - Jack (tR) </p>
</body>
</html>
/kalender/manuals/mysql_scheme.sql
0,0 → 1,57
# phpMyAdmin MySQL-Dump
# version 2.2.3
# http://phpwizard.net/phpMyAdmin/
# http://phpmyadmin.sourceforge.net/ (download page)
#
# Host: localhost
# Erstellungszeit: 06. März 2003 um 15:00
# Server Version: 3.23.53
# PHP Version: 4.2.3
# Datenbank : `test`
# --------------------------------------------------------
 
#
# Tabellenstruktur für Tabelle `mycalendar`
#
 
CREATE TABLE mycalendar (
id int(11) NOT NULL auto_increment,
event_start varchar(30) default NULL,
event_end varchar(30) default NULL,
x24 int(11) NOT NULL default '0',
reminder_start varchar(30) default NULL,
reminder_end varchar(30) default NULL,
status varchar(30) NOT NULL default '',
event_title varchar(255) NOT NULL default '',
event_key varchar(32) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
 
#
# Daten für Tabelle `mycalendar`
#
 
INSERT INTO mycalendar VALUES (1, '1030374000', '1030374000', 1, '1030287600', '1030478400', '', 'Erster Termin', 'aa97dac91b3de18651cd5f60a88fb673');
INSERT INTO mycalendar VALUES (2, '1030838400', '1062374400', 0, '1030838400', '1062374400', '', 'Beispiel-Frist', '77522e4abecc1b0cc66a5db279c922a8');
INSERT INTO mycalendar VALUES (3, '1045513740', '1045513740', 1, '1045440000', '1045526340', '', 'Testtermin für den 17. Februar', '6498acc895742811c89be66409760205');
# --------------------------------------------------------
 
#
# Tabellenstruktur für Tabelle `myevents`
#
 
CREATE TABLE myevents (
id int(11) NOT NULL auto_increment,
event_key varchar(32) NOT NULL default '',
event_description text NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
 
#
# Daten für Tabelle `myevents`
#
 
INSERT INTO myevents VALUES (1, '77522e4abecc1b0cc66a5db279c922a8', 'Dies ist ein Beispiel für eine <STRONG>Frist</STRONG> von einem Jahr! (<FONT color=#ff0000>09-2002...09-2003</FONT>)<BR>');
INSERT INTO myevents VALUES (2, '6498acc895742811c89be66409760205', 'Dies ist ein <FONT size=4><STRONG>Testtermin</STRONG></FONT>, der am 17. Februar angezeigt werden soll!');
INSERT INTO myevents VALUES (3, 'aa97dac91b3de18651cd5f60a88fb673', 'Dies ist der erste Termin überhaupt, der mit Jax Calendar angelegt wurde... (und hier nur aus historischen Gründen beibehalten wurde! ;-)');
 
/kalender/manuals/readme.html
0,0 → 1,824
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Jax Calendar v1.31 - Manual</title>
<meta name="keywords" content="Jax Calendar, Online Calendar, PHP Calendar, Documentation, Manual, Installation Manual">
<meta name="description" content="On this page you find all important information about Installation und Application of Jax Calendar.">
<meta name="author" content="Andreas John aka Jack (tR)">
<meta name="DC.Title" content="User Manual for Jax Calendar v1.31">
<meta name="DC.Creator" content="Andreas John aka Jack (tR)">
<meta name="DC.Subject" content="User Manual">
<meta name="DC.Description" content="On this page you find all important information about Installation und Application of Jax Calendar.">
<meta name="DC.Publisher" content="Andreas John">
<meta name="DC.Contributor" content="Andreas John">
<meta name="DC.Date" content="2004-04-09">
<meta name="DC.Type" content="Text">
<meta name="DC.Format" content="text/html">
<meta name="DC.Identifier" content="http://www.jtr.de/scripting/php/calendar">
<meta name="DC.Source" content="User Manual">
<meta name="DC.Language" content="uk">
<meta name="DC.Relation" content="source">
<meta name="DC.Coverage" content="Berlin">
<meta name="DC.Rights" content="All rights reserved.">
<style type="text/css">
<!--
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
margin: 10%;
}
 
.title {
font-family: "Arial Black", Arial, Helvetica, sans-serif;
font-size: 200%;
font-weight: bolder;
text-align: center
}
 
.prog_info {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
padding: 5%;
border : 2px solid #000000;
background-color : #FDFAF4;
}
 
.index {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
padding: 5%;
border : 1pt dashed #000000;
background-color : #E3EEFD;
}
 
.index A {
text-decoration: none;
}
 
.index A:hover {
text-decoration: underline;
}
 
 
.source_view {
font-family: "Courier New", Courier, mono;
font-size: 80%;
text-align: left;
padding: 3%;
border : 1pt dashed #000000;
background-color : #EEEEEE;
}
 
h1, h2, h3, h4, h5, h6 {
font-family: Arial, Helvetica, sans-serif;
font-weight: bolder;
}
 
h1, h2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 180%;
}
 
h3, h4 {
font-size: 120%;
}
 
h5, h6 {
font-size: 120%;
}
 
 
.index h3 {
 
text-align: left
}
 
.index .sub {
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
font-weight: bolder;
text-align: left;
margin-left: 5%;
}
 
.inputs_outputs, .file_name {
font-size: 100%;
font-family: "Courier New", Courier, mono;
}
 
.urls {
font-size: 100%;
font-family: "Courier New", Courier, mono;
}
 
.sec_note {
font-weight: bolder;
color: red;
}
.file_name { color: #3399CC }
 
-->
</style>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p class="title">Jax Calendar v1.3<br>
Manual</p>
<p>&nbsp;</p>
<div class="index">
<h3>O. General Information</h3>
<div class="sub">
<p><a href="#program_and_author">Program and Author</a><br>
<a href="#credits">Credits</a></p>
</div>
<h3>I. Introduction</h3>
<div class="sub">
<p><a href="#about">What's Jax Calendar? - What do I need it for?<br>
</a><a href="#features">Features</a><br>
<a href="#requirements">System requirements</a><br>
<a href="#license">License</a></p>
</div>
<h3>II. Installation</h3>
<div class="sub">
<p><a href="#install_without_mysql">without mySQL support<br>
</a><a href="#install_with_mysql">with mySQL support</a></p>
</div>
<h3>III. Application</h3>
<div class="sub">
<p><a href="#calendar_admin">Using the calendar admin system<br>
</a><a href="#howtolink">How to link the script (parameters)</a></p>
</div>
<h3>IV. Frequently Asked Questions (FAQs)</h3>
<div class="sub">
<p><a href="#include_modules">How to include the calendar control directly
to my website?</a><br>
<a href="#fonts_and_colors">How to change the colors and fonts?</a><br>
<a href="#faq_timespan">How to set time span of eventlist view?<br>
</a><a href="#faq_separatewindow">How to open eventlist in a separate window?</a><br>
<a href="#multiple_calendars">How to use multiple calendars?<br>
</a><a href="#file_permissions">How to change file access permissions on
the webserver?<br>
</a><a href="#max_entries">How many entries Jax Calendar can handle?<br>
</a><a href="#updates">Where to get informations about Updates and Changes</a></p>
</div>
<h3>V. Known Bugs and Problems (Troubleshooting)</h3>
<div class="sub">
<p><a href="#bugs_mysql">Problems with MySQL<br>
</a></p>
</div>
<h3>VI. List of Changes (ChangeLog)</h3>
<div class="sub">
<p><a href="#changelog_v130">v1.3</a> ,<a href="#changelog_v127">v1.27</a>
,<a href="#changelog_v126">v1.26</a> ,<a href="#changelog_v125">v1.25</a>,
<a href="#changelog_v120">v1.2</a></p>
</div>
</div>
<h3>&nbsp;</h3>
<h1>O. General Information</h1>
<p>&nbsp;</p>
<h3><a name="program_and_author"></a>Program and Author</h3>
<div class="prog_info">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Projekt:</td>
<td>&nbsp;</td>
<td>Jax Calendar (Online Event Calendar) </td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Version: </td>
<td>&nbsp;</td>
<td>1.31</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Interpreter:</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>PHP 4.3+</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Code:</td>
<td>&nbsp;</td>
<td>Andreas John</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Design:</td>
<td>&nbsp;</td>
<td>Andreas John</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Homepage:</td>
<td>&nbsp;</td>
<td><a href="http://www.jtr.de/scripting/php/calendar" target="_blank" class="urls">www.jtr.de/scripting/php/calendar/</a></td>
</tr>
<tr>
<td valign="top">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td valign="top">Lizenz:</td>
<td>&nbsp;</td>
<td>
<p>Copyright (C) 2002-2004, Andreas John [ Jack (tR) ]</p>
<p>This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version. A copy of this license you can find
in the added text file gpl.txt or on the website of the Free Software
Foundation under: <a href="http://www.fsf.org/copyleft/gpl.html" target="_blank" class="urls">http://www.fsf.org/copyleft/gpl.html</a><br>
</p>
<p>Please note, that I can give NO WARRANTY FOR DAMAGES CAUSED BY DIRECT
OR INDIRECT USE OF THE PROGRAM...</p>
</td>
</tr>
</table>
</div>
<p>&nbsp;</p>
<h3><a name="credits"></a>Credits</h3>
<p> I want to say a very big Thank You to all people who support this and many
other Open Source projects by their hints, translations, affectionate adaptions
and links on their websites...</p>
<p>My personal credits go to:</p>
<table border="0" width="100%">
<tr>
<td>
<p> Bela-Andreas Bargel <a href="http://www.fuldas-tauchertreff.de" target="_blank" class="urls">
<br>
</a></p>
</td>
<td><a href="http://www.fuldas-tauchertreff.de" target="_blank" class="urls">http://www.fuldas-tauchertreff.de</a></td>
</tr>
<tr>
<td>Carmine Santoro <a href="http://www.webdomus.net" target="_blank" class="urls">
</a><br>
</td>
<td><a href="http://www.webdomus.net" target="_blank" class="urls">http://www.webdomus.net</a></td>
</tr>
<tr>
<td>Daniele MORO</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Eduardo H. Sabbi <a href="http://www.drgate.com.br/" target="_blank" class="urls"><br>
</a></td>
<td><a href="http://www.drgate.com.br/" target="_blank" class="urls">http://www.drgate.com.br/</a></td>
</tr>
<tr>
<td>Gerard Farr&agrave;s Ballabriga </td>
<td><a href="http://www.ctfc.es" target="_blank" class="urls">http://www.ctfc.es</a></td>
</tr>
<tr>
<td>Guttorm Hveem</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Helge Larsen</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Jan Br&uuml;nig</td>
<td class="urls"><a href="http://www.stb-vs-devils.de" target="_blank">http://www.stb-vs-devils.de</a></td>
</tr>
<tr>
<td>Jan van Thiel</td>
<td><a href="http://www.taveres.nl" target="_blank" class="urls">http://www.taveres.nl</a></td>
</tr>
<tr>
<td>Jarno Ristaniemi </td>
<td><a href="http://www.vihrealiitto.fi/lappi" class="urls">http://www.vihrealiitto.fi/lappi</a></td>
</tr>
<tr>
<td>Klaus-Peter Lexow</td>
<td><a href="http://www.hell-is-open.de" target="_blank" class="urls">http://www.hell-is-open.de</a>
</td>
</tr>
<tr>
<td>Marc Gavage</td>
<td><a href="http://portix.be" target="_blank" class="urls">http://portix.be</a></td>
</tr>
<tr>
<td>Martin Sondermann </td>
<td><a href="http://www.kunstphotografie.de" target="_blank" class="urls">http://www.kunstphotografie.de</a></td>
</tr>
<tr>
<td>Mitsuhiro Yoshida</td>
<td><a href="http://mitstek.com/" target="_blank" class="urls">http://mitstek.com/</a></td>
</tr>
<tr>
<td>Nikityuk Victor</td>
<td><a href="http://nikvic.mlcorp.ru" target="_blank" class="urls">http://nikvic.mlcorp.ru</a></td>
</tr>
<tr>
<td>Pawel Wagner </td>
<td><a href="http://www.gry.skokinarciarskie.com" target="_blank" class="urls">http://www.gry.skokinarciarskie.com</a></td>
</tr>
<tr>
<td>Peter Dauth</td>
<td><a href="http://www.action-sport.de" target="_blank" class="urls">http://www.action-sport.de</a></td>
</tr>
<tr>
<td>Roberto Lizana Ramirez (TreYDo)<br>
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Roger Simestad </td>
<td><a href="http://www.rsweben.net" target="_blank" class="urls">http://www.rsweben.net</a></td>
</tr>
<tr>
<td>Sigrid Henning-Bellwinkel </td>
<td><a href="http://bellwinkel.de" target="_blank" class="urls">http://bellwinkel.de</a></td>
</tr>
<tr>
<td>Wojciech Dorosz</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>InteractiveTools.com (Developers of <a href="http://www.interactivetools.com/products/htmlarea/index.html" target="_blank" class="urls">HTMLarea</a>)</td>
<td><a href="http://www.interactivetools.com" class="urls">http://www.interactivetools.com/</a></td>
</tr>
<tr>
<td>Mihai Bazon (Developer of the DHTML Calendar)</td>
<td><a href="http://students.infoiasi.ro/%7Emishoo/" target="_blank" class="urls">http://students.infoiasi.ro/~mishoo/</a></td>
</tr>
</table>
<p>&nbsp;</p>
<h1>I. Introduction</h1>
<p>&nbsp;</p>
<h3><a name="about"></a>What is Jax Calendar? - What do I need it for?</h3>
<p>Jax Calendar is an online event calendar system. You can easily add it to your
homepage - without any programming skills. </p>
<p>An online event calendar enables you to add dates and events to your homepage.
Dependent on current date your visitors get a special summary of current/next
events.</p>
<p>&nbsp;</p>
<h3><a name="features"></a>Features</h3>
<p>Jax Calendar comes along with typical features of an online calendar. Additionally
it brings some special features. Particularly worth mentioning is the very flexible
support of <b>multiple data sources</b>. This makes it possible to use the calendar
system both - with a simple text file and a mySQL database system.</p>
<p>Following you find a summary of all important features of Jax Calendar:</p>
<ul>
<li> <b>support for multiple data sources</b> (currently MySQL and CSV text
files)<br>
<br>
</li>
<li>ability to run <b>multiple calendars </b>using the same script<br>
<br>
</li>
<li>modern &quot;Look &amp; Feel&quot;<br>
<b>fonts and colors are adaptable individually via Cascading Style Sheets
(CSS)</b><br>
<br>
</li>
<li> <b>support for multiple languages</b><br>
(templates for German, Danish, Dutch, English, French, Finnish, Japanese,
Polish, Spanish)<br>
<br>
</li>
<li><b>Different Views</b><br>
(Year / Month / Day overview)<br>
<br>
</li>
<li>modular design (You can include the calendar control and event list separately)
<br>
<br>
</li>
<li><b>convenient administration system</b><br>
<br>
</li>
<li> <b>detailed manual</b><br>
<br>
</li>
<li>optical <b>update reminder</b> (build into administration system)<br>
<br>
</li>
<li><b>free! </b> (GPL)</li>
</ul>
<p>&nbsp;</p>
<h3><a name="requirements"></a>System Requirements</h3>
<p>Jax Calendar was written in PHP 4, a server-side programming language that
produces dynamical generated web pages! (If unsure, ask your web space provider
for <b>PHP support</b>!) </p>
<p>Jax Calendar is able to save data into both, simple text files and into a mySQL-data
base system - that means Jax Calendar <b>also works without mySQL-database-connection!
</b></p>
<p>&nbsp;</p>
<h3><a name="license"></a>License</h3>
<p>Jax Calendar and its components are published under the conditions of the GPL
- <b>General Public License in der <nobr>Version 2</nobr> or later!</b> The
complete license text you find in the file <span class="file_name">gpl.txt</span>
(part of the packet), respectively on the website of Free Software Foundation
under <a href="http://www.fsf.org/copyleft/gpl.html" target="_blank" class="urls">http://www.fsf.org/copyleft/gpl.html</a></p>
<p>This license allows you to use and copy this software freely and to develop
improvements. Furthermore you are bound not to touch the copyright notes resp.
to set a link to the original script (<a href="http://www.jtr.de/scripting/php/calendar" target="_blank" class="urls">http://www.jtr.de/scripting/php/calendar</a>)!</p>
<p>Jax Calendar contains the module <a href="http://www.interactivetools.com/products/htmlarea/index.html" target="_blank" class="urls">htmlArea</a>
which is published under a BSD-like license. (consider that separately!)</p>
<p>&nbsp;</p>
<h1>II. Installation</h1>
<p>&nbsp;</p>
<h3><a name="install_without_mysql"></a>Installation without mySQL support</h3>
<p>Jax Calendar was written in PHP 4, a server-side programming language that
produces dynamical generated web pages! (If unsure, ask your web space provider
for <b>PHP support</b>!) </p>
<p>Jax Calendar is able to save data into both simple text files (csv files) and
into a mySQL-data base system - that means Jax Calendar <b>also works without
mySQL-database-connection! </b></p>
<p><br>
If you already have PHP support please do the following:</p>
<ol>
<li> Download latest version of Jax Calendar from<br>
<a href="http:/www.jtr.de/scripting/php/calendar/" target="_blank" class="urls">http:/www.jtr.de/scripting/php/calendar/</a>
! <br>
<br>
</li>
<li> Unpack the .zip-archive! (including all sub directories!)<br>
<br>
</li>
<li> Open file <span class="file_name">calendar.settings.inc.php</span> (in
directory <span class="file_name">calendar</span>) using a texteditor. Fit
the configuration variables to your needs!<br>
<br>
The administration program <b class="file_name">calendar.admin.php</b> is
in directory <span class="file_name">admin</span> (relatively to the path
of your calendar script)<br>
<br>
For example: if you put Jax Calendar in the main directory of your website
(/) you can access the admin script calling<br>
<br>
<span class="urls">http://www.yourdomain.tld/calendar/admin/calendar.admin.php</span><br>
<br>
</li>
<li>Upload all directories and files of Jax Calendar onto your website!<br>
<br>
After uploading the script to your webspace make sure by <a href="file_permissions">setting
file access permissions</a> that the script has full write access to the to
the .csv-files (<span class="file_name">mycalendar</span> and <span class="file_name">myevents</span>)
otherwise the script produces errors like <i><b><span class="inputs_outputs">&quot;Warning:
fopen(..): failed to open stream: Permission denied&quot;</span></b></i><br>
<br>
</li>
<li>If you have uploaded script and set write permissions you can link it onto
your website, e.g.:<br>
<br>
<span class="urls">http://www.ihredomain.de/calendar/jax_calendar.php?language=French<br>
</span><span class="inputs_outputs"><br>
</span> The parameter <b class="inputs_outputs">language</b> ... tells the
script which language to use. (this of course implies that there is a language
template in <span class="file_name">languages</span> directory, otherwise
the default language set in <span class="file_name">calendar.settings.inc.php</span>
will be choosed!)<br>
<br>
</li>
<li><span class="sec_note">Important Security Note:</span> <b><br>
</b>Jax Calendar has no active password protection! So you have to make sure
that nobody but you has access to the admin scripts (<span class="file_name">admin/calendar.admin.php</span>)
directory. This you usually do by setting directory protection using your
webspace configuration frontend!<br>
<br>
</li>
</ol>
<h3>&nbsp;</h3>
<h3><a name="install_with_mysql"></a>Installation with mySQL support</h3>
<p>Jax Calendar was designed to be able to save data to both - simple text files
and mySQL database tables. Running a big calendar with many thousands of entries
mySQL is expected to give you a better performance...</p>
<p>If you have mySQL support please do the following:</p>
<ol>
<li>Install Jax Calendar (see &quot;<a href="#install_without_mysql">Installation
without mySQL</a>&quot;)...<br>
<br>
</li>
<li>Set data source to &quot;mySQL database&quot; and define the database login
information (server, database name, user id and password)!<br>
<br>
<br>
<span class="source_view">$calendars[0]-&gt;data_source = &quot;mysql&quot;;</span><br>
<br>
<br>
</li>
<li>Start phpMyAdmin (or your favourite mySQL monitor tool) and create the following
table structures:<br>
<pre class="inputs_outputs">CREATE TABLE mycalendar (<br> id int(11) NOT NULL auto_increment,<br> event_start varchar(30) default NULL,<br> event_end varchar(30) default NULL,<br> x24 int(11) NOT NULL default '0',<br> reminder_start varchar(30) default NULL,<br> reminder_end varchar(30) default NULL,<br> status varchar(30) NOT NULL default '',<br> event_title varchar(255) NOT NULL default '',<br> event_key varchar(32) NOT NULL default '',<br> PRIMARY KEY (id)<br>) TYPE=MyISAM;
 
CREATE TABLE myevents (<br> id int(11) NOT NULL auto_increment,<br> event_key varchar(32) NOT NULL default '',<br> event_description text NOT NULL,<br> PRIMARY KEY (id)<br>) TYPE=MyISAM;
</pre>
</li>
<li><span class="sec_note">Important Security Note:</span> <b><br>
</b>Jax Calendar has no active password protection! So you have to make sure
that nobody but you has access to the admin scripts (<span class="file_name">admin/calendar.admin.php</span>)
directory. This you usually do by setting directory protection using your
webspace configuration frontend!</li>
</ol>
<p>&nbsp;</p>
<h1>III. Application</h1>
<p>&nbsp;</p>
<h3><a name="calendar_admin"></a>Using the calendar admin system</h3>
<p>Creating new Dates <b>in calendar admin system</b> you have to distinguish
two seperate time spans:</p>
<p><b>1. Event Time</b></p>
<p>The event time spans time from when to when a event will happen. This information
is only of relevant for the visitors, but <b>it does not influence the time
when the event is displayed in calendar!</b></p>
<p>If you set click on &quot;whole day&quot;, later in event list the calendar
only shows the date (without time) of the event. If event time start and event
time end are equal the calendar only shows the start time.</p>
<p><b>2. Reminder Time</b></p>
<p>The reminder time spans time from when to when an event will be displayed in
calendar! This most often is equal with event time. </p>
<p><b><i>Since v1.3 all values of event time span are copied automatically to
reminder time. </i></b></p>
<p>Please change reminder time only, if you know excactly why! You can change
this values to force the view of an event instead of the filter for calendar
view. Changes to this values can show an event even if it does not fit to the
filter view (e.g. show it every day of a month in &quot;day view&quot; even
if it is only a one 1-day event)</p>
<p><b>Expample:</b></p>
<p>If you want to enter the date for the event &quot;Internationale Gr&uuml;ne
Woche&quot;, from 17 to 26 January 2003 in Berlin. If you want the event announced
at least 3 month before type in event time 17.1.2003 to 26.1.2003, click on
&quot;whole day&quot; and enter 17.10.2002 to 26.1.2003 for reminder time...</p>
<p>&nbsp;</p>
<p>The field <b>State</b> is not completely implemented at the moment. At the
moment there you can enter letters to emphasize events. Next release comes with
personal defined icons for that field. This of course will not touch the letter-entries
you make today...</p>
<p>&nbsp;</p>
<h3><a name="howtolink"></a>How to link the script (parameters)</h3>
<p>After you have installed Jax Calendar as described in Chapter &quot;Installation&quot;
you can set links to the script from your website. You can influence outputs
of the script manipulating the parameters behind the &quot;?&quot;...</p>
<p class="urls">http://www.meinedomain.tld/calendar/jax_calendar.php?<b>Y</b>=2003&amp;<b>m</b>=4&amp;d=17&amp;<b>cal_id=</b>0&amp;<b>language</b>=english</p>
<p>Parameter <b class="inputs_outputs">Y </b>and <b class="inputs_outputs">m </b>define
what year and month is shown in the calendar.</p>
<p><b class="inputs_outputs">cal_id</b> specifies the calendar (if you run multiple
calendars with the script -&gt; see <a href="#multiple_calendars">FAQ: How to
use multiple calendars</a>)</p>
<p><b><span class="inputs_outputs">language</span></b> sets the language of messages
and days of the week. Its important to make sure that a coressponding language
template exists (in directory <span class="file_name">languages</span>). Otherwise
the script sets the language that is defined in <span class="file_name">calendar.settings.inc.php</span>.</p>
<p>&nbsp;</p>
<p>&nbsp; </p>
<h1>IV. Frequently Asked Questions (FAQs)</h1>
<p>&nbsp;</p>
<h3><a name="include_modules"></a>How to include the calendar control directly
to my website?</h3>
<p>Jax Calendar consists of two modules. The modules <span class="file_name">calendar.inc.php</span>
and <span class="file_name">eventlist.inc.php</span> build the calendar control
and the event list. To see how to include the modules have a look at <span class="file_name">jax_calendar.php</span>.
</p>
<p>If you include the modules from another directory than from the default directory
where jax_calendar.php is, than you have to write &lt;BASE href=&quot;..&quot;&gt;
tag before include to make sure that stylesheets and javascripts work properly!</p>
<p>If you include the moduls directly into your pages please don't forget to set
a copyright note or link to the download site of Jax Calendar!</p>
<p>&nbsp;</p>
<h3><a name="fonts_and_colors"></a>How to change colors and fonts?</h3>
<p>To change outer appearance there are some predefined CSS stylesheets in directory
<span class="file_name">css</span>. You can change them using a simple texteditor.
</p>
<h3>&nbsp;</h3>
<h3><a name="faq_timespan"></a>How to set time span of eventlist view?</h3>
<p>There are 3 predefined views for eventlist. (Day, Month, Year). These views
are controlled by GET-Parameter view </p>
<p><span class="inputs_outputs">http://../jax_calendar.php?cal_id=1&amp;<b>view=d1</b></span></p>
<p>If you want to set the default view for selection (e.g. for year view) you
have to change following line in <span class="file_name">calendar.settings.inc.php</span>:</p>
<p class="source_view">$view_default = "m12";</p>
<p>&nbsp;</p>
<h3><a name="faq_separatewindow"></a>How to open event list in a separate window?</h3>
<p>If you want to open the eventlist in a separate window, do the following:</p>
<p>1. prepare a php (e.g. <span class="file_name">myeventlist.php</span>) file
including the <span class="file_name">eventlist.inc.php</span></p>
<p>2. change following lines in <span class="file_name">calendar.settings.inc.php</span>:</p>
<p class="source_view">$calendar_open_url = "http://.../myeventlist.php";<br>
$calendar_open_target = "_blank";</p>
<p>&nbsp;</p>
<h3><a name="multiple_calendars"></a>How to use multiple calendars?</h3>
<p>If you want to run more than one Calendar with the same script you can select
the corresponding calendar by parameter <span class="inputs_outputs">cal_id</span>.
e.g:</p>
<blockquote>
<p class="urls">http://../jax_calendar.php<b>?cal_id=1</b></p>
</blockquote>
<p>For security reasons the filename of the calendar is not forwarded directly
by URL. <br>
The allocation between calendar ID and calendar name you have to set manually
in <b class="file_name">calendar.settings.inc.php</b>. e.g:</p>
<div class="source_view">
<p>...</p>
<p>// Title and Data Source<br>
$calendars[0]-&gt;title = &quot;Jax Calendar&quot;;<br>
$calendars[0]-&gt;data_source = &quot;csvfile&quot;;</p>
<p>$calendars[1]-&gt;title = &quot;Ein zweiter Kalendar&quot;;<br>
$calendars[1]-&gt;data_source = &quot;mysql&quot;;</p>
<p>$calendars[0]-&gt;css = &quot;styles/default.css&quot;;<br>
$calendars[1]-&gt;css = &quot;styles/ice.css&quot;;</p>
<p>$calendars[0]-&gt;calendar_file = &quot;mycalendar&quot;;<br>
$calendars[0]-&gt;event_file = &quot;myevents&quot;;</p>
<p>$calendars[1]-&gt;calendar_file = &quot;mycalendar&quot;;<br>
$calendars[1]-&gt;event_file = &quot;myevents&quot;;</p>
<p>...</p>
</div>
<p>The example shows how to use a second calendar with the same script:</p>
<blockquote>
<p><span class="urls">http://../jax_calendar.php?<b>calendar_id=1</b></span></p>
</blockquote>
<p>access a second calendar based on a mySQL table.<br>
Equivalent the URL </p>
<blockquote>
<p><span class="urls">http://../jax_calendar.php?<b>calendar_id=2</b></span>
</p>
</blockquote>
<p>accesses a third calendar file and so on...</p>
<p>You can freely choose the data source (<span class="inputs_outputs">mysql</span>/<span class="inputs_outputs">csvfile</span>)
for any single calendar!</p>
<p>&nbsp;</p>
<h3><a name="file_permissions"></a>How to change file access permissions on the
webserver?<br>
</h3>
<p>If your webserver runs on Unix (Apache) you have to use the Unix command <b class="file_name">chmod</b>
to change the file access permissions. (How to do this conveniently using your
FTP client is described below) </p>
<p> Syntax of chmod is:<br>
<br>
<b><span class="inputs_outputs">chmod</span></b> <span class="inputs_outputs"><font color="#FF0000">rwx</font><font color="#0000FF">rwx</font><font color="#006600">rwx</font>
</span><span class="file_name">filename</span><span class="inputs_outputs">
</span><br>
<br>
r = read<br>
w = write<br>
x = execute<br>
<br>
The command expects three 3-digit tupels representing the access permissions
for the single &quot;groups&quot; : [rwx][rwx][rwx]<br>
<br>
The groups: (from right to left)<br>
<br>
all users<br>
all users in same group as owner<br>
owner only<br>
<br>
in binary notation:<br>
<br>
<span class="inputs_outputs">chmod [rwx][rwx][rwx]</span><br>
<br>
is equivalent to<br>
<br>
<span class="inputs_outputs">chmod [111][111][111]</span><br>
<br>
resp. in hex notation with<br>
<br>
<span class="inputs_outputs">chmod [7][7][7]</span><br>
<br>
thats all - here you have the chmod command to allow &quot;all&quot; access
to files:<br>
<br>
<span class="inputs_outputs">chmod 777 </span><span class="file_name">calendar<font face="Courier New, Courier, mono">.csv</font></span><font face="Courier New, Courier, mono"><br>
</font><br>
(the required access permissions depend on webservers configuration. If you
are suspiciously and do not want to give script all access (777), try to increase
rights step by step until the script works!)<br>
<br>
Most FTP clients, as <b><a href="http://www.wsftp.com/downloads/index.html" target="_blank">WS-FTP</a></b>
support chmod-command conveniently from their user interface. Using <b>WS-FTP</b>
you only have to click with right mouse button on a file (in remote window)
and then you have to klick on chmod and so on...<br>
</p>
<p>&nbsp;</p>
<h3><a name="max_entries"></a>How many entries Jax Calendar can handle?<br>
</h3>
<p>Currently I am running the Calendar on one of my websites with 200 dates in
CSV mode. Theoretically the script is able to handle several 1000 entries (depending
on your webservers capacity and data source). For running larger calendars mySQL
is recommended... </p>
<p>&nbsp;</p>
<h3><a name="updates"></a>Where to get informationen about updates and changes</h3>
<ol>
<li> On my website (<a href="http://www.jtr.de/scripting/php/calendar" target="_blank" class="urls">http://www.jtr.de/scripting/php/calendar</a>)
;-)<br>
<br>
</li>
<li>In Admin Script there is a link &quot;Check for Updates&quot;. To the left
of it there is a small green spot. If it blinks gree-yellow there is a new
update. If it blinks red yellow there is a security relevant update that you
should install!<br>
<br>
</li>
<li>Sign into &quot;JtR News&quot;-Newsletter! (<a href="http://www.jtr.de/scripting/php/newsletter/newsletter" target="_blank" class="urls">http://www.jtr.de/scripting/php/newsletter/newsletter</a>)</li>
</ol>
<p>&nbsp;</p>
<h1>V. Known Bugs and Problems</h1>
<p>&nbsp;</p>
<h3><a name="bugs_mysql"></a>Problems with mySQL</h3>
<p>Jax Calendar <b>saves only one entry</b>, resp. it always shows the same entry!<br>
<br>
You probably have not set up the database using the sql dump (in <span class="file_name">admin</span>-directory)
and forgot to create the field &quot;<b>id&quot;</b> (very important!!)</p>
<h3>&nbsp;</h3>
<h1>VI. List of Changes (Change Log)</h1>
<p>&nbsp;</p>
<h3><a name="changelog_v131"></a>Changes in Version 1.31: </h3>
<ul>
<li>
<p>Bugfix: wrong weekday in calendar module</p>
</li>
</ul>
<h3><a name="changelog_v130"></a>Changes in Version 1.3: </h3>
<ul>
<li> <b>Restructuring of directory structures</b><br>
config file is now in <span class="file_name">settings/calendar.settings.inc.php</span></li>
<li> <b>changed language files</b> <br>
(all variables included in array loc_lang) please send me your language file
translation if made one!<br>
</li>
<li><b> improved calendar control</b><br>
prev. year + next year button<br>
quick select for prev/next years, prev/next months<br>
</li>
<li><b>integration of mishoos dhtml calendar</b> in admin system</li>
<li> <b>icon for status field</b><br>
</li>
<li><b> selectable views<br>
</b>for year, month, day<br>
</li>
</ul>
<h3><a name="changelog_v127"></a>Changes in Version 1.27: </h3>
<ul>
<li><b>Bugfix: Error in Calendar module</b><br>
(On some systems it did not display the correct day of the week) </li>
</ul>
<h3><a name="changelog_v126"></a>Changes in Version 1.26: </h3>
<ul>
<li><b>Bugfix: Alternating line colors</b><br>
(line colors of successive lines in eventlist sometimes did not alternate
correctly)<br>
</li>
<li><b>Bugfix: Eventkey now &quot;accidental&quot;</b><br>
(the eventkey was generated using the time. so entries with the same time
got the same eventkey and following the same description...)</li>
<li>new modul (<span class="file_name">nextevent.inc.php</span>) for navigation
to &quot;Next Event&quot;</li>
</ul>
<h3><a name="changelog_v125"></a>Changes in Version 1.25:</h3>
<ul>
<li><b>Bugfix: Displaying of events in eventlist<br>
</b>(eventlist did not show events if hour for reminder time had expired)</li>
</ul>
<h3><a name="changelog_v120"></a>Changes in Version 1.2:</h3>
<ul>
<li><b>complete redesign of CSS stylesheets</b></li>
<li><b>separation into several modules </b>(<span class="file_name">main.inc.php</span>,
<span class="file_name">calendar.inc.php</span>, <span class="file_name">eventlist.inc.php</span>)</li>
<li><b>bugfix in mySQL database module (<span class="file_name">mysql.inc.php</span>)</b></li>
<li><b>improvement of admin system<br>
</b></li>
</ul>
<p>&nbsp;</p>
<hr size="1" noshade>
<p>If you have found any errors or have questions or suggestions for improvement
then please don't hesitate to contact me directly! </p>
<p><img src="contact_addy.gif" width="199" height="30"></p>
<p><span class="sec_note">RTFM !!! :</span><br>
I am sorry, but I have not time for giving free installation support for this
program! If you have a problem that is answered in the manual I will ignore
your e-mail request...</p>
<p>Plase don't waste my and your own time and read the manual thoroughfully before
you contact me! Hints to missing or wrong explanations in the manual are welcome
of course...</p>
<hr size="1" noshade>
<p align="right">Berlin, 9 April 2004 - Jack (tR) </p>
</body>
</html>
/kalender/manuals/readme_fi.html
0,0 → 1,880
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<title>Jax Calendar v1.26 - Dokumentation</title>
<meta name="keywords"
content="Jax Calendar, Dokumentation, Bedienungsanleitung, Installationsanleitung">
<meta name="description"
content="Auf dieser Seite stehen alle wichtigen Informationen zur Installation und Nutzung von Jax Calendar.">
<meta name="author" content="Andreas John aka Jack (tR)">
<style type="text/css">
<!--
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
margin: 10%;
}
 
.title {
font-family: "Arial Black", Arial, Helvetica, sans-serif;
font-size: 200%;
font-weight: bolder;
text-align: center
}
 
.prog_info {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
padding: 5%;
border : 2px solid #000000;
background-color : #FDFAF4;
}
 
.index {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 100%;
text-align: left;
padding: 5%;
border : 1pt dashed #000000;
background-color : #E3EEFD;
}
 
.index A {
text-decoration: none;
}
 
.index A:hover {
text-decoration: underline;
}
 
 
.source_view {
font-family: "Courier New", Courier, mono;
font-size: 80%;
text-align: left;
padding: 3%;
border : 1pt dashed #000000;
background-color : #EEEEEE;
}
 
h1, h2, h3, h4, h5, h6 {
font-family: Arial, Helvetica, sans-serif;
font-weight: bolder;
}
 
h1, h2 {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 180%;
}
 
h3, h4 {
font-size: 120%;
}
 
h5, h6 {
font-size: 120%;
}
 
 
.index h3 {
 
text-align: left
}
 
.index .sub {
font-family: Arial, Helvetica, sans-serif;
font-size: 100%;
font-weight: bolder;
text-align: left;
margin-left: 5%;
}
 
.inputs_outputs, .file_name {
font-size: 100%;
font-family: "Courier New", Courier, mono;
}
 
.urls {
font-size: 100%;
font-family: "Courier New", Courier, mono;
}
 
.sec_note {
font-weight: bolder;
color: red;
}
.file_name { color: #3399CC }
-->
</style>
</head>
<body bgcolor="#ffffff" text="#000000">
<p class="title">Jax Calendar v1.26<br>
Dokumentaatio<br>
</p>
<p>&nbsp;</p>
<div class="index">
<h3>O. Yleist&auml;</h3>
<div class="sub">
<p><a href="#program_and_author">Ohjelma ja tekij&auml;</a><br>
<a href="#credits">Kiitokset</a></p>
</div>
<h3>I. Esittely</h3>
<div class="sub">
<p><a href="#about">Mik&auml; on Jax Kalenteri? - mihin sit&auml; tarvitaan?<br>
</a><a href="#features">Ominaisuudet</a><br>
<a href="#requirements">Vaatimukset</a><br>
<a href="#license">Lisenssi</a></p>
</div>
<h3>II. Asentaminen</h3>
<div class="sub">
<p><a href="#install_without_mysql">ilman MySQL-tukea</a><a
href="#install_with_mysql"><br>
MySQL-tuen kanssa</a></p>
</div>
<h3>III. Ohjelma</h3>
<div class="sub">
<p><a href="#calendar_admin">Yll&auml;pitoj&auml;rjestelm&auml;</a><br>
<a href="#howtolink">Skriptin toimintaperiaate</a></p>
</div>
<h3>IV. Usein kysytyt kysymykset (FAQ)</h3>
<div class="sub">
<p><a href="#include_modules">Kuinka voin tulostaa kalenterin osissa?</a><br>
<a href="#fonts_and_colors">Kuinka kalenterin ulkoasua voi muuttaa?</a><br>
<a href="#multiple_calendars">Kuinka voin k&auml;ytt&auml;&auml; useaa
kalenteria samaan aikaan?<br>
</a><a href="#file_permissions">Kuinka tiedostojen ja hakemistojen
oikeuksia muutetaan?<br>
</a><a href="#max_entries">Kuinka monta tapahtumaa Jax Kalenteriin
mahtuu?<br>
</a><a href="#updates">Mist&auml; saan tiedon uusimmista p&auml;ivityksist&auml;?</a><br>
</p>
</div>
<h3>V. Virheet ja ongelmat (Troubleshooting)</h3>
<div class="sub">
<p><a href="#bugs_mysql">Ongelma MySQL:n kanssa<br>
</a></p>
</div>
<h3>VI. Muutoshistoria (ChangeLog)</h3>
<div class="sub"> <a href="#changelog_v126">v1.26</a> ,<a
href="#changelog_v125">v1.25</a>, <a href="#changelog_v120">v1.2</a></div>
</div>
<h3>&nbsp;</h3>
<h1>O. Ohjelma ja tekij&auml;</h1>
<p>&nbsp;</p>
<h3><a name="program_and_author"></a>Ohjelma ja tekij&auml;</h3>
<div class="prog_info">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>Projekti:</td>
<td>&nbsp;</td>
<td>Jax Calendar (Online Event-Kalendar) </td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Versio: </td>
<td>&nbsp;</td>
<td>1.26</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Tulkki:</td>
<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>PHP 4.02+</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Koodi:<br>
</td>
<td>&nbsp;</td>
<td>Andreas John</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Ulkoasu:</td>
<td>&nbsp;</td>
<td>Andreas John</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Kotisivut:</td>
<td>&nbsp;</td>
<td><a href="http://www.jtr.de/scripting/php/calendar"
target="_blank" class="urls">www.jtr.de/scripting/php/calendar/</a></td>
</tr>
<tr>
<td valign="top">&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td valign="top">Lisenssi:</td>
<td>&nbsp;</td>
<td>
<p>Copyright (C) 2002-2003, Andreas John [ Jack (tR) ]</p>
<p> T&auml;m&auml; ohjelma on Freeware ja GPL 2:n (General Public Liecense)
alainen. L&ouml;yd&auml;t GPL-lisenssin ohjelmapaketista nimell&auml; gpl.txt,
tai voit tutustua siihen osoitteessa <a
href="http://www.turre.com/licenses/gpl_fi.php">http://www.turre.com/licenses/gpl_fi.php</a><br>
</p>
<p>Huom! Tekij&auml; ei ota vastuuta mist&auml;&auml;n t&auml;m&auml;n
ohjelman&nbsp;k&auml;ytt&auml;j&auml;lle aiheuttamasta rahallisesta, laitteistollisesta
tai muusta vahingosta.</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<h3><a name="credits"></a>Kiitokset</h3>
<p>Haluan antaa suuret kiitokset t&auml;st&auml; ja monesta muusta avoimen
koodin projektista. Moni on auttanut minua niin ohjelmoinnin, k&auml;&auml;nt&auml;misen
kuin monen muun ongelman osalta.&nbsp;</p>
<p>Henkil&ouml;kohtainen kiitokseni heille kaikille:<br>
</p>
<table border="0" width="100%">
<tbody>
<tr>
<td>
<p>Bela-Andreas Bargel <a
href="http://www.fuldas-tauchertreff.de/" target="_blank" class="urls">
http://www.fuldas-tauchertreff.de<br>
</a>Gerard Farr&agrave;s Ballabriga <a
href="http://www.ctfc.es/" target="_blank" class="urls">http://www.ctfc.es</a><br>
Helge Larsen<br>
Jarno Ristaniemi <a href="http://www.vihrealiitto.fi/lappi"
class="urls">http://www.vihrealiitto.fi/lappi</a><br>
Klaus-Peter Lexow<a href="http://www.ctfc.es/" target="_blank"
class="urls"></a><br>
Marc Gavage <a href="http://portix.be/" target="_blank"
class="urls">http://portix.be</a><br>
Martin Sondermann <a href="http://www.kunstphotografie.de/"
target="_blank" class="urls">http://www.kunstphotografie.de</a><br>
Mitsuhiro Yoshida <a href="http://mitstek.com/" target="_blank"
class="urls">http://mitstek.com/<br>
</a>Peter Kramer <a href="http://www.action-sport.de/"
target="_blank" class="urls">http://www.action-sport.de</a><br>
Sigrid Henning-Bellwinkel <a href="http://bellwinkel.de/"
target="_blank" class="urls">http://bellwinkel.de</a><br>
Wojciech Dorosz<br>
<br>
InteractiveTools.com (bzw. die Entwickler von <a
href="http://www.interactivetools.com/products/htmlarea/index.html"
target="_blank">HTMLarea</a>)</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h1>I. Esittely</h1>
<p>&nbsp;</p>
<h3><a name="about"></a>Mik&auml; on Jax Kalenteri - mihin sit&auml; tarvitaan?</h3>
<p>Jax Kalenteri on on-line kalenterij&auml;rjestelm&auml;, jonka voit asentaa
kotisivuillesi ja k&auml;ytt&auml;&auml; ilman varsinaista ohjelmointitaitoja.</p>
<p>Voit tallentaa reaaliaikaisesti tulevien tapahtumien p&auml;ivi&auml;
tai ajanjaksoja sek&auml; kirjoittaa niille seliteosuuden. N&auml;in sivuillasi
k&auml;vij&auml;t saavat aina uusimman tiedon interaktiivisena tapahtumalistana.&nbsp;
</p>
<p>Voit tutustua suomenkieliseen demoversioon osoitteessa: <a
href="http://www.jtr.de/scripting/php/calendar/calendar/jax_calendar.php"
target="_blank" class="urls">http://www.jtr.de/scripting/php/calendar/calendar/jax_calendar.php?language=Finnish</a></p>
<h3>&nbsp;</h3>
<h3><a name="features"></a>Ominaisuudet</h3>
<p>Jax Kalenteri tarjoaa erotuksena muihin yleisiin www-kalentereihin muutamia
erityisominaisuuksia. Erityisen huomionarvoista on se, ett&auml; kalenteri
toimii tehokkaasti niin MySQL-tietokannan kuin my&ouml;s tavallisen CVS-tekstitiedostojen
avulla. Voit vapaasti valita kumpaa haluat k&auml;ytt&auml;&auml;.</p>
<p>Jax Kalenterin ominaisuusluettelo:</p>
<ul>
<li> <b>Eri tiedontallennusmuotojen tuki</b> (MySQL ja CSV-tekstitiedostot)<br>
<br>
</li>
<li>Mahdollisuus k&auml;ytt&auml;&auml;<b> useaa kalenteria </b>samalla
skriptill&auml;<br>
<br>
</li>
<li>moderni, interaktiivinen&nbsp; ("Look &amp; Feel") ulkoasu<br>
<b>Tekstin fontti ja kaikki v&auml;rit ovat helposti muokattavissa Cascading
Stylesheet-tiedoston&nbsp;</b><b>(CSS)</b><b> avulla </b>(muutamia valmiiksi
modifioituja css-tiedostoja tulee paketin mukana)<br>
<br>
</li>
<li> <b>Tuki usealle kielelle</b><b>, </b>jotka voi vaihtaa dynaamisesti
"lennossa"<br>
(saksa, tanska, englanti, suomi, ranska, hollanti, japani, puola, espanja)<br>
<br>
</li>
<li>moduulirakenne (Kalenteri ja tapahtumalistat voi n&auml;ytt&auml;&auml;
yhdess&auml; tai erikseen) <br>
<br>
</li>
<li><b>helppo yll&auml;pito-ohjelma</b><br>
<br>
</li>
<li> <b>yksityiskohtaiset ohjeistukset</b><br>
<br>
</li>
<li>nopea <b>p&auml;ivityksien tarkistaja</b> (yll&auml;pito-ohjelmassa)<br>
<br>
</li>
<li><b>ilmainen</b> ja vapaasti kaikkien k&auml;ytett&auml;viss&auml;&nbsp;
(GPL)!</li>
</ul>
<p>&nbsp;</p>
<h3><a name="requirements"></a>Vaatimukset</h3>
<p>Jax Kalenteri on kirjoitettu palvelinpuolen PHP-nimisell&auml; ohjelmointikielell&auml;.
Kalenteri k&auml;&auml;ntyy sellaisenaan PHP4-tulkilla.&nbsp; (Kysy jo ennen
ohjelmiston asentamista, <b>onko k&auml;ytt&auml;m&auml;ll&auml;si palvelimella
PHP tukea</b>!) </p>
<p>Jax Kalenteri toimii niin tavallisilla tekstitiedostoilla kuin my&ouml;s
tehokkaammalla MySQL-tietokantaohjelmistolla. Jos kalenteriisi tulee paljon
merkint&ouml;j&auml;, kannattaa asentaa se toimimaan MySQL:n avulla.&nbsp;
T&auml;ll&ouml;in sinun tulee tarkistaa, <b>tukeeko k&auml;ytt&auml;m&auml;si
palvelin MySQL-tietokantaa!</b><b> </b></p>
<p>&nbsp;</p>
<h3><a name="license"></a>Lisenssi</h3>
<p>Jax Kalenteri ja sen yksitt&auml;iset komponentit ovat <b>GPL-lisenssin</b>
(General Public Liecense) version 2 alla.&nbsp;L&ouml;yd&auml;t GPL-lisenssin
ohjelmapaketista nimell&auml; gpl.txt, tai voit tutustua siihen osoitteessa
<a href="http://www.turre.com/licenses/gpl_fi.php">http://www.turre.com/licenses/gpl_fi.php</a>.<a
href="http://www.fsf.org/copyleft/gpl.html" target="_blank"
class="urls"></a></p>
<p>T&auml;m&auml; lisenssi tarjoaa sinulle mahdollisuuden kehitt&auml;&auml;
ohjelmistoa vapaasti. Kehitt&auml;miss&auml;si tai muuntamissasi ohjelman
versioissa on kuitenkin oltava n&auml;kyvill&auml; alkuper&auml;inen copyright-ilmoitus
ja linkki alkuper&auml;iseen skriptiin, osoitteeseen <a
href="http://www.jtr.de/scripting/php/calendar" target="_parent"
class="urls">http://www.jtr.de/scripting/php/calendar</a>.<br>
</p>
<p>Lis&auml;ksi Jax Kalenteri sis&auml;lt&auml;&auml; <a
href="http://www.interactivetools.com/products/htmlarea/index.html"
target="_blank" class="urls">htmlArea:n moduulin</a>, mik&auml; on alistettu
BSD lisenssin alle. Se tulee ymm&auml;rt&auml;&auml; ohjelmistosta erillisen&auml;.</p>
<p>&nbsp;</p>
<h1>II. Asentaminen</h1>
<p>&nbsp;</p>
<h3><a name="install_without_mysql"></a>Asentaminen ilman MySQL-tukea</h3>
<p>Jax Kalenteri on kirjoitettu palvelinpuolen ohjelmointikielen, PHP4:n
avulla. </p>
<p>Jax Kalenteri toimii teksti- tai tietokantapohjaisena.&nbsp;</p>
<p><br>
Jos k&auml;ytt&auml;m&auml;ss&auml;si palvelimessa on jo PHP4-tuki, tee seuraavasti:</p>
<ol>
<li> Hae viimeisin Jax Kalenteri osoitteesta <a
href="http://www.jtr.de/www.jtr.de/scripting/php/calendar/"
target="_blank" class="urls">http:/www.jtr.de/scripting/php/calendar/</a><br>
<br>
</li>
<li>Pura zip-paketti (my&ouml;s kaikki alikansiot)<br>
<br>
</li>
<li>Avaa <span class="file_name">globals.inc.php</span> -tiedosto ja muokkaa
se tarpeittesi mukaan.<br>
<br>
<u>Voit tehd&auml; t&auml;m&auml;n my&ouml;s my&ouml;hemmin k&auml;ytt&auml;en
hallinto-ohjelmistoa www-muodossa.</u> Hallinto-ohjelma on nimelt&auml;&auml;n
<b class="file_name">calendar.admin.php</b> ja se sijaitsee <span
class="file_name">admin</span> -hakemistossa.<br>
<br>
Jos olet esimerkiksi purkanut kalenteripaketin suoraan palvelimesi juureen
(/), l&ouml;yd&auml;t hallinto-ohjelmiston osoitteesta: <span
class="urls"><br>
<br>
http://www.minundomain.fi/calendar/admin/calendar.admin.php</span><br>
<br>
</li>
<li> Siirr&auml; kaikki tiedostot ja hakemistot palvelimesi kotihakemistoon.<br>
<br>
Tarkista tiedostojen siirt&auml;misen j&auml;lkeen <a
href="#file_permissions">oikeudet</a> kaikista .csv-tiedostoista&nbsp;
(oletuksena nimet "<span class="file_name">mycalendar.csv</span>" ja&nbsp;
"<span class="file_name">myevents.csv</span>"). Ohjelmaskriptill&auml; tulee
olla kirjoitusoikeus n&auml;ihin tiedostoihin. Muuten saat seuraavan virheilmoituksen:
<i><b><span class="inputs_outputs">"Error: Couldn't open 'Calendar'
..."</span></b></i><br>
<br>
</li>
<li>Kun kaikki tiedostot on kopioitu palvelimelle ja tiedostojen oikeudet
ovat kunnossa, voit ajaa kalenterin vaikkapa eri kielill&auml; seuravaan
kaavan mukaan:<br>
<br>
<span class="urls">http://www.minundomain.fi/calendar/jax_calendar.php?language=Finnish<br>
<br>
</span>Parametri <b class="inputs_outputs">language</b> ... m&auml;&auml;ritt&auml;&auml;
kalenterin kielen (kielitiedostojen t&auml;ytyy luonnollisesti l&ouml;yty&auml;
language-hakemistosta). Mik&auml;li kielt&auml; ei skriptille erikseen m&auml;&auml;ritell&auml;,
se k&auml;ytt&auml;&auml; oletuskielt&auml;, mik&auml; on asetettu konfiguraatiotiedostossa.<br>
<br>
</li>
<li><span class="sec_note">T&auml;rke&auml; tietoturvahuomautus:</span>
<b><br>
</b>Jax Kalenterissa ei ole omaa salasana-toimintoa, joten sinun tulee
est&auml;&auml; ulkopuolisten p&auml;&auml;sy&nbsp; admin-hakemiston yll&auml;pitoskripteihin
(<span class="file_name">admin/calendar.admin.php</span>)!<br>
<br>
&nbsp;</li>
</ol>
<h3><a name="install_with_mysql"></a>Asentaminen MySQL-tuen kanssa</h3>
<p>Jax Kalenteri on tuotettu niin, ett&auml; se toimii niin puhtauden tekstitiedostojen
kuin my&ouml;s MySQL:n avulla. Kun tallennettuja merkint&ouml;j&auml; on
useita satoja tai tuhansia, kalenteri toimii huomattavasti tehokkaammin MySQL-tuella.</p>
<p>Jos sinulla on jo palvelimessasi MySQL, toimi seuraavasti:</p>
<ol>
<li>Asenna Jax Kalenteri (kts.&nbsp; "<a
href="#install_without_mysql">asentaminen ilman MySQL-tukea</a>").<br>
<br>
</li>
<li>Aja yll&auml;pito-ohjelma palvelimella. Ohjelma l&ouml;ytyy admin-hakemistosta.<br>
<br>
</li>
<li>Muuta tarvittavat tiedot ohjelman avulla tai tee tarvittavat muutokset
suoraan <span class="file_name">globals.inc.php</span> -tiedostoon.
Aseta MySQL:n tiedot oikein (palvelin, tietokannan nimi,&nbsp; k&auml;ytt&auml;j&auml;tunnus
ja salasana).<br>
<br>
</li>
<li>K&auml;ynnist&auml; phpMyAdmin (tai vastaava ohjelma MySQL-palvelimen
hallintaan) &nbsp;ja aseta seuraavalla koodilla oikea taulukkorakenne:<br>
<pre class="inputs_outputs">CREATE TABLE mycalendar (<br> id int(11) NOT NULL auto_increment,<br> event_start varchar(30) default NULL,<br> event_end varchar(30) default NULL,<br> x24 int(11) NOT NULL default '0',<br> reminder_start varchar(30) default NULL,<br> reminder_end varchar(30) default NULL,<br> status varchar(30) NOT NULL default '',<br> event_title varchar(255) NOT NULL default '',<br> event_key varchar(32) NOT NULL default '',<br> PRIMARY KEY (id)<br>) TYPE=MyISAM;<br><br>CREATE TABLE myevents (<br> id int(11) NOT NULL auto_increment,<br> event_key varchar(32) NOT NULL default '',<br> event_description text NOT NULL,<br> PRIMARY KEY (id)<br>) TYPE=MyISAM;<br></pre>
</li>
<li><span class="sec_note">T&auml;rek&auml; tietoturvahuomautus:</span>
<b><br>
</b>Jax Kalenterissa ei ole omaa salasana-toimintoa, joten sinun tulee
est&auml;&auml; ulkopuolisten p&auml;&auml;sy&nbsp; admin-hakemiston yll&auml;pitoskripteihin
(<span class="file_name">admin/calendar.admin.php</span>)!</li>
</ol>
<p>&nbsp;</p>
<h1>III. Ohjelma</h1>
<p>&nbsp;</p>
<h3><a name="calendar_admin"></a>Yll&auml;pitoj&auml;rjestelm&auml;</h3>
<p>Lis&auml;tt&auml;ess&auml; uutta p&auml;iv&auml;&auml; <b>kalenterin hallintaj&auml;rjestelm&auml;ss&auml;</b>,
tulee huomioida kaksi asiaa:</p>
<p><b>1. Tapahtuman aikajakso</b></p>
<p>Tapahtuman aikajakso tarkoittaa aikoja, jolloin tapahtuma alkaa ja jolloin
se loppuu. N&auml;iden aikojen asettaminen ei ole ainoastaan kalenterin lukijalle
t&auml;rke&auml;&auml; vaan se <b>vaikuttaa my&ouml;s ilmoitusjaksoon.</b>&nbsp;&nbsp;</p>
<p>Jos "tapahtuma kest&auml;&auml; koko p&auml;iv&auml;n" -kohta on valittuna,
ilmoitusaika m&auml;&auml;ritell&auml;&auml;n alempiin kenttiin. Jos ilmoittamisen
aloitushetki on sama kuin lopetushetki, ainoastaan ilmoittamisen aloitushetki
huomioidaan.</p>
<p><b>2. Muistutuksen ajanjakso</b></p>
<p>Muistutuksen ajanjakson m&auml;&auml;ritt&auml;minen vaikuttaa siihen,
miss&auml; vaiheessa tapahtuma ilmestyy tapahtumalistaan. T&auml;m&auml;
ei ole tietystik&auml;&auml;n aivan sama kaikissa tapahtumissa. </p>
<p><b>Esimerkiksi:</b></p>
<p>Lis&auml;&auml;t vaikkapa kansainv&auml;lisen Berliiniss&auml; 17.-26.1.
v&auml;lisen&auml; aikana j&auml;rjestett&auml;v&auml;n Vihre&auml; viikko
-tapahtuman kalenteriisi. Voit vapaasti m&auml;&auml;ritell&auml;, ett&auml;
tapahtuma ilmestyy vaikkapa kolme kuukautta aikaisemmin tapahtumalistallesi.
Se ns. "hypp&auml;&auml;" esiin.</p>
<p>T&auml;ss&auml; tapauksessa, jos tapahtuman ajanjakso on 17.1.2003 -26.1.2003,
sinun tulee m&auml;&auml;ritell&auml; ilmoituksen ajanjaksoksi 17.10.2002-26.1.2003.</p>
<p>&nbsp;</p>
<p>Ohjelmassa on my&ouml;s mahdollisuus korostaa tiettyj&auml; tapahtumia.
Voit lis&auml;t&auml; tila-kentt&auml;&auml;n esimerkiksi huutomerkin merkitsem&auml;&auml;n
erityisen t&auml;rke&auml;&auml; tapahtumaa. Merkki n&auml;kyy tapahtumalistalla
oletusarvoisesti punaisena ja lihavoituna.<br>
</p>
<p>&nbsp;</p>
<h3><a name="howtolink"></a>Skriptin toimintaperiaate</h3>
<p>Kun olet asentanut ohjelman kappaleen II mukaan, voit vaikuttaa skriptin
nimen j&auml;lkeisiin parametreihin vapaasti. N&auml;in voit tehd&auml; esim.
suoria linkkej&auml; kalenteriisi. Skripti toimii n&auml;in:</p>
<p class="urls">http://www.omadomain.fi/calendar/jax_calendar.php?<b>Y</b>=2003&amp;<b>m</b>=4&amp;d=17&amp;<b>cal_id=</b>0&amp;<b>language</b>=english</p>
<p>Parametetreilla <b class="inputs_outputs">Y </b>ja&nbsp; <b
class="inputs_outputs">m </b>m&auml;&auml;ritell&auml;&auml;n vuosi ja kuukausi,
jolta ajalta kalenterimerkint&ouml;j&auml; haetaan.</p>
<p><b class="inputs_outputs">cal_id</b>:ll&auml; m&auml;&auml;ritel&auml;&auml;n,
mit&auml; kalenteria haluat k&auml;ytt&auml;&auml;. (Lue <a
href="#multiple_calendars">FAQ: Kuinka voin k&auml;ytt&auml;&auml; useaa
kalenteria samaan aikaan?</a>)</p>
<p><b><span class="inputs_outputs">language</span></b> -parametrilla voit
m&auml;&auml;ritell&auml; kielen, jolla kalenteri n&auml;ytet&auml;&auml;n.
Mik&auml;li URL:ssa ilmoitettua kielt&auml; ei l&ouml;ydy <span
class="file_name">language</span> -hakemistosta, tulostetaan kalenteri sill&auml;
oletuskielell&auml;, mik&auml; on m&auml;&auml;ritelty tiedostossa <span
class="file_name">globals.inc.php</span>. </p>
<p>&nbsp;</p>
<p>&nbsp; </p>
<h1>IV. Usein kysytyt kysymykset (FAQ)</h1>
<p>&nbsp;</p>
<h3><a name="include_modules"></a>Kuinka voin tulostaa kalenterin osissa?</h3>
<p>Jax Kalenteri on muodostettu moduuleista. T&auml;m&auml; mahdollistaa
kalenterin tulostamisen osissa. Voit tulostaa joko tapahtumalistan tai varsinaisen
kalenteriosuuden erikseen. Tiedosto&nbsp; <span class="file_name">main.inc.php</span>
tekee kaikki keskeiset proseduurit kalenteria varten. Tiedostot <span
class="file_name">calendar.inc.php</span> ja <span class="file_name">eventlist.inc.php</span>
tulostavat kalenteriosuuden ja tapahtumalistaosuuden erikseen. Katso kalenterin
moduulien erikseen tulostamisesta mallia tiedostosta <span
class="file_name">jax_calendar.php</span>. </p>
<p>Mik&auml;li muutat kalenteria jollakin tavalla sovittaaksesi sen sivuillesi,
muista s&auml;ilytt&auml;&auml; my&ouml;s kaikissa muunnelluissa versioissa
alkuper&auml;inen copyright-ilmoitus ja osoite alkuper&auml;isiin skripteihin!</p>
<p>&nbsp;</p>
<h3><a name="fonts_and_colors"></a>Kuinka kalenterin ulkoasua voi muuttaa?</h3>
<p>Kaikki kalenterin ulkoasuun liittyv&auml; m&auml;&auml;ritell&auml;&auml;n
<span class="file_name">styles</span> -hakemistosta l&ouml;ytyviss&auml;
Stylesheet-tiedostoissa. N&auml;it&auml; tiedostoja voi muokata tavallisella
tekstink&auml;sittelyohjelmalla. </p>
<h3>&nbsp;</h3>
<h3><a name="multiple_calendars"></a>Kuinka voin k&auml;ytt&auml;&auml; useaa
kalenteria samaan aikaan?</h3>
<p>Jos haluat k&auml;ytt&auml;&auml; samaan aikaan useampaa kalenteria, voit
kutsua toista kalenteria seuraavalla komennolla:</p>
<blockquote>
<p class="urls">http://../jax_calendar.php<b>?cal_id=1</b></p>
</blockquote>
<p>Turvallisuussyist&auml; tiedoston nime&auml;, jossa kalenteri fyysisesti
sijaitsee ei voi n&auml;ytt&auml;&auml; suoraan URL-osoitteessa, vaan se
tulee m&auml;&auml;ritell&auml; erikseen tiedostoon <b class="file_name">globals.inc.php</b>.
Esimerkiksi:</p>
<div class="source_view">
<p>...</p>
<p>// Title and Data Source<br>
$calendars[0]-&gt;title = "Ensimm&auml;inen Jax Kalenteri";<br>
$calendars[0]-&gt;data_source = "csvfile";</p>
<p>$calendars[1]-&gt;title = "Toinen Jax Kalenteri";<br>
$calendars[1]-&gt;data_source = "mysql";</p>
<p>$calendars[0]-&gt;css = "styles/default.css";<br>
$calendars[1]-&gt;css = "styles/ice.css";</p>
<p>$calendars[0]-&gt;calendar_file = "mycalendar.csv";<br>
$calendars[0]-&gt;event_file = "myevents.csv";</p>
<p>$calendars[1]-&gt;calendar_file = "mycalendar";<br>
$calendars[1]-&gt;event_file = "myevents";</p>
<p>...</p>
</div>
<p>Kalenterit m&auml;&auml;ritell&auml;&auml;n siis seuraavasti:</p>
<p>Toinen kalenteri, mik&auml; k&auml;ytt&auml;&auml; MySQL-tietokantaa merkit&auml;&auml;n
URL:ssa seuraavasti</p>
<blockquote>
<p><span class="urls">http://../jax_calendar.php?<b>calendar_id=1</b></span><b>
</b></p>
</blockquote>
<p>ja vastaavasti kolmas kalenteri merkit&auml;&auml;n:<br>
</p>
<blockquote>
<p><span class="urls">http://../jax_calendar.php?<b>calendar_id=2</b></span>
</p>
</blockquote>
<p>jne...<br>
</p>
<p><b>Huom!</b> Eri kalenterit voivat &nbsp;k&auml;ytt&auml;&auml; erilaisia
tallennusmenetelm&auml;&auml; (MySQL tai CVS-tekstitiedostot) samanaikaisesti!</p>
<p>&nbsp;</p>
<h3><a name="file_permissions"></a>Kuinka tiedostojen ja hakemistojen oikeuksia
muutetaan?</h3>
<p>Jos k&auml;yt&auml;t palvelinta tekstitilassa (UNIX-j&auml;rjestelm&auml;t),
kannattaa sinun k&auml;ytt&auml;&auml; komentoa <b
class="inputs_outputs">chmod</b> tiedostojen ja hakemistojen oikeuksien
muuttamiseen.&nbsp; Oikeuksien muuttaminen tapahtuu kuitenkin helpommin FTP-ohjelmiston
avulla. Seuraavassa lyhyt selostus chmod-komennosta: </p>
<p>Komennon perussyntaksi on seuraavanlainen:<br>
<br>
<b><span class="inputs_outputs">chmod</span></b> <span
class="file_name"><font color="#ff0000">rwx</font><font color="#0000ff">rwx</font><font
color="#006600">rwx</font> tiedoston_nimi </span><br>
<br>
r = lukuoikeus<br>
w = kirjoitusoikeus<br>
x = suoritusoikeus<br>
<br>
Komennossa m&auml;&auml;ritell&auml;&auml;n kolmelle eri "rym&auml;lle" oikeudet
samaan aikaan: [rwx][rwx][rwx] </p>
<p>Ryhm&auml;t vasemmalta oikealle:<br>
<br>
Kakki k&auml;ytt&auml;j&auml;t<br>
Kaikki saman ryhm&auml;n k&auml;ytt&auml;j&auml;t, mihin tiedoston omistaja
kuuluu<br>
K&auml;ytt&auml;j&auml; itse<br>
<br>
Komento voidaan antaa my&ouml;s bin&auml;&auml;rimuotoisena seuraavan kaavan
mukaan:<br>
<br>
<span class="inputs_outputs">chmod [rwx][rwx][rwx]</span><br>
<br>
ja sama komento annettaisiin bin&auml;&auml;risesti seuraavasti:<br>
<br>
<span class="inputs_outputs">chmod [111][111][111]</span><br>
<br>
tai desimaalimuodossa seuraavasti:<br>
<br>
<span class="inputs_outputs">chmod [7][7][7]</span><br>
<br>
Jos haluat antaa kaikille k&auml;ytt&auml;jille kaikki oikeudet tiedostoon,
kirjoita:<br>
<br>
<span class="inputs_outputs">chmod 777 </span><span class="file_name">calendar<font
face="Courier New, Courier, mono">.csv</font></span><font
face="Courier New, Courier, mono"><br>
</font><br>
(Tarvittavat oikeudet riippuu t&auml;ysin palvelimesi yll&auml;pit&auml;j&auml;n
tekemist&auml; asetuksista. &Auml;l&auml; siis suoraan anna kaikkia oikeuksia
kaikille (777), vaan kokeile muolla oikeuksilla ensin. Skriptin antamat virheilmoitukset
eiv&auml;t ole kenenk&auml;&auml;n vahingoksi!)<br>
<br>
Useimmissa FTP-ohjelmissa oikeuksien muuttaminen on eritt&auml;in helppoa
(esim. <b><a href="http://www.wsftp.com/downloads/index.html"
target="_blank">WS-FTP</a></b>). N&auml;iss&auml; ohjelmissa, kuten <b>WS-FTP</b>:ss&auml;,
sinun ei tarvitse kuin klikata tiedostoa oikealla hiiren painikkeella ja
sen j&auml;lkeen asettaa oikeat oikeudet.<br>
</p>
<p>&nbsp;</p>
<h3><a name="max_entries"></a>Miten monta tapahtumaa Jax Kalenteriin mahtuu?</h3>
<p>T&auml;ll&auml; hetkell&auml; kalenteriohjelmaa on testattu noin 200:n
tapahtuman listalla. Lista tallennettiin tekstimuodossa (CVS-tiedostoon)
ja toimi hyvin. Teoriassa skriptin toimivuuden rajana on vain k&auml;ytett&auml;viss&auml;
oleva palvelimen laskuteho ja aika, joka eri prosesseille maksimissaan annetaan.
Kalenteri toimii siis ongelmitta viel&auml; tuhansien tapahtumien listalla.
Suurempiin kalentereihin suositellaan kuitenkin k&auml;ytett&auml;v&auml;ksi
MySQL-tauluja. </p>
<p>&nbsp;</p>
<h3><a name="updates"></a>Mist&auml; saan tiedon uusimmista p&auml;ivityksist&auml;?</h3>
<ol>
<li>Kotisivuiltamme (<a
href="http://www.jtr.de/scripting/php/calendar" target="_blank"
class="urls">http://www.jtr.de/scripting/php/calendar</a>) luonnollisesti
;-)<br>
<br>
</li>
<li>P&auml;&auml;k&auml;ytt&auml;j&auml;n hallinnointiskriptist&auml;.
Klikkaa vain hallinnointisivulla olevaa kohtaa "p&auml;ivitykset". Vasemmalla
sivulla n&auml;kyy pieni vihre&auml; merkki, jos uusia p&auml;ivityksi&auml;
ei ole, pieni keltainen merkki, jos uudempi versio on saavavilla ja punainen
merkki, jos uusi ohjelman turvallisuuteen liittyv&auml; p&auml;ivitys on
saatavilla. Turvallisuusp&auml;ivitykset ovat erityisen t&auml;rkeit&auml;.<br>
<br>
</li>
<li>Rekister&ouml;i itsesi "JtR News"-uutispalveluun. (<a
href="http://www.jtr.de/scripting/php/newsletter/newsletter"
target="_blank" class="urls">http://www.jtr.de/scripting/php/newsletter/newsletter</a>)</li>
</ol>
<p>&nbsp;</p>
<h1>V. Virheet ja ongelmat</h1>
<p>&nbsp;</p>
<h3><a name="bugs_mysql"></a>Ongelma MySQL:n kanssa</h3>
<p>Jax Kalenteri <b>tallentaa vain yhden tapahtuman tauluun</b>, ja n&auml;ytt&auml;&auml;
aina saman tapahtuman.<br>
<br>
Todenn&auml;k&ouml;isesti unohdettu esimerkkitaulua ja unohdettu liitt&auml;&auml;
ID-kentt&auml;, mik&auml; on pakollinen.</p>
<h3>&nbsp;</h3>
<h1>VI. Muutoshistoria (Change Log)</h1>
<p>&nbsp;</p>
<h3><a name="changelog_v126"></a>Muutokset versioon 1.26: </h3>
<ul>
<li><b>Korjattu virhe: Tapahtumalistan vaihtuvav&auml;rinen taulukko</b><br>
(v&auml;rin muuttaminen monissa per&auml;tt&auml;isiss&auml; tapahtumissa
oli virheellinen) </li>
<li><b>Korjattu virhe: Tapahtuma-avain on nyt "yht&auml;jaksoinen"</b><br>
(Tapahtumien avaimet generoitiin aikaisemmin kellonajasta, joten eri
tapahtumilla saattoi ilmet&auml; samoja avaimia)</li>
<li>uusi moduulil (<span class="file_name">nextevent.inc.php</span>) seuraavien
p&auml;ivien navigoinnin helpottamiseksi</li>
</ul>
<h3><a name="changelog_v125"></a>Muutokset versioon 1.25: </h3>
<ul>
<li><b>Bugfix: P&auml;iv&auml;n esitt&auml;minen tapahtumalistassa</b><br>
(Tapahtumia ei n&auml;ytety tapahtumalistassa, mik&auml;li sen esiintymisp&auml;iv&auml;
oli jo ollut.)</li>
</ul>
<h3><a name="changelog_v120"></a>Muutokset versioon 1.2: </h3>
<ul>
<li>t&auml;ydellinen<b> tyylitiedostojen tarkistus</b><b></b></li>
<li><b>Ohjelman pilkkominen erillisiin moduuleihin&nbsp;</b> (<span
class="file_name">main.inc.php</span>, <span class="file_name">calendar.inc.php</span>,
<span class="file_name">eventlist.inc.php</span>)</li>
<li> <b>Korjattu virhe: MySQL-moduuli&nbsp;</b> (<span
class="file_name"><b>mysql.inc.php</b></span>)</li>
<li><b>Hallintaskriptin p&auml;ivitys</b></li>
</ul>
<p>&nbsp;</p>
<hr size="1" noshade="noshade">
<p>Mik&auml;li l&ouml;yd&auml;t ohjelmistosta virheen, sinulla on kysymyksi&auml;
tai ongelmia skriptien kanssa tai haluat antaa kehitt&auml;misidean, ole
hyv&auml; ja ota minuun suoraan yhteytt&auml;! </p>
<p><img src="liesmich_files/contact_addy.html" width="199" height="30">
</p>
<hr size="1" noshade="noshade">
<p align="right">Berlin, 10.05.2003 - Jack (tR)<br>
Rovaniemi, Finland, 17.05.2003 - zQw<br>
</p>
<br>
</body>
</html>
/kalender/manuals/to do list.txt
0,0 → 1,32
[ Jax Calendar ]
 
1. Suchfunktion im Admin!
2. Kopieren-Funktion
3. Serien-Termine-Funktion, bzw. Multi-Copy
4. User-Sicht für Monats/Wochenkalendar mit Kurzbeschreibung
 
+ "Neuer Termin"-Funktion für "normale" User
- Nächste Termine-Übersicht in neuer Seite (URL)
- Wochentagproblem im Calendarmodul beheben (tritt nur bei einigen Webservern auf???)
+ Abgespeckter Calendar-Control als Option!
+ new view: larger calendar view which contains the event header info
instead of just highlighted dates, with more detail available on drill-down
+ Admin: Periodische Termine / Serientermine
+ Chronik-Funktion (alljährliche Events!)
+ Wochenbeginn Montag oder Sonntag bzw. individuell festlegbar
+ Seitennummern für das Admin-Tool
+ Sortierung nach date, month, year
+ Internationale Datums- und Zeitformate berücksichtigen (z.B. 2pm)
+ Farbige Kennzeichnung der gesamten Periodenzeit!
+ Rücksprung aus Detailansicht, oder in neuem Fenster öffnen
+ Berücksichtigung der lokalen Zeit bzw. Zeitzone berücksichtigen/anzeigen
+ Wochennummern
+ Jahresansicht - aktuellen Tag farbig hervorheben
o Funktion, mit der man angesetzte Termine bewerten kann (Gruppenabstimmung über Alternativ-/Termine)
o Berücksichtigung des Zeitformats bei der Eingabemaske
o Automatisches Verfallsdatum für Termine (Löschen/Archivieren)
o Hinzufügen von Bildern für Events (Upload-Manager)
O Hinzufügen verschiedener Kategorien für verschiedene Ereignisse, z.b. Konzerte
o "next event" soll auch angezeigt werden, wenn ein Ereignis heute schon beendet ist,
so dass man automatsich an das nächste Ereignis erinnert wird
o XML-Import/Export
/kalender/modules/calendar.inc.php
0,0 → 1,200
<?php
 
/*
Jax Calendar v1.34 - Copyright (c) 2002-2004, Andreas John aka Jack (tR)
This program and it's moduls are Open Source in terms of General Public Licens (GPL) v2.0
 
calendar.inc.php (the calendar control)
*/
 
 
// fit if nescessary:
define( "PATH_TO_SCRIPT", "../" );
// Global variables (have to be fit)
require_once ( dirname(__FILE__) . "/"."main.inc.php" );
 
if (empty($calendar_open_url)) $calendar_open_url = $PHP_SELF;
$booked_events = array();
for ( $i=1;$i<=31;$i++ ) $booked_events[$i] = 0;
 
// marks all days in calendar which are start day of an event
if ($cal_show_reserved)
{
$red_data = array();
$calendar_list->get_entry(0,$red_data);
do {
if ( (gmdate( "m", $red_data["event_start"] ) == $cal_month) &&
(gmdate( "Y", $red_data["event_start"] ) == $cal_year))
{
$xday = gmdate( "j", $red_data["event_start"] );
$booked_events[ $xday ]++;
}
$calendar_list->get_next_entry( $red_data );
} while (!$calendar_list->eol());
}
 
$nxy= $cal_year+1;
$pvy= $cal_year-1;
 
if ($cal_today_selector)
{
$ts = <<<HTML
<tr>
<td colspan="3" class="today_select" id="today_select"><a href="$PHP_SELF?Y=$now_year&m=$now_month&d=$now_day&$ox_tail&view=$view"><img border="0" src="{$base_url["jax_cal"]}/images/back_today.gif">{$loc_lang["today"]}</a></td>
</tr>
HTML;
}
else
$ts = "";
 
if ($use_quick_selectors)
{
$mon_links = "<table>";
 
for ($i=1;$i<=12;$i++)
{
$mon_links .= "<tr><td><a href=\"$PHP_SELF?Y=$cal_year&m=$i&d=$cal_day&$ox_tail\">{$month_name[$i]}</a></td></tr>";
}
$mon_links .= "</table>";
 
$prev_years_links = $next_years_links = "<table>";
for ($i=1;$i<=10;$i++)
{
$nxt = $cal_year + $i;
$prv = $cal_year - $i;
$prev_years_links .= "<tr><td><a href=\"$PHP_SELF?Y=$prv&m=$cal_month&d=$cal_day&$ox_tail\">$prv</a></td></tr>";
$next_years_links .= "<tr><td><a href=\"$PHP_SELF?Y=$nxt&m=$cal_month&d=$cal_day&$ox_tail\">$nxt</a></td></tr>";
}
$prev_years_links .= "</table>";
$next_years_links .= "</table>";
$left_qs = <<<LINK
onMouseDown="setTimeout('qs_pop_up(\'qs_months\',\'left_qs\',-10, 0);',500);"
LINK;
 
$right_qs = <<<LINK
onMouseDown="setTimeout('qs_pop_up(\'qs_months\',\'right_qs\',-10, 0);',500);"
LINK;
 
$prev_years_qs = <<<LINK
onMouseDown="setTimeout('qs_pop_up(\'qs_prev_years\',\'prev_years_qs\',-10, 0);',500);"
LINK;
 
$next_years_qs = <<<LINK
onMouseDown="setTimeout('qs_pop_up(\'qs_next_years\',\'next_years_qs\',-20, 0);',500);"
LINK;
 
echo
<<< SCRIPTZ
<div id="qs_months" class="qs_months">
$mon_links
</div>
 
<div id="qs_prev_years" class="qs_prev_years">
$prev_years_links
</div>
 
<div id="qs_next_years" class="qs_next_years">
$next_years_links
</div>
 
<script language="JavaScript" type="Text/JavaScript" src="{$base_url["jax_cal"]}/modules/quick_select_popup.js"></script>
SCRIPTZ;
 
}
 
echo <<<CALENDAR_HEAD
 
 
<!-- THE CALENDAR CONTROL (START) -->
<div class="calendar">
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="headline">
<tr>
<td align="center"><a id="prev_years_qs" $prev_years_qs href="$PHP_SELF?Y=$pvy&m=$cal_month&d=$cal_day&$ox_tail&view=$view"><img border="0" src="{$base_url["jax_cal"]}/images/prev_year_wb.gif" title="{$loc_lang["view_quick_select"]}"></a><a id="left_qs" $left_qs href="$PHP_SELF?Y=$cal_prev_year&m=$cal_prev_month&d=$cal_day&$ox_tail&view=$view"><img border="0" src="{$base_url["jax_cal"]}/images/prev_month_wb.gif" title="{$loc_lang["view_quick_select"]}"></a></td>
<td align="center">$month_name[$cal_month] - $cal_year</td>
<td align="center"><a id="right_qs" $right_qs href="$PHP_SELF?Y=$cal_next_year&m=$cal_next_month&d=$cal_day&$ox_tail&view=$view"><img border="0" src="{$base_url["jax_cal"]}/images/next_month_wb.gif" title="{$loc_lang["view_quick_select"]}"><a id="next_years_qs" $next_years_qs href="$PHP_SELF?Y=$nxy&m=$cal_month&d=$cal_day&$ox_tail&view=$view"><img border="0" src="{$base_url["jax_cal"]}/images/next_year_wb.gif" title="{$loc_lang["view_quick_select"]}"></a></td>
</tr>
$ts
</table>
 
<table width="100%" border="0" class="overview">
<tr>
<td class="dayname">{$loc_lang["mo"]}</td>
<td class="dayname">{$loc_lang["tu"]}</td>
<td class="dayname">{$loc_lang["we"]}</td>
<td class="dayname">{$loc_lang["th"]}</td>
<td class="dayname">{$loc_lang["fr"]}</td>
<td class="dayname">{$loc_lang["sa"]}</td>
<td class="dayname">{$loc_lang["su"]}</td>
</tr>
 
CALENDAR_HEAD;
 
if ( ( $cal_year == $now_year ) && ( $cal_month == $now_month ) )
$today_day = $now_day;
else
$today_day = 0;
 
$days_last_month = gmdate( "d", gmmktime(0,0,0,$cal_month,0,$cal_year ) );
$days_this_month = gmdate( "d", gmmktime(0,0,0,$cal_next_month, 0, $cal_next_year ) );
 
$first_day_this_month = gmmktime( "0","0","0",$cal_month, "1", $cal_year );
$l_tm = localtime( $first_day_this_month, 1);
 
// $posx = array();
// what's the weekday of the 1st day of this month?*/
$first_day_pos = $l_tm[ "tm_wday" ];
if ( $first_day_pos == 0 ) $first_day_pos = 7; // convert to Mo=1 to Su=7
 
$day_num = $days_last_month - ($first_day_pos-2); $class=' class="last_month"';
for ( $y=1; $y<=6; $y++ )
{
echo " <tr>\n";
for ( $x=1; $x<=7; $x++ )
{
if ( ($y==1) && ($x==$first_day_pos) )
{
$day_num = 1; $class="";
}
if ( ($y >1) && ($day_num==$days_this_month+1) )
{
$day_num = 1; $class=' class="next_month"';
}
if ( ($class=="") && ($day_num == $today_day) ) $id=' id="today"'; else $id="";
if ( ( $id!=' id="today"') && ($class=="") && ($day_num == $cal_day ) ) $id=' id="selected"';
 
if ( $class != "" )
{ $ap1 = ""; $ap2 = ""; }
else
{ $ap1 = '<a href="'.$calendar_open_url."?Y=$cal_year&m=$cal_month&d=$day_num&$ox_tail".'" target="'.$calendar_open_target.'">'; $ap2 = '</a>'; }
if (($booked_events[$day_num] != 0) && $class=="")
echo ' <td'.$class.$id.'>'.$ap1.'<span class="reserved">'.$day_num.'</span>'.$ap2.'</td>'."\n";
else
echo ' <td'.$class.$id.'>'.$ap1.$day_num.$ap2.'</td>'."\n";
$day_num++;
}
echo " </tr>\n";
}
 
 
echo <<<CALENDAR_TAIL
</table>
</div>
 
<!-- THE CALENDAR CONTROL (END) -->
CALENDAR_TAIL;
 
?>
/kalender/modules/classes/csvfile.inc.php
0,0 → 1,629
<?php //csvfile.inc.php (table-xs v1.91) - (C) by Jack (tR) (http://www.jtr.de/scripting/php)
 
class csvfile
/*
The Data source is a CSV text file (comma separated values)
 
All values are seperated by Doublequotes (") and commata (,)
e.g: ("...","...","...")
 
The first line contains the attributes (headings of the table)
 
*/
{
 
// public class variables which can be modified
var $name = "";
var $handle = "";
var $captions = array();
var $list_next_pos = 0;
var $file_next_pos = 0;
var $eol = true;
 
/*
 
//--------------------------------------------------------------------------
// I N T E R F A C E
//--------------------------------------------------------------------------
 
// returns the captions of the table rows
array get_captions( );
 
// opens the data source
boolean open( string mode );
 
// closes the data source
boolean close();
 
// initializes the data source
boolean init();
 
// returns the number of table entries
int entries();
 
// returns an entry from the table
get_entry( int pos, reference array rows );
 
// returns the next entry from the table
get_next_entry( reference array rows );
 
// returns several successive table entries
get_entrylist( int start, int stop, reference array entrylist );
 
// appends an entry to the table
append( array data );
 
// looks for the first appearance of a date in the table
find_entry( string data );
 
// looks for the next appearance of a date in the table
find_next_entry( string data );
 
// changes an entry in the table
change( int pos, array data );
 
// removes an entry from the table
delete( int pos )
// inserts a (line-)entry to the table
function insert ( int pos, array data )
 
//returns true if reachs end of list
eol()
 
*/
 
 
//--------------------------------------------------------------------------
// Internal Help Functions
//--------------------------------------------------------------------------
 
function clean_string( $str )
// Task: Removes all superflous seperators and characters from
// the string
// Input: $str : a row, red from CSV-file, still containing artefacts
// of comma seperation
//
// Output: String without " (Double Quotes) at the begin and end
// (additionally all slash-coded chars will be decoded)
{
$str = trim( $str );
$newlen = $strlen = strlen( $str );
 
// Ignore quotes if string contains with
if ( substr($str,0,1) == '"')
{
$start = 1;
$newlen--;
}
else $start = 0;
 
// ignore Quotes if string ends with
if (substr( $str, $strlen-1, 1 ) == '"') { $newlen--; }
 
// cut the "real" data from string !!!
$str = substr( $str, $start, $newlen );
 
$str = stripslashes( $str ); // decode slash-coded chars
 
return $str;
}
 
 
function get_captions()
// Task: returns the captions of the table rows
//
// Input: none
//
// Output: returns the table captions in $captions
{
// reads captions from the first line
$line = fgets( $this->handle, 4096 );
$tokens = explode( '","' , $line );
 
$keys = array_keys( $tokens );
foreach ($keys as $key)
{
$this->captions[$key] = $this->clean_string( $tokens[$key] );
}
}
 
 
//--------------------------------------------------------------------------
// I M P L E M E N T A T I O N
//--------------------------------------------------------------------------
 
function open( $mode )
// opens the data source
{
if ( ! $this->handle = fopen( $this->name, $mode ) )
{
return false;
}
else
{
// lock file if opened for write mode
if ( eregi( "a|w|\+", $mode ) )
{ flock( $this->handle, 2); }
$this->eol = feof( $this->handle );
return true;
}
}
 
 
function close()
// closes the data source
{
flock( $this->handle, 3 );
return fclose( $this->handle );
}
 
function init()
// initializes the data source
{
if ( $this->open( "a+" ) && $this->close() )
{
return true;
}
return false;
 
$this->list_next_pos = 0;
$this->file_next_pos = 0;
}
 
function entries()
// Task: returns the number of table entries
//
// Input: none
//
// Output: number of entries
{
$num_entries = 0;
$this->open( "r" );
 
// read captions from first line
$this->get_captions();
 
// ... and count all following lines
while ( $line = fgets( $this->handle, 4096 ) )
{
$num_entries++;
}
$this->close();
return $num_entries;
}
 
 
function get_entry( $pos, &$rows )
// Task: returns an entry from the table
//
// Input: $pos = number of the line from where to fetch the data
//
// Output: $rows = array containing the entries
{
$this->open( "r" );
 
// read table headings from the first line
$this->get_captions();
 
// skip all entries before start position
$i=0;
while ( ($i < $pos) && ($line = fgets( $this->handle, 4096 )))
{
$i++;
}
$line = fgets( $this->handle, 4096 );
 
// keep current position in memory for get_next_entry
$this->file_next_pos = ftell( $this->handle );
$this->list_next_pos = $pos + 1;
 
if ( feof( $this->handle ) ) { $this->eol = true; }
 
$this->close();
 
$tokens = explode( '","' , $line );
 
$keys = array_keys( $tokens );
reset( $this->captions );
 
foreach ($keys as $key)
{
$cap = current( $this->captions );
$rows[$cap] = $this->clean_string( $tokens[$key] );
next( $this->captions );
}
}
 
function get_next_entry( &$rows )
// Task: returns the next entry from the table
//
// Output: $rows = array containing the entries
{
$this->open( "r" );
 
//set to entry following last get_entry
fseek( $this->handle, $this->file_next_pos );
 
if ( $line = fgets( $this->handle, 4096 ) )
{ $this->list_next_pos++; }
 
// keep current position in memory for get_next_entry
$this->file_next_pos = ftell( $this->handle );
 
if ( feof( $this->handle ) ) { $this->eol = true; }
$this->close();
 
$tokens = explode( '","' , $line );
 
$keys = array_keys( $tokens );
reset( $this->captions );
 
foreach ($keys as $key)
{
$cap = current( $this->captions );
$rows[$cap] = $this->clean_string( $tokens[$key] );
next( $this->captions );
}
}
 
 
function get_entrylist( $start, $stop, &$entrylist )
// Task: returns several successive table entries
//
// Input: $start = first entry to fetch
// $end = last entry to fetch
//
// Output: $entrylist = two dimensional array containing the red lines/entries
{
$this->open( "r" );
 
// Read table headings from the first line
$this->get_captions();
 
// Read all entries to the start position
$i=0;
while ( ($i < $start) && ($line = fgets( $this->handle, 4096 )))
{
$i++;
}
 
while ( ($i <= $stop) && ($line = fgets( $this->handle, 4096 )) )
{
$tokens = explode( '","' , $line );
 
$keys = array_keys( $tokens );
reset( $this->captions );
 
foreach ($keys as $key)
{
$cap = current( $this->captions );
$entrylist[$i][$cap] = $this->clean_string( $tokens[$key] );
next( $this->captions );
}
 
$i++;
}
if ( feof( $this->handle ) ) { $this->eol = true; }
$this->close();
}
 
 
function append( $data )
// Task: Appends an entry to the table
//
// Input: $data = array with the data to save
//
{
clearstatcache(); //...otherwise filesize stays constant!!!
 
if ( filesize( $this->name ) == 0 )
{
$line = '';
$this->open( "a+" );
 
$keys = array_keys( $data );
foreach ($keys as $key)
{
if (!empty( $line ))
{
$line .= ',';
}
$line .= '"' . $key. '"';
}
 
fputs( $this->handle, $line."\n" );
$this->close();
}
 
$this->open( "r" );
$this->get_captions();
$this->close();
 
$line = '';
$this->open( "a+" );
 
$values = array_values( $this->captions );
 
foreach ($values as $val)
{
if (!empty( $line ))
{
$line .= ',';
}
$line .= '"' . $data[$val]. '"';
}
 
fputs( $this->handle, $line."\n" );
$this->close();
}
 
 
function find_entry( $data )
// Task: Searches for the first appearance of a date in the table
//
// Input: $data = array with columns to find
//
{
$entry = 0;
$this->open( "r" );
$this->get_captions();
 
// for each row in table
while ( $line = fgets( $this->handle, 4096 ) )
{
unset( $tokens );
unset( $row ); $row = array();
// read line and transfer csv-values into array $row
$tokens = explode( '","' , $line );
 
$keys = array_keys( $tokens );
reset( $this->captions );
 
foreach ($keys as $key)
{
$cap = current( $this->captions );
$row[$cap] = $this->clean_string( $tokens[$key] );
 
next( $this->captions );
}
 
$equal = true;
$keys = array_keys( $data );
foreach ($keys as $key)
{
if ( $data[$key] != $row[$key] )
{
$equal = false;
break;
}
}
 
if ( $equal )
{
break;
}
 
$entry++;
}
 
// keep current position in memory for get_next_entry
$this->file_next_pos = ftell( $this->handle );
 
if ( feof( $this->handle ) ) { $this->eol = true; }
 
$this->close();
$this->list_next_pos = $entry + 1;
return $entry;
}
 
 
function find_next_entry( $data )
// Task: Searches for the next appearance of a date in the table
//
// Input: $data = array with colums to find
//
{
$ok = false;
$entry = $this->list_next_pos;
$this->open( "r" );
 
//set to entry following last get_entry
fseek( $this->handle, $this->file_next_pos );
 
// for each row in table
while ( $line = fgets( $this->handle, 4096 ) )
{
unset( $tokens );
unset( $row ); $row = array();
// read line and transfer csv-values into array $row
$tokens = explode( '","' , $line );
 
$keys = array_keys( $tokens );
reset( $this->captions );
 
foreach ($keys as $key)
{
$cap = current( $this->captions );
$row[$cap] = $this->clean_string( $tokens[$key] );
 
next( $this->captions );
}
 
$equal = true;
$keys = array_keys( $data );
foreach ($keys as $key)
{
if ( $data[$key] != $row[$key] )
{
$equal = false;
break;
}
}
 
if ( $equal )
{
break;
}
 
$entry++;
}
 
// keep current position in memory for get_next_entry
$this->file_next_pos = ftell( $this->handle );
$this->list_next_pos = $entry++;
 
if ( feof( $this->handle ) ) { $this->eol = true; }
 
$this->close();
return $entry;
}
 
 
function change( $pos, $data )
// Task: Changes a line in the table
//
// Input: $pos = Position of the element
// $data = array containing the data to save
//
{
$num_of_entries = $this->entries();
 
if ( filesize( $this->name ) == 0 )
{
$this->append( $data );
}
 
$this->open( "r" );
$this->get_captions();
$this->close();
 
// Komplette Datei zeilenweise einlesen
$entrylist = file( $this->name );
 
$newline = '';
 
$values = array_values( $this->captions );
foreach ($values as $val)
{
if (!empty( $newline ))
{
$newline .= ',';
}
$newline .= '"' . $data[$val]. '"';
}
$newline .= "\n";
$entrylist[$pos+1]=$newline;
 
$this->open( "w" );
fwrite( $this->handle, ereg_replace( "\r", "", implode( "", $entrylist ) ) );
 
$this->close();
}
 
 
function delete( $pos )
// Task: Removes a line from the table
//
// Input: $pos = Position of the Element
//
{
$num_of_entries = $this->entries();
 
if ( filesize( $this->name ) != 0 )
{
 
// Komplette Datei zeilenweise einlesen
$entrylist = file( $this->name );
 
unset( $entrylist[$pos+1] );
 
$this->open( "w" );
fwrite( $this->handle, ereg_replace( "\r", "", implode( "", $entrylist ) ) );
 
$this->close();
}
}
 
 
function insert ( $pos, $data )
// Task: Removes a line from the table
//
// Input: $pos = Position of the Element
//
{
$num_of_entries = $this->entries();
 
clearstatcache();
if ( filesize( $this->name ) == 0 )
{
$this->append( $data );
}
else
{
$newline = '';
 
$values = array_values( $this->captions );
foreach ($values as $val)
{
if (!empty( $newline ))
{
$newline .= ',';
}
$newline .= '"' . $data[$val]. '"';
}
$newline .= "\n";
 
$this->open( "r" );
$this->get_captions();
$this->close();
$this->open( "r" );
$captionline = fgets( $this->handle, 4096 );
$entrylist = array();
$entrylist[0] = $captionline;
$pos++;
// Datei bis zur Einfügeposition zeilenweise einlesen
$i = 1;
while ($i < $pos )
{
$entrylist[$i] = fgets( $this->handle, 4096 );
$i++;
}
 
$entrylist[$i]=$newline;
$i++;
 
while ( $entrylist[$i] = fgets( $this->handle, 4096 ) )
{
$i++;
}
$this->close();
 
$this->open( "w" );
fwrite( $this->handle, ereg_replace( "\r", "", implode( "", $entrylist ) ) );
$this->close();
}
}
 
 
function eol()
// Task: Removes a line from the table
//
// Input: $pos = Position of the Element
//
{
return $this->eol;
}
 
}
 
?>
/kalender/modules/classes/mysql.inc.php
0,0 → 1,482
<?php //mysql.inc.php (table-xs v1.91) - (C) by Jack (tR) (http://www.jtr.de/scripting/php)
 
class mysql
/*
The Data source is a mySQL database (table)
 
first field of each table has to be defined as:
id int(11) NOT NULL auto_increment
*/
{
 
// public class variables which may be modified
var $name = "";
var $handle = "";
var $server = "";
var $database = "";
var $login = "";
var $password = "";
var $captions = array();
var $tab_list = array();
var $list_next_pos = 0;
var $list_max_pos = 0;
var $order_criterion = "ORDER BY 'id' ASC";
var $eol = false;
 
/*
 
//----------------------------------------------------------------------------
// I N T E R F A C E
//----------------------------------------------------------------------------
 
// returns the captions of the table rows
array get_captions( );
 
// opens the data source
boolean open( string mode );
 
// closes the data source
boolean close();
 
// initializes the data source
boolean init();
 
// returns the number of table entries
int entries();
 
// returns an entry from the table
get_entry( int pos, reference array rows );
 
// returns the next entry from the table
get_next_entry( reference array rows );
 
// returns several successive table entries
get_entrylist( int start, int stop, reference array entrylist );
 
// appends an entry to the table
append( array data );
 
// looks for the first appearance of a date in the table
find_entry( string data );
 
// looks for the next appearance of a date in the table
find_next_entry( string data );
 
// changes a line in the table
change( int pos, array data );
 
// removes an entry from the table
delete( int pos )
*/
 
 
//-------------------------------- Help Functions ----------------------------
 
//improvement note:
//this version failes if table is empty
//use the PHP/MySQL functions instead for getting the column names!
 
function get_captions()
// Task: returns the captions of the table rows
//
// Input: none
//
// Output: returns the table captions in global array $captions
{
$query = "SELECT * FROM " . $this->name;
$result = mysql_query( $query, $this->handle );
$num_fields = mysql_num_fields( $result );
$i = 0;
while ( $i < $num_fields )
{
$name = mysql_field_name( $result, $i );
$this->captions[$i] = $name;
$i++;
}
}
 
//-------------------------------- Implementation ----------------------------
 
 
function open( $mode )
// establishes the connection to the MySQL-RDBMS
{
if ( !$this->handle = @mysql_connect( $this->server, $this->login, $this->password ) )
{
echo "Error: Connection to mySQL-database at '$this->server' failed!";
return false;
}
else
{
if ( @mysql_select_db( $this->database ) )
{
$query = "SELECT * FROM " . $this->name;
$result = mysql_query( $query, $this->handle );
$num_entries = mysql_num_rows( $result );
if ($num_entries == 0)
{ $this->eol = true; }
else
{$this->eol = false;}
 
return true;
}
else
{
echo "Error: Database '$this->database' not found!<br>";
 
return false;
}
}
}
 
 
function close()
// closes the connection to the mySQL-RDBMS
{
return mysql_close( $this->handle );
}
 
 
function init()
// initializes the data source
{
if ( $this->open( "" ) AND $this->close() )
{
return true;
}
return false;
 
unset( $this->$tab_list );
$this->list_next_pos = 0;
}
 
 
function entries()
// Task: returns the number of table entries
//
// Input: none
//
// Output: number of entries
{
 
$this->open("");
 
$this->get_captions();
 
$query = "SELECT id FROM " . $this->name;
if ( ! $result = @mysql_query( $query, $this->handle ) )
{
echo "Error: Table '$this->database.$this->name' not found...";
exit;
}
$num_entries = mysql_num_rows( $result );
$this->close();
 
return $num_entries;
}
 
 
function get_entry( $pos, &$rows )
// Task: returns an entry from the table
//
// Input: $pos = number of the line from where to fetch the data
//
// Output: $rows = array containing the entries
{
$this->open( "r");
 
$this->get_captions();
 
$query = "SELECT * FROM " . $this->name . " ".$this->order_criterion;
$this->tab_list = mysql_query( $query, $this->handle );
$this->list_max_pos = mysql_num_rows( $this->tab_list );
 
if ($pos < $this->list_max_pos)
{
mysql_data_seek( $this->tab_list, $pos );
 
$rows = mysql_fetch_array( $this->tab_list, MYSQL_ASSOC );
$this->list_next_pos = $pos + 1;
}
else $this->eol = true;
}
 
function get_next_entry( &$rows )
// Task: returns the next entry from the table
//
// Output: $rows = array containing the entries
{
if ($this->list_next_pos < $this->list_max_pos)
{
mysql_data_seek( $this->tab_list, $this->list_next_pos );
 
$rows = mysql_fetch_array( $this->tab_list, MYSQL_ASSOC );
 
$this->list_next_pos++;
}
else $this->eol = true;
}
 
 
function get_entrylist( $start, $stop, &$entrylist )
// Task: returns several successive table entries
//
// Input: $start = first entry to fetch
// $end = last entry to fetch
//
// Output: $entrylist = two dimensional array containing
// the red lines/entries
{
$this->open( "r" );
 
$this->get_captions();
 
$query = "SELECT * FROM " . $this->name . " ".$this->order_criterion;
$this->tab_list = mysql_query( $query, $this->handle );
$this->list_max_pos = mysql_num_rows( $this->tab_list );
 
$result = mysql_query( $query, $this->handle );
 
$this->list_max_pos = mysql_num_rows( $this->tab_list );
 
$i=0;
while ($i < $start && $start < $this->list_max_pos )
{
$tokens = mysql_fetch_array( $result, MYSQL_ASSOC );
$i++;
}
 
while ($i <= $stop && $stop <= $this->list_max_pos)
{
$entrylist[$i] = mysql_fetch_array( $result, MYSQL_ASSOC );
$i++;
}
$this->close();
}
 
 
function append( $data )
// Task: Appends an entry to the table
//
// Input: $data = array with the data to save
//
{
$this->open( "a" );
 
$query = "INSERT INTO " . $this->name ." ( ";
 
$values = array_keys( $data );
$preset_commata = false;
foreach ($values as $val)
{
if (!$preset_commata)
{
$query .= $val;
$preset_commata = true;
}
else
{
$query .= "," . $val;
}
}
$query .= ") VALUES ( ";
 
$values = array_keys( $data );
$preset_commata = false;
foreach ($values as $val)
{
if (!$preset_commata)
{
$query .= "'".$data[$val]."'";
$preset_commata = true;
}
else
{
$query .= "," . "'" . $data[$val] . "'";
}
}
$query .= " );";
$result = mysql_query( $query, $this->handle );
}
 
 
function find_entry( $data )
// Task: Searches for the first appearance of a date in the table
//
// Input: $data = array with the colums to find
//
{
$entry = 0;
$this->open( "r" );
$this->get_captions();
 
$query = "SELECT * FROM " . $this->name ." ".$this->order_criterion;
$this->tab_list = mysql_query( $query, $this->handle );
$this->list_max_pos = mysql_num_rows( $this->tab_list );
 
while ( $entry <= $this->list_max_pos
&& $row = mysql_fetch_array( $this->tab_list, MYSQL_ASSOC ) )
{
$equal = true;
$keys = array_keys( $data );
foreach ($keys as $key)
{
if ( $data[$key] != $row[$key] )
{
$equal = false;
break;
}
}
 
if ( $equal ) { break; }
 
$entry++;
}
$this->next_list_pos = $entry + 1;
return $entry;
}
 
 
function find_next_entry( $data )
// Task: Searches for the next appearance of a date in the table
//
// Input: $data = array with the columns to search
//
{
$ok = false;
$entry = $this->list_next_pos;
 
if ($this->list_next_pos < $this->list_max_pos)
{
mysql_data_seek( $this->tab_list, $this->list_next_pos );
 
while ( ($row = mysql_fetch_array( $this->tab_list, MYSQL_ASSOC ) ) )
{
$equal = true;
$keys = array_keys( $data );
foreach ($keys as $key)
{
if ( $data[$key] != $row[$key] )
{
$equal = false;
break;
}
}
 
if ( $equal )
{
break;
}
 
$entry++;
}
}
$this->list_next_pos = $entry + 1;
if ($this->list_next_pos > $this->list_max_pos) $this->eol = true;
 
return $entry;
}
 
 
function change( $pos, $data )
// Task: Changes a line in the table
//
// Input: $pos = Position of the element
// $data = array containing the data to save
//
{
$num_of_entries = $this->entries();
 
$this->open( "r" );
$this->get_captions();
 
$i=0;
$query = "SELECT * FROM " . $this->name . " ".$this->order_criterion;
$result = mysql_query( $query, $this->handle );
 
while ($i <= $pos)
{
$tokens = mysql_fetch_array( $result, MYSQL_ASSOC );
$i++;
}
 
$id = $tokens["id"];
 
$query = "UPDATE ".$this->name." SET ";
 
$values = array_values( $this->captions );
$preset_commata = false;
foreach ($values as $val)
{
if ($val != "id" )
{
if (!$preset_commata)
{
$query .= $val ." = ". '"'.$data[$val].'"'; $preset_commata = true;
}
else
{
$query .= ", " . $val ." = ". '"' . $data[$val] .'"';
}
}
}
$query .= " WHERE id = ".$id;
$result = mysql_query( $query, $this->handle );
 
$this->close();
}
 
function delete( $pos )
// Task: Removes a line from the table
//
// Input: $pos = Position of the Element
//
{
$num_of_entries = $this->entries();
 
$this->open( "r" );
 
$i=0;
$query = "SELECT * FROM " . $this->name. " ".$this->order_criterion;
$result = mysql_query( $query, $this->handle );
 
while ($i <= $pos)
{
$tokens = mysql_fetch_array( $result, MYSQL_ASSOC );
$i++;
}
$id = $tokens["id"];
 
$query = "DELETE FROM ".$this->name." WHERE id = ".$id;
$result = mysql_query( $query, $this->handle );
 
$this->close();
}
 
function insert ( $pos, $data )
// Task: Removes a line from the table
//
// Input: $pos = Position of the Element
//
{
$this->append( $data );
}
 
function eol()
// Task: Removes a line from the table
//
// Input: $pos = Position of the Element
//
{
return $this->eol;
}
 
}
 
?>
/kalender/modules/clean4print.js
0,0 → 1,32
//
// Clean4Print Version 0.02
//
// module for copying parts of a website into a new browser window!
//
// Copyright (c) 2003, Andreas John aka Jack (tR). All rights reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2 of the License, or (at your
// option) any later version. A copy of this license you can find in the
// added text file gpl.txt or on the website of the Free Software Foundation
// under: http://www.fsf.org/copyleft/gpl.html
//
 
function Clean4Print( tag_id )
{
var ref = document.getElementById( tag_id );
 
clean_popup = window.document.open( "about:blank","","");
clean_popup.document.write('<html>\n<head>\n<title>'+document.title+'</title>\n<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\n<link rel="stylesheet" href="css/clean4print.css">\n</head>\n');
clean_popup.document.write('<body><div class="clean4print">\n' );
 
// output all sections marked with tag_id
while (ref!=null)
{
clean_popup.document.write( ref.innerHTML + '\n' );
ref = ref.nextSibling;
}
 
clean_popup.document.write('</div></body>\n</html>\n');
}
/kalender/modules/eventlist.inc.php
0,0 → 1,432
<?php
 
/*
Jax Calendar v1.34 - Copyright (c) 2002-2004, Andreas John aka Jack (tR)
This program and it's moduls are Open Source in terms of General Public Licens (GPL) v2.0
 
eventlist.inc.php (the list of events)
*/
 
// fit if nescessary:
define( "PATH_TO_SCRIPT", "../" );
 
// Global variables (have to be fit)
require_once ( dirname(__FILE__) . "/". "main.inc.php" );
 
if ( !empty( $_GET["do"] ) ) $do = $_GET["do"]; else { $do = "show_list"; }
if (!empty( $_SERVER["PHP_SELF"] )) $PHP_SELF = $_SERVER["PHP_SELF"];
 
/**
* @return void
* @desc Shows all dates of the specified period
*/
function show_list()
{
global $calendar_list, $cal_month, $cal_day, $cal_year, $now_hour,$now_min, $now_sec,
$status_img_dir, $is_dst, $loc_lang, $ox_tail, $view_cal_select, $view_default, $view, $cal_next_month, $cal_next_year, $PHP_SELF, $base_url;
 
echo <<< TABLEHEAD
<h3 class="event_list_title">{$loc_lang["dates_and_events"]}</h3>
<!-- EVENT LIST (START) -->
<div class="event_list">
<div id="the_content">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr class="headings">
<td class="col_status"><img src="{$base_url["jax_cal"]}/images/1x1.gif" height="1" width="30">&nbsp;</td>
<td class="col_date">{$loc_lang["date"]}</td>
<td class="col_event">{$loc_lang["event"]}</td>
</tr>
TABLEHEAD;
 
if ( $view_cal_select )
{
$d1s = $d7s = $d14s = $d30s = $m3s = $m6s = $m12s = "";
switch ($view)
{
/*case "d1" :
{
$d1s = "selected";
$now_start = intval(gmmktime(0,0,0,$cal_month,$cal_day,$cal_year,$is_dst));
$now_stop = intval(gmmktime(23,59,59,$cal_month,$cal_day,$cal_year,$is_dst));
$now_stamp = intval(gmmktime($now_hour,$now_min, $now_sec, $cal_month, $cal_day, $cal_year,$is_dst));
break;
}
case "d30" :
{
$d30s = "selected";
$last_day_in_month = gmdate( "d", gmmktime(0,0,0,$cal_next_month, 0, $cal_next_year ) );
$now_start = intval(gmmktime(0,0,0,$cal_month,01,$cal_year ));
$now_stop = intval(gmmktime(23,59,59,$cal_month,$last_day_in_month,$cal_year ));
$now_stamp = intval(gmmktime(0,0,0,$cal_month,$cal_day,$cal_year ));
break;
}
case "m12" :
{
$m12s = "selected";
$now_start = intval(gmmktime(0,0,0,01,01,$cal_year,$is_dst));
$now_stop = intval(gmmktime(23,59,59,12,31,$cal_year,$is_dst));
$now_stamp = intval(gmmktime(0,0,0,$cal_month,$cal_day,$cal_year,$is_dst));
break;
}*/
case "d1" :
{
$d1s = "selected";
$view_start = intval(gmmktime(0,0,0,$cal_month,$cal_day,$cal_year,$is_dst));
$view_stop = intval(gmmktime(23,59,59,$cal_month,$cal_day,$cal_year,$is_dst));
$view_stamp = intval(gmmktime($now_hour,$now_min, $now_sec, $cal_month, $cal_day, $cal_year,$is_dst));
break;
}
case "d30" :
{
$d30s = "selected";
$last_day_in_month = num_days( $cal_year, $cal_month );
$view_start = intval(gmmktime(0,0,0,$cal_month,01,$cal_year,$is_dst));
$view_stop = intval(gmmktime(23,59,59,$cal_month,$last_day_in_month,$cal_year,$is_dst));
$view_stamp = intval(gmmktime(0,0,0,$cal_month,$cal_day,$cal_year,$is_dst));
break;
}
case "m12" :
{
$m12s = "selected";
$view_start = intval(gmmktime(0,0,0,01,01,$cal_year,$is_dst));
$view_stop = intval(gmmktime(23,59,59,12,31,$cal_year,$is_dst));
$view_stamp = intval(gmmktime(0,0,0,$cal_month,$cal_day,$cal_year,$is_dst));
break;
}
}
}
$num_dates = $calendar_list->entries();
$red_data = array();
$calendar_list->get_entry(0,$red_data);
$no_entries = true;
$outputs = "";
$ii = 0; // used for line colouring!
for ( $i=0;$i<$num_dates;$i++ )
{
/* if ( ($now_stamp >= intval( $red_data["reminder_start"]) && $now_stamp <= intval($red_data["reminder_end"]))
|| ( intval( $red_data["reminder_start"]) >= $now_start && intval($red_data["reminder_end"] <= $now_stop )) )*/
if (
( ( $red_data["reminder_start"] >= $view_start ) && ( $red_data["reminder_end"] <= $view_stop ) ) ||
( ( $red_data["reminder_start"] < $view_start ) && ( $red_data["reminder_end"] > $view_stop ) ) ||
( ( $red_data["reminder_start"] >= $view_start ) && ( $red_data["reminder_end"] >= $view_stop ) && ( $red_data["reminder_start"] <= $view_stop ) ) ||
( ( $red_data["reminder_start"] <= $view_start ) && ( $red_data["reminder_end"] <= $view_stop ) && ( $red_data["reminder_end"] >= $view_start ) )
)
{
$no_entries = false;
 
$date_str = "";
if ( $red_data["x24"] == "1" )
{
$d_start = gmdate("d.m.Y",$red_data["event_start"]);
$d_end = gmdate("d.m.Y",$red_data["event_end"]);
if ($d_start != $d_end)
{
$date_str .= $d_start . " -<br>" . $d_end;
} else $date_str .= $d_start;
}
else
{
$date_str = gmdate("d.m.Y H:i",$red_data["event_start"]);
if ($red_data["event_start"] != $red_data["event_end"])
{
$date_str .= " -<br>" . gmdate("d.m.Y H:i",$red_data["event_end"]);
}
}
if (eregi("image::",$red_data["status"]))
$status_txt = '<img src="'.$base_url["jax_cal"]."/".$status_img_dir."/".eregi_replace("image::","",$red_data["status"]).'">';
else
$status_txt = $red_data["status"];
$outputs = ' <tr class="line_color'.($ii % 2).'" valign="top">'."\n"
.' <td align="center" valign="top" class="status">'.$status_txt.'&nbsp;</td>'."\n"
.' <td class="date"><nobr>'.$date_str."</nobr></td>\n"
.' <td class="event"><a href="'.$PHP_SELF."?Y=$cal_year&m=$cal_month&d=$cal_day&do=show_event&key=".$red_data["event_key"]."&$ox_tail&evt_date=".urlencode($date_str).'&evt_title='.urlencode($red_data["event_title"]).'">'.$red_data["event_title"]."</a></td>\n </tr>\n". $outputs;
$ii++;
}
$calendar_list->get_next_entry( $red_data );
}
echo $outputs;
if ( $no_entries )
{
echo '<tr><td colspan="3" class="error_message">'.$loc_lang["no_entries"].'...</b></td></tr>';
}
echo "</table>\n</div></div>\n";
if ( $view_cal_select )
{
$ds = "&Y=$cal_year&m=$cal_month&d=$cal_day";
 
$view_select_html = <<<VIEWSELECT
<script language="JavaScript">
function go2link()
{
var thisform = document.cal_view
location.href="$PHP_SELF?$ds&$ox_tail&view="+
thisform.cal_view.options[thisform.cal_view.options.selectedIndex].value
}
</script>
<form name="cal_view" method="post" action="" class="cal_view_select" align="right">
{$loc_lang["calendar_view"]}:
<select name="cal_view" onchange="javascript:go2link();">
<option value="d1" $d1s>{$loc_lang["view_day"]}</option>
<option value="d30" $d30s>{$loc_lang["view_month"]}</option>
<option value="m12" $m12s>{$loc_lang["view_1year"]}</option>
</select>
</form>
 
VIEWSELECT;
 
echo <<<FOOTER
<table>
<tr><td>$view_select_html</td>
<td><script language="JavaScript" src="{$base_url["jax_cal"]}/modules/clean4print.js" type="text/javascript"></script>
<p align="right">&nbsp;&nbsp;<a href="javascript: Clean4Print('the_content');"><img src="{$base_url["jax_cal"]}/images/printer.gif" border="0" alt="Drucken" title="{$loc_lang["prepare_printing"]} (Netscape6/IE6)" width="16" height="14"></a>&nbsp;<a href="javascript: Clean4Print('the_content');">{$loc_lang["prepare_printing"]}</a></p>
</td>
<td><p align="right">&nbsp;&nbsp;<a href="{$_SERVER["PHP_SELF"]}?do=search_dates&Y=$cal_year&m=$cal_month&d=$cal_day&$ox_tail"><img src="{$base_url["jax_cal"]}/images/magnglass.gif" border="0" alt="{$loc_lang["search_dates"]}" title="{$loc_lang["search_dates"]}" width="16" height="14"></a>&nbsp;<a href="{$_SERVER["PHP_SELF"]}?do=search_dates&Y=$cal_year&m=$cal_month&d=$cal_day&$ox_tail">{$loc_lang["search_dates"]}</a></p></td></tr>
</table>
FOOTER;
}
echo "<!-- EVENT LIST (END) -->";
 
}
/**
* @return void
* @desc Shows the data of the selected event
*/
function show_event()
{
global $event_list, $cal_month, $cal_day, $cal_year,
$is_dst, $loc_lang, $ox_tail, $view_cal_select, $base_url;
 
if (!empty( $_GET["key"] ) ) $key = $_GET["key"]; else exit;
if (!empty( $_GET["evt_date"]) ) $evt_date = $_GET["evt_date"]; else $evt_date = "";
if (!empty( $_GET["evt_title"]) ) $evt_title = stripslashes( $_GET["evt_title"] ); else $evt_title = "";
$red_data = array();
$search_pattern = array();
$search_pattern["event_key"] = $key;
$pos = $event_list->find_entry( $search_pattern );
$event_list->get_entry( $pos, $red_data );
$ev_description = stripslashes( $red_data["event_description"] );
echo <<< TAB
<h3 class="event_list_title">{$loc_lang["dates_and_events"]}</h3>
<!-- EVENT INFO (START) -->
<div class="event_info">
<table width="100%" border="0" cellspacing="0" cellpadding="0" id="the_content">
<tr class="headings">
<td class="date">$evt_date</td>
<td class="title">$evt_title</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td class="description" colspan="2">$ev_description</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
</div>
TAB;
 
echo <<<FOOTER
<table>
<tr><td><p><a onClick="this.href='javascript:history.go(-1);'" href="{$_SERVER["$PHP_SELF"]}?Y=$cal_year&m=$cal_month&d=$cal_day&$ox_tail"><img src="{$base_url["jax_cal"]}/images/back.gif" border="0"></a>&nbsp;&nbsp;<a onClick="this.href='javascript:history.go(-1);'" href="{$_SERVER["$PHP_SELF"]}?Y=$cal_year&m=$cal_month&d=$cal_day&$ox_tail">{$loc_lang["back_to_index"]}</a></p></td>
<td><script language="JavaScript" src="{$base_url["jax_cal"]}/modules/clean4print.js" type="text/javascript"></script>
<p align="right">&nbsp;&nbsp;<a href="javascript: Clean4Print('the_content');"><img src="{$base_url["jax_cal"]}/images/printer.gif" border="0" alt="Drucken" title="{$loc_lang["prepare_printing"]} (Netscape6/IE6)" width="16" height="14"></a>&nbsp;<a href="javascript: Clean4Print('the_content');">{$loc_lang["prepare_printing"]}</a></p>
</td></tr></table>
FOOTER;
 
echo " <!-- EVENT INFO (STOP) -->";
}
 
/**
* @return void
* @desc Shows event search form
*/
function search_dates()
{
global $ox_tail;
echo <<<SUCHFELD
<form name="form1" method="post" action="{$_SERVER["PHP_SELF"]}?do=look_for&$ox_tail">
<input type="text" name="suchbegriff">
<input type="submit" name="search" value="Suchen">
</form>
SUCHFELD;
}
/**
* @return void
* @desc Shows the data of the selected event
*/
function look_for_dates()
{
global $calendar_list, $cal_month, $cal_day, $cal_year, $now_hour,$now_min, $now_sec,
$status_img_dir, $is_dst, $loc_lang, $ox_tail, $view_cal_select, $view_default, $view, $cal_next_month, $cal_next_year, $PHP_SELF, $base_url;
 
if (!empty($_POST["suchbegriff"])) $suchbegriff = $_POST["suchbegriff"]; else $suchbegriff="";
echo <<< TABLEHEAD
<h3 class="event_list_title">{$loc_lang["found_dates"]} ("$suchbegriff")</h3>
<!-- EVENT LIST (START) -->
<div class="event_list">
<div id="the_content">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr class="headings">
<td class="col_status"><img src="{$base_url["jax_cal"]}/images/1x1.gif" height="1" width="30">&nbsp;</td>
<td class="col_date">{$loc_lang["date"]}</td>
<td class="col_event">{$loc_lang["event"]}</td>
</tr>
TABLEHEAD;
 
$num_dates = $calendar_list->entries();
$red_data = array();
$calendar_list->get_entry(0,$red_data);
$no_entries = true;
$outputs = "";
$ii = 0; // used for line colouring!
for ( $i=0;$i<$num_dates;$i++ )
{
 
if ( !empty( $suchbegriff) && eregi( $suchbegriff, $red_data["event_title"] ) )
{
$no_entries = false;
 
$date_str = "";
if ( $red_data["x24"] == "1" )
{
$d_start = gmdate("d.m.Y",$red_data["event_start"]);
$d_end = gmdate("d.m.Y",$red_data["event_end"]);
if ($d_start != $d_end)
{
$date_str .= $d_start . " -<br>" . $d_end;
} else $date_str .= $d_start;
}
else
{
$date_str = gmdate("d.m.Y H:i",$red_data["event_start"]);
if ($red_data["event_start"] != $red_data["event_end"])
{
$date_str .= " -<br>" . gmdate("d.m.Y H:i",$red_data["event_end"]);
}
}
if (eregi("image::",$red_data["status"]))
$status_txt = '<img src="'.$base_url["jax_cal"]."/".$status_img_dir."/".eregi_replace("image::","",$red_data["status"]).'">';
else
$status_txt = $red_data["status"];
$outputs = ' <tr class="line_color'.($ii % 2).'" valign="top">'."\n"
.' <td align="center" valign="top" class="status">'.$status_txt.'&nbsp;</td>'."\n"
.' <td class="date"><nobr>'.$date_str."</nobr></td>\n"
.' <td class="event"><a href="'.$PHP_SELF."?Y=$cal_year&m=$cal_month&d=$cal_day&do=show_event&key=".$red_data["event_key"]."&$ox_tail&evt_date=".urlencode($date_str).'&evt_title='.urlencode($red_data["event_title"]).'">'.$red_data["event_title"]."</a></td>\n </tr>\n". $outputs;
$ii++;
}
$calendar_list->get_next_entry( $red_data );
}
echo $outputs;
if ( $no_entries )
{
echo '<tr><td colspan="3" class="error_message">'.$loc_lang["err_no_dates_found"]." (\"$suchbegriff\")".'...</b></td></tr>';
}
echo "</table>\n</div></div>\n";
if ( $view_cal_select )
{
$ds = "&Y=$cal_year&m=$cal_month&d=$cal_day";
 
$view_select_html = <<<VIEWSELECT
<script language="JavaScript">
function go2link()
{
var thisform = document.cal_view
location.href="$PHP_SELF?$ds&$ox_tail&view="+
thisform.cal_view.options[thisform.cal_view.options.selectedIndex].value
}
</script>
<form name="cal_view" method="post" action="" class="cal_view_select" align="right">
{$loc_lang["calendar_view"]}:
<select name="cal_view" onchange="javascript:go2link();">
<option value="d1" $d1s>{$loc_lang["view_day"]}</option>
<option value="d30" $d30s>{$loc_lang["view_month"]}</option>
<option value="m12" $m12s>{$loc_lang["view_1year"]}</option>
</select>
</form>
 
VIEWSELECT;
 
echo <<<FOOTER
<table>
<tr><td>$view_select_html</td>
<td><script language="JavaScript" src="{$base_url["jax_cal"]}/modules/clean4print.js" type="text/javascript"></script>
<p align="right">&nbsp;&nbsp;<a href="javascript: Clean4Print('the_content');"><img src="{$base_url["jax_cal"]}/images/printer.gif" border="0" alt="Drucken" title="{$loc_lang["prepare_printing"]} (Netscape6/IE6)" width="16" height="14"></a>&nbsp;<a href="javascript: Clean4Print('the_content');">{$loc_lang["prepare_printing"]}</a></p>
</td>
<td><p align="right">&nbsp;&nbsp;<a href="{$_SERVER["PHP_SELF"]}?do=search_dates&Y=$cal_year&m=$cal_month&d=$cal_day&$ox_tail"><img src="{$base_url["jax_cal"]}/images/magnglass.gif" border="0" alt="{$loc_lang["search_dates"]}" title="{$loc_lang["search_dates"]}" width="16" height="14"></a>&nbsp;<a href="{$_SERVER["PHP_SELF"]}?do=search_dates&Y=$cal_year&m=$cal_month&d=$cal_day&$ox_tail">{$loc_lang["search_dates"]}</a></p></td></tr></table>
FOOTER;
}
echo "<!-- EVENT LIST (END) -->";
 
}
 
switch ( trim($do) )
{
case "show_event" : show_event();
break;
case "show_list" : show_list();
break;
case "search_dates" : search_dates();
break;
case "look_for" : look_for_dates();
break;
}
?>
 
<!-- Please don't remove the link to the author's website!!! -->
<p class="author_info">Jax Calendar v1.34, by Jack (tR), <a href="http://www.jtr.de/scripting/php">www.jtr.de/scripting/php</a></p>
/kalender/modules/htmlarea/editor.js
0,0 → 1,1098
//
// htmlArea v2.02 - Copyright (c) 2002 interactivetools.com, inc.
// This copyright notice MUST stay intact for use (see license.txt).
//
// A free WYSIWYG editor replacement for <textarea> fields.
// For full source code and docs, visit http://www.interactivetools.com/
//
 
// write out styles for UI buttons
document.write('<style type="text/css">\n');
document.write('.btn { width: 22px; height: 22px; border: 1px solid buttonface; margin: 0; padding: 0; }\n');
document.write('.btnOver { width: 22px; height: 22px; border: 1px outset; }\n');
document.write('.btnDown { width: 22px; height: 22px; border: 1px inset; background-color: buttonhighlight; }\n');
document.write('.btnNA { width: 22px; height: 22px; border: 1px solid buttonface; filter: alpha(opacity=25); }\n');
document.write('.cMenu { background-color: threedface; color: menutext; cursor: Default; font-family: MS Sans Serif; font-size: 8pt; padding: 2 12 2 16; }');
document.write('.cMenuOver { background-color: highlight; color: highlighttext; cursor: Default; font-family: MS Sans Serif; font-size: 8pt; padding: 2 12 2 16; }');
document.write('.cMenuDivOuter { background-color: threedface; height: 9 }');
document.write('.cMenuDivInner { margin: 0 4 0 4; border-width: 1; border-style: solid; border-color: threedshadow threedhighlight threedhighlight threedshadow; }');
document.write('</style>\n');
 
 
/* ---------------------------------------------------------------------- *\
Function : editor_defaultConfig
Description : default configuration settings for wysiwyg editor
\* ---------------------------------------------------------------------- */
 
function editor_defaultConfig(objname) {
 
this.version = "2.02"
 
this.width = "auto";
this.height = "auto";
this.bodyStyle = 'background-color: #FFFFFF; font-family: "Verdana"; font-size: x-small;';
this.imgURL = _editor_url + 'images/';
this.debug = 0;
 
this.replaceNextlines = 0; // replace nextlines from spaces (on output)
this.plaintextInput = 0; // replace nextlines with breaks (on input)
 
this.toolbar = [
['fontname'],
['fontsize'],
// ['fontstyle'],
// ['linebreak'],
['bold','italic','underline','separator'],
// ['strikethrough','subscript','superscript','separator'],
['justifyleft','justifycenter','justifyright','separator'],
['OrderedList','UnOrderedList','Outdent','Indent','separator'],
['forecolor','backcolor','separator'],
['HorizontalRule','Createlink','InsertImage','InsertTable','htmlmode','separator'],
// ['custom1','custom2','custom3','separator'],
['popupeditor','about']];
 
this.fontnames = {
"Arial": "arial, helvetica, sans-serif",
"Courier New": "courier new, courier, mono",
"Georgia": "Georgia, Times New Roman, Times, Serif",
"Tahoma": "Tahoma, Arial, Helvetica, sans-serif",
"Times New Roman": "times new roman, times, serif",
"Verdana": "Verdana, Arial, Helvetica, sans-serif",
"impact": "impact",
"WingDings": "WingDings"};
 
this.fontsizes = {
"1 (8 pt)": "1",
"2 (10 pt)": "2",
"3 (12 pt)": "3",
"4 (14 pt)": "4",
"5 (18 pt)": "5",
"6 (24 pt)": "6",
"7 (36 pt)": "7"
};
 
//this.stylesheet = "http://www.domain.com/sample.css"; // full URL to stylesheet
 
this.fontstyles = [ // make sure these exist in the header of page the content is being display as well in or they won't work!
// { name: "headline", className: "headline", classStyle: "font-family: arial black, arial; font-size: 28px; letter-spacing: -2px;" },
// { name: "arial red", className: "headline2", classStyle: "font-family: arial black, arial; font-size: 12px; letter-spacing: -2px; color:red" },
// { name: "verdana blue", className: "headline4", classStyle: "font-family: verdana; font-size: 18px; letter-spacing: -2px; color:blue" },
];
 
this.btnList = {
// buttonName: commandID, title, onclick, image,
"bold": ['Bold', 'Bold', 'editor_action(this.id)', 'ed_format_bold.gif'],
"italic": ['Italic', 'Italic', 'editor_action(this.id)', 'ed_format_italic.gif'],
"underline": ['Underline', 'Underline', 'editor_action(this.id)', 'ed_format_underline.gif'],
"strikethrough": ['StrikeThrough', 'Strikethrough', 'editor_action(this.id)', 'ed_format_strike.gif'],
"subscript": ['SubScript', 'Subscript', 'editor_action(this.id)', 'ed_format_sub.gif'],
"superscript": ['SuperScript', 'Superscript', 'editor_action(this.id)', 'ed_format_sup.gif'],
"justifyleft": ['JustifyLeft', 'Justify Left', 'editor_action(this.id)', 'ed_align_left.gif'],
"justifycenter": ['JustifyCenter', 'Justify Center', 'editor_action(this.id)', 'ed_align_center.gif'],
"justifyright": ['JustifyRight', 'Justify Right', 'editor_action(this.id)', 'ed_align_right.gif'],
"orderedlist": ['InsertOrderedList', 'Ordered List', 'editor_action(this.id)', 'ed_list_num.gif'],
"unorderedlist": ['InsertUnorderedList', 'Bulleted List', 'editor_action(this.id)', 'ed_list_bullet.gif'],
"outdent": ['Outdent', 'Decrease Indent', 'editor_action(this.id)', 'ed_indent_less.gif'],
"indent": ['Indent', 'Increase Indent', 'editor_action(this.id)', 'ed_indent_more.gif'],
"forecolor": ['ForeColor', 'Font Color', 'editor_action(this.id)', 'ed_color_fg.gif'],
"backcolor": ['BackColor', 'Background Color', 'editor_action(this.id)', 'ed_color_bg.gif'],
"horizontalrule": ['InsertHorizontalRule', 'Horizontal Rule', 'editor_action(this.id)', 'ed_hr.gif'],
"createlink": ['CreateLink', 'Insert Web Link', 'editor_action(this.id)', 'ed_link.gif'],
"insertimage": ['InsertImage', 'Insert Image', 'editor_action(this.id)', 'ed_image.gif'],
"inserttable": ['InsertTable', 'Insert Table', 'editor_action(this.id)', 'insert_table.gif'],
"htmlmode": ['HtmlMode', 'View HTML Source', 'editor_setmode(\''+objname+'\')', 'ed_html.gif'],
"popupeditor": ['popupeditor', 'Enlarge Editor', 'editor_action(this.id)', 'fullscreen_maximize.gif'],
"about": ['about', 'About this editor', 'editor_about(\''+objname+'\')', 'ed_about.gif'],
 
// Add custom buttons here:
"custom1": ['custom1', 'Purpose of button 1', 'editor_action(this.id)', 'ed_custom.gif'],
"custom2": ['custom2', 'Purpose of button 2', 'editor_action(this.id)', 'ed_custom.gif'],
"custom3": ['custom3', 'Purpose of button 3', 'editor_action(this.id)', 'ed_custom.gif'],
// end: custom buttons
 
"help": ['showhelp', 'Help using editor', 'editor_action(this.id)', 'ed_help.gif']};
 
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_generate
Description : replace textarea with wysiwyg editor
Usage : editor_generate("textarea_id",[height],[width]);
Arguments : objname - ID of textarea to replace
w - width of wysiwyg editor
h - height of wysiwyg editor
\* ---------------------------------------------------------------------- */
 
 
function editor_generate(objname,userConfig) {
 
// Default Settings
var config = new editor_defaultConfig(objname);
if (userConfig) {
for (var thisName in userConfig) {
if (userConfig[thisName]) { config[thisName] = userConfig[thisName]; }
}
}
document.all[objname].config = config; // store config settings
 
// set size to specified size or size of original object
var obj = document.all[objname];
if (!config.width || config.width == "auto") {
if (obj.style.width) { config.width = obj.style.width; } // use css style
else if (obj.cols) { config.width = (obj.cols * 8) + 22; } // col width + toolbar
else { config.width = '100%'; } // default
}
if (!config.height || config.height == "auto") {
if (obj.style.height) { config.height = obj.style.height; } // use css style
else if (obj.rows) { config.height = obj.rows * 17 } // row height
else { config.height = '200'; } // default
}
 
var tblOpen = '<table border=0 cellspacing=0 cellpadding=0 style="float: left;" unselectable="on"><tr><td style="border: none; padding: 1 0 0 0"><nobr>';
var tblClose = '</nobr></td></tr></table>\n';
 
// build button toolbar
 
var toolbar = '';
var btnGroup, btnItem, aboutEditor;
for (var btnGroup in config.toolbar) {
 
// linebreak
if (config.toolbar[btnGroup].length == 1 &&
config.toolbar[btnGroup][0].toLowerCase() == "linebreak") {
toolbar += '<br clear="all">';
continue;
}
 
toolbar += tblOpen;
for (var btnItem in config.toolbar[btnGroup]) {
var btnName = config.toolbar[btnGroup][btnItem].toLowerCase();
 
// fontname
if (btnName == "fontname") {
toolbar += '<select id="_' +objname+ '_FontName" onChange="editor_action(this.id)" unselectable="on" style="margin: 1 2 0 2; font-size: 12px;">';
for (var fontname in config.fontnames) {
toolbar += '<option value="' +config.fontnames[fontname]+ '">' +fontname+ '</option>'
}
toolbar += '</select>';
continue;
}
 
// fontsize
if (btnName == "fontsize") {
toolbar += '<select id="_' +objname+ '_FontSize" onChange="editor_action(this.id)" unselectable="on" style="margin: 1 2 0 0; font-size: 12px;">';
for (var fontsize in config.fontsizes) {
toolbar += '<option value="' +config.fontsizes[fontsize]+ '">' +fontsize+ '</option>'
}
toolbar += '</select>\n';
continue;
}
 
// font style
if (btnName == "fontstyle") {
toolbar += '<select id="_' +objname+ '_FontStyle" onChange="editor_action(this.id)" unselectable="on" style="margin: 1 2 0 0; font-size: 12px;">';
+ '<option value="">Font Style</option>';
for (var i in config.fontstyles) {
var fontstyle = config.fontstyles[i];
toolbar += '<option value="' +fontstyle.className+ '">' +fontstyle.name+ '</option>'
}
toolbar += '</select>';
continue;
}
 
// separator
if (btnName == "separator") {
toolbar += '<span style="border: 1px inset; width: 1px; font-size: 16px; height: 16px; margin: 0 3 0 3"></span>';
continue;
}
 
// buttons
var btnObj = config.btnList[btnName];
if (btnName == 'linebreak') { alert("htmlArea error: 'linebreak' must be in a subgroup by itself, not with other buttons.\n\nhtmlArea wysiwyg editor not created."); return; }
if (!btnObj) { alert("htmlArea error: button '" +btnName+ "' not found in button list when creating the wysiwyg editor for '"+objname+"'.\nPlease make sure you entered the button name correctly.\n\nhtmlArea wysiwyg editor not created."); return; }
var btnCmdID = btnObj[0];
var btnTitle = btnObj[1];
var btnOnClick = btnObj[2];
var btnImage = btnObj[3];
toolbar += '<button title="' +btnTitle+ '" id="_' +objname+ '_' +btnCmdID+ '" class="btn" onClick="' +btnOnClick+ '" onmouseover="if(this.className==\'btn\'){this.className=\'btnOver\'}" onmouseout="if(this.className==\'btnOver\'){this.className=\'btn\'}" unselectable="on"><img src="' +config.imgURL + btnImage+ '" border=0 unselectable="on"></button>';
 
 
} // end of button sub-group
toolbar += tblClose;
} // end of entire button set
 
// build editor
 
var editor = '<span id="_editor_toolbar"><table border=0 cellspacing=0 cellpadding=0 bgcolor="buttonface" style="padding: 1 0 0 2" width=' + config.width + ' unselectable="on"><tr><td>\n'
+ toolbar
+ '</td></tr></table>\n'
+ '</td></tr></table></span>\n'
+ '<textarea ID="_' +objname + '_editor" style="width:' +config.width+ '; height:' +config.height+ '; margin-top: -1px; margin-bottom: -1px;" wrap=soft></textarea>';
 
// add context menu
editor += '<div id="_' +objname + '_cMenu" style="position: absolute; visibility: hidden;"></div>';
 
// hide original textarea and insert htmlarea after it
if (!config.debug) { document.all[objname].style.display = "none"; }
 
if (config.plaintextInput) { // replace nextlines with breaks
var contents = document.all[objname].value;
contents = contents.replace(/\r\n/g, '<br>');
contents = contents.replace(/\n/g, '<br>');
contents = contents.replace(/\r/g, '<br>');
document.all[objname].value = contents;
}
 
// insert wysiwyg
document.all[objname].insertAdjacentHTML('afterEnd', editor)
 
// convert htmlarea from textarea to wysiwyg editor
editor_setmode(objname, 'init');
 
// call filterOutput when user submits form
for (var idx=0; idx < document.forms.length; idx++) {
var r = document.forms[idx].attachEvent('onsubmit', function() { editor_filterOutput(objname); });
if (!r) { alert("Error attaching event to form!"); }
}
 
return true;
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_action
Description : perform an editor command on selected editor content
Usage :
Arguments : button_id - button id string with editor and action name
\* ---------------------------------------------------------------------- */
 
function editor_action(button_id) {
 
// split up button name into "editorID" and "cmdID"
var BtnParts = Array();
BtnParts = button_id.split("_");
var objname = button_id.replace(/^_(.*)_[^_]*$/, '$1');
var cmdID = BtnParts[ BtnParts.length-1 ];
var button_obj = document.all[button_id];
var editor_obj = document.all["_" +objname + "_editor"];
var config = document.all[objname].config;
 
// help popup
if (cmdID == 'showhelp') {
window.open(_editor_url + "popups/editor_help.html", 'EditorHelp');
return;
}
 
// popup editor
if (cmdID == 'popupeditor') {
window.open(_editor_url + "popups/fullscreen.html?"+objname,
'FullScreen',
'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=640,height=480');
return;
}
 
// check editor mode (don't perform actions in textedit mode)
if (editor_obj.tagName.toLowerCase() == 'textarea') { return; }
 
var editdoc = editor_obj.contentWindow.document;
editor_focus(editor_obj);
 
// get index and value for pulldowns
var idx = button_obj.selectedIndex;
var val = (idx != null) ? button_obj[ idx ].value : null;
 
if (0) {} // use else if for easy cutting and pasting
 
//
// CUSTOM BUTTONS START HERE
//
 
// Custom1
else if (cmdID == 'custom1') {
alert("Hello, I am custom button 1!");
}
 
// Custom2
else if (cmdID == 'custom2') { // insert some text from a popup window
var myTitle = "This is a custom title";
var myText = showModalDialog(_editor_url + "popups/custom2.html",
myTitle, // str or obj specified here can be read from dialog as "window.dialogArguments"
"resizable: yes; help: no; status: no; scroll: no; ");
if (myText) { editor_insertHTML(objname, myText); }
}
 
// Custom3
else if (cmdID == 'custom3') { // insert some text
editor_insertHTML(objname, "It's easy to add buttons that insert text!");
}
 
//
// END OF CUSTOM BUTTONS
//
 
// FontName
else if (cmdID == 'FontName' && val) {
editdoc.execCommand(cmdID,0,val);
}
 
// FontSize
else if (cmdID == 'FontSize' && val) {
editdoc.execCommand(cmdID,0,val);
}
 
// FontStyle (change CSS className)
else if (cmdID == 'FontStyle' && val) {
editdoc.execCommand('RemoveFormat');
editdoc.execCommand('FontName',0,'636c6173734e616d6520706c616365686f6c646572');
var fontArray = editdoc.all.tags("FONT");
for (i=0; i<fontArray.length; i++) {
if (fontArray[i].face == '636c6173734e616d6520706c616365686f6c646572') {
fontArray[i].face = "";
fontArray[i].className = val;
fontArray[i].outerHTML = fontArray[i].outerHTML.replace(/face=['"]+/, "");
}
}
button_obj.selectedIndex =0;
}
 
// fgColor and bgColor
else if (cmdID == 'ForeColor' || cmdID == 'BackColor') {
var oldcolor = _dec_to_rgb(editdoc.queryCommandValue(cmdID));
var newcolor = showModalDialog(_editor_url + "popups/select_color.html", oldcolor, "resizable: no; help: no; status: no; scroll: no;");
if (newcolor != null) { editdoc.execCommand(cmdID, false, "#"+newcolor); }
}
 
// execute command for buttons - if we didn't catch the cmdID by here we'll assume it's a
// commandID and pass it to execCommand(). See http://msdn.microsoft.com/workshop/author/dhtml/reference/commandids.asp
else {
// subscript & superscript, disable one before enabling the other
if (cmdID.toLowerCase() == 'subscript' && editdoc.queryCommandState('superscript')) { editdoc.execCommand('superscript'); }
if (cmdID.toLowerCase() == 'superscript' && editdoc.queryCommandState('subscript')) { editdoc.execCommand('subscript'); }
 
// insert link
if (cmdID.toLowerCase() == 'createlink'){
editdoc.execCommand(cmdID,1);
}
 
// insert image
else if (cmdID.toLowerCase() == 'insertimage'){
showModalDialog(_editor_url + "popups/insert_image.html", editdoc, "resizable: no; help: no; status: no; scroll: no; ");
}
 
// insert table
else if (cmdID.toLowerCase() == 'inserttable'){
showModalDialog(_editor_url + "popups/insert_table.html?"+objname,
window,
"resizable: yes; help: no; status: no; scroll: no; ");
}
 
// all other commands microsoft Command Identifiers
else { editdoc.execCommand(cmdID); }
}
 
editor_event(objname);
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_event
Description : called everytime an editor event occurs
Usage : editor_event(objname, runDelay, eventName)
Arguments : objname - ID of textarea to replace
runDelay: -1 = run now, no matter what
0 = run now, if allowed
1000 = run in 1 sec, if allowed at that point
\* ---------------------------------------------------------------------- */
 
function editor_event(objname,runDelay) {
var config = document.all[objname].config;
var editor_obj = document.all["_" +objname+ "_editor"]; // html editor object
if (runDelay == null) { runDelay = 0; }
var editdoc;
var editEvent = editor_obj.contentWindow ? editor_obj.contentWindow.event : event;
 
// catch keypress events
if (editEvent && editEvent.keyCode) {
var ord = editEvent.keyCode; // ascii order of key pressed
var ctrlKey = editEvent.ctrlKey;
var altKey = editEvent.altKey;
var shiftKey = editEvent.shiftKey;
 
if (ord == 16) { return; } // ignore shift key by itself
if (ord == 17) { return; } // ignore ctrl key by itself
if (ord == 18) { return; } // ignore alt key by itself
 
 
// cancel ENTER key and insert <BR> instead
// if (ord == 13 && editEvent.type == 'keypress') {
// editEvent.returnValue = false;
// editor_insertHTML(objname, "<br>");
// return;
// }
 
if (ctrlKey && (ord == 122 || ord == 90)) { // catch ctrl-z (UNDO)
// TODO: Add our own undo/redo functionality
// editEvent.cancelBubble = true;
return;
}
if ((ctrlKey && (ord == 121 || ord == 89)) ||
ctrlKey && shiftKey && (ord == 122 || ord == 90)) { // catch ctrl-y, ctrl-shift-z (REDO)
// TODO: Add our own undo/redo functionality
return;
}
}
 
// setup timer for delayed updates (some events take time to complete)
if (runDelay > 0) { return setTimeout(function(){ editor_event(objname); }, runDelay); }
 
// don't execute more than 3 times a second (eg: too soon after last execution)
if (this.tooSoon == 1 && runDelay >= 0) { this.queue = 1; return; } // queue all but urgent events
this.tooSoon = 1;
setTimeout(function(){
this.tooSoon = 0;
if (this.queue) { editor_event(objname,-1); };
this.queue = 0;
}, 333); // 1/3 second
 
 
editor_updateOutput(objname);
editor_updateToolbar(objname);
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_updateToolbar
Description : update toolbar state
Usage :
Arguments : objname - ID of textarea to replace
action - enable, disable, or update (default action)
\* ---------------------------------------------------------------------- */
 
function editor_updateToolbar(objname,action) {
var config = document.all[objname].config;
var editor_obj = document.all["_" +objname+ "_editor"];
 
// disable or enable toolbar
 
if (action == "enable" || action == "disable") {
var tbItems = new Array('FontName','FontSize','FontStyle'); // add pulldowns
for (var btnName in config.btnList) { tbItems.push(config.btnList[btnName][0]); } // add buttons
 
for (var idxN in tbItems) {
var cmdID = tbItems[idxN].toLowerCase();
var tbObj = document.all["_" +objname+ "_" +tbItems[idxN]];
if (cmdID == "htmlmode" || cmdID == "about" || cmdID == "showhelp" || cmdID == "popupeditor") { continue; } // don't change these buttons
if (tbObj == null) { continue; }
var isBtn = (tbObj.tagName.toLowerCase() == "button") ? true : false;
 
if (action == "enable") { tbObj.disabled = false; if (isBtn) { tbObj.className = 'btn' }}
if (action == "disable") { tbObj.disabled = true; if (isBtn) { tbObj.className = 'btnNA' }}
}
return;
}
 
// update toolbar state
 
if (editor_obj.tagName.toLowerCase() == 'textarea') { return; } // don't update state in textedit mode
var editdoc = editor_obj.contentWindow.document;
 
// Set FontName pulldown
var fontname_obj = document.all["_" +objname+ "_FontName"];
if (fontname_obj) {
var fontname = editdoc.queryCommandValue('FontName');
if (fontname == null) { fontname_obj.value = null; }
else {
var found = 0;
for (i=0; i<fontname_obj.length; i++) {
if (fontname.toLowerCase() == fontname_obj[i].text.toLowerCase()) {
fontname_obj.selectedIndex = i;
found = 1;
}
}
if (found != 1) { fontname_obj.value = null; } // for fonts not in list
}
}
 
// Set FontSize pulldown
var fontsize_obj = document.all["_" +objname+ "_FontSize"];
if (fontsize_obj) {
var fontsize = editdoc.queryCommandValue('FontSize');
if (fontsize == null) { fontsize_obj.value = null; }
else {
var found = 0;
for (i=0; i<fontsize_obj.length; i++) {
if (fontsize == fontsize_obj[i].value) { fontsize_obj.selectedIndex = i; found=1; }
}
if (found != 1) { fontsize_obj.value = null; } // for sizes not in list
}
}
 
// Set FontStyle pulldown
var classname_obj = document.all["_" +objname+ "_FontStyle"];
if (classname_obj) {
var curRange = editdoc.selection.createRange();
 
// check element and element parents for class names
var pElement;
if (curRange.length) { pElement = curRange[0]; } // control tange
else { pElement = curRange.parentElement(); } // text range
while (pElement && !pElement.className) { pElement = pElement.parentElement; } // keep going up
 
var thisClass = pElement ? pElement.className.toLowerCase() : "";
if (!thisClass && classname_obj.value) { classname_obj.value = null; }
else {
var found = 0;
for (i=0; i<classname_obj.length; i++) {
if (thisClass == classname_obj[i].value.toLowerCase()) {
classname_obj.selectedIndex = i;
found=1;
}
}
if (found != 1) { classname_obj.value = null; } // for classes not in list
}
}
 
// update button states
var IDList = Array('Bold','Italic','Underline','StrikeThrough','SubScript','SuperScript','JustifyLeft','JustifyCenter','JustifyRight','InsertOrderedList','InsertUnorderedList');
for (i=0; i<IDList.length; i++) {
var btnObj = document.all["_" +objname+ "_" +IDList[i]];
if (btnObj == null) { continue; }
var cmdActive = editdoc.queryCommandState( IDList[i] );
 
if (!cmdActive) { // option is OK
if (btnObj.className != 'btn') { btnObj.className = 'btn'; }
if (btnObj.disabled != false) { btnObj.disabled = false; }
} else if (cmdActive) { // option already applied or mixed content
if (btnObj.className != 'btnDown') { btnObj.className = 'btnDown'; }
if (btnObj.disabled != false) { btnObj.disabled = false; }
}
}
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_updateOutput
Description : update hidden output field with data from wysiwg
\* ---------------------------------------------------------------------- */
 
function editor_updateOutput(objname) {
var config = document.all[objname].config;
var editor_obj = document.all["_" +objname+ "_editor"]; // html editor object
var editEvent = editor_obj.contentWindow ? editor_obj.contentWindow.event : event;
var isTextarea = (editor_obj.tagName.toLowerCase() == 'textarea');
var editdoc = isTextarea ? null : editor_obj.contentWindow.document;
 
// get contents of edit field
var contents;
if (isTextarea) { contents = editor_obj.value; }
else { contents = editdoc.body.innerHTML; }
 
// check if contents has changed since the last time we ran this routine
if (config.lastUpdateOutput && config.lastUpdateOutput == contents) { return; }
else { config.lastUpdateOutput = contents; }
 
// update hidden output field
document.all[objname].value = contents;
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_filterOutput
Description :
\* ---------------------------------------------------------------------- */
 
function editor_filterOutput(objname) {
editor_updateOutput(objname);
var contents = document.all[objname].value;
var config = document.all[objname].config;
 
// ignore blank contents
if (contents.toLowerCase() == '<p>&nbsp;</p>') { contents = ""; }
 
// filter tag - this code is run for each HTML tag matched
var filterTag = function(tagBody,tagName,tagAttr) {
tagName = tagName.toLowerCase();
var closingTag = (tagBody.match(/^<\//)) ? true : false;
 
// fix placeholder URLS - remove absolute paths that IE adds
if (tagName == 'img') { tagBody = tagBody.replace(/(src\s*=\s*.)[^*]*(\*\*\*)/, "$1$2"); }
if (tagName == 'a') { tagBody = tagBody.replace(/(href\s*=\s*.)[^*]*(\*\*\*)/, "$1$2"); }
 
// add additional tag filtering here
 
// convert to vbCode
// if (tagName == 'b' || tagName == 'strong') {
// if (closingTag) { tagBody = "[/b]"; } else { tagBody = "[b]"; }
// }
// else if (tagName == 'i' || tagName == 'em') {
// if (closingTag) { tagBody = "[/i]"; } else { tagBody = "[i]"; }
// }
// else if (tagName == 'u') {
// if (closingTag) { tagBody = "[/u]"; } else { tagBody = "[u]"; }
// }
// else {
// tagBody = ""; // disallow all other tags!
// }
 
return tagBody;
};
 
// match tags and call filterTag
RegExp.lastIndex = 0;
var matchTag = /<\/?(\w+)((?:[^'">]*|'[^']*'|"[^"]*")*)>/g; // this will match tags, but still doesn't handle container tags (textarea, comments, etc)
 
contents = contents.replace(matchTag, filterTag);
 
// remove nextlines from output (if requested)
if (config.replaceNextlines) {
contents = contents.replace(/\r\n/g, ' ');
contents = contents.replace(/\n/g, ' ');
contents = contents.replace(/\r/g, ' ');
}
 
// update output with filtered content
document.all[objname].value = contents;
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_setmode
Description : change mode between WYSIWYG and HTML editor
Usage : editor_setmode(objname, mode);
Arguments : objname - button id string with editor and action name
mode - init, textedit, or wysiwyg
\* ---------------------------------------------------------------------- */
 
function editor_setmode(objname, mode) {
var config = document.all[objname].config;
var editor_obj = document.all["_" +objname + "_editor"];
 
// wait until document is fully loaded
if (document.readyState != 'complete') {
setTimeout(function() { editor_setmode(objname,mode) }, 25);
return;
}
 
// define different editors
var TextEdit = '<textarea ID="_' +objname + '_editor" style="width:' +editor_obj.style.width+ '; height:' +editor_obj.style.height+ '; margin-top: -1px; margin-bottom: -1px;"></textarea>';
var RichEdit = '<iframe ID="_' +objname+ '_editor" style="width:' +editor_obj.style.width+ '; height:' +editor_obj.style.height+ ';"></iframe>';
 
// src="' +_editor_url+ 'popups/blank.html"
 
//
// Switch to TEXTEDIT mode
//
 
if (mode == "textedit" || editor_obj.tagName.toLowerCase() == 'iframe') {
config.mode = "textedit";
var editdoc = editor_obj.contentWindow.document;
var contents = editdoc.body.createTextRange().htmlText;
editor_obj.outerHTML = TextEdit;
editor_obj = document.all["_" +objname + "_editor"];
editor_obj.value = contents;
editor_event(objname);
 
editor_updateToolbar(objname, "disable"); // disable toolbar items
 
// set event handlers
editor_obj.onkeydown = function() { editor_event(objname); }
editor_obj.onkeypress = function() { editor_event(objname); }
editor_obj.onkeyup = function() { editor_event(objname); }
editor_obj.onmouseup = function() { editor_event(objname); }
editor_obj.ondrop = function() { editor_event(objname, 100); } // these events fire before they occur
editor_obj.oncut = function() { editor_event(objname, 100); }
editor_obj.onpaste = function() { editor_event(objname, 100); }
editor_obj.onblur = function() { editor_event(objname, -1); }
 
editor_updateOutput(objname);
editor_focus(editor_obj);
}
 
//
// Switch to WYSIWYG mode
//
 
else {
config.mode = "wysiwyg";
var contents = editor_obj.value;
if (mode == 'init') { contents = document.all[objname].value; } // on init use original textarea content
 
// create editor
editor_obj.outerHTML = RichEdit;
editor_obj = document.all["_" +objname + "_editor"];
 
// get iframe document object
 
// create editor contents (and default styles for editor)
var html = "";
html += '<html><head>\n';
if (config.stylesheet) {
html += '<link href="' +config.stylesheet+ '" rel="stylesheet" type="text/css">\n';
}
html += '<style>\n';
html += 'body {' +config.bodyStyle+ '} \n';
for (var i in config.fontstyles) {
var fontstyle = config.fontstyles[i];
if (fontstyle.classStyle) {
html += '.' +fontstyle.className+ ' {' +fontstyle.classStyle+ '}\n';
}
}
html += '</style>\n'
+ '</head>\n'
+ '<body contenteditable="true" topmargin=1 leftmargin=1'
 
// still working on this
// + ' oncontextmenu="parent.editor_cMenu_generate(window,\'' +objname+ '\');"'
+'>'
+ contents
+ '</body>\n'
+ '</html>\n';
 
// write to editor window
var editdoc = editor_obj.contentWindow.document;
 
editdoc.open();
editdoc.write(html);
editdoc.close();
 
editor_updateToolbar(objname, "enable"); // enable toolbar items
 
// store objname under editdoc
editdoc.objname = objname;
 
// set event handlers
editdoc.onkeydown = function() { editor_event(objname); }
editdoc.onkeypress = function() { editor_event(objname); }
editdoc.onkeyup = function() { editor_event(objname); }
editdoc.onmouseup = function() { editor_event(objname); }
editdoc.body.ondrop = function() { editor_event(objname, 100); } // these events fire before they occur
editdoc.body.oncut = function() { editor_event(objname, 100); }
editdoc.body.onpaste = function() { editor_event(objname, 100); }
editdoc.body.onblur = function() { editor_event(objname, -1); }
 
// bring focus to editor
if (mode != 'init') { // don't focus on page load, only on mode switch
editor_focus(editor_obj);
}
 
}
 
// Call update UI
if (mode != 'init') { // don't update UI on page load, only on mode switch
editor_event(objname);
}
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_focus
Description : bring focus to the editor
Usage : editor_focus(editor_obj);
Arguments : editor_obj - editor object
\* ---------------------------------------------------------------------- */
 
function editor_focus(editor_obj) {
 
// check editor mode
if (editor_obj.tagName.toLowerCase() == 'textarea') { // textarea
var myfunc = function() { editor_obj.focus(); };
setTimeout(myfunc,100); // doesn't work all the time without delay
}
 
else { // wysiwyg
var editdoc = editor_obj.contentWindow.document; // get iframe editor document object
var editorRange = editdoc.body.createTextRange(); // editor range
var curRange = editdoc.selection.createRange(); // selection range
 
if (curRange.length == null && // make sure it's not a controlRange
!editorRange.inRange(curRange)) { // is selection in editor range
editorRange.collapse(); // move to start of range
editorRange.select(); // select
curRange = editorRange;
}
}
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_about
Description : display "about this editor" popup
\* ---------------------------------------------------------------------- */
 
function editor_about(objname) {
showModalDialog(_editor_url + "popups/about.html", window, "resizable: yes; help: no; status: no; scroll: no; ");
}
 
/* ---------------------------------------------------------------------- *\
Function : _dec_to_rgb
Description : convert dec color value to rgb hex
Usage : var hex = _dec_to_rgb('65535'); // returns FFFF00
Arguments : value - dec value
\* ---------------------------------------------------------------------- */
 
function _dec_to_rgb(value) {
var hex_string = "";
for (var hexpair = 0; hexpair < 3; hexpair++) {
var myByte = value & 0xFF; // get low byte
value >>= 8; // drop low byte
var nybble2 = myByte & 0x0F; // get low nybble (4 bits)
var nybble1 = (myByte >> 4) & 0x0F; // get high nybble
hex_string += nybble1.toString(16); // convert nybble to hex
hex_string += nybble2.toString(16); // convert nybble to hex
}
return hex_string.toUpperCase();
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_insertHTML
Description : insert string at current cursor position in editor. If
two strings are specifed, surround selected text with them.
Usage : editor_insertHTML(objname, str1, [str2], reqSelection)
Arguments : objname - ID of textarea
str1 - HTML or text to insert
str2 - HTML or text to insert (optional argument)
reqSelection - (1 or 0) give error if no text selected
\* ---------------------------------------------------------------------- */
 
function editor_insertHTML(objname, str1,str2, reqSel) {
var config = document.all[objname].config;
var editor_obj = document.all["_" +objname + "_editor"]; // editor object
if (str1 == null) { str1 = ''; }
if (str2 == null) { str2 = ''; }
 
// for non-wysiwyg capable browsers just add to end of textbox
if (document.all[objname] && editor_obj == null) {
document.all[objname].focus();
document.all[objname].value = document.all[objname].value + str1 + str2;
return;
}
 
// error checking
if (editor_obj == null) { return alert("Unable to insert HTML. Invalid object name '" +objname+ "'."); }
 
editor_focus(editor_obj);
 
var tagname = editor_obj.tagName.toLowerCase();
var sRange;
 
// insertHTML for wysiwyg iframe
if (tagname == 'iframe') {
var editdoc = editor_obj.contentWindow.document;
sRange = editdoc.selection.createRange();
var sHtml = sRange.htmlText;
 
// check for control ranges
if (sRange.length) { return alert("Unable to insert HTML. Try highlighting content instead of selecting it."); }
 
// insert HTML
var oldHandler = window.onerror;
window.onerror = function() { alert("Unable to insert HTML for current selection."); return true; } // partial table selections cause errors
if (sHtml.length) { // if content selected
if (str2) { sRange.pasteHTML(str1 +sHtml+ str2) } // surround
else { sRange.pasteHTML(str1); } // overwrite
} else { // if insertion point only
if (reqSel) { return alert("Unable to insert HTML. You must select something first."); }
sRange.pasteHTML(str1 + str2); // insert strings
}
window.onerror = oldHandler;
}
 
// insertHTML for plaintext textarea
else if (tagname == 'textarea') {
editor_obj.focus();
sRange = document.selection.createRange();
var sText = sRange.text;
 
// insert HTML
if (sText.length) { // if content selected
if (str2) { sRange.text = str1 +sText+ str2; } // surround
else { sRange.text = str1; } // overwrite
} else { // if insertion point only
if (reqSel) { return alert("Unable to insert HTML. You must select something first."); }
sRange.text = str1 + str2; // insert strings
}
}
else { alert("Unable to insert HTML. Unknown object tag type '" +tagname+ "'."); }
 
// move to end of new content
sRange.collapse(false); // move to end of range
sRange.select(); // re-select
 
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_getHTML
Description : return HTML contents of editor (in either wywisyg or html mode)
Usage : var myHTML = editor_getHTML('objname');
\* ---------------------------------------------------------------------- */
 
function editor_getHTML(objname) {
var editor_obj = document.all["_" +objname + "_editor"];
var isTextarea = (editor_obj.tagName.toLowerCase() == 'textarea');
 
if (isTextarea) { return editor_obj.value; }
else { return editor_obj.contentWindow.document.body.innerHTML; }
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_setHTML
Description : set HTML contents of editor (in either wywisyg or html mode)
Usage : editor_setHTML('objname',"<b>html</b> <u>here</u>");
\* ---------------------------------------------------------------------- */
 
function editor_setHTML(objname, html) {
var editor_obj = document.all["_" +objname + "_editor"];
var isTextarea = (editor_obj.tagName.toLowerCase() == 'textarea');
 
if (isTextarea) { editor_obj.value = html; }
else { editor_obj.contentWindow.document.body.innerHTML = html; }
}
 
/* ---------------------------------------------------------------------- *\
Function : editor_appendHTML
Description : append HTML contents to editor (in either wywisyg or html mode)
Usage : editor_appendHTML('objname',"<b>html</b> <u>here</u>");
\* ---------------------------------------------------------------------- */
 
function editor_appendHTML(objname, html) {
var editor_obj = document.all["_" +objname + "_editor"];
var isTextarea = (editor_obj.tagName.toLowerCase() == 'textarea');
 
if (isTextarea) { editor_obj.value += html; }
else { editor_obj.contentWindow.document.body.innerHTML += html; }
}
 
/* ---------------------------------------------------------------- */
 
function _isMouseOver(obj,event) { // determine if mouse is over object
var mouseX = event.clientX;
var mouseY = event.clientY;
 
var objTop = obj.offsetTop;
var objBottom = obj.offsetTop + obj.offsetHeight;
var objLeft = obj.offsetLeft;
var objRight = obj.offsetLeft + obj.offsetWidth;
 
if (mouseX >= objLeft && mouseX <= objRight &&
mouseY >= objTop && mouseY <= objBottom) { return true; }
 
return false;
}
 
/* ---------------------------------------------------------------- */
 
function editor_cMenu_generate(editorWin,objname) {
var parentWin = window;
editorWin.event.returnValue = false; // cancel default context menu
 
// define content menu options
var cMenuOptions = [ // menu name, shortcut displayed, javascript code
['Cut', 'Ctrl-X', function() {}],
['Copy', 'Ctrl-C', function() {}],
['Paste', 'Ctrl-C', function() {}],
['Delete', 'DEL', function() {}],
['---', null, null],
['Select All', 'Ctrl-A', function() {}],
['Clear All', '', function() {}],
['---', null, null],
['About this editor...', '', function() {
alert("about this editor");
}]];
editor_cMenu.options = cMenuOptions; // save options
 
// generate context menu
var cMenuHeader = ''
+ '<div id="_'+objname+'_cMenu" onblur="editor_cMenu(this);" oncontextmenu="return false;" onselectstart="return false"'
+ ' style="position: absolute; visibility: hidden; cursor: default; width: 167px; background-color: threedface;'
+ ' border: solid 1px; border-color: threedlightshadow threeddarkshadow threeddarkshadow threedlightshadow;">'
+ '<table border=0 cellspacing=0 cellpadding=0 width="100%" style="width: 167px; background-color: threedface; border: solid 1px; border-color: threedhighlight threedshadow threedshadow threedhighlight;">'
+ ' <tr><td colspan=2 height=1></td></tr>';
 
var cMenuList = '';
 
var cMenuFooter = ''
+ ' <tr><td colspan=2 height=1></td></tr>'
+ '</table></div>';
 
for (var menuIdx in editor_cMenu.options) {
var menuName = editor_cMenu.options[menuIdx][0];
var menuKey = editor_cMenu.options[menuIdx][1];
var menuCode = editor_cMenu.options[menuIdx][2];
 
// separator
if (menuName == "---" || menuName == "separator") {
cMenuList += ' <tr><td colspan=2 class="cMenuDivOuter"><div class="cMenuDivInner"></div></td></tr>';
}
 
// menu option
else {
cMenuList += '<tr class="cMenu" onMouseOver="editor_cMenu(this)" onMouseOut="editor_cMenu(this)" onClick="editor_cMenu(this, \'' +menuIdx+ '\',\'' +objname+ '\')">';
if (menuKey) { cMenuList += ' <td align=left class="cMenu">' +menuName+ '</td><td align=right class="cMenu">' +menuKey+ '</td>'; }
else { cMenuList += ' <td colspan=2 class="cMenu">' +menuName+ '</td>'; }
cMenuList += '</tr>';
}
}
 
var cMenuHTML = cMenuHeader + cMenuList + cMenuFooter;
 
 
document.all['_'+objname+'_cMenu'].outerHTML = cMenuHTML;
 
editor_cMenu_setPosition(parentWin, editorWin, objname);
 
parentWin['_'+objname+'_cMenu'].style.visibility = 'visible';
parentWin['_'+objname+'_cMenu'].focus();
 
}
 
/* ---------------------------------------------------------------- */
 
function editor_cMenu_setPosition(parentWin, editorWin, objname) { // set object position that won't overlap window edge
var event = editorWin.event;
var cMenuObj = parentWin['_'+objname+'_cMenu'];
var mouseX = event.clientX + parentWin.document.all['_'+objname+'_editor'].offsetLeft;
var mouseY = event.clientY + parentWin.document.all['_'+objname+'_editor'].offsetTop;
var cMenuH = cMenuObj.offsetHeight;
var cMenuW = cMenuObj.offsetWidth;
var pageH = document.body.clientHeight + document.body.scrollTop;
var pageW = document.body.clientWidth + document.body.scrollLeft;
 
// set horzontal position
if (mouseX + 5 + cMenuW > pageW) { var left = mouseX - cMenuW - 5; } // too far right
else { var left = mouseX + 5; }
 
// set vertical position
if (mouseY + 5 + cMenuH > pageH) { var top = mouseY - cMenuH + 5; } // too far down
else { var top = mouseY + 5; }
 
cMenuObj.style.top = top;
cMenuObj.style.left = left;
 
}
 
/* ---------------------------------------------------------------- */
 
function editor_cMenu(obj,menuIdx,objname) {
var action = event.type;
if (action == "mouseover" && !obj.disabled && obj.tagName.toLowerCase() == 'tr') {
obj.className = 'cMenuOver';
for (var i=0; i < obj.cells.length; i++) { obj.cells[i].className = 'cMenuOver'; }
}
else if (action == "mouseout" && !obj.disabled && obj.tagName.toLowerCase() == 'tr') {
obj.className = 'cMenu';
for (var i=0; i < obj.cells.length; i++) { obj.cells[i].className = 'cMenu'; }
}
else if (action == "click" && !obj.disabled) {
document.all['_'+objname+'_cMenu'].style.visibility = "hidden";
var menucode = editor_cMenu.options[menuIdx][2];
menucode();
}
else if (action == "blur") {
if (!_isMouseOver(obj,event)) { obj.style.visibility = 'hidden'; }
else {
if (obj.style.visibility != "hidden") { obj.focus(); }
}
}
else { alert("editor_cMenu, unknown action: " + action); }
}
 
/* ---------------------------------------------------------------------- */
/kalender/modules/htmlarea/images/ed_about.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_align_center.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_align_left.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_align_right.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_blank.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_charmap.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_color_bg.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_color_fg.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_copy.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_custom.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_cut.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_delete.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_format_bold.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_format_italic.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_format_strike.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_format_sub.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_format_sup.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_format_underline.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_help.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_hr.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_html.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_image.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_indent_less.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_indent_more.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_link.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_list_bullet.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_list_num.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_redo.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/ed_undo.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/fullscreen_maximize.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/fullscreen_minimize.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/images/insert_table.gif
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/kalender/modules/htmlarea/popups/about.html
0,0 → 1,15
<HTML STYLE="width: 450px; height: 185px; ">
<HEAD><TITLE>About</TITLE>
<style>
html,body,textarea { font-family: verdana,arial; font-size: 9pt; };
</style></HEAD>
<BODY style="background: #FFFFFF; color: #000000" topmargin=5 leftmargin=12>
<span style="font-family: arial black, arial; font-size: 28px; letter-spacing: -2px;">htmlArea v2.03</span><br>
A free WYSIWYG editor replacement for &lt;textarea&gt; fields.<br>
 
<p>For full source code and docs, visit:<br>
<a href="http://www.interactivetools.com/products/htmlarea/" target="_blank">http://www.interactivetools.com/products/htmlarea/</a><br><br>
 
<p>Copyright (c) 2002 interactivetools.com, inc. All Rights Reserved.<br>
 
</body></html>
/kalender/modules/htmlarea/popups/blank.html
0,0 → 1,2
<html>
</html>
/kalender/modules/htmlarea/popups/custom2.html
0,0 → 1,35
<html style="width:300px; Height: 60px;">
<head>
<title>Select Phrase</title>
<script language="javascript">
 
var myTitle = window.dialogArguments;
document.title = myTitle;
 
 
function returnSelected() {
var idx = document.all.textPulldown.selectedIndex;
var text = document.all.textPulldown[idx].text;
 
window.returnValue = text; // set return value
window.close(); // close dialog
}
 
</script>
</head>
<body bgcolor="#FFFFFF" topmargin=15 leftmargin=0>
 
<form method=get onSubmit="Set(document.all.ColorHex.value); return false;">
<div align=center>
 
<select name="textPulldown">
<option>The quick brown</option>
<option>fox jumps over</option>
<option>the lazy dog.</option>
</select>
 
<input type="button" value=" Go " onClick="returnSelected()">
 
</div>
</form>
</body></html>
/kalender/modules/htmlarea/popups/editor_help.html
0,0 → 1,16
<html>
<head>
<title>Editor Help</title>
<style>
body, td, p, div { font-family: arial; font-size: x-small; }
</style>
</head>
<body>
 
<h2>Editor Help<hr></h2>
 
Todo...
 
 
</body>
</html>
/kalender/modules/htmlarea/popups/fullscreen.html
0,0 → 1,131
<html>
<head><title>Fullscreen Editor</title>
<style type="text/css"> body { margin: 0px; border: 0px; background-color: buttonface; } </style>
 
<script>
 
// if we pass the "window" object as a argument and then set opener to
// equal that we can refer to dialogWindows and popupWindows the same way
if (window.dialogArguments) { opener = window.dialogArguments; }
 
var _editor_url = "../";
document.write('<scr'+'ipt src="' +_editor_url+ 'editor.js" language="Javascript1.2"></scr'+'ipt>');
 
var parent_objname = location.search.substring(1,location.search.length); // parent editor objname
var parent_config = opener.document.all[parent_objname].config;
 
var config = cloneObject( parent_config );
var objname = 'editor'; // name of this editor
 
// DOMViewerObj = config;
// DOMViewerName = 'config';
// window.open('/innerHTML/domviewer.htm');
 
/* ---------------------------------------------------------------------- *\
Function :
Description :
\* ---------------------------------------------------------------------- */
 
function _CloseOnEsc() {
if (event.keyCode == 27) {
update_parent();
window.close();
return;
}
}
 
/* ---------------------------------------------------------------------- *\
Function : cloneObject
Description : copy an object by value instead of by reference
Usage : var newObj = cloneObject(oldObj);
\* ---------------------------------------------------------------------- */
 
function cloneObject(obj) {
var newObj = new Object;
 
// check for array objects
if (obj.constructor.toString().indexOf('function Array(') == 1) {
newObj = obj.constructor();
}
 
for (var n in obj) {
var node = obj[n];
if (typeof node == 'object') { newObj[n] = cloneObject(node); }
else { newObj[n] = node; }
}
return newObj;
}
 
/* ---------------------------------------------------------------------- *\
Function : resize_editor
Description : resize the editor when the user resizes the popup
\* ---------------------------------------------------------------------- */
 
function resize_editor() { // resize editor to fix window
var editor = document.all['_editor_editor'];
 
newWidth = document.body.offsetWidth;
newHeight = document.body.offsetHeight - editor.offsetTop;
 
if (newWidth < 0) { newWidth = 0; }
if (newHeight < 0) { newHeight = 0; }
 
editor.style.width = newWidth;
editor.style.height = newHeight;
}
 
/* ---------------------------------------------------------------------- *\
Function : init
Description : run this code on page load
\* ---------------------------------------------------------------------- */
 
function init() {
// change maximize button to minimize button
config.btnList["popupeditor"] = ['popupeditor', 'Minimize Editor', 'update_parent(); window.close();', 'fullscreen_minimize.gif'];
 
// set htmlmode button to refer to THIS editor
config.btnList["htmlmode"] = ['HtmlMode', 'View HTML Source', 'editor_setmode(\'editor\')', 'ed_html.gif'];
 
// change image url to be relative to current path
config.imgURL = "../images/";
// generate editor and resize it
editor_generate('editor', config);
resize_editor();
 
// switch mode if needed
if (parent_config.mode == 'textedit') { editor_setmode(objname, 'textedit'); }
 
// set child window contents
var parentHTML = opener.editor_getHTML(parent_objname);
editor_setHTML(objname, parentHTML);
 
// continuously update parent editor window
window.setInterval(update_parent, 333);
 
// setup event handlers
document.body.onkeypress = _CloseOnEsc;
window.onresize = resize_editor;
}
 
/* ---------------------------------------------------------------------- *\
Function : update_parent
Description : update parent window editor field with contents from child window
\* ---------------------------------------------------------------------- */
 
function update_parent() {
var childHTML = editor_getHTML(objname);
opener.editor_setHTML(parent_objname, childHTML);
}
 
 
</script>
</head>
<body scroll="no" onload="init()" onunload="update_parent()">
 
<div style="margin: 0 0 0 0; border-width: 1; border-style: solid; border-color: threedshadow threedhighlight threedhighlight threedshadow; "></div>
 
<textarea name="editor" style="width:100%; height:300px"></textarea><br>
 
</body></html>
/kalender/modules/htmlarea/popups/insert_image.html
0,0 → 1,206
<!-- based on insimage.dlg -->
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML 3.2//EN">
<HTML id=dlgImage STYLE="width: 432px; height: 194px; ">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="MSThemeCompatible" content="Yes">
<TITLE>Insert Image</TITLE>
<style>
html, body, button, div, input, select, fieldset { font-family: MS Shell Dlg; font-size: 8pt; position: absolute; };
</style>
<SCRIPT defer>
 
function _CloseOnEsc() {
if (event.keyCode == 27) { window.close(); return; }
}
 
function _getTextRange(elm) {
var r = elm.parentTextEdit.createTextRange();
r.moveToElementText(elm);
return r;
}
 
window.onerror = HandleError
 
function HandleError(message, url, line) {
var str = "An error has occurred in this dialog." + "\n\n"
+ "Error: " + line + "\n" + message;
alert(str);
window.close();
return true;
}
 
function Init() {
var elmSelectedImage;
var htmlSelectionControl = "Control";
var globalDoc = window.dialogArguments;
var grngMaster = globalDoc.selection.createRange();
// event handlers
document.body.onkeypress = _CloseOnEsc;
btnOK.onclick = new Function("btnOKClick()");
 
txtFileName.fImageLoaded = false;
txtFileName.intImageWidth = 0;
txtFileName.intImageHeight = 0;
 
if (globalDoc.selection.type == htmlSelectionControl) {
if (grngMaster.length == 1) {
elmSelectedImage = grngMaster.item(0);
if (elmSelectedImage.tagName == "IMG") {
txtFileName.fImageLoaded = true;
if (elmSelectedImage.src) {
txtFileName.value = elmSelectedImage.src.replace(/^[^*]*(\*\*\*)/, "$1"); // fix placeholder src values that editor converted to abs paths
txtFileName.intImageHeight = elmSelectedImage.height;
txtFileName.intImageWidth = elmSelectedImage.width;
txtVertical.value = elmSelectedImage.vspace;
txtHorizontal.value = elmSelectedImage.hspace;
txtBorder.value = elmSelectedImage.border;
txtAltText.value = elmSelectedImage.alt;
selAlignment.value = elmSelectedImage.align;
}
}
}
}
txtFileName.value = txtFileName.value || "http://";
txtFileName.focus();
}
 
function _isValidNumber(txtBox) {
var val = parseInt(txtBox);
if (isNaN(val) || val < 0 || val > 999) { return false; }
return true;
}
 
function btnOKClick() {
var elmImage;
var intAlignment;
var htmlSelectionControl = "Control";
var globalDoc = window.dialogArguments;
var grngMaster = globalDoc.selection.createRange();
// error checking
 
if (!txtFileName.value || txtFileName.value == "http://") {
alert("Image URL must be specified.");
txtFileName.focus();
return;
}
if (txtHorizontal.value && !_isValidNumber(txtHorizontal.value)) {
alert("Horizontal spacing must be a number between 0 and 999.");
txtHorizontal.focus();
return;
}
if (txtBorder.value && !_isValidNumber(txtBorder.value)) {
alert("Border thickness must be a number between 0 and 999.");
txtBorder.focus();
return;
}
if (txtVertical.value && !_isValidNumber(txtVertical.value)) {
alert("Vertical spacing must be a number between 0 and 999.");
txtVertical.focus();
return;
}
 
// delete selected content and replace with image
if (globalDoc.selection.type == htmlSelectionControl && !txtFileName.fImageLoaded) {
grngMaster.execCommand('Delete');
grngMaster = globalDoc.selection.createRange();
}
idstr = "\" id=\"556e697175657e537472696e67"; // new image creation ID
if (!txtFileName.fImageLoaded) {
grngMaster.execCommand("InsertImage", false, idstr);
elmImage = globalDoc.all['556e697175657e537472696e67'];
elmImage.removeAttribute("id");
elmImage.removeAttribute("src");
grngMaster.moveStart("character", -1);
} else {
elmImage = grngMaster.item(0);
if (elmImage.src != txtFileName.value) {
grngMaster.execCommand('Delete');
grngMaster = globalDoc.selection.createRange();
grngMaster.execCommand("InsertImage", false, idstr);
elmImage = globalDoc.all['556e697175657e537472696e67'];
elmImage.removeAttribute("id");
elmImage.removeAttribute("src");
grngMaster.moveStart("character", -1);
txtFileName.fImageLoaded = false;
}
grngMaster = _getTextRange(elmImage);
}
 
if (txtFileName.fImageLoaded) {
elmImage.style.width = txtFileName.intImageWidth;
elmImage.style.height = txtFileName.intImageHeight;
}
 
if (txtFileName.value.length > 2040) {
txtFileName.value = txtFileName.value.substring(0,2040);
}
elmImage.src = txtFileName.value;
if (txtHorizontal.value != "") { elmImage.hspace = parseInt(txtHorizontal.value); }
else { elmImage.hspace = 0; }
 
if (txtVertical.value != "") { elmImage.vspace = parseInt(txtVertical.value); }
else { elmImage.vspace = 0; }
elmImage.alt = txtAltText.value;
 
if (txtBorder.value != "") { elmImage.border = parseInt(txtBorder.value); }
else { elmImage.border = 0; }
 
elmImage.align = selAlignment.value;
grngMaster.collapse(false);
grngMaster.select();
window.close();
}
</SCRIPT>
</HEAD>
<BODY id=bdy onload="Init()" style="background: threedface; color: windowtext;" scroll=no>
 
<DIV id=divFileName style="left: 0.98em; top: 1.2168em; width: 7em; height: 1.2168em; ">Image URL:</DIV>
<INPUT ID=txtFileName type=text style="left: 8.54em; top: 1.0647em; width: 21.5em;height: 2.1294em; " tabIndex=10 onfocus="select()">
 
<DIV id=divAltText style="left: 0.98em; top: 4.1067em; width: 6.58em; height: 1.2168em; ">Alternate Text:</DIV>
<INPUT type=text ID=txtAltText tabIndex=15 style="left: 8.54em; top: 3.8025em; width: 21.5em; height: 2.1294em; " onfocus="select()">
 
<FIELDSET id=fldLayout style="left: .9em; top: 7.1em; width: 17.08em; height: 7.6em;">
<LEGEND id=lgdLayout>Layout</LEGEND>
</FIELDSET>
 
<FIELDSET id=fldSpacing style="left: 18.9em; top: 7.1em; width: 11em; height: 7.6em;">
<LEGEND id=lgdSpacing>Spacing</LEGEND>
</FIELDSET>
 
<DIV id=divAlign style="left: 1.82em; top: 9.126em; width: 4.76em; height: 1.2168em; ">Alignment:</DIV>
<SELECT size=1 ID=selAlignment tabIndex=20 style="left: 10.36em; top: 8.8218em; width: 6.72em; height: 1.2168em; ">
<OPTION id=optNotSet value=""> Not set </OPTION>
<OPTION id=optLeft value=left> Left </OPTION>
<OPTION id=optRight value=right> Right </OPTION>
<OPTION id=optTexttop value=textTop> Texttop </OPTION>
<OPTION id=optAbsMiddle value=absMiddle> Absmiddle </OPTION>
<OPTION id=optBaseline value=baseline SELECTED> Baseline </OPTION>
<OPTION id=optAbsBottom value=absBottom> Absbottom </OPTION>
<OPTION id=optBottom value=bottom> Bottom </OPTION>
<OPTION id=optMiddle value=middle> Middle </OPTION>
<OPTION id=optTop value=top> Top </OPTION>
</SELECT>
 
<DIV id=divHoriz style="left: 19.88em; top: 9.126em; width: 4.76em; height: 1.2168em; ">Horizontal:</DIV>
<INPUT ID=txtHorizontal style="left: 24.92em; top: 8.8218em; width: 4.2em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=25 onfocus="select()">
 
<DIV id=divBorder style="left: 1.82em; top: 12.0159em; width: 8.12em; height: 1.2168em; ">Border Thickness:</DIV>
<INPUT ID=txtBorder style="left: 10.36em; top: 11.5596em; width: 6.72em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=21 onfocus="select()">
 
<DIV id=divVert style="left: 19.88em; top: 12.0159em; width: 3.64em; height: 1.2168em; ">Vertical:</DIV>
<INPUT ID=txtVertical style="left: 24.92em; top: 11.5596em; width: 4.2em; height: 2.1294em; ime-mode: disabled;" type=text size=3 maxlength=3 value="" tabIndex=30 onfocus="select()">
 
<BUTTON ID=btnOK style="left: 31.36em; top: 1.0647em; width: 7em; height: 2.2em; " type=submit tabIndex=40>OK</BUTTON>
<BUTTON ID=btnCancel style="left: 31.36em; top: 3.6504em; width: 7em; height: 2.2em; " type=reset tabIndex=45 onClick="window.close();">Cancel</BUTTON>
 
</BODY>
</HTML>
/kalender/modules/htmlarea/popups/insert_table.html
0,0 → 1,170
<html STYLE="width: 432px; height: 168px; ">
<head><title>Insert Table</title><head>
<style>
html, body, button, div, input, select, td, fieldset { font-family: MS Shell Dlg; font-size: 8pt; };
</style>
<script>
 
// if we pass the "window" object as a argument and then set opener to
// equal that we can refer to dialogWindows and popupWindows the same way
opener = window.dialogArguments;
 
var _editor_url = opener._editor_url;
var objname = location.search.substring(1,location.search.length);
var config = opener.document.all[objname].config;
var editor_obj = opener.document.all["_" +objname+ "_editor"];
var editdoc = editor_obj.contentWindow.document;
 
function _CloseOnEsc() {
if (event.keyCode == 27) { window.close(); return; }
}
 
window.onerror = HandleError
 
function HandleError(message, url, line) {
var str = "An error has occurred in this dialog." + "\n\n"
+ "Error: " + line + "\n" + message;
alert(str);
// window.close();
return true;
}
 
function Init() {
document.body.onkeypress = _CloseOnEsc;
}
 
function _isValidNumber(txtBox) {
var val = parseInt(txtBox);
if (isNaN(val) || val < 0 || val > 9999) { return false; }
return true;
}
 
function btnOKClick() {
var curRange = editdoc.selection.createRange();
 
// error checking
var checkList = ['rows','cols','border','cellspacing','cellpadding'];
for (var idx in checkList) {
var fieldname = checkList[idx];
if (document.all[fieldname].value == "") {
alert("You must specify a value for the '" +fieldname+ "' field!");
document.all[fieldname].focus();
return;
}
else if (!_isValidNumber(document.all[fieldname].value)) {
alert("You must specify a number between 0 and 9999 for '" +fieldname+ "'!");
document.all[fieldname].focus();
return;
}
}
 
// delete selected content (if applicable)
if (editdoc.selection.type == "Control" || curRange.htmlText) {
 
if (!confirm("Overwrite selected content?")) { return; }
 
curRange.execCommand('Delete');
curRange = editdoc.selection.createRange();
}
 
 
// create table
var table = '<table border="' +document.all.border.value+ '"'
+ ' cellspacing="' +document.all.cellspacing.value+ '"'
+ ' cellpadding="' +document.all.cellpadding.value+ '"'
+ ' width="' +document.all.width.value + document.all.widthExt.value+ '"'
+ ' align="' +document.all.alignment.value+ '">\n';
 
for (var x=0; x<document.all.rows.value; x++) {
table += " <tr>\n";
for (var y=0; y<document.all.cols.value; y++) {
table += " <td></td>\n";
}
table += " </tr>\n";
}
table += "</table>\n";
 
// insert table
opener.editor_insertHTML(objname, table);
 
 
// close popup window
window.close();
}
</SCRIPT>
</HEAD>
<BODY id=bdy onload="Init()" style="background: threedface; color: windowtext; margin: 10px; BORDER-STYLE: none" scroll=no>
 
<table border=0 cellspacing=0 cellpadding=0 style="margin: 0 0 8 0">
<tr>
<td>Rows: &nbsp;</td>
<td><input type="text" name="rows" value="4" style="width: 50px" maxlength=4></td>
</tr>
<tr>
<td>Cols:</td>
<td><input type="text" name="cols" value="3" style="width: 50px" maxlength=4></td>
<td width=10>&nbsp;</td>
<td>Width: &nbsp;</td>
<td>
<input type="text" name="width" value="100" style="width: 50px" maxlength=4>
<select name="widthExt">
<option value="">Pixels</option>
<option value="%" selected>Percent</option>
</select>
</td>
</tr>
</table>
 
 
<FIELDSET style="width: 1%; text-align: center">
<LEGEND>Layout</LEGEND>
 
<table border=0 cellspacing=6 cellpadding=0>
<tr>
<td height=21>Alignment:</td>
<td>
<select name="alignment" size=1>
<option value="">Not set</option>
<option value="left">Left</option>
<option value="right">Right</option>
<option value="textTop">Texttop</option>
<option value="absMiddle">Absmiddle</option>
<option value="baseline">Baseline</option>
<option value="absBottom">Absbottom</option>
<option value="bottom">Bottom</option>
<option value="middle">Middle</option>
<option value="top">Top</option>
</select>
</td>
</tr>
<tr>
<td><nobr>Border Thickness:</nobr></td>
<td><input type="text" name="border" value="1" size=4 style="width: 100%"></td>
</tr>
</table>
</FIELDSET>
 
 
<FIELDSET style="width: 1%; text-align: center">
<LEGEND>Spacing</LEGEND>
 
<table border=0 cellspacing=6 cellpadding=0>
<tr>
<td><nobr>Cell Spacing:</nobr></td>
<td><input type="text" name="cellspacing" value="1" style="width: 50px" maxlength=4></td>
</tr>
<tr>
<td><nobr>Cell Padding:</nobr></td>
<td><input type="text" name="cellpadding" value="2" style="width: 50px" maxlength=4></td>
</tr>
</table>
</FIELDSET>
 
 
<div style="left: 340px; top: 16px; position: absolute">
<BUTTON style="width: 7em; height: 2.2em; margin: 0 0 3 0" type=submit onclick="btnOKClick()">OK</BUTTON><br>
<BUTTON style="width: 7em; height: 2.2em; " type=reset onClick="window.close();">Cancel</BUTTON>
</div>
 
</BODY>
</HTML>
/kalender/modules/htmlarea/popups/select_color.html
0,0 → 1,343
<!-- note: this version of the color picker is optimized for IE 5.5+ only -->
 
<html STYLE="width: 238px; height: 187px"><head><title>Select Color</title>
<script language="javascript">
 
function _CloseOnEsc() {
if (event.keyCode == 27) { window.close(); return; }
}
 
function Init() { // run on page load
document.body.onkeypress = _CloseOnEsc;
 
color = window.dialogArguments;
color = ValidateColor(color) || '000000';
View(color); // set default color
}
 
function View(color) { // preview color
document.all.ColorPreview.style.backgroundColor = '#' + color;
document.all.ColorHex.value = '#' + color;
}
 
function Set(string) { // select color
color = ValidateColor(string);
if (color == null) { alert("Invalid color code: " + string); } // invalid color
else { // valid color
View(color); // show selected color
window.returnValue = color; // set return value
window.close(); // close dialog
}
}
 
function ValidateColor(string) { // return valid color code
string = string || '';
string = string + "";
string = string.toUpperCase();
chars = '0123456789ABCDEF';
out = '';
 
for (i=0; i<string.length; i++) { // remove invalid color chars
schar = string.charAt(i);
if (chars.indexOf(schar) != -1) { out += schar; }
}
if (out.length != 6) { return null; } // check length
return out;
}
 
</script>
</head>
<body bgcolor="#000000" topmargin=0 leftmargin=0 onload="Init()">
 
<form method=get onSubmit="Set(document.all.ColorHex.value); return false;">
 
<table border=0 cellspacing=0 cellpadding=4 width=100%>
<tr>
<td bgcolor="buttonface" valign=center><div style="background-color: #000000; padding: 1; height: 21px; width: 50px"><div id="ColorPreview" style="height: 100%; width: 100%"></div></div></td>
<td bgcolor="buttonface" valign=center><input type="text" name="ColorHex" value="" size=15 style="font-size: 12px"></td>
<td bgcolor="buttonface" width=100%></td>
</tr>
</table>
 
<table border=0 cellspacing=1 cellpadding=0 bgcolor=#000000 style="cursor: hand;">
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#003300 onMouseOver=View('003300') onClick=Set('003300') height=10 width=10></td>
<td bgcolor=#006600 onMouseOver=View('006600') onClick=Set('006600') height=10 width=10></td>
<td bgcolor=#009900 onMouseOver=View('009900') onClick=Set('009900') height=10 width=10></td>
<td bgcolor=#00CC00 onMouseOver=View('00CC00') onClick=Set('00CC00') height=10 width=10></td>
<td bgcolor=#00FF00 onMouseOver=View('00FF00') onClick=Set('00FF00') height=10 width=10></td>
<td bgcolor=#330000 onMouseOver=View('330000') onClick=Set('330000') height=10 width=10></td>
<td bgcolor=#333300 onMouseOver=View('333300') onClick=Set('333300') height=10 width=10></td>
<td bgcolor=#336600 onMouseOver=View('336600') onClick=Set('336600') height=10 width=10></td>
<td bgcolor=#339900 onMouseOver=View('339900') onClick=Set('339900') height=10 width=10></td>
<td bgcolor=#33CC00 onMouseOver=View('33CC00') onClick=Set('33CC00') height=10 width=10></td>
<td bgcolor=#33FF00 onMouseOver=View('33FF00') onClick=Set('33FF00') height=10 width=10></td>
<td bgcolor=#660000 onMouseOver=View('660000') onClick=Set('660000') height=10 width=10></td>
<td bgcolor=#663300 onMouseOver=View('663300') onClick=Set('663300') height=10 width=10></td>
<td bgcolor=#666600 onMouseOver=View('666600') onClick=Set('666600') height=10 width=10></td>
<td bgcolor=#669900 onMouseOver=View('669900') onClick=Set('669900') height=10 width=10></td>
<td bgcolor=#66CC00 onMouseOver=View('66CC00') onClick=Set('66CC00') height=10 width=10></td>
<td bgcolor=#66FF00 onMouseOver=View('66FF00') onClick=Set('66FF00') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#333333 onMouseOver=View('333333') onClick=Set('333333') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#000033 onMouseOver=View('000033') onClick=Set('000033') height=10 width=10></td>
<td bgcolor=#003333 onMouseOver=View('003333') onClick=Set('003333') height=10 width=10></td>
<td bgcolor=#006633 onMouseOver=View('006633') onClick=Set('006633') height=10 width=10></td>
<td bgcolor=#009933 onMouseOver=View('009933') onClick=Set('009933') height=10 width=10></td>
<td bgcolor=#00CC33 onMouseOver=View('00CC33') onClick=Set('00CC33') height=10 width=10></td>
<td bgcolor=#00FF33 onMouseOver=View('00FF33') onClick=Set('00FF33') height=10 width=10></td>
<td bgcolor=#330033 onMouseOver=View('330033') onClick=Set('330033') height=10 width=10></td>
<td bgcolor=#333333 onMouseOver=View('333333') onClick=Set('333333') height=10 width=10></td>
<td bgcolor=#336633 onMouseOver=View('336633') onClick=Set('336633') height=10 width=10></td>
<td bgcolor=#339933 onMouseOver=View('339933') onClick=Set('339933') height=10 width=10></td>
<td bgcolor=#33CC33 onMouseOver=View('33CC33') onClick=Set('33CC33') height=10 width=10></td>
<td bgcolor=#33FF33 onMouseOver=View('33FF33') onClick=Set('33FF33') height=10 width=10></td>
<td bgcolor=#660033 onMouseOver=View('660033') onClick=Set('660033') height=10 width=10></td>
<td bgcolor=#663333 onMouseOver=View('663333') onClick=Set('663333') height=10 width=10></td>
<td bgcolor=#666633 onMouseOver=View('666633') onClick=Set('666633') height=10 width=10></td>
<td bgcolor=#669933 onMouseOver=View('669933') onClick=Set('669933') height=10 width=10></td>
<td bgcolor=#66CC33 onMouseOver=View('66CC33') onClick=Set('66CC33') height=10 width=10></td>
<td bgcolor=#66FF33 onMouseOver=View('66FF33') onClick=Set('66FF33') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#666666 onMouseOver=View('666666') onClick=Set('666666') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#000066 onMouseOver=View('000066') onClick=Set('000066') height=10 width=10></td>
<td bgcolor=#003366 onMouseOver=View('003366') onClick=Set('003366') height=10 width=10></td>
<td bgcolor=#006666 onMouseOver=View('006666') onClick=Set('006666') height=10 width=10></td>
<td bgcolor=#009966 onMouseOver=View('009966') onClick=Set('009966') height=10 width=10></td>
<td bgcolor=#00CC66 onMouseOver=View('00CC66') onClick=Set('00CC66') height=10 width=10></td>
<td bgcolor=#00FF66 onMouseOver=View('00FF66') onClick=Set('00FF66') height=10 width=10></td>
<td bgcolor=#330066 onMouseOver=View('330066') onClick=Set('330066') height=10 width=10></td>
<td bgcolor=#333366 onMouseOver=View('333366') onClick=Set('333366') height=10 width=10></td>
<td bgcolor=#336666 onMouseOver=View('336666') onClick=Set('336666') height=10 width=10></td>
<td bgcolor=#339966 onMouseOver=View('339966') onClick=Set('339966') height=10 width=10></td>
<td bgcolor=#33CC66 onMouseOver=View('33CC66') onClick=Set('33CC66') height=10 width=10></td>
<td bgcolor=#33FF66 onMouseOver=View('33FF66') onClick=Set('33FF66') height=10 width=10></td>
<td bgcolor=#660066 onMouseOver=View('660066') onClick=Set('660066') height=10 width=10></td>
<td bgcolor=#663366 onMouseOver=View('663366') onClick=Set('663366') height=10 width=10></td>
<td bgcolor=#666666 onMouseOver=View('666666') onClick=Set('666666') height=10 width=10></td>
<td bgcolor=#669966 onMouseOver=View('669966') onClick=Set('669966') height=10 width=10></td>
<td bgcolor=#66CC66 onMouseOver=View('66CC66') onClick=Set('66CC66') height=10 width=10></td>
<td bgcolor=#66FF66 onMouseOver=View('66FF66') onClick=Set('66FF66') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#999999 onMouseOver=View('999999') onClick=Set('999999') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#000099 onMouseOver=View('000099') onClick=Set('000099') height=10 width=10></td>
<td bgcolor=#003399 onMouseOver=View('003399') onClick=Set('003399') height=10 width=10></td>
<td bgcolor=#006699 onMouseOver=View('006699') onClick=Set('006699') height=10 width=10></td>
<td bgcolor=#009999 onMouseOver=View('009999') onClick=Set('009999') height=10 width=10></td>
<td bgcolor=#00CC99 onMouseOver=View('00CC99') onClick=Set('00CC99') height=10 width=10></td>
<td bgcolor=#00FF99 onMouseOver=View('00FF99') onClick=Set('00FF99') height=10 width=10></td>
<td bgcolor=#330099 onMouseOver=View('330099') onClick=Set('330099') height=10 width=10></td>
<td bgcolor=#333399 onMouseOver=View('333399') onClick=Set('333399') height=10 width=10></td>
<td bgcolor=#336699 onMouseOver=View('336699') onClick=Set('336699') height=10 width=10></td>
<td bgcolor=#339999 onMouseOver=View('339999') onClick=Set('339999') height=10 width=10></td>
<td bgcolor=#33CC99 onMouseOver=View('33CC99') onClick=Set('33CC99') height=10 width=10></td>
<td bgcolor=#33FF99 onMouseOver=View('33FF99') onClick=Set('33FF99') height=10 width=10></td>
<td bgcolor=#660099 onMouseOver=View('660099') onClick=Set('660099') height=10 width=10></td>
<td bgcolor=#663399 onMouseOver=View('663399') onClick=Set('663399') height=10 width=10></td>
<td bgcolor=#666699 onMouseOver=View('666699') onClick=Set('666699') height=10 width=10></td>
<td bgcolor=#669999 onMouseOver=View('669999') onClick=Set('669999') height=10 width=10></td>
<td bgcolor=#66CC99 onMouseOver=View('66CC99') onClick=Set('66CC99') height=10 width=10></td>
<td bgcolor=#66FF99 onMouseOver=View('66FF99') onClick=Set('66FF99') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#CCCCCC onMouseOver=View('CCCCCC') onClick=Set('CCCCCC') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#0000CC onMouseOver=View('0000CC') onClick=Set('0000CC') height=10 width=10></td>
<td bgcolor=#0033CC onMouseOver=View('0033CC') onClick=Set('0033CC') height=10 width=10></td>
<td bgcolor=#0066CC onMouseOver=View('0066CC') onClick=Set('0066CC') height=10 width=10></td>
<td bgcolor=#0099CC onMouseOver=View('0099CC') onClick=Set('0099CC') height=10 width=10></td>
<td bgcolor=#00CCCC onMouseOver=View('00CCCC') onClick=Set('00CCCC') height=10 width=10></td>
<td bgcolor=#00FFCC onMouseOver=View('00FFCC') onClick=Set('00FFCC') height=10 width=10></td>
<td bgcolor=#3300CC onMouseOver=View('3300CC') onClick=Set('3300CC') height=10 width=10></td>
<td bgcolor=#3333CC onMouseOver=View('3333CC') onClick=Set('3333CC') height=10 width=10></td>
<td bgcolor=#3366CC onMouseOver=View('3366CC') onClick=Set('3366CC') height=10 width=10></td>
<td bgcolor=#3399CC onMouseOver=View('3399CC') onClick=Set('3399CC') height=10 width=10></td>
<td bgcolor=#33CCCC onMouseOver=View('33CCCC') onClick=Set('33CCCC') height=10 width=10></td>
<td bgcolor=#33FFCC onMouseOver=View('33FFCC') onClick=Set('33FFCC') height=10 width=10></td>
<td bgcolor=#6600CC onMouseOver=View('6600CC') onClick=Set('6600CC') height=10 width=10></td>
<td bgcolor=#6633CC onMouseOver=View('6633CC') onClick=Set('6633CC') height=10 width=10></td>
<td bgcolor=#6666CC onMouseOver=View('6666CC') onClick=Set('6666CC') height=10 width=10></td>
<td bgcolor=#6699CC onMouseOver=View('6699CC') onClick=Set('6699CC') height=10 width=10></td>
<td bgcolor=#66CCCC onMouseOver=View('66CCCC') onClick=Set('66CCCC') height=10 width=10></td>
<td bgcolor=#66FFCC onMouseOver=View('66FFCC') onClick=Set('66FFCC') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#FFFFFF onMouseOver=View('FFFFFF') onClick=Set('FFFFFF') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#0000FF onMouseOver=View('0000FF') onClick=Set('0000FF') height=10 width=10></td>
<td bgcolor=#0033FF onMouseOver=View('0033FF') onClick=Set('0033FF') height=10 width=10></td>
<td bgcolor=#0066FF onMouseOver=View('0066FF') onClick=Set('0066FF') height=10 width=10></td>
<td bgcolor=#0099FF onMouseOver=View('0099FF') onClick=Set('0099FF') height=10 width=10></td>
<td bgcolor=#00CCFF onMouseOver=View('00CCFF') onClick=Set('00CCFF') height=10 width=10></td>
<td bgcolor=#00FFFF onMouseOver=View('00FFFF') onClick=Set('00FFFF') height=10 width=10></td>
<td bgcolor=#3300FF onMouseOver=View('3300FF') onClick=Set('3300FF') height=10 width=10></td>
<td bgcolor=#3333FF onMouseOver=View('3333FF') onClick=Set('3333FF') height=10 width=10></td>
<td bgcolor=#3366FF onMouseOver=View('3366FF') onClick=Set('3366FF') height=10 width=10></td>
<td bgcolor=#3399FF onMouseOver=View('3399FF') onClick=Set('3399FF') height=10 width=10></td>
<td bgcolor=#33CCFF onMouseOver=View('33CCFF') onClick=Set('33CCFF') height=10 width=10></td>
<td bgcolor=#33FFFF onMouseOver=View('33FFFF') onClick=Set('33FFFF') height=10 width=10></td>
<td bgcolor=#6600FF onMouseOver=View('6600FF') onClick=Set('6600FF') height=10 width=10></td>
<td bgcolor=#6633FF onMouseOver=View('6633FF') onClick=Set('6633FF') height=10 width=10></td>
<td bgcolor=#6666FF onMouseOver=View('6666FF') onClick=Set('6666FF') height=10 width=10></td>
<td bgcolor=#6699FF onMouseOver=View('6699FF') onClick=Set('6699FF') height=10 width=10></td>
<td bgcolor=#66CCFF onMouseOver=View('66CCFF') onClick=Set('66CCFF') height=10 width=10></td>
<td bgcolor=#66FFFF onMouseOver=View('66FFFF') onClick=Set('66FFFF') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#FF0000 onMouseOver=View('FF0000') onClick=Set('FF0000') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#990000 onMouseOver=View('990000') onClick=Set('990000') height=10 width=10></td>
<td bgcolor=#993300 onMouseOver=View('993300') onClick=Set('993300') height=10 width=10></td>
<td bgcolor=#996600 onMouseOver=View('996600') onClick=Set('996600') height=10 width=10></td>
<td bgcolor=#999900 onMouseOver=View('999900') onClick=Set('999900') height=10 width=10></td>
<td bgcolor=#99CC00 onMouseOver=View('99CC00') onClick=Set('99CC00') height=10 width=10></td>
<td bgcolor=#99FF00 onMouseOver=View('99FF00') onClick=Set('99FF00') height=10 width=10></td>
<td bgcolor=#CC0000 onMouseOver=View('CC0000') onClick=Set('CC0000') height=10 width=10></td>
<td bgcolor=#CC3300 onMouseOver=View('CC3300') onClick=Set('CC3300') height=10 width=10></td>
<td bgcolor=#CC6600 onMouseOver=View('CC6600') onClick=Set('CC6600') height=10 width=10></td>
<td bgcolor=#CC9900 onMouseOver=View('CC9900') onClick=Set('CC9900') height=10 width=10></td>
<td bgcolor=#CCCC00 onMouseOver=View('CCCC00') onClick=Set('CCCC00') height=10 width=10></td>
<td bgcolor=#CCFF00 onMouseOver=View('CCFF00') onClick=Set('CCFF00') height=10 width=10></td>
<td bgcolor=#FF0000 onMouseOver=View('FF0000') onClick=Set('FF0000') height=10 width=10></td>
<td bgcolor=#FF3300 onMouseOver=View('FF3300') onClick=Set('FF3300') height=10 width=10></td>
<td bgcolor=#FF6600 onMouseOver=View('FF6600') onClick=Set('FF6600') height=10 width=10></td>
<td bgcolor=#FF9900 onMouseOver=View('FF9900') onClick=Set('FF9900') height=10 width=10></td>
<td bgcolor=#FFCC00 onMouseOver=View('FFCC00') onClick=Set('FFCC00') height=10 width=10></td>
<td bgcolor=#FFFF00 onMouseOver=View('FFFF00') onClick=Set('FFFF00') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#00FF00 onMouseOver=View('00FF00') onClick=Set('00FF00') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#990033 onMouseOver=View('990033') onClick=Set('990033') height=10 width=10></td>
<td bgcolor=#993333 onMouseOver=View('993333') onClick=Set('993333') height=10 width=10></td>
<td bgcolor=#996633 onMouseOver=View('996633') onClick=Set('996633') height=10 width=10></td>
<td bgcolor=#999933 onMouseOver=View('999933') onClick=Set('999933') height=10 width=10></td>
<td bgcolor=#99CC33 onMouseOver=View('99CC33') onClick=Set('99CC33') height=10 width=10></td>
<td bgcolor=#99FF33 onMouseOver=View('99FF33') onClick=Set('99FF33') height=10 width=10></td>
<td bgcolor=#CC0033 onMouseOver=View('CC0033') onClick=Set('CC0033') height=10 width=10></td>
<td bgcolor=#CC3333 onMouseOver=View('CC3333') onClick=Set('CC3333') height=10 width=10></td>
<td bgcolor=#CC6633 onMouseOver=View('CC6633') onClick=Set('CC6633') height=10 width=10></td>
<td bgcolor=#CC9933 onMouseOver=View('CC9933') onClick=Set('CC9933') height=10 width=10></td>
<td bgcolor=#CCCC33 onMouseOver=View('CCCC33') onClick=Set('CCCC33') height=10 width=10></td>
<td bgcolor=#CCFF33 onMouseOver=View('CCFF33') onClick=Set('CCFF33') height=10 width=10></td>
<td bgcolor=#FF0033 onMouseOver=View('FF0033') onClick=Set('FF0033') height=10 width=10></td>
<td bgcolor=#FF3333 onMouseOver=View('FF3333') onClick=Set('FF3333') height=10 width=10></td>
<td bgcolor=#FF6633 onMouseOver=View('FF6633') onClick=Set('FF6633') height=10 width=10></td>
<td bgcolor=#FF9933 onMouseOver=View('FF9933') onClick=Set('FF9933') height=10 width=10></td>
<td bgcolor=#FFCC33 onMouseOver=View('FFCC33') onClick=Set('FFCC33') height=10 width=10></td>
<td bgcolor=#FFFF33 onMouseOver=View('FFFF33') onClick=Set('FFFF33') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#0000FF onMouseOver=View('0000FF') onClick=Set('0000FF') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#990066 onMouseOver=View('990066') onClick=Set('990066') height=10 width=10></td>
<td bgcolor=#993366 onMouseOver=View('993366') onClick=Set('993366') height=10 width=10></td>
<td bgcolor=#996666 onMouseOver=View('996666') onClick=Set('996666') height=10 width=10></td>
<td bgcolor=#999966 onMouseOver=View('999966') onClick=Set('999966') height=10 width=10></td>
<td bgcolor=#99CC66 onMouseOver=View('99CC66') onClick=Set('99CC66') height=10 width=10></td>
<td bgcolor=#99FF66 onMouseOver=View('99FF66') onClick=Set('99FF66') height=10 width=10></td>
<td bgcolor=#CC0066 onMouseOver=View('CC0066') onClick=Set('CC0066') height=10 width=10></td>
<td bgcolor=#CC3366 onMouseOver=View('CC3366') onClick=Set('CC3366') height=10 width=10></td>
<td bgcolor=#CC6666 onMouseOver=View('CC6666') onClick=Set('CC6666') height=10 width=10></td>
<td bgcolor=#CC9966 onMouseOver=View('CC9966') onClick=Set('CC9966') height=10 width=10></td>
<td bgcolor=#CCCC66 onMouseOver=View('CCCC66') onClick=Set('CCCC66') height=10 width=10></td>
<td bgcolor=#CCFF66 onMouseOver=View('CCFF66') onClick=Set('CCFF66') height=10 width=10></td>
<td bgcolor=#FF0066 onMouseOver=View('FF0066') onClick=Set('FF0066') height=10 width=10></td>
<td bgcolor=#FF3366 onMouseOver=View('FF3366') onClick=Set('FF3366') height=10 width=10></td>
<td bgcolor=#FF6666 onMouseOver=View('FF6666') onClick=Set('FF6666') height=10 width=10></td>
<td bgcolor=#FF9966 onMouseOver=View('FF9966') onClick=Set('FF9966') height=10 width=10></td>
<td bgcolor=#FFCC66 onMouseOver=View('FFCC66') onClick=Set('FFCC66') height=10 width=10></td>
<td bgcolor=#FFFF66 onMouseOver=View('FFFF66') onClick=Set('FFFF66') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#FFFF00 onMouseOver=View('FFFF00') onClick=Set('FFFF00') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#990099 onMouseOver=View('990099') onClick=Set('990099') height=10 width=10></td>
<td bgcolor=#993399 onMouseOver=View('993399') onClick=Set('993399') height=10 width=10></td>
<td bgcolor=#996699 onMouseOver=View('996699') onClick=Set('996699') height=10 width=10></td>
<td bgcolor=#999999 onMouseOver=View('999999') onClick=Set('999999') height=10 width=10></td>
<td bgcolor=#99CC99 onMouseOver=View('99CC99') onClick=Set('99CC99') height=10 width=10></td>
<td bgcolor=#99FF99 onMouseOver=View('99FF99') onClick=Set('99FF99') height=10 width=10></td>
<td bgcolor=#CC0099 onMouseOver=View('CC0099') onClick=Set('CC0099') height=10 width=10></td>
<td bgcolor=#CC3399 onMouseOver=View('CC3399') onClick=Set('CC3399') height=10 width=10></td>
<td bgcolor=#CC6699 onMouseOver=View('CC6699') onClick=Set('CC6699') height=10 width=10></td>
<td bgcolor=#CC9999 onMouseOver=View('CC9999') onClick=Set('CC9999') height=10 width=10></td>
<td bgcolor=#CCCC99 onMouseOver=View('CCCC99') onClick=Set('CCCC99') height=10 width=10></td>
<td bgcolor=#CCFF99 onMouseOver=View('CCFF99') onClick=Set('CCFF99') height=10 width=10></td>
<td bgcolor=#FF0099 onMouseOver=View('FF0099') onClick=Set('FF0099') height=10 width=10></td>
<td bgcolor=#FF3399 onMouseOver=View('FF3399') onClick=Set('FF3399') height=10 width=10></td>
<td bgcolor=#FF6699 onMouseOver=View('FF6699') onClick=Set('FF6699') height=10 width=10></td>
<td bgcolor=#FF9999 onMouseOver=View('FF9999') onClick=Set('FF9999') height=10 width=10></td>
<td bgcolor=#FFCC99 onMouseOver=View('FFCC99') onClick=Set('FFCC99') height=10 width=10></td>
<td bgcolor=#FFFF99 onMouseOver=View('FFFF99') onClick=Set('FFFF99') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#00FFFF onMouseOver=View('00FFFF') onClick=Set('00FFFF') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#9900CC onMouseOver=View('9900CC') onClick=Set('9900CC') height=10 width=10></td>
<td bgcolor=#9933CC onMouseOver=View('9933CC') onClick=Set('9933CC') height=10 width=10></td>
<td bgcolor=#9966CC onMouseOver=View('9966CC') onClick=Set('9966CC') height=10 width=10></td>
<td bgcolor=#9999CC onMouseOver=View('9999CC') onClick=Set('9999CC') height=10 width=10></td>
<td bgcolor=#99CCCC onMouseOver=View('99CCCC') onClick=Set('99CCCC') height=10 width=10></td>
<td bgcolor=#99FFCC onMouseOver=View('99FFCC') onClick=Set('99FFCC') height=10 width=10></td>
<td bgcolor=#CC00CC onMouseOver=View('CC00CC') onClick=Set('CC00CC') height=10 width=10></td>
<td bgcolor=#CC33CC onMouseOver=View('CC33CC') onClick=Set('CC33CC') height=10 width=10></td>
<td bgcolor=#CC66CC onMouseOver=View('CC66CC') onClick=Set('CC66CC') height=10 width=10></td>
<td bgcolor=#CC99CC onMouseOver=View('CC99CC') onClick=Set('CC99CC') height=10 width=10></td>
<td bgcolor=#CCCCCC onMouseOver=View('CCCCCC') onClick=Set('CCCCCC') height=10 width=10></td>
<td bgcolor=#CCFFCC onMouseOver=View('CCFFCC') onClick=Set('CCFFCC') height=10 width=10></td>
<td bgcolor=#FF00CC onMouseOver=View('FF00CC') onClick=Set('FF00CC') height=10 width=10></td>
<td bgcolor=#FF33CC onMouseOver=View('FF33CC') onClick=Set('FF33CC') height=10 width=10></td>
<td bgcolor=#FF66CC onMouseOver=View('FF66CC') onClick=Set('FF66CC') height=10 width=10></td>
<td bgcolor=#FF99CC onMouseOver=View('FF99CC') onClick=Set('FF99CC') height=10 width=10></td>
<td bgcolor=#FFCCCC onMouseOver=View('FFCCCC') onClick=Set('FFCCCC') height=10 width=10></td>
<td bgcolor=#FFFFCC onMouseOver=View('FFFFCC') onClick=Set('FFFFCC') height=10 width=10></td>
</tr>
<tr>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#FF00FF onMouseOver=View('FF00FF') onClick=Set('FF00FF') height=10 width=10></td>
<td bgcolor=#000000 onMouseOver=View('000000') onClick=Set('000000') height=10 width=10></td>
<td bgcolor=#9900FF onMouseOver=View('9900FF') onClick=Set('9900FF') height=10 width=10></td>
<td bgcolor=#9933FF onMouseOver=View('9933FF') onClick=Set('9933FF') height=10 width=10></td>
<td bgcolor=#9966FF onMouseOver=View('9966FF') onClick=Set('9966FF') height=10 width=10></td>
<td bgcolor=#9999FF onMouseOver=View('9999FF') onClick=Set('9999FF') height=10 width=10></td>
<td bgcolor=#99CCFF onMouseOver=View('99CCFF') onClick=Set('99CCFF') height=10 width=10></td>
<td bgcolor=#99FFFF onMouseOver=View('99FFFF') onClick=Set('99FFFF') height=10 width=10></td>
<td bgcolor=#CC00FF onMouseOver=View('CC00FF') onClick=Set('CC00FF') height=10 width=10></td>
<td bgcolor=#CC33FF onMouseOver=View('CC33FF') onClick=Set('CC33FF') height=10 width=10></td>
<td bgcolor=#CC66FF onMouseOver=View('CC66FF') onClick=Set('CC66FF') height=10 width=10></td>
<td bgcolor=#CC99FF onMouseOver=View('CC99FF') onClick=Set('CC99FF') height=10 width=10></td>
<td bgcolor=#CCCCFF onMouseOver=View('CCCCFF') onClick=Set('CCCCFF') height=10 width=10></td>
<td bgcolor=#CCFFFF onMouseOver=View('CCFFFF') onClick=Set('CCFFFF') height=10 width=10></td>
<td bgcolor=#FF00FF onMouseOver=View('FF00FF') onClick=Set('FF00FF') height=10 width=10></td>
<td bgcolor=#FF33FF onMouseOver=View('FF33FF') onClick=Set('FF33FF') height=10 width=10></td>
<td bgcolor=#FF66FF onMouseOver=View('FF66FF') onClick=Set('FF66FF') height=10 width=10></td>
<td bgcolor=#FF99FF onMouseOver=View('FF99FF') onClick=Set('FF99FF') height=10 width=10></td>
<td bgcolor=#FFCCFF onMouseOver=View('FFCCFF') onClick=Set('FFCCFF') height=10 width=10></td>
<td bgcolor=#FFFFFF onMouseOver=View('FFFFFF') onClick=Set('FFFFFF') height=10 width=10></td>
</tr>
</table>
 
</form>
</body></html>
/kalender/modules/jscalendar/_calendar-system.css
0,0 → 1,250
/* 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 <TR> containing navigation buttons */
}
 
.calendar thead .daynames { /* Row <TR> containing the day names */
}
 
.calendar thead .name { /* Cells <TD> 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 <TD> 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 <TD> */
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 <TD> */
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 <TR> in footer (only one right now) */
}
 
.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
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;
}
 
.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;
}
/kalender/modules/jscalendar/_calendar-tas.css
0,0 → 1,238
/* 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 <TR> 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 <TD> 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 <TR> containing the day names */
background: #fed;
}
 
/* The body part -- contains all the days in month. */
 
.calendar tbody .day { /* Cells <TD> 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 <TD> */
background: #ffe;
padding: 1px 3px 1px 1px;
border: 1px solid #bbb;
}
 
.calendar tbody td.active { /* Active (pressed) cells <TD> */
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 <TR> in footer (only one right now) */
text-align: center;
background: #988;
color: #000;
}
 
.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
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;
}
 
.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;
}
/kalender/modules/jscalendar/calendar-setup.js
0,0 → 1,181
/* 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.15 2004/02/04 08:10:03 mishoo 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("firstDay", 0); // defaults to "Sunday" first
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);
 
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.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.flat) {
if (typeof p.flatCallback == "function")
p.flatCallback(cal);
else
alert("No flatCallback given -- doing nothing.");
return false;
}
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 && p.singleClick && cal.dateClicked)
cal.callCloseHandler();
if (update && typeof p.onUpdate == "function")
p.onUpdate(cal);
};
 
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.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.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 (!(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();
}
cal.showsOtherMonths = params.showOthers;
cal.yearStep = params.step;
cal.setRange(params.range[0], params.range[1]);
cal.params = params;
cal.setDateStatusHandler(params.dateStatusFunc);
cal.setDateFormat(dateFmt);
if (mustCreate)
cal.create();
cal.parseDate(dateEl.value || dateEl.innerHTML);
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;
};
};
/kalender/modules/jscalendar/calendar.css
0,0 → 1,178
/* 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 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 <TR> containing navigation buttons */
background: #778;
color: #fff;
}
 
.calendar thead .daynames { /* Row <TR> containing the day names */
background: #bdf;
}
 
.calendar thead .name { /* Cells <TD> 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: #aaf;
color: #000;
border: 1px solid #04f;
padding: 1px;
}
 
.calendar thead .active { /* Active (pressed) buttons in header */
background: #77c;
padding: 2px 0px 0px 2px;
}
 
/* The body part -- contains all the days in month. */
 
.calendar tbody .day { /* Cells <TD> containing month days dates */
width: 2em;
color: #456;
text-align: right;
padding: 2px 4px 2px 2px;
}
 
.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 <TD> */
background: #def;
padding: 1px 3px 1px 1px;
border: 1px solid #bbb;
}
 
.calendar tbody td.active { /* Active (pressed) cells <TD> */
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 <TR> in footer (only one right now) */
text-align: center;
background: #556;
color: #fff;
}
 
.calendar tfoot .ttip { /* Tooltip (status bar) cell <TD> */
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) */
 
.combo {
position: absolute;
display: none;
top: 0px;
left: 0px;
width: 4em;
cursor: default;
border: 1px solid #655;
background: #def;
color: #000;
font-size: smaller;
}
 
.combo .label {
width: 100%;
text-align: center;
}
 
.combo .hilite {
background: #acf;
}
 
.combo .active {
border-top: 1px solid #46a;
border-bottom: 1px solid #46a;
background: #eef;
font-weight: bold;
}
/kalender/modules/jscalendar/calendar.js
0,0 → 1,1716
/* Copyright Mihai Bazon, 2002, 2003 | http://dynarch.com/mishoo/
* ------------------------------------------------------------------
*
* The DHTML Calendar, version 0.9.6 "Keep cool but don't freeze"
*
* 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
*/
 
// $Id: calendar.js,v 1.34 2004/02/06 18:53:11 mishoo Exp $
 
/** The Calendar object constructor. */
Calendar = function (firstDayOfWeek, dateStr, onSelected, onClose) {
// member variables
this.activeDiv = null;
this.currentDateEl = null;
this.getDateStatus = 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 = firstDayOfWeek; // 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;
// 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;
};
 
Calendar.getElement = function(ev) {
if (Calendar.is_ie) {
return window.event.srcElement;
} else {
return ev.currentTarget;
}
};
 
Calendar.getTargetElement = function(ev) {
if (Calendar.is_ie) {
return window.event.srcElement;
} else {
return ev.target;
}
};
 
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.firstChild.data = 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.firstChild.data = 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.firstChild.data;
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.firstChild.data = 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");
}
el.calendar.tooltips.firstChild.data = _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") {
Calendar.removeClass(cal.currentDateEl, "selected");
Calendar.addClass(el, "selected");
closing = (cal.currentDateEl == el);
if (!closing) {
cal.currentDateEl = el;
}
cal.date = new Date(el.caldate);
date = cal.date;
newdate = true;
// a date was clicked
if (!(cal.dateClicked = !el.otherMonth))
cal._init(cal.firstDayOfWeek, date);
} else {
if (el.navtype == 200) {
Calendar.removeClass(el, "hilite");
cal.callCloseHandler();
return;
}
date = (el.navtype == 0) ? new Date() : new Date(cal.date);
// 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 <mishoo@infoiasi.ro> 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.firstChild.data;
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.firstChild.data = 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())) {
// remember, "date" was previously set to new
// Date() if TODAY was clicked; thus, it
// contains today date.
return false;
}
break;
}
if (!date.equalsTo(cal.date)) {
cal.setDate(date);
newdate = true;
}
}
if (newdate) {
cal.callHandler();
}
if (closing) {
Calendar.removeClass(el, "hilite");
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;
if (text.substr(0, 1) != "&") {
cell.appendChild(document.createTextNode(text));
}
else {
// FIXME: dirty hack for entities
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("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"];
}
 
row = Calendar.createElement("tr", thead);
row.className = "headrow";
 
this._nav_py = hh("&#x00ab;", 1, -2);
this._nav_py.ttip = Calendar._TT["PREV_YEAR"];
 
this._nav_pm = hh("&#x2039;", 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("&#x203a;", 1, 1);
this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];
 
this._nav_ny = hh("&#x00bb;", 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.appendChild(document.createTextNode(Calendar._TT["WK"]));
}
for (var i = 7; i > 0; --i) {
cell = Calendar.createElement("td", row);
cell.appendChild(document.createTextNode(""));
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);
cell.appendChild(document.createTextNode(""));
}
for (var j = 7; j > 0; --j) {
cell = Calendar.createElement("td", row);
cell.appendChild(document.createTextNode(""));
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"] || "&nbsp;";
 
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.appendChild(document.createTextNode(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.appendChild(document.createTextNode(":"));
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 = "&nbsp;";
 
cal.onSetTime = function() {
var hrs = this.date.getHours();
var mins = this.date.getMinutes();
var pm = (hrs > 12);
if (pm && t12) hrs -= 12;
H.firstChild.data = (hrs < 10) ? ("0" + hrs) : hrs;
M.firstChild.data = (mins < 10) ? ("0" + mins) : mins;
if (t12)
AP.firstChild.data = pm ? "pm" : "am";
};
 
cal.onUpdateTime = function() {
var date = this.date;
var h = parseInt(H.firstChild.data, 10);
if (t12) {
if (/pm/i.test(AP.firstChild.data) && h < 12)
h += 12;
else if (/am/i.test(AP.firstChild.data) && h == 12)
h = 0;
}
var d = date.getDate();
var m = date.getMonth();
var y = date.getFullYear();
date.setHours(h);
date.setMinutes(parseInt(M.firstChild.data, 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.appendChild(document.createTextNode(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";
yr.appendChild(document.createTextNode(""));
div.appendChild(yr);
}
 
this._init(this.firstDayOfWeek, this.date);
parent.appendChild(this.element);
};
 
/** keyboard navigation, only for popup calendars */
Calendar._keyEvent = function(ev) {
if (!window.calendar) {
return false;
}
(Calendar.is_ie