﻿var reqs = new Array();

function recalculateCost() {
  headlineWords = document.getElementById('ad_title').value.split(/\s+/g).length;
  bodyWords = document.getElementById('ad_bodytext').value.split(/\s+/g).length;
  words = headlineWords + bodyWords;
  if (words >= ad['freewords']) {
    cost = ad['perword'] * words;
  } else {
    cost = 0;
  }
  if (document.getElementById('classified_bold').checked) { cost += ad['boldcost']; }
  cost *= getCheckedValue(document.submit2.multiplier);
  if (cost < ad['minimum'] && cost > 0) { cost = ad['minimum']; }
  document.getElementById('ad_cost').innerHTML = (cost.toFixed(2));
}

// IE6/7 fix 
function redrawAd() {
  document.getElementById('preview_ad').className = document.getElementById('classified_bold').checked == '1' ? 'main_item bold-ad' : 'main_item'; 
  document.getElementById('preview_ad_link').href = document.getElementById('ad_url.value'); document.getElementById('preview_ad_link').className = document.getElementById('ad_url').value.length > 0 ? '' : 'dud-link'
  document.getElementById('preview_ad_headline').innerHTML = document.getElementById('ad_title').value;
  document.getElementById('preview_ad_body').innerHTML = document.getElementById('ad_bodytext').value;
  recalculateCost();
  clearTimeout(redraw);
  var redraw = setTimeout('redrawAd()',500);
}

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 findFormParent(element) {
  if (element[0]) {
    return findFormParent(element[0]);
  }
  if (element.parentNode.nodeName == "FORM") {
    return element.parentNode.name;
  } else {
    return findFormParent(element.parentNode);
  }
}

function validate(elementName) {
  if(!(el = document.getElementById(elementName))) {
  // for input elements
    if(!(el = document.getElementsByName(elementName)[0])) {
    // for radio buttons etc
      return true;
      // if the field to validate is not found, return true
      // maybe that field hasn't been generated by PHP
    } else {
    }
  }
  
  var val = '';
  
  if(el.value) {
    val = el.value;
  } else {
    if(el[0]) {
      var val = 0;
      for (var i=0; i < el.length; i++) {
        if(el[i].checked) { val++; }
      }
    }
  }
  
  var status = false;
  
  if (formName = findFormParent(el)) {
    req = reqs[formName][el.name] ? reqs[formName][el.name] : reqs[formName][el[0].name];
    errorMsg = '';
    switch (req) {
      case 'exists':
        errorMsg = 'Please fill this out.';
      case 'exists_quiet':
        if (val.length > 0) { status = true; }
        break;
      case 'email':
        errorMsg = 'Please enter an email address.';
        if (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,6})+$/.test(val)) {
          // for some reason this seems to break if the .test value gets returned directly
          status = true;
        }
        break;
      case 'emailOrPhone':
        errorMsg = 'Please enter an email or phone number.';
        if (/\d+/.test(val)) {
          status = true;
        }
        if (/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,6})+$/.test(val)) {
          status = true;
        }
        break; 
      case 'one':
        errorMsg = 'Please choose one.';
        status = val > 0;
        break;
      case 'many':
        errorMsg = 'Please choose at least one.';
        status = val > 0;
        break;
      case 'date':
        errorMsg = 'This must be a valid date, in numerical day/month/year format.';
        if (/^(0?[1-9]|[12][0-9]|[3][0-1])\/(0?[1-9]|[1][0-2])\/(20)?[0-3][0-9]$/.test(val)) {
          status = true;
        }
        break;
      case 'time':
        errorMsg = 'This must be a valid time on the 24-hour clock: two digits, a colon, and two more digits.';
        if (/^([01][0-9]|2[0-3])\:([0-5][0-9])$/.test(val)) {
          status = true;
        }
        break;
      case 'url_optional':
        errorMsg = 'This must be a valid web address, including http://';
        if (/(^https?\:\/\/(.*)\.|^$)/.test(val)) {
          status = true;
        }
        break;
      case 'currency':
        errorMsg = 'This needs to be an amount.';
        var digitsOnly=/[^0-9\.]/gi;
        val=val.replace(digitsOnly, '');
        el.value = val;
        if (/^([0-9\.])+$/.test(val)) {
          status = true;
        }
        break;
      default:
        if(/^\d+$/.test(req)) {
          if (val.length > 0) {
            errorMsg = 'This is too long; please shorten it by ' + (val.length - req) + ' character' + (val.length - req > 1 ? 's' : '') + '.';
            status = val.length <= req;
          } else {
            errorMsg = 'Please fill this out.';
            status = val.length > 0;
          }
        } else {
          status = true;
        }
        break;
    }
  } else {
    status = true;
  }
  // reset error functions
  
  
  if(el.style) { el.style.backgroundColor = ''; } else { el = el[0]; }
  
  // cope with textarea's odd set-up
    
  if (el.parentNode.lastChild.className == 'errorPoint') {
    el.parentNode.removeChild(el.parentNode.lastChild);
  }
  
  if (status == true) {
    
  } else {
    if(el.style) { el.style.backgroundColor = '#ffdddd'; } else { el = el[0]; }
    
    if (el.parentNode.lastChild.className == 'errorPoint') {
      el.parentNode.removeChild(el.parentNode.lastChild);
    }
    var errorPoint = document.createElement('span');
    errorPoint.className = "errorPoint";
    errorPoint.appendChild(document.createTextNode(' « ' + errorMsg));
    el.parentNode.appendChild(errorPoint);
  }
  
  return status;

}

function validateForm(form) {

  form = form.name;
  
  // clear existing all-form error messages
  
  document.getElementById('error').innerHTML = "";
  document.getElementById('error').style.display = 'none';

  var submitForm = true;
  for (var element in reqs[form]) {
     if (validate(element)) {
          
     } else {
       submitForm = false;  
     }
  }
  // validation code
    
  if (submitForm == true) {
    document.getElementById('error').innerHTML = "";
    document.getElementById('error').style.display = 'none';
  } else {
    document.getElementById('error').innerHTML = "There's something missing in your entry &mdash; check the fields highlighted in red above.";
    document.getElementById('error').style.display = 'block';
  }
  return submitForm;
}

function addValidator(form) {
  reqs[form] = new Array();
}

function addRule(form, element, rule) {
  reqs[form][element] = rule;
}
