
function installInuptDefaultListener(input){	
	
    function doDefaultKeyPress() {
		function append() {
			if (input.dataTable) {
			   if (input.dataTable.bof() || input.dataTable.eof()) input.dataTable.append();
		    }
		}
		
		if (input.charSet=="Float") {
			if (event.keyCode!=46 && (event.keyCode<48 || event.keyCode>57)) event.keyCode=0;
			else append();
		} else if (input.charSet=="Int") {
			if (event.keyCode<48 || event.keyCode>57) event.keyCode=0;
			else append();
		} else if (input.charSet=="Date")  {
			if (event.keyCode!=47 && event.keyCode!=32 && event.keyCode!=45 && event.keyCode!=58 && (event.keyCode<48 || event.keyCode>57)) event.keyCode=0;
			else append();
	    } else if (input.charCase=="UpperCase") {
			if (event.keyCode>=97 && event.keyCode<=122) event.keyCode=event.keyCode-32;
			append();
		} else if (input.charCase=="LowerCase") {
			if (event.keyCode>=65 && event.keyCode<=90) event.keyCode=event.keyCode+32;
			append();
		} else {
			append();
		}
	}

    function doDefaultFocus() {
		input.className=input.focusClass;
		if (input.charSet=="Float" || input.charSet=="Int") {
			input.style.textAlign="left";
		}
		showData();
	}
	
	function doDefaultBlur() {
		if (input.value=="" && input.nullAllowed=="false") {
			alert("Data can't be null");
			input.focus();
			return;
		}
		if (input.charSet=="Float" || input.charSet=="Int") {
		   if (!input.value || input.value=="") input.value="0";
		   try {
			   input.value=parseFloat(input.value).toString();
			   input.style.textAlign="right";
           }
           catch(exception){
			   alert(input.value+" is not valid "+input.charSet);
			   input.focus();
			   return;
           }
		} else if (input.charSet=="Date") {
		   if (input.value=="") {
			   input.className=input.normalClass;
			   if (input.dataTable) {
 			      input.dataTable.setCurrentValueByName(input.fieldName,"");
			   }
			   return;
		   }
		   var editFormat=input.editFormat;
		   if (editFormat=="" || editFormat==null) editFormat="YYYYMMDD";
		   var realValue=unFormatDateTimeStr(input.value,editFormat);
		   if (realValue=="") {
			  alert(input.value+" is not valid "+input.charSet+" of "+editFormat);
			  input.focus();
			  return;
		   }
		   input.realValue=realValue;
		}
		input.className=input.normalClass;
		if (input.dataTable) {
		   var value="";
		   if (input.charSet!="Date") {
		      value=input.value;
		   } else {
			  var storeFormat=input.storeFormat;
		      if (storeFormat=="" || storeFormat==null) storeFormat="YYYYMMDD";
			  value=formatDateTimeStr(input.realValue,storeFormat);
		   }
		   input.dataTable.setCurrentValueByName(input.fieldName,value);
		}
		showData();
	}
	
	input.attachEvent("onkeypress", doDefaultKeyPress);
	input.attachEvent("onfocus", doDefaultFocus);
	input.attachEvent("onblur", doDefaultBlur);
	
	input.setDataTable=function(dt) {
		if (input.dataTable==dt) return;
		if (input.dataTable) {
		   input.dataTable.removeAfterScrollListener(doDefaultAfterScroll);
		   input.dataTable.removePropertyChangeListener(doDefaultPropertyChange);
		}
		input.dataTable=dt;
		if (input.dataTable) {
		   input.dataTable.addAfterScrollListener(doDefaultAfterScroll);
		   input.dataTable.addPropertyChangeListener(doDefaultPropertyChange);
		   var field=input.dataTable.getFieldSet().getFieldByName(input.fieldName);
	       input.maxLength=field.getLength();
		   input.scale=field.getScale();
		}
		resetField(input.dataTable);
	}
	
	function doDefaultAfterScroll(e) {
		repaintDataTable(input.dataTable);
	}
	
	function doDefaultPropertyChange(e) {
		if (e.propertyName=="VALUE_CHANGE") {
			if (e.rowIndex==input.dataTable.getCurrentIndex()) {
			   repaintDataTable(input.dataTable);
			}
		} else if (e.propertyName=="ALL_CHANGE") {
			resetField(input.dataTable);
		}
	}
	
	function resetField(dt) {
		if (dt) {
		  var field=input.dataTable.getFieldSet().getFieldByName(input.fieldName);
          input.maxLength=field.getLength();
		  input.scale=field.getScale();
		   
		  if (field.getType()==1) {
			input.charSet="Int";
		    input.maxLength=2147483647;
		  } else if (field.getType()==2) {
			input.charSet="Float";
		    input.maxLength=2147483647;
		  } else if (input.charSet!="Date") input.charSet="Char";
		} else {
			input.maxLength=0;
			input.charSet="Char";
		}
		repaintDataTable(dt);
	}
	
	function repaintDataTable(dt) {
		if (!dt) {
		   input.value="";
		   return;
		}
        
		var value=dt.getCurrentValueByName(input.fieldName);
		if (value==null) {
		   input.value="";
		} else if (input.charSet=="Date") {
		   var storeFormat=input.storeFormat;
	       if (storeFormat=="" || storeFormat==null) storeFormat="YYYYMMDD";
		   input.realValue=unFormatDateTimeStr(value,storeFormat);
		   showData();
		} else {
		   input.value=value.toString();
		}
	}
	
	function isValidDateFormat(format) {
        format=format.toUpperCase();
        if (format!='YYYYMMDD' &&
            format!='YYYY/MM/DD' &&
			format!='YYYY/MM/DD HH:MM' &&
		    format!='MMDDYYYY' &&
     	    format!='MM/DD/YYYY' &&
	        format!='DDMMYYYY' &&
	        format!='DD/MM/YYYY' &&
            format!='DDMMYY' &&
            format!='DD/MM/YY' &&
            format!='MMDDYY' &&
            format!='MM/DD/YY' &&
            format!='HHMM' &&
            format!='HH:MM' && 
			format!='YYYY-MM-DD') return false;
        else return true;
	}
	
	function formatDateTimeStr(value,format) {
        var sDate;
		var sTime;
		var sYear;
		var sMonth;
		var sDay;
		var sHour;
		var sMinu;
        result="";
        sYear=value.substring(0,0+4);
        sMonth=value.substring(4,4+2);
        sDay=value.substring(6,6+2);
        sHour=value.substring(8,8+2);
        sMinu=value.substring(10,10+2);
		if (sYear=="    ") sYear="2005";
		if (sMonth=="  ") sMonth="1";
		if (sDay=="  ") sDay="1";
		if (sHour=="  ") sHour="00";
		if (sMinu=="  ") sMinu="00";
        if (isValidDateTime(sYear,sMonth,sDay,sHour,sMinu)==false) return result;

        format=format.toUpperCase();
        if (format=='YYYYMMDD') {
           result=sYear+sMonth+sDay;
		} else if (format=='YYYY/MM/DD') {
           result=sYear+'/'+sMonth+'/'+sDay;
		} else if (format=='YYYY/MM/DD HH:MM') {
           result=sYear+'/'+sMonth+'/'+sDay+" "+sHour+":"+sMinu;
		} else if (format=='MMDDYYYY') {
           result=sMonth+sDay+sYear;
		} else if (format=='MM/DD/YYYY') {
           result=sMonth+'/'+sDay+'/'+sYear;
		} else if (format=='DDMMYYYY') {
           result=sDay+sMonth+sYear;
		} else if (format=='DD/MM/YYYY') {
           result=sDay+'/'+sMonth+'/'+sYear;
		} else if (format=='DDMMYY') {
           result=sDay+sMonth+sYear.substring(2,2+2);
		} else if (format=='DD/MM/YY') {
           result=sDay+'/'+sMonth+'/'+sYear.substring(2,2+2);
		} else if (format=='MMDDYY') {
           result=sMonth+sDay+sYear.substring(2,2+2);
		} else if (format=='MM/DD/YY') {
           result=sMonth+'/'+sDay+'/'+sYear.substring(2,2+2);
		} else if (format=='HHMM') {
           result=sHour+sMinu;
		} else if (format=='HH:MM') {
           result=sHour+':'+sMinu;
		} else if (format=='YYYY-MM-DD') {
           result=sYear+'-'+sMonth+'-'+sDay;
		} else {
		}
        return result;
	}
	
	function isValidDateTime(sYear,sMonth,sDay,sHour,sMinu) {
		try {
           var d=new Date(sYear,sMonth-1,sDay,sHour,sMinu);
		   if (d.getYear()!=sYear || d.getMonth()!=sMonth-1 || d.getDate()!=sDay || d.getHours()!=sHour || d.getMinutes()!=sMinu) return false;
		   else return true;
		} catch(exception){
  		   return false;
		}
	}
	
	function unFormatDateTimeStr(value,format) {
        var sDate="";
		var sTime="";
        var sYear="";
		var sMonth="";
		var sDay="";
		var sHour="";
		var sMinu="";
        var iLen="";
        var sTemp="";
        result="";
        format=format.toUpperCase();
        iLen=value.length;
        if (format=='YYYYMMDD') {
           if (iLen!=8) return result;
           sDate=value;
		} else if (format=='YYYY/MM/DD') {
           if (iLen!=10) return result;
           sDate=value.substring(0,0+4)+value.substring(5,5+2)+value.substring(8,8+2);
		} else if (format=='YYYY/MM/DD HH:MM') {
		   if (iLen!=16) return result;
           sDate=value.substring(0,0+4)+value.substring(5,5+2)+value.substring(8,8+2)+" ";
		   sTime=value.substring(0,2)+value.substring(3,3+2);
		} else if (format=='MMDDYYYY') {
           if (iLen!=8) return result;
           sDate=value.substring(4,4+4)+value.substring(0,0+2)+value.substring(2,2+2);
		} else if (format=='MM/DD/YYYY') {
           if (iLen!=10) return result;
           sDate=value.substring(6,6+4)+value.substring(0,0+2)+value.substring(3,3+2);
		} else if (format=='DDMMYYYY') {
           if (iLen!=8) return result;
           sDate=value.substring(4,4+4)+value.substring(2,2+2)+value.substring(0,0+2);
		} else if (format=='DD/MM/YYYY') {
           if (iLen!=10) return result;
           sDate=value.substring(6,6+4)+value.substring(3,3+2)+value.substring(0,0+2);
		} else if (format=='DDMMYY') {
           if (iLen!=6) return result;
           sDate=new Date().getYear().substring(0,2)+value.substring(4,4+2)+value.substrign(2,2+2)+value.substring(0,0+2);
		} else if (format=='DD/MM/YY') {
           if (iLen!=8) return result;
           sTemp=new Date().getYear().substring(0,2);
           sDate=sTemp+value.substring(6,6+2)+value.substring(3,3+2)+value.substring(0,2);
		} else if (format=='MMDDYY') {
           if (iLen!=6) return result;
           sTemp=new Date().getYear().substring(0,2);
           sDate=sTemp+value.substring(4,4+2)+value.substring(0,2)+value.substring(2,2+2);
		} else if (format=='MM/DD/YY') {
           if (iLen!=8) return result;
           sTemp=new Date().getYear().substring(0,2);
           sDate=sTemp+value.substring(6,6+2)+value.substring(0,2)+value.substring(3,3+2);
		} else if (format=='HHMM') {
          if (iLen!=4) return result;
           sTime=value;
		} else if (format=='HH:MM') {
          if (iLen!=5 || value.substring(2,2+1)!=':') return result;
          sTime=value.substring(0,2)+value.substring(3,3+2);
		} else if (format=='YYYY-MM-DD') {
           if (iLen!=10) return result;
           sDate=value.substring(0,0+4)+value.substring(5,5+2)+value.substring(8,8+2);
		} else {
		}

        if (sDate=="") {
  		   var d=new Date();
		   sYear=d.getYear();
           sMonth=d.getMonth()+1;
           sDay=d.getDate();
		} else {
           sYear=sDate.substring(0,4);
           sMonth=sDate.substring(4,4+2);
           sDay=sDate.substring(6,6+2);
		}
        sHour=sTime.substring(0,2);
        sMinu=sTime.substring(2,2+2);
        if (isValidDateTime(sYear,sMonth,sDay,sHour,sMinu)==false) return result;

                              //12345678//
        if (sDate=='') result="        ";
        else result=sDate;              
        if (sTime=='') result=result+"    ";
        else result=result+sTime;
		return result;
	}

    function changeFormatDateTimeStr(value,fromFormat,toFormat) {
        var sTemp=unFormatDateTimeStr(value,fromFormat);
        if (sTemp=="") return sTemp;
        sTemp=formatDateTimeStr(sTemp,toFormat);
        return sTemp;
	}
	
	function showData() {
		if (input.charSet!="Date") return;
		var displayFormat=input.displayFormat;
		if (displayFormat=="" || displayFormat==null) displayFormat="YYYY/MM/DD";
		var editFormat=input.editFormat;
		if (editFormat=="" || editFormat==null) editFormat="YYYYMMDD";
		var value=input.realValue;
		if (input.dataTable) value=input.realValue;
		else {
		   var format;
		   if (document.activeElement==input) {
			  format=displayFormat;
		   } else {
			  format=editFormat;
		   }
			value=unFormatDateTimeStr(input.value,format);
			input.realValue=value;
		}
		if (value==null) {
			input.value="";
			return;
		}
		if (document.activeElement==input) {
			input.value=formatDateTimeStr(value,editFormat);
			input.select();
		} else {
			input.value=formatDateTimeStr(value,displayFormat);
		}
	}
}
