/*
This script has been included freely within the ListX package in order to have a validator which works within the framework.
You may notice that this script looks remarkably like the WebUIValidation.js Framework script. This is true, however, a small
number of corrections have been made to the script to make it work in browers OTHER than Internet Explorer.

The following corrections were made:
1. Document.all replaced with document.getObjectById()
2. Event added as parameter to the ValidatorOnChange
3. Event is verified in ValidatorOnChange to fetch either target or srcElement
4. Added Conversion function which converts from direct access of custom attributes to getAttribute when not defined.
5. Added Intelligent lookup functionality to automatically populate "Page_Validators".
6. Added Intelligent lookup functionality to automatically populate "Page_ValidationSummaries".
7. Corrected the building of the prototype when firefox needs to assign via getAttribute.
*/
/*INTELLIGENCE LOADER*/

var Page_IsSmartExecuted = false;
var Page_ValidationActive = false;

function Page_SmartValidate(groupname) {
    var i;
    /*BUILD THE VALIDATORS*/
    Page_SmartClientValidate_BuildValidators(groupname);
    /*CALL THE ORIGINAL VALIDATION SCRIPT*/
	var result = Page_ClientValidate(groupname);
	return result;
}
function Page_SmartClientValidate_BuildValidators(groupname)
{
	if (Page_IsSmartExecuted==false)
	{
	if (typeof(window.Page_Validators) == "undefined")
		window.Page_Validators = new Array();
	if (typeof(window.Page_ValidationSummaries) == "undefined")
		window.Page_ValidationSummaries = new Array();

		var pgSValidatorI = 0;
		var pgSSummaryI = 0;
		var pgSItems = false;
		var pgSAttribute = false;
		
		Page_IsSmartExecuted = true;
		Page_Validators = new Array();
		pgSItems = document.getElementsByTagName('SPAN');
		for(i=0;i<pgSItems.length;i++)
		{	
			pgSAttribute = false;
			pgSAttribute = pgSItems[i].getAttribute('controltovalidate');
			if (pgSAttribute)
			{
				Page_Validators[pgSValidatorI] = pgSItems[i];
				pgSValidatorI ++;
			}
			else
			{
				pgSAttribute = false;
				pgSAttribute = pgSItems[i].getAttribute('showsummary');
				if (pgSAttribute)
				{
					Page_ValidationSummaries[pgSSummaryI] = pgSItems[i];
					pgSSummaryI ++;
				}
				else
				{
					pgSAttribute = false;
					pgSAttribute = pgSItems[i].getAttribute('showmessagebox');
					if (pgSAttribute)
					{	
						Page_ValidationSummaries[pgSSummaryI] = pgSItems[i];
						pgSSummaryI ++;	
					}
				}

			}
		}
		ValidatorOnLoad();

		if (typeof(ValidatorOnSubmit)=='undefined')
		{
			window.ValidatorOnSubmit = new Function("e","if (Page_ValidationActive) { return ValidatorCommonOnSubmit(e); } return true;");
		}
	}
}
/*END: INTELLIGENCE LOADER*/

var Page_ValidationVer = "125";
var Page_IsValid = true;
var Page_BlockSubmit = false;
function ValidatorUpdateDisplay(val) {
    if (typeof(val.display) == "string") {    
        if (val.display == "None") {
            return;
        }
        if (val.display == "Dynamic") {
            val.style.display = val.isvalid ? "none" : "inline";
            return;
        }
    }
    val.style.visibility = val.isvalid ? "hidden" : "visible";
}
function ValidatorUpdateIsValid() {
    var i;
    for (i = 0; i < Page_Validators.length; i++) {
        if (!Page_Validators[i].isvalid) {
            Page_IsValid = false;
            return;
        }
   }
   Page_IsValid = true;
}
function ValidatorHookupControlID(controlID, val) {
    if (typeof(controlID) != "string") {
        return;
    }
    var ctrl = document.getElementById(controlID);
    if (typeof(ctrl) != "undefined") {
        ValidatorHookupControl(ctrl, val);
    }
    else {
        val.isvalid = true;
        val.enabled = false;
    }
}
function ValidatorHookupControl(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 (typeof(inner.value) == "string") {
                ValidatorHookupControl(inner, val);
            } 
        }
        return;
    }
    else if (control.tagName != "INPUT" && control.tagName != "TEXTAREA" && control.tagName != "SELECT") {
        var i;
        for (i = 0; i < control.children.length; i++) {
            ValidatorHookupControl(control.children[i], val);
        }
        return;
    }
    else {
        if (typeof(control.Validators) == "undefined") {
            control.Validators = new Array;
            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("ValidatorOnChange(); " + ev);
            var func = new Function("event","ValidatorOnChange(event); " + ev);

            if (control.type == "radio") {
                control.onclick = func;
            } else {            
                control.onchange = func;
            }
        }
        control.Validators[control.Validators.length] = val;
    }    
}
function ValidatorGetValue(id) {
    var control;
    control = document.getElementById(id);
    if (typeof(control.value) == "string") {
        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 ValidatorGetValueRecursive(control);
    }
    return "";
}
function ValidatorGetValueRecursive(control)
{
    if (typeof(control.value) == "string" && (control.type != "radio" || control.status == true)) {
        return control.value;
    }
    var i, val;
    for (i = 0; i<control.children.length; i++) {
        val = ValidatorGetValueRecursive(control.children[i]);
        if (val != "") return val;
    }
    return "";
}
function Page_ClientValidate(groupname) {
		if (typeof(window.Page_Validators) == "undefined")
		window.Page_Validators = new Array();
    var i;
    for (i = 0; i < Page_Validators.length; i++) {

		if (groupname!=undefined && groupname != null)
		{
			var xval = Page_Validators[i];
			if (xval.group == groupname)
			{
				ValidatorValidate(Page_Validators[i]);
			}
			else
			{
				xval.isvalid = true;
			}
		}
		else
		{
			ValidatorValidate(Page_Validators[i]);
		}
    }
    ValidatorUpdateIsValid();    
    ValidationSummaryOnSubmit();
    Page_BlockSubmit = !Page_IsValid;

    return Page_IsValid;
}
//function ValidatorCommonOnSubmit() {
function ValidatorCommonOnSubmit(e) {
    var result = !Page_BlockSubmit;
    Page_BlockSubmit = false;
    //	event.returnValue = result;
    if (!e)
    {
		event.returnValue = result;
	}
	else
	{
		if (!result)
			e.preventDefault();
	}
	//COMPLETE ADD.
    return result;
}
function ValidatorEnable(val, enable) {
    val.enabled = (enable != false);
    ValidatorValidate(val);
    ValidatorUpdateIsValid();
}
//function ValidatorOnChange() {
function ValidatorOnChange(e) {
	if (!e) 
	{
		var vals = event.srcElement.Validators;
	}
	else
	{	
		var vals = e.target.Validators;
	}

//    var vals = event.srcElement.Validators;
    var i;
    for (i = 0; i < vals.length; i++) {
        ValidatorValidate(vals[i]);
    }
    ValidatorUpdateIsValid();    
}
function ValidatorValidate(val) {    
    val.isvalid = true;
    if (val.enabled != false) {
        if (typeof(val.evaluationfunction) == "function") {
            val.isvalid = val.evaluationfunction(val);
        }
    }
    ValidatorUpdateDisplay(val);
}
function ValidatorOnLoad() {
    if (typeof(Page_Validators) == "undefined")
		return;
    var i, val;
    for (i = 0; i < Page_Validators.length; i++) {
        val = Page_Validators[i];
		//ADDED FOR FIREFOX/NETSCAPE
		//if (typeof(val.evaluationfunction) == "undefined" && typeof(val.getAttribute('evaluationfunction')))
		//{
			val.evaluationfunction =  val.getAttribute('evaluationfunction');
			val.errormessage = val.getAttribute('errormessage');
			val.validationexpression = val.getAttribute('validationexpression');
			val.controltovalidate = val.getAttribute('controltovalidate');
			val.controlhookup = val.getAttribute('controlhookup');
			val.initialvalue = val.getAttribute('initialvalue');
			val.display = val.getAttribute('display');
			val.minimumvalue = val.getAttribute('minimumvalue');
			val.maximumvalue = val.getAttribute('maximumvalue');
			val.enabled = val.getAttribute('enabled');
			val.century = val.getAttribute('century');
			val.cutoffyear = val.getAttribute('cutoffyear');
			val.decimalchar = val.getAttribute('decimalchar');
			val.groupchar = val.getAttribute('groupchar');
			val.digits = val.getAttribute('digits');
			val.group = val.getAttribute('group');
			val.dateorder = val.getAttribute('dateorder');
			val.controltocompare = val.getAttribute('controltocompare');
			val.valuetocompare = val.getAttribute('valuetocompare');
			val.operator = val.getAttribute('operator');
			val.clientvalidationfunction = val.getAttribute('clientvalidationfunction');
			if (typeof(val.type)=="undefined")
			{
				val.type = val.getAttribute('type');
			}
		//}
		//END ADDITION
        if (typeof(val.evaluationfunction) == "string") {
            eval("val.evaluationfunction = " + val.evaluationfunction + ";");
        }
        if (typeof(val.isvalid) == "string") {
            if (val.isvalid == "False") {
                val.isvalid = false;                                
                Page_IsValid = false;
            } 
            else {
                val.isvalid = true;
            }
        } else {
            val.isvalid = true;
        }
        if (typeof(val.enabled) == "string") {
            val.enabled = (val.enabled != "False");
        }
        ValidatorHookupControlID(val.controltovalidate, val);
        ValidatorHookupControlID(val.controlhookup, val);
    }
    Page_ValidationActive = true;
}
function ValidatorConvert(op, dataType, val) {
    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") {
        exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + val.decimalchar + "(\\d+))?\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        cleanInput = m[1] + (m[2].length>0 ? m[2] : "0") + "." + 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.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 ValidatorCompare(operand1, operand2, operator, val) {
    var dataType = val.type;
    var op1, op2;
	if (operand1!=null)
	op1 = ValidatorConvert(operand1, dataType, val);
	if (operand2!=null)
	op2 = ValidatorConvert(operand2, dataType, val);
    if (op1 == null)
        return false;    
    if (operator == "DataTypeCheck")
        return true;
    if (op2 == 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 CompareValidatorEvaluateIsValid(val) {
    var value = ValidatorGetValue(val.controltovalidate);
    if (ValidatorTrim(value).length == 0)
        return true;
    var compareTo = "";
    if (null == document.getElementById(val.controltocompare)) {
        if (typeof(val.valuetocompare) == "string") {
            compareTo = val.valuetocompare;
        }
    }
    else {
        compareTo = ValidatorGetValue(val.controltocompare);
    }
    return ValidatorCompare(value, compareTo, val.operator, val);
}
function CustomValidatorEvaluateIsValid(val) {
    var value = "";
    if (typeof(val.controltovalidate) == "string") {
        value = ValidatorGetValue(val.controltovalidate);
        if (ValidatorTrim(value).length == 0)
            return true;
    }
    var args = { Value:value, IsValid:true };
    if (typeof(val.clientvalidationfunction) == "string") {
        eval(val.clientvalidationfunction + "(val, args) ;");
    }        
    return args.IsValid;
}
function RegularExpressionValidatorEvaluateIsValid(val) {
	var value = ValidatorGetValue(val.controltovalidate);
    if (ValidatorTrim(value).length == 0)
        return true;        
    var rx = new RegExp(val.validationexpression);
    var matches = rx.exec(value);
    return (matches != null && value == matches[0]);
}
function ValidatorTrim(s) {
    var m = s.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (m == null) ? "" : m[1];
}
function RequiredFieldValidatorEvaluateIsValid(val) {
    return (ValidatorTrim(ValidatorGetValue(val.controltovalidate)) != ValidatorTrim(val.initialvalue))
}
function RangeValidatorEvaluateIsValid(val) {
    var value = ValidatorGetValue(val.controltovalidate);
    if (ValidatorTrim(value).length == 0) 
	{
        return true;
	}
    return (ValidatorCompare(value, val.minimumvalue, "GreaterThanEqual", val) &&
            ValidatorCompare(value, val.maximumvalue, "LessThanEqual", val));
}
function ValidationSummaryOnSubmit() {
    if (typeof(Page_ValidationSummaries) == "undefined") 
        return;
    var summary, sums, s;
    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {
        summary = Page_ValidationSummaries[sums];
        summary.style.display = "none";

        if (!Page_IsValid) {
			if (typeof(summary.showsummary) == "undefined" && typeof(summary.getAttribute('showsummary')))
			{
				summary.showsummary = summary.getAttribute('showsummary');
				summary.displaymode = summary.getAttribute('displaymode');
				summary.headertext = summary.getAttribute('headertext')
			}
			if (typeof(summary.showmessagebox) == "undefined" && typeof(summary.getAttribute('showmessagebox')))
			{
				summary.showmessagebox = summary.getAttribute('showmessagebox');
				summary.displaymode = summary.getAttribute('displaymode');
				summary.headertext = summary.getAttribute('headertext')
			}
			
            if (summary.showsummary != "False") 
			{
                summary.style.display = "";
                if (typeof(summary.displaymode) != "string") {
                    summary.displaymode = "BulletList";
                }
                switch (summary.displaymode) {
                    case "List":
                        headerSep = "<br>";
                        first = "";
                        pre = "";
                        post = "<br>";
                        finaltext = "";
                        break;
                    case "BulletList":
                    default: 
                        headerSep = "";
                        first = "<ul>";
                        pre = "<li>";
                        post = "</li>";
                        finaltext = "</ul>";
                        break;
                    case "SingleParagraph":
                        headerSep = " ";
                        first = "";
                        pre = "";
                        post = " ";
                        finaltext = "<br>";
                        break;
                }
                s = "";
                if (typeof(summary.headertext) == "string") {
                    s += summary.headertext + headerSep;
                }
                s += first;
                for (i=0; i<Page_Validators.length; i++) {
                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
                        s += pre + Page_Validators[i].errormessage + post;
                    }
                }   
                s += finaltext;
                summary.innerHTML = s; 
                window.scrollTo(0,0);
            }
            if (summary.showmessagebox == "True") {
                s = "";
                if (typeof(summary.headertext) == "string") {
                    s += summary.headertext + "<BR>";
                }
                for (i=0; i<Page_Validators.length; i++) {
                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
                        switch (summary.displaymode) {
                            case "List":
                                s += Page_Validators[i].errormessage + "<BR>";
                                break;
                            case "BulletList":
                            default: 
                                s += "  - " + Page_Validators[i].errormessage + "<BR>";
                                break;
                            case "SingleParagraph":
                                s += Page_Validators[i].errormessage + " ";
                                break;
                        }
                    }
                }
                span = document.createElement("SPAN");
                span.innerHTML = s;
                s = span.innerText;
                alert(s);
            }
        }
    }
}

