﻿/**
* ess_string.js V2.1
* 此脚本实现了一组字符串对象操作方法和全局函数
*
* Filename：String.js
*
* Copyright：Copyright (c) 2005-2006
* Company：EveryWhere.com.cn，AMoy
* author：Contion Chou
* required：IE4+,Firefox1.5+
* modified：2008年10月15日 15:00:00
*
*
* 增加方法：trim()
			trimHtml()
			byteLen()
			byteLen2()
			toFixed(iLen, sFixChar, bLeft)
			format(strSeparater)
			passwd(intPwdBit, intType)
			SQLEncode()
			XMLEncode()
			testSqlInput()
			numSbc2Dbc()
* 全局函数：isEmpty(strCompare)
*/

//String对象的trim方法，可能等同于Prototype的strip方法
String.prototype.trim = function(){
	//用正则表达式将前后空格用空字符串替代。
	return this.replace(/(^\s*)|(\s*$)/g, "");
}

//HTML String对象转为Text String对象，可能等同于Prototype的stripTags方法
String.prototype.trimHtml = function() {
	var sRtn = "";
	var blnHtmlTags = false;

	for (var i=0 ; i<this.length; i++) {
		var iTmp = (i-1>0) ? (i-1) : 0;
		if (this.charAt(iTmp) == ">")
			blnHtmlTags = false;

		var chrAti = this.charAt(i);
		if (chrAti == "<")
			blnHtmlTags = true;

		if (!blnHtmlTags)
			sRtn += chrAti;
	}

	return sRtn;
}

//取字符串的长度，双字节字符返回两个字节
String.prototype.byteLen = function(){
	var intByteLen = 0;

	for (var i=0; i<this.length; i++) {
		var chrAti = this.charAt(i);
		if (escape(chrAti).length == (chrAti.length)*6)
			intByteLen += 2;
		else
			intByteLen += 1;
	}
	return intByteLen;
}

//取字符串的长度，双字节字符返回两个字节
String.prototype.byteLen2 = function() {
	var intByteLen = 0;

	for (var i=0; i<this.length; i++) {
		if (128 < this.charCodeAt(i))
			intByteLen +=2;
		else
			intByteLen ++;
	}
	return intByteLen;
}

//固定字符串长度
String.prototype.toFixed = function(iLen, sFixChar, bLeft) {
	var sRtn = this;
	var iWidth1 = sRtn.byteLen2();
	var iWidth2 = sFixChar.byteLen2();

	if (iLen > iWidth1) {
		var sFix = "";
		for (var i=0; i<Math.floor((iLen - iWidth1)/iWidth2); i++)
			sFix += sFixChar;

		if (bLeft)
			sRtn = sFix + sRtn;
		else
			sRtn += sFix;
	}

	return sRtn;
}

//字符串格式化函数
String.prototype.format = function(strSeparater) {
	if (2 > arguments.length)
		return this;

	var strSource = this;
	for (var i=1; i<arguments.length; i++) {
		strSource = strSource.replace(strSeparater, arguments[i]);
	}

	return strSource;
}

//随机字符串产生函数
String.prototype.passwd = function(intPwdBit, intType){
	var strRtn = "";
	var strTemp = "0123456789";

	if(intType > 1)
		strTemp += "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	if(intType > 2)
		strTemp += "~!@$%^()_+{}[].";
	if(intType > 3)
		strTemp += "',;#&\\/:?*\"<|>";

	for (var i=0; i<intPwdBit; i++) {
		var intRandom = eval(Math.round(Math.random() * 10000 % (strTemp.length - 1)));	//取得字符串长度之内的一个随机整数

		if(i == 0 && 2 == intType){	//可以作为变量名的随机字符串首位不为数字

			if(strTemp.charAt(intRandom) >= 0 && strTemp.charAt(intRandom) <= 9){
				i--;
				continue;
			}
		}
		strRtn += strTemp.charAt(intRandom);
	}

	return strRtn;
}

//过滤XML请求中SQL语句的特殊字符
String.prototype.SQLEncode = function() {
	var iLength = this.length
	var sRtn = "";

	for(var i=0; i<iLength; i++) {
		var iCharCodeAti = this.charCodeAt(i);
		switch(iCharCodeAti) {
			case 39:	//39 - '
				sRtn += "&#39;";
				break;
			case 44:	//44 - ,
				sRtn += "&#44;";
				break;
			default:
				sRtn += this.charAt(i)
		}
	}

	return sRtn;
}

//过滤XML请求中XML文本节点的特殊字符
String.prototype.XMLEncode = function() {
	var iLength = this.length
	var sRtn = "";

	for(var i=0; i<iLength; i++) {
		var iCharCodeAti = this.charCodeAt(i);
		switch(iCharCodeAti) {
			case 10:	//\n - 10
				sRtn += "&#10;";
			case 13:	//\r - 13
				sRtn += "&#13;";
				break;
			case 34:	//34 - "
				sRtn += "&#34;";
				break;
			case 38:	//38 - &
				sRtn += "&#38;";
				break;
			case 39:	//39 - '
				sRtn += "&#39;";
				break;
			case 60:	//60 - <
				sRtn += "&#60;";
				break;
			case 62:	//62 - >
				sRtn += "&#62;";
				break;
			default:
				sRtn += this.charAt(i)
		}
	}

	return sRtn;
}

String.prototype.testSqlInput = function() {
	var sKey = "'\"?*%";
	var bResult = true;

	for (var i = 0; i < sKey.length; i++) {
		var ch = sKey.charAt(i);
		if (this.indexOf(ch) > -1) {
			bResult = false;
			break;
		}
	}

	if (bResult)
	{
		var tmp = this.trim();
		if (tmp.charAt(0) == "+")
		{
			bResult = false;
		}
	}

	return bResult;
}

String.prototype.numSbc2Dbc = function () {
	var sKey = this;
	sKey = sKey.replace(/１/g, "1");
	sKey = sKey.replace(/２/g, "2");
	sKey = sKey.replace(/３/g, "3");
	sKey = sKey.replace(/４/g, "4");
	sKey = sKey.replace(/５/g, "5");
	sKey = sKey.replace(/６/g, "6");
	sKey = sKey.replace(/７/g, "7");
	sKey = sKey.replace(/８/g, "8");
	sKey = sKey.replace(/９/g, "9");
	sKey = sKey.replace(/０/g, "0");

	return sKey;
}

//判断字符串是否为“空”
function isEmpty(strCompare) {
	if (strCompare == null)
		return true;
	else if (typeof(strCompare) == "undefined")
		return true;
	else {
		var strCopy = new String(strCompare);

		if (strCopy.length < 1)
			return true;
		else if (strCopy.replace(/\r/g, "").replace(/\n/g, "").length < 1)
			return true;
	}
	return false;
}

