/* DOM UTILITIES */

function genereerPar(tekst)
{
  var x = document.createElement('p');
  x.appendChild(document.createTextNode(tekst));
  return x;
}

function getNodeText(obj,tag)
{
  if (obj && obj.getElementsByTagName(tag) && obj.getElementsByTagName(tag)[0] != null)
  {
    return obj.getElementsByTagName(tag)[0].firstChild.nodeValue;
  }
}

/* FORMULIEREN VERZENDEN VIA XMLHTTP */

function submitFormXMLHTTP() {
  var els = this.elements;
  if (els['aflid'])
    els['aflid'].value = aflID;
  if (this.validation) {
    var correct = this.validation();
    if (!correct) return false;
  }
  var postData = '';
  for (var i=0;i<els.length;i++) {
    var name = escape(els[i].name);
    var value = escape(els[i].value);
    postData += name + '=' + value + '&';
  }
  sendRequest(this.action,this.afterSubmit,postData);
  return false;
}

/* XMLHTTP 
  Indien postData als laatste argument wordt meegegeven, wordt het request gePOST,
  zo niet dan wordt GET gebruikt.
  
  Functie submitFormXMLHTTP genereert postData.
*/

var XMLHttpFactories = [
  function () {return new XMLHttpRequest()},
  function () {return new ActiveXObject("Msxml2.XMLHTTP")},
  function () {return new ActiveXObject("Msxml3.XMLHTTP")},
  function () {return new ActiveXObject("Microsoft.XMLHTTP")},
];

function createXMLHTTPObject() {
  var xmlhttp = false;
  for (var i=0;i<XMLHttpFactories.length;i++)
  {
    try {
      xmlhttp = XMLHttpFactories[i]();
    }
    catch (e) {
      continue;
    }
    break;
  }
  return xmlhttp;
}

function sendRequest(url,callback,postData) {
  var req = createXMLHTTPObject();
  if (!req) return;
  var method = (postData) ? "POST" : "GET";
  req.open(method,url,true);
  req.setRequestHeader('User-Agent','XMLHTTP/1.0');
  if (postData)
    req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  req.onreadystatechange = function () {
    if (req.readyState != 4) return;
    if (req.status != 200 && req.status != 304) {
      alert('HTTP error ' + req.status + ' for ' + url);
      return;
    }
    callback(req);
  }
  if (req.readyState == 4) return;
  req.send(postData);
}

/* COOKIES */

var Cookies = {
  init: function () {
    var allCookies = document.cookie.split('; ');
    for (var i=0;i<allCookies.length;i++) {
      var cookiePair = allCookies[i].split('=');
      this[cookiePair[0]] = cookiePair[1];
    }
  },
  create: function (name,value,days) {
    if (days) {
      var date = new Date();
      date.setTime(date.getTime()+(days*24*60*60*1000));
      var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
    this[name] = value;
  },
  erase: function (name) {
    this.create(name,'',-1);
    this[name] = undefined;
  }
};
Cookies.init();

// push and shift for IE5

function Array_push() {
  var A_p = 0
  for (A_p = 0; A_p < arguments.length; A_p++) {
    this[this.length] = arguments[A_p]
  }
  return this.length
}

if (typeof Array.prototype.push == "undefined") {
  Array.prototype.push = Array_push
}

function Array_shift() {
  var A_s = 0
  var response = this[0]
  for (A_s = 0; A_s < this.length-1; A_s++) {
    this[A_s] = this[A_s + 1]
  }
  this.length--
  return response
}

if (typeof Array.prototype.shift == "undefined") {
  Array.prototype.shift = Array_shift
}

/*                      BROWSER DETECT                  */
/*      Zie http://www.quirksmode.org/js/detect.html    */



var BrowserDetect = {
  init: function () {
    this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
    this.version = this.searchVersion(navigator.userAgent)
      || this.searchVersion(navigator.appVersion)
      || "an unknown version";
    this.OS = this.searchString(this.dataOS) || "an unknown OS";
  },
  searchString: function (data) {
    for (var i=0;i<data.length;i++)     {
      var dataString = data[i].string;
      var dataProp = data[i].prop;
      this.versionSearchString = data[i].versionSearch || data[i].identity;
      if (dataString) {
        if (dataString.indexOf(data[i].subString) != -1)
          return data[i].identity;
      }
      else if (dataProp)
        return data[i].identity;
    }
  },
  searchVersion: function (dataString) {
    var index = dataString.indexOf(this.versionSearchString);
    if (index == -1) return;
    return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
  },
  dataBrowser: [
    {
      string: navigator.vendor,
      subString: "Apple",
      identity: "Safari"
    },
    {
      string: navigator.userAgent,
      subString: "Chrome",
      identity: "Chrome"
    },
    {
      prop: window.opera,
      identity: "Opera"
    },
    {
      string: navigator.vendor,
      subString: "iCab",
      identity: "iCab"
    },
    {
      string: navigator.vendor,
      subString: "KDE",
      identity: "Konqueror"
    },
    {
      string: navigator.userAgent,
      subString: "Firefox",
      identity: "Mozilla",
      versionSearch: "Firefox"
    },
    {   // for newer Netscapes (6+)
      string: navigator.userAgent,
      subString: "Netscape",
      identity: "Mozilla",
      versionSearch: "Netscape"
    },
    {
      string: navigator.userAgent,
      subString: "MSIE",
      identity: "Explorer",
      versionSearch: "MSIE"
    },
    {
      string: navigator.userAgent,
      subString: "Gecko",
      identity: "Mozilla",
      versionSearch: "rv"
    },
    {   // for older Netscapes (4-)
      string: navigator.userAgent,
      subString: "Mozilla",
      identity: "Netscape",
      versionSearch: "Mozilla"
    }
  ],
  dataOS : [
    {
      string: navigator.platform,
      subString: "Win",
      identity: "Windows"
    },
    {
      string: navigator.platform,
      subString: "Mac",
      identity: "Mac"
    },
    {
      string: navigator.platform,
      subString: "Linux",
      identity: "Linux"
    }
  ]

};
BrowserDetect.init();


QueryString = {
  init: function () {
    var URL = location.search.substring(1);
    var queries = URL.split('&');
    for (var i=0;i<queries.length;i++) {
      var query = queries[i].split('=');
      this[query[0]] = query[1];
    }
  }
}
QueryString.init();


/*                      FORM VALIDATION                         */

var validationErrorMessage = new Object();
validationErrorMessage['required'] = 'Dit veld is verplicht.';
validationErrorMessage['email'] = 'Dit emailadres is incorrect.';
validationErrorMessage['radios'] = 'U dient 1 van deze mogelijkheden te kiezen.';

var validationFunctions = new Object();
validationFunctions["required"] = isRequired;
validationFunctions["email"] = isEmail;
validationFunctions["radios"] = checkRadios;

function isRequired(obj)
{
  switch (obj.type) {
    case 'text':
    case 'textarea':
    case 'select-one':
      if (obj.value)
        return true;
      return false;
    case 'radio':
      var radios = obj.form[obj.name];
      for (var i=0;i<radios.length;i++)
      {
        if (radios[i].checked) return true;
      }
      return false;
    case 'checkbox':
      return obj.checked;
  }     
}

function checkRadios(obj)
{
  var radios = obj.form[obj.name];
  for (var i=0;i<radios.length;i++)
  {
    if (radios[i].checked)
      return true;
  }
  return false;
}

function isPattern(obj,pattern)
{
  var pattern = pattern || obj.getAttribute('pattern');
  var regExp = new RegExp(pattern);
  var correct = regExp.test(obj.value);
  return correct;
}

function isEmail(obj)
{
  return isPattern(obj,emailRegExp);
}

function emptyFunction()
{
  return true;
}

function validate()
{
  var x = this.elements;
  var validForm = true;
  var firstError = null;
  for (var i=0;i<x.length;i++)
  {

    if (x[i].removeError)
      x[i].removeError();
    var req = x[i].getAttribute('validation');
    if (!req) continue;
    var reqs = req.split(' ');
    if (x[i].getAttribute('pattern'))
      reqs[reqs.length] = 'pattern';
    for (var j=0;j<reqs.length;j++)
    {
      if (reqs[j].indexOf('group') != -1) continue;
      if (!validationFunctions[reqs[j]])
        validationFunctions[reqs[j]] = emptyFunction;
      var OK = validationFunctions[reqs[j]](x[i]);
      if (OK != true)
      {
        var errorMessage = OK || validationErrorMessage[reqs[j]];
        writeError(x[i],errorMessage)
        validForm = false;
        if (!firstError)
          firstError = x[i];
        break;
      }
    }
  }
  if (!validForm)
  {
    firstError.focus();
  }
  return validForm;
}

function writeError(obj,message)
{
  obj.className += ' errorMessage';
  if (obj.errorMessage || obj.parentNode.errorMessage) return;
  var errorMessage = document.createElement('span');
  errorMessage.className = 'errorMessage';
  errorMessage.appendChild(document.createTextNode(message));
  var label = obj.parentNode.getElementsByTagName('label')[0];
  if (label)
    label.appendChild(errorMessage);
  else
    obj.parentNode.appendChild(errorMessage);
  obj.errorMessage = errorMessage;
  obj.parentNode.errorMessage = errorMessage;
  obj.onchange = removeError;
  if (obj.type == 'radio')
  {
    var allRadios = obj.form[obj.name];
    for (var i=0;i<allRadios.length;i++)
    {
      allRadios[i].onchange = removeError;
      allRadios[i].errorMessage = errorMessage;
    }
  }
}

function removeError()
{
  if (this.errorMessage)
  {
    this.errorMessage.parentNode.removeChild(this.errorMessage);
    this.errorMessage = null;
    this.parentNode.errorMessage = null;
  }
  this.onchange = null;
  if (this.type == 'radio')
  {
    var allRadios = this.form[this.name];
    for (var i=0;i<allRadios.length;i++)
    {
      allRadios[i].onchange = null;
      allRadios[i].errorMessage = null;
    }
  }     
}

String.prototype.trim = function() {
  return this.replace(/^\s+|\s+$/g,"");
}

