﻿/*
JavaScript 常用功能扩展
编写人：刘世全
日期：2006-5-10
*/

//----------------------------------------------------------------------------
/***去前导空白字符***/
function $ltrim(){
	if(this.length < 1)return "";
	return this.replace(/(^\s*)/gim,"");
}

/***去后导空白字符***/
function $rtrim(){
	if(this.length < 1)return "";
	return this.replace(/(\s*$)/gim,"");
}
/***去前后空白字符***/
function $trim(){
	if(this.length < 1)return "";
	else return this.replace(/(^\s*)|(\s*$)/gim,"");
}
/***计算字符串按字节算的长度，非ASCII码字符算2个单位长度***/
function $calcStringByteLength(){
	var len = this.length;
	var code;
	var clen=0;
	for(var i=0;i<len;i++){
		code = this.charCodeAt(i);
		if(code.isBetween(0,255)){
			clen ++;
		}else{
			clen += 2;
		}
	}
	return clen;
}
/*清除字符串中的所有空白字符*/
function $deleteAllSpace(){
	var str = this.toString();
	str = str.replace(/\s/gim,"");
	return str;
}
/*截取字符串左边N个字节*/
function $left(n){
	var str = this.toString();
	if(str.calcByteLength()<=n)return str;
	var code;
	var i, j = 0;
	for(i=0;i<str.length;i++){
		code = str.charCodeAt(i);
		if(code.isBetween(0,255)){
			j ++;
		}else{
			j += 2;
		}
		if(j>n)break;
	}
	return str.substr(0,i);
}
//删除所有空白字符
function $deleteAllSpace(){
	var str = this.toString();
	str = str.replace(/\s/gim,"");
	return str;
}
//是否手机号
function $isMobile(){
	if(this == null || this == ""){return false;}
	else{
		var regex = /^1[358]{1}[0-9]{9}$/;
		return regex.test(this);
	}
}
//是否电话号码
function $isTel(){
	if(this == null || this == ""){return false;}
	else{
		var regex = /^((\+)?\d+\-)?(\(\d+\)|\d+\-)?\d+(\-\d+)?$/;
		return regex.test(this);
	}
}
//是否电子邮件
function $isEmail(){
	if(this == null || this == ""){return false;}
	else{
		var regex = /^(.){1,}@(.){1,}\.(.){1,}$/;
		return regex.test(this);
	}
}
//检测15位或18位的身份证号
function $isIdCardNum(){
	var idNo = this.trim();
	var len = idNo.length;
	var reg;
	var noArr;
	var dateStr="";
	if(len != 15 && len != 18){
		return false;
	}else if(len == 15){
		reg = /^(\d{3})(\d{3})(\d{2})(\d{2})(\d{2})(\d{3})$/;
		if(reg.test(idNo)==false){
			return false;
		}else{
			noArr = reg.exec(idNo);
			var oy = eval("19"+noArr[3]);
			var om = eval(noArr[4])-1;
			var od = eval(noArr[5]);
			var bd = new Date(oy,om,od);
			return bd.getFullYear()==oy && bd.getMonth()==om && bd.getDate()==od;
		}
	}else{
		reg = /^(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})(\d{1})([0-9xX]{1})$/;
		if(reg.test(idNo)==false){
			return false;
		}else{
			noArr = reg.exec(idNo);
			dateStr = noArr[7]+noArr[8]+noArr[9]+noArr[10]+"/"+noArr[11]+noArr[12]+"/"+noArr[13]+noArr[14];
			var wi = new Array(0,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
			var amt = 0;
			var i;
			var chkNo = new Array("1","0","X","9","8","7","6","5","4","3","2");
			for(i=1;i<18;i++){
				amt += (noArr[i]*wi[i]);
			}
			return (chkNo[amt % 11] == noArr[18].toUpperCase());
		}
	}
}
//检查字串是否是日期格式的
function $isDataFormat(){
	var str = this;
	var reg1 = /^([12]{1}\d{3})(\-)(\d{1,2})(\-)(\d{1,2})$/;
	var reg2 = /^([12]{1}\d{3})(\-)(\d{1,2})(\-)(\d{1,2})( )(\d{1,2})(\:)(\d{1,2})(\:)(\d{1,2})$/;
	var noArr,oy,on,od,oh,om,os,bd;
	if(reg1.test(str)||reg2.test(str)){
		if(reg1.test(str)) noArr = reg1.exec(str);
		else noArr = reg2.exec(str);
		oy = eval(noArr[1]);
		on = eval(noArr[3])-1;
		od = eval(noArr[5]);
		if(reg1.test(str)){
			bd = new Date(oy,on,od);
			return bd.getFullYear()==oy && bd.getMonth()==on && bd.getDate()==od;
		}else{
			oh = eval(noArr[7]);
			om = eval(noArr[9]);
			os = eval(noArr[11]);
			bd = new Date(oy,on,od,oh,om,os);
			return bd.getFullYear()==oy && bd.getMonth()==on && bd.getDate()==od && bd.getHours()==oh && bd.getMinutes()==om && bd.getSeconds()==os;
		}
	}else{
		return false;
	}
}
//是否为邮政编码5-6位数值
function $isPostcode(){
	var regex = /[0-9]{5,6}/;
	return regex.test(this);
}
//是否为QQ号码
function $isQQ(){
	var regex = /[0-9]{5,9}/;
	return regex.test(this);
}
//是否为数字
function $isNumeric(){
	var regex = /^\-?\d{1,}(\.\d*)?$/;
	return regex.test(this);
}
// 是否为整数
function $isInteger(){
	var regex = /^\-?\d{1,}\.?$/;
	return regex.test(this);
}
//是否为正数
function $isPositiveNumber(){
	if(this.isNumeric()==false)
	{
		return false;
	}
	else
	{
		return parseFloat(this)>=0;
	}
}
//删除HTML标签
function $delHtmlTag(){
	var reg = /(<{1})([^<]{1,})(>{1})/gim;
	return this.replace(reg,"");
}
//字符转换为日期
function $toDate(){
	var str = this;
	var reg1 = /^([12]{1}\d{3})(\-)(\d{1,2})(\-)(\d{1,2})$/;
	var reg2 = /^([12]{1}\d{3})(\-)(\d{1,2})(\-)(\d{1,2})( )(\d{1,2})(\:)(\d{1,2})(\:)(\d{1,2})$/;
	var noArr,oy,on,od,oh,om,os,bd;
	if(reg1.test(str)||reg2.test(str)){
		if(reg1.test(str)) noArr = reg1.exec(str);
		else noArr = reg2.exec(str);
		oy = eval(noArr[1]);
		on = eval(noArr[3])-1;
		od = eval(noArr[5]);
		if(reg1.test(str)){
			bd = new Date(oy,on,od);
		}else{
			oh = eval(noArr[7]);
			om = eval(noArr[9]);
			os = eval(noArr[11]);
			bd = new Date(oy,on,od,oh,om,os);
		}
		return bd;
	}else{
		return null;
	}
}
String.prototype.trim = $trim;
String.prototype.leftTrim = $ltrim;
String.prototype.rightTrim = $rtrim;
String.prototype.calcByteLength = $calcStringByteLength;
String.prototype.clearSpace = $deleteAllSpace;
String.prototype.left = $left;
String.prototype.isMobile = $isMobile;
String.prototype.isTel = $isTel;
String.prototype.isQQ = $isQQ;
String.prototype.isEmail = $isEmail;
String.prototype.isIdCardNumber = $isIdCardNum;
String.prototype.isDate = $isDataFormat;
String.prototype.toDate = $toDate;
String.prototype.isPostcode = $isPostcode
String.prototype.isNumeric = $isNumeric
String.prototype.isInteger = $isInteger
String.prototype.isPositiveNumber = $isPositiveNumber
String.prototype.delHtmlTag = $delHtmlTag

//---------------------------------------------------------------------------
/***计算日期差***/
function $datediff(){
	var len = arguments.length;
	if(len == 1){
		return this.datediff_1(arguments[0]);
	}else if(len == 2){
		return this.datediff_2(arguments[0],arguments[1]);
	}else{
		var e = new Error("Arguments Error！");
		throw e;
		return;
	}
}
function $datediff_1(d){
	return this.datediff_2("d",d);
}
function $datediff_2(m,d){
	var num,_d1,_d2;
	m = m.toString().toLowerCase();
	switch(m){
		case "y":
			return d.getYear()-this.getYear();
			break;
		case "m":
			return ((d.getYear()-this.getYear())*12)+(d.getMonth()-this.getMonth());
			break;
		case "d":
			_d1 = new Date(this.getYear(),this.getMonth(),this.getDate(),0,0,0,0);
			_d2 = new Date(d.getYear(),d.getMonth(),d.getDate(),0,0,0,0);
			num = _d2.getTime() - _d1.getTime();
			return parseInt(num/(1000*60*60*24));
			break;
		case "h":
			_d1 = new Date(this.getYear(),this.getMonth(),this.getDate(),this.getHours(),0,0,0);
			_d2 = new Date(d.getYear(),d.getMonth(),d.getDate(),d.getHours(),0,0,0);
			num = _d2.getTime() - _d1.getTime();
			return parseInt(num/(1000*60*60));
			break;
		case "n":
			_d1 = new Date(this.getYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),0,0);
			_d2 = new Date(d.getYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),0,0);
			num = _d2.getTime() - _d1.getTime();
			return parseInt(num/(1000*60));
			break;
		case "s":
			_d1 = new Date(this.getYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),this.getSeconds(),0);
			_d2 = new Date(d.getYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),d.getSeconds(),0);
			num = _d2.getTime() - _d1.getTime();
			return parseInt(num/1000);
			break;
		case "ms":
			num = d.getTime()-this.getTime();
			return num;
			break;
		default:
			var e = new Error("Arguments Error! Compare Type: y(year)，m(month)，d(day)，h(hour)，n(minute)，s(second),ms(millisecond)");
			throw e;
			return;
			break;
	}
}
function $getDayName(){
	var arr = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
	return arr[this.getDay()];
}
function $getDayFullName(){
	var arr = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
	return arr[this.getDay()];
}
function $getMonthName(){
	var arr = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	return arr[this.getMonth()];
}
function $getMonthFullName(){
	var arr = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
	return arr[this.getMonth()];
}
Date.prototype.datediff = $datediff;
Date.prototype.datediff_1 = $datediff_1;
Date.prototype.datediff_2 = $datediff_2;
Date.prototype.getDayName = $getDayName;
Date.prototype.getDayFullName = $getDayFullName;
Date.prototype.getMonthName = $getMonthName;
Date.prototype.getMonthFullName = $getMonthFullName;

function $isBetween(a,b){
	if(arguments.length != 2){
		var e = new Error("Arguments Error!");
		throw e;
	}
	a = Number(a);b = Number(b);
	return (this >= a && this <= b)||(this >= b && this <= a);
}
function $isLeapYear(){
	if ((this%4)==0)
	{
		if ((this%100==0) && (this%400)!=0) return false;
		else return true;
	}
	else return false;
}
Number.prototype.isBetween = $isBetween;
Number.prototype.isLeapYear = $isLeapYear;
