/*
 * etPage 1.2 //110803
 * Copyright (c) 2010 zhangjianfeng  http://www.eworlding.com/
 * Date: 2010-12-08
 * 以skygq.checkform.1.2和本公司的一个通用录入验证JS合并修改
 * 1.1版本内含etFrom一个主方法，主要完成通用录入验证。
 
 * 主要完成的功能是：输入提示，错误提示，正确提示，文本框内默认值处理。
 * verify(有效域):含有verify属性并且verify的值不能为空表示,如果是隐藏域验证失效.
		=true                  只是非空验证,tips和initvalue有效
		=defaultSettings.rule  表示非空和相应格式验证,tips和initvalue有效
		=verify                不验证,tips和initvalue有效	
 * warn          :错误信息核心值。
 * tips          :有效域提示信息，defaultSettings.tipsInit不为空的verify有默认输入提示.
 * initvalue     :有效域默认值。
 * 
 * 
 *  * 1.2增加了多重验证，增加了button提交,去掉了对FCKeditor的验证,增加了CKeditor的验证
 */

(function($) {
	$.fn.etForm = function(settings){
		if( !$(this).is("form") ) return;
		var defaultSettings = {
			items		: [],
			isBindSubmit: true,
			isAlert		: false,
			isView		: true,
			rule 		: {
							"eng" : /^[A-Za-z]+$/,
							"chn" :/^[\u0391-\uFFE5]+$/,
							"mail" : /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/,
							"url" : /^http[s]?:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,
							"currency" :/^((\u8bae\u4ef7)|(\d+(\.\d{1,2})?))$/,
							"number" : /^\d+$/,
							"int" : /^[0-9]{1,30}$/,
							"double" : /^[-\+]?\d+(\.\d+)?$/,
							"username" : /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){3,19}$/,
							"password" : /^(\w){6,20}$/,
							"safe" : />|<|,|\[|\]|\{|\}|\?|\/|\+|=|\||\'|\\|\"|:|;|\~|\!|\@|\#|\*|\$|\%|\^|\&|\(|\)|`/i,
							"dbc" : /[ａ-ｚＡ-Ｚ０-９！＠＃￥％＾＆＊（）＿＋｛｝［］｜：＂＇；．，／？＜＞｀～　]/,
							"qq" : /[1-9][0-9]{4,}/,
							"date" : /^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$/,

							"mp" : /^0{0,1}1[0-9]{10}$/,
							"tel" : /^[0-9]{3,4}\-[0-9]{7,8}$/,
							"telmp" : /^((0{0,1}1[0-9]{10})|([0-9]{3,4}\-[0-9]{7,8}))$/,
							"zipcode" : /^[1-9]\d{5}$/,
							"bodycard" : /^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/,
							"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])\.(\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])$/,

							// 函数规则
							"true" : function(arg1){  return arg1!='' ? true:false;},
							"eq": function(arg1,arg2){ return arg1==arg2 ? true:false;},
							"gt": function(arg1,arg2){ return arg1>arg2 ? true:false;},
							"gte": function(arg1,arg2){ return arg1>=arg2 ? true:false;},
							"lt": function(arg1,arg2){ return arg1<arg2 ? true:false;},
							"lte": function(arg1,arg2){ return arg1<=arg2 ? true:false;}
							},
			msgSuffix	: {
							"true": "不能为空",
							"eng" : "只能输入英文" ,
							"chn" : "只能输入汉字",
							"mail" : "格式不正确",
							"url" : "格式不正确",
							"currency" : "(货币)格式有误",
							"number" : "只能为数字",
							"int" : "只能为整数(含0)",
							"double" : "只能为带小数的数字",
							"username" :"不合法",
							"password" : "只能为数字和英文及下划线的组合，6-20个字符",
							"safe" : "不能有特殊字符",
							"dbc" : "不能有全角字符",
							"qq" : "格式不正确",
							"date" : "格式不正确",
							"mp" : "格式不正确",
							"tel" : "格式不正确",
							"telmp" : "格式不正确",
							"zipcode" : "格式不正确",
							"bodycard" : "格式不正确",
							"ip" : "IP不正确",
							"eq": "必须等于",
							"gt": "必须大于",
							"gte": "必须大于或等于",
							"lt": "必须小于",
							"lte": "必须小于或等于"
							},
			tipsInit    :{	
							"true" : "请输入信息" ,
							"eng" : "请输入英文" ,
							"chn" : "请输入汉字",
							"mail" : "请输入正确的eamil格式，如：zhang@163.com",
							"url" : "请输入正确的URL格式，如：http://www.eworlding.com",
							"currency" : "请输入'议价'或货币格式:'12.10'",
							"number" : "请输入数字",
							"int" : "请输入整数",
							"double" : "请输入带小数的数字",
							"username" :"正确的格式是以字母开头,可以输入字母、数字、点及下划线",
							"password" : "请输入数字和英文及下划线的组合，6-20个字符",
							"safe" : "请不要输入特殊字符",
							"dbc" : "请不要输入全角字符",
							"qq" : "",
							"date" : "",
							"mp" : "请输入正确的手机号码格式，如：15012345678",
							"tel" : "请输入正确的固定电话格式，如：010-12345678",
							"telmp" : "请输入正确联系方式，如：15012345678或010-12345678",
							"zipcode" : "",
							"bodycard" : "",
							"ip" : "",
							"eq": "",
							"gt": "",
							"gte": "",
							"lt": "",
							"lte": ""
							}
							
		};
		$("*[verify]").each(function(){
			defaultSettings.items.push({id:$(this).attr("id"),name:$(this).attr("name"),verify:$(this).attr("verify"),warn:$(this).attr("warn"),tips:$(this).attr("tips"),initvalue:$(this).attr("initvalue")})
		});
		settings = $.extend(defaultSettings,settings);
		var msg = "", formObj = $(this) , checkRet = true, isAll,

		tipname = function(namestr){ return "tip_" + namestr.replace(/([a-zA-Z0-9])/g,"-$1"); },

		//规则类型匹配检测
		typeTest = function(){
			var result = true,args = arguments;
			if(settings.rule.hasOwnProperty(args[0])){
				var t = settings.rule[args[0]], v = args[1];
				result = args.length>2 ? t.apply(arguments,[].slice.call(args,1)):($.isFunction(t) ? t(v) :t.test(v));
			}
			return result;
		},

		//错误信息提示
		showError = function(fieldObj,filedName,warnInfo){
			checkRet = false;
			var tipObj = $("#"+tipname(filedName));
			if(tipObj.length>0) tipObj.remove();
			fieldObj.parent().append("<span class='Wrong' id='"+tipname(filedName)+"'> "+warnInfo+" </span>");
			if(settings.isAlert && isAll) msg += "\n" + warnInfo;
		},

		//正确信息提示
		showRight = function(fieldObj,filedName,SuccessInfo){
			var tipObj = $("#"+tipname(filedName));
			if(tipObj.length>0) tipObj.remove();
			if (!SuccessInfo)
			{
				SuccessInfo = '填写正确';
			}
			fieldObj.parent().append("<span class='Correct' id='"+tipname(filedName)+"'> "+ SuccessInfo +" </span>");
		},

		//focus时提示
		showExp = function(obj){
			var i = obj, fieldObj = $("[name='"+i.name+"']",formObj[0]);
			var tipObj = $("#"+tipname(i.name));
			if(tipObj.length>0) tipObj.remove();
			if(fieldObj.val()==i.initvalue){
					fieldObj.val('');
			}
			if(settings.isView){
				arr_verify=i.verify.split(",");
				var _tips=i.tips?i.tips:settings.tipsInit[arr_verify[arr_verify.length-1]];
				//var _tips=i.tips?i.tips:settings.tipsInit[i.verify];
				if (_tips){
					floatdiv( _tips ,fieldObj[0]);
					//floatdiv( _tips ,{evev_x,left:fieldObj.offset().left});
				}
			}
			
		},
		showInit=function(obj){
			var i = obj, fieldObj = $("[name='"+i.name+"']",formObj[0]);
			var tipObj = $("#"+tipname(i.name));
			if(tipObj.length>0) tipObj.remove();
			if(i.initvalue&&fieldObj.val()==''){
				fieldObj.val(i.initvalue);
			}
		},

		//匹配对比值的提示名
		findTo = function(objName){
			var find;
			$.each(settings.items, function(){
				if(this.id == objName && this.warn){
					find = this.warn;	return false;
				}
			});
			if(!find) find = $("[name='"+objName+"']")[0].name;
			return find;
		},
		//ajax验证
		ajax = function (obj,field_value,field){
			var i = obj, fieldObj = $("[name='"+i.name+"']",formObj[0]);
			var tipObj = $("#"+tipname(i.name));
			if(tipObj.length>0) tipObj.remove();
			var tipPosition = fieldObj.next().length>0 ? fieldObj.nextAll().eq(this.length-1):fieldObj.eq(this.length - 1);
			tipPosition.after("<span class='Exp' id='"+tipname(i.name)+"'>检测中......</span>");
			field_value = encodeURI(field_value);
			$.get(obj.ajax.url + "?" + obj.name + "=" + field_value,function(data){
				if (data == 1){
					showRight(field,obj.name,obj.ajax.success_msg);
				}
				else if(data == 0){
					showError(field ,obj.name, obj.ajax.failure_msg);
				}
			});
		},

		//单元素验证
		fieldCheck = function(item){
			$('.Exp').remove();
			var i = item, field = $("[name='"+i.name+"']",formObj[0]);	
		
			if(!field[0]) return;
			
			_verify=","+field.attr("verify")+",";
			if(_verify.indexOf(",fck,")==-1){
				if(field.is(":hidden")){
					return;
				}
			}
			//tips和initvalue起作用
			if(i.verify=='verify'){
				if(i.initvalue&&field.val()==''){
					field.val(i.initvalue);
				}
				return;
			}
			//验证起作用
			else{
				if(field.val()==i.initvalue){
					field.val('');
				}
			}
			var warnMsg,field_value = $.trim(field.val()),
				isRq = typeof i.require ==="boolean" ? i.require : true;
			if(_verify.indexOf(",fck,")!=-1){
				field_value=$.trim(editor.getData());				
			}
		
			if( isRq && ((field.is(":radio")|| field.is(":checkbox")) && !field.is(":checked")))
			{
				warnMsg =  i.message|| "请选择" + i.warn;
				showError(field ,i.name, warnMsg);
			}
			else if (isRq && field_value == "" )
			{
				if(_verify.indexOf(",true,")!=-1){
					warnMsg =  i.message|| ( field.is("select") ? "请选择" :"请填写" ) + i.warn;
					showError(field ,i.name, warnMsg);
				}
			}
			else if(field_value != "")
			{
				if(i.min || i.max){
					var len = strlen(field_value), min = i.min || 0, max = i.max;
					warnMsg =  i.message || (max? i.warn + "长度范围应在"+min+"~"+max+"之间":i.warn + "长度应大于"+min);
					if( (max && (len>max || len<min)) || (!max && len<min) ){
						showError(field ,i.name, warnMsg);	return;
					}
				}
				if (i.ajax)
				{
					$.ajaxSetup({

					  async: !isAll // false使用同步方式执行AJAX，true使用异步方式执行ajax
					});
					ajax(i,field_value,field);
				}
				if(i.verify){
					var matchVal = field.attr("to") ? $.trim($("#"+field.attr("to")).val()) :i.value;
					i_verify=i.verify.split(",");
					cur_verify=(i_verify[i_verify.length-1]);
					var matchRet = matchVal ? typeTest(cur_verify,field_value,matchVal) :typeTest(cur_verify,field_value);
					warnMsg = i.message|| i.warn + settings.msgSuffix[cur_verify];
					if(matchVal && i.warn){ warnMsg += (field.attr("to") ? findTo(field.attr("to")) +"的值" :i.value);}
					if(!matchRet) {
						showError(field ,i.name, warnMsg);return;
					}else {
						showRight(field,i.name);
					}

				}

			}
			if(i.initvalue&&field.val()==''){
				field.val(i.initvalue);
			}
		},
		strlen=function(str){
			return str.replace(/[^\x00-\xFF]/g,'**').length;
		},
		floatdiv=function(tips,obj){
			height=(obj.offsetHeight)
			var curleft = curtop = 0;
			if (obj.offsetParent) {
				curleft = obj.offsetLeft;
				curtop = obj.offsetTop;
				while (obj = obj.offsetParent) {
					
					var origcurleft = curleft;
					curleft += obj.offsetLeft;
					if (curleft < 0) {
						curleft = origcurleft;
					}
					curtop += obj.offsetTop;
				}
			}
			$("body").append("<div class='Exp' style='position:absolute;left:"+curleft+"px;top:"+(curtop+height)+"px;'>"+tips+"<div>");
			itemDiv=$('.Exp');
			//itemDiv.css("position","absolute").css("left",curleft+"px").css("top",curtop+12+"px");
			itemDiv.show();
		};

		//元素组验证
		validate = function(){
			checkRet = true;
			$.each(settings.items, function(){
				isAll=true; fieldCheck(this);
			});
			if(settings.isAlert && msg != ""){
				alert(msg);	msg = "";
			}
			return checkRet;
		};

		//单元素事件绑定
		$.each(settings.items, function(){
			var field = $("[name='"+this.name+"']",formObj[0]);
		//	alert(field.attr("id")+field.attr("name"))
			var obj = this,
			toExp = function(){showExp(obj);},
			toCheck = function(){ isAll=false; fieldCheck(obj);};
			if(field.is(":file") || field.is("select")){
				field.change(toCheck).focus(toExp);
			}else{
				field.blur(toCheck).focus(toExp);
			}
			showInit(obj);
		});
		$(":button").each(function(){	
			if($(this).attr("types")){
				$(this).click(function(){
					$.globalEval($(this).attr("types"));
					if(validate())
					formObj.submit();
				})
			}
		});

		//提交事件绑定
		if(settings.isBindSubmit) {
			$(this).submit(validate);
		}else{
			return validate();
		}

	}

})(jQuery);
$(function(){
	$("form[class*='etpage']").each(function(){
		$(this).etForm();
	});

	$("a[href][rel='new']").each(function(){
		$(this).attr('target',"_blank");
	})
	$("#sethomepage").click(function(){
	        var aUrls=document.URL.split("/");
    		var url="http://"+aUrls[2]+"/";
	        try {
	            this.style.behavior = "url(#default#homepage)";
	            this.setHomePage(url);
	        } catch (e) {
	            if (window.netscape) {
	                try {
	                    netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
	                } catch (e) {
	                    alert("此操作被浏览器拒绝！\n请在浏览器地址栏输入“about:config”并回车\n然后将 [signed.applets.codebase_principal_support]的值设置为'true',双击即可。");
	                    return false;
	                }
	                var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
	                prefs.setCharPref('browser.startup.homepage',url);
	            }
	        }
	        return false;
	    });
	 $("#setFavorite").click(function(){
	 	try {
            window.external.addFavorite(document.location.href, document.title);
        }catch (e) {
            try {
                window.sidebar.addPanel(document.title, document.location.href, "");
            }catch (e) {

                alert("加入收藏失败,请手动添加.");

            }

        }

	 })
});

