/******************************************************
    mxp - my ajax package
     

author: Vincent Tong
version: 0.1.8
create date: 2006-05-13
last modify date: 2006-09-07 15:58

mxp.render    浏览器判断
mxp.xbrowser  跨浏览器基础
mxp.xsl       样式
mxp.io        通讯
mxp.form      表单
mxp.table     表格
mxp.string    字符串
mxp.validate  验证
mxp.html      html
other          

********************************************************/
var mxp = {};

function $() {
  var elements = new Array();

  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);
  }

  return elements;
}

mxp.render = (function(){

	function vscaffold(prefs, names){
		var tmp = {
			capable: false,
			support: {
				builtin: false,
				plugin: false
			},
			prefixes: prefs
		};
		for(var x in names){
			tmp[x] = false;
		}
		return tmp;
	}

	return {
		os: { win: false, linux: false, osx: false },
		html: vscaffold(["html"], ["ie", "opera", "khtml", "safari", "moz"]),
		svg: vscaffold(["svg"], ["corel", "adobe", "batik"]),
		vml: vscaffold(["vml"], ["ie"]),
		swf: vscaffold(["Swf", "Flash", "Mm"], ["mm"]),
		swt: vscaffold(["Swt"], ["ibm"])
	};
})();

(function() {


	var mr = mxp.render;
	var mrh = mxp.render.html;
	var mua = navigator.userAgent;
	var mav = navigator.appVersion;
	var t = true;
	var f = false;
	mrh.capable = t;
	mrh.support.builtin = t;

	mr.ver = parseFloat(mav);
	mr.os.mac = mav.indexOf("Macintosh") >= 0;
	mr.os.win = mav.indexOf("Windows") >= 0;
	// could also be Solaris or something, but it's the same browser
	mr.os.linux = mav.indexOf("X11") >= 0;

	mrh.opera = mua.indexOf("Opera") >= 0;
	mrh.khtml = (mav.indexOf("Konqueror") >= 0)||(mav.indexOf("Safari") >= 0);
	mrh.safari = mav.indexOf("Safari") >= 0;
	var geckoPos = mua.indexOf("Gecko");
	mrh.mozilla = mrh.moz = (geckoPos >= 0)&&(!mrh.khtml);
	if (mrh.mozilla) {
		// gecko version is YYYYMMDD
		mrh.geckoVersion = mua.substring(geckoPos + 6, geckoPos + 14);
	}
	mrh.ie = (document.all)&&(!mrh.opera);
	mrh.ie50 = mrh.ie && mav.indexOf("MSIE 5.0")>=0;
	mrh.ie55 = mrh.ie && mav.indexOf("MSIE 5.5")>=0;
	mrh.ie60 = mrh.ie && mav.indexOf("MSIE 6.0")>=0;

	mr.vml.capable=mrh.ie;
	mr.svg.capable = f;
	mr.svg.support.plugin = f;
	mr.svg.support.builtin = f;
	mr.svg.adobe = f;
	if (document.implementation 
		&& document.implementation.hasFeature
		&& document.implementation.hasFeature("org.w3c.dom.svg", "1.0")
	){
		mr.svg.capable = t;
		mr.svg.support.builtin = t;
		mr.svg.support.plugin = f;
		mr.svg.adobe = f;
	}else{ 
		//	check for ASVG
		if(navigator.mimeTypes && navigator.mimeTypes.length > 0){
			var result = navigator.mimeTypes["image/svg+xml"] ||
				navigator.mimeTypes["image/svg"] ||
				navigator.mimeTypes["image/svg-xml"];
			if (result){
				mr.svg.adobe = result && result.enabledPlugin &&
					result.enabledPlugin.description && 
					(result.enabledPlugin.description.indexOf("Adobe") > -1);
				if(mr.svg.adobe) {
					mr.svg.capable = t;
					mr.svg.support.plugin = t;
				}
			}
		}else if(mrh.ie && mr.os.win){
			var result = f;
			try {
				var test = new ActiveXObject("Adobe.SVGCtl");
				result = t;
			} catch(e){}
			if (result){
				mr.svg.capable = t;
				mr.svg.support.plugin = t;
				mr.svg.adobe = t;
			}
		}else{
			mr.svg.capable = f;
			mr.svg.support.plugin = f;
			mr.svg.adobe = f;
		}
	}
})();



//---------------------------------------------------------------------------------
// xbrowser

mxp.xbrowser = {

	// 跨浏览器初始化(xsl)
    init: function() {
        if (mxp.render.html.moz || mxp.render.html.opera) {
			// DOM-specific code
			Document.prototype.readyState = 0;
			Document.prototype.onreadystatechange = null;
				
			Document.prototype.__changeReadyState__ = function (iReadyState) {
				this.readyState = iReadyState;
				if (typeof this.onreadystatechange == "function") {
				    this.onreadystatechange();
			    }
			};

			Document.prototype.loadXML = function (sXml) {
				this.__initError__();
				this.__changeReadyState__(1);
				
				var oParser = new DOMParser();
				var oXmlDom = oParser.parseFromString(sXml, "text/xml");
				while (this.firstChild) {
					this.removeChild(this.firstChild);
				}
				for (var i = 0; i < oXmlDom.childNodes.length; i++) {
					var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
					this.appendChild(oNewNode);
				}
				this.__checkForError__();
				this.__changeReadyState__(4);
			};
		
			Document.prototype.__load__ = Document.prototype.load;

			Document.prototype.load = function (sURL) { 
				this.__initError__();
				this.__changeReadyState__(1);
				this.__load__(sURL);
			};

			Node.prototype.__defineGetter__("xml", function() {
				var oSerializer = new XMLSerializer();
				return oSerializer.serializeToString(this, "text/xml");
			});

			Node.prototype.transformNode = function (oXslDom) {
				var oProcessor = new XSLTProcessor();
				oProcessor.importStylesheet(oXslDom);
				var oResultDom = oProcessor.transformToFragment(this, document);
				var sResult = oResultDom.xml;
				//if (sResult.indexOf("transformiix:result") > -1 ) {
				//	sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<"));
				//}
				return sResult;
			};
        }
    },

    // IE创建xmldom
    // "MSXML2.DOMDocument.5.0"、"MSXML2.DOMDocument.4.0" 与 responseXML 不匹配， 使用xsl时会出错
    // "MSXML2.DOMDocument"、"MSXML2.DOMDocument.3.0"、"Microsoft.XmlDom" 则都可以
    createXMLDOM: function() {
	    var arrSignatures = [ "MSXML2.DOMDocument",
	                          "MSXML2.DOMDocument.3.0",
			                  "MSXML2.DOMDocument.4.0",
			                  "MSXML2.DOMDocument.5.0",
			                  "Microsoft.XmlDom" ];

	    for (var i = 0; i < arrSignatures.length; i++) {
			try
			{ 
				var oXmlDom = new ActiveXObject(arrSignatures[i]);
				return oXmlDom;
			}
			catch (oError)
			{
			   //ignore
            }
	    }
	    throw new Error("MSXML not installed on your system.");
    },

	// 跨浏览器创建xmldom
    XmlDom: function() {
		var oXmlDom;

		if (mxp.render.html.ie) {
			// IE-specific code
			oXmlDom = mxp.xbrowser.createXMLDOM();
			return oXmlDom;

		} else if (mxp.render.html.moz || mxp.render.html.opera) {
			// DOM-specific code
		
			oXmlDom = document.implementation.createDocument("", "", null);

			oXmlDom.addEventListener("load", function () { // alert(oXmlDom.documentElement.tagName);
				//this.__checkForErrors__(); 
				this.__changeReadyState__(4);
			}, false);

			oXmlDom.parseError = {
				valueOf: function () {return this.errorCode;},
				toString: function () {return this.errorCode.toString();}
			};

			return oXmlDom;
		} else {
			throw new Error("Your browser doesn't  support dom!");
		}
    },

    // 跨浏览器创建XMLHttpRequest
	createXMLHttpRequest: function() {
		var xmlHttp = null;
		if (mxp.render.html.ie) {
			try {
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}     
		} else if (mxp.render.html.moz || mxp.render.html.opera) {
			xmlHttp = new XMLHttpRequest();
			if (xmlHttp.overrideMimeType) {//设置MiME类别
				xmlHttp.overrideMimeType("text/xml");
			}
		}
		if (!xmlHttp) { // 异常，创建对象实例失败
		    alert("不能创建XMLHttpRequest对象实例.");
		    return false;
        }
		return xmlHttp;
	}
};

mxp.xbrowser.init();

//---------------------------------------------------------------------------------
// xsl

mxp.xsl = {};

mxp.xsl.applyXsl = function(xmlDom, xslURL, obj) {

    var xslDoc = new mxp.xbrowser.XmlDom();
    xslDoc.async = false;
    xslDoc.load(xslURL);
	
	if (obj == null) {
		return xmlDom.transformNode(xslDoc);
	}
	var des = $(obj);
	des.innerHTML = xmlDom.transformNode(xslDoc);
};


// 应用xsl
mxp.xsl.applyXsla = function(xmlDom, xslURL, obj) {

    var xslDoc = new mxp.xbrowser.XmlDom();
    xslDoc.onreadystatechange = xslRead;
    xslDoc.async = true;
    
    var xslstate = false;

	function xslRead(){
		if (xslDoc.readyState == 4){
	        xslstate = true;
			doTrans();
		}
	}
	function doTrans(){
		if (xslstate == true) { 
	        var des = $(obj);
	        des.innerHTML = xmlDom.transformNode(xslDoc);
		}
	}
    
    xslDoc.load(xslURL);
};

//---------------------------------------------------------------------------------
// io

mxp.io = {

    activeRequestCount: 0,
    
    onloading: function(){ return false; },
    onloaded: function(){ return false; },
    oninteractive: function(){ },
    oncomplete: function(){ },
    onabort: function(){ alert("abort"); },
    onerror: function(){ alert("您所请求的页面有异常。"); },    
    
    send: function(request) {

		if(!(request.responseType.toLowerCase() == "text" || request.responseType.toLowerCase() == "xml")) {
			alert("响应类别参数错误。");
			return false;
		}

		// 确定发送请求的方式和URL以及是否异步执行下段代码
		if (request.method.toLowerCase() == "get") {
			request.transport.open(request.method, request.url, true);

		} else if(request.method.toLowerCase() == "post") {
			request.transport.open(request.method, request.url, true);
			request.transport.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

		} else {
			alert("http请求类别参数错误。");
			return false;
		}

		this.onCreate()
    	request.transport.send(request.content);  
    	    	
    	request.transport.onreadystatechange = function() {
		    if (request.transport.readyState == 1) {
		        mxp.io.onloading();
		    } else if (request.transport.readyState == 2) {
		        mxp.io.onloaded();		    	    
			} else if (request.transport.readyState == 3) {	    
		        mxp.io.oninteractive();			
		    } else if (request.transport.readyState == 4) {
		    	if (mxp.io.responseIsSuccess(request)) {
		    		mxp.io.onComplete();
		    	} 
		    			    
		        if(request.transport.status == 0) {				
                    mxp.io.onabort();			
                } else if (request.transport.status == 200) { 		
                    request.callback(request.transport);
                } else {
			        mxp.io.onerror();
	 	        }
            }
		}
	},
	
  	onCreate: function() {
    	this.activeRequestCount++;
  	},

  	onComplete: function() {
    	this.activeRequestCount--;
  	},
  	
  	responseIsSuccess: function(request) {
    	return request.transport.status == undefined
        	|| request.transport.status == 0
        	|| (request.transport.status >= 200 && request.transport.status < 300);
  	}		
  	
};

mxp.io.Request = function(method, url, content, responseType, callback) {
	this.transport = mxp.xbrowser.createXMLHttpRequest();
	this.method = method ? method : "post";
	this.url = url;
	this.content = content;
	this.responseType = responseType;
	this.callback = callback;
	mxp.io.send(this);	
}

mxp.io.Request.prototype = {
	method:"post"
}

//---------------------------------------------------------------------------------
// form

mxp.form = {};

mxp.form.getFormAsString = function(formName) {
 	
 	var result = "";
 	
 	formElements = document.forms[formName].elements;
 	
 	for ( var i=formElements.length-1; i>=0; --i ){
 		//we escape (encode) each value
 		result = result + "&" + escape(formElements[i].name) + "=" + escape(formElements[i].value);
 	}
 	
 	return result;
};


//---------------------------------------------------------------------------------
// table

mxp.table = {};

mxp.table.insertRow = function(tableid, cells) {
	var oTable = document.getElementById(tableid);
    var oTbody = oTable.getElementsByTagName("tbody").item(0);
    var oTr = document.createElement("TR");

    if (cells == null || cells.length == 0) {
		alert("添加单元格失败！")
		return false;
	}
    
	for (var i = 0; i < cells.length; i++)
	{
	    oTr.appendChild(cells[i]);
	}

	oTbody.appendChild(oTr);
};

/* 删除table行
   @param tableid: table id
   @param oTr: tr 对象
*/
mxp.table.deleteRow = function(tableid, oTr) {

    var oTable = document.getElementById(tableid);
    var oTbody = oTable.getElementsByTagName("tbody").item(0);
	oTbody.removeChild(oTr);
};

/* 根据单元格内事件，删除行
   @param tableid: table id
   @param evt: 单元格内对象事件，如 A onclick
*/
mxp.table.deleteRowByEvent = function(tableid, evt) {
	if(!evt) evt = event;
    var obj = evt.target ? evt.target : evt.srcElement;
    var oTable = document.getElementById(tableid);
    var oTbody = oTable.getElementsByTagName("tbody").item(0);
    var oTr = obj.parentNode.parentNode;
	oTbody.removeChild(oTr);
};

/* 根据单元格内事件，删除多行
   @param tableid: table id
   @param evt: 单元格内对象事件，如 A onclick
   @param dir: 删除方向 pre/next
   @param num: 删除个数 > 1
*/
mxp.table.deleteRowsByEvent = function(tableid, evt, dir, num) {
	if(!evt) evt = event;
    var obj = evt.target ? evt.target : evt.srcElement;
    var oTable = document.getElementById(tableid);
    var oTbody = oTable.getElementsByTagName("tbody").item(0);
    var oTr = obj.parentNode.parentNode;

    if (dir == null)
    {
		alert("错误的行删除操作！");

    } else if (dir.toLowerCase() == "pre") {
  
        for ( ; num>1; num--)
        {
			oTbody.removeChild(oTr.previousSibling);
        }
		oTbody.removeChild(oTr);
	} else if (dir.toLowerCase() == "next") {

        for ( ; num>1; num--)
        {
			oTbody.removeChild(oTr.nextSibling);
        }
		oTbody.removeChild(oTr);
	} else {
		alert("错误的行删除操作！");
	}
};

/* 根据checkbox，删除选中行
   @param tableid: table id
   @param boxname: checkbox name
*/
mxp.table.deleteRowsByBox = function(tableid, boxname) {
	var box = document.getElementsByName(boxname);
    if (box == null)
        return;

    var oTable = document.getElementById(tableid);
    var oTbody = oTable.getElementsByTagName("tbody").item(0);

	for (var i = box.length -1 ; i >= 0; i--)
	{
	    if (box[i].checked == true)
	    {
            oTbody.removeChild(box[i].parentNode.parentNode);
	    }
	}
};

//---------------------------------------------------------------------------
// other

function HtmlElement(tagName) {
	return document.createElement(tagName);
};

//---------------------------------------------------------------------------
// string

mxp.string = {};

/* 字符串是否为空
*/
mxp.string.isNull = function (str) {
    var i;
    for (i = 0; i < str.length; i ++) {
        if (str.charAt(i) != ' ') return false;
    }
    return true;
};

/* 取得字符串的字节长度
*/
mxp.string.getlength = function (str) {
    var i = 0;
    var len = 0;

    for (i = 0; i < str.length; i ++) {
        if (str.charCodeAt(i) > 255)  len += 2;  else len ++;
    }
    return len;
};

/* 取得固定长度字符串
   @param str:
   @param length:截取长度
*/
mxp.string.cut = function (str, length) {
	var strlen = mxp.string.getlength(str);
	if (strlen <= length) {
		return str;
	}

    var result = "";
    var len = 0;
    var schar;
    for (var i = 0; i < str.length; i = i + 1) {
        schar = str.charAt(i); 
		result += schar;
        len += (schar.match(/[^\x00-\xff]/) != null ? 2 : 1);
        if (len >= length) {
            break;
        }
    }

    return result;
};

//---------------------------------------------------------------------------
// validate

mxp.validate = {
// 验证函数映射
    checkMap: null,
    init: function() {
		mxp.validate.checkMap = new Array();
		mxp.validate.checkMap["number"]  = mxp.validate.checkMap["N"] = mxp.validate.isNumber;
		mxp.validate.checkMap["integer"] = mxp.validate.checkMap["I"] = mxp.validate.isInteger;
		mxp.validate.checkMap["float"]   = mxp.validate.checkMap["F"] = mxp.validate.isFloat;
		mxp.validate.checkMap["letter"]  = mxp.validate.checkMap["L"] = mxp.validate.isLetter;
		mxp.validate.checkMap["letternumber"]     = mxp.validate.checkMap["LN"]     = mxp.validate.isLetterNumber;
		mxp.validate.checkMap["lettercn"]         = mxp.validate.checkMap["LCN"]    = mxp.validate.isLetterCN;
		mxp.validate.checkMap["letternumbercn"]   = mxp.validate.checkMap["LNCN"]   = mxp.validate.isLetterNumberCN;
		mxp.validate.checkMap["letterwccn"]       = mxp.validate.checkMap["LWCCN"]  = mxp.validate.isLetterWcCN;
		mxp.validate.checkMap["letternumberwccn"] = mxp.validate.checkMap["LNWCCN"] = mxp.validate.isLetterNumberWcCN;
		mxp.validate.checkMap["email"]    = mxp.validate.isEmail;
		mxp.validate.checkMap["mobile"]   = mxp.validate.isMobile;
		mxp.validate.checkMap["postcode"] = mxp.validate.isPostcode;
		mxp.validate.checkMap["phone"]    = mxp.validate.isPhone;
		mxp.validate.checkMap["pageurl"]  = mxp.validate.isPageurl;
		mxp.validate.checkMap["date"]     = mxp.validate.isDate;
		mxp.validate.checkMap["idcard"]   = mxp.validate.isIdCard;
		mxp.validate.checkMap["qq"]       = mxp.validate.isQQ;
		mxp.validate.checkMap["ip"]       = mxp.validate.isIP;		
		mxp.validate.checkMap["ext"]      = mxp.validate.extCheck;
	}
};

// 是否是数字
mxp.validate.isNumber = function (str, format) {
    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[0-9" + format + "]+$";
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^(\d)+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是整数
mxp.validate.isInteger = function(str, format) {

    var regexp = /^([1-9][0-9]{0,9}|[0-9])$/;
    if (!regexp.exec(str)) return false;

	if (format != null && format != "")
	{
		var part = format.split("-");
        var min = Number(part[0]);
        var max = Number(part[1]);
        if (min > max || max > 2147483647) return false; 
        if (!(min <= Number(str) && Number(str) <= max)) return false;
	}

    return true;
};

// 是否是浮点数
// format 格式 intlen.fraclen . intlen-整数部分长度(max:38), fraclen-小数部分长度(max:38) 0-最大长度 
mxp.validate.isFloat = function (str, format) {
    var pattern;
    var regexp;

	if (format == null || format == "" || format == "0.0")
	{
	    regexp = /^(([1-9][0-9]{0,38}\.[0-9]{1,38})|(0\.[0-9]{1,38})|([1-9][0-9]{0,38}))$/;
	    if (!regexp.exec(str)) return false;
	}
	else
	{
        var part = format.split(".");
        var intlen = Number(part[0]);
        var fraclen = Number(part[1]);
		if (intlen == 0 || intlen > 38) intlen = 38;
		if (fraclen == 0 || fraclen > 38) fraclen = 38;

        if (intlen == 1) {
            pattern = "^(([0-9]\\.[0-9]{1," + fraclen + "})|([0-9]))$";            
		} else {
			intlen = intlen - 1;
            pattern = "^(([1-9][0-9]{0," + intlen + "}\\.[0-9]{1," + fraclen + "})|([1-9][0-9]{0," + intlen + "}))$";
		}
    	regexp = new RegExp(pattern);
		if (!regexp.exec(str)) return false;
	}

	return true;
};


// 是否是字母
mxp.validate.isLetter = function (str, format) {

    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[a-zA-Z" + format + "]+$"; 
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^[a-zA-Z]+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是字母+数字
mxp.validate.isLetterNumber = function (str, format) {

    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[a-zA-Z0-9" + format + "]+$";
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^[a-zA-Z0-9]+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是字母+中文
mxp.validate.isLetterCN = function (str, format) {

    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[a-zA-Z\u4E00-\u9FA5" + format + "]+$";
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^[a-zA-Z\u4E00-\u9FA5]+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是字母 + 数字 + 中文
mxp.validate.isLetterNumberCN = function (str, format) {
    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[a-zA-Z0-9\u4E00-\u9FA5" + format + "]+$";
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^[a-zA-Z0-9\u4E00-\u9FA5]+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是字母+中文+双字节字符
mxp.validate.isLetterWcCN = function (str, format) {

    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[a-zA-Z\u4E00-\u9FA5\uFF00-\uFFFF" + format + "]+$";
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^[a-zA-Z\u4E00-\u9FA5\uFF00-\uFFFF]+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是字母+数字+中文+双字节字符
mxp.validate.isLetterNumberWcCN = function (str, format) {
    var pattern;
    var regexp;

    if (format != null && format != "") {
        pattern = "^[a-zA-Z0-9\u4E00-\u9FA5\uFF00-\uFFFF" + format + "]+$";
        regexp = new RegExp(pattern);  
    } else {
        regexp = /^[a-zA-Z0-9\u4E00-\u9FA5\uFF00-\uFFFF]+$/;
	}

    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是手机号
mxp.validate.isMobile = function (str) {
    var regexp = /^[1][3](\d){9}$/;
    if (!regexp.exec(str)) return false;
    return true;
};


// 是否是email
mxp.validate.isEmail = function (str){
    var regexp = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是联系电话
mxp.validate.isPhone = function (str){
    var regexp = /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是邮编
mxp.validate.isPostcode = function (str){
    var regexp = /^[1-9]\d{5}$/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是页面URL
mxp.validate.isPageurl = function (str){
    var regexp = /^[a-zA-Z]+:\/\/(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是日期
mxp.validate.isDate = function (str) {
    var	pattern =  "^((([0-9]{2}([02468][048])|([13579][26])))(-)(2|02)(-)(([0][1-9])|([1-2][0-9])))" + // 润2月完整日期
		           "|((([0-9]{2}([02468][1235679])|([13579][01345789])))(-)(2|02)(-)(([0][1-9])|([1][0-9])|([2][0-8])))" + // 非润2月完整日期
		           "|(([0-9]{4})(-)(([0]{0,1}(1|3|5|7|8))|(10|12))(-)(([0][1-9])|([1-2][0-9])|30|31))" + // 大月完整日期
		           "|(([0-9]{4})(-)(([0]{0,1}(4|6))|11)(-)(([0][1-9])|([1-2][0-9])|30))$"; // 小月完整日期
    regexp = new RegExp(pattern);   
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是身份证号
mxp.validate.isIdCard = function (str) {
    var regexp = /^\d{15}(\d{2}[A-Za-z0-9])?$/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是QQ号
mxp.validate.isQQ = function (str) {
    var regexp = /^[1-9]\d{4,9}$/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 是否是IP地址
mxp.validate.isIP = function (str) {
    var regexp = /^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$/;
    if (!regexp.exec(str)) return false;
    return true;
};

// 扩展验证
mxp.validate.extCheck = function (str) {
    var	pattern = str;
    regexp = new RegExp(pattern); 
    if (!regexp.exec(str)) return false;
    return true;
};

/* 基本验证
   str:      字符
   msg:      错误消息
   maxlen:   最大长度
   nullable: 可否为null
   type:     验证类型
   lenRange: 长度范围(必须将最大长度设为0)
   format:   验证格式
*/

// 显示错误消息
mxp.validate.showErrMsg = function (msg) {
	if (msg != null && msg != "") alert(msg);   
};


mxp.validate.exec = function (str, msg, maxlen, nullable, type, lenRange, format) {

    if (mxp.string.isNull(str) == true) {
		if (nullable == false) {
			mxp.validate.showErrMsg(msg);
            return false;
		}
		else 
			return true;
    }

    var len = mxp.string.getlength(str);
    if (maxlen != 0) {
        if (len >  maxlen)
        {
			mxp.validate.showErrMsg(msg);
		    return false;
        }
    } else {
		if (lenRange != null && lenRange != "") {
            var part = lenRange.split(",");
            var minlen = Number(part[0]);
            var maxlen = Number(part[1]);
            if(minlen > maxlen) {
		        alert("字符串长度范围设置错误！")
                return false;
			}
			if (!(minlen <= len && len <= maxlen)) {
		        mxp.validate.showErrMsg(msg);
		        return false;
			}
		}
	}

	if (type != null && type != "")  {
		if (type == "none") return true;

        var fnc = mxp.validate.checkMap[type];
		if (fnc != null) {
		    if (fnc(str, format) == false)
		    {
		        mxp.validate.showErrMsg(msg);
		        return false;
		    }
		} else {
		    alert("没有匹配的检测方法！")
            return false;
		}
	}
    return true;
};

mxp.validate.init();

//---------------------------------------------------------------------------
// html

mxp.html = {};

mxp.html.setStyle = function(obj, strStyle) {
    var oStyle = obj.getAttribute("style");
    if(oStyle == "[object]") {
        oStyle.setAttribute("cssText", strStyle);
        obj.setAttribute("style", oStyle);     //ff
    } else {
        obj.setAttribute("style", strStyle);   //ie
    }
};

mxp.html.getClass = function (obj) {

   if(mxp.render.html.ie) { //typeof obj.getAttribute("className") == "string"
       return obj.getAttribute("className");  //ie
   } else {
       return obj.getAttribute("class");  //ff
   }
};

mxp.html.setClass = function (obj, className) {

   if(mxp.render.html.ie) { //typeof obj.getAttribute("className") == "string"
       obj.setAttribute("className", className);  //ie
   } else {
       obj.setAttribute("class", className);  //ff
   }
};
   
mxp.html.setHtml = function (obj, content) {
	obj.innerHTML = content;
};

mxp.html.setOpacity = function (obj, percent) {
	if (mxp.render.html.ie) {
		obj.style.filter = "alpha(opacity = 35)"; 
	} else if (mxp.render.html.moz) {
        obj.style.MozOpacity = percent/100; 
	}
};

//---------------------------------------------------------------------------
// event
//	  mxp.event.cancelBubble(evt);
//	  mxp.event.stopAction(evt);     两句同时使用可阻止事件传播
// 

mxp.event = {};

// 阻止event起泡
mxp.event.cancelBubble = function(evt) {
	if (mxp.render.html.ie) {
		evt = window.event;
		evt.cancelBubble = true;
	} else if (mxp.render.html.moz) {
        evt.stopPropagation();
	}
};

mxp.event.stopAction = function(evt) {
	if (mxp.render.html.ie) {
		evt = window.event;
		evt.returnValue = false;
	} else if (mxp.render.html.moz) {
        evt.preventDefault();
	}
};

mxp.event.addEventHandler = function(target, evtType, handler) {
	if (target.addEventListener) {
		target.addEventListener(evtType, handler, false);
	} else if(target.attachEvent) {
		target.attachEvent("on" + evtType, handler);
	} else {
		target["on" + evtType] = handler;
	}
};

//---------------------------------------------------------------------------
mxp.dom = {};

mxp.dom.insertBefore = function(node, ref){
	if (node === ref || node.nextSibling === ref){ 
		return false; 
	}
	var parent = ref.parentNode;
	parent.insertBefore(node, ref);
	return true;
}

mxp.dom.insertAfter = function(node, ref){
	var pn = ref.parentNode;
	if(ref == pn.lastChild){
		if(node === ref){
			return false;
		}
		pn.appendChild(node);
	}else{
		return this.insertBefore(node, ref.nextSibling);
	}
	return true;
}

//-----------------------------------------
mxp.window = {};

mxp.window.dialog = function(url, width, height) {
	var handle = null;
    var x = parseInt(screen.width / 2.0) - (width / 2.0);  
    var y = parseInt(screen.height / 2.0) - (height / 2.0); 

    if (mxp.render.html.ie) {           
        handle = window.showModalDialog(url, window, "dialogWidth:"+width+"px; dialogHeight:"+height+"px; dialogLeft:"+x+"px; dialogTop:"+y+"px; status:no; directories:yes;scrollbars:no;Resizable=no; ");
    } else { 
        handle = window.open(url, "对话框", "top=" + y + ",left=" + x + ",scrollbars=no,dialog=yes,modal=yes,width=" + width + ",height=" + height + ",resizable=no;status:no;" ); 
        var keepFocus = function() {
            if(!handle.closed) {
                handle.focus();
            } else {
                if (keepFocus != null) {
                    window.removeEventListener('focus', keepFocus, false);
                    keepFocus = null;
                }
            }
         };
         window.addEventListener('focus', keepFocus, false, false);           
    } 
	return handle;
}

//-----------------------------------------
mxp.date = {};

mxp.date.getDateString = function(date) {
	var result = "";
	result += date.getYear();
	result += mxp.date.fillbit(date.getMonth());
	result += mxp.date.fillbit(date.getDate() + 1);
	result += mxp.date.fillbit(date.getHours());
	result += mxp.date.fillbit(date.getMinutes());
	result += mxp.date.fillbit(date.getSeconds());
    return result;
}

mxp.date.fillbit = function(value) {
	if (value < 10) {
		return "0" + value;
	} else {
		return value;
	}
}