/////////////////////////// modify here ///////////////////////////////////////////////////////////////
//div id that will be looked for and html will be placed between its tags.
var csvValidationErrorMessageMarker = 'errMsg';
//error table message class
var csvValidationErrorMessageTableClass = 'errMsgTable';
//error table class
var csvValidationErrorTableClass = 'errTable';
//error messages class
var csvValidationErrorTextClass = 'errMsgTableTxt';
//message to display at top of error box
var csvValidationErrorMessageInstruction = 'Please correct the following error(s):';
//width for 1 column in error box
var csvValidationErrorColumnWidth = 225;
//error table width
var csvTableWidth = 450;
//max rows for message box
var csvValidationErrorRoxMax = 110;
//label error style
var csvValidationLabelErrorStyle = 'clsLabelErrors';
//input element error style
var csvValidationInputErrorStyle = 'clsCSErrors';
//label style
var csvValidationLabelStyle = 'bodyarialcopy';
//input element style
var csvValidationInputStyle = 'normalimput';
//array of serverity gifs
var csvValidationSeverityGifs = new Array;
csvValidationSeverityGifs['info'] = 'images/Info.gif';
csvValidationSeverityGifs['warn'] = 'images/Warn.gif';
csvValidationSeverityGifs['critical'] = 'images/Critical.gif';

var csvCheckArray = new Array;
csvCheckArray[0] = new CheckFunction(/^(r_)?int/, 'Enter Whole Numbers Only', 'csvIsInteger');
csvCheckArray[1] = new CheckFunction(/^(r_)?mny/, 'Enter a Valid Money Amount', 'csvIsMoney');
csvCheckArray[2] = new CheckFunction(/^(r_)?dbl/, 'Enter a Valid Number', 'csvIsReal');
csvCheckArray[3] = new CheckFunction(/^(r_)?2nb/, 'Enter 2 Numbers', 'csvIsTwoNum');
csvCheckArray[4] = new CheckFunction(/^(r_)?3nb/, 'Enter 3 Numbers', 'csvIsThreeNum');
csvCheckArray[5] = new CheckFunction(/^(r_)?4nb/, 'Enter 4 Numbers', 'csvIsFourNum');
csvCheckArray[6] = new CheckFunction(/^(r_)?eml/, 'Enter a Valid Email', 'csvIsEmail');
csvCheckArray[7] = new CheckFunction(/^(r_)?zip/, 'Enter a Valid Zip Code', 'csvIsZip');
csvCheckArray[8] = new CheckFunction(/^(r_)?alp/, 'Enter Letters Only', 'csvIsAlpha');
csvCheckArray[9] = new CheckFunction(/^(r_)?aln/, 'Enter Numbers and Letters Only', 'csvIsAlphaNum');
csvCheckArray[10] = new CheckFunction(/^(r_)?5nb/, 'Enter 5 Numbers', 'csvIsFiveNum');
//global variables
var csvValidationDebug = false;
var csvValidationErrors = null;
var csvValidationSelectElement = true;
var csvValidationDisplayWithMarker = true;
var csvValidationSeverity = 'critical';
var csvValidationAllowOverride = false;
var csvValidationErrorAtLabel = false;
var csvValidationErrorsOld = null;

/* Main Function to Validate */
function csvValidate(frm, arr, severity, debug, displayWithMarker, selectElement,
    allowOverride, showErrorsInElement, aBtnArray) {
	
    // reset from previous check if applicable
    if (csvValidationErrors && csvValidationErrors.length>0) {
        if (csvValidationDisplayWithMarker)
            csvDisplayErrorMessageWithMarker(true, csvValidationLabelStyle, csvValidationInputStyle);
    }
    //initialization stuff
    if (debug!=null)
        csvValidationDebug = debug;
    if (aBtnArray==null) {
        var aArray = new Array;
        aArray[0] = 'submit';
        aBtnArray = aArray;
    }
    if (selectElement!=null) csvValidationSelectElement = selectElement;
    if (displayWithMarker!=null) csvValidationDisplayWithMarker = displayWithMarker;
    if (severity!=null) csvValidationSeverity = severity;
    if (allowOverride!=null) csvValidationAllowOverride = allowOverride;
    if (showErrorsInElement!=null) csvValidationErrorAtLabel = !showErrorsInElement;
    csvValidationErrors = new Array;

    //////////// main routine below ///////////////////
	// Check all fields for validation errors
    var el = cbeGetFormByName(frm);
    if (el) {
		if(arr) {
			for(i=0; i<arr[0].length; i++) {
				var ele = cbeGetElementById(arr[0][i]);
				var chk = arr[1][i];
				var val = arr[2][i]; 
				if (ele) {
					var type = ele.type;
					//if input type
					if (type=="select-one" || type=="select-multiple" || type=="text" || type=="file" ||
						type=="textarea" || type=="checkbox" || type=="radio" || type=="password")
					{
						var err = csvValidateFormField(ele, chk, val, el );
						if (err) {
							k=csvValidationErrors.length;
							csvValidationErrors[k]=err;
						}
					}
				}
			}
        }

        //if no validation errors
        if (csvValidationErrors.length==0) {
            if(csvValidationDebug) alert ('No Errors');
			//disable button array
            if (aBtnArray) {
                for (i=0; i<aBtnArray.length; i++) {
                    if (aBtnArray[i]) {
                        var el = cbeGetElementById(aBtnArray[i]);
                        if (el) {
                            el.disabled = true;
                        }
                    }
                }
            }
            return true;
        }
        //show errors
        else {
            //alert validation errors if debug
            if (debug) {
                for (i=0; i<csvValidationErrors.length; i++) {
					alert(csvValidationErrors[i]);
                }
            }
            if (csvValidationDisplayWithMarker)
                csvDisplayErrorMessageWithMarker(false, csvValidationLabelErrorStyle, csvValidationInputErrorStyle);            
			return false;
        }
    }
    else {
        if (debug) alert('form is null');
        return false;
    }
}
/* Removes error messages */
function csvResetForm(frm) {
    if (csvValidationDisplayWithMarker)
        csvDisplayErrorMessageWithMarker(true, csvValidationLabelStyle, csvValidationInputStyle);
	csvValidationErrors = null;
    csvValidationErrorsOld = null;
    return true;
}
/* set focus in id member*/
function csvSetFocus(elId) {
    var el = cbeGetElementById(elId);
    if (el) {
        el.focus();
        if (csvValidationSelectElement)
            el.value="";
    }
}
/* display error messages as table using marker.*/
function csvDisplayErrorMessageWithMarker(reset, labelStyle, inputStyle) {
    
	var html = '&nbsp';
    if (!reset) {
        var severity = csvValidationSeverityGifs[csvValidationSeverity];

        var preHtml ="<table class='"+csvValidationErrorTableClass+
            "'><tr><td valign='center' width='50'><center><img src='"+
            severity+"'/></center></td>"+"<td><table class='"+
            csvValidationErrorMessageTableClass+"'><tr><td colspan='3'>"+
            "<b>"+csvValidationErrorMessageInstruction+"</b>"+"</td></tr>";
        var errorHtml = '';
        var rowCount = 0;
        var columns = csvGetDisplayErrorColumns();
        var columnWidth = Math.round(1/columns*100);
        for (i=0; i<csvValidationErrors.length; i++) {
            var err = csvValidationErrors[i];
            if (err) {
                //new row
                if (i%columns == 0) errorHtml += "<tr>";
                //cell
                errorHtml +="<td width='"+columnWidth+"%' class='" +csvValidationErrorTextClass +
				"'><a href='javascript:csvSetFocus(\""+err.element.id+"\")'>"+err.labelWithoutPrefix()+
                "<a> - "+err.message+"</td>";
                //close of row
                if (i%columns == columns-1) {
                    errorHtml += "</tr>";
                    rowCount++;
                }
            }
            //check to see if we are at max.
            if (rowCount==csvValidationErrorRoxMax) break;
        }
        var postHtml = "</table></td></tr></table>";
        html = preHtml+errorHtml+postHtml;
    }
    csvDisplayErrorMessage(html, labelStyle, inputStyle);
}
function csvValidateFormField(el, chk, val, frm) {
	if (csvValidationDebug) alert(csvElementMetaInfo(el));
    var err = csvCheckRequired(el, chk, val, frm);
    if (err){
        return err;
    }
	//if it is just required then bail because met condition above
	var filter = /^(r_)$/;
	var filter2 = /^\S/;
	if (!csvIsNullOrSpace(chk) && filter.test(chk))
	    return null;
    //if it is not required and blank bail
	else if(!csvIsNullOrSpace(chk) && filter2.test(chk) && el.value == "")
		return null;
	
	for (ci=0; ci<csvCheckArray.length; ci++) {
		var chkfx = csvCheckArray[ci];
		if(!csvIsNullOrSpace(chk) && chkfx.regExp.test(chk)) {
			err = csvCheckFx(el, csvCheckArray[ci], chk, val);
        	if (err) return err;
			else break;
		}
    }
    return null;
}


/////////// objects /////////////////////////////////////
/* CheckFunction object. Used by validateFormField */
function CheckFunction(regExp, errMsg, fxName){
    this.regExp = regExp;
    this.errMsg = errMsg;
    this.fxName = fxName;
}
CheckFunction.prototype.regExp = function(){return this.regExp};
CheckFunction.prototype.errMsg = function(){return this.errMsg};
CheckFunction.prototype.fxName = function(){return this.fxName};
CheckFunction.prototype.toString = function(){return 'RegExp='+this.regExp+
    '\nError Message='+this.errMsg+'\nFunction Name='+this.fxName};


/*
 *  Validation Error Object
 *  element - action form element that failed validation
 *  message - message associated with the failure
 *  label - label to display
 */
function ValidationError(element, message, lbl){
    this.element = element;
    this.message = message;
	this.lbl = lbl;
};
ValidationError.prototype.element = function(){return this.element};
ValidationError.prototype.labelHtml = null;
ValidationError.prototype.message = function(){return this.message};
//returns the label id of the label to identify an error has occurred
ValidationError.prototype.label = function() {return 'lbl_'+ this.element.id;};
ValidationError.prototype.labelWithoutPrefix = function() {return this.lbl;};
ValidationError.prototype.toString = function(){
    return "Validation Error:\n"+csvElementMetaInfo(this.element)+"\nmessage="+this.message;
};
ValidationError.prototype.equals = function(err) {
    if (!ValidationError.prototype.isPrototypeOf(err))
        return false;
    return (this.element.id == err.element.id && this.message == err.message);
};