// simple access fns

function Toggle(CheckboxName)
{
  document.Ad[CheckboxName].checked = ! document.Ad[CheckboxName].checked;
  ValidImpressions();
  ShowPrice();
}

function Select(Index)
{
  document.Ad.Term[Index].checked = true;
  ValidTerm();
  ShowPrice();
}

// utility routines

function CountCheckboxes()
{
  var Result = 0;
  for (var I = 0; I < document.Ad.length; I++)
  {
    var Widget = document.Ad.elements[I];
    if (Widget.type == "checkbox" && Widget.checked)
      Result++;
  }
  return Result;
}

// error reporting

 if(document.layers)
   thisbrowser="NN4";
 if(document.all)
   thisbrowser="ie";
 if(!document.all && document.getElementById)
   thisbrowser="NN6";

function SetLayerHTML(LayerName, HTML)
{
  var Layer = null;
  switch (thisbrowser)
  {
    case "NN4":
      Layer = document.layers[LayerName];
      if (Layer)
      {
        Layer.document.open();
        Layer.document.write(HTML);
        Layer.document.close();
      }
      break;
    case "ie":
       Layer = document.all[LayerName];
       Layer.innerHTML = HTML;
       break;
    case "NN6":
      Layer = document.getElementById(LayerName);
      Layer.innerHTML = HTML;
      break;
  }
}

// error detection

  // any non-whitespace
     DarkspaceRegex = /\S/

  // Word counting ....
     WordRegex = /\S+/g

  // a valid email addr
     EmailRegex = /^\s*\w+(\.\w+)*@\w+(\.\w+)*\s*$/

  // a valid US currency amount - d, $d, $.dd &c
     PremiumRegex = /^\s*[$]?((\d*\.\d{2})|\d+(\.\d{2})?)\s*$/

var LastError = "";

function Test(SingleTestMode, FieldName, ErrorMessage, FieldValid, DefaultMessage)
{
  if (! FieldValid);
    LastError = ErrorMessage;

  if (SingleTestMode || SingleTestMode == null)
  {
    FieldName += "Required";
    if (! FieldValid)
      SetLayerHTML(FieldName, '<span class="Error">' + ErrorMessage + '</span>');
    else
    {
      if (! DefaultMessage)
        DefaultMessage = '';
      SetLayerHTML(FieldName, DefaultMessage);
    }
  }

  return FieldValid;
}

function Valid()
{
  return ValidContact() && ValidAd();
}

function ValidContact()
{
  return ValidName(false) && ValidEmail(false) && ValidMailingAddress(false);
}

  function ValidName(SingleTestMode)
  {
    return Test(SingleTestMode, "Name", "I need your name for my records", DarkspaceRegex.test(document.Ad.Name.value));
  }

  function ValidEmail(SingleTestMode)
  {
    return Test(SingleTestMode, "Email", "I need a valid email address for my records", EmailRegex.test(document.Ad.Email.value));
  }

  function ValidMailingAddress(SingleTestMode)
  {
    return Test(SingleTestMode, "MailingAddress", "I need a mailing address for my records", DarkspaceRegex.test(document.Ad.MailingAddress.value));
  }

function ValidAd()
{
  return ValidCopy() && ValidFinancials();
}

  function ValidCopy()
  {
    return ValidTitle(false) && ValidText(false);
  }

    function IsWhite(Char)
    {
      return Char == ' ' || Char == '\t' || Char == '\n';
    }

    function Trim(Value)
    {
      var Length = Value.length;
      var LeadingSpace = 0;
      while (LeadingSpace < Length && IsWhite(Value[LeadingSpace]))
      { LeadingSpace++; }
      var TrailingSpace = 0;
      while (LeadingSpace < Length && IsWhite(Value[Length - 1 - TrailingSpace]))
      { TrailingSpace++; }
      return TrailingSpace == 0
        ? Value.slice(LeadingSpace)
        : Value.slice(LeadingSpace, -TrailingSpace);
    }

    function ValidTitle(SingleTestMode)
    {
      var Title = Trim(document.Ad.Title.value);
      if (! Test(SingleTestMode, "Title", "Your ad must have a title", Title != '' /*DarkspaceRegex.test(Title) */ ))
        return false;

      var Characters = 0;
      var CountWhite = false;
      for (var Index = 0; Index < Title.length; Index++)
      {
        var ThisChar = Title[Index];
        if (ThisChar != ' ' && ThisChar != '\t')
        {
          Characters++;
          CountWhite = true; // count 1st white space after a darkspace
        }
        else
        {
          if (CountWhite)
            Characters++;
          CountWhite = false;
        }
      }
      return Test(SingleTestMode, "Title", (Characters - 20) + " characters too long", Characters <= 20);
    }

    function ValidText(SingleTestMode)
    {
      var Text = document.Ad.Text.value;
      if (! Test(SingleTestMode, "Text", "Your ad must have some text", DarkspaceRegex.test(Text)))
        return false;

      var Words = 0;
      while (WordRegex.test(Text)) { Words++; }
      return Test(SingleTestMode, "Text", (Words - 25) + " too many words", Words <= 25);
    }

  function ValidFinancials()
  {
    return ValidTerm(false) && ValidPremium(false) && ValidImpressions(false);
  }

    function ValidTerm(SingleTestMode)
    {
      if (! SingleTestMode)
        SetLayerHTML('TermRequired', '');
      return true;
    }

    function ValidPremium(SingleTestMode)
    {
      return Test(SingleTestMode, "Premium", "Must be a dollar amount",
        PremiumRegex.test(document.Ad.Premium.value), "(Optional)");
    }

    function ValidImpressions(SingleTestMode)
    {
      var PageCount = CountCheckboxes();
      if (! Test(SingleTestMode, "Pages", "You must select at least one page", PageCount >= 1))
        return false;
      return Test(SingleTestMode, "Pages", "You may select no more than four pages", PageCount <= 4);
    }

    function ShowPrice()
    {
      SetLayerHTML("CalculatedPrice",
        ValidFinancials()
          ? '<span class="MetaText">This ad will cost $' + Price() + "</span>"
          : "" );
    }

// pricing

function GetTerm()
{
  for (var Index = 0; Index < 3; Index++)
    if (document.Ad.Term[Index].checked)
      return Index;
  return -1;
}

function Tier2Equivalents()
{
  var Tier1 = 0;
  var Tier2 = 0;
  for (var I = 0; I < document.Ad.length; I++)
  {
    var Widget = document.Ad.elements[I];
    if (Widget.type == "checkbox" && Widget.checked)
    {
      if (Widget.value == '1')
        Tier1++;
      else
        Tier2++;
    }
  }
//window.alert(Tier1 + ", " + Tier2);  
  if (Tier1 > 0)
    return Tier1 + 1 + (Tier2 / 2);
  else
    return (Tier2 + 1) / 2;
}

function GetPremium()
{
  var A = PremiumRegex.exec(document.Ad.Premium.value);
  return A != null ? Number(A[1]) : 0;
}

  BasePrices = [10, 25, 50];

function Price()
{
  var Impressions = Tier2Equivalents();
  var Result = BasePrices[GetTerm()] * Impressions + GetPremium();

  if (Result.toFixed != null)
    return Result.toFixed(2);
  else
    return Result;
}

// button handlers

function Submit()
{
  LastError = "";
  if (Valid())
  {
    document.Ad.Price.value = Price();
    document.Ad.JavaScript.value="1";
    document.Ad.submit();
//      window.alert("passed all tests ...");
  }
  else
    window.alert("Can't submit - " + LastError);
}


function Calculate()
{
  LastError = "";
  if (ValidFinancials())
    window.alert("This ad will cost $" + Price() );
  else
    window.alert("Can't calculate price - " + LastError);
}
