/*
  Copyright (c) 2008 Wisdom

  Validates fields for MijnID registration.

  example:
		  var miv = new MijnIDValidator();
		  var result;

		  result = miv.validateUsername("veeltelangveeltelangveeltelangveeltelangveeltelangveeltelang");
		  alert(result.isValid);
		  alert(result.errorCode);
		  alert(result.errorMessage);
		  alert(result.additionalInfo);

		  alert(result.errorCode == miv.RESPONSE_OK);

*/

MijnIDMessages = new Array(
    "Ok",
    "[itemtype] is te kort, minimale lengte is [value]",
    "[itemtype] is te lang, maximale lengte is [value]",
    "Ongeldige tekens in [itemtype]",
    "Ongeldig e-mail adres",
    "Ongeldige tekens in e-mail adres",
    "Dit e-mailadres is al in gebruik",
    "[itemtype] zijn ongelijk",
    "Ongeldige tekens in wachtwoord, gebruik uitsluitend letters en cijfers",
    "Gebruikersnaam bestaat al"
  );

function MijnIDValidator() {
  // constants
  this.minLengthUsername = 4;
  this.maxLengthUsername = 16;
  this.minLengthPassword = 4;
  this.maxLengthPassword = 16;

  this.RESPONSE_OK = 0;
  this.RESPONSE_ERROR_TOO_SHORT = 1;
  this.RESPONSE_ERROR_TOO_LONG = 2;
  this.RESPONSE_ERROR_INVALID_CHARS = 3;
  this.RESPONSE_ERROR_INVALID_EMAIL = 4;
  this.RESPONSE_ERROR_INVALID_EMAIL_INVALID_CHARS = 5;
  this.RESPONSE_ERROR_INVALID_EMAIL_IN_USE = 6;
  this.RESPONSE_ERROR_NOT_EQUAL = 7;
  this.RESPONSE_ERROR_INVALID_PASSWORD = 8;
  this.RESPONSE_ERROR_INVALID_USERNAME = 9;

  // methods
  this.validateUsername = _validateUsername;
  this.ajaxValidateUsername = _ajaxValidateUsername;
  this.validatePassword = _validatePassword;
  this.validateEmailAddress = _validateEmailAddress;
  this.ajaxValidateEmailAddress = _ajaxValidateEmailAddress;
  this.isEqual = _isEqual;
}

function regexpMatch(str, regexp) {
  var re = new RegExp(regexp);
  return str.match(re) == str;
}

function _validateUsername(username) {
  if (username.length < this.minLengthUsername) {
    return new ValidateResponse("gebruikersnaam", false, this.RESPONSE_ERROR_TOO_SHORT, this.minLengthUsername);
  }
  if (username.length > this.maxLengthUsername) {
    return new ValidateResponse("gebruikersnaam", false, this.RESPONSE_ERROR_TOO_LONG, this.maxLengthUsername);
  }
  if (!regexpMatch(username, "[0-9a-zA-Z\.]*")) {
    return new ValidateResponse("gebruikersnaam", false, this.RESPONSE_ERROR_INVALID_CHARS, "'");
  }
  // all ok
  return new ValidateResponse("gebruikersnaam", true, this.RESPONSE_OK, "ok");
}

function _validatePassword(password) {
  if (password.length < this.minLengthPassword) {
    return new ValidateResponse("wachtwoord", false, this.RESPONSE_ERROR_TOO_SHORT, this.minLengthPassword);
  }
  if (password.length > this.maxLengthPassword) {
    return new ValidateResponse("wachtwoord", false, this.RESPONSE_ERROR_TOO_LONG, this.maxLengthPassword);
  }
  if (!regexpMatch(password, "[0-9a-zA-Z]*")) {
    return new ValidateResponse("wachtwoord", false, this.RESPONSE_ERROR_INVALID_PASSWORD, "'");
  }
  // all ok
  return new ValidateResponse("wachtwoord", true, this.RESPONSE_OK, "ok");
}

function _validateEmailAddress(emailAddress) {
  var emailReg  = /^([a-zA-Z0-9+_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  if (!emailReg.test(emailAddress)) {
    return new ValidateResponse("e-mail adres", false, this.RESPONSE_ERROR_INVALID_EMAIL, "'");
  } else {
    return new ValidateResponse("e-mail adres", true, this.RESPONSE_OK, "ok");
  }
}

function _isEqual(a, b, fieldtype) {
  if (a != b) {
    return new ValidateResponse(fieldtype, false, this.RESPONSE_ERROR_NOT_EQUAL, "");
  } else {
    return new ValidateResponse(fieldtype, true, this.RESPONSE_OK, "ok");
  }
}

function _ajaxValidateUsername(username,valObj) {
    var callback =  {

        cache:false,

        success: function(o) {
            var validateResponse;
            if(o.responseText == "success") {
                validateResponse = new ValidateResponse("gebruikersnaam", true, o.argument.MijnIDValidator.RESPONSE_OK, "ok");
            } else {
                validateResponse = new ValidateResponse("gebruikersnaam", false, o.argument.MijnIDValidator.RESPONSE_ERROR_INVALID_USERNAME, "invalid");
            }
            // gui call
            YAHOO.mijnID.regForm.drawError({
                rawResponse:validateResponse,
                field:Dom.get(o.argument.valObj.fieldId),
                helpText:o.argument.valObj.valMethod.helpText
                });
        },

        failure: function(o) {
            // skip check
            var validateResponse = new ValidateResponse("gebruikersnaam", true, o.argument.MijnIDValidator.RESPONSE_OK, "skipped");

            // optional gui response
            YAHOO.mijnID.regForm.drawError({
                rawResponse:validateResponse,
                field:Dom.get(o.argument.valObj.fieldId),
                helpText:o.argument.valObj.valMethod.helpText
                });
        },

        argument : {
            MijnIDValidator: this,
            valObj:valObj
        }
    }
    var transaction = YAHOO.util.Connect.asyncRequest('GET', valObj.valMethod.ajaxCheckUrl + "?username=" + username , callback, null);
}

function _ajaxValidateEmailAddress(email,valObj) {
    var callback =  {

        cache:false,

        success: function(o) {
            if(o.responseText == "success") {
                var validateResponse = new ValidateResponse("e-mail adres", true, o.argument.MijnIDValidator.RESPONSE_OK, "ok");
            } else {
                var validateResponse = new ValidateResponse("e-mail adres", false, o.argument.MijnIDValidator.RESPONSE_ERROR_INVALID_EMAIL_IN_USE, "invalid");
            }
            // gui call
            YAHOO.mijnID.regForm.drawError({
                rawResponse:validateResponse,
                field:Dom.get(o.argument.valObj.fieldId),
                helpText:o.argument.valObj.valMethod.helpText
                });
        },

        failure: function(o) {
            // skip check
            var validateResponse = new ValidateResponse("e-mail adres", true, o.argument.MijnIDValidator.RESPONSE_OK, "skipped");

            // optional gui response
            YAHOO.mijnID.regForm.drawError({
                rawResponse:validateResponse,
                field:Dom.get(o.argument.valObj.fieldId),
                helpText:o.argument.valObj.valMethod.helpText
                });
        },

        argument : {
            MijnIDValidator: this,
            valObj:valObj
        }
    }
    var transaction = YAHOO.util.Connect.asyncRequest('GET', valObj.valMethod.ajaxCheckUrl + "?email1=" + email , callback, null);
}

/*
  Response object.
*/

function ValidateResponse(itemtype, _isValid, _errorCode, _additionalInfo) {
  this.isValid = _isValid;
  this.errorCode = _errorCode;
  var temp = MijnIDMessages[_errorCode];
  temp = temp.replace("[itemtype]", itemtype);
  this.errorMessage = temp.replace("[value]", _additionalInfo);
  this.additionalInfo = _additionalInfo;
}

