var CPPConstraints = {

  fields: new Array(),

  getFormCheckResult: function() {
    var kind = 0;
    var tmp_kind;
    for (field in CPPConstraints.fields) {
      tmp_kind = CPPConstraints.fields[field][2];
      if (tmp_kind == null) {
        var control = document.getElementsByName(field);
        if (control.length > 0) CPPConstraints.check(control[0]);
        tmp_kind = CPPConstraints.fields[field][2];
      }
      if (tmp_kind > 0) {
        if (kind == 0 || kind > tmp_kind) kind = tmp_kind;
      }
    }
    return kind;
  },

  init: function() {
    var control;
    for (field in CPPConstraints.fields) {
      control = document.getElementsByName(field);
      for(var i=0;i<control.length;i++) {
        if (control[i].contraintinited == 1) continue;
        if ( (control[i].tagName == 'INPUT'
              && (control[i].type == 'text' || control[i].type == 'password'))
             || control[i].tagName == 'SELECT'
             || control[i].tagName == 'TEXTAREA'
           ) {
          control[i].contraintinited = 1;
          control[i].contraintprevonblur = control[i].onblur;
          control[i].onblur = function() { if (this.contraintprevonblur) this.contraintprevonblur(this); CPPConstraints.check(this); }
        }
      }
    }
  },

  getMessages: function(p_this) {
    messages = null;
    for (var i=0;i<p_this.parentNode.childNodes.length;i++) {
      if (p_this.parentNode.childNodes[i].className.indexOf('formcontrol_highlight') != -1) {
        messages = p_this.parentNode.childNodes[i];
        break;
      }
    }
    return messages;
  },

  clearMessages: function(p_this) {
    CPPConstraints.fields[p_this.name][2] = 0;
    if (p_this.parentNode.className.indexOf('cppformpanel_highlight') != -1) {
      p_this.parentNode.className = p_this.parentNode.className.substr(0, p_this.parentNode.className.indexOf('cppformpanel_highlight') - 1);
    }
    var messages = CPPConstraints.getMessages(p_this);
    if (messages != null) {
      messages.style.display = 'none';
      for (var i=0; i<messages.firstChild.childNodes.length; i++) {
        messages.firstChild.removeChild(messages.firstChild.childNodes[i]);
      }
    }
  },

  showMessages: function(p_this) {
    var messages = CPPConstraints.getMessages(p_this);
    if (messages != null) {
      if (messages.firstChild.childNodes != undefined
          && messages.firstChild.childNodes.length > 0) {
        messages.style.display = '';
        var kind = null;
        var tmp_kind;
        for(var i=0;i<messages.firstChild.childNodes.length;i++) {
          tmp_kind = messages.firstChild.childNodes[i].className.substr(messages.firstChild.childNodes[i].className.length - 1, 1);
          if ((kind == null && tmp_kind != '') || kind > tmp_kind) kind = tmp_kind;
        }
        p_this.parentNode.className += ' cppformpanel_highlight' + kind;
        CPPConstraints.fields[p_this.name][2] = kind;
      } else {
        p_this.parentNode.className += ' cppformpanel_highlight';
        CPPConstraints.fields[p_this.name][2] = 0;
      }
    } else {
      p_this.parentNode.className += ' cppformpanel_highlight';
      CPPConstraints.fields[p_this.name][2] = 0;
    }
  },

  check: function(p_this) {
    CPPConstraints.clearMessages(p_this);
    var functions = CPPConstraints.fields[p_this.name][0].split('|;|');
    for (var i=0;i<functions.length;i++) {
      eval(functions[i]);
    }
    CPPConstraints.showMessages(p_this);
  },

  addField: function(p_name, p_functions, p_validationalign) {
    CPPConstraints.fields[p_name] = new Array(p_functions, p_validationalign, null);
  },

  addMessage: function(p_this, p_kind, p_message) {
    var el1, el2;
    var validationalign = CPPConstraints.fields[p_this.name][1];
    var messages = CPPConstraints.getMessages(p_this);
    if (messages != null) {
      messages.style.display = 'none';
      messages = messages.firstChild;
    } else {
      messages = null;
      if (validationalign == 'right') {
        el2 = document.createElement("SPAN");
        el2.className = 'cppconstraints';
        el1 = document.createElement("SPAN");
        el1.className = 'formcontrol_highlight';
        el1.style.display = 'none';
        el1.onmouseout = function() { this.className = 'formcontrol_highlight'; }
        el1.onmouseover = function() { this.className = 'formcontrol_highlight_hover'; }
        el1.appendChild(el2);
        messages = p_this.parentNode.appendChild(el1);
        messages = messages.firstChild;
      } else {
        el2 = document.createElement("UL");
        el2.className = 'cppconstraints';
        el1 = document.createElement("DIV");
        el1.className = 'formcontrol_highlight';
        el1.style.display = 'none';
        el1.onmouseout = function() { this.className = 'formcontrol_highlight'; }
        el1.onmouseover = function() { this.className = 'formcontrol_highlight_hover'; }
        el1.appendChild(el2);
        if (validationalign == 'top'
            && p_this.parentNode.childNodes.length > 0) {
          messages = p_this.parentNode.insertBefore(el1, p_this.parentNode.firstChild);
        } else {
          messages = p_this.parentNode.appendChild(el1);
        }
        messages = messages.firstChild;
      }
    }
    if (messages != null) {
      if (validationalign == 'right') {
        el1 = document.createElement("SPAN");
      } else {
        el1 = document.createElement("LI");
      }
      el1.className = 'kind' + p_kind;
      el1.innerHTML = p_message;
      messages.appendChild(el1);
    } else {
      alert(p_message);
    }
  },

  required: function(p_this, p_kind, p_message) {
    if (p_this.value == '') {
      CPPConstraints.addMessage(p_this, p_kind, p_message);
    }
  },

  checkEmail: function(p_this, p_kind, p_message) {
    if (p_this.value != '') {
      var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
      if (filter.test(p_this.value) == false) {
        CPPConstraints.addMessage(p_this, p_kind, p_message);
      }
    }
  },

  fieldRelationCheck: function(p_this, p_kind, p_message, p_fieldname, p_relation, p_expression) {
    if (p_this.value != '') {
      var result = true;
      var other = document.getElementsByName(p_fieldname);
      if (other.length > 0) {
        other = other[0];
        if (p_expression != null) {
          eval(p_expression);
        } else if (other.value != parseFloat(other.value) || p_this.value != parseFloat(p_this.value)) {
          eval('result = "' + p_this.value + '" ' + p_relation + ' "' + other.value + '";');
        } else {
          eval('result = ' + p_this.value + ' ' + p_relation + ' ' +  other.value + ';');
        }
        if (result == false) {
          CPPConstraints.addMessage(p_this, p_kind, p_message);
        }
      }
    }
  },

  minMaxCheck: function(p_this, p_kind, p_minmessage, p_maxmessage, p_minvalue, p_maxvalue, p_minvalueincluded, p_maxvalueincluded) {
    if (p_this.value != '') {
      if (p_minvalue != null
          && (p_this.value < p_minvalue || (p_minvalueincluded == false && p_this.value == p_minvalue))) {
        CPPConstraints.addMessage(p_this, p_kind, p_minmessage);
      } else if (p_maxvalue != null
          && (p_this.value > p_maxvalue || (p_maxvalueincluded == false && p_this.value == p_maxvalue))) {
        CPPConstraints.addMessage(p_this, p_kind, p_maxmessage);
      }
    }
  },

  lookupCheck: function(p_this, p_hash) {
    AjaxRequest.get({
      'url'        : rootdir + '_framework/provider/lookupconstraint/?hash=' + encodeURIComponent(p_hash) + '&value=' + encodeURIComponent(p_this.value),
      'onSuccess'  : function(req) { CPPConstraints.processAjaxResponse(req); },
      'onError'    : function() {}
    });
  },

  customCheck: function(p_this, p_kind, p_checkfunction) {
    var result = true;
    eval('result = ' + p_checkfunction + '(p_this);');
    if (result != true) {
      CPPConstraints.addMessage(p_this, p_kind, result);
    }
  },

  processAjaxResponse: function(req) {
    var data = req.responseXML.getElementsByTagName('DATA');
    if (data.length > 0) {
      var context = data[0].getAttribute('context');
      var name    = data[0].getAttribute('name');
      var kind    = data[0].getAttribute('kind');
      var result  = data[0].getAttribute('result');
      var control = document.getElementsByName(context + '[' + name + ']');
      if (control.length > 0) {
        control = control[0];
        if (result != 1) {
            CPPConstraints.addMessage(control, kind, result);
        }
        CPPConstraints.showMessages(control);
      }
    }
  }

}

var prev = window.onload;
window.onload = function(){ if(prev)prev(); CPPConstraints.init(); }

