/*
 * Miscellaneous functions.
 */
function ByID(elementID) {
  if (typeof(elementID) == 'string') {
    return document.getElementById(elementID);
  } else {
    return elementID;
  }
}

function EncodeForURL(Content) {
  Content = Content.replace(/&/g,"**am**");
  Content = Content.replace(/=/g,"**eq**");
  Content = Content.replace(/\+/g,"**pl**");

  return Content;
}

function visible(eltID, isVisible) {
  elt = ByID(eltID);

  if (elt) {
    if (isVisible) {
      elt.style.display = '';
    } else {
      elt.style.display = 'none';
    }
  }
}

/*
 * Ajax object.
 */
function TAjax() {
  this.xmlhttp = false;
  this.bComplete = false;
  this.success = false;

  this.Connect();
}

TAjax.prototype.Connect = function() {
  try {
	  this.xmlhttp = new XMLHttpRequest();
  } catch (e) {
  	var progIds = ['MSXML2.XMLHTTP', 'Microsoft.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0'];

	  for (var iterator = 0; (iterator < progIds.length) && ( ! this.success); iterator ++) {
  	  try {
	    	this.xmlhttp = new ActiveXObject(progIds[iterator]);
		    this.success = true;
  	  } catch (e) {}
	  }
  }
};

TAjax.prototype.Disconnect = function() {
  delete this.xmlhttp;
};

TAjax.prototype.Call = function(sURL, sMethod, sVars, fnDone) {
  var self = this;

  if (!this.xmlhttp) {
    return false;
  }
  this.bComplete = false;

  sMethod = sMethod.toUpperCase();

  try {
    if (sMethod == "GET") {
      this.xmlhttp.open(sMethod, sURL+"?"+sVars, true);
      sVars = "";
    } else {
      this.xmlhttp.open(sMethod, sURL, true);
      this.xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
      this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      this.xmlhttp.send(sVars);
    }
    self.xmlhttp.onreadystatechange = function() {
      if ((self.xmlhttp.readyState == 4) && (!self.bComplete)) {
        self.bComplete = true;
        fnDone(self.xmlhttp);
      }
    };

    this.xmlhttp.send(sVars);
  }
  catch(z) { return false; }

  return true;
};

TAjax.prototype.Get = function(sURL, sVars, fnDone) {
  this.Call(sURL, 'GET', sVars, fnDone);
};

TAjax.prototype.Post = function(sURL, sVars, fnDone) {
  this.Call(sURL, 'POST', sVars, fnDone);
};

TAjax.prototype.RequestFinished = function (oXML) {
  this.AjaxObject.Result(oXML.responseText);
};

TAjax.prototype.getXML = function(tagName) {
  return this.xmlhttp.responseXML.documentElement.getElementsByTagName(tagName)[0].childNodes[0].nodeValue;
}

/*
 * Event support.
 */
function addEvent(elm, evType, fn, useCapture) {
  if (elm.addEventListener) {
    elm.addEventListener(evType, fn, useCapture);
    return true;
  } else if (elm.attachEvent) {
    var r = elm.attachEvent('on' + evType, fn);
    EventCache.add(elm, evType, fn);
    return r;
  } else {
    elm['on' + evType] = fn;
  }
}

function getEventSrc(e) {
  if (!e) e = window.event;

  if (e.originalTarget)
	return e.originalTarget;
  else if (e.srcElement)
	return e.srcElement;
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

var EventCache = function(){
  var listEvents = [];
  return {
	listEvents : listEvents,

	add : function(node, sEventName, fHandler, bCapture){
	    listEvents.push(arguments);
	  },

	flush : function(){
	  var i, item;
	  for (i = listEvents.length - 1; i >= 0; i = i - 1) {
	    item = listEvents[i];

	    if (item[0].removeEventListener){
		  item[0].removeEventListener(item[1], item[2], item[3]);
		};

		/* From this point on we need the event names to be prefixed with 'on" */
		if (item[1].substring(0, 2) != "on") {
		  item[1] = "on" + item[1];
		};

		if (item[0].detachEvent) {
		  item[0].detachEvent(item[1], item[2]);
		};

		item[0][item[1]] = null;
	  };
	}
  };
}();

/*
 * Contact functionality.
 */
function validateFields() {
  var frmEl = ByID('ContactForm');
  var vContactName = ByID('ContactName');
  var vContactEmail = ByID('ContactEmail');
  var vContactRegard = ByID('ContactSubject');
  var vContactMessage = ByID('ContactMessage');
  var vContactCC = ByID('ContactCC');

  var whiteSpace = /^[\s]+$/;

  if (vContactMessage.value == '' || whiteSpace.test(vContactMessage.value) ) {
    alert("Please enter a message to send.");
  } else if (vContactEmail.value == '' && vContactCC.checked == true ) {
    frmEl.reset();
    vContactName.focus();
  } else {
    sendContactEmail();
  }
}

function sendContactEmail () {
  var vContactName = ByID('ContactName');
  var vContactEmail = ByID('ContactEmail');
  var vContactSubject = ByID('ContactSubject');
  var vContactMessage = ByID('ContactMessage');
  var vContactCC = ByID('ContactCC').value;
  var page = "scripts/contact.php?contact=true&xml=true";

  showContactTimer();
  visible('AjaxStatus', false);

  var str1 = EncodeForURL(vContactName.value);
  var str2 = EncodeForURL(vContactEmail.value);
  var str3 = EncodeForURL(vContactSubject.value);
  var str4 = EncodeForURL(vContactMessage.value);

  var stuff = "ContactCC="+vContactCC+"&ContactName="+str1+"&ContactEmail="+str2+"&ContactSubject="+str3+"&ContactMessage="+str4;
  Ajax.Call(page, 'POST', stuff, ProcessingDone);
}

function showContactTimer () {
  visible('ProgressBar', true);
  sentTimer = setTimeout("hideContactTimer()", 6000);
}

function hideContactTimer () {
  var success = ByID('AjaxStatus');
  var fieldArea = ByID('ContactFormArea');
  var inputs = fieldArea.getElementsByTagName('input');
  var inputsLen = inputs.length;
  var tAreas = fieldArea.getElementsByTagName('textarea');
  var tAreasLen = tAreas.length;

  visible('ProgressBar', false);
  visible(success, true);

  if (Ajax.getXML("result") == 'SUCCESS') {
    success.innerHTML = '<strong style="color: #00ff00;">'+Ajax.getXML("message")+'</strong>';
  } else {
    success.innerHTML = '<strong style="color: #ff0000;">'+Ajax.getXML("message")+'</strong>';
  }

  for (i = 0; i < inputsLen; i++) {
    if (inputs[i].getAttribute('type') == 'text') {
      inputs[i].value = '';
    }
  }

  for (j = 0; j < tAreasLen; j++) {
    tAreas[j].value = '';
  }
}

function ProcessingDone(AjaxObject) {
  result = AjaxObject.responseXML.documentElement.getElementsByTagName('result')[0].childNodes[0].nodeValue;
  hideContactTimer();
}

function ajaxContact() {
  var frmEl = ByID('ContactForm');
  addEvent(frmEl, 'submit', validateFields, false);
  frmEl.onsubmit = function() { return false; }
}

Ajax = new TAjax();

addEvent(window, 'load', ajaxContact, false);
addEvent(window, 'unload', EventCache.flush, false);

