var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31;
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30;}
		if (i==2) {this[i] = 29;}
   } 
   return this;
}

//dtStr should be in the format mm/dd/yyyy
function isDate(dtStr){
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strMonth=dtStr.substring(0,pos1);
	var strDay=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1);
	
	if(dtStr == "") return true;
	
	strYr=strYear;
	if (strDay.charAt(0)=="0" && strDay.length > 1) strDay=strDay.substring(1);
	if (strMonth.charAt(0)=="0" && strMonth.length > 1) strMonth=strMonth.substring(1);
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length > 1) strYr=strYr.substring(1);
	}
	month=parseInt(strMonth);
	day=parseInt(strDay);
	year=parseInt(strYr);
	if (pos1==-1 || pos2==-1){
		alert("The date format should be mm/dd/yyyy");
		return false;
	}
	
	if (strMonth.length < 1 || month < 1 || month > 12){
		alert("Please enter a valid month");
		return false;
	}
	
	if (strDay.length < 1 || day < 1 || day > 31 || (month==2 && day > daysInFebruary(year)) || day > daysInMonth[month]){
		alert("Please enter a valid day");
		return false;
	}
	
	if (strYear.length != 4 || year==0 || year < minYear || year > maxYear){
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear);
		return false;
	}
	
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh)) == false){
		alert("Please enter a valid date");
		return false;
	}
    return true;
}

function LTrim(str){
    if(str==null){return null;}
    for(var i=0; str.charAt(i)== " "; i++);
    return str.substring(i,str.length);
}

function RTrim(str) {
    if(str==null) {return null;}
    for(var i=str.length-1; str.charAt(i)==" "; i--);
    return str.substring(0,i+1);
}
   
function Trim(str){return LTrim(RTrim(str));}

function LTrimAll(str){
    if(str==null){return str;}
    for(var i=0;str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t";i++);
    return str.substring(i,str.length);
}

function RTrimAll(str) {
    if(str==null) {return str;}
    for(var i=str.length-1; str.charAt(i)==" " || str.charAt(i)=="\n" || str.charAt(i)=="\t";i--);
    return str.substring(0,i+1);
}

function TrimAll(str){
    return LTrimAll(RTrimAll(str));
}


function isNull(val){
    return(val==null);
}

function isBlank(val) {
    if(val==null) {return true;}
    for(var i=0; i<val.length; i++) { 
        if((val.charAt(i)!=' ')&&(val.charAt(i)!="\t")&&(val.charAt(i)!="\n")&&(val.charAt(i)!="\r")) {
            return false;
        }
    }
    return true;
}

function isInteger(val){
   val = Trim(val);
   if(isBlank(val)){return false;}
   for(var i=0;i<val.length;i++){
      if(i==0 && val.charAt(i) == "-") continue;
      if(!isDigit(val.charAt(i))) {return false;}
   }
   return true;
}

function isNumeric(val){
   return(parseFloat(val,10)==(val*1));
}

function isArray(obj){
   return(typeof(obj.length)=="undefined") ? false : true;
}

function isDigit(num){
    if(num.length>1) {return false;}
    var string = "1234567890";
    if(string.indexOf(num)!=-1) {
        return true;
    }
    return false;
}

function setNullIfBlank(obj) {
     if(isBlank(obj.value)) {obj.value="";}
}

function setFieldsToUpperCase() {
    for(var i=0; i <arguments.length; i++) {
        arguments[i].value = arguments[i].value.toUpperCase();
    }
}

function disallowBlank(obj) {
    var msg = (arguments.length>1) ? arguments[1] : "";
    var dofocus = (arguments.length>2) ? arguments[2] : false;
    if(isBlank(getInputValue(obj))) {
        if(!isBlank(msg)) {alert(msg);}
        if(dofocus) {
            if(isArray(obj) &&(typeof(obj.type)=="undefined")) {obj=obj[0];}
            if(obj.type=="text"||obj.type=="textarea"||obj.type=="password") {obj.select();}
            obj.focus();
        }
        return true;
    }
    return false;
}

function disallowModify(obj) {
    var msg=(arguments.length > 1) ? arguments[1] : "";
    var dofocus=(arguments.length > 2) ? arguments[2] : false;
    
    if(getInputValue(obj)!=getInputDefaultValue(obj)) {
        if(!isBlank(msg)){alert(msg);}
        if(dofocus) {
            if(isArray(obj) &&(typeof(obj.type)=="undefined")) {
                obj=obj[0];
            }
            if(obj.type=="text"||obj.type=="textarea"||obj.type=="password") {
                obj.select();
            }
            obj.focus();
        }
        setInputValue(obj,getInputDefaultValue(obj));
        return true;
    }
    return false;
}

function commifyArray(obj,delimiter) {
    if(typeof(delimiter)=="undefined" || delimiter==null) {
        delimiter = ",";
    }
    var s="";
    if(obj==null||obj.length<=0) {return s;}
    for(var i=0;i<obj.length;i++) {
        s= s+((s=="")?"":delimiter)+obj[i].toString();
    }
    return s;
}


function getSingleInputValue(obj,use_default,delimiter){
    switch(obj.type) {
        case 'radio': 
        case 'checkbox': return(((use_default)?obj.defaultChecked:obj.checked)?obj.value:null);
        case 'text': 
        case 'hidden': 
        case 'textarea': return(use_default)?obj.defaultValue:obj.value;
        case 'password': return((use_default)?null:obj.value);
        case 'select-one':
                  if(obj.options==null) {return null;}
                  if(use_default) {
                      var o=obj.options;
                      for(var i=0;i<o.length;i++) {
                          if(o[i].defaultSelected) {return o[i].value;}
                      }
                      return o[0].value;
                  }
                  if(obj.selectedIndex < 0) {return null;}
                  return  (obj.options.length > 0)? obj.options[obj.selectedIndex].value : null;
        case 'select-multiple':
            if(obj.options==null){return null;}
            var values=new Array();
            for(var i=0;i<obj.options.length;i++) {
               if((use_default&&obj.options[i].defaultSelected)||(!use_default&&obj.options[i].selected)) {
                   values[values.length]=obj.options[i].value;
               }
            }
            return (values.length==0) ? null : commifyArray(values,delimiter);
    }
    alert("FATAL ERROR: Field type " + obj.type + " is not supported for this function");
    return null;
}

function getSingleInputText(obj,use_default,delimiter){
    switch(obj.type) { 
        case 'radio': 
        case 'checkbox': 	return "";
        case 'text': 
        case 'hidden': 
        case 'textarea': return  (use_default) ? obj.defaultValue : obj.value;
        case 'password': return ((use_default) ? null : obj.value);
        case 'select-one':
            if(obj.options==null) { return null;}
            if(use_default) {
               var o=obj.options;
               for(var i=0;i<o.length;i++) {
                  if(o[i].defaultSelected) {return o[i].text;}
               }
               return o[0].text;
            }
            if(obj.selectedIndex < 0) {return null;}
            return (obj.options.length > 0) ? obj.options[obj.selectedIndex].text : null;
        case 'select-multiple':
            if(obj.options==null) {return null;}
            var values = new Array();
            for(var i=0; i < obj.options.length; i++) {
               if((use_default&&obj.options[i].defaultSelected)||(!use_default&&obj.options[i].selected)) {
                  values[values.length]=obj.options[i].text;
               }
            }
            return (values.length==0) ? null : commifyArray(values,delimiter);
    }
    alert("FATAL ERROR: Field type " + obj.type + " is not supported for this function");
    return null;
}

function setSingleInputValue(obj,value) { 
    switch(obj.type) {
        case 'radio': 
        case 'checkbox': 
            if(obj.value==value) {
                obj.checked=true;
                return true;
            } else { 
                obj.checked = false;
                return false;
            }
        case 'text': 
        case 'hidden': 
        case 'textarea': 
        case 'password': 
            obj.value=value;
            return true;
        case 'select-one': 
        case 'select-multiple':
            var o=obj.options;
            for(var i=0;i<o.length;i++) {
                if(o[i].value==value){
                    o[i].selected=true;
                } else {
                    o[i].selected=false;
                }
            }
            return true;
    }
    alert("FATAL ERROR: Field type " + obj.type + " is not supported for this function");
    return false;
}

function getInputValue(obj,delimiter) {
    var use_default = (arguments.length > 2) ? arguments[2] : false;
    if(isArray(obj) &&(typeof(obj.type)=="undefined")) {
        var values=new Array();
        for(var i=0;i<obj.length;i++) {
            var v = getSingleInputValue(obj[i],use_default,delimiter);
            if(v != null) {values[values.length]=v;}
        }
        return commifyArray(values,delimiter);
    }
    return getSingleInputValue(obj,use_default,delimiter);
}

function getInputText(obj,delimiter) {
    var use_default=(arguments.length > 2) ? arguments[2] : false;
    if(isArray(obj) &&(typeof(obj.type)=="undefined")) {
        var values=new Array();
        for(var i=0;i<obj.length;i++) {
            var v=getSingleInputText(obj[i],use_default,delimiter);
            if(v != null) {values[values.length]=v;}
        }
        return commifyArray(values,delimiter);
    }
    return getSingleInputText(obj,use_default,delimiter);
}

function getInputDefaultValue(obj,delimiter) {
    return getInputValue(obj,delimiter,true);
}

function isChanged(obj) {
    return(getInputValue(obj)!=getInputDefaultValue(obj));
}

function setInputValue(obj,value) {
    var use_default = (arguments.length > 1) ? arguments[1] : false;
    if(isArray(obj)&&(typeof(obj.type)=="undefined")) {
        for(var i=0;i<obj.length;i++) {
            setSingleInputValue(obj[i],value);
        }
    } else { 
        setSingleInputValue(obj,value);
    }
}


function isFormModified(theform,hidden_fields,ignore_fields) {
    if(hidden_fields == null) {hidden_fields="";}
    if(ignore_fields == null){ignore_fields="";}
    var hiddenFields=new Object();
    var ignoreFields=new Object();
    var i,field;
    var hidden_fields_array = hidden_fields.split(',');
    
    for(i=0; i <hidden_fields_array.length; i++) {
       hiddenFields[Trim(hidden_fields_array[i])]=true;
    }
    var ignore_fields_array = ignore_fields.split(',');
    for(i=0; i <ignore_fields_array.length; i++) {
       ignoreFields[Trim(ignore_fields_array[i])]=true;
    }
    for(i=0; i <theform.elements.length; i++) {
        var changed=false;
        var name=theform.elements[i].name;
        if(!isBlank(name)) {
            var type=theform[name].type;
            if(!ignoreFields[name]) {
                if(type=="hidden"&&hiddenFields[name]) { 
                    changed=isChanged(theform[name]);
                } else if(type=="hidden") {
                    changed=false;
                } else {
                    changed=isChanged(theform[name]);
                }
            }
        }
        if(changed) {return true;}
    }
    return false;
}



