﻿/*
JavaScript 常用功能扩展
编写人：刘世全
日期：2006-5-10
*/

//----------------------------------------------------------------------------
/***去前导空白字符***/
function $ltrim(){
	var reg = new RegExp("^[\\s　]*","gim");
	return this.replace(reg,"");
}

/***去后导空白字符***/
function $rtrim(){
	var reg = new RegExp("[\\s　]*$","gim");
	return this.replace(reg,"");
}
/***去前后空白字符***/
function $trim(){
	var reg = new RegExp("^[\\s　]*|[\\s　]*$","gim");
	return this.replace(reg,"");
}
/***计算字符串按字节算的长度，非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 reg = new RegExp("[\\s　]*","gim");
	return this.replace(reg,"");
}
/*截取字符串左边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 $isMobile(){
	var reg = new RegExp("^1[358]\\d{9}$","gi");
	return reg.test(this);
}
//是否电话号码
function $isTel(){
	var reg = new RegExp("^([+]?\\d+[-])?(\\(\\d+\\)|(\\d+)\\-)?\\d{6,15}([-]\\d+)?$","gi");
	return reg.test(this);
}
//是否电子邮件
function $isEmail(){
        var reg = new RegExp("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$","gi");
        return reg.test(this);
}
//检测15位或18位的身份证号
function $isIdCardNum(){
        var reg = new RegExp("^\\d{17}[\\dx]{1}$","gi");
        if(!reg.test(this)) return false;
	    var wi = [0,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
	    var amt = 0;
	    var chkNo = ["1","0","X","9","8","7","6","5","4","3","2"];
	    for(var i=1;i<18;i++){
		    amt += (parseInt(this.substr(i-1,1))*wi[i]);
	    }
	    return (chkNo[amt % 11] == this.substr(this.length-1,1).toUpperCase());
}
//检查字串是否是日期格式的
function $isDataFormat(){
	var str = this;
	var reg1 = new RegExp("^([12]\\d{3})(-)(\\d{1,2})(-)(\\d{1,2})$","g");
	var reg2 = new RegExp("^([12]\\d{3})(-)(\\d{1,2})(-)(\\d{1,2})( )(\\d{1,2})(:)(\\d{1,2})(:)(\\d{1,2})$","g");
	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 reg = new RegExp("^\\d{5,6}$","gi");
    return reg.test(this);
}
//是否为QQ号码
function $isQQ(){
    var reg = new RegExp("^\\d{5,10}$","gi");
    return reg.test(this);
}
//是否为数字
function $isNumeric(){
	var reg = new RegExp("^(-)?\\d+(\\.\\d*)?$","");
	return reg.test(this);
}
// 是否为整数
function $isInteger(){
    var reg = new RegExp("^(-)?\\d+$","");
    return reg.test(this);
}
// 是否为整数
function $isCurrency(){
		if(this.isNumeric()==false)return false;
		var reg = new RegExp("^(-)?\\d+(\\.\\d{0,2})?$","");
		return reg.test(this);
}
//是否为正数
function $isPositiveNumber(hasZero){
        if(arguments.length<1) hasZero=true;
		if(this.isNumeric()==false)return false;
        if(hasZero){
            return parseFloat(this)>=0;
        }else{
            return parseFloat(this)>0;
        }
}
//删除HTML标签
function $delHtmlTag(){
		var reg = new RegExp("\\<[^\\<]+\\>","gim");
		var val = this.replace(reg,"");
        reg = new RegExp("\\&[a-z]+\\;","gim");
        val = val.replace(reg,"");
        return val;
}
//字符转换为日期
function $toDate(){
	var str = this;
	var reg1 = new RegExp("^([12]\\d{3})(-)(\\d{1,2})(-)(\\d{1,2})$","g");
	var reg2 = new RegExp("^([12]\\d{3})(-)(\\d{1,2})(-)(\\d{1,2})( )(\\d{1,2})(:)(\\d{1,2})(:)(\\d{1,2})$","g");
	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.isCurrency = $isCurrency
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;