var NPage_IsValid = true;
var NPage_BlockSubmit = false;
var NPage_PostValidateRegCards = new Array();
var NPage_ValidationActive = false;
var NPage_Validators = new Array();;

function NValidatorInit(active, arr)
{    
    NPage_ValidationActive = active;
    NPage_Validators = arr;
    /*um das Array beim Unload zu entleeren und ein Leak zu vermeiden*/
    if (window.addEventListener) { window.addEventListener('unload', arr.clear.bind(arr), false); } 
    else { window.attachEvent('onunload', arr.clear.bind(arr)); }
    
    NValidatorOnLoad();
}

function NValidatorUpdateDisplay(val) {
	if (!val.getAttribute("display"))
		val.display = "Dynamic";
    if (typeof(val.display) == "string"){
        if (val.display == "None") {
            return;
        }
        if (val.display == "Dynamic") {
            val.style.display = val.isvalid ? "none" : "inline";
            return;
        }
    }
    try{
		val.style.visibility = val.isvalid ? "hidden" : "visible";
	}
	catch(e){}
}
function NValidatorUpdateIsValid() {		
    var i;   
    while(NPage_PostValidateRegCards.length > 0)
         NValidatorPostValidateCards(NPage_PostValidateRegCards.pop());
    for (i = 0; i < NPage_Validators.length; i++) {
		try {	
			if (typeof(NPage_Validators[i]) == "undefined")
				continue;
			if (!NPage_Validators[i].isvalid) {			
				NPage_IsValid = false;
				NValidatorSetValidatorState();
				return;
			}
		}
		catch(e) {}              
   }        
   NPage_IsValid = true;
   NValidatorSetValidatorState();   
   
  
}

function NValidatorSetValidatorState() {
	if( document.getElementById('NValidator_ValidState') != null )
	{
		document.getElementById('NValidator_ValidState').value = NPage_IsValid;
	}	
	
}
function NValidatorHookupControlID(controlID, val) {
    if (typeof(controlID) != "string") {
        return;
    }
    var ctrl = $(controlID);
    if (ctrl) {
        NValidatorHookupControl(ctrl, val);
    }
    else {
        val.isvalid = true;
        val.enabled = false;
    }
    
}
function NValidatorHookupControl(control, val) {
    if (typeof(control.tagName) == "undefined" && typeof(control.length) == "number") {
        var i;
        for (i = 0; i < control.length; i++) {
        	var inner = control[i];
        	if (!inner)
        		continue;
            if (typeof(inner.value) == "string") {
                NValidatorHookupControl(inner, val);
            } 
        }
        return;
    }
    else if (control.tagName != "INPUT" && control.tagName != "TEXTAREA" && control.tagName != "SELECT") {
        var i;
        for (i = 0; i < control.childNodes.length; i++) {
            NValidatorHookupControl(control.childNodes.item(i), val);
        }
        return;
    }
    else {
        if (typeof(control.NValidators) == "undefined") {
			var arr = new Array();        
			/*um das Array beim Unload zu entleeren und ein Leak zu vermeiden
			eventuell kann man es vermeiden die DomObjekte zu halten indem man eine Array der ids speichert */
			if (window.addEventListener) { window.addEventListener('unload', arr.clear.bind(arr), false); } 
			else { window.attachEvent('onunload', arr.clear.bind(arr));}
            
            control.NValidators = arr;    
            var ev;
            if (control.type == "radio") {
                ev = control.onclick;
            } else {
                ev = control.onchange;
            }
			
            if (typeof(ev) == "function" ) {            
                ev = ev.toString();
                ev = ev.substring(ev.indexOf("{") + 1, ev.lastIndexOf("}"));
            }
            else {
                ev = "";
            }
            var func = new Function(" NValidatorOnChange(this); " + ev);
            if (control.type == "radio") {
                control.onclick = func;
            } else {            
                control.onchange = func;
            }
        }
        control.NValidators[control.NValidators.length] = val;
    }    
}

function NValidatorGetValue(id) {
    var control;            
    control = $(id);
    if (!control)
		control = $(id + "_NDataGridTA");
	if (!control)
		return "";
    if (typeof(control.value) == "string") {
		if( control.tagName.toUpperCase() == "SELECT" && 
		                (control.value == "null"  || control.value == "" || control.value == "0"  || control.value == "00000000-0000-0000-0000-000000000000"))
			return "";
		else
			return control.value;
    }
    if (typeof(control.tagName) == "undefined" && typeof(control.length) == "number") {
        var j;
        for (j=0; j < control.length; j++) {
            var inner = control[j];
            if (typeof(inner.value) == "string" && (inner.type != "radio" || inner.status == true)) {
                return inner.value;
            }
        }
    }
    else {
        return NValidatorGetValueRecursive(control);
    }
    return ""; 
}
function NValidatorGetValueRecursive(control){
    if (typeof(control.value) == "string" && (control.type != "radio" || control.status == true)) {
        return control.value;
    }
    var i, val;
    for (i = 0; i<control.childNodes.length; i++) {
        val = NValidatorGetValueRecursive(control.childNodes[i]);
        if (val != "" && control.childNodes[i].type != "button") return val;
    }
    return "";
}
function NPage_ClientValidate() {
	var len;
	try{
		len = NPage_Validators.length;
	}	
	catch (e){
		len = -1;
		return NPage_IsValid;
	}

    for (i = 0; i < NPage_Validators.length; i++) {
        NValidatorValidate(NPage_Validators[i]);      
    }
    NValidatorUpdateIsValid();    
    
    NPage_BlockSubmit = !NPage_IsValid;
	
   return NPage_IsValid;
}
function NValidatorCommonOnSubmit(eventObj) {
    eventObj.returnValue = !NPage_BlockSubmit;
    NPage_BlockSubmit = false;
}
function NValidatorEnable(val, enable) {
    val.enabled = (enable != false);
    NValidatorValidate(val);
    NValidatorUpdateIsValid();
}
function NValidatorOnChange(eventObj) {
	var vals;
	vals = eventObj.NValidators;
	if (typeof(vals) == "undefined")
		return;
    var i;
    for (i = 0; i < vals.length; i++) {
        NValidatorValidate(vals[i]);
    }
    NValidatorUpdateIsValid();    
}
function NValidatorUpdateError(val, errorMsg) {
	var oImg = null;
	if( val.childNodes.length == 0 )
	{
		oImg = document.createElement("img");
		val.appendChild(oImg);
	} else
		oImg = val.childNodes.item(0);
	
	var src = NValidator_GetAttr(val, "errorimage");
	if (!src){
		src = "images/error.gif";
		src.errorimage = src;
	}
	oImg.src = src;
	val.title = errorMsg;
}

function NValidatorValidate(val){
	if(val != null)
	    val.isvalid = true;
    else
		return;

	if(NValidator_GetAttr(val, "validationCondition") == "NCRegisterCard"){
		NPage_PostValidateRegCards.push(val);
		return;
	}

    if( typeof(NValidator_GetAttr(val, "validationCondition")) == "string" ){
		var bConditionSucceeded = false;
		var condition = "bConditionSucceeded = (" + NValidator_GetAttr(val, "validationCondition") + ");";
		eval(condition);
		if( !bConditionSucceeded ){			
			return;
		}
    }

	try {
		var control = document.getElementById(NValidator_GetAttr(val, "controlID"));
		if( control.disabled ){					
			return;
		}
    } catch(e){ }

    if (val.enabled != false) {	
		if( val.isvalid && (typeof(NValidator_GetAttr(val, "required")) == "string" && typeof(NValidator_GetAttr(val, "clientvalidationfunction")) != "string" ) ){		
			val.isvalid = NRequiredFieldValidatorEvaluateIsValid(val);			
			if( !val.isvalid )
				NValidatorUpdateError(val, NValidator_GetAttr(val, "error_required"));
		}

		if( val.isvalid && typeof(NValidator_GetAttr(val, "regex")) == "string" ) {		
			val.isvalid = NRegularExpressionValidatorEvaluateIsValid(val);
			if( !val.isvalid )
				NValidatorUpdateError(val, NValidator_GetAttr(val, "error_regex"));
		}

		if( val.isvalid && typeof(NValidator_GetAttr(val, "clientvalidationfunction")) == "string" ) {		
			var result = NCustomValidatorEvaluateIsValid(val);
			val.isvalid = result.IsValid;
			if( !val.isvalid )
				NValidatorUpdateError(val, result.ErrorText);
		}

		if( val.isvalid && typeof(NValidator_GetAttr(val, "validationtype")) == "string" ) {
			var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
			if (NValidatorTrim(value).length == 0) {
				val.isvalid = true;
			} else {
				if( NValidatorConvert(value, NValidator_GetAttr(val, "validationtype"), val) == null ) {
					val.isvalid = false;
					NValidatorUpdateError(val, NValidator_GetAttr(val, "error_type"));
				} else {
					val.isvalid = NRangeValidatorEvaluateIsValid(val);
					if( !val.isvalid ) {
						NValidatorUpdateError(val, NValidator_GetAttr(val, "error_range"));
					}
				}
			}
		}
    }
	NValidatorUpdateDisplay(val);
}

function NValidatorOnLoad() {
	if (typeof(NPage_Validators) == "undefined")		
        return;      
    var i, val;
    try{
		for (i = 0; i < NPage_Validators.length; i++){
			val = NPage_Validators[i];
			if(typeof(val) != "object")
				continue;
			if (typeof(val.evaluationfunction) == "string") {
					try{
						val.evaluationfunction = eval( val.evaluationfunction + ";");
						}
					catch(e){}
			}
			if (typeof(val.isvalid) == "string") {
				if (val.isvalid == "False") {
					val.isvalid = false;
					NPage_IsValid = false;
				} 
				else {
					val.isvalid = true;
				}
			}else {
				val.isvalid = true;
			}        
			if (typeof(val.enabled) == "string") {
				val.enabled = (val.enabled != "False");
			}
			NValidatorHookupControlID(NValidator_GetAttr(val, "controlID"), val);
			}
		}
    catch(e){
    	var x = e;
    }
    NPage_ValidationActive = true;
}

function NValidatorConvert(op, dataType, val, compareValue) {
	if (!op)
		return;
    function GetFullYear(year) {
        return (year + parseInt(val.century)) - ((year < val.cutoffyear) ? 0 : 100);
    }
    var num, cleanInput, m, exp;
   
    if (dataType == "Integer") {
        exp = /^\s*[-\+]?\d+\s*$/;        
        if (op.match(exp) == null) 
            return null;
        num = parseInt(op, 10);
        return (isNaN(num) ? null : num);
    }
    else if(dataType == "Double") {
		var decChar = val.getAttribute("decimalchar");					
		if (!compareValue){
			exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + decChar + "(\\d+))?\\s*$");		   
		}else{
			exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\.(\\d+))?\\s*$");   			
			}
        m = op.match(exp);
        if (m == null)
            return null;
        cleanInput = (!m[1] ? "" : m[1]) + ((m[2].length>0 ? m[2] : "0")) + (!m[4] ? "" : "." + m[4]);
        num = parseFloat(cleanInput);
        
      
        
        return (isNaN(num) ? null : num);           
    } 
    else if (dataType == "Currency") {
        exp = new RegExp("^\\s*([-\\+])?(((\\d+)\\" + val.groupchar + ")*)(\\d+)"
                        + ((val.digits > 0) ? "(\\" + val.decimalchar + "(\\d{1," + val.digits + "}))?" : "")
                        + "\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        var intermed = m[2] + m[5] ;
        cleanInput = m[1] + intermed.replace(new RegExp("(\\" + val.groupchar + ")", "g"), "") + ((val.digits > 0) ? "." + m[7] : 0);
        num = parseFloat(cleanInput);
        return (isNaN(num) ? null : num);            
    }
    else if (dataType == "Date") {
        var yearFirstExp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})\\s*$");
        m = op.match(yearFirstExp);
        var day, month, year;
        if (m != null && (m[2].length == 4 || val.dateorder == "ymd")) {
            day = m[6];
            month = m[5];
            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10))
        }
        else {
            if (val){
				if (val.dateorder == "ymd")
					return null;		
            }						
            var yearLastExp = new RegExp("^\\s*(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$");
            m = op.match(yearLastExp);
            if (m == null) {
                return null;
            }
            if (val.dateorder == "mdy") {
                day = m[3];
                month = m[1];
            }
            else {
                day = m[1];
                month = m[3];
            }
            year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10))
        }
        month -= 1;
        var date = new Date(year, month, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
    }
    else {
        return op.toString();
    }
}

function NValidatorCompare(operand1, operand2, operator, val) {
    var dataType = NValidator_GetAttr(val, "validationtype");
    var op1, op2;
    if ((op1 = NValidatorConvert(operand1, dataType, val)) == null)
        return false;    
    if (operator == "DataTypeCheck")
        return true;
    if ((op2 = NValidatorConvert(operand2, dataType, val, 1)) == null)
        return true;
    switch (operator) {
        case "NotEqual":
            return (op1 != op2);
        case "GreaterThan":
            return (op1 > op2);
        case "GreaterThanEqual":
            return (op1 >= op2);
        case "LessThan":
            return (op1 < op2);
        case "LessThanEqual":
            return (op1 <= op2);
        default:
            return (op1 == op2);            
    }
}
function NCompareValidatorEvaluateIsValid(val) {
    var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
    if (NValidatorTrim(value).length == 0)
        return true;
    var compareTo = "";
    if( null == document.getElementById(NValidator_GetAttr(val, "controltocompare")) ) {
        if (typeof(NValidator_GetAttr(val, "valuetocompare")) == "string") {
            compareTo = NValidator_GetAttr(val, "valuetocompare");
        }
    }
    else {
        compareTo = NValidatorGetValue(NValidator_GetAttr(val, "controltocompare"));
    }
    return NValidatorCompare(value, compareTo, val.operator, val);
}

function NCustomValidatorEvaluateIsValid(val) {  
    var value = "";
    var isGrid = false;
    if (typeof(NValidator_GetAttr(val, "controlID")) == "string") {
		var ctlID = NValidator_GetAttr(val, "controlID");
		if ($(ctlID + "_NDataGridTA") && $(ctlID + "_NDataGridTA").tagName == "TABLE" && $(ctlID + "_NDataGridTA").className == "ND")
			isGrid = true;
		else
			value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
        //if (NValidatorTrim(value).length == 0)
        //   return true;
    }
    var args = { Value:value, IsValid:true, ErrorText:"" };
    if (typeof(NValidator_GetAttr(val, "clientvalidationfunction")) == "string") {
		eval(NValidator_GetAttr(val, "clientvalidationfunction") + "(val, args) ;");
    }        
    return args;
}
function NRegularExpressionValidatorEvaluateIsValid(val) {
    var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
    if (NValidatorTrim(value).length == 0)
        return true;        
    var rx = new RegExp(NValidator_GetAttr(val, "regex"));
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
}
function NValidatorTrim(s) {
    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (m == null) ? "" : m[1];
}
function NRequiredFieldValidatorEvaluateIsValid(val) {
    return (NValidatorTrim(NValidatorGetValue(NValidator_GetAttr(val, "controlID"))) != NValidatorTrim(NValidator_GetAttr(val, "initialvalue")));
}
function NRangeValidatorEvaluateIsValid(val) {
    var value = NValidatorGetValue(NValidator_GetAttr(val, "controlID"));
    if (NValidatorTrim(value).length == 0) 
        return true;
    return (NValidatorCompare(value, NValidator_GetAttr(val, "minvalue"), "GreaterThanEqual", val) &&
            NValidatorCompare(value, NValidator_GetAttr(val, "maxvalue"), "LessThanEqual", val));
}
function NValidationSummaryOnSubmit() {}
function NValidator_SetAttr(obj, name, val){
	obj.setAttribute(name, val);
}

function NValidator_GetAttr(obj, name){
	try {
		return obj.getAttribute(name); 
	}
	catch (e) {}
}
function NValidator_GetAttrObj(obj, name) {
	for(var iIdx=0; iIdx < obj.attributes.length; iIdx++) {
		if( obj.attributes.item(iIdx).name.toLowerCase() == name.toLowerCase() )
			return obj.attributes.item(iIdx);
	}
}

// hwg PreValidation
// supports more usabilty: 'Date-Input': '.', '-', '/', ',', ' ' are supported
// missing date-parts will be completed to date(today) due to culture
function preValidateDate(id, defaultDate, setDefault){
	var seperators = new Array('.', '-', '/', ',', ' ');
	var dateVal = $(id).value;
	if(dateVal == "" && setDefault == null)
		return;
	for (var i = 0; i < seperators.length; i++)
		while (dateVal.indexOf(seperators[i]) > 0)
			dateVal = dateVal.replace(seperators[i], '|');

	while (dateVal.indexOf('||') > 0)
		dateVal = dateVal.replace('||', '|'); 

	var cultureVal = cultureDate;
	for (var i = 0; i < seperators.length; i++)
		while (cultureVal.indexOf(seperators[i]) > 0)
			cultureVal = cultureVal.replace(seperators[i], '|');

	while (cultureVal.indexOf('||') > 0)
		cultureVal = cultureVal.replace('||', '|'); 
		
	var dateValues = dateVal.split('|');
	var defaultValues = defaultDate.split('|');
	var cultureValues = cultureVal.split('|');

	var yearIndex = 0;
	var monthIndex =0;
	var dayIndex = 0;

	for (var i = 0; i < cultureValues.length; i++){
		if (cultureValues[i] == 1975)
			yearIndex = i;
		if (cultureValues[i] == 10)
			monthIndex = i;
		if (cultureValues[i] == 18)
			dayIndex = i;
	}

	dateValues[yearIndex] = Number(dateValues[yearIndex]).toString().replace("NaN", "");
	if (dateValues[yearIndex]){
		if (dateValues[yearIndex].length < 3){
			if (dateValues[yearIndex].length < 2)
				dateValues[yearIndex] = '0' + dateValues[yearIndex];
			dateValues[yearIndex] = '20' + dateValues[yearIndex];
			if (Number(dateValues[yearIndex]) > Number(defaultValues[0]) + 5)
				dateValues[yearIndex] = Number(dateValues[yearIndex]) - 100;
		}
		else if (dateValues[yearIndex].length > 4)
			dateValues[yearIndex] = defaultValues[0];
		defaultValues[0] = dateValues[yearIndex];
	}
	if (dateValues[monthIndex])
		defaultValues[1] = Number(dateValues[monthIndex]).toString();
	if (dateValues[dayIndex])
		defaultValues[2] = Number(dateValues[dayIndex]).toString();

	for (var i = 1; i < 3; i++)
		if (defaultValues[i].length == 1)
			defaultValues[i] = '0' + defaultValues[i];

	var preValidatedDate = cultureDate;
	var preY = Number(defaultValues[0]);
	var preM = Number(defaultValues[1]) - 1;
	var preD = Number(defaultValues[2]);
	var preDate = new Date(preY, preM, preD);

	if (preDate.getFullYear() != preY || preDate.getMonth() != preM || preDate.getDate() != preD)
	    preValidatedDate = "";
    else{	    	
	    preValidatedDate = preValidatedDate.replace('1975', defaultValues[0]);
	    preValidatedDate = preValidatedDate.replace('10', defaultValues[1]);
	    preValidatedDate = preValidatedDate.replace('18', defaultValues[2]);
	}

	$(id).value = preValidatedDate;

	if (this.NPage_Validators){
		for (var i = 0; i < NPage_Validators.length; i++) {
		    if (NPage_Validators[i] == null)
		        break;
			if (NPage_Validators[i].id == 'Validator_' + id)
				NValidatorValidate(NPage_Validators[i]);
		}
    }
}

function NValidatorPostValidateCards(cardValidator){
	var showError = false;
	var card = $(NValidator_GetAttr(cardValidator, "controlID"));
	if (card != null){
		var table = $(BASE.GetTmpObj(card.getAttribute("key")));
		showError = NValidator_FindInnerValidatorErrors(table);
	}
	cardValidator.isvalid = !showError;
	if(showError)
		NValidatorUpdateError(cardValidator, "Fehler in untergeordnetem Feld");
	else {
		if(cardValidator.childNodes.length > 0)
			cardValidator.removeChild(cardValidator.firstChild);
	}
}

function NValidator_FindInnerValidatorErrors(node){
	if(!node) return false;	
	spans = node.getElementsByTagName("span");
	if(!spans)
		return false;
	if(spans.length > 0){
		var i = 0;
		var validator = spans[i];
		while(validator){		    
			if(validator.getAttribute("id").substring(0, 9) == "Validator"){
				if(validator.isvalid != undefined && !validator.isvalid)
					return true;
			}
			i++;
			validator = spans[i];
		}
		return false;
	}
	else return false;
}


// -> http://regexlib.com/default.aspx
function isGuid(str)
{
    if (str == null || str == "")
        return false;
        
    var regExpGuid = new RegExp("^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$");

    return regExpGuid.test(str);
}

function isEmail(str)
{
    if (str == null || str == "")
        return false;
        
    var regExpGuid = new RegExp("^\w+[\w-\.]*\@\w+((-\w+)|(\w*))\.[a-z]{2,3}$");

    return regExpGuid.test(str);
}