/**
 *	tr's toolbox
 *
 *@author wangqh
 */
 /**
	 * FF used java console print
	 * 
	 */
 $echo = $print =  function(str){
 	$try($lambda(java.lang.System.out.println(str) ) );
 }
 
 	// 设为首页
	function homepage(obj) {
		      try {
		            obj.style.behavior='url(#default#homepage)';
		            obj.setHomePage(document.location.href); 
		      } catch(e) {
			      if(window.netscape) {
		              try { 
	                       netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); 
	                       var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch); 
	                       prefs.setCharPref('browser.startup.homepage',document.location.href); 
		              } catch (e) {
		                   alert("此操作被浏览器拒绝！请在浏览器地址栏输入“about:config”并回车然后将 [signed.applets.codebase_principal_support]设置为'true'"); 
	                  }
		           } 
		       }
		      return false;
		}
	// 加入收藏
	function favorite(){
			try {
				window.external.addFavorite(document.location.href,document.title);
			} catch(e) {
				 try {
				 	window.sidebar.addPanel(document.title, document.location.href, "");
				 } catch (e) {
				 	showError("此操作被浏览器拒绝！请手动添加到收藏夹。");
				 }
			}
			return false;
		}

		
	
 /**
	 * 帮助创建yge线形图表的y轴最大值 为传入所有数组中最大值+10%
	 */
$y_axis = function(){

	var t = 0;
	for (var i=0; i<arguments.length; i++){
		arguments[i].each(
			function(item, index){
				if (item > t) t = item;
			}
		);
	}
	
	var result = t;
	if (t<10) 
		result = 10;
	else 
		result = t+t*01;
	if ((result -t)<1) result += 10;

	return {
					"steps" : (result/10).toInt(),
				    "max":   result
				 }
}
 
 // 为mozilla系列的浏览器添加一个window.event
if(window.constructor){
	window.constructor.prototype.__defineGetter__("event",__zt_window_get_event);
}

function __zt_window_get_event(){
	var pfunc=__zt_window_get_event.caller;
	while(pfunc!=null){
		var arg0=pfunc.arguments[0];
		if(arg0 && arg0.KEYPRESS==1024){
			return arg0;
		}
		pfunc=pfunc.caller;
	}
	return null;
}

/**
 * 返回事件Element
 */
$eventTarget = function(event){
	if (!event)	event = window.event;
	var target = (event.target)?event.target:event.srcElement;
	return $(target);
}

function trim(text) {
	text = text.replace(/^ +/, "");
	text = text.replace(/ +$/, "");
	return text;
}
 /**
	 * 在每个字后添加一个'8203'已打到换行的效果
	 */
var breakWord = function (str){
 	 var b = String.fromCharCode('8203');
 	 return str.split('').join(b);
 }
 
/**
 * String Extend
 */
String.implement({
	/**
	 * 获得一个String的字节长度
	 */
	getLength : function(){
		 var text=this.replace(/[^\x00-\xff]/g,"**");
		 return text.length;
	},

	replaceAll :  function(AFindText,ARepText){
	  return this.replace(new RegExp(AFindText,"g"),ARepText);
	},
	
	endWith : function(oString){  
	  var   reg=new RegExp(oString+"$");  
	  return   reg.test(this);   
	},
	
	/**
	 * 去掉前后空格
	 */
	trim : function () {
		return this.replace(/(^\s*)|(\s*$)/g, "");
	},
	
	/**
	 * 如果内容超出 length，则缺省显示（加省略号“...”）
	 */
	ellipsis : function (length) {
		if (!length) {
			return "";
		}

		var byteCount = 0;
		var subStr = "";
		var strTrim = this.trim();
		for (var i = 0; i < strTrim.length; i++) {
			var c = strTrim.charAt(i);
			if (/[^\x00-\xff]/.test(c)) { // 匹配双字节
				byteCount += 2;
			} else {
				byteCount ++;
			}
			if (byteCount == length) {
				if (i == strTrim.length - 1) {
					return strTrim;
				} else {
					subStr += c;
					return subStr + "...";
				}
			} else if (byteCount > length) {
				return subStr + "...";
			}
			subStr += c;
		}
		return subStr;
	}
});

/**
 * 赋值给input
 */
var setValue = function(element, value, form){
				
				var e = $(element);
				if (!e){
					
					form = $(form);
					
					var selector = "input[name='"+element+"'],select[name='"+element+"']";
					if (form)	selector= '#'+form.id+' [name='+element+']';
					if (!e)		e = $$(selector);			
				
					if(!e)	return;
					if (e.length>1){// checkbox or radio
						for (var i=0; i<e.length; i++){
							if (e[i].value==value){
								e[i].checked = 'true';
								break;
							}	
						}
					}else{
						if(e[0])
							e[0].value=value;
					}
				}else{
					e.value=value;
				}
			}

/**
 * 获得相同class的checkbox 的Value Array
 */
var getCheckValues = function(className){
		var result = new Array();
		var checkboxs = $$('.'+className); 
		for (var i=0;i<checkboxs.length;i++){
			if (checkboxs[i].checked){
				result[result.length] = checkboxs[i].value;
			}
		}
		return result;
}

/**
 * checkBox 的全选效果
 * 
 * <input type="checkbox" class="chkUser"> <input type="checkbox"
 * class="chkUser"> <input type="checkbox" id="checkAllBtn">
 * 
 * var checks = new CheckBoxs("chkUser", "checkAllBtn"); cs.getValues()
 */
var CheckBoxs =   new Class();
CheckBoxs.prototype = {
	className : "", // checkbox的className
	allBtnId : "",// 全选的id
	
	/**
	 * 初始的时候会为每个checkbox和全选的checkbox设置一个Click事件
	 * 
	 */
	initialize : function(className, allBtnId){  
		this.className = className;
		this.allBtnId = allBtnId;

		var checkboxs = $$('.'+className); 
		var _this = this;		
		for (var i=0;i<checkboxs.length;i++){
			checkboxs[i].onclick = this.check.bind(this);
		}
		$(allBtnId).onclick = this.checkAllBtn.bind(this);
	},
	
	check : function(){
		var checked = 0;
		var checkboxs = $$('.'+this.className); 
		for (var i=0;i<checkboxs.length;i++){
			if (checkboxs[i].checked){
				checked++;
			}
		}
		
		if (checked ==checkboxs.length){
			$(this.allBtnId).checked = true;
		}else{
			$(this.allBtnId).checked = false;
		}
	},
	
	/**
	 * 全选事件
	 */
	checkAllBtn : function(){		
		if ($(this.allBtnId).checked){
			this.checkAll();
		}else {
			this.clearAll();
		}
	},

	/**
	 * 全选
	 */
	checkAll : function(){
		var checked = 0;
		var checkboxs = $$('.'+this.className); 

		for (var i=0;i<checkboxs.length;i++){
			if (!checkboxs[i].checked){
				checkboxs[i].checked=true;
			}else{
				checked++;
			}
		}
		if (checked != checkboxs.length){
			$(this.allBtnId).checked = true;
		}else{
			this.clearAll();
		}
	},
	
	/**
	 * 清除选择
	 */
	clearAll : function (checkboxs){
		var checkboxs = $$('.'+this.className); 
		for (var i=0;i<checkboxs.length;i++){
			checkboxs[i].checked=false;
		}
		$(this.allBtnId).checked = false;
	},
	
	/**
	 * 得到选中的选项
	 */
	getValues : function(){
		var result = getCheckValues(this.className);
		return result;
	},

	toString : function(){
		return "i am a Checkboxer"
	}
}

/**
 * 页面中的图表
 */
var charts =[];
/**
 * 当flash加载完成后将调用
 */
function ofc_ready(id){
	if (Browser.Engine.gecko) {
		// firefox 下延迟处理 TODO
		charts[id].load.delay(500, charts[id], id);
	} else {
		charts[id].load(id);
	}
}

/**
 * 图表的创建和显示 base by swfobejct.js
 */
var Chart = new Class();
Chart.prototype = {
	id : "",
	flash : null,
	swf : "../media/open-flash-chart.swf?r=" + Math.random(),// swf文件路径
	div : "", // 图表显示的div
	width : 600,
	heigth : 300,
	chart : {},
	status: "", 

	initialize : function(id, div, width, heigth, chart){  
		  this.id = id;
		  this.div = div;
	      this.width=width;   
		  this.heigth = heigth;
		  this.chart = chart;
		  charts[id] = this;
			/*
			 * this.flash = new Swiff(this.swf, { id: id, width: width, height:
			 * heigth, vars: {id: id } }); this.flash.inject(div);
			 */
		  this.flash = new SWFObject(this.swf, this.id, this.width, this.heigth, "8", "#FFFFFF");
		  this.flash.addVariable("id", this.id);
		  this.flash.addParam("wmode", "opaque");
		  this.flash.write(this.div);
	},	
	
	/**
	 * 载入数据到flash，数据是指初始话Chart对象是传入的数据
	 */
	load : function(id){ 
		this.status = "loaded";
		var flashObject = this.findSWF(id);
		if(null == this.chart || this.chart.length <= 0)
		{
			return false;
		}
		flashObject.load(JSON.encode(this.chart));
	},

	/**
	 * get flashOjbect
	 */
	findSWF : function (movieName) {
	  if (navigator.appName.indexOf("Microsoft")!= -1) {
		return document[movieName];
	  } else {
		return document[movieName];
	  }
	},
	
	/**
	 * 装载数据到flash，可以ajax装载
	 */
	loadData : function(data){ 
		var flashObject = this.findSWF(this.id);
		if(null == data || data.length <= 0) {
			return false;
		}
		if (this.status == "loaded") {
			var string = JSON.encode(data);
			flashObject.load(string);
		} else {
			this.chart = data;
		}
	}
};

/**
 * 无分页的查询使用 会将上次的查询条件再反射到当前页面中 e.g new Query("queryForm"); //just easy
 */
var Query = new Class();
Query.prototype = {
	oldQueryString : "", // 上次的query条件 e.g id=223&name=何志武
	form :  null, // 查询表单
	
	initialize : function(form, queryString){  
		
		this.form = $(form);
		this.oldQueryString = queryString;
		this.form.onsubmit = this.query.bind(this);
		
		this.setValues(queryString);
	},
	
	query : function(){
	
		var queryString = this.form.toQueryString();
		this.addQueryStringElement(queryString);
		
		return true;
	},
	
	addQueryStringElement : function(queryString){
		if (!this.form['queryString']){
			var queryElement  = new Element('input', {name: 'queryString', type:"hidden"});
			queryElement.inject(this.form);
		}
		this.form['queryString'].value = queryString;
	},
	
	setValues : function(){
		if (this.oldQueryString.length<=0) return ;
		
		var values = this.oldQueryString.split('&');
		for (var i=0; i<values.length; i++){
			var v = values[i].split("=");
			setValue(v[0], decodeURIComponent(v[1]), this.form);
		}
	}
}

/**
 * 有分页的查询使用 e.g 'query', ${pageBean.queryString}, ${pageBean.currentPage},
 * ${pageBean.totalPage}
 */
var PageQuery = new Class({

	Extends: Query,

	lastPage : 1,  // 尾页
	nowPage : 1, // 当前页面
	toPage: 1,// 要跳转的页面
	order:"webname",
	seq:"asc",
	initialize : function(form, queryString, nowPage, lastPage){  	
		this.nowPage = nowPage;
		this.lastPage = lastPage;	
		
		this.parent(form, queryString);
	},
	
	query : function(){
		
		var queryString = this.form.toQueryString();
	
		if (this.oldQueryString != queryString) this.toPage = 1;
		this.addQueryStringElement(queryString);
				
		this.form.action += (this.form.action.indexOf('?')?"&":"?")+"page="+this.toPage+"&order="+this.order+"&seq="+this.seq;			
	},
	
	setOrder : function(order,seq){
		this.order = order;
		this.seq = seq;
	},
	
	go : function(){
		this.query();
		this.form.submit();
	},
	
	go2First : function(){
		if (this.nowPage > 1){
			this.toPage = 1;
			this.go();
		}
	},

	go2Prov : function(){
		if (this.nowPage >1){
			this.toPage = --this.nowPage;
			this.go();
		}
	},
		
	go2Next : function(){
		if (this.nowPage < this.lastPage){
			this.toPage = ++this.nowPage;
			this.go();			
		}
	},
	
	go2Last : function(){
		if (this.nowPage < this.lastPage){
			this.toPage = this.lastPage;
			this.go();		
		}
	},
	
	go2page: function(num){
		if ( $type(num-0)!="number" || num<1 || num>this.lastPage)	return ;

		this.toPage = num;
		this.go();		
	},
	
	goByOrder : function(order){
		if(order == this.order){
			if(this.seq == "desc")
				this.seq = "asc";
			else
				this.seq = "desc";	
		}else{
			this.toPage = 1
			this.seq = "asc"
		}
			
		this.order = order;
		this.go();
	}
});

/**
 * 用window.name 实现的cache 由于用globalStorage和user behavior的话 还要对会数据进行管理，维护，比较头疼
 * window.name 来cache 缺点是不能跨窗体和 窗体关闭后就失效，但没有维护的成本
 * 
 * 还不完善，对性能有更高要求时再扩展
 * 
 * 写入到window.name 经过了 JSON.encode 和 encodeURIComponent
 * 读出的时候要经过decodeURIComponent 和 JSON.decode
 * 
 * window.addEvent('domready', function() { Cache.load();
 * Cache.set("2008-11-12-pv", jsonData); var pvDate= Cache.get("2008-11-12-pv");
 * });
 * 
 */
var Cache = function(){

	var maxLength = 1000*3000; // 最大允许写入的限制
	var data = $H();// 存放数据的hash
	
	var loaded = false; // 标志是否初始
 	return {
		
		/**
		 * 将数据从window.name载入到data
		 */
		load : function(){
			if (loaded) return ; 
			loaded = true;

			if (window.name.length >0){
				var vs = window.name.split(",");
				for (var i=0; i<vs.length; i++ ){
					var m = vs[i].split("=");
					data.set(m[0], JSON.decode(decodeURIComponent(m[1])));
				}						 
			}
		},
		
		/**
		 * 写入到window.name
		 */
		add2windowname : function(key, value){
			if (window.name.length>= 1000*3000) return;
			key = encodeURIComponent(key);
			value = encodeURIComponent(JSON.encode(value));
			
			window.name += (window.name.length>0?",":"") +key + "="+value;
		},

		get : function(key){
			return data.get(key);
		},
		
		set : function(key, value){
			data.set(key, value);
			this.add2windowname(key, value);
		},
		
		remove : function(key){
			data.erase(key);
		},
		
		clear : function(){
			data.empty();
			window.name = "";	
		}
	}
}();

/**
 * 为 class 为 dataTable的table注入特效 onmouseover 事件时 高亮tr e.g
 * setTableStyle('tableClass') // 这样也可以给别的table添加效果
 */	 
var setTableStyle = function(className){
	var trClassName = "tr_tr_on";

	if (!className) className = "dataTable";	
	var tables = $$("."+className);

	tables.each (function(t){
		var trs = t.getElement("tbody").getElements("tr");	
		trs.each( function(el){
			el.onmouseover = function(){
				el.className = trClassName;
			};

			el.onmouseout = function(){
				el.className = "";
			};	
		});	
	});
};

/**
 * 对比功能
 */
var Comparor = new Class();
Comparor.prototype = {
	
	action : "compar.do?method=to&siteid=",
	eventButton : "comparButton", // 事件触发的按钮
	checkClass : "comparCheck", // 比较项目的class
	type : 0,// 比较类型
	limitNum : 4,// 限制比较项
	dayNum : 60,// 比较的最近天数
	
	/**
	 * eventBtn 事件触发的按钮 checkClass 比较项目的class type 比较类型 1 : // 时段流量 2: // 月 3 : //
	 * 来访 4: // 受访 5: // 终端类型 6: // browser 7: // 安装软件 8: // 分辨率 limitNum 限制比较项
	 * dayNum 比较的最近天数
	 */
	initialize : function(siteId, type, eventButton, checkClass, limitNum, dayNum){  
		if (eventButton)	 this.eventButton = eventButton;
		if (checkClass)	 this.checkClass = checkClass;
		if (limitNum)	 this.limitNum = limitNum;
		if (dayNum)	 this.dayNum = dayNum;
		if (type<0 || type > 8)	return;
		this.type = type;
		this.action += siteId+"&type="+this.type+"&dayNum="+this.dayNum;

		this.addEvent();
	},
	
	addEvent : function(){
		if($(this.eventButton))	$(this.eventButton).onclick = this.compar.bind(this);
	},

	/**
	 * 比较数据
	 */
	compar : function (){

		var result = getCheckValues(this.checkClass);

		if (result.length > this.limitNum){
			showMessage("很抱歉，只能选择"+ this.limitNum+"个选项进行比较");	
			return false;
		}else if (result.length < 1){
			showMessage("请选择选项后再进行比较");	
			return false;
		}

		this.action += "&values="+encodeURIComponent(result);
		window.location.href = this.action;
	}
}

/**
 * 一个可以多级关联列表控件(select)的类 这是基础抽象类,使用方法见City类
 * 
 * 调用约定: 1.继承该类的时候,子类需要提供三个变量:ids,names,upperids,它们都是数组,且长度相同,一一对应
 * 2,如果一条记录的upperid是-1,它处于是顶级 3.在从树顶到每一片树叶的长度是相等的
 */
var Interlock=new Class();
Interlock.prototype={
	ids:[],
	names:[],
	upperids:[],
	controls:[],
	default_ids:[],
	initialize:function(value){
		// 构造函数，注意，页面的encoding要对，不然默认iso***，传进一堆乱码
		if(typeof(value)!="undefined"){
			this.default_ids=this.get_path(value);
		}
	},
	findCity:function(id){
		for(i=0; i<this.ids.length; i++){	
			if(this.ids[i] == id){
				return this.names[i];
			}
		}
	},
	findUpCity:function(id){
		var theId = 0;
		for(i=0; i<this.ids.length; i++){	
			if(this.ids[i] == id){
				theId = this.upperids[i];
				if (this.names[theId] == undefined)
					return this.names[i];
				else 
					return this.names[theId];
				
			}
		}
	},
	get_path:function(value){
		var wanted_id=-1;
		var upper_id;
		
		// 如果传入字符串,找出对应的ID
		if(typeof(value)=="number" || typeof(value)=="string"){
			wanted_id=value;
		}else{
			for(var i=0;i<this.ids.length;i++){
				if(this.names[i]==value){
					wanted_id=this.ids[i];
					upper_id=this.upperids[i];
					break;
				}
			}
		}
		if(wanted_id==-1){
			return [];
		}	
		// 说不定刚才的循环已经找过了,不必再来一次

		if(typeof(upper_id)=="undefined"){
			for(var i=0;i<this.ids.length;i++){
				if(this.ids[i]==wanted_id){
					upper_id=this.upperids[i];
					break;
				}
			}
		}
		var results=this.get_path(upper_id);
		results.push(wanted_id);
		return results;
	},
	attach:function(){
		this.controls.empty();

		for(var i=0;i<arguments.length;i++){
			this.controls.push($(arguments[i]));
		}
		for(var i=0;i<this.controls.length-1;i++){
			$(this.controls[i]).addEvent('change', this.update(i+1));

		}
		
		this.update(0)();
	},
	attach1:function(){
		this.controls.empty();

		for(var i=0;i<arguments.length;i++){
			this.controls.push($(arguments[i]));
		}
		for(var i=0;i<this.controls.length-1;i++){
			$(this.controls[i]).addEvent('change', this.update1(i+1,this.controls[i],this.controls[i+1]));
		}
		
		this.update(0)();
	},
	detach:function(){
		// 从监听的控件上分离

		for(var i=0;i<this.controls.length-1;i++){
			Event.stopObserving(this.province_control,"change",this.update(i),false);
		}
	},
	update1:function(level,object0,object1){
		return function(){
			$A(object1.options).each(function(op){object1.removeChild(op);}.bind(this));

			var upperid;
			if(level==0){
				upperid=-1;
			}else{
				upperid=object0.options[object0.selectedIndex].value;
			}

			var selected=0;
			for(var i=0;i<this.ids.length;i++){
				if(this.upperids[i]==upperid){
					object1.appendChild(this.createOption(this.names[i],this.ids[i]));
					if(this.ids[i]==this.default_ids[level]){
						selected=object1.options.length-1;	
						// break;
					}
				}
			}

			object1.selectedIndex=selected;
			if(level<this.controls.length-1) this.update(level+1)();
		}.bind(this);
	},
	update:function(level){
		return function(){
			$A(this.controls[level].options).each(function(op){this.controls[level].removeChild(op);}.bind(this));

			var upperid;
			if(level==0){
				upperid=-1;
			}else{
				upperid=this.controls[level-1].options[this.controls[level-1].selectedIndex].value;
			}

			var selected=0;
			for(var i=0;i<this.ids.length;i++){
				if(this.upperids[i]==upperid){
					this.controls[level].appendChild(this.createOption(this.names[i],this.ids[i]));
					if(this.ids[i]==this.default_ids[level]){
						selected=this.controls[level].options.length-1;	
						// break;
					}
				}
			}

			this.controls[level].selectedIndex=selected;
			if(level<this.controls.length-1) this.update(level+1)();// ????????????????
			
		}.bind(this);
	},
	show:function(value){
		this.default_ids=this.get_path(value);
		for(var i=0;i<this.controls.length;i++){
			this.update(i)();
		}
	},
	createOption:function(caption,value){
		// 好像new Option(caption,value)这个也可以？
		var option=document.createElement("option");
		option.appendChild(document.createTextNode(caption));
		option.setAttribute("value",value);
		return option;
	},
	showcitys:function(cityid){
		var upid = this.upperids[cityid];
		$A(this.controls[1].options).each(function(op){this.controls[1].removeChild(op);}.bind(this));
		for(var i=0;i<this.ids.length;i++){
		    if(this.upperids[i]==upid){
				this.controls[1].appendChild(this.createOption(this.names[i],this.ids[i]));
			}
		}
	}
};

/**
 * City使用实例(建议把javascript代码放到executeAfterLoaded里，和其他javascript代码一起放到页面头部，便于管理):
 * 
 * <select id="prov"/><select id="city"/> <script type="text/javascript"> var
 * city=new City("北京市"); // var city=new City(204); //也可以用城市id
 * city.attach("prov","city");
 */
var City = new Class({

	Extends: Interlock,
	ids:new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,180,181,182,183,184,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,241,242,243,244,245,248,249,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,279,280,281,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,309,312,313,314,315,316,317,318,319,320,321,323,324,325,326,329,330,332,333,334,336,337,341,342,343,344,346,347,348,349,350,351,352,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,377,378,379,380,385,386,387,388,389,390,391,392,393,394,395,397,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,423,425,426,427,428,430,431,432,433,436,437,438,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460),
	names:new Array("请选择省份","安徽","北京","福建","甘肃","台湾","广东","广西","贵州","海南","河北","河南","黑龙江","湖北","湖南","吉林","江苏","江西","辽宁","内蒙古","宁夏","青海","山东","山西","陕西","上海","四川","天津","西藏","新疆","云南","浙江","重庆","滁州","合肥","蚌埠","芜湖","淮南","马鞍山","安庆","宿州","阜阳","黄山","淮北","铜陵","宣城","六安","巢湖","贵池","北京市","福州","厦门","宁德","莆田","泉州","漳州","龙岩","三明","南平","临夏","兰州","定西","平凉","金昌","张掖","酒泉","天水","武威","甘南","白银","香港","澳门","台湾","广州","汕尾","潮阳","阳江","揭阳","茂名","江门","韶关","惠州","梅州","汕头","深圳","珠海","佛山","肇庆","湛江","中山","河源","清远","顺德","云浮","潮州","东莞","防城港","南宁","柳州","桂林","梧州","玉林","百色","钦州","河池","北海","贵阳","遵义","安顺","铜仁","毕节","六盘水","儋州","海口","三亚","邯郸","石家庄","保定","张家口","承德","唐山","廊坊","沧州","衡水","邢台","秦皇岛","商丘","郑州","安阳","新乡","许昌","平顶山","信阳","南阳","开封","洛阳","焦作","鹤壁","濮阳","周口","漯河","驻马店","潢州","三门峡","哈尔滨","齐齐哈尔","牡丹江","佳木斯","绥化","黑河","伊春","大庆","武汉","襄樊","鄂州","孝感","黄冈","黄石","咸宁","荆州","宜昌","恩施","十堰","随州","荆门","长沙","湘潭","株州","衡阳","郴州","常德","益阳","娄底","邵阳","张家界","怀化","永州","长春","吉林市","四平","通化","白城","辽源","松原","白山","珲春","梅河口","南京","无锡","镇江","苏州","南通","扬州","盐城","徐州","连云港","常州","鹰潭","新余","南昌","九江","上饶","抚州","宜春","吉安","赣州","景德镇","萍乡","沈阳","铁岭","大连","鞍山","抚顺","本溪","丹东","锦州","营口","阜新","辽阳","朝阳","盘锦","葫芦岛","海拉尔","呼和浩特","包头","乌海","乌兰察布(集宁)","通辽","赤峰","阿拉善左旗","银川","石嘴山","吴忠","固原","西宁","海东地区","荷泽","济南","青岛","淄博","德州","烟台","潍坊","济宁","泰安","临沂","滨州","东营","威海","枣庄","日照","莱芜","聊城","朔州","忻州","太原","大同","阳泉","长治","晋城","临汾","运城","西安","咸阳","延安","榆林","渭南","商洛","安康","汉中","宝鸡","铜川","上海市","成都","攀枝花","自贡","绵阳","南充","达州","遂宁","广安","巴中","泸州","宜宾","内江","乐山","雅安","德阳","广元","天津市","拉萨市","日喀则地区","山南地区","林芝地区","昌都地区","那曲地区","阿里地区","塔城","哈密","和田","阿勒泰","克拉玛依","乌鲁木齐","石河子","昌吉","吐鲁番","阿克苏","喀什","昭通","东川","昆明","大理州(市)","曲靖","保山","文山州(市)","玉溪","楚雄州(市)","思茅","临沧","丽江","衢州","杭州","湖州","嘉兴","宁波","绍兴","台州","温州","丽水","金华","舟山","重庆市","亳州","池州","庆阳","嘉峪关","陇南","贺州","来宾","贵港","崇左","黔东南(凯里市)","黔南(都匀市,福泉市)","济源","鸡西","双鸭山","鹤岗","七台河","大兴安岭(加格达奇)","天门","潜江","仙桃","岳阳","湘西土家族苗族自治州","延边(延吉)","淮安","宿迁","泰州","巴彦淖尔","锡林郭勒盟","兴安盟","鄂尔多斯","呼伦贝尔","海北州(海晏,门源)","黄南州(同仁)","海南州(共和)","果洛州(玛沁)","海西州(德令哈,格尔木)","玉树州(玉树)","吕梁","晋中","商洛","眉山","资阳","甘孜州(康定)","凉山州(西昌)","红河州(个旧)","西双版纳(景洪)","德宏州(潞西)","怒江州(六库)","迪庆州(中甸)","伊犁(伊宁,奎屯)","克孜勒苏(阿图什)","巴音郭楞(库尔勒)","博尔塔拉(博乐)","中卫","阿坝州(马尔康)","黔西南(兴义市)","五指山","琼海","澄迈","文昌","万宁","定安","屯昌","临高","白沙","昌江","东方","乐东","陵水","保亭","琼中","香港","澳门","请选择城市"),
	upperids:new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,458,459,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,9,9,9,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20,20,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,30,30,30,30,30,31,31,31,31,31,31,31,31,31,31,31,32,1,1,4,4,4,7,7,7,7,8,8,11,12,12,12,12,12,13,13,13,14,14,15,16,16,16,19,19,19,19,19,21,21,21,21,21,21,23,23,24,26,26,26,26,30,30,30,30,30,29,29,29,29,20,26,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,-1,-1,0),
	controls:[],
	default_ids:[]
});
/**
 * <select id="webtype"/> <script type="text/javascript"> var webtype = new
 * WebType(); webtype.showType("webtype")
 * 
 */
var WebType = new Class({
	ids:new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15),
	names:new Array("请选择","休闲娱乐","电脑网络","文学艺术","新闻媒体","商业经济","教育培训","卫生健康","文化科学","体育健身","旅游交通","地方热线","生活服务","参考资料","行业网站","其他类别"),
	control:[],
	default_id:0,
	initialize:function(value){
		// 构造函数，注意，页面的encoding要对，不然默认iso***，传进一堆乱码
		if(typeof(value)!="undefined"){
			this.default_id= value;
		}
	},
	createOption:function(caption,value){
		// 好像new Option(caption,value)这个也可以？
		var option=document.createElement("option");
		option.appendChild(document.createTextNode(caption));
		option.setAttribute("value",value);
		return option;
	},
	showType:function(){
		this.control[0] = $(arguments[0]);
		for(var i=0;i<this.ids.length;i++){
			this.control[0].appendChild(this.createOption(this.names[i],this.ids[i]));
		}
		this.control[0].selectedIndex=this.default_id;
	},
	getType:function(){
		var id = arguments[0];
		return this.names[id];
	}
}

);
		// 校验用户输入的日期字符串
		function isDate(str){  
  			if(!str.match(/^\d{4}\-\d\d?\-\d\d?$/)){return false;}  
 			var ar=str.replace(/\-0/g,"-").split("-");  
  			ar=new Array(parseInt(ar[0]),parseInt(ar[1])-1,parseInt(ar[2]));  
			var d=new Date(ar[0],ar[1],ar[2]);
  			return d.getFullYear()==ar[0] && d.getMonth()==ar[1] && d.getDate()==ar[2];  
  		} 
  
		// 获取今天的时间包括小时 格式2008-12-12-12
		function getTodayHoursTime()
		{
			var now = new Date();
			var year = now.getFullYear();
			var month = now.getMonth() + 1;
			if(month < 10) month = '0' + month;
			
			var date = now.getDate();
			if(date < 10) date = '0' + date;
			
			var hours = now.getHours();
			return year + '-' + month + '-' + date + '-' + hours;
		}
		
		// 时间转换 格式2008-12-12
		function getDayTime(date)
		{
		
			var year = date.getFullYear();
			var month = date.getMonth() + 1;
			if(month < 10) month = '0' + month;
			
			var date = date.getDate();
			if(date < 10) date = '0' + date;
			
			return year + '-' + month + '-' + date;
		}
		
		// 获取今天的时间 格式2008-12-12
		function getTodayTime()
		{
			var now = new Date();
			var year = now.getFullYear();
			var month = now.getMonth() + 1;
			if(month < 10) month = '0' + month;
			
			var date = now.getDate();
			if(date < 10) date = '0' + date;
			
			return year + '-' + month + '-' + date;
		}
		// 获取昨天的时间 格式2008-12-12
		function getYesterdayTime()
		{
			var yesterday = new Date(new Date()-1000*60*60*24); 
			var year = yesterday.getFullYear();
			
			var month = yesterday.getMonth() + 1;
			if(month < 10) month = '0' + month;
			
			var date = yesterday.getDate();
			if(date < 10) date = '0' + date;
			
			return year + '-' + month + '-' + date;
		}
		
		// 获取当月的时间 格式2008-12
		function getThisMonthTime()
		{
			var today = new Date(); 
			var year = today.getFullYear();
			var month = today.getMonth() + 1;
			if(month < 10) month = '0' + month;
			
			return year + '-' + month
		}
		// 获取当前的年份 格式2009
		function getThisYearTime(){
			var today = new Date();
			return today.getFullYear();
		}
		
		// 获取上周本日的时间 格式2008-12-12
		function getLastWeekToday()
		{
			var lastWeekToday = new Date().getTime() - (7 * 24 * 60 *60 * 1000);
			var last = new Date(lastWeekToday);
			return getDayTime(last);
		}
		function showOneWeek(){
			var str = "";
			for(var i=0;i<7;i++){
				var yesterday = new Date(new Date()-1000*60*60*24*i); 
				var year = yesterday.getFullYear();
				var month = yesterday.getMonth() + 1;
				var date = yesterday.getDate();
				if(date < 10){
					date = "0"+date;
				}
				if(month < 10)
				  month = "0"+month;
				var tt = year + '-' + month + '-' + date;
				str +="<option value='"+tt+"'>"+tt+"</option>";
			}
			document.write(str);
		}
		// 获取上月本日的时间 格式2008-12-12
		function getLastMonthToday()
		{
			var lastMonthToday = new Date();
			lastMonthToday.setMonth(lastMonthToday.getMonth()-1);
			return getDayTime(lastMonthToday);
		}
		function showYear(){
			var flag='';
			var myDate = new Date(); 
			var yyy =  myDate.getFullYear();
			var yyyy = 2008;
			document.write ("<option "+flag+" value='' ></option>");
			for(i=yyy;i>=yyyy;i--){
				document.write ("<option "+flag+" value='"+i+"' >"+i+"</option>");
			}
		}
		function showMonth(){
				  	
					var myDate = new Date(); 
					var flag='';
					var tmp_date='';
				 	var yyy =  myDate.getFullYear();   // 获取完整的年份(4位,1970-????)
					var yyyy = yyy-1;
  					var mmm =  myDate.getMonth()+1; 
  					
  					document.write ("<option "+flag+" value='' ></option>");
					for (i=mmm;i>=1;i--){
						if (i<10){
							tmp_date=yyy+"-0"+i;
							document.write ("<option "+flag+" value='"+yyy+"-0"+i+"' >"+yyy+"-0"+i+"</option>");
						}else{	
							tmp_date=yyy+"-"+i;
							document.write ("<option "+flag+" value='"+yyy+"-"+i+"' >"+yyy+"-"+i+"</option>");
							}
						}
						
						for (j=12;j>=1;j--){
							if (j<10){
								tmp_date=yyyy+"-0"+j;
								document.write ("<option "+flag+" value='"+yyyy+"-0"+j+"'>"+yyyy+"-0"+j+"</option>");
							}else{	
									tmp_date=yyyy+"-"+j;
									document.write ("<option "+flag+" value='"+yyyy+"-"+j+"' >"+yyyy+"-"+j+"</option>");
								}
							}
							
		}
		
		// 判断url格式是否正确
		function isURL(str)
			{
				return (str.match(/^([hH]{1}[tT]{2}[pP]{1}:\/\/)?(([0-9a-zA-Z-_]+)\.)+[0-9a-zA-Z-_]+\/?(\/[A-Za-z0-9-_]+)*(\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+)?$/g) != null);
			} 
			
/**
 * 将一个div设置为浮动 div 中 class为close的按钮或者连接将被设置为关闭按钮 可以在 onClose 中设置关闭时要执行的事件
 */
var FlowDiv = new Class();
FlowDiv.prototype = {
	
	content : null, // 显示的内容Div
	contentClass : "tr_suspension",
	cover : null, // 遮盖页面内容的iframe
	coverClass : "forbidbg", 
	closeClass : "close",
	needCover : "",
	
	initialize:function(divId){
		this.content = $(divId);
		
		if (!this.content.hasClass(this.contentClass)) 
			this.content.addClass(this.contentClass);
		
		var _this = this;
		this.content.getElements("."+this.closeClass).each(function(el){
			el.onclick=_this.close.bind(_this);
		});
		
		this.content.inject($(document.body));
		
		var coverId = divId+"Cover";
		this.cover = $(coverId);
		if (!this.cover)	this.createCover(coverId);
		
		this.setEscEvent();
	},

	/**
	 * 关闭 flow div
	 */
	close : function(){
		if (!this.onClose()) return;
		
		this.content.setStyle('display', 'none');
		this.cover.setStyle('display', 'none');
	},
	
	/**
	 * 关闭时执行的方法 return false 关闭方法将不被执行
	 */
	onClose : function(){
		return true;
	},

	/**
	 * 显示
	 */
	show : function(){
		this.content.setStyle('display', '');
		this.setTop();
		this.setLeft();
		this.setFocus();
		
		this.cover.style.height = $(document.body).getScrollSize().y+"px";
		this.cover.setStyle('display', '');
		
		this.setEscEvent();
	},
	
	/**
	 * 设置Esc关闭事件
	 */
	setEscEvent : function(){
		var _this = this;
		$(document).addEvent('keypress', function(event){
			if (event.key == "esc")	_this.close();
		});
		
	},
	
	/**
	 * set style.top
	 */
	setTop : function(){
		var top = (document.documentElement.clientHeight - this.content.getSize().y) / 3 + $(document.body).getScroll().y;
		this.content.style.top = top +"px";
	},

	/**
	 * set style.left default center
	 */
	setLeft : function(){
		this.content.style.left =
			(document.body.clientWidth/2-this.content.getSize().x/2)+"px";
	},
	
	setFocus : function(){
		this.content.getElement("."+this.closeClass).focus();
	},
	
	/**
	 * 创建遮盖页面内容的iframe
	 */ 
	createCover : function(coverId){
		this.cover = new Element("iframe", 
					{"id" : coverId,
					 "class": this.coverClass,
					 "frameborder" : 0,
					 'styles': {'display': 'none'}
					});
		this.cover.inject($(this.content), 'before');
	},
	
	toString : function(){
		return "i am a flowdiv";
	}
}

/**
 * 为url提供详细的信息可能
 * 
 */
var UrlDetail = new Class();
UrlDetail.prototype = {
	
	className : "urlDetail",
	siteId : 0,
	
	initialize : function(className, siteId){
		if (!className) this.className = className;	
		
		this.siteId = siteId;
		this.addEvent();
		
		this.setCloseEvent();
	},
	
	/**
	 * document.body其他部位被点击的时候关闭div
	 */
	setCloseEvent : function(){
		var _this = this;
		document.body.onclick = function(){
			var target = $eventTarget();

			if ( $(target).hasClass("urlDetail"))	return;
	
			if ($(target).id && $(target).id=="urlDetail") return;
			
			if ($('urlDetail') &&  !$('urlDetail').hasChild($(target)) )	 detailDiv.close(); 				
			
		}
	},
	
	/**
	 * 鼠标滑到到连接时，显示div
	 */
	addEvent : function(){
		var _this = this;
		$$("a."+this.className).each(function(el){		
			el.onmouseover = _this.showUrlDetail.bind(_this);				
		});
	},
	
	/**
	 * 从server加载信息到div中
	 */
	showUrlDetail : function(){ 
		var url = $eventTarget().title;

		if (url.trim()=="" || url=="&nbsp;")		return false;
			
		var urlDetailDiv = $("urlDetail");

		if (!urlDetailDiv){
			urlDetailDiv = new Element("div", {id: "urlDetail", styles:{'display':'none'}});
			urlDetailDiv.inject(  $(document.body)	);
		}

		urlDetailDiv.set("html","<div class='tr_col_02'>"+
					"<div class='tr_nav_small_02'>"+
					"<button id='closeUrl' type='button' class='close'><img src='../../images/site/tr_close.jpg' /></button></div>"+
					"<div class='tr_lim'>数据加载中</div></div>");
								
		urlDetailDiv.set('load', {
			onComplete : function(){
				$('closeUrl').onclick =detailDiv.close.bind(detailDiv);
				// 设置显示的url长度 其实这不是个好的实现
				setMiniUrl("detail_url", 40);
				setMiniUrl("detail_url1", 17);
			}
		});				
		
		detailDiv =new FlowDiv(urlDetailDiv);	
		urlDetailDiv.load("urlDetail.do?method=show&siteid="+this.siteId+"&url="+encodeURIComponent(url));
		
		// 设置在链接的位置显示div
		detailDiv.setTop = function(){
			detailDiv.content.style.top = ($eventTarget().getPosition().y+33)+"px";
		};		
		// 不显示遮盖页面的iframe
		detailDiv.show = function(){
			this.setTop();
			this.content.setStyle('display', '');
			this.setLeft();
		};
		detailDiv.show();
		
		return false;
	}	
}


	// Cache control
		function inCache(k){
			var t = k + siteid + key;
			return (Cache.get(t) != null);
		}
		
		function save2Cache(k,data){
			var t = k + siteid + key;
			Cache.set(t,data);
		}
		
		function getCache(k){
			var t = k + siteid + key;
			return Cache.get(t);
		}
		
		
/**
 * 显示历史记录 href : href siteId : siteId type : 类型 1: 搜索引擎 2: 搜索关键词 3: // 来访域名 4: //
 * 受访域名 5: // 地区分布 6: // 终端类型 7: // 浏览器 8: // 安装软件 9: // 分辨率 10: // 接入商 value :
 * 类型的值
 */
var showHistoryData = function(href, siteId, type, value){
		
		var url = "historyData.do?method=list&siteid="+siteId+"&type="+
			+type+"&value="+encodeURIComponent(value);
		href.href= url;
		href.target= "_blank";
		
		return true;
	}
		
var dialog = null;
/**
 * 就是一个alert
 */
var showMessage = function(message, className){
	
	if (!className)	className = "warnning";
	
	// 美工没有按照约定来做，导致的新产物
	var img = 
		(className=="warnning" || className=="error")?"tr_failure":"tr_success";
	
	dialogDiv = $('dialog');
	if (!dialogDiv){
		dialogDiv = new Element('div', {
				id : 'dialog',
				'class' : 'tr_message',
				'styles': {
				'width':'30%',
				'display': 'none'}
				}
			);
		dialogDiv.set('html', 
				'<label>提示信息</label>'+
					'<table width="100%" border="0" cellspacing="0" cellpadding="0">'+
						'<tr>'+
							'<td align="right" valign="middle"><img id="message_img"/></td>'+
							'<td align="left" valign="middle" id="showMessage"></td>'+
						'</tr>'+
				  	'</table>'+
					'<div><button class="close" style="color:black;" type="button" id="closeButton">确 定</button></div>');
				
		dialogDiv.inject($(document.body));
	}
	$('showMessage').set("html", message);
	$('message_img').src = "../../images/pub/"+img+".gif";
	if (dialog == null)	dialog = new FlowDiv('dialog');
	dialog.show();
}

/**
 * 显示系统返回的信息提示 将上次的值再填充到input中
 */
var messageHandler = {
			
			values : [],
			errors : "",
			CACHE_KEY : "_MESSAGE_CACHE",
			id : "_MESSAGE_ID",
			
			handle : function(messages) {
				if(!messages) return;
				
				Cache.load();
				var ids = Cache.get(this.CACHE_KEY);
				if (ids==null) ids="";
				
				var isShowed = false;
				var id =messages[this.id];
					
				for (var m in messages){
					if (!/^_/.test(m)){
						this.errors += "<p>" + messages[m] + "</p>";
					}
				}

				if (this.errors.length >0){
					for (var m in messages){
						if (/^_(.+)/.test(m)){
							if (m == this.id) continue;
							setValue(RegExp.$1, messages[m]);
						}
					}
							
					if (ids.indexOf(id)==-1){
						showMessage(this.errors);
						ids += id+",";
						Cache.set(this.CACHE_KEY, ids);
					}
				}
				
				
			}
		}

/**
 * 显示成功信息
 */
var successHandler = {
	handle : function(message){
		if(!message)return;
		showMessage(message,"success");
	}
}		

		
/**
 * 菜单效果实现 先不实现复杂的效果
 */
Menu = {
	
	ul : "menu",
	
	addEffect : function(){
		
		if(!$(this.ul)) return ;

		var menu = $(this.ul);
		var es =  menu.getElements("ul");
		es.each(function(el){	
			// el.style.display = "none";
			var a = el.getPrevious("a");
			a.onclick = function(){
				el.style.display = (el.style.display=="")?"none":"";		
				return false;
			};
		});
		
		this.showHere();
	},
	
	/**
	 * 显示出当前的菜单
	 */
	showHere : function(){
		var here = ""+window.location;
		
		var es = $(this.ul).getElements("a");	
		es.every(function(el){
			if (here.indexOf(el.href)!=-1){
				el.getParent("ul").style.display = "";
				
				// 设置当前菜单选中效果
				var li = el.getParent("li");
				var ul = li.getParent("ul");
				
				 // 设置被click菜单的效果
				var className = "tr_secondlist_on";
				if (ul.id && ul.id=="menu"){
					className = "tr_firstlist_on";
				}else if (ul.getParent("ul").get("Id")!=null){
					className = "tr_secondlist_on";
				}
				li.set("class", className);
				return false;
			}
			return true;
		});
	}
}

/**
 * 校验器
 */
var Checker = {

	require : /.+/,
	email : /^[a-z0-9A-Z_.-]+@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,  // not test
	// allphone : /(^13|15|18|19\d{9}$)|(^0[1-9]\d{1,2}-[2-9]\d{6,7}$)/,
	allphone : /((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)/,
	phone : /(^0[1-9]\d{1,2}-[2-9]\d{6,7}$)/,  // not test
	mobile : /^13|15|18|19\d{9}$/,

	loginid : /^[a-zA-Z0-9]{3,10}$/,
	password : /^.{6,30}$/,
	
	url : /^https?:\/\/[A-Za-z0-9]+(\.[A-Za-z0-9])*[:\d]?[\w\/=\?%\-&_~`@\[\]\':+!]*([^\"\"])*$/,
	topurl : /^[hH]{1}[tT]{2}[pP]{1}:\/\/[wW]{3}\.[0-9a-zA-Z][0-9a-zA-Z-]{0,25}((\.[a-zA-Z]{3,4})|(\.[a-zA-Z]{2})){1,2}$/,
	idcard : /^\d{15}(\d{2}[A-Za-z0-9])?$/,
	currency : /^\d+(\.\d+)?$/,
	number : /^\d+$/,
    money : /^\d+(\.\d{2})?$/, // not test
	zip : /^[1-9]\d{5}$/,
	qq : /^[1-9]\d{4,9}$/,
	integer : /^[-\+]?\d+$/,
	double : /^[-\+]?\d+(\.\d+)?$/,
	english : /^[A-Za-z]+$/,
	chinese :  /^[\u0391-\uFFE5]+$/,
	dan : /^(\s|[\x00-\xff])*$/,
	ip : /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/,
	date : "this.validateZZYDate(value)",
	
	check : function(input, expressions){
		var _this = this;
		var result = true;
		var value = input.get('value');
		if (!value)	value = '';
		
		if ($type(expressions) == 'regexp')
			return this.checkData(input.get('value'), expressions);
		
		if (expressions.toLowerCase().indexOf("require")==-1 && value.length<=0)
			return true;
			
		expressions.split(' ').each(function(e){
			result = result && _this.checkData(input.get('value'), e);
		});
		
		return result;
	},	
	
	checkData : function(value, expression){
		
		if ($type(expression) == 'regexp')
			return value.test(expression);
		
		if (expression.test('^same:(.+)$'))
			return this.validateSame(value, RegExp.$1);
		
		if (expression.test('^length:(.+)$'))
			return eval('this.validateLength(value, '+RegExp.$1+')');
				
		if (!this[expression.toLowerCase()]) return true;
		
		if ($type(this[expression.toLowerCase()]) == 'regexp')
			return this[expression.toLowerCase()].test(value);
		
		return eval(this[expression]);		
	},

	checkAjax : function(input, url, sys){

		var jSonRequest = new Json.Remote(url,
		{async : sys, onComplete : function(result){
		   ajaxResult(result, input);
		}}).send();
	},

	ajaxResult : function(result, input){
		if (result.result){			
			if (result.msg){
				
			}else{
				
			}
		}else{
			if (result.msg){

			}else{

			}
		}
		return result.result;
	},
	
	validateLength : function(str, min, max){	
		if (min!=0 && str.length < min) return false;
		return (max==0 && str.length <= max);
	},
	
	validateSame : function(str, name){	
		var str1 = document.getElementsByName(name)[0].get('value');
		if (!str1) str1 = "";
		return (str==str1);
	},
	
	/**
	 * 是否是闰年
	 */
	isLeapYear : function(year){
	  if (year % 4 != 0)
		return false;
	  if (year % 400 == 0)
		return true;
	  if (year % 100 == 0)
		return false;
	  return true;
	},
	
	validateZZYDate : function(str){
		var ss = str.split("-");
		if (ss.length == 3){
			return validateDate(ss[2], ss[1], ss[0]);
		}

		return false;
	},

	validateDate : function(day,month,year)
	{
		if ((day<=0)||(month<=0)||(year<=0))
			return false;
			
		if ((month>=1)&&(month<=12)) {
			if (month == 2) {
				if (isLeapYear(year)) {
					if (day<=29) 
						return true;
				} else {
					if (day<=28)
						return true;
					else
						return false;
				}
			} else if ((month==4)||(month==6)||(month==9)||(month==11)) {
				if (day<=30)
					return true;
				else
					return false;
			} else {
				if (day<=31)
					return true;
				else
					return false;
			}
		}
		return false;
	}
 }
 
 /**
	 * Form Validator base by mootools author : Sleepan date : 2008-12-06 last
	 * date : 2010-4-22 vaersion 1.1
	 */
var Validator = new Class({
	
	Implements : [Options, Events],

	from : null,	// 要校验的表单
	validInput : [], // 要校验的input
	options : {
		focusClass : "",  // 聚焦时
		validClass : "tr_td01_green",	// 通过校验
		invalidClass : "tr_td01_red"// 校验失败
	},

	initialize : function(form, options){
		this.form = $(form);
		this.setOptions(options);
		this.checker = Checker;
		
		var _this = this;
		
		this.getInputs().each(function(e){
			
			if (!e.name)	return;
			if (!_this.options[e.name])	return;
			
			// 设置默认的提示信息
			_this.setMessage(e, _this.options[e.name+'_msg']);
			
			/**
			 * 暂时没有这样的需要 聚焦样式时设置样式 e.addEvent('focus', function(){
			 * _this.setMessage(e, _this.options[e.name+'_msg'],
			 * _this.options['focusClass']); });
			 */
			// setBlueEvent
			e.addEvent('blur', function (){							
				_this.checkInput(this);
			});	
		});
			
		this.setFormOnsubmit();
	},
	
	getValidMessage : function(input){
		return this.options[input.name+"_valid"] ||
				(this.options[input.name+"_msg"] || "");
	},
	
	getInvalidMessage : function(input){
		return this.options[input.name+"_invalid"] ||
				(this.options[input.name+"_msg"] || "");
	},

	setMessage : function(e, message, className){
		var msgElement = e.getParent().getNext();
		if (msgElement.hasChild('span'))
			msgElement = msgElement.getChildren('span');
		if (className)
			msgElement.set('class', className);
		
		msgElement.set('text', message);
	},
	
	/**
	 * 获得表单输入element
	 */
	getInputs : function(){
		return this.form.getElements('input,select,textarea');
	},

	/**
	 * 校验输入 input : 输入项 sys : 是否同步(当ajax校验时使用)
	 */
	checkInput : function(input){
		var result = true;

		if (this[input.name+"Check"]){
			// todo
			return eval("this."+input.name+"Check(input)");	
		}else if (this.options[input.name]){
			result = this.checker.check(input, this.options[input.name]);
		}
		
		var url = this.options[input.name+'_ajax_url'];
		if (result && $chk(url)){
			result = this.checkAjax(url, input);
			if (result)
				this.setMessage(input, this.options[input.name+"_ajax_msg"], this.options['validClass']);
			else
				this.setMessage(input, this.options[input.name+"_ajax_invalid"], this.options['invalidClass']);
			return result;
		}
		
		if (result)
			this.setMessage(input, this.getValidMessage(input), this.options['validClass']);
		else
			this.setMessage(input, this.getInvalidMessage(input), this.options['invalidClass']);
			
		return result;
	},
	
	checkAjax : function(url, input){
		var result = false;
		new Request({
			method : 'get',
			'url' : url,
			async : false, 
			onSuccess : function(text){
				if (text=='1' || text=='true')
					result = true;
			}
		}).send(input.name+"="+input.get('value'));
		return result;
	},
	
	/**
	 * 表单提交时执行
	 */
	setFormOnsubmit : function(){		
		_this = this;	
		this.form.onsubmit =function(){

			var all = _this.getInputs();
			var resultAll = true;
			
			_this.getInputs().each(function(e){
				if (!e.name)	return;
				if (!_this.options[e.name])	return;
				resultAll = _this.checkInput(e) && resultAll;
			});
			
			return resultAll && _this.beforeSubmit();
		}
	},

	beforeSubmit : function(){
		return true;
	},
		
	toString : function(){
		return  "im a vaidator, update by sleepan, 2010-04-22";
	}
});

/**
 * 将过长的url装换为 url... 这样子的字符串
 */
var  setMiniUrl = function(className, length){
	var urls = $$('a.'+className);
			
	urls.each (function(t){
		t.innerHTML = getMiniString(t.innerHTML, length);
	});				
}

/**
 * 将过长的string装换为 string... 这样子的字符串
 */
var getMiniString = function(str, length){
	return str.ellipsis(length);
}

// 数据请求函数,如果返回的数据有效，加入缓存。调用加载数据方法
		function queryData(url,parameters,saveto)
		{
			var jsonRequest = new Request.JSON({
    			url: url,
    			onComplete: function(back, text){
    					
    				if(saveto != null){
    					save2Cache(saveto,back);
    				}
    				loadData(back);
    			}
			}).get(parameters);
		}
		
		// 装载日期数据到页面
		function loadDateLabel(dateLabel){
			if(dateLabel == null){
				showMessage('日期数据为空');
				return false;
			}
			
			$('datelabel').innerHTML = dateLabel;
		}
/**
 * 请把domready这个保留在该文件的最后方便修改和管理
 */
window.addEvent('domready', function() {
	// 设置菜单的效果
   Menu.addEffect();
   // 设置Table的特效
   // setTableStyle();
});		


