/*
 * @author internet3 insa2 huawei
 */

/**
 * 创建一个日期输入框。除名称外其他参数均可选。
 * @param name         日期输入框在页面from中的参数名。
 * @param defaultValue 初始值。缺省为当前时间。可以是Date对象也可以是字符串，如果是字符串注意必须和format指定的格式匹配，否则解析可能出错。
 * @param format       日期格式。缺省为：yyyy-MM-dd HH:mm:ss。格式描述符的含义与java.text.SimpleDateFormat定义相同。
 *                     目前支持：yyyy、MM、dd、HH、mm、ss
 * @param editable     是否可编辑。缺省为true
 * @param other        其他参数，加到<input>标签里面。例如可以指定一些事件响应函数。
 *
 */
function pickTime(name,defaultValue,format,editable,other)
{
  if (defaultValue==null)
  {
    defaultValue = new Date();
  }
  if (format==null)
  {
    format = "yyyy-MM-dd HH:mm:ss"
  }
  if (editable==null)
  {
    editable = false;
  }
  if (other==null)
  {
    other="";
  }
  var d;
  if (defaultValue instanceof Date)
  {
    d=defaultValue;
  }
  else
  {
    d=string2Time(defaultValue,format);
  }
  str = time2String(d,format);
  //document.write("<input type=text runat='server' maxlength=20 size=16 id="+name+" value='"+str+"'><input type=button value='...' onclick='onPickTimeClick("+name+",\""+format+"\")'>");
  return str;
  //document.form1.Date.value=str;
}

/**
 * 将Date类型的时间对象按照指定格式生成字符串。
 * @param time Date类型的时间对象。
 * @param format 字符串格式，含义与pickTime()相同。
 * @return 时间字符串。
 */
function time2String(time,format)
{
  if (time==null) return "";
  var yyyy="" + time.getFullYear();
  var MM=fixLength(time.getMonth()+1,2);
  var dd=fixLength(time.getDate(),2);
  var HH=fixLength(time.getHours(),2);
  var mm=fixLength(time.getMinutes(),2);
  var ss=fixLength(time.getSeconds(),2);
  //var S=fixLength(time.getMilliseconds(),3);
  return format.replace("yyyy",yyyy).replace("MM",MM).replace("dd",dd)
         .replace("HH",HH).replace("mm",mm).replace("ss",ss);
}

/**
 * 将字符串按指定的格式来解析成Date类型的对象。如果解析不出来则返回当前时间
 * @param timeString 时间字符串。
 * @param format 格式。
 * @return Date对象。
 */
function string2Time(timeString,format)
{
  var regexp = format;
  regexp = regexp.replace(/\\/g,"\\\\");
  regexp = regexp.replace(/\^/g,"\\^");
  regexp = regexp.replace(/\$/g,"\\$");
  regexp = regexp.replace(/\(/g,"\\(");
  regexp = regexp.replace(/\)/g,"\\)");
  regexp = regexp.replace(/\*/g,"\\*");
  regexp = regexp.replace(/\+/g,"\\+");
  regexp = regexp.replace("yyyy","\\d{4}");
  regexp = regexp.replace("MM","\\d{1,2}");
  regexp = regexp.replace("dd","\\d{1,2}");
  regexp = regexp.replace("HH","\\d{1,2}");
  regexp = regexp.replace("mm","\\d{1,2}");
  regexp = regexp.replace("ss","\\d{1,2}");
  regexp = "^" + regexp + "$";
  if (timeString.match(regexp)==null) return null;
  timeString = "***" + timeString + "******************************";
  format     = "***" + format + "*yyyy-MM-dd HH:mm:ss";
  var yyyy = format.indexOf("yyyy");
  var MM = format.indexOf("MM");
  var dd = format.indexOf("dd");
  var HH = format.indexOf("HH");
  var mm = format.indexOf("mm");
  var ss = format.indexOf("ss");

  if(!isDigital(timeString.substring(yyyy,yyyy+4)))
     while (isDigital(timeString.charAt(yyyy-1)))
     {
       yyyy--;
       if (MM>yyyy) MM--;
       if (dd>yyyy) dd--;
     }
  if(!isDigital(timeString.substring(MM,MM+2)))
     while (isDigital(timeString.charAt(MM-1)))
     {
       MM--;
       if (dd>MM) dd--;
     }
  if(!isDigital(timeString.substring(dd,dd+2)))
     while (isDigital(timeString.charAt(dd-1)))
     {
       dd--;
     }
  if(!isDigital(timeString.substring(HH,HH+2)))
     while (isDigital(timeString.charAt(HH-1)))
     {
       HH--;
     }
  if(!isDigital(timeString.substring(mm,mm+2)))
     while (isDigital(timeString.charAt(mm-1)))
     {
       mm--;
     }
  if(!isDigital(timeString.substring(ss,ss+2)))
     while (isDigital(timeString.charAt(ss-1)))
     {
       ss--;
     }
  var time = new Date();
  if (yyyy>=0) yyyy = parseInt(timeString.substring(yyyy,yyyy+4),10);
  if (MM>=0) MM = parseInt(timeString.substring(MM,MM+2),10)-1;
  if (dd>=0) dd = parseInt(timeString.substring(dd,dd+2),10);
  if (HH>=0) HH = parseInt(timeString.substring(HH,HH+2),10);
  if (mm>=0) mm = parseInt(timeString.substring(mm,mm+2),10);
  if (ss>=0) ss = parseInt(timeString.substring(ss,ss+2),10);
  if (!isNaN(yyyy)) time.setYear(yyyy);
  if (!isNaN(MM)) time.setMonth(MM);
  if (!isNaN(dd)) time.setDate(dd);
  if (!isNaN(HH)) time.setHours(HH);
  if (!isNaN(mm)) time.setMinutes(mm);
  if (!isNaN(ss)) time.setSeconds(ss);
  return time;
}

/**
 * 弹出日期/时间选择对话框，点确认后返回输入日期/时间的Date对象。如果点取消则返回null。
 * @param defaultValue 缺省值
 * @param format 日期格式
 * @return 选择的日期Date对象，如果点取消则返回null。
 */
function getTime(defaultValue,format)
{
  var d;
  if (defaultValue==null || defaultValue=="") d=new Date();
  else d=string2Time(defaultValue,format);
  if (d==null) d= new Date();
  var h="212";
  if(navigator.appVersion.indexOf("MSIE 4")>=0 ||navigator.appVersion.indexOf("MSIE 3")>=0)
    h="238";
  var notime = null;
  var args = new Array();
  args[0]=d.getTime();
  args[1]=format;
  return window.showModalDialog("picktime.html",args,"dialogWidth: 215px; dialogHeight: "+h+"px; resizable: 1; scroll: 0; help: 0; status: 0;");
}
/**
 * 弹出日期/时间选择对话框，点确认后返回输入日期/时间的Date对象。如果点取消则返回null。
 * @param defaultValue 缺省值
 * @param format 日期格式
 * @return 选择的日期字符串，如果点取消则返回""。
 */
function getStringTime(defaultValue,format)
{
  return time2String(getTime(defaultValue,format),format);
}

function fixLength(d,length)
{
  var ret = ""+d;
  while(ret.length<length)
    ret = "0" + ret;
  return ret;
}

function byteLength(str)
{
  var len=0;
  var i;
  for (i=0;i<str.length;i++)
  {
    if (str.charAt(i)>'\xff') len+=2;
    else len++;
  }
  return len;
}

function isDigital(str)
{
  var i;
  for(i=0;i<str.length;i++)
    if (str.charAt(i)<'0'|| str.charAt(i)>'9') return false;
  return true;
}
function onPickTimeClick(textfield,format)
{	
	  if (format==null)
  {
    format = "yyyy-MM-dd"
  }
  textfield = time2String(string2Time(textfield,format),format);
  var ret = getStringTime(textfield,format);
  if (ret!=null && ret!="")
    textfield = ret;
  return textfield;
}
