function create_cookie(name, value, days)
{
  if (days)
  {
    var date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    var expires = "; expires=" + date.toGMTString();
  }
  else
    var expires = "";
  document.cookie = name + "=" + value + expires + "; path=/";
}

function read_cookie(name)
{
  name += "=";
  var splits = document.cookie.split(";");
  for(var i = 0; i < splits.length; i++)
  {
    var split = splits[i];
    while (split.charAt(0) == " ")
      split = split.substring(1, split.length);
    if (split.indexOf(name) == 0)
    {
//      alert("Returning " + split.substring(name.length, split.length))
      return split.substring(name.length, split.length)
    }
  }
  return null
}

function erase_cookie(name)
{
  createCookie(name, "", -1);
}

function get_object_position(obj)
{
  var left = 0
  var top = 0
  var width = obj.offsetWidth
  var height = obj.offsetHeight
  if (obj.offsetParent)
  {
    do
    {
      left += obj.offsetLeft;
      top += obj.offsetTop;
    } while (obj = obj.offsetParent);
  }
  return [left, top, left + width, top + height, left + width / 2, top + height / 2, width, height]
}

function get_object_position_percent(obj, width, height)
{
  var ret = get_object_position(obj)
  return [ret[0] / width, ret[1] / height, ret[2] / width, ret[3] / height, ret[4] / width, ret[5] / height, ret[6] / width, ret[7] / height]
}

function basename(path)
{
  return path.replace(/^.*[\/\\]/g, '')
}

function roundf(x, scalar)
{
  return Math.round(x * scalar) / scalar
}

function format_money(x)
{
  return "$" + x.toFixed(2)
}

function percent_to_color(percent)
{
  percent *= 0.7
  var segment = percent * 10;

  if (percent <= 0.0)
    color = "#000000";
  else
  {
    percent = segment / 10.0 + 0.05;
    if (percent < 0.1)
    {
      var r = 255;
      var g = 0;
      var b = 85 - percent / 0.1 * 85;
    }
    else if (percent < 0.3)
    {
      var r = 255;
      var g = Math.sqrt((percent - 0.1) / 0.2) * 255;
      var b = 0;
    }
    else if (percent < 0.7)
    {
      var raw = (percent - 0.3) / 0.5;
      var r = 255 - raw * raw * 255;
      var g = 255;
      var b = 0;
    }
    else
    {
      var r = 0;
      var g = 255 - (percent - 0.7) / 0.5 * 255;
      var b = (percent - 0.7) / 0.5 * 255;
    }
    color = "#" + byte_to_hex(r) + byte_to_hex(g) + byte_to_hex(b);
  }
  return color
}

function getCheckedValue(radioObj)
{
  if (!radioObj)
    return "";
  var radioLength = radioObj.length;
  if(radioLength == undefined)
  {
    if(radioObj.checked)
      return radioObj.value;
    else
      return "";
  }
  for(var i = 0; i < radioLength; i++)
  {
    if(radioObj[i].checked)
    {
      return radioObj[i].value;
    }
  }
  return "";
}

function esc(x)
{
  x = x.replace(/\&/g, '&amp;')
  x = x.replace(/\</g, '&lt;')
  x = x.replace(/\>/g, '&gt;')
  x = x.replace(/\n/g, '<br>')
  return x
}

function esc_arr(x)
{
  for (var i = 0; i < x.length; i++)
  {
    x[i] = esc(x[i])
  }

  return x
}

function esc_arr_arr(x)
{
  for (var i = 0; i < x.length; i++)
    x[i] = esc_arr(x[i])

  return x
}

function get_icon(reliability, power, icon_dir)
{
  var icon_width = Math.pow(power / 16.0, 0.35) + 10.0;
  var icon_height = icon_width * 1.5
  var icon = new GIcon(G_DEFAULT_ICON);
  icon.image = "icons/" + icon_dir + "/icon" + Math.round(reliability * 10) + ".png";
  icon.iconSize = new GSize(icon_width, icon_height)
  icon.shadowSize = new GSize(icon_width * 2, icon_height)
  icon.iconAnchor = new GPoint(icon_width / 2, icon_height)
  return icon
}

function set_value(name)
{
  document.getElementById(name).value = gup(name);
}

function set_iframe_value(frame, name)
{
  window.frames[frame].document.getElementById(name).value = gup(name);
}

function display_available_hours_help()
{
  alert("'Available hours' should contain a list of times that the charging\n" +
"station is open.  Days are (M)onday, (T)uesday, (W)ednesday,\n" +
"Thu(R)sday, (F)riday, (S)aturday, and S(U)nday.  Months are\n" +
"recognized, both in the form of three letter abbreviations and\n" +
"in full names.  Some US/international holidays are also recognized.\n" +
"Order is time/weekdays/days/months/years, with all fields optional.\n" +
"\n" +
"Proper examples:\n" +
"\n" +
"'9:00AM to 5:00PM MTWRF'" +
"'5:00 to 20:00 MWF + 10:00 to 14:00 SU'\n" +
"'10:00AM to 5:30PM MTWRF - 12:00AM-1:00PM MTWRF'\n" +
"'6:00AM to 9:00PM MWF 13 May to 28 Sep 2008 to 2015'\n" +
"'June'\n" +
"'MTWRFSU - Labor Day - Christmas'\n" +
"\n" +
"Invalid examples:\n" +
"\n" +
"'9:00 to 5:00' (non-military time without AM/PM)\n" +
"'9:00AM-5:00PM' (usage of '-' where 'to' should be)\n" +
"'MTWRF 9:00AM-5:00PM' (order is important)\n" +
"\n" +
"For charging dates/times, any date/time range that you specify is\n" +
"assumed to mean that you might *arrive* within that range.  The time\n" +
"to charge needs to be added onto that.")
}


// Datetime ///////////////////////////////////////////////////////////////////

var months = [
  "JAN(?:UARY)?",
  "FEB(?:RUARY)?", 
  "MAR(?:CH)?", 
  "APR(?:IL)?", 
  "MAY", 
  "JUN(?:E)?", 
  "JUL(?:Y)?", 
  "AUG(?:UST)?", 
  "SEP(?:TEMBER)?",
  "OCT(?:OBER)?",
  "NOV(?:EMBER)?",
  "DEC(?:EMBER)?"
]

var holidays_lambda = [
  "NEW\\s+YEAR\\'?S\\s+DAY",
  "MARTIN\\s+LUTHER\\s+KING(?:\\')?S?(?:\\s+JR\\.?(?:\\'S)?)?\\s+(?:BIRTH)?DAY",
  "VALENTINE(?:\\')S\\s+DAY",
  "CARNIVAL", 
  "MARDI\\s+GRAS", 
  "ASH\\s+WEDNESDAY", 
  "LENT", 
  "ST(?:\\.)?\\s+PATRICK(?:\\')?S\\s+DAY", 
  "PALM\\s+SUNDAY", 
  "GOOD\\s+FRIDAY", 
  "EASTER(?:\\s+SUNDAY)", 
  "EARTH\\s+DAY", 
  "CINCO\\s+DE\\s+MAYO", 
  "MOTHER\\'?S\\s+DAY", 
  "MEMORIAL\\s+DAY", 
  "FATHER(?:\\')?S\\s+DAY", 
  "JULY\\s+(?:FOUR|4)(?:TH)|(?:FOUR|4)TH\\s+OF\\s+JULY|INDEPENDENCE\\s+DAY", 
  "LABOU?R\\s+DAY", 
  "HALLOWEEN", 
  "ELECTION\\s+DAY", 
  "VETERAN(?:\\')S\\s+DAY", 
  "THANKSGIVING", 
  "CHRISTMAS", 
  "NEW\\s+YEAR\\'?S\\s+EVE"
]

var months_str = ""
for (var month in months)
  months_str += month + "|"
months_str = "(?:" + months_str.substring(0, months_str.length - 1) + ")"

var holidays_str = ""
for (var holiday in holidays_lambda)
  holidays_str += holiday + "|"
holidays_str = "(?:" + holidays_str.substring(0, holidays_str.length - 1) + ")"

var time_str = "(\\d\\d?)(?:\\:(\\d\\d)(?:\\.(\\d\\d?))?)?\\s*(AM|PM)?"
var full_time_str = "(?:\\s+" + time_str + "(?:\\s+to\\s+" + time_str + ")?)?"
var weekday_str = "(M|MON|MONDAY)?\s*?(T|TUE|TUESDAY)?\s*?(W|WED|WEDNESDAY)?\s*?(R|THU|THURSDAY)?\s*?(F|FRI|FRIDAY)?\s*?(S|SAT|SATURDAY)?\s*?(U|SUN|SUNDAY)?\s*?"
var full_weekday_str = "(?:\\s+" + weekday_str + ")?"
var month_str = "(?:(?:\\s+(\\d\\d?)(?=\\s))?(?:\\s+(" + months_str + "))?(?:\\s+(\\d\\d?)(?:ST|ND|RD|TH)?(?=\\s))?|(?:\\s+(" + holidays_str + "))?)(?:\\s+(\\d\\d?\\d?\\d?))?"
var full_month_str = "(?:" + month_str + "(?:\\s+to" + month_str + ")?)?"
var year_str = "(\\d\\d?\\d?\\d?)"
var full_year_str = "(?:,\\s+" + year_str + "(?:\\s+to\\s+" + year_str + ")?)?"
var full_regex = full_time_str + full_weekday_str + full_month_str + full_year_str
var compiled_full_regex = new RegExp(full_regex, "i");

function is_date_valid(date)
{
  return compiled_full_regex.test(date);
}


