var invalidFields = '';
var delimiter = '|';
var countryCode = '32';
//var urlCountryCodesXml = "/custom/" + ORG_UNIQUE_NAME + "/countrycodes.xml";
var urlCountryCodesXml = "/usercontrols/scripts/js/countrycodes.xml";
                    
function delimit(fieldName) {
	return (delimiter + fieldName + delimiter);
}

function isFormValid() {
	return (invalidFields.length == 0);
}

function markFieldAsInvalid(fieldName) {
	if(invalidFields.indexOf(delimit(fieldName)) == -1) {
		invalidFields += delimit(fieldName);
	}
}
function markFieldAsValid(fieldName) {
	invalidFields = invalidFields.replace(delimit(fieldName),'');
}

function doNothing(string) {
 
 return string;
}

function isValidEmail(candidateEmail, errorMessage) {
    var validFormat = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
    var clearFormat = /[^0-9,A-Z,a-z,\@,\.,\-,_]/g;
    var cleanedValue = candidateEmail.replace(clearFormat,'');
    var isValid = validFormat.test(cleanedValue);
    if(!isValid) {
	alert(errorMessage + candidateEmail);
    } 
    return isValid;
}
function formatEmail(emailString) {
    var clearFormat = /[^0-9,A-Z,a-z,\@,\.,\-,_]/g;
    return (emailString.replace(clearFormat,'').toLowerCase());
}

function isValidBankAccount(candidateBankAccount, errorMessage) {
	var validFormat = /^\d{12}$/;
	var clearFormat = /[^0-9]/g;
	var cleanedValue = candidateBankAccount.replace(clearFormat,'');
	
	if(cleanedValue.length == 12 && validFormat.test(cleanedValue)) {
    	    var checksum = parseInt((cleanedValue/100) % 97, 10);
    	    var checkDigit = cleanedValue.substring(cleanedValue.length - 2);
	    var checksumOk = true;
	    if(checksum == 0) {
        	if(checkDigit != 97) {
	            checksumOk = false;
        	}
	    } else if(checksum != checkDigit) {
        	checksumOk = false;
	    }
	    if(!checksumOk) {
        	alert('checksum of bank account does not match');
	    } else {
		return true;
    	    }
	} else {
	    alert(errorMessage + candidateBankAccount);
	}
	return false;
}
function formatBankAccount(candidateBankAccount) {
	var clearFormat = /[^0-9]/g;
	var cleanedValue = candidateBankAccount.replace(clearFormat,'');
	return (cleanedValue.substring(0,3) + '-' + cleanedValue.substring(3,10) + '-' + cleanedValue.substring(10));
}

function isValidNationalRegisterNumber(candidateRegisterNumber, errorMessage) {

	var validFormat = /^\d{11}$/;
	var clearFormat = /[^0-9]/g;
	var cleanedValue = candidateRegisterNumber.replace(clearFormat,'');

	if(cleanedValue.length == 11 && validFormat.test(cleanedValue)) {
	    var year = cleanedValue.substring(0,2);
	    var month = cleanedValue.substring(2,4);
	    var day = cleanedValue.substring(4,6);
	
		var message = '';
	    if(day < 0 || day > 31) {
        	message += 'Invalid day in national register number\n';
		}
	    if(month < 0 || month > 12) {
        	message += 'Invalid month in national register number\n';
	    }
		if((97-cleanedValue.substring(0,9)% 97) != cleanedValue.substring(9,11)){
			message += 'Invalid check in national register number\n';
		}
	    if(message != '') {
        	alert(message);
	    } else {
       		return true;
		}
	} else {
	    alert(errorMessage + candidateRegisterNumber);
	}
	return false;
}
function formatNationalRegisterNumber(candidateRegisterNumber) {
	var clearFormat = /[^0-9]/g;
	var cleanedValue = candidateRegisterNumber.replace(clearFormat,'');
        var year = cleanedValue.substring(0,2);
	var month = cleanedValue.substring(2,4);
	var day = cleanedValue.substring(4,6);
	return(year + '.' + month + '.' + day + '-' + cleanedValue.substring(6,9) + '.' + cleanedValue.substring(9,11));
}

function isValidUrl(candidateUrl) {
	var validFormat = /^((http\:\/\/)|(https\:\/\/)|(ftp\:\/\/))?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\:[0-9]{1,5})?(\/\S*)?$/g;
	var clearFormat = /[^0-9,A-Z,a-z,\/,\:,\.\-]/g;
	var cleanedValue = candidateUrl.replace(clearFormat,'');

	return (validFormat.test(cleanedValue));
}
function formatUrl(candidateUrl) {
    var clearFormat = /[^0-9,A-Z,a-z,\/,\:,\.\-]/g;
    return (candidateUrl.replace(clearFormat,'').toLowerCase());
}

function isDateInPast(candidateDate, errorMessage){
	var today = new Date();
	var returnvalue = true;
	if(candidateDate > today){
		alert(errorMessage);
		returnvalue = false;
	}
	return returnvalue;
}
function isDateInFuture(candidateDate, errorMessage){
	var today = new Date();
	var returnvalue = true;
	if(candidateDate < today){
		alert(errorMessage);
		returnvalue = false;
	}
	return returnvalue;
}
function isDateXYearsInPast(candidateDate, years, errorMessage){
	if(candidateDate == null || candidateDate == undefined)
		return true;

	var returnvalue = true;
	var today = new Date();

	var yearsAgo = new Date(today.setFullYear(today.getFullYear() - years));

	if(candidateDate > yearsAgo){
		alert(errorMessage + candidateDate);
		returnvalue = false;
	}
	return returnvalue;
}

function setDynamicFieldRequirement(isRequired, fieldName){
	if(isRequired == true){
		if(crmForm.all[fieldName].oldReq == undefined) {
			crmForm.all[fieldName].oldReq = crmForm.all[fieldName].req;
		}
		SetRequiredLevel(fieldName, 2);
	} else if(crmForm.all[fieldName].oldReq != undefined){
		SetRequiredLevel(fieldName, crmForm.all[fieldName].oldReq );
	}
}
function SetRequiredLevel(fieldName, level){  
  var field = crmForm.all[fieldName];
  
  crmForm.SetFieldReqLevel(fieldName,level);
  crmForm.all[fieldName].req = level;
  
  var fieldLabel = document.getElementById(field.id + "_c");
  if (fieldLabel != null)
  {
	if(level == 0){ 
		fieldLabel.className = "ms-crm-Field-Normal";
		fieldLabel.innerHTML = fieldLabel.innerHTML.replace("<IMG style=\"DISPLAY: inline\" alt=Required src=\"/_imgs/frm_required.gif\">","");
	}
	else if (level == 1){ 
			fieldLabel.className = "ms-crm-Field-Recommended";
			fieldLabel.innerHTML = fieldLabel.innerHTML.replace("required", "recommended").replace("Required","Recommended");
		 }
    else 
         fieldLabel.className = "ms-crm-Field-Required";
   }
}

function onChangeField(fieldName, errorMessage, validationFunction, formatFunction, extraValidationParameters) {
	var control = document.crmForm.all[fieldName];
	
	markFieldAsValid(fieldName);

	if(control.DataValue == null) { return; }
	
	if(extraValidationParameters == null){
		if(validationFunction == null || validationFunction(control.DataValue, errorMessage)) {
			if(formatFunction != null) {
				control.DataValue = formatFunction(control.DataValue);
			}
		} else {
			markFieldAsInvalid(fieldName);
		}
	} else {
		if(validationFunction == null || validationFunction(control.DataValue, extraValidationParameters, errorMessage)){
			if(formatFunction != null) {
				control.DataValue = formatFunction(control.DataValue);
			}
		} else {
			markFieldAsInvalid(fieldName);
		}		
	}
}

function ensureCountryCode(cleanedPhoneString) {
	if(cleanedPhoneString.substring(0,2) == '00') {
		return cleanedPhoneString.substring(2);;
	}
	if(cleanedPhoneString.length < 11) {
		if(cleanedPhoneString.charAt(0) == '0') {
			return countryCode + cleanedPhoneString;
		}
	}
	return cleanedPhoneString;
}
function isValidPhone(candidateValidPhone, errorMessage) {
    var validFormat = /^\d{7,15}$/;
    var clearFormat = /[^0-9]/g;
    var cleanedValue = candidateValidPhone.replace(clearFormat,'');
    cleanedValue = ensureCountryCode(cleanedValue);
    var isValid = validFormat.test(cleanedValue);
    if(!isValid) {
	    alert(errorMessage + candidateValidPhone);
    } 
	return isValid;
}
function formatPhone(phoneString) {
   var phoneFormatter = new PhoneFormatter(urlCountryCodesXml,phoneString);
   return (phoneFormatter.format());
}
function PhoneFormatter(urlPhonesXmlDocument, phone) {
 
    this.format = _format;
    this.cleanPhoneString = _cleanPhoneString;
    this.getByCountryCode = _getByCountryCode;
    this.getByCountryCodeAndAreaCode = _getByCountryCodeAndAreaCode;
    this.getMaxLength = _getMaxLength;
    this.getMaxLengthCountryCode = _getMaxLengthCountryCode;
    this.getMaxLengthAreaCode = _getMaxLengthAreaCode;
    this.parseCountryCode = _parseCountryCode;
    this.formatRemainder = _formatRemainder;
    this.parseAreaCode = _parseAreaCode;
    this.isCandidateCountryCodeSpecified = _isCandidateCountryCodeSpecified;
    	
    if (window.ActiveXObject) {
        this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
        this.xmlDoc.async=false;
    } else if(document.implementation && document.implementation.createDocument) {
        this.xmlDoc= document.implementation.createDocument("","",null);
    }
    this.xmlDoc.load(urlPhonesXmlDocument);
    this.phoneString = phone;   
	this.countryCode = '32';
    this.areaCodePrefix = '';
    this.areaCode = ''; 
}
function _format() {
    var doParseCountryCode = this.isCandidateCountryCodeSpecified()
    this.cleanPhoneString();

    if(doParseCountryCode) {
	    this.parseCountryCode();
    }

    this.parseAreaCode();
    this.formatRemainder();

   var buffer = '+' + this.countryCode;   
   if(this.areaCode != null && this.areaCode.length > 0) {
       buffer += ' (' + this.areaCode + ')';
   } 
	     
   buffer += ' ' + this.phoneString;

   return(buffer);
}
function _getByCountryCode(countryCode) {
	var xpath = "/countries/country[code/text()='" + countryCode + "']"
	return this.xmlDoc.selectSingleNode(xpath);
}
function _getByCountryCodeAndAreaCode(countryCode, areaCode) {
	var xpath = "/countries/country[code/text()='" + countryCode + "']/areas/area[code/text()='" + areaCode + "']";
	return this.xmlDoc.selectSingleNode(xpath);
}
function _getMaxLength(xpath) {
	var maxLength = 0;
	var result = this.xmlDoc.selectNodes(xpath);
	var resultCount = result.length;
	for (i = 0; i < resultCount; i++) {
		if(result(i).text.length > maxLength) {
			maxLength = result(i).text.length;
		}	
	}
	return maxLength;
}
function _getMaxLengthCountryCode() {
	return (this.getMaxLength("/countries/country/code/text()"));
}
function _getMaxLengthAreaCode() {
	return (this.getMaxLength("/countries/country/areas/area/code/text()"));
}
function _cleanPhoneString() {
	var clearFormat = /[^0-9#]/g;
	this.phoneString = this.phoneString.replace(clearFormat,'');
}
function _parseCountryCode() {

	if(this.phoneString == null || this.phoneString.length < 2) { return; }

	if(this.phoneString.substring(0,1) == '0') {
		this.phoneString = this.phoneString.substring(1);
	}
	if(this.phoneString.substring(0,1) == '0') {
		this.phoneString = this.phoneString.substring(1);
	}

	var maxLengthCountryCode = this.getMaxLengthCountryCode();
	if(this.phoneString.length < maxLengthCountryCode) {
		maxLengthCountryCode = this.phoneString.length;
	}

	for(i=maxLengthCountryCode;i>0;i--) {
		var candidateCountryCode = this.phoneString.substring(0,i);
		candidateCountryCode = this.getByCountryCode(candidateCountryCode);
		if(candidateCountryCode != null) { 
			this.countryCode = candidateCountryCode.childNodes(1).text;			
			this.phoneString = this.phoneString.substring(i);
			break; 
		}
	}
}
function _parseAreaCode() {
	if(this.phoneString == null || this.phoneString.length < 1) { this.areaCode = ''; return; }

	var country = this.getByCountryCode(this.countryCode);

	if(country != null) {
		this.areaCodePrefix = country.childNodes(3).text;
		if(this.phoneString.length > this.areaCodePrefix.length && this.phoneString.substring(0,this.areaCodePrefix.length) == this.areaCodePrefix) {
			this.phoneString = this.phoneString.substring(this.areaCodePrefix.length); 
		}
	}

	var maxLengthAreaCode = this.getMaxLengthAreaCode();
	if(this.phoneString.length < maxLengthAreaCode) {
		maxLengthAreaCode = this.phoneString.length;
	}

	for(i=maxLengthAreaCode;i>0;i--) {
		var candidateAreaCode = this.phoneString.substring(0,i);
		candidateAreaCode = this.getByCountryCodeAndAreaCode(this.countryCode, candidateAreaCode);
		if(candidateAreaCode != null) { 
			this.areaCode = candidateAreaCode.childNodes(1).text;			
			this.phoneString = this.phoneString.substring(i);
			break; 
		}
	}
}
function _formatRemainder() {
	var buffer = this.phoneString;
	var part = null;
	var extension = null;
	
	if(this.phoneString.indexOf('#') != -1 ) {
	    var indexHash = this.phoneString.indexOf('#');
	    extension = this.phoneString.substring(indexHash + 1);
	    buffer = this.phoneString.substring(0,indexHash);
	}
	
	var length = buffer.length;
	
	this.phoneString = '';
	var offset = length;
	var addition = '';
	while (offset > 3)
	{
		offset -= 2;
		part = buffer.substring(offset, offset + 2);
		part = part + addition;
		this.phoneString = part + this.phoneString;
		addition = '.';			
	}
	this.phoneString = buffer.substring(0, offset) + '.' + this.phoneString;

	if(extension != null) {
	    this.phoneString += ' #' + extension; 
	}
}
function _isCandidateCountryCodeSpecified() {
    
	if(this.phoneString.substring(0,2) == '00' || this.phoneString.substring(0,1) == '+') return true;
	if(this.phoneString.substring(0,1) == '0' & this.phoneString.substring(0,2) != '00') { return false; }

    return true;
}


function formatOndernemingsNumber(number){
	if(number.length == 0) return '';	
	if(isValidOndernemingsNumberInternal(number)){
		var cleanedNumber = number.replace(/[^0-9]/g,'');
		if(cleanedNumber.length == 9){
			cleanedNumber = '0' + cleanedNumber;
		}
		return 'BE - ' + cleanedNumber.substring(0,4) + '.' + cleanedNumber.substring(4,7) + '.' + cleanedNumber.substring(7,10);
	}
	else return '';
}
function isValidOndernemingsNumber(number, errorMessage){
	var isValid = isValidOndernemingsNumberInternal(number);
	if(!isValid){
		alert(errorMessage + number)
	}
	return isValid;
}
function isValidOndernemingsNumberInternal(number){
	var cleanedNumber = number.replace(/[^0-9]/g,'');
	if(cleanedNumber.length == 9){
		cleanedNumber = '0' + cleanedNumber;
	}
	return  (number.length == 0 || (validateOndernemingsNumberLength(cleanedNumber) && validateOndernemingsNumberChecksum(		cleanedNumber)));	
}
function validateOndernemingsNumberLength(candidateNumber){
	return (candidateNumber.length == 10);
}
function validateOndernemingsNumberChecksum(candidateNumber){
	var remainder = (candidateNumber.substring(0,8) % 97)*1;
	var control = (candidateNumber.substring(8,10))*1;
	return (97 - remainder == control);
}

function isValidIban(iban, errorMessage){
	var validAccount = /^\d{12}$/;
	var cleanedIban = iban.replace(/[^0-9]/g,'')
	
	if(validAccount.test(cleanedIban)){
		return isValidBankAccount(cleanedIban, errorMessage);
	}
	var validIban = /^\w{2}\d{14}$/;
	
	cleanedIban = iban.replace(/[^a-zA-Z0-9]/g,'')
	if(validIban.test(cleanedIban)){
		var accountNumber = cleanedIban.substring(4);
		if(isValidBankAccount(accountNumber, errorMessage)){
			if(ChecksumIban(cleanedIban) == "97"){
				return true;
			}
		}
	}		
	alert(errorMessage + iban);	
}
function ChecksumIban(iban){
  var code     = iban.substring(0, 2);
  var checksum = iban.substring(2, 4);
  var bban     = iban.substring(4);

  var digits = "";
  for (var i = 0; i < bban.length; ++i)
  {
    var ch = bban.charAt(i);
    if ("0" <= ch && ch <= "9")
      digits += ch;
    else
      digits += _capital2digits(ch);
  }
  for (var i = 0; i < code.length; ++i)
  {
    var ch = code.charAt(i);
    digits += _capital2digits(ch);
  }
  digits += checksum

  checksum = 98 - mod97(digits);
  return fill0("" + checksum, 2);
}
function _capital2digits(ch){
  var capitals = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  for (var i = 0; i < capitals.length; ++i)
    if (ch == capitals.charAt(i))
      break;
  return i + 10;
}
function mod97(digit_string){
  var m = 0;
  for (var i = 0; i < digit_string.length; ++i)
    m = (m * 10 + parseInt(digit_string.charAt(i))) % 97;
  return m;
}
function fill0(s, l){
  while (s.length < l)
    s = "0" + s;
  return s;
}
function formatIban(iban){
	var validAccount = /^\d{12}$/;
	var cleanedIban = iban.replace(/[^0-9]/g,'')
	if(validAccount.test(cleanedIban)){
		return _formatAccountAsIban(cleanedIban);
	}
	var validIban = /^\w{2}\d{14}$/;
	cleanedIban = iban.replace(/[^a-zA-Z0-9]/g,'')
	if(validIban.test(cleanedIban)){
		var accountNumber = cleanedIban.substring(4);
		if(isValidBankAccount(accountNumber, '')){
			if(ChecksumIban(cleanedIban) == "97"){
				return _formatIban(cleanedIban);
			}
		}
	}			
}
function _formatAccountAsIban(account){
	var checksum = ChecksumIban("BE" + "00" + account);
	return _formatIban('BE' + checksum + account);
}
function _formatIban(iban){
	var ibanToUpper = iban.toUpperCase();
	var ibanFormatted = '';
	for (var i = 0; i < iban.length; ++i)
	{
		if (i % 4 == 0)
			ibanFormatted += ' ';
	    ibanFormatted += iban.charAt(i);
	}
	return ibanFormatted;
}

function isValidBic(bic, errorMessage){
	var cleanedBic = bic.replace(/[^\w]/g,'');
	var validbic = /^[a-zA-Z]{4}\w{4}(\w{3})?$/;
	if(validbic.test(cleanedBic)){
		return true;
	}
	alert(errorMessage + bic);
}
function formatBic(bic){
	return bic.replace(/[^\w]/g,'').toUpperCase();
}

function LettersOnlyAndCapitalize(e) {
    if (e.keyCode >= 65 & e.keyCode <= 90) {
        $(e.target).insertAtCaret(GetValueOfKeyCode(e));
        return false;
    }
    else if ((e.keyCode < 8 || e.keyCode > 46) & e.keyCode != 12) {
        return false;
    }
}

function GetValueOfKeyCode(e) {
    if (navigator.appName == 'Netscape') {
        document.captureEvents(e.KEYPRESS);
    }

    if (navigator.appName == 'Microsoft Internet Explorer') {
        return String.fromCharCode(window.event.keyCode);
    }
    if (navigator.appName != 'Microsoft Internet Explorer') {
        return String.fromCharCode(e.which);
    }
}

$.fn.insertAtCaret = function (tagName) {
    return this.each(function () {
        if (document.selection) {
            //IE support
            this.focus();
            sel = document.selection.createRange();
            sel.text = tagName;
            this.focus();
        } else if (this.selectionStart || this.selectionStart == '0') {
            //MOZILLA/NETSCAPE support
            startPos = this.selectionStart;
            endPos = this.selectionEnd;
            scrollTop = this.scrollTop;
            this.value = this.value.substring(0, startPos) + tagName + this.value.substring(endPos, this.value.length);
            this.focus();
            this.selectionStart = startPos + tagName.length;
            this.selectionEnd = startPos + tagName.length;
            this.scrollTop = scrollTop;
        } else {
            this.value += tagName;
            this.focus();
        }
    });
};

function IsRadioButtonSelected(list) {
    var inputs = list.getElementsByTagName("input");
    var selected;
    for (var i = 0; i < inputs.length; i++) {
        if (inputs[i].checked) {
            selected = inputs[i];
            break;
        }
    }
    if (selected) {
        return selected.value;
    }
    return "false";
}
