/*
http://simonwillison.net/2004/May/26/addLoadEvent/
*/
function addLoadEvent(func)
{
  var oldonload = window.onload;
  if (typeof window.onload != 'function')
  {
    window.onload = func;
  }
  else
  {
    window.onload = function()
    {
      if (oldonload)
      {
        oldonload();
      }
      func();
    }
  }
}

addLoadEvent(form_setup);

function form_setup()
{
  var elObj;
  if (!document.getElementById)
  {
    return;
  }
  if (elObj = document.getElementById("gate"))
  {
    for (i=0; i<=3; i++)
    {
      registerEventListener('discount'+i,'registration_fee');
    }
    for (i=1; i<=7; i++)
    {
      registerEventListener('regfee'+i,'registration_fee');
    }
    for (i=1; i<=3; i++)
    {
      registerEventListener('network'+i,'network');
    }
    for (i=0; i<=9; i++)
    {
      registerEventListener('accom'+i,'accommodation');
    }
    registerEventListener('in1','accommodation');
    registerEventListener('out1','accommodation');
    for (i=1; i<=2; i++)
    {
      registerEventListener('conference'+i,'conference');
    }
/*
    for (i=1; i<=3; i++)
    {
      registerEventListener('profiling'+i,'profiling');
    }
*/
    registerEventListener('paymentmethod','paymentmethod');
    registerEventListener('gate','gate');
  }
  else
  {
    setTimeout("form_setup()",10);
  }
}

function registerEventListener(pId,pSection)
{
  if (!document.getElementById)
  {
    return;
  }

  var elObjReg;

  if (elObjReg = document.getElementById(pId))
  {
    if (pId == 'paymentmethod')
    {
      elObjReg.onclick = computeGrandTotal;
    }
    else if (pId == 'gate')
    {
      elObjReg.onclick = function () { return checkForm(this); }
    }
    else if (pSection == 'network')
    {
      elObjReg.onchange = function () { computeSubTotal(pSection); }
    }
    else
    {
      elObjReg.onclick = function () { computeSubTotal(pSection); }
    }
  }
}

function computeSubTotal(pSection)
{
  if (!document.getElementById)
  {
    return;
  }

  total = 0;

  if (pSection == 'registration_fee')
  {
    total = 0;

    for (i=1; i<=7; i++)
    {
      if (document.getElementById('regfee'+i).checked)
      {
        document.getElementById('regfee'+i+'_label').value = '' + document.getElementById('regfee'+i+'_price').value;
        total += parseFloat(document.getElementById('regfee'+i+'_price').value*1);
      }
      else
      {
        document.getElementById('regfee'+i+'_label').value = '0';
      }
    }

    for (i=1; i<=3; i++)
    {
      if (document.getElementById('discount'+i).checked)
      {
        {
          reg_discount = parseFloat(1 * ('0.' + document.getElementById('discount'+i+'_price').value)) * total;
          reg_discount = reg_discount.toFixed(2);
        }
        total = parseFloat(1 * total) - reg_discount;
        total = total.toFixed(2);
//        document.getElementById('discount'+i+'_label').value = '' + reg_discount;
      }
      else
      {
//        document.getElementById('discount'+i+'_label').value = '0';
      }
    }

    total = parseFloat(1 * total);
    total = total.toFixed(2);
  }
  else if (pSection == 'accommodation')
  {
    for (i=0; i<=9; i++)
    {
      if (document.getElementById('accom'+i).checked)
      {
        document.getElementById('accom'+i+'_label').value = '' + document.getElementById('accom_price_'+i).value;
        total += parseFloat(document.getElementById('accom_price_'+i).value*1);
      }
      else
      {
        document.getElementById('accom'+i+'_label').value = '0';
      }
    }

    days_staying = document.getElementById('out1').value - document.getElementById('in1').value;

    if (days_staying >= 0)
    {
      total = total * days_staying;
    }
    else
    {
      document.getElementById('out1').value = document.getElementById('in1').value;
      total = 0;
      window.alert('Check-out date can not be earlier than check-in date.');
    }
  }
  else if (pSection == 'network')
  {
    for (i=1; i<=3; i++)
    {
      if (parseFloat(document.getElementById(pSection+i).value*1) > 0)
      {
        newvalue = document.getElementById(pSection+i).value * document.getElementById(pSection+i+'_price').value;

        document.getElementById(pSection+i+'_label').value = '' + newvalue;
        total += newvalue;
      }
      else
      {
        document.getElementById(pSection+i+'_label').value = '0';
      }
    }
  }
  else
  {
    number_of_options = 0;

    if (pSection == 'network')
      number_of_options = 3;
    else if (pSection == 'conference')
      number_of_options = 2;
/*
    else if (pSection == 'profiling')
      number_of_options = 3;
*/

    if (number_of_options > 0)
    {
      for (i=1; i<=number_of_options; i++)
      {
        if (document.getElementById(pSection+i).checked)
        {
          document.getElementById(pSection+i+'_label').value = '' + document.getElementById(pSection+i).value;
          total += parseFloat(document.getElementById(pSection+i).value*1);
        }
        else
        {
          document.getElementById(pSection+i+'_label').value = '0';
        }
      }
    }
  }


  document.getElementById(pSection + '_subtotal').value = ''+total;
  document.getElementById(pSection + '_subtotal_hid').value = ''+total;
  document.getElementById(pSection + '_total').value = ''+total;

  computeGrandTotal();
}

function computeGrandTotal()
{
  if (!document.getElementById)
  {
    return;
  }
  grand = document.getElementById('grand_total');

  //add up event values
//  total = parseFloat(document.getElementById('registration_fee_total').value*1) + parseFloat(document.getElementById('network_total').value*1) + parseFloat(document.getElementById('accommodation_total').value*1) + parseFloat(document.getElementById('conference_total').value*1) + parseFloat(document.getElementById('profiling_total').value*1);
  total = parseFloat(document.getElementById('registration_fee_total').value*1) + parseFloat(document.getElementById('network_total').value*1) + parseFloat(document.getElementById('accommodation_total').value*1) + parseFloat(document.getElementById('conference_total').value*1);

  //add credit card surcharge where applicable
  if(document.getElementById('paymentmethod').value=='Visa' || document.getElementById('paymentmethod').value=='MasterCard')
  {
    total = total*1.025;
  }
  else if(document.getElementById('paymentmethod').value=='Amex')
  {
    total = total*1.035;
  }

  total = total.toFixed(2);
  grand.value = total;
  document.getElementById('grand_total_field').value=total;
}



var err;

function checkForm(sendid)
{
  err = true;
  formid = sendid.form;

  if (formid.firstname.value.length < 1)
  {
    error('You haven\'t provided a first name.');
    formid.firstname.focus();
    formid.firstname.select();
  }
  else if (formid.surname.value.length < 1)
  {
    error('You haven\'t provided a surname.');
    formid.surname.focus();
    formid.surname.select();
  }
  else if (formid.organisation.value.length < 1)
  {
    error('You haven\'t said which organisation you represent.');
    formid.organisation.focus();
    formid.organisation.select();
  }
  else if (formid.state.value.length < 1)
  {
    error('You haven\'t said which state you are from.');
    formid.state.focus();
  }
  else if (formid.phone.value.length < 1)
  {
    error('You haven\'t said provided a telephone number.');
    formid.phone.focus();
    formid.phone.select();
  }
  else if (formid.email.value.length < 1)
  {
    error('You haven\'t provided an email address.');
    formid.email.focus();
    formid.email.select();
  }

  if (err && (formid.email.value.length > 0))
  {
    if (formid.email.value.length < 5)
    {
      error('The email address you have entered is not a valid email address.');
      formid.email.focus();
      formid.email.select();
    }
    else if ((formid.email.value.indexOf('@') == -1) || (formid.email.value.indexOf('.') == -1))
    {
      error('The email address you have entered is not a valid email address.');
      formid.email.focus();
      formid.email.select();
    }
    else if (formid.email.value.indexOf('@') > formid.email.value.lastIndexOf('.'))
    {
      error('The email address you have entered is not a valid email address.');
      formid.email.focus();
      formid.email.select();
    }
    else if (stringcontains(formid.email.value,'()[]<>;:," ') == true)
    {
      error('The email address you have entered is not a valid email address.');
      formid.email.focus();
      formid.email.select();
    }
  }

  if (err)
  {
    if (((formid.regfee1[0].checked) || (formid.regfee1[1].checked) || (formid.regfee1[3].checked) || (formid.regfee1[4].checked)) && (formid.regfee1_sel.value == ''))
    {
      error('You haven\'t specified which forum you want to register for.');
      formid.regfee1_sel.focus();
    }
    else if (((formid.regfee1[0].checked) || (formid.regfee1[2].checked) || (formid.regfee1[3].checked) || (formid.regfee1[6].checked)) && (formid.regfee1_sel2.value == ''))
    {
      error('You haven\'t specified which workshop you want to register for.');
      formid.regfee1_sel2.focus();
    }
    else if (formid.paymentmethod.value.length < 1)
    {
      error('You haven\'t specified a payment method.');
      formid.paymentmethod.focus();
    }
    else if (!(formid.cancelpolicy.checked))
    {
      error('You must select the box to indicate your acceptance of the cancellation policy.');
      formid.cancelpolicy.focus();
    }
  }

  return err;
}

function stringcontains(haystack,needles)
{
  var result;
  result = false;

  for (i=0;i<needles.length;i++)
  {
    if (haystack.indexOf(needles.charAt(i))>0)
    {
      result = true;
    }
  }

  return result;
}

function error(txt)
{
  err = false;
  window.alert(txt);
}

