//*******************************************************
//														*
//		Javascript Framework for GR2M ver 3.3.1			*
//														*
//		(c) 2007 Jim Yuan <jim.yuan@g2.com>				*
//														*
//		GRMscript.js is freely for G2RM's project.		*
//		For details, contact me by my email.			*
//														*
//		Important Notes:								*
//		It's based on prototype.js 1.5.1 or later.		*
//														*
//*******************************************************

var GRMobj=Class.create();

GRMobj.prototype={
	initialize: function(){
		this.version="3.0";
		this.author	="Jim Yuan";
		this.maskID	="GRMask";
	},

	request: function(argu){ //get parameters value
		var parsJSON=$H(location.href.toQueryParams());
		return (parsJSON[argu]) ? parsJSON[argu] : ""
	},
	
	createTag: function(obj,tagname,option){
		obj=$(obj);
		var _obj=document.createElement(tagname);
		for(i in option){ _obj[i]=option[i] };
		obj.appendChild(_obj);
	},

	//.........................................GRM Cookie manage
	_getCookieVal: function(offset){
		var endstr = document.cookie.indexOf (";", offset);
		if (endstr == -1) endstr = document.cookie.length;
		return unescape(document.cookie.substring(offset, endstr));
	},

	setCookie: function(name,value){
		if(document.cookie) document.cookie=name+"="+value;
		else {
			alert("Error: No cookie support in your Browers!");
			return false;
		}
	},
	
	getCookie: function(name){
		if(name == "path" || name == "expires" || name == "domain" || name == "version") name = "badCookieName";

		var arg = name + "=";
		var alen = arg.length;
		var clen = document.cookie.length;
		var i = 0;
		while (i < clen){
			var j = i + alen;
			if (document.cookie.substring(i, j) == arg) return this._getCookieVal (j);
			i = document.cookie.indexOf(" ", i) + 1;
			if (i == 0) break; 
		}
		return null;
	},

	newWin: function(){
		if(!document.getElementsByTagName) return;
		var ancs = $A(document.getElementsByTagName("a"));

		ancs.each(function(anchor){
			if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external") 
			anchor.target = "_blank"; 
		});
	},

	colorInvert: function(color){
		color=color.toUpperCase();
		var dec2hex="01234567##89ABCDEF".toArray();
		var ptn3=/^#[0-9A-F]{3}$/;
		var ptn6=/^#[0-9A-F]{6}$/;
		var c=""; var newColor=[];

		if(ptn6.test(color)) c=color;
		else if(ptn3.test(color)) c=color.gsub(/[0-9A-F]/, function(match){return match[0].times(2)});
		
		if(!c.empty()){
			c.toArray().each(function(item){
				newColor.push(dec2hex.reverse(false)[dec2hex.indexOf(item)]);
			});
			return newColor.join("");
		}
		else return null
	},

	getPageSize: function(){
		var xScroll, yScroll;

		if (window.innerHeight && window.scrollMaxY) {
			xScroll = document.body.scrollWidth;
			yScroll = window.innerHeight + window.scrollMaxY;
		} 
		else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} 
		else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}

		var windowWidth, windowHeight;
		if (self.innerHeight) { // all except Explorer
			windowWidth = self.innerWidth;
			windowHeight = self.innerHeight;
		} 
		else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} 
		else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}

		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight) pageHeight = windowHeight;
		else  pageHeight = yScroll;

		// for small pages with total width less then width of the viewport
		pageWidth = xScroll;

		//arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
		pageSize={cX:pageWidth,cY:pageHeight}
		return pageSize;
	},

	setWinInMask: function(parentID,frameURL){
		var winID="GRMaskWin";
		var option=Object.extend(
			{maskColor:"#F90", alpha:0.7, winWidth:400, winHeight:300, scrolls:true},//default option
			arguments[2]||{}
		);

		//window.scrollTo(0,0)
		var pageW=this.getPageSize().cX;
		var pageH=this.getPageSize().cY;

		this.createTag(
			$(parentID), "div", {id:this.maskID}
		);


		$(this.maskID).setStyle({
			position:"absolute",
			background:option.maskColor,
			top:"0", left:"0",
			width:"100%", height:pageH+"px",
			opacity:option.alpha
		});


		var inHTML='<iframe frameborder="0" id="GRMdivFrame"></iframe>'
		this.createTag(
			$(parentID), "div", {id:winID, innerHTML:inHTML}
		);
		var sY=Position.realOffset($(winID)).last();
		if(Prototype.Browser["Opera"]) sY/=2;//Opera Browser
		else if(!option.scrolls) sY=0; //do not follow scrolls

		$(winID).setStyle({
			width: option.winWidth+"px", height: option.winHeight+"px",
			position:"absolute",
			background:"white",
			marginTop:-(option.winHeight/2-sY)+"px",
			marginLeft:-(option.winWidth/2)+"px",
			top:"50%", left:"50%"
		});

		$("GRMdivFrame").setStyle({
			width:option.winWidth+"px", height:option.winHeight+"px"
		});
		$("GRMdivFrame").src=frameURL;
	},

	clearMask: function(){
		if(window.parent.location.href!=window.location.href){
			window.parent.$(this.maskID).remove();
			window.parent.$("GRMaskWin").remove();
		}
		else{
			$(this.maskID).remove(); $("GRMaskWin").remove();
		}
	},

	copyText: function(text){
		var tipMsg=Object.extend(
			{success:"Copy Successfully!", failure:"Your Browser does not support the method!"},
			arguments[1] || {}
		);
		if(window.clipboardData){
			window.clipboardData.setData("text",text);
			alert(tipMsg.success);
		}
		else alert(tipMsg.failure)
	},
	
	mixArray: function(source){
		//source=[1,2,3,4,5]
		var goal=[];
		var len=source.length;
		source.each(function(item,i){
			var pos=Math.floor(Math.random()*(len-i));
			goal[i]=source[pos];
			source[pos]=source[len-1-i];
		});
		return goal;
	},

	fadeView: function(obj){
		obj=$(obj)
		var option=Object.extend(
			{interval:0.05, frequency:0.1, display:true, range:[0,1], block:true, complete: function(){}},//default value
			arguments[1] || {}
		);
		var start;

		with(option){
			if(display){
				start=range.first();
				obj.descendants().invoke("show");
				obj.show();
				obj.setStyle({opacity:start,visibility:"visible"});

				new PeriodicalExecuter(function(pe){
					obj.setStyle({opacity:start});
					start+=frequency;
					if(start >= range.last()) {
						pe.stop(); complete();
					}
				},interval);
			}
			else{
				start=range.last();

				new PeriodicalExecuter(function(pe){
					obj.setStyle({opacity:start});
					start-=frequency;
					if(start <= range.first()) {
						pe.stop();
						if(block && range.first()==0) obj.setStyle({visibility:"hidden"});
						else if(!block && range.first()==0){
							obj.descendants().invoke("hide");
							obj.hide(); 
						}
						complete();
					}
				},interval);
			}
		}
	},

	slideOn: function(obj){
		obj=$(obj);
		var option=Object.extend(
			{interval:0.05, frequency:0.1, direction:"vertical", block:true, complete: function(){}},
			arguments[1] || {}
		);
		var w=obj.getWidth(); var h=obj.getHeight();
		var nw,nh;

		//Container Initialization
		obj.descendants().invoke("hide");
		obj.show();
		if(option.block){
			if(option.direction=="vertical"){ nw=w+"px"; nh=0;}
			if(option.direction=="horizon"){ nw=0; nh=h+"px";}
		}
		else {nw=0; nh=0;}

		obj.setStyle({width:nw, height:nh, visibility:"visible"});
		
		with(option){
			switch(direction){
				case "vertical":
					new PeriodicalExecuter(function(pe){
						nh+=frequency*h
						obj.setStyle({width:w+"px", height:nh+"px"});
						if(obj.getHeight()>=h){
							pe.stop();
							obj.setStyle({width:w+"px", height:h+"px"})
							obj.descendants().invoke("show");
							complete();
						}
					},interval);
				break;

				case "horizon":
					new PeriodicalExecuter(function(pe){
						nw+=frequency*w;
						obj.setStyle({width:nw+"px",height:h+"px"});
						if(obj.getWidth()>=w){
							pe.stop();
							obj.setStyle({width:w+"px", height:h+"px"})
							obj.descendants().invoke("show");
							complete();
						}
					},interval);
				break;

				default: return;
			}
		}
	},

	slideOff: function(obj){
		obj=$(obj);
		var option=Object.extend(
			{interval:0.05, frequency:0.1, direction:"vertical", block:true, complete: function(){}},
			arguments[1] || {}
		);
		var w=obj.getWidth(); var h=obj.getHeight();
		
		//Container Initialization
		obj.setStyle({width:w+"px", height:h+"px", visibility:"visible"});
		obj.descendants().invoke("hide");
		obj.show();

		with(option){
			switch(direction){
				case "horizon":
					new PeriodicalExecuter(function(pe){
						obj.setStyle({
							width:(obj.getWidth()-frequency*w)+"px", height:h+"px"
						});
						if(obj.getWidth()<= 18){
							pe.stop();
							if(block) obj.setStyle({visibility:"hidden"})
							else obj.hide();
							obj.setStyle({width:w+"px", height:h+"px"});
							complete();
						}
					},interval);
				break;

				case "vertical":
					new PeriodicalExecuter(function(pe){
						obj.setStyle({
							width:w+"px", height:(obj.getHeight()-frequency*h)+"px"
						});
						if(obj.getHeight() <= 18){
							pe.stop();
							obj.hide();
							obj.setStyle({width:w+"px", height:h+"px"});
							complete();
						}
					},interval);
				break;

				default: return;
			}
		}
	},
	
	GRMinit: function(){
		GRM.newWin();
	}
}

var GRM=new GRMobj();
Event.observe(window, "load", GRM.GRMinit, false);


//*******************String prototype extend*******************//
var myExp={
	//双字节字符
	pattern_DB	:	/[^\x00-\xff]/g,
	//中文字符
	pattern_CN	:	/[\u4e00-\u9fa5]/,
	//中文字符
	pattern_CN2	:	/^[\u4e00-\u9fa5]$/,
	//数字
	pattern_NB	:	/^\d+$/,
	//浮点数
	pattern_FN	:	/^\d+\.\d+$/,
	//EMAIL
	pattern_EM	:	/^\w(\w*\.*-*)*@([\w-]+\.)+\w{2,4}$/,
	//URL
	pattern_UL	:	/^(http|https|ftp):\/\/.*/,
	//合法日期
	pattern_DT	:	/^(?:([0-9]{4}(-|\.|#)(?:(?:0?[1,3-9]|1[0-2])(-|\.|#)(?:29|30)|((?:0?[13578]|1[02])(-|\.|#)31)))|([0-9]{4}(-|\.|#)(?:0?[1-9]|1[0-2])(-|\.|#)(?:0?[1-9]|1\d|2[0-8]))|(((?:(\d\d(?:0[48]|[2468][048]|[13579][26]))|(?:0[48]00|[2468][048]00|[13579][26]00))(-|\.|#)0?2(-|\.|#)29)))$/
}

if(!document.all) document.all=document.getElementById;

String.prototype.hasCN=function(){
	return myExp.pattern_CN.test(this);
}
String.prototype.isCN=function(){
	return myExp.pattern_CN2.test(this);
}
String.prototype.isInt=function(){
	return myExp.pattern_NB.test(this);
}
String.prototype.isFloat=function(){
	return myExp.pattern_FN.test(this);
}
String.prototype.isEmail=function(){
	return myExp.pattern_EM.test(this);
}
String.prototype.isURL=function(){
	return myExp.pattern_UL.test(this);
}
String.prototype.isDate=function(){//(yyyy.mm.dd || yyyy-mm-dd || yyyy#mm#dd)
	return myExp.pattern_DT.test(this);
}
String.prototype.isLeapYear=function(){
	var curYear=this;
	if(curYear.isInt()) {
		switch(curYear.length){
			case 2:
				curYear=curYear-0+1900;
				if(curYear % 4 ==0 || (curYear % 100 ==0 && curYear % 4 ==0)) return true;
				else return false;
			break;

			case 4:
				if(curYear % 4 ==0 || (curYear % 100 ==0 && curYear % 4 ==0)) return true;
				else return false;
			break;

			default:
				return false;
			break;
		}
	}
	else return false;
}
String.prototype.lenB=function(){
	len=this.replace(myExp.pattern_DB,"aa").length;
	return len;
}
String.prototype.left=function(strNo){
	if(this.length<strNo) return this;
	else return this.substring(0,strNo)
}
String.prototype.cutStr=function(strNo){
	var cutFix	=arguments[1] || "...";
	var strLen	=this.length;
	var tempLen	=0;
	var totle	=strNo;
	var tempStr	="";

	if (strLen<totle/2) tempStr=this;
	else{
		for(i=0;i<strLen;i++){
			tempChr=this.charCodeAt(i);
			tempLen+=1;
			if(tempLen>totle){
				tempStr+=cutFix;
				break;
			}
			if (tempChr<0 || tempChr>255) tempLen++;
			tempStr+=this.charAt(i);
		}
	}
	return tempStr;
}
String.prototype.fillChar=function(lens,fix){
	var tmpFix="";

	if(this.length<lens){
		var fixNo=lens-this.length;
		for(var i=0; i<fixNo; i++) tmpFix+=fix;
		return tmpFix+this
	}
	else return this;
}
String.prototype.isIDCard=function(){
	//var Errors=["验证通过!","身份证号码位数不对!","身份证号码出生日期超出范围或含有非法字符!","身份证号码校验错误!","身份证地区非法!"];
	
	var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};

	var idcard=this;
	var Y,JYM;
	var S,M,yearNo;
	var idcard_array = new Array();
	idcard_array = idcard.split("");
	//地区检验
	if(area[parseInt(idcard.substr(0,2))]==null) return 4;
	//身份号码位数及格式检验
	switch(idcard.length){
		case 15:
			yearNo=parseInt(idcard.substr(6,2))+1900;
			if ((yearNo+"").isLeapYear()){
				ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试生日期的合法性
			} 
			else {
				ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
			}
			if(ereg.test(idcard)) return true;
			else return 2;
		break;

		case 18:
			//18位身份号码检测
			//出生日期的合法性检查 
			yearNo=idcard.substr(6,4);
			if (yearNo.isLeapYear()){//闰年出生日期的合法性正则表达式
				ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;
			} 
			else {//平年出生日期的合法性正则表达式
				ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;
				}
			if(ereg.test(idcard)){//测试出生日期的合法性
				//计算校验位
				S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
				+ (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
				+ (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
				+ (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
				+ (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
				+ (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
				+ (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
				+ parseInt(idcard_array[7]) * 1 
				+ parseInt(idcard_array[8]) * 6
				+ parseInt(idcard_array[9]) * 3 ;
				Y = S % 11;
				M = "F";
				JYM = "10X98765432";
				M = JYM.substr(Y,1);//判断校验位
				if(M == idcard_array[17]) return true; //检测ID的校验位
				else return 3;
			}
			else return 2;
		break;

		default:
			return 1;
		break;
	}
}

Array.prototype.mixArray=function(){return GRM.mixArray(this)};