/*本文件集中了系统所有的通用的js方法, 在每个页面都要包含该文件.*/

/*
*继承,js中的继承
*在子类中第一句话调用this.extend(new 父类);来实现继承

*/
Object.prototype.extend = function(object) {
  for (var key in object) {
    this[key] = object[key];
  }
  return this;
}

/*
*删除select的下拉内容

*/
function removeOptions(optionMenu) {
	var longMenu = optionMenu.options.length;
	while (longMenu--) {
		optionMenu.options[longMenu] = null;
	}
}

/*
*添加select的下拉内容

*/
function addOptions(optionMenu, /* Map */ valueLabels) {
	removeOptions(optionMenu);
	for (var i = 0, keys = valueLabels.keySet(), len = keys.length; i < len; i++) {
		optionMenu[i] = new Option(valueLabels.get(keys[i]), keys[i]);
	}
}

/**************************对String 对象的扩展*********************************/
/**
 * 替换字符串中指定的字符串
 */
String.prototype.relaceAll = function(oldstr, newstr){
	if (oldstr == null || newstr == null || typeof oldstr == "undefined" || typeof newstr == "undefined")
		throw new Error();
	
	// 使用正则表达式
	// return this.replace(new RegExp(oldstr, "ig"), newstr);
	var index = 0;
	var tmp = this;
	var sl = newstr.length - oldstr.length;
	while(tmp.indexOf(oldstr, index) != -1){
		tmp = tmp.replace(oldstr, newstr);
		index = tmp.indexOf(oldstr, index) + sl;
	}
	return tmp;
}

/*
*去除两端空格
*/
String.prototype.trim = function(){
	return this.replace(/(^\s+)|(\s+$)/g, "");
}

/*
*忽略大小写的比较, 不忽略大小写的比较用==
*/
String.prototype.equalsIgnoreCase = function(str){
	return this.toLowerCase() == str.toLowerCase();
}

/*
*判断字符串是否以指定的字符串开始*/
String.prototype.startsWith = function(str) {
    return this.substr(0, str.length) == str;
}

/*
*判断字符串是否以指定的字符串结束
*/
String.prototype.endsWith = function(str) {
    return this.substr(this.length - str.length) == str;
}

/**
 * 判断是否包含指定字符
 * @param {Object} str
 * @param {Object} sepr
 */
String.prototype.contains = function(str, sper) {
	return this.indexOf(str) > -1;
//	return (str) ? (sper + this + sper).indexOf(sper + str + sper) > -1 : this.indexOf(str) > -1;
}

/*******************对数组的扩展********************************/
/*
*附加另一个数组*/
Array.prototype.appendArray = function(arr){
	var tempArr = this;
	for(var i=0; i<arr.length; i++){
		tempArr = tempArr.concat(arr[i]);
	}
	return tempArr;
}

 Array.prototype.indexOf = function(obj) {
 	var result = -1;
 	for(var i = 0; i < this.length; i++) {
 		if(this[i] == obj) {
 			result = i;
 			break;
 		}
 	}
 	return result;
 }	

 Array.prototype.contains = function(obj) {
 	return this.indexOf(obj) > -1;
 }

 Array.prototype.append = function(obj,nodup) {
 	if(!(this.contains(obj) && nodup)) {
 		this[this.length] = obj;
 	}
 }
 
 Array.prototype.remove = function(obj) {
 	if(this.contains(obj)) {
 		var index = this.indexOf(obj);
 		for(var i = index; i < this.length - 1; i++) {
 			this[i] = this[i + 1];
 		}
 		this.length--;
 	}
 }
 
 Array.prototype.clear = function() {
 	var length = this.length;
 	for (var i = 0; i < length; i++) {
 		this.pop();
 	}
 }

/******************对Date对象的扩展*****************************/
/*
*IE和mozilla年的差量
*/
Date.DISPERSION = 1900;

/*
*试图解析参数字符串给定的日期,separator为日期分割符,分割符不能为:
*/
Date.parseText = function(str, separator){
	var temp = str.replace("T", " ");
	var sp = "-";
	if(separator != null)
		sp = separator;
	temp = temp.relaceAll(sp, "/");
	return Date.parse(temp);
}

/*
*验证日期格式, 注意分割符是-
*/
Date.validateDate = function(str){
	var pattern = /^(19[0-9]{2}|[2-9][0-9]{3})-((0(1|3|5|7|8)|10|12)-(0[1-9]|1[0-9]|2[0-9]|3[0-1])|(0(4|6|9)|11)-(0[1-9]|1[0-9]|2[0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9]))$/;
	var res = str.match(pattern);
	return res ? true : false;
}

/*
*验证时间格式
*/
Date.validateTime = function(str){
	var pattern = /^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){1}$/;
	var res = str.match(pattern);
	return res ? true : false; 
}

/*
*格式化日期

*/
Date.prototype.formatDate = function(separator){
	var sp = "-"
	if(separator != null)
		sp = separator;
	return (window.ActiveXObject?this.getYear() : Date.DISPERSION + this.getYear())
		+ sp + ((this.getMonth() + 1) > 9 ? (this.getMonth() + 1) : "0" + (this.getMonth() + 1))
		+ sp + (this.getDate() > 9 ? this.getDate() : "0" + this.getDate());
}

/*
*格式化日期和时间
*/
Date.prototype.formatDateTime = function(dateSeparator, dateTimeSeparator){
	return this.formatDate(dateSeparator) 
		+ (dateTimeSeparator == null ? " " : dateTimeSeparator) 
		+ (this.getHours() > 9 ? this.getHours() : "0" + this.getHours())  
		+ ":" + (this.getMinutes() > 9? this.getMinutes() : "0" + this.getMinutes())+ ":00"	
}

/************************用js实现的一个Map***********************/

function Map(){
	this.container = new Object();
}

Map.prototype.put = function(key, value){
	this.container[key] = value;
}

Map.prototype.get = function(key){
	return this.container[key];
}

Map.prototype.keySet = function() {
	var keyset = new Array();
	var count = 0;
	for (var key in this.container) {
		// 跳过object的extend函数
		if (key == 'extend')
			continue;
			
		keyset[count] = key;
		count++;
	}
	
	return keyset;
}

Map.prototype.size = function() {
	var count = 0;
	for (var key in this.container) {
		// 跳过object的extend函数
		if (key == 'extend')
			continue;
		count++;
	}
	return count;
}

Map.prototype.remove = function(key) {
	// TODO 待修改...
	this.container[key] = null;
}

Map.prototype.toString = function(){
	var str = "";
	for (var i = 0, keys = this.keySet(), len = keys.length; i < len; i++) {
		str = str + keys[i] + "=" + this.container[keys[i]] + ";\n";
	}
	return str;
}

/********************js的document****************************/
function XmlDocument() {}

/*
*一个助手方法, 用户无需用

*/
XmlDocument.getDomDocumentPrefix = function(){
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// 试图创建一个document对象,失败则继续

			new ActiveXObject(prefixes[i] + ".DomDocument");
			return prefixes[i];
		}catch (ex) {};
	}
	//如果全部都不能创建,则此浏览器不支持Dom
	throw new Error("Could not find an installed XML parser");
}

/*
*document的创建方法,生成一个docment对象
*/
XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(XmlDocument.getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

/*
*为mozilla补充Document方法
*/
if (window.DOMParser && window.XMLSerializer && window.Node && Node.prototype && Node.prototype.__defineGetter__) {
	//装载xml
	Document.prototype.loadXML = function (s) {
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	
	Document.prototype.selectNodes = function(sExpr, contextNode){
		var oResult = this.evaluate(sExpr, (contextNode?contextNode:this), 
							this.createNSResolver(this.documentElement),
							XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
		var nodeList = new Array(oResult.snapshotLength);
		nodeList.expr = sExpr;
		for(i=0;i<nodeList.length;i++)
			nodeList[i] = oResult.snapshotItem(i);
		return nodeList;
	};	
	
	Document.prototype.selectSingleNode = function(sExpr, contextNode){
		var ctx = contextNode?contextNode:null;
		sExpr += "[1]";
		var nodeList = this.selectNodes(sExpr, ctx);
		if(nodeList.length > 0)
			return nodeList[0];
		else 
			return null;
	};
	
	Element.prototype.selectNodes = function(sExpr){
		var doc = this.ownerDocument;
		if(doc.selectNodes)
			return doc.selectNodes(sExpr, this);
		else
			throw "SarissaXPathOperationException: Method selectNodes is only supported by XML Nodes";
	};	

	Element.prototype.selectSingleNode = function(sExpr){
		var doc = this.ownerDocument;
		if(doc.selectSingleNode)
			return doc.selectSingleNode(sExpr, this);
		else
			throw "SarissaXPathOperationException: Method selectSingleNode is only supported by XML Nodes. (original exception: "+e+")";
	};
}

/**********************XmlHttp对象*******************************/

function XmlHttp() {}

/*
*一个助手方法

*/
XmlHttp.getXmlHttpPrefix = function() {
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	for (var i = 0; i < prefixes.length; i++) {
		try {
			new ActiveXObject(prefixes[i] + ".XmlHttp");
			return prefixes[i];
		}catch (ex) {};
	}
	throw new Error("Could not find an installed XML parser");
}

/*
*创建对象方法
*/
XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			if (req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function")
						req.onreadystatechange();
				}, false);
			}
			return req;
		}
		if (window.ActiveXObject) {
			return new ActiveXObject(this.getXmlHttpPrefix() + ".XmlHttp");
		}
	}catch (ex) {}
	throw new Error("Your browser does not support XmlHttp objects");
};


/**************************XmlData类的js实现*************************/

/**
  * 构造函数

  * 传入的参数entity可以为实体名称, 也可以为代表实体内容的xml字符串, 
  * 由isEntityName参数指明
  */
function XmlData(entity, isEntityName) {
	this._data = null;

	if (isEntityName) { //如果传入的是实体名称
		this._data = XmlDocument.create();
		this._data.loadXML('<entities><entity/></entities>');
		var root = this._data.selectSingleNode('/entities/entity');
		root.setAttribute('name', entity);
	} else {
		this._data = XmlDocument.create();
		this._data.loadXML(entity);
	}
}

XmlData.prototype = {
	// 私有方法
	setFieldAttr: function(fieldNode, fieldValue, fieldLabel) {
	
		if (fieldValue == "null") {
			fieldNode.setAttribute("null", "true");
			if (fieldNode.getAttribute('value') != null) 
				fieldNode.removeAttribute('value');
		} else if (fieldNode.getAttribute('null') != null) {
			fieldNode.removeAttribute('null');
			fieldNode.setAttribute('value', fieldValue);
		}else if ((typeof fieldValue) == 'boolean') {
			fieldNode.setAttribute('value', fieldValue ? '1' : '0');
		} else {
			fieldNode.setAttribute('value', fieldValue);
		}
		
		if (fieldLabel != null)
			fieldNode.setAttribute('label', fieldLabel);

	}, 

	// 
	setField: function(fieldName, fieldValue, fieldLabel) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);
		if (field == null) {
			var newField = this._data.createElement(fieldName);
			this.setFieldAttr(newField, fieldValue, fieldLabel);
			this._data.firstChild.firstChild.appendChild(newField);
		} else {
			this.setFieldAttr(field, fieldValue, fieldLabel);
		}
	}, 

	setPickListField: function(fieldName, fieldValue, /* Map */ pickListItems) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);
		if (field == null) {
			field = this._data.createElement(fieldName);
			this.setFieldAttr(field, fieldValue, null);
			this._data.firstChild.firstChild.appendChild(field);
		} else {
			this.setFieldAttr(field, fieldValue, null);
		}
		
		// 增加pickList的item子节点

		if (pickListItems != null) {
			var pickListItem = null;
			for (var i = 0, keys = pickListItems.keySet(), len = keys.length; i < len; i++) {
				pickListItem = this._data.createElement('item');
				pickListItem.setAttribute('value', keys[i]);
				pickListItem.setAttribute('label', pickListItems.get(keys[i]));
				field.appendChild(pickListItem);
			}
		}
	}, 
	
	// 
	getFieldAsInt: function(fieldName) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);

		if (field == null) {
			return null;
		} else {
			if (field.getAttribute('null') != null) {
				return null;
			} else {
				return parseInt(field.getAttribute('value'));
			}
		}
	}, 

	// 
	getFieldAsFloat: function(fieldName) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);

		if (field == null) {
			return null;
		} else {
			if (field.getAttribute('null') != null) {
				return null;
			} else {
				return parseFloat(field.getAttribute('value'));
			}
		}
	}, 

	// 
	getFieldAsString: function(fieldName) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);

		if (field == null) {
			return null;
		} else {
			if (field.getAttribute('null') != null) {
				return null;
			} else {
				return field.getAttribute('value');
			}
		}
	}, 

	// 
	getFieldAsBoolean: function(fieldName) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);

		if (field == null) {
			return null;
		} else {
			if (field.getAttribute('null') != null) {
				return null;
			} else {
				var valueStr = field.getAttribute('value');
				return ((valueStr == '0') || (valueStr == 'false')) ? false : true;
			}
		}
	}, 

	getFieldLabel: function(fieldName) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);

		if (field == null) {
			return null;
		} else {
			return field.getAttribute('label');
		}
	}, 

	getPickListItems: function(fieldName) {
		var field = this._data.selectSingleNode('/entities/entity/' + fieldName);

		if ((field == null) || (field.childNodes == null)) 
			return null;
		
		var valueLabels = new Map();
		for (var i = 0, len = field.childNodes.length; i < len; i++) {
			valueLabels.put(field.childNodes[i].getAttribute('value'), 
			                field.childNodes[i].getAttribute('label'));
		}		
		return valueLabels;
	}, 

	// 得到entity包含的所有field名称
	getFieldArray: function() {
		var entityNode = this._data.selectSingleNode('/entities/entity');
		if (entityNode == null) 
			return null;
			
		var fieldArray = new Array(entityNode.childNodes.length);
		for (var i = 0, count = entityNode.childNodes.length; i < count; i++) {
			fieldArray[i] = entityNode.childNodes[i].nodeName;
		}
		
		return fieldArray;
	}, 
	
	// 得到entity包含的所有field名称
	getEntityName: function() {
		var entityNode = this._data.selectSingleNode('/entities/entity');
		if (entityNode == null) 
			return null;
			
		var entityName = entityNode.getAttribute("name");
		if (entityName == null || entityName == "")
			return null;
		return entityName;
	}, 
	
	// 
	asXML: function() {
		return this._data.xml;
	}, 

	// 
	showXML: function() {
		alert(this._data.xml);
	}
}

/*-------------------------------Form 类-------------------------------*/
var Form = {
    serialize: function(form) {
        var elements = Form.getElements($(form));
        var queryComponents = new Array();
    
        for (var i = 0; i < elements.length; i++) {
            var queryComponent = Form.Element.serialize(elements[i]);
            if (queryComponent)
                queryComponents.push(queryComponent);
        }
    
        return queryComponents.join('&');
    },
  
    getElements: function(form) {
        var form = $(form);
        var elements = new Array();

 	    for (tagName in Form.Element.Serializers) {
            var tagElements = form.getElementsByTagName(tagName);
            for (var j = 0; j < tagElements.length; j++)
                elements.push(tagElements[j]);
        }
        return elements;
    },
  
    getInputs: function(form, typeName, name) {
        var form = $(form);
        var inputs = form.getElementsByTagName('input');
    
        if (!typeName && !name)
        return inputs;
      
        var matchingInputs = new Array();
        for (var i = 0; i < inputs.length; i++) {
            var input = inputs[i];
            if ((typeName && input.type != typeName) ||
                (name && input.name != name)) 
            continue;
            matchingInputs.push(input);
        }

        return matchingInputs;
    },

    disable: function(form) {
        var elements = Form.getElements(form);
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            element.blur();
            element.disabled = 'true';
        }
    },

    enable: function(form) {
        var elements = Form.getElements(form);
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            element.disabled = '';
        }
    },

    focusFirstElement: function(form) {
        var form = $(form);
        var elements = Form.getElements(form);
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            if (element.type != 'hidden' && !element.disabled) {
                Field.activate(element);
                break;
            }
        }
    },

    reset: function(form) {
        $(form).reset();
    }, 
    
    /**
      * 将XmlData数据加载到form上的各个element, 参数form, entityName必须不为空, 
      * elementIds参数是element id数组, 用来指定将数据加载到这些element
      */
    fromData: function(form, /* XmlData */ xmlData, /* Array */ elementIds) {
    	var allFields = xmlData.getFieldArray();
    	if ((allFields == null) || (allFields.length <= 0))
    		return;
    		
    	var find, type;
    	for (var i = 0, len = allFields.length; i < len; i++) {
    		if (elementIds != null) {
    			find = false;
    			for (var j = 0, len2 = elementIds.length; j < len2; j++) {
	    			if (allFields[i] == elementIds[j]) {
	    				find = true;
	    				break;
	    			}
    			}
    			if (!find) continue;
    		}
    		
    		type = $(allFields[i]).type;
    		if (type == 'hidden') {
    			$(allFields[i]).value = xmlData.getFieldAsString(allFields[i]);
    			if ($('div_' + allFields[i]))
    				$('div_' + allFields[i]).innerHTML = xmlData.getFieldLabel(allFields[i]);
    		} else if (type == 'radio') {
    			if ($('rad_' + allFields[i] + '0')) {
    				$('rad_' + allFields[i] + '0').checked = xmlData.getFieldAsBoolean(allFields[i]);
    				$('rad_' + allFields[i] + '1').checked = !xmlData.getFieldAsBoolean(allFields[i]);
    			} else {
    				$(allFields[i]).checked = xmlData.getFieldAsBoolean(allFields[i]);
    			}
    		} else if (type == 'checkbox') {
    			$(allFields[i]).checked = xmlData.getFieldAsBoolean(allFields[i]);
    		} else if (type == 'select-one') {
    			var valueLabels = xmlData.getPickListItems(allFields[i]);
    			if ((valueLabels != null) && (valueLabels.size() > 0))
	    			addOptions($(allFields[i]), valueLabels);
    			$(allFields[i]).value = xmlData.getFieldAsString(allFields[i]);
    		} else {
    			$(allFields[i]).value = xmlData.getFieldAsString(allFields[i]);
    		}
    	}
    }, 
    
    /**
      * 提取form数据生成XmlData对象, 参数form, entityName必须不为空, 
      * elementIds参数是element id数组, 可指定提取页面上的哪些element
      */
    toData: function(form, /* String */ entityName, /* Array */ elementIds) {
    	if ((entityName == null) || (entityName == '')) {
    		alert('The second parameter(entityName) must be not null!');
    		return;
    	}
    
    	var xd = new XmlData(entityName, true);
    	var elements = Form.getElements(form);
    	var find;
    	for (var i = 0, len = elements.length; i < len; i++) {
    		if ((elementIds != null) && (elementIds.length > 0)) {
    			find = false;
    			for (var j = 0, len2 = elementIds.length; j < len2; j++) {
	    			if ((elements[i].id == elementIds[j]) ||
	    			    (elements[i].id == 'rad_' + elementIds[j] + '0') ||
	    			    (elements[i].id == 'rad_' + elementIds[j] + '1')) {
	    				find = true;
	    				break;
	    			}
    			}
    			if (!find) continue;
    		}
    		
    		if (elements[i].type == 'radio') {
    			var realId = null;
    			var lastChar = elements[i].id.substring(elements[i].id.length - 1);
    			if ((elements[i].id.indexOf('rad_') == 0) && 
    			    (lastChar == '0'  || lastChar == '1'))
    				realId = elements[i].id.substring(4, elements[i].id.length - 1);
    			
	    		if (realId) 
	    			xd.setField(realId, $('rad_' + realId + '0').checked);
	    		else 
	    			xd.setField(elements[i].id, $F(elements[i].id));
	    	} else {
	    		if ((elements[i].type == 'submit') ||
	    			(elements[i].type == 'rest') ||
	    			(elements[i].type == 'image') ||
	    			(elements[i].type == 'button'))
	    			continue;
	    	
	    		xd.setField(elements[i].id, $F(elements[i].id));
	    	}
    	}
    	
    	return xd;
    }, 
    
    /**
      * 在页面上按回车键可以转移焦点(Enter -> Tab)
      */
	moveFocus: function(event) {
		if (event.keyCode == 13 && event.srcElement.type != 'button' 
			&& event.srcElement.type != 'submit' 
			&& event.srcElement.type != 'reset' 
	    	&& event.srcElement.type != 'textarea' 
	    	&& event.srcElement.type != '')
			event.keyCode = 9;
	},
	
	/**
	 * 清空FormAction（页面隐藏域、页面状态等Form元素等没有component属性,不清空）
	 */
	clearFormElement: function(form) {
        var elements = Form.getElements(form);
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
			if (element.component == null) continue;
			var elementType = element.component.toLowerCase();
			if (elementType == "text" || elementType == "textarea" || elementType == "number" 
									  || elementType == "picklist" || elementType == "money") {
			    if(elementType == "picklist") {
			    	element.action = "backfill";
			    	element.modal_value = "";
			    }
				element.value = "";
			} else {
				switch (elementType) {
					case "checkbox":
						element.checked = false;
					case "lookup":
						var divObj = $("div_" + element.id);
						divObj.innerHTML = "";
						element.value = "";
						var inputObj = $("lookup_textfield_" + element.id);
						if(inputObj) {
							inputObj.value = "";
						}
						break;
					case "datepicker":
						element.value = "";
						if (element.crmstyle == "datetime") {
							var timeObj = $("tm_" + element.id);
							timeObj.value = "";
						}
						break;
				}
			}
        }
	}
}

Form.Element = {
    serialize: function(element) {
        var element = $(element);
        var method = element.tagName.toLowerCase();
        var parameter = Form.Element.Serializers[method](element);
    
        if (parameter)
            return encodeURIComponent(parameter[0]) + '=' + 
                   encodeURIComponent(parameter[1]);                   
    },
  
    getValue: function(element) {
    	if (element == '')
    		return null;
    
        var element = $(element);
        var method = element.tagName.toLowerCase();
        var parameter = Form.Element.Serializers[method](element);
    
        if (parameter) 
            return parameter[1];
    }
}

Form.Element.Serializers = {
    input: function(element) {
        switch (element.type.toLowerCase()) {
            case 'submit':
            case 'hidden':
            case 'password':
            case 'text':
                return Form.Element.Serializers.textarea(element);
            case 'checkbox':  
            case 'radio':
                return Form.Element.Serializers.inputSelector(element);
        }
        return false;
    },

    inputSelector: function(element) {
        if (element.checked)
            return [element.name, element.value];
    },

    textarea: function(element) {
        return [element.name, element.value];
    },

    select: function(element) {
        var value = '';
        if (element.type == 'select-one') {
            var index = element.selectedIndex;
            if (index >= 0)
            value = element.options[index].value || element.options[index].text;
        } else {
            value = new Array();
            for (var i = 0; i < element.length; i++) {
                var opt = element.options[i];
                if (opt.selected)
                    value.push(opt.value || opt.text);
            }
        }
        return [element.name, value];
    }
}

var $F = Form.Element.getValue;

/**
  * 根据element id得到element元素或者元素数组

  */
function $() {
	var elements = new Array();

	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if ((typeof element == 'string') && (element != ''))
			element = document.getElementById(element);
		if (arguments.length == 1) 
			return element;
		elements.push(element);
	}
	
	return elements;
}


/****************************验证类**********************************/

function Validate(){}

/**
*验证URL
*/
Validate.parseURL = function(value){
	if(value != null && value != "" && value.toLowerCase().indexOf("javascript:") > -1)
		return false;
	return true;
}

/**
*验证Email
*/
Validate.parseEmail = function(value){
	var emailPattern = /\w+@\w+/;
	if(value != null && value != "" && !emailPattern.test(value))
		return false;
	return true;
}

/**
*验证数字
*/
Validate.parseNumber = function(value){
	var numPattern = /^(-\d+|\d*)\.?\d*$/;
	if(value != null && value != "" && !numPattern.test(value))
		return false;
	return true;
}

/**
 * 是否为一个有效的Id，有效Id为40位字符，前'3位'为数字，而后有一个'-'分割符，后36位为随即生成的字符
 * 如: 002-880a0bbd-6e1e-49b0-b7a6-3678e3741f52
 */
Validate.isID = function(_id) {
	try {
		if (_id.length == 40) {
			var prefix = _id.substring(0, 3);
			if (Validate.parseNumber(prefix))
				return true;
		}
	} catch (ex) {
		return false;
	}
	return false;
}

/***************************弹出式下拉列表**********************************/
function openPickList(entityName,fieldName,isAll) {
	window.open("app?service=page/settings.picklist.PickListEditor&entityName=" + entityName + "&fieldName=" + fieldName + 
	"&isAll=" + isAll, "PickListEditer", "height=450, width=500,location=no,menubar=no,resizable=no,scrollbars=no,status=yes,toolbar=no");
}

/**
 * XHR工具
 */
function XHRUtil() {
	// 存放XHR对象集合
	this.xhrArray = new Array();
	
	/**
	 * 创建一个新的XHR对象并返回
	 */
	this.createdXHRObj = function() {
		var newxhr = false;
		try {
			if (window.ActiveXObject) {  // IE
				newxhr = new ActiveXObject("Microsoft.XMLHTTP");
				if (!newxhr) {
					newxhr = new ActiveXObject("Msxml2.XMLHTTP");
				}
			} else if (window.XMLHttpRequest) {  // Mozilla、Safari、Opera...
				newxhr = new XMLHttpRequest();
			} else {
				// alert("对不起，您的浏览器版本太低，不支持Ajax！");
			}
		} catch (ex) {
			// alert("对不起，您的浏览器版本太低，不支持Ajax！");
		}
		return newxhr;
	}
}

/**
 * 获取一个空闲的XHR对象.
 */
XHRUtil.prototype.borrowXHRObj = function() {
	var _temp = false;
	for (var i = 0; i < this.xhrArray.length; i++) {  
		if (0 == this.xhrArray[i].readyState) {  // 循环检查现有空闲对象
			_temp = this.xhrArray[i];
			break;
		}
		/*else if (xmlHttpPool[i].readyState == 4) {
			break;
		}*/
	}
	// 池中对象全部使用中，创建一个新的返回，并将其放入对象池
	if (!_temp) {
		_temp = this.createdXHRObj();
		this.xhrArray[this.xhrArray.length] = _temp;
	}
	return _temp;
}

/**
 * 销毁(使其成为初始状态)一个XHR对象
 */
XHRUtil.prototype.passivateXHRObj = function(xhr) {
	if (xhr) {
		xhr.onreadystatechange = {};
		xhr.abort();
	}
}

/**
 * 清空所有XHR对象，包括存放对象的集合
 */
XHRUtil.prototype.destroyAll = function() {
	for (var i = 0; i < this.xhrArray.length; i++) {
		this.xhrArray[i] = null;
	}
	this.xhrArray = null;
}

function $time(){
	return new Date().getTime();
};

function $defined(ele) {
	if (ele === null || typeof ele === 'undefined' && ele !== false)
		return false;
	return true;
};

function $delay(ms) {
	
}

// 
var clear_event_ie = !!window.ActiveXObject;
var clear_event_list = ['onbeforecut', 'onblur', 'onclick', 'oncontextmenu', 'oncut', 
     'ondblclick', 'ondeactivate', 'ondragenter', 'ondragleave', 'ondragover',
     'ondrop',  'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 
     'onkeypress', 'onkeyup', 'onmousedown', 'onmouseenter', 'onmouseleave', 
     'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel',
     'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onreadystatechange',
     'onresize', 'onresizeend', 'onresizestart', 'onselectstart'
];
function clear_event_fix_memory_leaks(d) {
	if ($defined(d) || !clear_event_ie)
		return;
	
	var a, i, l, n;
	a = clear_event_list;
	try{
		if (a) {
			l = a.length;
			for (i = 0; i < l; i += 1) {
				n = a[i];
				if (typeof d[n] === 'function') {
					d[n] = null;
				}
			}
		}
		a = d.childNodes;
		if (a) {
			l = a.length;
			for (i = 0; i < l; i += 1) {
				this.clearEvent(d.childNodes[i]);
			}
		}
	} catch (ex) { }
}
