function setWaiting(elemID) {
  $(elemID).innerHTML = '<img src="/imgs/please-wait.gif" />loading...';
}

function setFinished() {
  // clear up after call has returned
  submitted_clicked = false;
}

function clearWaiting(elemID) {
  $(elemID).innerHTML = '';
}

// add a method to the standard date object
String.prototype.trim = function() {
  return this.replace( /^\s+|\s+$/, "" );
}

// out extensions to prototype
Element.addMethods(
{
  setWaiting: function(element,status)
  {
    if (status) {
      $(element).innerHTML = '<img src="/imgs/please-wait.gif" />loading...';
    }
    else {
      $(element).innerHTML = '';  // clear
    }
  },

  setRequired: function(element,required)
  {
    if (required) {
      $(element).addClassName('required');
    }
    else {
      if ($(element).hasClassName('required')) {
        $(element).removeClassName('required');
      }
    }
  },
  setRequiredSelect: function(element,required)
  {
    if (required) {
      $(element).addClassName('validate-selection');
    }
    else {
      if ($(element).hasClassName('validate-selection')) {
        $(element).removeClassName('validate-selection');
      }
    }
  },

  setReady: function(element,status)
  {
    if (status) {
      $(element).innerHTML = 'ready';
    }
    else {
      $(element).innerHTML = '';  // clear
    }
  },
  setRequired: function(element,status)
  {
    if (status) {
      if (!($(element)).hasClassName('required')) {
        $(element).addClassName('required');
      }
    }
    else {
      if (($(element)).hasClassName('required')) {
        $(element).removeClassName('required');
      }
    }
  },
  hideMe: function(element)
  {
    if (!($(element)).hasClassName('hide')) {
      $(element).addClassName('hide');
    }
  },
  showMe: function(element)
  {
    if ($(element).hasClassName('hide')) {
      $(element).removeClassName('hide');
    }
  },
  toggleHide: function(element)
  {
    if ($(element).hasClassName('hide')) {
      $(element).removeClassName('hide');
    }
    else {
      $(element).addClassName('hide');
    }
  },
  toggleFade: function(element)
  {
    if ($(element).hasClassName('fadedOut')) {
      $(element).removeClassName('fadedOut');
      new Effect.Appear($(element), {to:0.9});
    }
    else
    {
      $(element).addClassName('fadedOut');
      new Effect.Fade($(element), {from:0.9});
    }
  },
  getSelectedName: function(element)
  {
    // get the currently selected option tag for this select group
    return $(element)[$(element).selectedIndex].innerHTML;
  }
});

// event to confirm request for navigation away from this page
Event.addBehavior({
'a.nav_away:click' : function(e) {
  if (confirm("Are you sure you want to navigate away from this page?")) {
    return true;
  }
  return false;
}
});

function isNumeric(val) {
  return (/^[-+ ]?\d{1,5}$/).test(val);
}

function isMoneyAmount(val) {
  return (/^0$/.test(val) || /^([0-9]+)[.][0-9]{2}$/.test(val));
}

function addValidators() {
  Validation.addAllThese([
  [
  'validate-password', 'Your password must be at least 5 characters', { minLength : 5 }
  ],
  [
  'username', 'Enter an email between 5 and 80 characters long',
  {
    pattern : new RegExp("^[a-zA-Z0-9\-\._@]+$"),
    maxLength : 80, minLength : 5
  }
  ],
  [
  'max-10', 'Please enter no more than 10 characters', {maxLength : 10}
  ],
  [
  'max-25', 'Please enter no more than 25 characters', {maxLength : 25}
  ],
  [
  'max-75', 'Please enter no more than 75 characters', {maxLength : 75}
  ],
  [
  'max-120', 'Please enter no more than 120 characters', {maxLength : 120}
  ],
  [
  'confirm-email', 'Confirmed email address is not the same as original', {equalToField:'email'}
  ],
  [
  'confirm-tel', 'Confirmed telephone number is not the same as original', {equalToField:'tel'}
  ],
  [
  'confirm-password', 'Confirmed password is not the same as original', {equalToField:'pass'}
  ],
  [
  'terms-conditions', 'You must agree to the terms and conditions to continue', {is:1}
  ],
  ['validate-radio-required', 'Please select an option.', function (v,elm) {
    var options = document.getElementsByName(elm.name);
    return $A(options).any(function(elm) {
      return $F(elm);
    });
  }]
  ]);
}
/**************************************************/
// voucher functions
/**************************************************/
function deleteVoucher(voucherID) {
  if (confirm('Are you sure you want to delete this voucher with all its associated data permanently from the system?')) {
    new Ajax.Updater('dummy', '/voucher/AJAXdelete/id/'+voucherID, {
      method: 'post',
      evalScripts: true
    });
    $('voucher_'+voucherID).remove();
  }
}
function setFlag(voucherID,setTo) {
  new Ajax.Updater('dummy', '/voucher/AJAXflag/id/'+voucherID+'/status/'+setTo, {
    method: 'post',
    evalScripts: true
  });
  if (setTo) {
    $('flag_'+voucherID).innerHTML = '<img src="/imgs/flag.gif" title="flagged" class="AJAX-selectable" onclick="setFlag('+voucherID+',0)" />';
  }
  else {
    $('flag_'+voucherID).innerHTML = '<img src="/imgs/flag-blank.gif" title="unflagged" class="AJAX-selectable" onclick="setFlag('+voucherID+',1)" />';
  }
}

function setCancelled(voucherID,setTo) {
  new Ajax.Updater('dummy', '/voucher/AJAXcancel/id/'+voucherID+'/status/'+setTo, {
    method: 'post',
    evalScripts: true
  });
  if (setTo) {
    $('cancel_'+voucherID).innerHTML = '<img src="/imgs/inactive.gif" title="cancelled" class="AJAX-selectable" onclick="setCancelled('+voucherID+',0)" />';
  }
  else {
    $('cancel_'+voucherID).innerHTML = '<img src="/imgs/active.gif" title="active" class="AJAX-selectable" onclick="setCancelled('+voucherID+',1)" />';
  }
}


function signupFormValidate(username,pass) {
  // called after a value has been changed
  if (($(username).value.length>0) || ($(pass).value.length>0)) {
    // make sure both have validators
    if (!$(username).hasClassName('username'))
    {
      $(username).addClassName('username');
    }
    if (!$(pass).hasClassName('validate-password'))
    {
      $(pass).addClassName('validate-password');
    }
  }
  else {
    // strip validators
    if ($(username).hasClassName('username'))
    {
      Validation.reset($(username));
      $(username).removeClassName('username');
      var advice = Validation.getAdvice('username', $(username));
      if (advice != null) { advice.hide(); }
    }
    if ($(pass).hasClassName('validate-password'))
    {
      Validation.reset($(pass));
      $(pass).removeClassName('validate-password');
      var advice = Validation.getAdvice('validate-password', $(pass));
      if (advice != null) { advice.hide(); }
    }
  }
}

/**
* Returns the value of the selected radio button in the radio group
*
* @param {radio Object} or {radio id} el
* OR
* @param {form Object} or {form id} el
* @param {radio group name} radioGroup
*/
function $RF(el, radioGroup) {
  try {
    if($(el).type == 'radio') {
      var el = $(el).form;
      var radioGroup = $(el).name;
    } else if ($(el).tagName.toLowerCase() != 'form') {
      return false;
    }
    return $F($(el).getInputs('radio', radioGroup).find(
    function(re) {return re.checked;}
    ));
  }
  catch(e) {
    // perhaps it doesn't exist
    return false;
  }
}

function checkAll(className,check) {
  allNodes = document.getElementsByClassName(className);
  if (allNodes.length>0) {
    checkFlag = allNodes[0].checked;
    for(i = 0; i < allNodes.length; i++) {
      allNodes[i].checked = check;
    }
  }
}
