var $ = jQuery.noConflict();

function fieldObject() {
  this.field      = 'naam';
  this.result     = false;
  this.message    = "veld is niet correct";
  this.minLength  = 0; 
  this.checkDatum = false;
}

var ErrorHandler = function() {
	var fieldsArr;
	var checkFields;
	var iconUrl;
	var algemeenObj;

	return {
			init : function(iconUrl) {
			var fieldObj = ( {
				field : 'naam',
				result : false,
				message : "veld is niet correct",
				min_length: 0
			});
			this.fieldsArr = [];
			this.checkFields = [];
			this.setErrorIconUrl(iconUrl);
		},
		
		setErrorIconUrl : function(url){
			this.iconUrl = url;
		},
		
		clearErrors : function(){

			$('.qtipError').remove();
			$("#errorHolder").removeClass("errorMessage");
			$("#errorHolder").html("");
			
			for (var i = 0; i < this.fieldsArr.length; i++) {
                 if (this.fieldsArr[i].field) {
			        $("#" + this.fieldsArr[i].field).removeClass("x-form-invalid");
                 }
            }
			this.fieldsArr = [];
		},
		
		hasErrors : function(){
			return (this.fieldsArr.length > 0 ? true : false);
		},
		
		clearField : function(fieldName){
            var veld = $("#" + fieldName);
			veld.removeClass("x-form-invalid");
            
            var holderveld = veld.parent().parent().find(".fieldErrorHolder");
            if ( holderveld.length ) {
                holderveld.find(".qtipError").remove();
            } else {
                veld.next('.qtipError').remove();
            }
			for ( var i = this.fieldsArr.length - 1; i > -1; i--) {
				var fieldObj = this.fieldsArr[i];
				if(fieldObj.field == fieldName){
					this.fieldsArr.splice(i, 1);
				}
			}
		},
	
		add : function(result, fieldName, message) {
			var fieldObj = ( {
				field : fieldName,
				result : result,
				message : message,
				min_length: 0
			});
			this.fieldsArr.push(fieldObj);
		},
		
		addForCheck : function(fieldName, minLength, checkDatum) {
		  var $obj_field = new fieldObject();
		  $obj_field.field = fieldName;
		  $obj_field.minLength = minLength;
		  if (checkDatum != undefined && checkDatum == true) {
		    $obj_field.checkDatum = checkDatum;
		  }
		  
		  this.checkFields[fieldName] =($obj_field);
		},
		
		checkField : function(fieldName, pValue) {
		  if (fieldName in this.checkFields) {
		    var $obj_field = this.checkFields[fieldName];
		    // Controleer minimum lengte
		    if ($obj_field.minLength > 0 && pValue.length < $obj_field.minLength) {
		      return false;
		    }
		    if ($obj_field.checkDatum == true && pValue.length != 0) {
		      // Controleer of er een geldige datum in staat (opmaak dd-mm-yyyy)
		      if (checkDatum(pValue) == false) { return false; }
		    }
		  }
		  return true;
		},
		
		append : function(result, fName, message, sep) 
			    {    
				    for (var i = 0; i < this.fieldsArr.length; i++)
				    {    if (this.fieldsArr[i].field == fName)
					    {    this.fieldsArr[i].message += (sep + message);
						    return;
					    }
				    }
				    this.add(result, fName, message);
			    },
        
        addAll : function( errorMessages ) {
            this.fieldsArr = [];
            for ( var i = 0; i < errorMessages.length; i++) {
                var fieldobj = errorMessages[i];
                if ( fieldobj.errorMessage !== "" ) {
                    this.add( false, fieldobj.fieldName, fieldobj.errorMessage );
                }
            }
        },
	
		displayErrors : function( doreload ) {
			if(this.fieldsArr.length < 1){
				return;
			}
			var bShowErrorHolder = false;
			var sErrContent = '';
			for ( var i = 0; i < this.fieldsArr.length; i++) {
				// var field = testArr[i].field;
				var fieldObj = this.fieldsArr[i];
				if(fieldObj.field === ""){
					sErrContent = (sErrContent === '' ? '' : sErrContent + "<br />") + fieldObj.message; 
					if(!fieldObj.result){					
						$("#errorHolder").addClass('errorMessage');
					}
					bShowErrorHolder = true;
					continue;
				} else if (!fieldObj.result) {
					var messageHtml = '<span title="' + fieldObj.message + '" class="icon icon-exclamation errorMessage qtipError errorContent" id="' + fieldObj.field + '-error"></span>';
                    $("#" + fieldObj.field + "-error").remove();
                    var veld = $("#" + fieldObj.field);
                    veld.addClass("x-form-invalid");
                    var holderveld = veld.parent().parent().find(".fieldErrorHolder");
                    if ( holderveld.length ) {
                        holderveld.html(messageHtml);
                    } else {
                        veld.after(messageHtml);
                    }
				}
			}
			if (bShowErrorHolder === true) {
				$("#errorHolder").html(sErrContent).show();
			}
			
            /**
            * initializatie van de tooltip
            */            
//                this.algemeenObj.reloadQtip();

		},
        getFirstErrorMessage: function() {
            if ( this.fieldsArr.length !== 0 ) {
                var fieldobj = this.fieldsArr[0];
                
                return fieldobj.message;
            }
        }
	};
};

var errorHandler = new ErrorHandler();
errorHandler.init('');

function checkDatum($pValue) {
  
  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
    
  // Controleer of de datum matched met het pattern
  if(!objRegExp.test($pValue)) {
    // Datum matched niet met pattern
    return false; 
  } else {
    // Bepaal het scheidingsteken
    var strSeparator = $pValue.substring(2,3);
    // Maak een array van de datum
    var arrayDate = $pValue.split(strSeparator); 
    // Maak een lookup array voor de maanden en dagen
    var arrayLookup = {  1 : 31,  3 : 31, 
                         4 : 30,  5 : 31,
                         6 : 30,  7 : 31,
                         8 : 31,  9 : 30,
                        10 : 31, 11 : 30,
                        12 : 31};
    // Parse de dag uit de array naar een integer
    var intDay   = parseInt(arrayDate[0], 10); 
    var intMonth = parseInt(arrayDate[1], 10);
    var intYear  = parseInt(arrayDate[2], 10);

    // Controleer of de dag klopt met de opgegeven maand
    if(arrayLookup[intMonth] != null) {
      if(intDay <= arrayLookup[intMonth] && intDay != 0)
        // Dag en maand gevonden in array dus datum klopt
        return true;
    }
    
    // Februari controleren
    if (intMonth == 2) { 
       if (intDay > 0 && intDay < 29) {
         // De 1e 28 dagen in februari zijn sowieso goed
           return true;
       }
       else if (intDay == 29) {
         // De 29e dag is alleen goed als het jaar deelbaar is door 4 of 400 en niet door 100
         if ((intYear % 4 == 0) && (intYear % 100 != 0) || 
             (intYear % 400 == 0)) {
             return true;
         }   
       }
    }
  }
  // Alle overige datums zijn fout
  return false;

}

