/**
 * 快捷选择元素，参数id：元素的id,字符串
 */
function $() {
	var elements = new Array();
	try{
		for (var i = 0; i < arguments.length; i++) {
			var element = arguments[i];
			if (typeof(element) == 'string')
				element = document.getElementById(element);
			if (arguments.length == 1)
				return element;
			elements.push(element);
		}
	}catch(e){}
	return elements;
}
// use this instead of assigning to window.onload directly:
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}
function addKeyUpEvent(obj,func) {
	var oldonkeyup = obj.onkeyup;
	if (typeof(obj.onkeyup) != 'function') {
		obj.onkeyup = func;
	} else {
		obj.onkeyup = function() {
			if (oldonkeyup) {
				oldonkeyup();
			}
			func();
		}
	}
}
function addKeyDownEvent(obj,func) {
	var oldonkeydown = obj.onkeydown;
	if (typeof(obj.onkeydown) != 'function') {
		obj.onkeydown = func;
	} else {
		obj.onkeydown = function() {
			if (oldonkeydown) {
				oldonkeydown();
			}
			func();
		}
	}
}
function addFocusEvent(obj,func) {
	var oldonfocus = obj.onfocus;
	if (typeof(obj.onfocus) != 'function') {
		obj.onfocus = func;
	} else {
		obj.onfocus = function() {
			if (oldonfocus) {
				oldonfocus();
			}
			func();
		}
	}
}
function addBlurEvent(obj,func) {
	var oldonblur = obj.onblur;
	if (typeof(obj.onblur) != 'function') {
		obj.onblur = func;
	} else {
		obj.onblur = function() {
			if (oldonblur) {
				oldonblur();
			}
			func();
		}
	}
}
function addClickEvent(obj,func) {
	var oldonclick = obj.onclick;
	if (typeof(obj.onclick) != 'function') {
		obj.onclick = func;
	} else {
		obj.onclick = function() {
			if (oldonclick) {
				oldonclick();
			}
			func();
		}
	}
}
function addChangeEvent(obj,func) {
	var oldonchange = obj.onchange;
	if (typeof(obj.onchange) != 'function') {
		obj.onchange = func;
	} else {
		obj.onchange = function() {
			if (oldonchange) {
				oldonchange();
			}
			func();
		}
	}
}
function addChangeEvent2(obj,func){
	if(typeof(func)=="function"){
		if(typeof(obj)=="string") obj = $(obj);
		obj.oldvalue = obj.value;
		addBlurEvent(obj,function (){
			if(obj.value != obj.oldvalue){
				func();
				obj.oldvalue = obj.value;
			}
		});
	}
}
/**
 * 按照类名选择元素，参数id：元素的id,字符串
 */
document.getElementsByClassName = function(className) {
	var children = document.getElementsByTagName('*') || document.all;
	var elements = new Array();
	try{
		for (var i = 0; i < children.length; i++) {
			var child = children[i];
			var classNames = child.className.split(' ');
			for (var j = 0; j < classNames.length; j++) {
				if (classNames[j] == className) {
					elements.push(child);
					break;
				}
			}
		}
	}catch(e){}
	return elements;
}
/*
 * 计算字符长度，汉字当成2个字符
 */
function strlen(str){
	if(str==""||str==undefined) return 0;
	return str.replace(/[^\x00-\xff]/g,'**').length;
}
/**
 * 全选itemName指定的checkbox，使之的状态同e的选择状态一致
 * deprycated
 */
function checkAll(e, itemName)
{
	check_all(e,itemName);
}
/**
 * 按照e指定的checkbox的状态以及与其同名的所有checkbox的状态全为选中，则选中allName指定的checkbox，否则，使之处于不选中状态
 * deprycated
 */
function checkItem(e, allName){
	check_item(e, allName);
}
/**
 * 全选itemName指定的checkbox，使之的状态同e的选择状态一致
 * @param:
 * Object	e        : 事件触发对象
 * String	itemName : checkbox的name
 * return	Boolean  : 操作成功与否
 */
function check_all(e, itemName)
{
	try{
		if(typeof(e)=='string') e=$(e);
		if(!e) return false;
		var aa = document.getElementsByName(itemName);
		for (var i=0; i<aa.length; i++)
			aa[i].checked = e.checked;
		var bb = document.getElementsByName(e.name);
		for (var i=0; i<bb.length; i++)
			bb[i].checked = e.checked;
		return true;
	}catch(E){return false;}
}
/**
 * 按照e指定的checkbox的状态以及与其同名的所有checkbox的状态全为选中，则选中allName指定的checkbox，否则，使之处于不选中状态
 * @param:
 * Object	e        : 事件触发对象
 * String	allName  : checkbox的name
 * return	Boolean  : 操作成功与否
 */
function check_item(e, allName){
	try{
		if(typeof(e)=='string') e=$(e);
		if(!e) return false;
		var bb = document.getElementsByName(allName);
		if(false == e.checked){
			for (var i=0; i<bb.length; i++)
				bb[i].checked = false;
		}else{
			var aa = document.getElementsByName(e.name);
			for (var i=0; i<aa.length; i++){
				if("checkbox"== aa[i].type && false == aa[i].checked)
					return true;
			}
			for (var i=0; i<bb.length; i++)
				bb[i].checked = true;
		}
		return true;
	}catch(E){return false;}
}

/**
 * 判断是否为数字
 */
function is_number(s){
	var patrn=/^\d+$/; 
	if(!patrn.test(s)) return false;
	return true;
}

/**
 * 判断是否为浮点数
 */
function is_float(s){
	var patrn=/^\d+(\.\d*)?$/; 
	if(!patrn.test(s)) return false;
	return true;
}

/**
 * 显示指定的元素
 * @param:
 * Mixed	obj:指定的对象或者对象名
 * Integer	zIdx:指定zIndex
 * @return	boolean
 */
function show(obj,zIdx){
	try{
		if(typeof(obj)=="string") obj = $(obj);
		if(!obj) return false;
		obj.style.display = "";
		obj.style.zIndex = (!zIdx)?1000:zIdx;
		return true;
	}catch(e){return false;}
}
/**
 * 隐藏指定的元素
 * @param:
 * Mixed	obj:指定的对象或者对象名
 * @return	boolean
 */
function hide(obj){
	try{
		if(typeof(obj)=="string") obj = $(obj);
		if(!obj) return false;
		obj.style.display = "none";
		return true;
	}catch(e){return false;}
}

/*
 * hide elements by its class name
 * @param:
 * String	 cls : class name
 * @return	boolean
 */
function hide_by_class_name(cls){
	var es = document.getElementsByClassName(cls);
	if(!es) return false;
	try{
		for(var i=0;i<es.length;i++){
			var e = es[i];
			e.style.display = "none";
		}
		return true;
	}catch(e){return false;}
}

/*
 * 点阵对象
 */
function Point(iX, iY){
	this.x = iX;
	this.y = iY;
}
/*
 * 获取控件的绝对位置
 * @param:
 * String/Object	obj:对象id或者对象本身
 * @return	Point
 */
function getxy(obj){
	if(typeof(obj)=='string') obj = $(obj);
	var pt = new Point(0,0);
	if(!obj) return pt;
	var oTmp = obj;
	do {
		pt.x += oTmp.offsetLeft;
		pt.y += oTmp.offsetTop;
		oTmp = oTmp.offsetParent;
	}while(oTmp.tagName!="BODY");
	return pt;
}

/*
 * 设置 select 中的选项，该方法可复用,适用于形如[0:["text":"aa","value":0],1:["text":"bb","value":1]]的数组
 * @param:
 * so: 要设置选项的 select 对象
 *  d: 选项数据数组
 * vf: 选项值所对应的数组中的字段名
 * tf: 选项文本所对应的数组中的字段名
 * @return	boolean
 */
function set_select_bna(so, d, vf, tf) {
	try{
		if(typeof(so)=='string') so=$(so);
		if(!so) return false;
		for (var i = 0, n = d.length; i < n; i++) {
			var opt = document.createElement('option');
			opt.text = d[i][tf];
			opt.value = d[i][vf];
			// 有些浏览器不支持 options 属性的 add 方法，
			// 但支持 DOM 的 appendChild 方法（比如：Konqueror）
			if (so.options.add) {
				so.options.add(opt);
			}
			else {
				so.appendChild(opt);
			}
		}
		return true;
	}catch(e){return false;}
}
/*
 * 设置 select 中的选项
 * @param:
 *   obj: 要设置选项的 select 对象
 *  text: 选项文本对应的数组
 * value: 选项值所对应的数组
 * @return	boolean
 */
function set_select(obj,text,value){
	try{
		if(typeof(obj)=='string') obj=$(obj);
		if(!obj) return false;
		for (var i = 0, n = text.length; i < n; i++) {
			var opt = document.createElement('option');
			opt.text = text[i];
			opt.value = value[i];
			// 有些浏览器不支持 options 属性的 add 方法，
			// 但支持 DOM 的 appendChild 方法（比如：Konqueror）
			if (obj.options.add) {
				obj.options.add(opt);
			} else {
				obj.appendChild(opt);
			}
		}
		return true;
	}catch(e){return false;}
}

/* 
 * 清除 select 中的选项，该方法可复用
 * @param:
 * so: 要清除选项的 select 对象
 * @return	boolean
 */
function clear_select(so){
	try{
		if(typeof(so)=='string') so=$(so);
		if(!so) return false;
		for (var i = so.options.length - 1; i > -1; i--){
			// 有些浏览器不支持 options 属性的 remove 方法，
			// 但支持 DOM 的 removeChild 方法（比如：Konqueror）
			if (so.options.remove){
				so.options.remove(i);
			} else {
				so.removeChild(so.options[i]);
			}
		}
		return true;
	}catch(e){return false;}
}

/* 
 * 使 select 中的选项只剩指定的个数
 * @param:
 * so: 要清除选项的 select 对象
 * @return	boolean
 */
function trim_select(so,len){
	try{
		if(typeof(so)=='string') so=$(so);
		if(!so) return false;
		if(typeof(len)=='undefined') len=0;
		for (var i = so.options.length - 1; i > len-1; i--){
			// 有些浏览器不支持 options 属性的 remove 方法，
			// 但支持 DOM 的 removeChild 方法（比如：Konqueror）
			if (so.options.remove){
				so.options.remove(i);
			} else {
				so.removeChild(so.options[i]);
			}
		}
		return true;
	}catch(e){return false;}
}
/**
 * set the option with given value selected
 * @param: 
 *   obj: target select;
 * value: value
 * @return	boolean
 */
function select_option(obj,value){
	if(typeof(obj)=='string') obj=$(obj);
	if(!obj) return false;
	if(!obj.length || obj.length<1)	return true;
	try{
		for(var i=0;i<obj.length;i++){
			if(obj.options[i].value == value){
				obj.options[i].selected=true;
				break;
			}
		}
		return true;
	}catch(e){return false}
}
/**
 * set the option with given text selected
 * @param: 
 *  obj: target select;
 * text: text
 * @return	boolean
 */
function select_option_by_text(obj,text){
	if(typeof(obj)=='string') obj=$(obj);
	if(!obj) return false;
	if(!obj.length || obj.length<1)	return true;
	try{
		for(var i=0;i<obj.length;i++){
			if(obj.options[i].text == text){
				obj.options[i].selected=true;
				break;
			}
		}
		return true;
	}catch(e){return false;}
}
/*
 * get the select control's text by its value
 * @param: 
 *   obj: target select;
 * value: value,string
 * @return	string
 */
function get_select_text_by_value(obj,value){
	if(typeof(obj)=='string') obj=$(obj);
	if(!obj) return false;
	if(!obj.length || obj.length<1){
		return "";
	}
	try{
		for(var i=0;i<obj.length;i++){
			if(obj.options[i].value == value){
				return obj.options[i].text;
			}
		}
	}catch(e){return "";}
}
/*
 * make the select control's options unique
 * @param: 
 *   obj: target select;
 * @return	boolean
 */
function simplify_select_control(obj){
	if(typeof(obj)=='string') obj = $(obj);
	if(!obj) return false;
	if(obj==undefined || obj.type!="select-one" && obj.type!="select-multiple") return false;
	var i,opt = obj.options,o,text=[],value=[];
	try{
		for(i=0;i<opt.length;i++){
			o = opt[i];
			text.push(o.text);
			value.push(o.value);
		}
		text = text.unique();
		value= value.unique();
		clear_select(obj);
		set_select(obj,text,value);
		return true;
	}catch(e){return false;}
}
/*
 * set checked checkbox
 * @param:
 * String/Object	objs:object that point to the radiobuttons,e.g, document.getElementsByName('ids'),here ids is its name;or directly 'ids' as a parameter
 * Array			vals:values to be checked
 * @return	boolean
 */
function select_checkbox(objs,vals){
	if(typeof(objs)=='string') objs = document.getElementsByName(objs);
	if(!objs) return false;
	var c1=0;
	var ids = new Array();
	try{
		if(objs.length!=undefined){
			for(i=0;i<objs.length;i++){
				var obj = objs[i];
				obj.checked = false;
				for(var j in vals){
					var val = vals[j];
					if(val==obj.value){
						obj.checked=true;
						break;
					}
				}
			}
		}else{
			objs.checked = false;
			for(var j in vals){
				var val = vals[j];
				if(val==objs.value){
					objs.checked=true;
					break;
				}
			}
		}
		return true;
	}catch(e){return false;}
}

/*
 * get checked checkbox
 * @param:
 * String/Object	objs:object that point to the radiobuttons,e.g, document.getElementsByName('ids'),here ids is its name;or directly 'ids' as a parameter
 * @return	Array:stores the ids that is checked
 */
function get_checked_checkbox(objs){
	var c1=0;
	if(typeof(objs)=='string') objs = document.getElementsByName(objs);
	if(!objs) return [];
	var ids = new Array();
	try{
		if(objs.length!=undefined){
			for(i=0;i<objs.length;i++){
				if(objs[i].checked==true){
					c1=1;
					ids.push(objs[i].value);
				}
			}
		}else{
			if(objs.checked==true){
				c1=1;
				ids.push(objs.value);
			}
		}
		return ids;
	}catch(e){return [];}
}

/*
 * set checked checkbox
 * @param:
 * String/Object	objs:object that point to the radiobuttons,e.g, document.getElementsByName('ids'),here ids is its name;or directly 'ids' as a parameter
 * String			val:value to be checked
 * @return	boolean
 */
function select_radio(objs,val){
	if(typeof(objs)=='string') objs = document.getElementsByName(objs);
	if(!objs) return false;
	var c1=0;
	var ids = new Array();
	try{
		if(objs.length!=undefined){
			for(i=0;i<objs.length;i++){
				var obj = objs[i];
				obj.checked = false;
				if(val==obj.value){
					obj.checked=true;
					break;
				}
			}
		}else{
			objs.checked = false;
			if(val==objs.text) objs.checked=true;
		}
		return true;
	}catch(e){return false;}
}

/*
 * get checked radiobutton
 * @param:
 * String/Object	objs:object that point to the radiobuttons,e.g, document.getElementsByName('ids'),here ids is its name;or directly 'ids' as a parameter
 * @return			String:stores the value of the radio that is checked
 */
function get_checked_radio(objs){
	if(typeof(objs)=='string') objs = document.getElementsByName(objs);
	if(!objs) return "";
	var to = "";
	try{
		to = objs[0].value;
		var cnt = objs.length;
		for(var i=0;i<cnt;i++){
			var e = objs[i];
			if(true==e.checked){
				to = e.value;
				break;
			}
		}
		return to;
	}catch(e){return "";}
}

/*
 * remove illegal symbols
 * @param:
 * string	str:string that need to remove illegal symbols.
 * @return	string
 */
function strip(str){
	try{
		if(str!=""){
			str = str.replace(/^\s*/g,'');//strip starting blank
			str = str.replace(/["&<>']|<[^>]*>.*<\/[^>]*>|<[^>]*>/g,'');	//strip illegal symbols and html tags
		}
	}catch(e){}
	return str;
}

/*
 * format integer numbers
 * @param:
 * string	str:string that need to format.
 * intger	len:max number of digits
 * @return	string
 */
function strip_integer_number(str,len){
	try{
		if(str!=""){
			str = str.replace(/[^\d]/g,'');
			if(len!=undefined){
				var ptn = new RegExp("^(\\d{0,"+len+"}).*$","g");
				str = str.replace(ptn,'$1');
			}
		}
	}catch(e){}
	return str;
}

/*
 * format float number
 * @param:
 * string	num:float number that need to format.
 * intger	pre:max number of digits before dot
 * intger	ext:max number of digits after dot
 * @return	string
 */
function strip_float_number(num,pre,ext){
	if(pre==undefined) pre = 6;
	if(ext==undefined) ext = 2;
	num = num.replace(/[^.\d]/g,'');
	var ptn = new RegExp("^(\\d{0,"+pre+"})\\d*(\\.\\d{0,"+ext+"})?.*$","g");
	num = num.replace(ptn,'$1$2');
	return num;
}

/*
 * jump to pointed page
 * @param:
 * Intger	page:page number
 * @return	bool
 */
function go_page(page){
	if(!is_number(page)) return false;
	var str = window.location.search;
	var pattern = /(\?|&)page\b(=[^&]*)?/g;	//match one like: page=11,page=fslfj,page
	if(str==""||str=="?"){	//if not aguments, add one
		str = "page="+page;
	}else if(!pattern.exec(str)){	//if with aguments but without page info, add one
		str += "&page="+page;
	}else{	//with page info, replace it
		str = str.replace(pattern,'$1page='+page);
	}
	window.location.search = str;
}

/*
 * get current timestamp, unit: second
 * @param:
 * null
 * return int
 */
function time(){
	var time = new Date();
	time = time.getTime();
	time = Math.round(time/1000);
	return time;
}

/*
 * get current daystamp
 * @param:
 * null
 * return int
 */
function daystamp(){
	var myDate = new Date(); //创建日期对象
	var year=myDate.getFullYear();
	var month=myDate.getMonth()+1;
	var date=myDate.getDate();
	if (date < 10)
		var day=year+"/"+month+"/"+"0"+date; //获取当前日期
	else
		var day=year+"/"+month+"/"+date; //获取当前日期
	var time = Date.parse(day);
	return time;
}

/*
 * get current date
 * @param:
 * null
 * return int
 */
function date(){
	var myDate = new Date(); //创建日期对象
	var year=myDate.getFullYear();
	var month=myDate.getMonth()+1;
	var date=myDate.getDate();
	if (date < 10)
		var day=year+"-"+month+"-"+"0"+date; //获取当前日期
	else
		var day=year+"-"+month+"-"+date; //获取当前日期
	return day;
}

/*
 * parse date string to timestamp
 * @param:
 * String	date:date string like 2007-10-15 20:50:12
 * @return	Intger: timestamp
 */
function strtotime(date){
	date = date.replace(/-/g,"/");
	time = Date.parse(date);
	return time;
}

/*
 * verify start date and end date
 * @param:
 * String	_start : start input control's id
 * String	  _end : end input control's id
 * @return	  bool : is valid
 */
function verify_start_and_end(_start,_end){
	var msg = '请您选择正确的日期范围！';
	start = $(_start).value;
	end = $(_end).value;
	if(start==""||end==""){
		alert('请您输入起/止时间！');
		$(_start).focus();
		return false;
	}
	if(strtotime(end)<strtotime(start)){
		alert(msg);
		$(_end).focus();
		return false;
	}else{
		return true;
	}
}
/*
 * 断超长字。
 * @param:
 * String	cont: 字符串
 * Intger	 len: 英文单词最长的长度
 * String	  ws: 截断字符，默认为" "
 * @return	String
 */
function wordbreak(cont,len,ws){
	try{
		len = parseInt(len);
		if(ws==undefined) ws = " ";
		var ptn = new RegExp("([\\x21-\\xfe]{"+len+"})","g");
		cont = cont.replace(ptn,"$1"+ws);//对每个全非中文字符串（不包括空格等），每len个字符就加一个ws
		return cont;
	}catch(e){return cont;}
}

function urlencode(val){
	val = val.replace(/\+/g,"%2B");
	val = val.replace(/\*/g,"%2A");
	val = val.replace(/\?/g,"%3F");
	val = val.replace(/#/g,"%23");
	val = val.replace(/&/g,"%26");
	return val;
}

function check_url_valid(str){
	var urlpatern1 =/^http:\/\/([^\.\/-][^\.\/]*\.)+[^\.\/-][^.\/]*[\/=\?%\-&_~`@[\]\':+!]*([^\"\"])*$/i;
	if(!urlpatern1.test(str)){
		return false;
	}else{
		return true;
	}
}
/*
 * 获取光标当前位置
 * @param	Object	obj:控件对象
 * @return	Object {"start":开始位置;"end":结束位置}
 */
function get_cursor_pos(obj){
	if(typeof(obj)=="string") obj = document.getElementById(obj);
	var pos = {"start":0,"end":0};
	if(!obj) return pos;
	try{
		obj.focus();
		if(document.selection){
			var range = document.selection.createRange();
			if(range.parentElement().id == obj.id){
				var start=0,end=0;
				switch(obj.type){
					case "textarea":
						var range_all = document.body.createTextRange();
						range_all.moveToElementText(obj);
						//deal with textarea's \n
						for (var i = 0; i <= start; i ++){
							if (obj.value.charAt(i) == '\n')
								start++;
						}
						for (var i = 0; i <= end; i ++){
							if (obj.value.charAt(i) == '\n')
								end ++;
						}
					break;
					default:
						var range_all = obj.createTextRange();
					break;
				}
				var dp_range = range_all.duplicate();
				for (; range_all.compareEndPoints("StartToStart", range) < 0; start++)
					range_all.moveStart('character', 1);
				for (; dp_range.compareEndPoints('StartToEnd', range) < 0; end ++)
					dp_range.moveStart('character', 1);
				pos.start = start;
				pos.end = end;
			}
		}else{
			pos.start = obj.selectionStart;
			pos.end = obj.selectionEnd;
		}
		return pos;
	}catch(e){return pos;}
}
/*
 * 设置光标位置
 * @param	Object	obj:控件对象
 * @param	Object	pos:光标位置
 * @return	Boolean
 */
function set_cursor_pos(obj,pos){   
	if(typeof(obj)=="string") obj = document.getElementById(obj);
	if(!obj) return false;
	try{
		if(document.selection){
			var rng =obj.createTextRange();
			rng.moveStart('character',pos.start);
			rng.moveEnd('character',pos.end);
			rng.collapse(true);
			rng.select();
		}else{
			obj.selectionStart = pos.start;
			obj.selectionEnd = pos.end;
			obj.focus();
		}
		return true;
	}catch(e){return false;}
}
/**
 * deprycated:保存对象当前光标位置
 * @param	Object    obj: 对象
 * @return	null
 */
function save_start_pos(obj){
	obj.startPos=get_cursor_pos(obj);
}
/**
 * 保存对象当前光标位置
 * @param	Object    obj: 对象
 * @return	null
 */
function save_position(obj){
	var pos = get_cursor_pos(obj);
	obj.startPos = pos.start;
	obj.endPos = pos.end;
}
/**
 * 调用给定的函数去除特殊字符，并恢复光标
 * @param	Object        obj: 对象
 * @param	String      value: 事件
 * @param	Function callback: 用于去除特殊字符的函数
 * @return	null
 */
function strip_down(obj,value,callback){
	var pos = get_cursor_pos(obj);
	var str = callback(value);
	pos.start = pos.end = pos.start+str.length-obj.value.length;
	obj.value = str;
	set_cursor_pos(obj,pos);
}
/*
 * 获取键盘输入键值
 * @param:
 * Event	event:event对象
 * @return	int
 */
function get_key_code(event){
	if(!event) var event = window.event;
	var code;
	if (event.keyCode)
		code = event.keyCode;
	else if(event.which)
		code = event.which;
	return code;
}
/**
 * 阻止Event的默认事件
 * @param	Event     event: 事件
 * @return	null
 */
function preventDefaultEvent(event){
	if(!event) event = window.event;
	event.returnValue=false;//prevent input
	if(!document.all)//Not IE, then use follow function to prevent
		event.preventDefault();
}
/**
 * 按照obj对象的maxlength属性计算剩余字符数
 * @param	Object obj: 对象
 * @return	Integer 剩余字符数，可能为负值
 */
function getLeftOver(obj){
	try{
		if(typeof(obj)=="string") obj = $(obj);
		var maxLen = parseFloat(obj.getAttribute("maxlength"));
		var val = obj.value;
		var leftover = maxLen-val.length;
		return leftover;
	}catch(E){
		return 0;
	}
}
/*
 * 计算数组的差集
 * array array.diff ( array array1 [, array array2 [, array ...] ] )
 * @param:
 * Array	array1:求差集的数组
 * @return	Array:返回一个数组，该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。
 */
Array.prototype.diff = function(){
	var arr = this;
	for(var i=0;i<arguments.length;i++){
		var arg = arguments[i];
		arr = diff(arr,arg);
	}
	return arr;
}
//arr1-arr2
function diff(arr1,arr2){
	var flag = true,arr = new Array();
	for(var i=0;i<arr1.length;i++){
		flag = true;
		for(var j=0;j<arr2.length;j++){
			if(arr1[i]==arr2[j]){
				flag=false;
				break;
			}
		}
		if(true==flag) arr.push(arr1[i]);
	}
	return arr;
}
/*
 * 计算数组的交集
 * array array.intersect ( array array1 [, array array2 [, array ...] ] )
 * @param:
 * Array	array1:求交集的数组
 * ...
 * @return	Array:返回一个数组，该数组包含了所有在 array 中也同时出现在所有其它参数数组中的值。
 */
Array.prototype.intersect = function(){
	var arr = this;
	for(var i=0;i<arguments.length;i++){
		var arg = arguments[i];
		arr = intersect(arr,arg);
	}
	return arr;
}
function intersect(arr1,arr2){
	var arr = new Array();
	for(var i=0;i<arr1.length;i++){
		for(var j=0;j<arr2.length;j++){
			if(arr1[i]==arr2[j]){
				arr.push(arr1[i]);
				break;
			}
		}
	}
	return arr;
}
/*
 * 移除数组中重复的值
 * @param:
 * null
 * @return	Array:unique array
 */
Array.prototype.unique = function(){
	var arr = new Array();
	for(var i=0;i<this.length;i++){
		var val = this[i];
		var flag = true;
		for(var j=0;j<arr.length;j++){
			if(val==arr[j]){
				flag=false;
				break;
			}
		}
		if(true==flag){
			arr.push(val);
		}
	}
	return arr;
}
/**
 * 去除输入值两端空格
 *
 */
String.prototype.trim = function() { 
	return this.replace(/(?:^\s*)|(?:\s*$)/g, ""); 
}
/**
 * Get part of string
 * returns the portion of str specified by the start and length parameters. 
 * mb_substr() performs multi-byte safe substr() operation based on number of characters. Position is counted from the beginning of str. First character's position is 0. Second character position is 1, and so on. 
 * a multi-byte character is counted as 2 digits
 * @param   str : original string
 * @param start : start position
 * @param   len : length of sub-string
 * @return  sub-string
 */
function mb_substr(str, start, len) {//并行截取中英文字符串
	if(str==undefined || start==undefined || len==undefined) return '';
	var cnt = 0,j=0;
	var end = str.length;
	var rst = '';
	for (var i=start; i<end; i++){
		if (str.charCodeAt(i)>255){
			cnt += 2;
		}else{
			cnt++;
		}
		j = cnt-start;
		if(j>len)
			break;
		if(j>0)
			rst += str.charAt(i);
	}
	return rst;
}
String.prototype.mb_substr = function (){
	return mb_substr(this,arguments[0],arguments[1]);
}