var mouse_x=0;
var mouse_y=0;
var load_flag=0;
var Temp = new Object;

var plans_options = new Array();

var active_event_id = "";
var active_series_id = "";
var active_day_timestamp = "";
var current_calendar_id = "";
var dialog_box = null;

var info_window = new Object;
var info_window_width = 400;
var info_window_height = 400;

var plans_url = "";
var theme_url = "";
var css_path_url = "";

var page_width = 0;
var page_height = 0;
var event_target = null;
var browser_type = null;
var cal_password = '';

var logged_in = false;

// I hate this kludge!
//var context_menu_visible=false;

var calendars = new Array();
var events = new Array();
var pending_events = new Array();
var users = new Array();
var current_user = null;

var success = false;
var messages = "";

// this should always be called by <body onload=
function page_loaded()  {
  load_flag=1;
  xmlhttp_init();
  update_login();
  do_on_load();
  if (messages != null && messages != '') update_messages(messages);
  
}

// this should always be called by <body onunload=
function page_unloaded()  {
  if (info_window.close)
    {info_window.close();}
}

// most pages generated by plans.cgi override this function
function do_on_load() {
  //alert("(do_on_load)");
}

function update_messages(text)
{
  if (text) {
    document.getElementById("plans_messages").innerHTML = text;
    document.getElementById("plans_messages").style.display = "block";
    scrollto(document.getElementById("plans_messages"),0,-20);
  }
  else
    document.getElementById("plans_messages").style.display = "none";
}

function update_login() {

  if (!plans_options['sessions']) {
    document.getElementById('login_logout').parentNode.removeChild(document.getElementById('login_logout'));
    return;
  }

  if (logged_in) {
    document.getElementById('login_logout').innerHTML = "<a href=\"javascript:logout()\">"+get_lang('logout')+"</a>";
  }
  else {
    var text = "<span id=\"login_form\" style=\"display:none;\">";
        text += "Password: <input name=\"login_password\" type=\"password\" id=\"login_password\" style=\"width:12ex;\" onKeyPress=\"if (event.keyCode == 13) login();\"/>";
        text += " <a href=\"javascript:login()\">"+get_lang('submit')+"</a> "
        text += "</span>"
        text += "<a style=\"position:relative;\" id=\"login_switch\" href=\"javascript:toggle_login('login_form')\">"+get_lang('login')+"</a>";
        text += "<br style=\"clear:both;\"/>";
    document.getElementById('login_logout').innerHTML = text;
  }
}


function login_logout(logout) {
  
  var url = plans_url+"?cal_id="+current_calendar_id+"&js_login=1";
  
  if (logout)
    url += "&logout=1";
  else if (document.getElementById("login_password")) {
    var pwd = document.getElementById("login_password").value;
    url += "&cal_password="+pwd;
  }
  
  
  try {
    xmlhttp.open("GET", url, true);
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4) {
        
        eval(xmlhttp.responseText);
        
        update_messages(messages);
        update_login();
      }
    }
    xmlhttp.send(null)
  } catch (e) {} // do nothing
}

function login() {
  update_messages("logging in...");
  login_logout(false);
  
}

function logout() {
  update_messages("logging out...");
  login_logout(true);
}



  
function add_edit_user(user_id) {
  //alert("(add_user)");
  
  var current_user = null;
  var return_text = "";
  var temp = "";
  
  if (users[user_id])
    current_user = users[user_id];
  else
    current_user = new User();
  Temp.user_id = user_id;
    
  return_text += "<div onKeyPress=\"if (event.keyCode == 13) add_edit_user_submit();\">";

  return_text += "<div class=\"leftcol\"><span class=\"required_field\">"+plans_lang['add_user_name']+":</span></div>";
  return_text += "<div class=\"rightcol\"><input id=\"user_name\" value=\""+current_user.name+"\"/></div>";
  
  return_text += "<div class=\"leftcol\"><span class=\"required_field\">"+plans_lang['user_password']+":</span></div>";
  return_text += "<div class=\"rightcol\"><input id=\"user_password\" type=\"password\"/></div>";
  
  if (users[user_id]) {
    return_text += "<div class=\"leftcol\"><span class=\"optional_field\">"+plans_lang['user_new_password']+":</span></div>";
    return_text += "<div class=\"rightcol\"><input id=\"user_new_password\" type=\"password\"/></div>";
    
    return_text += "<div class=\"leftcol\"><span class=\"optional_field\">"+plans_lang['repeat_new_password']+":</span></div>";
    return_text += "<div class=\"rightcol\"><input id=\"user_repeat_password\" type=\"password\"/></div>";
  }
  else {
    return_text += "<div class=\"leftcol\"><span class=\"required_field\">"+plans_lang['repeat_password']+":</span></div>";
    return_text += "<div class=\"rightcol\"><input id=\"user_repeat_password\" type=\"password\"/></div>";
  }
  
  if (!logged_in) {
    return_text += "<div class=\"leftcol\"><span class=\"required_field\">"+plans_lang['calendar_password']+":</span></div>";
    return_text += "<div class=\"rightcol\"><input id=\"user_cal_password\" type=\"password\"/></div>";
  }
  
  
  temp = (users[user_id]) ? plans_lang['update_user'] : plans_lang['add_user']
  
  return_text += "<div class=\"leftcol\">&nbsp;</div><div class=\"rightcol\"><a href=\"javascript:add_edit_user_submit()\">"+temp+"</a></div>";
  
  if (users[user_id])
    return_text += "<div class=\"leftcol\">&nbsp;</div><div class=\"rightcol\" style=\"text-align:right;\"><a href=\"javascript:add_edit_user_submit(true)\">"+plans_lang['delete_user']+"</a></div>";
  
  return_text += "</div>";
  
  /*
  return_text += "<div class=\"leftcol\" style=\"margin-bottom:0;\">";

<div class="leftcol">
<p>$lang{permissions}</p>
</div>
<div class="rightcol">
<input type="radio" name="edit_calendar" id="edit_events" value=""><label for="edit_events">$lang{permissions_edit_events}</label><br/>
<input type="radio" name="edit_calendar" id="edit_calendar" value="1"><label for="edit_calendar">$lang{permissions_edit_calendar}</label><br/>
</div>

*/
  
  dialog_box_init();
  dialog_box.reset();
  

  temp = (users[user_id]) ? plans_lang['edit_user'] : plans_lang['add_user']
  dialog_box.setTitle(temp);  
  dialog_box.element.style.display = "block";
  
  if (users[user_id]) {
    dialog_box.anchor(document.getElementById(user_id+'_edit_user_link'))
  } else {
    dialog_box.anchor(document.getElementById('add_user_link'))
  }
  
  dialog_box.setContents(return_text);  
  
}

function add_edit_user_submit(delete_flag) {

  var user_id =(Temp.user_id) ? Temp.user_id : '';
  var name = document.getElementById('user_name').value;
  var password = document.getElementById('user_password').value;
  var new_password = (document.getElementById('user_new_password')) ? document.getElementById('user_new_password').value : "";
  var repeat_password = document.getElementById('user_repeat_password').value;
  var delete_user = (delete_flag)? 1 : ""; 
  
  var url = plans_url+"?add_edit_user=1&cal_id="+current_calendar_id+"&user_id="+user_id+"&delete="+delete_user+"&name="+name+"&password="+password+"&new_password="+new_password+"&repeat_password="+repeat_password;
  
  if (document.getElementById('cal_password'))
    url+= '&cal_password='+document.getElementById('user_cal_password').value;
  
  //alert("url: "+url);
  
  try {
    xmlhttp.open("GET", url, true);
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4) {
        //alert(xmlhttp.responseText);
        eval(xmlhttp.responseText);
        
        if (success) list_users();
        
        update_messages(messages);
      }
    }
    xmlhttp.send(null)
  } catch (e) {} // do nothing
  dialog_box.close();
}



function fade_preview()
{
  document.getElementById("bg_preview_e1").style.background = fade("#ffffcc", (1+parseInt(document.update_cal_form.background_events_fade_factor.value)));
  document.getElementById("bg_preview_e2").style.background = fade("#ccffff", (1+parseInt(document.update_cal_form.background_events_fade_factor.value)));

}

function fade(color, fade_factor)
{
  if (!color.match(/#([0-9]|[A-F]){6}/i))  // valid hex #color?
    return false;
  var rgb = hex2rgb(color.substring(1,7));
  var hsv = rgb2hsv(rgb);
  hsv[1] = hsv[1] / fade_factor;
  var new_rgb = hsv2rgb(hsv);
  return "rgb("+new_rgb[0]+","+new_rgb[1]+","+new_rgb[2]+")";
}


function add_new_ical() {
  dialog_box_init();
  dialog_box.reset();
  
  var text = ''
  text += '<div class="leftcol"><span class="required_field">'+plans_lang['ical_url']+':</span></div>';
  text += '<div class="rightcol"><input id="ical_url" value="'+''+'"/></div>';
  text += '<a href="javascript:add_new_ical_submit();">'+plans_lang['add_ical']+'</a>';
    
  dialog_box_init();
  dialog_box.reset();
  

  dialog_box.setTitle("Add New iCal calendar!");  
  dialog_box.setContents(text);  
  dialog_box.element.style.display = "block";
  dialog_box.anchor(document.getElementById('add_new_ical_link'));
}


function add_new_ical_submit() {
  var ical_url = document.getElementById('ical_url').value;
  
  try {
    xmlhttp.open("GET", plans_url+"?add_new_ical=1&ical_url="+ical_url,true);
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4) {
        //alert(xmlhttp.responseText);
        eval(xmlhttp.responseText);
        update_messages(messages);
        if (success) dialog_box.close();
      }
    }
    xmlhttp.send(null)
  } catch (e) {} // do nothing
}


function validate_event() {
  var url = plans_url+'?validate_event=1';
  url +='&evt_title='+document.getElementById('evt_title').value;
  url +='&evt_start_date='+document.getElementById('evt_start_date').value;
  url +='&evt_days='+document.getElementById('evt_days').value;
  url +='&all_day_event='+document.getElementById('all_day_event').value;
  url +='&evt_start_time='+document.getElementById('evt_start_time').value;
  url +='&event_end_time='+document.getElementById('evt_end_time').value;
  
  xmlhttp.open("GET", url, false);
  xmlhttp.send(null);
  //alert(xmlhttp.responseText);
  eval(xmlhttp.responseText);
  update_messages(messages);
  return success;
}



function dialog_box_init() {
  if (!dialog_box)
  {
    dialog_box = new DialogBox({'id':'dialog_box','element_id':'plans_dialog_box'});
  }
}


function list_users() {
  if (!users || users.length == 0) return;
  
  var results = "";
  //for (i=0;i<users.length;i++)
  for (var i in users)
  {
    results += users[i].name+' <a id="'+users[i].id+'_edit_user_link" href="javascript:add_edit_user('+users[i].id+')">('+get_lang('edit')+')</a><br/>';
  }
  
  if (document.getElementById('select_users'))
    document.getElementById('select_users').innerHTML = results;
}



function tab_show(tab_num) 
{
  if (tab_num == null) return;
  
  var elList, i;
  i=0;
  // update all tabs.
  while (document.getElementById("tab"+i) && i<100)
  {
    if (i == tab_num) 
    {
    // If the tab is the new active tab, activate it. 
      document.getElementById("tab"+i).className += " active";
      document.getElementById("tab_area"+i).style.display=""
      document.getElementById("tab"+i).blur();
    }
    else
    {
      // Otherwise, make sure the tab is deactivated.
      removename (document.getElementById("tab"+i),"active");
      document.getElementById("tab_area"+i).style.display="none"
    }
    i++;
  }
}

function toggle_visible(elname) 
{

  if (document.getElementById(elname) == null) return;
  el = document.getElementById(elname);
      

  if (el.style.display == "none") 
    el.style.display = ""
  else
    el.style.display = "none"
}

function toggle_login(elname) 
{
  toggle_visible(elname);
  
  if ((document.getElementById('login_switch').innerHTML == '[x]')) 
  {
    document.getElementById('login_switch').innerHTML = 'login';
    document.getElementById('login_switch').style.top = '0';
    document.getElementById('login_switch').style.left = '0';
  }
  else {
    document.getElementById('login_switch').innerHTML = '[x]';
    document.getElementById('login_switch').style.top = '-10px';
    document.getElementById('login_switch').style.left = '5px';
  }
  
  
  
}


function recur_toggle() {
  
  if (document.add_event_form.recurring_event.checked)
  {
    document.add_event_form.recurrence_type[0].disabled=false;
    document.add_event_form.recurrence_type[1].disabled=false;
    document.add_event_form.recurrence_type[2].disabled=false;
    document.add_event_form.recurrence_type[3].disabled=false;
    document.add_event_form.weekday_of_month_type.disabled=false;
    document.add_event_form.custom_months.disabled=false;
    document.add_event_form.year_fit_type[0].disabled=false;
    document.add_event_form.year_fit_type[1].disabled=false;
    document.add_event_form.custom_months.disabled=false;
    
    if (!document.add_event_form.recurrence_type[1].checked)
      document.add_event_form.weekday_of_month_type.disabled=true;
    if (document.add_event_form.year_fit_type[0].checked)
      document.add_event_form.custom_months.disabled=true;
      
      
    document.add_event_form.recur_end_date.disabled=false;
  }
  else
  {
    document.add_event_form.recurrence_type[0].disabled=true;
    document.add_event_form.recurrence_type[1].disabled=true;
    document.add_event_form.recurrence_type[2].disabled=true;
    document.add_event_form.recurrence_type[3].disabled=true;
    setTimeout("document.add_event_form.every_x_days.disabled=true",100);
    setTimeout("document.add_event_form.every_x_weeks.disabled=true",100);
    setTimeout("document.add_event_form.weekday_of_month_type.disabled=true",100);
    setTimeout("document.add_event_form.custom_months.disabled=true",100);
    document.add_event_form.year_fit_type[0].disabled=true;
    document.add_event_form.year_fit_type[1].disabled=true;
    document.add_event_form.custom_months.disabled=true;
    document.add_event_form.recur_end_date.disabled=true;
  }
  
  recurrence_type_update();
  //alert(document.add_event_form.recurring_event.checked);
}
function recurrence_type_update(last)
{
  
  document.add_event_form.weekday_of_month_type.disabled=true;
  document.add_event_form.every_x_days.disabled=true; 
  document.add_event_form.every_x_weeks.disabled=true; 
  
  if (document.add_event_form.recurrence_type[1].checked && !document.add_event_form.recurrence_type[1].disabled)
  {
    document.add_event_form.weekday_of_month_type.disabled=false;
  }
  if (document.add_event_form.recurrence_type[2].checked  && !document.add_event_form.recurrence_type[2].disabled)
  {
    document.add_event_form.every_x_days.disabled=false; 
  }
  if (document.add_event_form.recurrence_type[3].checked  && !document.add_event_form.recurrence_type[3].disabled)
  {
    document.add_event_form.every_x_weeks.disabled=false; 
  }
  
  if (!last) setTimeout("recurrence_type_update(true)",100);
}


function update_remote_calendar_requests()
{
  if (!document.update_cal_form || !document.update_cal_form.allow_remote_calendar_requests)
    return;

  if (document.update_cal_form.allow_remote_calendar_requests.checked)
  {
    document.update_cal_form.remote_calendar_requests_require_password.disabled = false;
    if (document.update_cal_form.remote_calendar_requests_require_password.checked)
      document.update_cal_form.remote_calendar_requests_password.disabled = false;
  } 
}  

  
function show_event_contextmenu(e, event_id, menu_bgcolor, series_id)
{
  if (e.ctrlKey || plans_options['right_click_menus_enabled'] != 1) return true;
  
  active_event_id = event_id;
  active_series_id = series_id;
  
  var themenu = document.getElementById("contextmenu")
  
  var event_contextmenu_text = "<div id=\"contextmenu_innerbox\" style=\"padding-top:2px;padding-bottom:2px;\">";
  event_contextmenu_text += "<div class=\"context_menuitem\" onmouseup=\"edit_event()\" onmouseover=\"context_menuitem_highlight(this, '#000000')\" onmouseout=\"context_menuitem_unhighlight(this)\">"+plans_lang['context_menu_edit_event']+"</div>";
  event_contextmenu_text += "<div class=\"context_menuitem\" onmouseup=\"delete_event()\" onmouseover= \"context_menuitem_highlight(this, '#000000')\" onmouseout=\"context_menuitem_unhighlight(this)\">"+plans_lang['context_menu_delete_event']+"</div>";
  event_contextmenu_text += "</div>";
  
  themenu.innerHTML = event_contextmenu_text;
  document.getElementById("contextmenu_innerbox").style.borderStyle = "solid";
  document.getElementById("contextmenu_innerbox").style.borderWidth = "1px";
  document.getElementById("contextmenu_innerbox").style.borderTopColor = menu_bgcolor;
  document.getElementById("contextmenu_innerbox").style.borderLeftColor = menu_bgcolor;

  show_contextmenu(themenu, e);  
  return false;
}



function show_day_contextmenu(e, day_timestamp)
{
  if (e.ctrlKey || plans_options['right_click_menus_enabled'] != 1) return true;

  get_page_boundaries();
  active_day_timestamp = day_timestamp;
  
  var themenu = document.getElementById("contextmenu")
  
  var day_contextmenu_text = "";
  day_contextmenu_text += "<div id=\"contextmenu_innerbox\" style=\"padding-top:2px;padding-bottom:2px;\">";
  day_contextmenu_text += "<div class=\"context_menuitem\" onmouseup=\"add_event_on_day()\" onmouseover=\"context_menuitem_highlight(this, '#000000')\" onmouseout=\"context_menuitem_unhighlight(this)\">"+plans_lang['add_event_on_this_day']+"</div>";
  day_contextmenu_text += "</div>";
  
  themenu.innerHTML = day_contextmenu_text;
  document.getElementById("contextmenu_innerbox").style.borderStyle = "solid";
  document.getElementById("contextmenu_innerbox").style.borderWidth = "1px";
  document.getElementById("contextmenu_innerbox").style.borderTopColor = "#ffffff";
  document.getElementById("contextmenu_innerbox").style.borderLeftColor = "#ffffff";
  show_contextmenu(themenu, e);
  return false;
}


function show_contextmenu(contextmenu, event) {

  get_page_boundaries();

  contextmenu.style.left = mouse_x+"px";
  contextmenu.style.top = mouse_y+"px";
  contextmenu.style.zIndex = 100000;
  contextmenu.style.visibility = "visible";
  
  // adjust menu if near window edge
  if (browser_type != "IE")
  {
    if (distance_to_right_edge < contextmenu.offsetWidth)
      contextmenu.style.left = 2+mouse_x - contextmenu.offsetWidth+"px";
    
    if (distance_to_bottom < contextmenu.offsetHeight)
      contextmenu.style.top = 2+mouse_y - contextmenu.offsetHeight+"px";
  }
  
  // prevent default right-click menu from appearing.
  //if (browser_type == "IE") 
    event.cancelBubble = true;
	if (event.stopPropagation) event.stopPropagation(); 
  if (event.preventDefault) event.preventDefault();
  
}

function hide_contextmenus()
{
  document.getElementById("contextmenu").style.visibility = "hidden";
  //context_menu_visible = false;
}

function context_menuitem_highlight(element, color)
{
  element.className = "context_menuitem_highlight";
}

function context_menuitem_unhighlight(element)
{
  element.className = "context_menuitem";
}


function edit_event()
{
  window.location.href = plans_url + "?active_tab=1&add_edit_event=edit&evt_id=" + active_event_id + "";
}

function add_event_on_day()
{
  window.location.href = plans_url + "?active_tab=1&cal_id="+current_calendar_id+"&add_edit_event=add&add_date_timestamp=" + active_day_timestamp;
}


function delete_event()
{
  var info_window_x = window_x()-400;
  var info_window_y = window_y();

  info_window = this.open("", "info_window", "resizable=yes,status=yes,scrollbars=yes,top="+info_window_y+",left="+info_window_x+",width=400,height=200");
  doc = info_window.document;
  doc.open('text/html');
  doc.write('<html>');
  doc.write('<title>'+get_lang('delete_event')+'</title>');
  doc.write('<base target=\"'+main_window_name+'\\">');  
  doc.write('<link rel=\"stylesheet" href=\"'+css_path+'\" type=\"text/css\" media=screen>');
  doc.write('<body onload=\"document.delete_event_form.cal_password.focus();\">');
  
  var delete_event_text = "";
  delete_event_text += "<p class=\"cal_title\">"+get_lang('delete_event')+"</p>";
  delete_event_text += "<div class=\"info_box\">";
  delete_event_text += "<form name=\"delete_event_form\" action=\""+plans_url+"\" method=\"POST\">";
  delete_event_text += "<input type=\"hidden\" name=\"active_tab\" value=\"1\">";
  delete_event_text += "<input type=\"hidden\" name=\"add_edit_cal_action\" value=\"edit\">";
  delete_event_text += "<input type=\"hidden\" name=\"del_event_button\" value=\"delete\">";
  if (plans_options['disable_passwords'] != 1) 
    delete_event_text += "<span class=\"required_field\">"+get_lang('password')+": </span><input type=\"password\" name=\"cal_password\">";
    
  doc.write(delete_event_text);
  
  if (active_series_id)
  {
    var delete_series_text = "<br/><input type=\"checkbox\" name=\"all_in_series\" value=\"1\"><span class=\"small_note\">"+get_lang('recurring_event_delete_all2')+"</span>";
    doc.write(delete_series_text);
    doc.write('<input type=\"hidden\" name=\"series_id\" value=\"'+active_series_id+'\">');
  }
  doc.write('<input type="hidden\" name=\"evt_id\" value=\"'+active_event_id+'\">');
  doc.write('<br/><input type="submit\" value= \"Delete\">');
  doc.write('</form></div>');
  doc.write('</body></html>');
  doc.close();
  info_window.focus();
}

function pending_events_toggle_events(mode) {
  for (var pending_events_id in pending_events)
  {
    if (mode == 1) {
      if (!document.getElementById('pending_event_approve_'+pending_events_id).checked && !document.getElementById('pending_event_delete_'+pending_events_id).checked)
        document.getElementById('pending_event_approve_'+pending_events_id).checked = true;
      else if (document.getElementById('pending_event_approve_'+pending_events_id).checked && !document.getElementById('pending_event_delete_'+pending_events_id).checked)
        document.getElementById('pending_event_approve_'+pending_events_id).checked = false;
      
    } else if (mode == 2) {
      if (!document.getElementById('pending_event_approve_'+pending_events_id).checked && !document.getElementById('pending_event_delete_'+pending_events_id).checked)
        document.getElementById('pending_event_delete_'+pending_events_id).checked = true;
      else if (document.getElementById('pending_event_delete_'+pending_events_id).checked && !document.getElementById('pending_event_approve_'+pending_events_id).checked)
        document.getElementById('pending_event_delete_'+pending_events_id).checked = false;
    } 
  }
}


function approve_pending_events_toggle() {
  var results = '';
  
  if (document.getElementById('pending_events').style.display == 'block')
  {
    document.getElementById('pending_events').style.display = 'none';
    return;
  }
  
  results += '<div style="text-align:right;"><img src="'+theme_url+'/graphics/green_check.gif" onclick="pending_events_toggle_events(1)"><img src="'+theme_url+'/graphics/trashcan.gif" onclick="pending_events_toggle_events(2)"/></div>'

  for (var pending_events_id in pending_events)
  {
    //results += pending_events_id + '<br/>';
    results += generate_pending_event(pending_events[pending_events_id]);
    //results += "asdf";
  }
  
  results += "<br style=\"clear:both;\">";
  results += "<a style=\"border:solid 1px #ccc;padding:4px;margin-top:5px;\" href=\"javascript:approve_pending_events_submit()\">"+get_lang('email_reminder_text5')+"</a>";
  results += "<br style=\"clear:both;\">";
  
  document.getElementById('pending_events').innerHTML = results;
  document.getElementById('pending_events').style.display = 'block';
}

function approve_pending_events_submit() {
  
  var events_to_approve = new Array();
  var events_to_delete = new Array();
  
  // get approved events
  for (pending_event_id in pending_events)
  {
    var approve_el = document.getElementById("pending_event_approve_"+pending_event_id);
    var delete_el = document.getElementById("pending_event_delete_"+pending_event_id);
    if (approve_el && approve_el.checked)
        events_to_approve.push(pending_event_id);
    
    if (delete_el && delete_el.checked)
        events_to_delete.push(pending_event_id);
  }
  if (events_to_approve.length == 0 && events_to_delete.length == 0) {
    alert(get_lang('no_pending_events_checked'));
    return;
  }

  if (!logged_in && cal_password == '') {
    var text = ''
    text += '<div class="leftcol"><span class="required_field">'+plans_lang['calendar_password']+':</span></div>';
    text += '<div class="rightcol"><input id="cal_password" type="password\"/></div>';
    text += '<a href="" onclick="cal_password = document.getElementById(\'cal_password\').value;approve_pending_events_submit();dialog_box.close();return false;" onKeyPress=\"if (event.keyCode == 13) cal_password = document.getElementById(\'cal_password\').value;approve_pending_events_submit();dialog_box.close();">ok</a>';

    dialog_box_init();
    dialog_box.reset();

    dialog_box.setTitle("Password Needed");
    dialog_box.setContents(text);
    dialog_box.element.style.display = "block";
    dialog_box.anchor(document.getElementById('tab_menu'))
    return;
  }
   
  var url = plans_url+"?manage_pending_events=1&approve="+events_to_approve+"&delete="+events_to_delete;
  if (cal_password != '')
    url += "&cal_password="+cal_password;
  
  try {
    xmlhttp.open("GET", url, true);
    xmlhttp.onreadystatechange=function() {
      if (xmlhttp.readyState==4) {
        //alert(xmlhttp.responseText);
        eval(xmlhttp.responseText);
        update_messages(messages);
      }
    }
    xmlhttp.send(null)
  } catch (e) {} // do nothing
  
  //alert("events_to_approve: "+ events_to_approve + "\nevents_to_delete: "+ events_to_delete);
}

function do_onresize()
{
  if (document.body.clientWidth) {
    opener.info_window_width = document.body.clientWidth;
    opener.info_window_height = document.body.clientHeight;
  }  else if (this.outerWidth) {
    opener.info_window_width = this.outerWidth;
    opener.info_window_height = this.outerHeight;
  }
}



function display_event(evt_id)
{
  var info_window_x = window_x()-info_window_width;
  var info_window_y = window_y();
  
  if (evt_id.match(/^r/)) // remote event
  {
    var URL_string = remote_event_details[evt_id].url;
    info_window = this.open(URL_string, "info_window", "resizable=yes,status=yes,scrollbars=yes,top="+info_window_y+",left="+info_window_x+",width="+info_window_width+",height="+info_window_height);
  }
  else  // local event
  {
    var URL_string = plans_url+"?view_event=1&evt_id="+evt_id;
    info_window = this.open(URL_string, "info_window", "resizable=yes,status=yes,scrollbars=yes,top="+info_window_y+",left="+info_window_x+",width="+info_window_width+",height="+info_window_height);
  }
  
  info_window.focus();
}

function display_pending_event(pending_event_id)
{
  var info_window_x = window_x()-info_window_width;
  var info_window_y = window_y();
  
  var URL_string = plans_url+"?view_pending_event=1&pending_event_id="+pending_event_id;
  info_window = this.open(URL_string, "info_window", "resizable=yes,status=yes,scrollbars=yes,top="+info_window_y+",left="+info_window_x+",width="+info_window_width+",height="+info_window_height);
  
  info_window.focus();
}



function generate_pending_event(event) {
  var results = "";
  
  results += "<div style=\"text-align:right;\">";
  results += generate_list_event(event, "javascript:display_pending_event("+event.id+")");
  results +="<input name=\"pending_event_"+event.id+"\" id=\"pending_event_approve_"+event.id+"\" type=\"radio\"/><input name=\"pending_event_"+event.id+"\" id=\"pending_event_delete_"+event.id+"\" type=\"radio\"/></div>"
  
  return results;
}

function generate_list_event(event, link) {
  var results = "";
  
  var date_string;
  var weekday_string;
  
  //var start_date = new Date(event.start*1000);
    
    //date_string = plans_lang[]  $months_abv[$event_start_timestamp_array[4]] $event_start_timestamp_array[3]";
    //weekday_string = $day_names_abv[$event_start_timestamp_array[6]]
    
  var nice_start_date = nice_date(event.start, event.end);

    
    results += "<span class=\"small_note\" style=\"line-height:20px;\">"+nice_start_date;
  
//  else #multi-day event
//  {
//    @event_end_timestamp_array = gmtime $event{end};
//    if ($event_start_timestamp_array[4] eq $event_end_timestamp_array[4])
//    {
//      $date_string="$months_abv[$event_start_timestamp_array[4]] $event_start_timestamp_array[3]-$event_end_timestamp_array[3]";
//    }
//    else
//    {
////      $date_string="$months_abv[$event_start_timestamp_array[4]] $event_start_timestamp_array[3] - $months_abv[$event_end_timestamp_array[4]] $event_end_timestamp_array[3]";
//    }
//    $weekday_string = "$day_names_abv[$event_start_timestamp_array[6]]-$day_names_abv[$event_end_timestamp_array[6]]";
//  }

  if (event.icon && event.icon != "blank") results += "<img src=\""+theme_url+"/icons/"+event.icon+"_16x16.gif\"/>";
  
  results += "<a href=\"javascript:display_pending_event("+event.id+")\">"+event.title+"</a>";
  results += "</span>"
  return results;

}


function nice_date(start, end) {
  start = new Date(start*1000);
  end = new Date(end*1000);
  var results = "";
  var separator_string = " - ";

  if (date_format == 'dd/mm/yy')
  {
    if (start.getUTCMonth() == end.getUTCMonth() && start.getUTCFullYear() == end.getUTCFullYear() && start.getUTCDate() == end.getUTCDate())
    { //same year, same month, same day
      results = start.getUTCDate()+" "+plans_lang['months'][start.getUTCMonth()]+","+start.getUTCFullYear();
    }
    else if (start.getUTCMonth() == end.getUTCMonth() && start.getUTCFullYear() == end.getUTCFullYear())
    { //same year, same month
      results = start.getUTCDate()+separator_string+end.getUTCDate()+plans_lang['months'][start.getUTCMonth()]+","+start.getUTCFullYear();
    }
    else if (start.getUTCFullYear() != end.getUTCFullYear())
    { //different year
      results = start.getUTCDate()+plans_lang['months'][start.getUTCMonth()]+","+start.getUTCFullYear()+separator_string+end.getUTCDate()+plans_lang['months'][end.getUTCMonth()]+","+end.getUTCFullYear();
    }
    else 
    { //same year, different months
      results = start.getUTCDate()+plans_lang['months'][start.getUTCMonth()]+separator_string+end.getUTCDate()+plans_lang['months'][end.getUTCMonth()]+","+end.getUTCFullYear();
    }
  }
  else
  {
    if (start.getUTCMonth() == end.getUTCMonth() && start.getUTCFullYear() == end.getUTCFullYear() && start.getUTCDate() == end.getUTCDate())
    { //same year, same month, same day
      results = plans_lang['months'][start.getUTCMonth()]+" "+start.getUTCDate()+","+start.getUTCFullYear();
    }
    else if (start.getUTCMonth() == end.getUTCMonth() && start.getUTCFullYear() == end.getUTCFullYear())
    { //same year, same month
      results = plans_lang['months'][start.getUTCMonth()]+" "+start.getUTCDate()+separator_string+end.getUTCDate()+","+start.getUTCFullYear();
    }
    else if (start.getUTCFullYear() != end.getUTCFullYear())
    { //different year
      results = plans_lang['months'][start.getUTCMonth()]+" "+start.getUTCDate()+","+start.getUTCFullYear()+separator_string+plans_lang['months'][end.getUTCMonth()]+" "+end.getUTCDate()+","+end.getUTCFullYear();
    }
    else 
    { //same year, different months
      results = plans_lang['months'][start.getUTCMonth()]+" "+start.getUTCDate()+separator_string+plans_lang['months'][end.getUTCMonth()]+" "+end.getUTCDate()+","+end.getUTCFullYear();
    }
  
  }
  return results;
}



function xmlhttp_init() {
  //alert(" (xmlhttp_init) start");
  //if (xmlhttp) return;
  
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }

  if (!xmlhttp && typeof XMLHttpRequest!='undefined')
    xmlhttp = new XMLHttpRequest();

  //alert(" (xmlhttp_init) done");
}

function docjslib_getRealLeft(imgElem) {
  xPos = imgElem.offsetLeft;
  tempEl = imgElem.offsetParent;
    //alert("element " + imgElem.id + "\\nparent "+ tempEl.id);
    //alert("element " + imgElem + "\\nparent "+ tempEl);
    while (tempEl != null) {
      xPos += tempEl.offsetLeft;
      tempEl = tempEl.offsetParent;
    }
  return xPos;
}

function docjslib_getRealTop(imgElem) {
  yPos = imgElem.offsetTop;
  tempEl = imgElem.offsetParent;
  while (tempEl != null) {
      yPos += tempEl.offsetTop;
      tempEl = tempEl.offsetParent;
    }
  return yPos;
}

function removename(el, name) {
  var i, curList, newList;
  // Remove the given class name from the className property of the element.
  newList = new Array();
  curList = el.className.split(" ");
  for (i = 0; i < curList.length; i++)
    if (curList[i] != name)
      newList.push(curList[i]);
  el.className = newList.join(" ");
}

function blink(el, times, onoff)
{
  if (times==0) 
  {
    if (onoff == 0 && document.getElementById(el).className.match(/blink/))
      removename (document.getElementById(el),"blink");
    if (onoff == 1 && !document.getElementById(el).className.match(/blink/))
      document.getElementById(el).className += " blink";
    return;
  }
  
  if (document.getElementById(el).className.match(/blink/))
    removename (document.getElementById(el),"blink");
  else
    document.getElementById(el).className += " blink";
  
  setTimeout("blink('"+el+"',"+(times-1)+", "+onoff+")", 100);
  
}

function get_lang(key)
{
  if (plans_lang[key]) return plans_lang[key];
  return '';
}

var dragObj = new Object();
dragObj.zIndex = 0;

function dragStart(event, id) {

  var el;
  var x, y;

  // If an element id was given, find it. Otherwise use the element being
  // clicked on.

  if (id)
    dragObj.elNode = document.getElementById(id);
  else {
    if (window.event.srcElement)
      dragObj.elNode = window.event.srcElement;
    else if (event.target)
      dragObj.elNode = event.target;

    // If this is a text node, use its parent element.

    if (dragObj.elNode.nodeType == 3)
      dragObj.elNode = dragObj.elNode.parentNode;
  }
  
  dragObj.cursorStartX = mouse_x;
  dragObj.cursorStartY = mouse_y;
  dragObj.elStartLeft  = parseInt(dragObj.elNode.style.left, 10);
  dragObj.elStartTop   = parseInt(dragObj.elNode.style.top,  10);

  if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
  if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;
  dragObj.elNode.style.zIndex = ++dragObj.zIndex;
  // Capture mousemove and mouseup events on the page.

  if (document.attachEvent) {
    document.attachEvent("onmousemove", dragGo);
    document.attachEvent("onmouseup",   dragStop);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  
  if (document.addEventListener) {
    document.addEventListener("mousemove", dragGo,   true);
    document.addEventListener("mouseup",   dragStop, true);
    event.preventDefault();
  }    
}

function dragGo(event) {
  dragObj.elNode.style.left = (dragObj.elStartLeft + mouse_x - dragObj.cursorStartX) + "px";
  dragObj.elNode.style.top  = (dragObj.elStartTop  + mouse_y - dragObj.cursorStartY) + "px";
  
  if (window.event) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  
  if (event.preventDefault)
    event.preventDefault();  
} 

function dragStop(event) {
  // Stop capturing mousemove and mouseup events.

  if (document.detachEvent) {
    document.detachEvent("onmousemove", dragGo);
    document.detachEvent("onmouseup",   dragStop);
  }
  if (document.removeEventListener) {
    document.removeEventListener("mousemove", dragGo,   true);
    document.removeEventListener("mouseup",   dragStop, true);
  }
}



/**
 * Sets a Cookie with the given name and value.
 *
 * name       Name of the cookie
 * value      Value of the cookie
 * [expires]  Expiration date of the cookie (default: end of current session)
 * [path]     Path where the cookie is valid (default: path of calling document)
 * [domain]   Domain where the cookie is valid
 *              (default: domain of calling document)
 * [secure]   Boolean value indicating if the cookie transmission requires a
 *              secure transmission
 */
function setcookie(name, value, expires, path, domain, secure)
{
    document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

function XBrowserAddHandler(target,eventName,handlerName) { 
  if ( target.addEventListener ) { 
    target.addEventListener(eventName, function(e){target[handlerName](e);}, false);
  } else if ( target.attachEvent ) { 
    target.attachEvent("on" + eventName, function(e){target[handlerName](e);});
  } else { 
    var originalHandler = target["on" + eventName]; 
    if ( originalHandler ) { 
      target["on" + eventName] = function(e){originalHandler(e);target[handlerName](e);}; 
    } else { 
      target["on" + eventName] = target[handlerName]; 
    } 
  } 
}

function scrollto(el, xoffset, yoffset) {
  var x = docjslib_getRealLeft(el) + xoffset;
  var y = docjslib_getRealTop(el) + yoffset;
  window.scrollTo(x, y);
}


// classes

function User(i, n) {
	this.id = (i) ? i : null;        // id must be unique among users
	this.name = (n) ? n : "";
}


function Event(properties) {
  this.id = (properties['id']) ? properties['id'] : null;        // id must be unique among events
	this.title = (properties['title']) ? properties['title'] : "";
	this.icon = (properties['icon']) ? properties['icon'] : null;
  this.start = properties['start'];
  this.end = properties['end'];
  this.days = properties['days'];
}

function DialogBox(properties) {

  this.id = (properties['id']) ? properties['id'] : null;
  this.title = (properties['title']) ? properties['title'] : '';
  this.element_id = (properties['element_id']) ? properties['element_id'] : null;
  this.contents = properties['contents'];
  this.element = document.createElement('div');     // the DOM element that holds the dialog box
  this.element.style.display = "none";
  this.element.className += "dialog_box";
  
  if (this.element_id) {
    this.element.id = this.element_id;
  } else {
    this.element.id = "dialog_box";
    if (this.id) this.element.id += "_"+this.id;
  }
  
  document.getElementsByTagName("body").item(0).appendChild(this.element);
  var temp = '<div class="header" onmousedown="dragStart(event, \''+this.element.id+'\')"><a id=\"'+this.element.id+'_hide" class="close" href="javascript:'+this.id+'.close()">[X]</a><span class="title" id="'+this.element.id+'_title">'+this.title+'</span></div>';
  temp += '<div class="contents" id="'+this.element.id+'_contents"></div>';
  temp += '<br style="clear:both;"/>';
  temp += '</div>';
  this.element.innerHTML = temp;
  
  this.hide_element = document.getElementById(this.element.id+"_hide");
  //XBrowserAddHandler(this.hide_element,"mousedown","mousedownHandler");
  
  this.hide_element.mousedownHandler = function() {
    //var id = this.id.replace(/_hide/, "");
    var eval_text = this.id+".close();";
    alert(eval_text);
    eval(eval_text);
  }

  this.reset = function()  {
    document.getElementById(this.element.id+"_title").innerHTML = "";
    document.getElementById(this.element.id+"_contents").innerHTML = "";
  }
  
  this.setContents = function(contents) {
    document.getElementById(this.element.id+"_contents").innerHTML = contents;
  }
  
  this.setTitle = function(title) {
    document.getElementById(this.element.id+"_title").innerHTML = title;
  }
  
  this.close = function() {
    this.element.style.display = "none";
  }
  
  this.anchor = function(el) {
    if (!el) return;
    this.element.style.left = docjslib_getRealLeft(el)+10+"px";
    this.element.style.top = docjslib_getRealTop(el)+10+"px";
  }
  
}
