
/**
 * 发布日期：2002/12/04
 * 
 * 归档整理：田野
 *
 * 内容归纳：
 *     一、全局变量设置
 *     二、键盘函数：
 *              2.1  function f_keyenter(str1)
 *				2.2  function chkInput(obj)
 *			    2.3  function chkInputDown()
 *	   三、鼠标当前行变色函数:
 *              3.1  function MoveOn(res)
 *              3.2  function MoveOut(res)
 *     四、字符串处理函数
 *				4.1  function checkSpace(str)
 *				4.2  function parseString(str)
 *				4.3  function absLength(str) 
 *			    4.4	 function chkLen(strArg,note)
 *				4.5  function URLEncode(myStr)
 *	   五、数字处理函数	
 *			    5.1  function chkPlus(strArg)
 *				5.2  function chkNegative(strArg)
 *				5.3  function chkDecNegative(strArg,len)
 *				5.4  function chkDecPlus(strArg,len)
 *				5.5  function addComma(myStr,len)	
 *				5.6  function round(myStr,len)
 *		六、其它函数
 *				6.1	 function winOpen(hrefStr,winName,width,height)
 */
 
 
 
/**
 * 类型一、全局变量设置
 */

//保存背景色，用在类型三中的鼠标当前行变色函数MoveOn和MoveOut函数中
var bgColor;

//敲击Esc键次数,用在类型二键盘函数中的f_keyenter函数
var key_Count = 0;

//用在类型二键盘函数中的f_keyenter函数
var key_Esc = "false";


/**
 * 类型二、键盘函数
 */



/**
 * 2.1
 * 函数功能：   转换Tab为Enter，屏蔽Esc的重置功能
 * 参数说明：      
		   1、转换Enter键为Tab键
		   2、使连击Esc键的重置功能失效
		   3、转换Space键为Enter键
		   4、对所有键都不起作用
4个参数可配合使用，以实现不同的需求，以下是几个常见使用方法
 * 使用方法1
 * 对窗体中可维护的控件(包括条件选择控件和数据维护控件)，设置tabindex属性，该属性设定光标行走的顺序。
 * 使用举例：//按下Enter键时，光标按t1、t2、t3、t4的顺序行走,光标到t4时，再按Enter键不起作用。
 * <% int tab_no = 1;%>
 * <input type="text" name="t1" tabindex = "<%=tab_no++%>" onkeydown="javascript:return f_keyenter('Y','N','N','N')"> 
 * <input type="text" name="t2" tabindex = "<%=tab_no++%>" onkeydown="javascript:return f_keyenter('Y','N','N','N')">
 * <input type="text" name="t3" tabindex = "<%=tab_no++%>" onkeydown="javascript:return f_keyenter('Y','N','N','N')">
 * <input type="text" name="t4" tabindex = "<%=tab_no++%>" onkeydown="javascript:return f_keyenter('N','N','N','Y')"> 
 *
 * 使用方法2
 * 当光标在"删除"操作符上时，按Enter或Tab都不起作用，只能用鼠标去点击
 * <a href="javascript:f_add()" tabindex="-1" onkeydown="javascript:return f_keyenter('N','N','N','Y')">
 *    <img border="0" src="/com/rsc/rs/pub/images/add.gif" width="16" height="16" alt="删除" >
 * </a>
 *
 * 使用方法3
 * 按Space键弹出选择窗体,按下Enter键光标移动到下一个位置
 * <a href="javascript:selectWarehouse()" tabindex="-1" onkeydown="javascript:return f_keyenter('Y','N','Y','N')">
 *     <img border="0" src="/com/rsc/rs/pub/images/view.gif" width="16" height="16" alt="查找" >
 * </a>
 *
 * 使用方法4
 * 屏蔽连续两次esc键的重置功能，按下Enter键光标移动到下一个位置
 * <input type="text" name="t1" tabindex = "<%=tab_no++%>" onkeydown="javascript:return f_keyenter('Y','Y','N','N')"> 

 * 返 回 值：  true或false
 *			   true： 输入字符有效
 *             false：输入字符无效
 */
function f_keyenter(enter_key,esc_key,space_key,all_key,eve)
{

  //alert("ddd")
  var array_key_code = "18^33^34^35^36^37^38^39^40^45^46^114^121^122";

  //对所有键都不起作用，可用于屏蔽属性为readonly的控件，任何键对其都不起作用
  if (all_key == "Y")
     return false

  //当enter_key为"Y"时，转换Enter键为Tab键
  if (enter_key=="Y")
  {
     if (event.keyCode == 13)
        event.keyCode = 9
  }

  //当enter_key为"Y"时，转换Space键为Enter键
  if (space_key=="Y")
  {
     if (event.keyCode == 32)
     {
        event.keyCode = 13
         //window.event.button=1
        if(eve!=null)
	        if(checkSpace(eve))
	        	eval(eve)
     }
  }

  //当esc_key为"Y"时，使连击Esc键的重置功能失效，单击Esc键时重置本控件的内容
  if (esc_key=="Y")
  {
    if (event.keyCode == 27)
    {
       key_Count = key_Count + 1;
       if ((key_Count > 1) && (key_Esc == "true"))
       {
         return false;
       }
       key_Esc = "true";
    }else
    {
      if ((array_key_code.indexOf(event.keyCode.toString()) < 0) || (event.keyCode == 54))
      {
        key_Count = 0;
        key_Esc = "false";
      }else
      {
        return true
      }
    }
    return true
  }
}

/**
  *2.2
  * 函数功能：	判断输入的字符是否合法。
  * 参数说明：  判断输入是否合法的input组件的值
  * 使用举例：  <input type="text" name="test" maxlength="8" onkeypress="return chkInput(this.value)" >
  * 返 回 值：  true或false
  *				true： 输入字符有效
  *             false：输入字符无效
  */
function chkInput(obj)
{
  var charCode=event.keyCode
  if(obj.length==0&&charCode==32)
    return false
  if(charCode==34)//如果输入的符号是分号(;)
    return false
  if(charCode==59)//如果输入的符号是双引号(")
    return false
  if(charCode==44)//如果输入的符号是逗号(,)
    return false
  if(charCode==39)//如果输入的符号是单引号(')
    return false
  return true

}
 /**
   * 2.3
   * 函数功能：	判断输入的字符是否合法。
   * 使用举例：	<input type="text" name="test" maxlength="8" onkeydown="return chkInputDown()" >
   * 说    明： 这个函数和chkInput函数的区别是：
   * 			这个函数用在onkeydown事件里
   * 			chkInput函数用在onkeypress事件里
   * 返 回 值：  true或false
   *			 true： 输入字符有效
   *             false：输入字符无效
   */
function chkInputDown()
{
  var charCode=event.keyCode
  if(charCode==186)//如果输入的符号是分号(;)
    return false
  if(charCode==16)//如果输入的符号是双引号(")
    return false
  if(charCode==188)//如果输入的符号是逗号(,)
    return false
  if(charCode==222)//如果输入的符号是单引号(')
    return false
  return true

}



/**
 * 类型三：鼠标当前行变色函数
 */



/**
  * 3.1
  * 函数功能：	鼠标移到当前行，鼠标形状变为手形、当前行变色，提示用户当前行为点中行。
  * 参数说明：  鼠标移到的当前行
  * 使用举例：  <tr onMouseOver="MoveOn(this);" onMouseOut="MoveOut(this);">
  * 返 回 值：  无返值
  */
function MoveOn(res)//鼠标移到当前行;原函数名称：MouseOn
 {
 if(!res.contains(event.fromElement))
  {
    bgColor = res.style.backgroundColor;
    res.style.cursor="hand";

    res.style.backgroundColor="#CBDDED";
    for(var i=0;i<res.childNodes.length;i++)
	   {
		   	if(res.childNodes[i].nodeName=="TD")
		   	{
		   		var column=res.childNodes[i]
		   		for(var j=0;j<column.childNodes.length;j++)
		   		{
			   		if(column.childNodes[j].tagName=="INPUT")
			   		{
			   			var input1=column.childNodes[j]
			   		    input1.style.backgroundColor="#CBDDED"
			   		}
		   		} 
		   	}
	   	}
		
  }
}


/**
  * 3.2
  * 函数功能：	鼠标离开当前行时，鼠标形状和当前行颜色还原为初始状态。
  * 参数说明：  鼠标移出的当前行 <script language="javascript" src="../js/RsScript.js"></script>
  * 使用举例：  <tr onMouseOver="MoveOn(this);" onMouseOut="MoveOut(this);">
  * 返 回 值：  无返值
  */
function MoveOut(res)
{
    res.style.cursor="Default";
    res.style.backgroundColor=bgColor;
    for(var i=0;i<res.childNodes.length;i++)
	{
		 if(res.childNodes[i].nodeName=="TD")
		 {
		   	var column=res.childNodes[i]
		   	for(var j=0;j<column.childNodes.length;j++)
		   	{
			   	if(column.childNodes[j].tagName=="INPUT")
			   	{
			   		var input1=column.childNodes[j]
			   		input1.style.backgroundColor=bgColor
			   		if(input1.style.backgroundColor=="#CBDDED")
    					res.style.backgroundColor=bgColor;
			   	}
		   	}
	   	}
	}
}



/**
 * 类型四：字符串处理函数
 */
 
 
 
/**
  * 4.1
  * 函数功能：	验证输入的字符串是否为空
  * 参数说明：  需要进行验证的字符串
  * 返 回 值：  true或false
  *			    true： 输入的字符串不为空
  *             false：输入的字符串为空
  */
function checkSpace(str)
{
  i=parseInt(str.length)
  var j=0
  var temp=""
  for(var m=0;m<i;m++)
  {
    m=parseInt(m)
    temp=str.substring(m,m+1)
    if(temp!=" ")
    {
      j="1"
    }
  }
  if(j=="1")
  {
    return true

  }
  else
  {
    return false

  }
}


/**
  * 4.2
  * 函数功能：	将带有逗号分隔符的字符串格式转为不带逗号分隔符的字符串。
  * 参数说明：  需要进行转换的字符串
  * 返 回 值：  转换后不带逗号的字符串
  */
function  parseString(str)
 {
    if(str=="")
      return "";
    var loop=0;
    ary=new Array(10)
    for(var i=0;i<str.length;i++)
    {
      if(i+1<=str.length)
      {
          var temp=str.substring(i,i+1);
          if(temp==",")
          {
              ary[loop]=i;
              loop++;

          }
      }
    }
    var pos=0;
    var pos1=0;
    var str1="";
    for(var i=0;i<loop;i++)
    {
	   pos1=ary[i];
       str1+=str.substring(pos,pos1);
       pos=ary[i]+1;
    }
    str1+=str.substring(pos,str.length);
    return str1;
}

  /**
   * 4.3
   * 函数功能：	获得字符串的绝对长度。本函数将汉字作为两个字符，其返回的值可用于匹配数据库的字段长度
   * 参数说明： str 要判断的字符串
   * 返 回 值： 字符串的绝对长度
   */
  function absLength(str) {

      var len=0;
      if(str!=null) {
         var c;
         var l = str.length;
         for(var i=0;i<l;i++) {
             c = str.charAt(i)
             len+= (c>="　") ? 2 : 1;
         }
      }
     return len
  }

  /**
   * 4.4
   * 函数功能：	判断输入的字符是否超长。
   * 参数说明： 
   *            strArg:需要判断字符长度，类型为text的组件
   *            note:中英文标识
   * 使用举例:  <input type="text" name="test" maxlength="8" onblur="checkLength(this,'en')" >
   * 说    明:  input 组件的maxlength必须要设置，否则程序执行不正确
   */
function chkLen(strArg,note)
{
  try{
    var  lanFlag=note
    var note1="输入的字符长度超过允许输入的最大长度!"
    var note2="The length of input field more than the maxlength!"
    var note3=""
    note3=lanFlag=="en"?note2:note1
    var str=strArg.value
    var length=strArg.maxLength
    if(absLength(str)>length)
    {
        alert(note3)
        strArg.focus()
        strArg.select()
        return false
    }
    return true
}
  catch(e)
  {

  }
}

  /**
   * 4.5
   * 函数功能：  将“特殊字符”转换成IE能够识别的符号
   * 参数说明：
   *             myStr: 字符串（含有或不含有特殊字符）
   * 返 回 值：  转换后的字符串
   */
function URLEncode(myStr)
{
    var translateChar = new Array("%25","%2F","%3F","%3A","%3B",
                                  "%26","%40","%3D","%23","%3E",
                                  "%3C","%7B","%7D","%5B","%5D",
                                  "%60","%27","%5E","%7E","%7C",
                                  "%21","%24","%28","%29","%2B")
    var newStr=""
    for(var i=0;i<myStr.length;i++)
    {
        if(charAt(myStr.charAt(i))<0)
          newStr+=myStr.charAt(i)
        else
          newStr+=translateChar[charAt(myStr.charAt(i))]
    }
    return newStr
}

function charAt(str)
{
  var especialChar = new Array(  "%",  "/",  "?",  ":",  ";",
                                 "&",  "@",  "=",  "#",  ">",
                                 "<",  "{",  "}",  "[",  "]",
                                 "`",  "'",  "^",  "~",  "|",
                                 "!",  "$",  "(",  ")",  "+")
  for(var i=0;i<especialChar.length;i++)
  {
    if(str==especialChar[i])
     return i;
  }
  return -1;
}


/**
 * 类型五：数字处理函数
 */


/**
  * 5.1
  * 函数功能：	验证输入的字符类型是否为正整数
  * 参数说明：  需要进行判断的组件域
  * 返 回 值：  true或false
  *			    true： 输入的字符串是正整数
  *             false：输入的字符串不是正整数
  * 使用说明：  <input type="text"　name="plus" onblur="chkPlus(this)">
  */

function chkPlus(strArg)
{

  var str=parseString(strArg.value)
  for (var i=0; i < str.length; i++)
  {
        var ch=str.charAt(i);
        if (ch <'0' || ch>'9')
      {
          alert("请输入整数!")
          strArg.focus()
          strArg.select()
          return false
      }
  }
   return true
}


/**
  * 5.2
  * 函数功能：	验证输入的字符类型是否为整数
  * 参数说明：  需要进行判断的组件域
  * 返 回 值：  true或false
  *			    true： 输入的字符串是整数
  *             false：输入的字符串不是整数
  * 使用说明：  <input type="text"　name="plus" onblur="chkNegative(this)">
  */
function chkNegative(strArg)
{
  var str=parseString(strArg.value)
  for (var i=0; i < str.length; i++)
  {
        var ch=str.charAt(i);
        if ((ch <'0' || ch>'9')&&ch!='-')
      {
          alert("请输入整数!")
          strArg.focus()
          strArg.select()
          return false
      }
  }
  return true
}


/**
  * 5.3
  * 函数功能：	验证输入的字符类型是否为数字
  * 参数说明：  需要进行判断的组件域
  * 返 回 值：  true或false
  *			    true： 输入的字符串是数字
  *             false：输入的字符串不是数字
  * 使用举例：  <input type="text"　name="plus" onblur="chkDecNegative(this)">
  */
function chkDecNegative(strArg,len)
{
  var count=0
  var pointLocat=strArg.value.indexOf(".")//判断小数点后的位数长度
  var numberValue=parseString(strArg.value)
  for (var i=0;i<numberValue.length;i++)
  {
        var ch=numberValue.charAt(i);
       if(i==0)
      {
        if ((ch<'0'||ch>'9')&&ch!='-'&&ch!='.')
        {
            alert("请输入数字!")
            strArg.focus()
            strArg.select()
            return false
        }
      }
      else
      {
        if(ch=='.')
          count++
        if(count>1)
        {
           alert("请输入数字!") 	
          strArg.focus()
          strArg.select()
          return false
         }
        if ((ch<'0'||ch>'9')&&(ch!='.'))
        {
             alert("请输入数字!")
             strArg.focus()
             strArg.select()
             return false
        }
      }
  }
  strArg.value=addComma(strArg.value,len)
  return true
}

/**
  * 5.4
  * 函数功能：	验证输入的字符类型是否为正数
  * 参数说明：  需要进行判断的组件域
  * 返 回 值：  true或false
  *			    true： 输入的字符串是正数
  *             false：输入的字符串不是正数
  * 使用举例：  <input type="text"　name="plus" onblur="chkDecPlus(this)">
  */
function chkDecPlus(strArg,len)
{
  var count=0
  var numberValue=parseString(strArg.value)
  var pointLocat=numberValue.indexOf(".")//判断小数点后的位数长度
  for (var i=0; i < numberValue.length; i++)
  {
      var ch=numberValue.charAt(i);
      if(i==0)
      {
      		if (((ch <'0' || ch>'9')||ch==',')&&(ch!='.'))
        	{
            	alert("请输入正数")
            	strArg.focus()
            	strArg.select()
            	return false
        	}
      }
      else
      {    
	        if(ch=='.'&&ch!=',')
	          count++
	        if(count>1)
	        {
	          alert("请输入正数")
	          strArg.focus()
	          strArg.select()
	          return false
	        }
	        if (((ch <'0' || ch>'9')||ch==',')&&(ch!='.'))
	        {
	            alert("请输入正数")
	            strArg.focus()
	            strArg.select()
	            return false

		   }
      }
  }
 //strArg.value=addComma(strArg.value,len)
 strArg.value=parseString(strArg.value)
 return true
}


/**
 * 5.5
 * 函数功能：	加逗号分隔符，并补零、四舍五入
 * 使用背景：   对于数量、单价、金额类文本，要加逗号分隔符
 * 参数说明：   
 *              myStr:  字符串
 *              len  :  需要保留的小数位数
 * 返 回 值：   加逗号后的字符串
 */
function addComma(myStr,len)
{
    //如果myStr为空，则返回该字符串
    if (!checkSpace(myStr))
    {
        return myStr
    }

    //去掉逗号分隔符
    myStr = parseString(myStr)

    //在myStr中查找小数点"."，记录下位置
    var position = myStr.indexOf(".")

    //如果第一位是小数点，则第一位补0
    if (position==0)
    {
        myStr = "0" + myStr
    }

    //四舍五入
    myStr = round(myStr,len)

    //重新取小数点位置
    position = myStr.indexOf(".")

    //如果无小数点，则认为字符串长度为小数点位置
    if (position==-1)
    {
        position = myStr.length
    }

    //如果小数点位置大于3则执行循环
    while (position>3)
    {
        myStr = myStr.substring(0,position-3) + "," + myStr.substring(position-3,myStr.length)
        position-= 3
    }

    return myStr
}


/**
 * 5.6
 * 函数功能：	四舍五入，如果小数点后位数不够则以0补位
 * 参数说明：   
 *              myStr:  字符串
 *              len  :  需要保留的小数位数 
 * 返 回 值：   四舍五入后的字符串
 */
function round(myStr,len)
{
    //如果myStr为空，则返回该字符串
    if (!checkSpace(myStr))
    {
        return myStr
    }

    //四舍五入
    var tmp1 = myStr * Math.pow(10,len)
    var tmp2 = Math.round(tmp1)
    var tmp3 = tmp2 / Math.pow(10,len)

    //补位
    var tmp4 = tmp3.toString()
    if (parseInt(len)<=0)
    {
        return tmp4
    }
    else
    {
        //取小数点位置
        var position = tmp4.indexOf(".")
        //如果无小数点
        if (position==-1)
        {
            tmp4+= ".";

            for (var i=0;i<parseInt(len);i++)
            {
                tmp4+= "0"
            }
            return tmp4
        }
        else
        {
            var count = parseInt(len) - (tmp4.length - (position + 1))

            for (var j=0;j<count;j++)
            {
                tmp4+= "0"
            }
            return tmp4
        }
    }
}  



/**
 * 类型六：其它函数
 */
/**
  * 6.1
  * 函数功能：	以无状态方式打开新窗口
  * 参数说明：  
  *             hrefStr： 窗口的请求地址
  *             winName： 窗口名称
  *             width  ： 窗口的宽度
  *             height ： 窗口高度
  * 返 回 值：  无返值
  */
  function winOpen(hrefStr,winName,width,height)  {
    window.open(hrefStr,winName,
      "location=no scrollbars=yes menubar=no status=no resizable=no width="+width+" height="+height+" left=0 top=60");

  }




