/**
 * 本文件为系统级工具函数, 每个页面都应该包含它
 * @version v3.1 08/01/2007
 * --------------------------------------------------------
 * http://www.wisenter.com/
 * Copyright (C) 2002-2007 Wisenter Software
 */

/**
 * 系统的数据类型
 */
var WSFieldTypes = {
	INT					: "int",
	PICKLIST 			: "picklist",	
	STATE				: "state",
	STATUS				: "status",
	BOOLEAN				: "boolean",
	DECIMAL				: "decimal",
	MONEY				: "money",
	PERCENT				: "percent",
	TEXT				: "text",
	TEXTAREA			: "textarea",
	EMAIL				: "email",
	URL					: "url",
	PRIMARYKEY  		: "primarykey",
	REFERENCE			: "reference",
	REFERENCELIST 		: "referencelist",
	ANYREFERENCE		: "anyreference",
	DATE				: "date",
	DATETIME			: "datetime",
	NULL				: "null",
	NOTNULL				: "notNull",
	ALL					: "all"
}

/**
 * Money类型
 */
function Money(){}

/**
 * 验证格式
 */
Money.validate = function(value){
	if(value == null || value == "")
		return true;
	var moneyPattern = /^-?\d{1,3}(,\d{3})*\.?\d*$/;
	if(!Validate.parseNumber(value) && !moneyPattern.test(value))
		return false
	return true;
}

/**
 * 格式化Money, 0000,0000,0000.00
 */
Money.format = function(value, accuracy){
	var newValue = new Number(value).toFixed(accuracy).toString();
	var isNegative = false;
	if(newValue.startsWith("-")){
		isNegative = true;
		newValue = newValue.substring(1);
	}
	var intPart = (newValue.indexOf(".") == -1 ? newValue : newValue.substring(0, newValue.indexOf(".")));
	var formatedValue = this.formatIntPart(intPart);
	if(accuracy != 0)
		formatedValue = formatedValue + newValue.substring(newValue.indexOf("."));
	return (isNegative ? "-" + formatedValue : formatedValue);
}

/**
 * 格式化整数部分 */
Money.formatIntPart = function(integer){
	if(integer == "")
		return "0";
 	if(integer.indexOf(",") != -1 || integer.length <= 3)
		return integer;
	var len = integer.length;
	var upmost = integer.substring(0,len%3);
	integer = integer.substring(len%3);
	var perchInt = "";
	for(var i=integer.length/3; i>0; i--){
		var perch = integer.substring(0,3);
		integer = integer.substring(3);
		perchInt = (perchInt == "" ? perch : perchInt+ "," +perch);
	}
	return (len%3 == 0? perchInt : upmost  + "," +  perchInt);
}

/**
 * 反格式化
 */
Money.unformat = function(value){
	var realValue = "";
	if(value.indexOf(",") != -1){
		var parts = value.split(",");
		for(var i=0; i<parts.length; i++){
			realValue = realValue + parts[i];
		}
	}else{
		realValue= value;
	}
	return new Number(realValue);
}

/**********************系统对象*****************************/
function Sys(){ };

/**
 * JS中的调试信息
 */
Sys.logInfo = function(/* String */ info) {
	Log_Level = "debug";  //Log的级别.
	if (Log_Level == "debug")
		alert(info);
}

/**
 * 发送XMLHTTP请求
 */
Sys.XMLHttpRequest = function(xml, url, course, action){
	if(url == null || url.trim() == "")
		throw new Error("Sys.XmlHttpRequest must have a request url!");
	var sUrl = this.amendXMLHttpURL(url, course, action);
	var xmlHttp = XmlHttp.create();
  	xmlHttp.open("POST", sUrl, false);
  	if(xml != null){
		var xmlDoc = xml;
		if ((typeof xml) == 'string') {
			xmlDoc = XmlDocument.create();
			xmlDoc.loadXML(xml);
		}
		
  		xmlHttp.send(xmlDoc);
  	}else{
  		xmlHttp.send(null);
  	}
  	return xmlHttp.responseText;
}

/**
 * 发送TEXTHTTP请求
 */
Sys.TextHttpRequest = function(xml, url, course, action){
	if(url == null || url.trim() == "")
		throw new Error("Sys.XmlHttpRequest must have a request url!");
	var sUrl = this.amendXMLHttpURL(url, course, action);
	var xmlHttp = XmlHttp.create();
  	xmlHttp.open("POST", sUrl, false);
  	if(xml != null){
  		xmlHttp.send(xml);
  	}else{
  		xmlHttp.send(null);
  	}
  	return xmlHttp.responseText;
}

/**
 * 向当前页面发送请求 */
Sys.XMLHttpRequestSelf = function(xml,mode,action){
	//alert( window.location.href.toString());
  	return this.XMLHttpRequest(xml, window.location.href.toString(), mode, action);
}

/**
 * 发送异步的XMLHTTP请求
 */
/*Sys.XMLHttpAsynchronismRequest = function(xml, url, course, action, fun){
	if(url == null || url.trim() == "")
		throw new Error("Sys.XmlHttpRequest must have a request url!");
	var xmlHttp = XmlHttp.create();
	var sUrl = this.amendXMLHttpURL(url, course, action);
	xmlHttp.open("POST", sUrl, true);
	xmlHttp.onreadystatechange = function () {
     if (xmlHttp.readyState == 4){
     			//alert(Http.responseText);
     			fun(xmlHttp.responseText);
         		//return xmlHttp.responseText; 
         }
   	}
	var doc = XmlDocument.create();
   	doc.loadXML("<activity/>");
	xmlHttp.send(doc);
}*/

Sys.XMLHttpAsynchronismRequest = function (xml, url, course, action) {
		http_request = false;
		var sUrl = this.amendXMLHttpURL(url, course, action);
		
        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
   		
        http_request.onreadystatechange = Sys.alertContents;
        http_request.open('POST', sUrl, true);
        
        if (xml != null) {
			var doc = XmlDocument.create();
	   		doc.loadXML(xml);
	        http_request.send(doc);
        } else {
        	http_request.send(null);
        }
        
}

Sys.alertContents = function() {
	    if (http_request.readyState == 4) {
	        if (http_request.status == 200) {
	        	checkAlert(http_request.responseText);
	        	
	        	// 异步请求需要置空XmlHttpRequest对象, 否则IE内存不能释放
	        	if (http_request != null) 
	        		http_request = null;
	        } else {
	            //alert('There was a problem with the request.');
	        }
	    }
}

/**
 * 向自己的页面后台发送异步的XMLHTTP请求
 */
Sys.XMLHttpAsynchronismRequestSelf = function(xml,mode,action){
  	return this.XMLHttpAsynchronismRequest(xml, document.location.toString(), mode, action);
}

/**
 * 私有，外部不该调用 * 对进行xml请求的url进行处理, 
 */
Sys.amendXMLHttpURL = function(url, mode, action){
	var sUrl = url;
	if(sUrl.endsWith("#"))
		sUrl = sUrl.substring(0, sUrl.length-1);
	if(sUrl.indexOf("?") != -1){
		if(sUrl.indexOf("&"+mode+"=") != -1){
			sUrl = sUrl.substring(0,sUrl.indexOf("&"+mode+"="))
  		}
		sUrl = sUrl + "&"+mode+"="+action;
	}else{
		sUrl =sUrl + "?" + mode + "=" + action;
	}
	return sUrl;
}

/**
 * 获得系统语言字符串 * xmlhttp请求格式<paramInfo><key value='XXX'></paramInfo>
 */
Sys.LANGUAGE_SERVLET_PATH = "servlet/com.wisecrm.servlet.LanguageServlet";
Sys.USERID_PATH = "servlet/com.wisecrm.servlet.UserServlet";

Sys.getString = function(key){
	if (key != null && key != "") {
		return this.TextHttpRequest(key, this.LANGUAGE_SERVLET_PATH + "?skipCookieAutoUpdate=true", "isKeys", "false");
	} else {
		return "";
	}
}

Sys.getUserId = function(){
	// 优先从html模板获取语言字符串	return this.XMLHttpRequest(null, this.USERID_PATH + "?skipCookieAutoUpdate=true", "action", "getUserId");
}

Sys.getUserName = function() {
	return this.XMLHttpRequest(null, this.USERID_PATH + "?skipCookieAutoUpdate=true", "action", "getUserName");
}

Sys.getUserOnlineId = function() {
	return this.XMLHttpRequest(null, this.USERID_PATH + "?skipCookieAutoUpdate=true", "action", "getUserOnlineId");
}

///**
// * xmlhttp请求格式<paramInfo><key value='XXX'><key value='YYY'></paramInfo>
// * 请求返回格式为<paramInfo><key value='XXX' label="xxx"><key value='YYY' label="yyy"></paramInfo>
// * 本函数返回结果为Map.
// */
//Sys.getStrings = function(keys){
//   	var doc = XmlDocument.create();
//    doc.loadXML("<paramInfo/>");
//    for(var i=0; i<keys.length; i++){
//    	var node = doc.createElement("key");
//    	node.setAttribute("value", keys[i]);
//    	 doc.firstChild.appendChild(node);
//    }
//    var result = this.XMLHttpRequest(doc.xml,  this.LANGUAGE_SERVLET_PATH + "?skipCookieAutoUpdate=true", "isKeys", "true");
//    var resDoc = XmlDocument.create();
//    resDoc.loadXML(result);
//	var keyLabelEles = resDoc.selectSingleNode("/keys").childNodes;
//	var map = new Map();
//	for(var i=0; i<keyLabelEles.length; i++){
//		map.put(keyLabelEles[i].getAttribute("value"), keyLabelEles[i].getAttribute("label"));
//	}
//    return map;
//}


/**
 * version 1.1 modify by huxw keys = "","","".... return map
 * ******version 1.0 ********
 * old: xmlhttp请求格式<paramInfo><key value='XXX'><key value='YYY'></paramInfo>
 * old: 请求返回格式为<paramInfo><key value='XXX' label="xxx"><key value='YYY' label="yyy"></paramInfo>
 * 返回Map.
 */
Sys.getStrings = function(keys){
	if(keys.length < 2) {
		var map = new Map();
		map.put(keys[0],Sys.getString(keys[0]));
		return map;
	}
	var keyValues ="";
    for(var i=0; i<keys.length; i++){
		keyValues += keys[i] + ",";
    }
	keyValues = keyValues.substr(0,keyValues.length-1);
    var result = this.TextHttpRequest(keyValues,  this.LANGUAGE_SERVLET_PATH + "?skipCookieAutoUpdate=true", "isKeys", "true");
	var values = result.split(",");
	var map = new Map();
	for(var i=0; i<keys.length; i++){
		map.put(keys[i], values[i]);
	}
    return map;
}

/**
 * 获得指定url中的所有参数的一个map
 */
Sys.getParametersFromURL = function(url){
	var str = '';
	str = url.replace(/%20/g, " ");
	var param = str.substring(str.indexOf("?") + 1);
	var paramMap = new Map();
	var params = param.split("&");
	for(var i=0; i<params.length; i++){
		var keyValue = params[i].split("=");
		paramMap.put(keyValue[0], keyValue[1]);
	}
	return paramMap;
}

/**
 * 获得指定url的某个参数
 */
Sys.getParameterFromURL = function(url, name){
	var paramMap = this.getParametersFromURL(url);
	return paramMap.get(name);
}

/**
 * 获得url中的所有参数的一个map
 */
Sys.getParameters = function(){
	return this.getParametersFromURL(window.location.search);
}

/**
 * 根据参数名获得url中的参数, 如果有同名参数得到的是第一个
 */
Sys.getParameter = function(name){
	var paramMap = this.getParameters();
	return paramMap.get(name);
}

/**
 *删除select的下拉内容 */
Sys.removeOptions = function(optionMenu){
	var longMenu = optionMenu.options.length;
	while(longMenu--){
		optionMenu.options[longMenu] = null;
	}
}

/**
 *添加select的下拉内容 */
Sys.addOptions = function(optionMenu,labels,values){
	removeOptions(optionMenu);
	for(var i = 0; i < labels.length; i++){
		optionMenu[i] = new Option(labels[i],values[i]);
	}
}

/**
 * 写入cookie;
 */
Sys.writeCookie = function(key, value){
	if(key == null)
		throw new Error("The cookie key must be not Null!");
	var k = key.trim();
	if(k.indexOf(",") != -1 || k.indexOf(";") != -1)
		throw new Error("The cookie key can't include , or ;");
	if(value == null)
		throw new Error("The cookie value must be not null!");
	document.cookie = k + "=" + escape(value);
}

/**
 * 得到cookie所有值的一个map
 */
Sys.readCookies = function(){
	if(document.cookie == null || document.cookie == '')
		return null;
	var cookiesMap = new Map();
	var begin = 0;
	while(begin < document.cookie.length){
		var middle = document.cookie.indexOf("=", begin);
		var end = document.cookie.indexOf(";", begin);
		end = (end == -1 ? document.cookie.length : end);
		var name = null, value = "";
		if(middle > end || middle == -1){
			name = document.cookie.substring(begin, end);
		}else{
			name = document.cookie.substring(begin, middle);
			value = document.cookie.substring(middle + 1, end);
		}
		cookiesMap.put(name, unescape(value));
		begin = end + 2;
	}
	return cookiesMap;
}

/**
 * 得到cookie的值 */
Sys.readCookie = function(key) {
	return this.readCookies().get(key);
}

/**
 * id与实体及编辑页面的映射 */
Sys.typeCodeEntityInfoMapper = new Map();
{
	function EntityInfo(name, editUrl){
		this.name 		= name;
		this.editUrl 	= editUrl;
	}
	Sys.typeCodeEntityInfoMapper.put("001", new EntityInfo("Lead", "customer.lead.LeadOperate"));
	Sys.typeCodeEntityInfoMapper.put("002", new EntityInfo("Account", "customer.account.AccountOperate"));
	Sys.typeCodeEntityInfoMapper.put("003", new EntityInfo("Contact", "customer.contact.ContactOperate"));
	Sys.typeCodeEntityInfoMapper.put("004", new EntityInfo("Subject", "settings.subject.SubjectOperate"));
	Sys.typeCodeEntityInfoMapper.put("005", new EntityInfo("Country", "settings.address.country.CountryDetail"));
	Sys.typeCodeEntityInfoMapper.put("006", new EntityInfo("Province", "settings.address.province.ProvinceDetail"));
	Sys.typeCodeEntityInfoMapper.put("007", new EntityInfo("City", "settings.address.city.CityDetail"));
	Sys.typeCodeEntityInfoMapper.put("008", new EntityInfo("Activity", "activities.activity.ActivityOperate"));
	Sys.typeCodeEntityInfoMapper.put("009", new EntityInfo("Product", "SFA.product.ProductOperate"));
	Sys.typeCodeEntityInfoMapper.put("010", new EntityInfo("UnitGroup", "SFA.unit.UnitGroupOperate"));
	//Sys.typeCodeEntityInfoMapper.put("011", new EntityInfo());
	Sys.typeCodeEntityInfoMapper.put("012", new EntityInfo("UnitItem", "SFA.unit.UnitItemOperate"));
	Sys.typeCodeEntityInfoMapper.put("013", new EntityInfo("PricePlan", "SFA.priceplan.PricePlanOperate"));
	Sys.typeCodeEntityInfoMapper.put("014", new EntityInfo("Quote", "SFA.quote.QuoteOperate"));
	Sys.typeCodeEntityInfoMapper.put("015", new EntityInfo("QuoteDetail", "SFA.quote.QuoteDetailDetail"));
	Sys.typeCodeEntityInfoMapper.put("016", new EntityInfo("SalesOrder", "SFA.salesorder.SalesOrderOperate"));
	Sys.typeCodeEntityInfoMapper.put("017", new EntityInfo("SalesOrderDetail", "SFA.salesorder.SalesOrderDetailDetail"));
	Sys.typeCodeEntityInfoMapper.put("018", new EntityInfo("Opportunity", "SFA.opportunity.OpportunityOperate"));
	Sys.typeCodeEntityInfoMapper.put("019", new EntityInfo("OpportunityDetail", "SFA.opportunity.OpportunityDetailDetail"));
	Sys.typeCodeEntityInfoMapper.put("020", new EntityInfo("Annotation", "activities.annotation.AnnotationOperate"));
	Sys.typeCodeEntityInfoMapper.put("021", new EntityInfo("CustomizedView", "controls.manageCustomizedView.CustomizedViewEdit"));
//	Sys.typeCodeEntityInfoMapper.put("022", new EntityInfo("CustomizedFilter", "common.advancedFilter.QuickTreeFilter"));
	Sys.typeCodeEntityInfoMapper.put("023", new EntityInfo("Role", "bizunit.role.RoleDetail"));
	Sys.typeCodeEntityInfoMapper.put("024", new EntityInfo("RolePrivileges", null));
	Sys.typeCodeEntityInfoMapper.put("025", new EntityInfo("UserRoles", null));
	Sys.typeCodeEntityInfoMapper.put("026", new EntityInfo("PrincipalObjectAccess", null));
	Sys.typeCodeEntityInfoMapper.put("027", new EntityInfo("User", "bizunit.user.UserDetail"));
	Sys.typeCodeEntityInfoMapper.put("028", new EntityInfo("Team", "bizunit.team.TeamDetail"));
	Sys.typeCodeEntityInfoMapper.put("029", new EntityInfo("TeamUsers", null));
	Sys.typeCodeEntityInfoMapper.put("030", new EntityInfo("BusinessUnit", "bizunit.bizunit.BizUnitDetail"));
	Sys.typeCodeEntityInfoMapper.put("031", new EntityInfo("BusinessUnitMap", null));
	Sys.typeCodeEntityInfoMapper.put("032", new EntityInfo("PriceItem", "SFA.priceplan.PriceItemOperate"));
	Sys.typeCodeEntityInfoMapper.put("033", new EntityInfo("Queue", "bizunit.queue.QueueDetail"));
	Sys.typeCodeEntityInfoMapper.put("034", new EntityInfo("QueueItem", null));
	Sys.typeCodeEntityInfoMapper.put("035", new EntityInfo("KbArticle", "CS.articles.KBArticleOperate"));
	Sys.typeCodeEntityInfoMapper.put("036", new EntityInfo("Analysis", null));
	Sys.typeCodeEntityInfoMapper.put("037", new EntityInfo("AnalysisFolder", null));
	Sys.typeCodeEntityInfoMapper.put("038", new EntityInfo("ServiceCase", "CS.cases.ServiceCaseOperate"));
	Sys.typeCodeEntityInfoMapper.put("039", new EntityInfo("SystemSetting", null));
	Sys.typeCodeEntityInfoMapper.put("040", new EntityInfo("Expense", "workplace.expense.ExpenseOperate"));
	Sys.typeCodeEntityInfoMapper.put("041", new EntityInfo("ExpenseLineItem", null));
	Sys.typeCodeEntityInfoMapper.put("042", new EntityInfo("SalesCharge", "SFA.salescharge.SalesChargeOperate"));
	Sys.typeCodeEntityInfoMapper.put("043", new EntityInfo("ServiceLineItem", "CS.cases.ServiceLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("044", new EntityInfo("ServiceContract", "CS.servicecontract.ServiceContractOperate"));
	Sys.typeCodeEntityInfoMapper.put("045", new EntityInfo("ServiceContractLineItem", "CS.servicecontract.ServiceContractLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("046", new EntityInfo("ServiceComplain", "CS.servicecomplain.ServiceComplainOperate"));	
	Sys.typeCodeEntityInfoMapper.put("047", new EntityInfo("ServiceCharge", "CS.servicecharge.ServiceChargeOperate"));
	Sys.typeCodeEntityInfoMapper.put("048", new EntityInfo("ServiceChargeLineItem", "CS.servicecharge.ServiceChargeLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("049", new EntityInfo("ReturnVisit", "CS.returnvisit.ReturnVisitOperate"));
	Sys.typeCodeEntityInfoMapper.put("050", new EntityInfo("Purchase", "stock.purchase.PurchaseOperate"));
	Sys.typeCodeEntityInfoMapper.put("051", new EntityInfo("PurchaseLineItem", "stock.purchase.PurchaseLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("052", new EntityInfo("StockIn", "stock.stockin.StockInOperate"));
	Sys.typeCodeEntityInfoMapper.put("053", new EntityInfo("StockInLineItem", "stock.stockinlineitem.StockInLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("054", new EntityInfo("Depot", "stock.depot.DepotOperate"));
	Sys.typeCodeEntityInfoMapper.put("056", new EntityInfo("StockOut", "stock.stockout.StockOutOperate"));
	Sys.typeCodeEntityInfoMapper.put("057", new EntityInfo("StockOutLineItem", "stock.stockout.StockOutLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("058", new EntityInfo("Invoice", "stock.invoice.InvoiceOperate"));
	Sys.typeCodeEntityInfoMapper.put("059", new EntityInfo("InvoiceLineItem", "stock.invoice.InvoiceLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("060", new EntityInfo("ProductStock", "stock.productstock.ProductStockOperate"));
	Sys.typeCodeEntityInfoMapper.put("061", new EntityInfo("StockAllot", "stock.stockallot.StockAllotOperate"));
	Sys.typeCodeEntityInfoMapper.put("062", new EntityInfo("StockAllotLineItem", "stock.stockallot.StockAllotLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("063", new EntityInfo("StockBalance", "stock.stockbalance.StockBalanceOperate"));
	Sys.typeCodeEntityInfoMapper.put("064", new EntityInfo("StockBalanceLineItem", "stock.stockbalance.StockBalanceLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("065", new EntityInfo("PurchasePayment", "stock.purchasepayment.PurchasePaymentOperate"));
	Sys.typeCodeEntityInfoMapper.put("067", new EntityInfo("Competitor", "SFA.competitor.CompetitorOperate"));
	Sys.typeCodeEntityInfoMapper.put("068", new EntityInfo("ThirdProduct", "SFA.thirdProduct.ThirdProductOperate"));
	Sys.typeCodeEntityInfoMapper.put("069", new EntityInfo("OpportunityCompetitor", "SFA.opportunitycompetitor.OpportunityCompetitorOperate"));
	Sys.typeCodeEntityInfoMapper.put("070", new EntityInfo("CompetitorProduct", "SFA.competitorproduct.CompetitorProductOperate"));
	Sys.typeCodeEntityInfoMapper.put("074", new EntityInfo("Announcement", "announcement.AnnouncementOperate"));
	Sys.typeCodeEntityInfoMapper.put("080", new EntityInfo("DiscountRule", "SFA.discountrule.DiscountRuleOperate"));
	Sys.typeCodeEntityInfoMapper.put("081", new EntityInfo("DiscountRuleDetail", "SFA.discountrule.DiscountRuleDetailOperate"));
	Sys.typeCodeEntityInfoMapper.put("089", new EntityInfo("AuditFlow", "settings.auditflow.AuditFlowOperate"));	
	Sys.typeCodeEntityInfoMapper.put("090", new EntityInfo("AuditFlowStep", "settings.auditflow.AuditFlowStepDetail"));	
	Sys.typeCodeEntityInfoMapper.put("092", new EntityInfo("AccountConflictHistory", "bizunit.accountConflictHistory.AccountConflictHistoryOperate"));	
	Sys.typeCodeEntityInfoMapper.put("101", new EntityInfo("DraftboxEmail", "common.email.SendEmailOperate"));
	Sys.typeCodeEntityInfoMapper.put("103", new EntityInfo("InboxEmail", "common.email.InboxEmailOperate"));
	Sys.typeCodeEntityInfoMapper.put("106", new EntityInfo("ObjectGroup", "bizunit.group.ObjectGroupOperate"));	
	Sys.typeCodeEntityInfoMapper.put("110", new EntityInfo("IncomingInfo", "customer.accountproblem.IncomingInfoOperate"));	
	Sys.typeCodeEntityInfoMapper.put("111", new EntityInfo("AccountProblem", "customer.accountproblem.AccountProblemOperate"));	
	Sys.typeCodeEntityInfoMapper.put("112", new EntityInfo("ReturnedGoods", "stock.returnedgoods.ReturnedGoodsOperate"));	
	Sys.typeCodeEntityInfoMapper.put("113", new EntityInfo("ReturnedGoodsLineItem", "stock.returnedgoods.ReturnedGoodsLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("114", new EntityInfo("ReturnedGoodsPayment", "stock.returnedgoodspayment.ReturnedGoodsPaymentOperate"));
	Sys.typeCodeEntityInfoMapper.put("115", new EntityInfo("AccountLevel", "settings.accountLevel.accountLevelDetail"));
	Sys.typeCodeEntityInfoMapper.put("114", new EntityInfo("AccountPoints", "customer.account.AccountPointsOperate"));
	Sys.typeCodeEntityInfoMapper.put("117", new EntityInfo("ExcelReport", null));
	Sys.typeCodeEntityInfoMapper.put("118", new EntityInfo("SalesInvoice", "SFA.salesinvoice.SalesInvoiceOperate"));
	Sys.typeCodeEntityInfoMapper.put("119", new EntityInfo("SalesInvoiceLineItem", "SFA.salesinvoice.SalesInvoiceLineItemDetail"));
	Sys.typeCodeEntityInfoMapper.put("125", new EntityInfo("SerialNumberRecycle", "stock.serialnumberrecycle.SerialNumberRecycleOperate"));
	Sys.typeCodeEntityInfoMapper.put("137", new EntityInfo("CallCenterServer", null));
	Sys.typeCodeEntityInfoMapper.put("145", new EntityInfo("InboxFax", "common.fax.InboxFaxOperate"));
	Sys.typeCodeEntityInfoMapper.put("146", new EntityInfo("OutboxFax", "common.fax.OutboxFaxOperate"));
}

/**
	实体名与对应权限的映射关系
*/
Sys.entityNameToPrivilegeNameMapper = new Map();
{
	Sys.entityNameToPrivilegeNameMapper.put("Account",           {CREATE:"CREATE_ACCOUNT",
												   				  READ:"READ_ACCOUNT",
													   			  WRITE:"WRITE_ACCOUNT",
													  			  DELETE:"DELETE_ACCOUNT",
													   			  SHARE:"SHARE_ACCOUNT", 
													   			  ASSIGN:"ASSIGN_ACCOUNT"});
	Sys.entityNameToPrivilegeNameMapper.put("Lead",              {CREATE:"CREATE_LEAD",
													   			  READ:"READ_LEAD",
													   			  WRITE:"WRITE_LEAD",
													   			  DELETE:"DELETE_LEAD",
													   			  SHARE:"SHARE_LEAD",
													   			  ASSIGN:"ASSIGN_LEAD"});
	Sys.entityNameToPrivilegeNameMapper.put("Activity",          {CREATE:"CREATE_ACTIVITY",
												                  READ:"READ_ACTIVITY",
												                  WRITE:"WRITE_ACTIVITY",
																  DELETE:"DELETE_ACTIVITY",
																  SHARE:"SHARE_ACTIVITY",
																  ASSIGN:"ASSIGN_ACTIVITY"});
	Sys.entityNameToPrivilegeNameMapper.put("Annotation",        {CREATE:"CREATE_ANNOTATION",
												                  READ:"READ_ANNOTATION",
												                  WRITE:"WRITE_ANNOTATION",
																  DELETE:"DELETE_ANNOTATION",
																  SHARE:"SHARE_ANNOTATION",
																  ASSIGN:"ASSIGN_ANNOTATION"});
	Sys.entityNameToPrivilegeNameMapper.put("Contact",           {CREATE:"CREATE_CONTACT",
												                  READ:"READ_CONTACT",
												                  WRITE:"WRITE_CONTACT",
																  DELETE:"DELETE_CONTACT",
																  SHARE:"SHARE_CONTACT",
																  ASSIGN:"ASSIGN_CONTACT"});
	Sys.entityNameToPrivilegeNameMapper.put("Opportunity",       {CREATE:"CREATE_OPPORTUNITY",
												                  READ:"READ_OPPORTUNITY",
												                  WRITE:"WRITE_OPPORTUNITY",
																  DELETE:"DELETE_OPPORTUNITY",
																  SHARE:"SHARE_OPPORTUNITY",
																  ASSIGN:"ASSIGN_OPPORTUNITY"});
	Sys.entityNameToPrivilegeNameMapper.put("Product",           {CREATE:"CREATE_PRODUCT",
												                  READ:"READ_PRODUCT",
												                  WRITE:"WRITE_PRODUCT",
																  DELETE:"DELETE_PRODUCT",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("Quote",             {CREATE:"CREATE_QUOTE",
												                  READ:"READ_QUOTE",
												                  WRITE:"WRITE_QUOTE",
																  DELETE:"DELETE_QUOTE",
																  SHARE:"SHARE_QUOTE",
																  ASSIGN:"ASSIGN_QUOTE",
																  APPROVAL:"APPROVAL_QUOTE"});
	Sys.entityNameToPrivilegeNameMapper.put("Role",              {CREATE:"CREATE_ROLE",
												                  READ:"READ_ROLE",
												                  WRITE:"WRITE_ROLE",
																  DELETE:"DELETE_ROLE",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("SalesOrder",        {CREATE:"CREATE_SALES_ORDER",
												                  READ:"READ_SALES_ORDER",
												                  WRITE:"WRITE_SALES_ORDER",
																  DELETE:"DELETE_SALES_ORDER",
																  SHARE:"SHARE_SALES_ORDER",
																  ASSIGN:"ASSIGN_SALES_ORDER",
																  APPROVAL:"APPROVAL_SALES_ORDER"});
	Sys.entityNameToPrivilegeNameMapper.put("Subject",           {CREATE:"CREATE_SUBJECT",
												                  READ:"READ_SUBJECT",
												                  WRITE:"WRITE_SUBJECT",
																  DELETE:"DELETE_SUBJECT",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("Team",              {CREATE:"CREATE_TEAM",
												                  READ:"READ_TEAM",
												                  WRITE:"WRITE_TEAM",
																  DELETE:"DELETE_TEAM",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("User",              {CREATE:"CREATE_USER",
												                  READ:"READ_USER",
												                  WRITE:"WRITE_USER",
																  DELETE:"DELETE_USER",
																  SHARE:void 0,
																  ASSIGN:void 0});																  																  																  																  																  																  																  																  
	Sys.entityNameToPrivilegeNameMapper.put("BusinessUnit",      {CREATE:"CREATE_BUSINESS_UNIT",
												                  READ:"READ_BUSINESS_UNIT",
												                  WRITE:"WRITE_BUSINESS_UNIT",
																  DELETE:"DELETE_BUSINESS_UNIT",
																  SHARE:void 0,
																  ASSIGN:void 0});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//												                  WRITE:"",
//	定制权限暂时不用配											      DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("ServiceCase",       {CREATE:"CREATE_SERVICE_CASE",
												                  READ:"READ_SERVICE_CASE",
												                  WRITE:"WRITE_SERVICE_CASE",
																  DELETE:"DELETE_SERVICE_CASE",
																  SHARE:"SHARE_SERVICE_CASE",
																  ASSIGN:"ASSIGN_SERVICE_CASE",
																  CLOSE:"CLOSE_SERVICE_CASE"});
	Sys.entityNameToPrivilegeNameMapper.put("Queue",             {CREATE:"CREATE_QUEUE",
												                  READ:"READ_QUEUE",
												                  WRITE:"WRITE_QUEUE",
																  DELETE:"DELETE_QUEUE",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("QueueItem",         {CREATE:void 0,
												                  READ:void 0,
												                  WRITE:void 0,
																  DELETE:"DELETE_QUEUE_ITEM",
																  SHARE:void 0,
																  ASSIGN:void 0});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//												                  WRITE:"",
//  License不用配													  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("KbArticle",         {CREATE:"CREATE_KBARTICLE",
												                  READ:"READ_KBARTICLE",
												                  WRITE:"WRITE_KBARTICLE",
																  DELETE:"DELETE_KBARTICLE",
																  SHARE:"SHARE_KBARTICLE",
																  ASSIGN:"ASSIGN_KBARTICLE",
																  PUBLISH:"PUBLISH_KBARTICLE"});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//												                  WRITE:"",
//	Export不用配													  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//												                  WRITE:"",
//																  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("Analysis",          {CREATE:"CREATE_ANALYSIS",
												                  READ:"READ_ANALYSIS",
												                  WRITE:"WRITE_ANALYSIS",
																  DELETE:"DELETE_ANALYSIS",
																  SHARE:"SHARE_ANALYSIS",
																  ASSIGN:void 0});												  
	Sys.entityNameToPrivilegeNameMapper.put("AnalysisFolder",    {CREATE:"CREATE_ANALYSIS_FOLDER",
												                  READ:"READ_ANALYSIS_FOLDER",
												                  WRITE:"WRITE_ANALYSIS_FOLDER",
																  DELETE:"DELETE_ANALYSIS_FOLDER",
																  SHARE:void 0,
																  ASSIGN:void 0});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//	Report不用配											          WRITE:"",
//																  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("Expense",           {CREATE:"CREATE_EXPENSE",
												                  READ:"READ_EXPENSE",
												                  WRITE:"WRITE_EXPENSE",
																  DELETE:"DELETE_EXPENSE",
																  SHARE:void 0,
																  ASSIGN:void 0,
																  CLOSE:"CLOSE_EXPENSE",
																  REIMBURSE:"REIMBURSE_EXPENSE"});
	Sys.entityNameToPrivilegeNameMapper.put("SalesCharge",       {CREATE:"CREATE_SALES_CHARGE",
												                  READ:"READ_SALES_CHARGE",
												                  WRITE:"WRITE_SALES_CHARGE",
																  DELETE:"DELETE_SALES_CHARGE",
																  SHARE:"SHARE_SALES_CHARGE",
																  ASSIGN:"ASSIGN_SALES_CHARGE",
																  CLOSE:"CLOSE_SALES_CHARGE"});
	Sys.entityNameToPrivilegeNameMapper.put("ServiceContract",   {CREATE:"CREATE_SERVICE_CONTRACT",
												                  READ:"READ_SERVICE_CONTRACT",
												                  WRITE:"WRITE_SERVICE_CONTRACT",
																  DELETE:"DELETE_SERVICE_CONTRACT",
																  SHARE:"SHARE_SERVICE_CONTRACT",
																  ASSIGN:"ASSIGN_SERVICE_CONTRACT",
																  CLOSE:"CLOSE_SERVICE_CONTRACT"});
	Sys.entityNameToPrivilegeNameMapper.put("ServiceComplain",   {CREATE:"CREATE_SERVICE_COMPLAIN",
												                  READ:"READ_SERVICE_COMPLAIN",
												                  WRITE:"WRITE_SERVICE_COMPLAIN",
																  DELETE:"DELETE_SERVICE_COMPLAIN",
																  SHARE:"SHARE_SERVICE_COMPLAIN",
																  ASSIGN:"ASSIGN_SERVICE_COMPLAIN",
																  CLOSE:"CLOSE_SERVICE_COMPLAIN"});
	Sys.entityNameToPrivilegeNameMapper.put("ServiceCharge",     {CREATE:"CREATE_SERVICE_CHARGE",
												                  READ:"READ_SERVICE_CHARGE",
												                  WRITE:"WRITE_SERVICE_CHARGE",
																  DELETE:"DELETE_SERVICE_CHARGE",
																  SHARE:"SHARE_SERVICE_CHARGE",
																  ASSIGN:"ASSIGN_SERVICE_CHARGE"});
	Sys.entityNameToPrivilegeNameMapper.put("ReturnVisit",       {CREATE:"CREATE_RETURN_VISIT",
												                  READ:"READ_RETURN_VISIT",
												                  WRITE:"WRITE_RETURN_VISIT",
																  DELETE:"DELETE_RETURN_VISIT",
																  SHARE:"SHARE_RETURN_VISIT",
																  ASSIGN:"ASSIGN_RETURN_VISIT"});
	Sys.entityNameToPrivilegeNameMapper.put("Purchase",          {CREATE:"CREATE_PURCHASE",
												                  READ:"READ_PURCHASE",
												                  WRITE:"WRITE_PURCHASE",
																  DELETE:"DELETE_PURCHASE",
																  SHARE:"SHARE_PURCHASE",
																  ASSIGN:"ASSIGN_PURCHASE",
																  APPROVAL:"APPROVAL_PURCHASE"});
	Sys.entityNameToPrivilegeNameMapper.put("PurchasePayment",   {CREATE:"CREATE_PURCHASE_PAYMENT",
												                  READ:"READ_PURCHASE_PAYMENT",
												                  WRITE:"WRITE_PURCHASE_PAYMENT",
																  DELETE:"DELETE_PURCHASE_PAYMENT",
																  SHARE:"SHARE_PURCHASE_PAYMENT",
																  ASSIGN:"ASSIGN_PURCHASE_PAYMENT",
																  APPROVAL:"APPROVAL_PURCHASE_PAYMENT"});
	Sys.entityNameToPrivilegeNameMapper.put("StockIn",           {CREATE:"CREATE_STOCK_IN",
												                  READ:"READ_STOCK_IN",
												                  WRITE:"WRITE_STOCK_IN",
																  DELETE:"DELETE_STOCK_IN",
																  SHARE:"SHARE_STOCK_IN",
																  ASSIGN:"ASSIGN_STOCK_IN",
																  APPROVAL:"APPROVAL_STOCK_IN"});
	Sys.entityNameToPrivilegeNameMapper.put("StockAllot",        {CREATE:"CREATE_STOCK_ALLOT",
												                  READ:"READ_STOCK_ALLOT",
												                  WRITE:"WRITE_STOCK_ALLOT",
																  DELETE:"DELETE_STOCK_ALLOT",
																  SHARE:"SHARE_STOCK_ALLOT",
																  ASSIGN:"ASSIGN_STOCK_ALLOT",
																  APPROVAL:"APPROVAL_STOCK_ALLOT"});
	Sys.entityNameToPrivilegeNameMapper.put("StockBalance",      {CREATE:"CREATE_STOCK_BALANCE",
												                  READ:"READ_STOCK_BALANCE",
												                  WRITE:"WRITE_STOCK_BALANCE",
																  DELETE:"DELETE_STOCK_BALANCE",
																  SHARE:"SHARE_STOCK_BALANCE",
																  ASSIGN:"ASSIGN_STOCK_BALANCE",
																  APPROVAL:"APPROVAL_STOCK_BALANCE"});
	Sys.entityNameToPrivilegeNameMapper.put("Depot",             {CREATE:"CREATE_DEPOT",
												                  READ:"READ_DEPOT",
												                  WRITE:"WRITE_DEPOT",
																  DELETE:"DELETE_DEPOT",
																  SHARE:"SHARE_DEPOT",
																  ASSIGN:"ASSIGN_DEPOT"});
	Sys.entityNameToPrivilegeNameMapper.put("StockOut",          {CREATE:"CREATE_STOCK_OUT",
												                  READ:"READ_STOCK_OUT",
												                  WRITE:"WRITE_STOCK_OUT",
																  DELETE:"DELETE_STOCK_OUT",
																  SHARE:"SHARE_STOCK_OUT",
																  ASSIGN:"ASSIGN_STOCK_OUT",
																  APPROVAL:"APPROVAL_STOCK_OUT"});
	Sys.entityNameToPrivilegeNameMapper.put("Invoice",           {CREATE:"CREATE_INVOICE",
												                  READ:"READ_INVOICE",
												                  WRITE:"WRITE_INVOICE",
																  DELETE:"DELETE_INVOICE",
																  SHARE:"SHARE_INVOICE",
																  ASSIGN:"ASSIGN_INVOICE",
																  APPROVAL:"APPROVAL_INVOICE"});
	Sys.entityNameToPrivilegeNameMapper.put("Competitor",        {CREATE:"CREATE_COMPETITOR",
												                  READ:"READ_COMPETITOR",
												                  WRITE:"WRITE_COMPETITOR",
																  DELETE:"DELETE_COMPETITOR",
																  SHARE:"SHARE_COMPETITOR",
																  ASSIGN:"ASSIGN_COMPETITOR"});
	Sys.entityNameToPrivilegeNameMapper.put("ThirdProduct",      {CREATE:"CREATE_THIRD_PRODUCT",
												                  READ:"READ_THIRD_PRODUCT",
												                  WRITE:"WRITE_THIRD_PRODUCT",
																  DELETE:"DELETE_THIRD_PRODUCT",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("Channel",           {CREATE:"CREATE_CHANNEL",
												                  READ:"READ_CHANNEL",
												                  WRITE:"WRITE_CHANNEL",
																  DELETE:"DELETE_CHANNEL",
																  SHARE:"SHARE_CHANNEL",
																  ASSIGN:"ASSIGN_CHANNEL"});
	Sys.entityNameToPrivilegeNameMapper.put("Announcement",      {CREATE:"CREATE_ANNOUNCEMENT",
												                  READ:"READ_ANNOUNCEMENT",
												                  WRITE:"WRITE_ANNOUNCEMENT",
																  DELETE:"DELETE_ANNOUNCEMENT",
																  SHARE:void 0,
																  ASSIGN:void 0});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//	Field不用配											          WRITE:"",
//																  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("LogonLog",          {CREATE:void 0,
												                  READ:"READ_LOGONLOG",
												                  WRITE:void 0,
																  DELETE:"DELETE_LOGONLOG",
																  SHARE:void 0,
																  ASSIGN:void 0});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//	OnlineUsers不用配											  WRITE:"",
//																  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//	Menu不用调											          WRITE:"",
//																  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("OutboxNote",        {CREATE:"CREATE_OUTBOX_NOTE",
												                  READ:"READ_OUTBOX_NOTE",
												                  WRITE:void 0,
																  DELETE:"DELETE_OUTBOX_NOTE",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("InboxNote",         {CREATE:void 0,
												                  READ:"READ_INBOX_NOTE",
												                  WRITE:void 0,
																  DELETE:"DELETE_INBOX_NOTE",
																  SHARE:void 0,
																  ASSIGN:void 0});
//	Sys.entityNameToPrivilegeNameMapper.put("",                  {CREATE:"",
//												                  READ:"",
//	Audit不用调											          WRITE:"",
//																  DELETE:"",
//																  SHARE:"",
//																  ASSIGN:""});
	Sys.entityNameToPrivilegeNameMapper.put("AuditFlow",         {CREATE:"CREATE_AUDITFLOW",
												                  READ:"READ_AUDITFLOW",
												                  WRITE:"WRITE_AUDITFLOW",
																  DELETE:"DELETE_AUDITFLOW",
																  SHARE:void 0,
																  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("Provider",          {CREATE:"CREATE_PROVIDER",
												                  READ:"READ_PROVIDER",
												                  WRITE:"WRITE_PROVIDER",
																  DELETE:"DELETE_PROVIDER",
																  SHARE:"SHARE_PROVIDER",
																  ASSIGN:"ASSIGN_PROVIDER"});
	Sys.entityNameToPrivilegeNameMapper.put("AccountConflictHistory", {CREATE:void 0,
												                       READ:"READ_ACCOUNT_CONFLICT_HISTORY",
												                       WRITE:void 0,
																	   DELETE:"DELETE_ACCOUNT_CONFLICT_HISTORY",
																	   SHARE:void 0,
																	   ASSIGN:void 0});
   	Sys.entityNameToPrivilegeNameMapper.put("ExcelReport", {CREATE:"CREATE_EXCEL_REPORT",
												                       READ:"READ_EXCEL_REPORT",
												                       WRITE:"WRITE_EXCEL_REPORT",
																	   DELETE:"DELETE_EXCEL_REPORT",
																	   SHARE:"SHARE_EXCEL_REPORT",
																	   ASSIGN:"ASSIGN_EXCEL_REPORT"});	
																	   
   	Sys.entityNameToPrivilegeNameMapper.put("SalesInvoice", {CREATE:"CREATE_SALES_INVOICE",
												                       READ:"READ_SALES_INVOICE",
												                       WRITE:"WRITE_SALES_INVOICE",
																	   DELETE:"DELETE_SALES_INVOICE",
																	   SHARE:"SHARE_SALES_INVOICE",
																	   ASSIGN:"ASSIGN_SALES_INVOICE"}
																	   );			
																	   
	Sys.entityNameToPrivilegeNameMapper.put("OutboxFax",   {CREATE:"CREATE_OUTBOXFAX",
													                  READ:"READ_OUTBOXFAX",
													                  WRITE:"WRITE_OUTBOXFAX",
																	  DELETE:"DELETE_OUTBOXFAX",
																	  SHARE:void 0,
																	  ASSIGN:void 0});
	Sys.entityNameToPrivilegeNameMapper.put("InboxFax",    {CREATE:void 0,
													                  READ:"READ_INBOXFAX",
													                  WRITE:void 0,
																	  DELETE:"DELETE_INBOXFAX",
																	  SHARE:void 0,
																	  ASSIGN:void 0});																   														  																  
}

/**
 * 输入框聚焦函数扩展
 */
Sys.focusExtend = function(ele) {
//function focusExtend(ele) {
    var r = ele.createTextRange();
    r.moveStart('character',ele.value.length);
    r.collapse(true);
    r.select();
}

Sys.getEntityInfoById = function(id){
	var objectTypeCode = id.substring(0, 3);
	var entityInfo = Sys.typeCodeEntityInfoMapper.get(objectTypeCode);
	//如果没有配置，则请求Servlet来判断是否是自定义实体，若是，则...
	if (entityInfo == null) {
		var xmlHttp = XmlHttp.create();
		xmlHttp.open("POST", "servlet/com.wisecrm.servlet.UserServlet?action=getEntityOpetateUrl&objectTypeCode=" + objectTypeCode, false);
		xmlHttp.send(null);
		if (xmlHttp.responseText && xmlHttp.responseText != "") {
			var doc = XmlDocument.create();
			doc.loadXML(xmlHttp.responseText);
			entityInfo = new EntityInfo(doc.selectSingleNode("//entityOperateUrl").getAttribute("name"), 
					doc.selectSingleNode("//entityOperateUrl").getAttribute("value"));
		}
	}	

	if(entityInfo == null){
		alert("Can't find the entity by this typecode : " + objectTypeCode);
	}
	return entityInfo;
}

Sys.getEditPageURLById = function(id){
	var entityInfo = this.getEntityInfoById(id);
	return entityInfo == null ? null : entityInfo.editUrl;
}

Sys.getEntityNameById = function(id){
	var entityInfo = this.getEntityInfoById(id);
	return entityInfo == null ? null : entityInfo.name;
}

Sys.getEditPageURLByEntityName = function(entity){
	if (entity == "Channel") {
		return  "customer.channel.ChannelOperate" ;
	} else if (entity == "Provider") {
		return  "customer.provider.ProviderOperate";
	}
	var keys = Sys.typeCodeEntityInfoMapper.keySet();
	for(var i=0, m=keys.length; i<m; i++){
		var info = this.typeCodeEntityInfoMapper.get(keys[i]);
		if(info.name == entity)
			return info.editUrl;
	}
	
	return null;
}

Sys.transXmlToText = function(xmlStr) {
	var result = xmlStr.relaceAll("<", "&lt;");
	result = result.relaceAll(">", "&gt;");
	result = result.relaceAll('"', "&quot;");
//	result = result.relaceAll("&", "&amp;");
	return result;
}

Sys.transTextToXml = function(textStr) {
	var result = textStr.relaceAll("&lt;", "<");
	result = result.relaceAll("&gt;", ">");
	result = result.relaceAll("&quot;", "'");
//	result = result.relaceAll("&", "&amp;");
	return result;
}

Sys.roundNumber = function(number, round) {
	var q = 1;
	for (var i = 0; i < round; i++) {
		q = q*10;
	}
	var mynum = Math.round(parseFloat(number)*q);
	var a = mynum.toString();
	var len = a.length;
	if (len <= round) {
		for (i = 0; i < (round-len+1); i++) {
			a = '0' + a;
		}
		len = a.length;
	}
	return a.substr(0, len - round) + '.' + a.substr(len - round, round);
}

/**
 * 弹出模式对话框
 * @param {Object} dialogParams		对话框参数
 * @param {Object} dialogName		对话框名称
 * @param {Object} pageUrl			窗口打开页面的URL
 * @param {Object} dialogWidth		窗口宽度
 * @param {Object} dialogHeight		窗口高度
 * @param {Object} parentWindow		父窗口
 */
Sys.showModalDialog = function(dialogParams, dialogName, pageUrl, dialogWidth, dialogHeight, parentWindow) {
	if ( !parentWindow )
		parentWindow = window;
	var params;
	if(pageUrl.indexOf("&amp;") != -1) {
		pageUrl = pageUrl.replace("&amp;", "&");
	}
	if ((dialogParams == null) || (dialogParams == '')) {
		var index = pageUrl.indexOf("?");
		if (index == -1) {
			index = pageUrl.indexOf("&");
		}
		
		if (index == -1)
			params = '';
		else 
			params = pageUrl.substring(index + 1);
	} else {
		params = dialogParams;
	}
	params = Trim(params);
	var paramArr = new Array();
	paramArr = [window, params];
	
	dialogWidth = dialogWidth + 10;
	dialogHeight = dialogHeight + 58;
	var ctime = new Date()
    var ctimes = ctime.getTime();
	pageUrl = pageUrl + "&system___datetime___id=" + ctimes;
	return (parentWindow.showModalDialog(pageUrl, paramArr, "dialogWidth:" + dialogWidth + "px;dialogHeight:" + 
									dialogHeight + "px;help:no;scroll:yes;status:yes"));
}

/**
 * 弹出非模式对话框
 * @param {Object} dialogParams		对话框参数
 * @param {Object} dialogName		对话框名称
 * @param {Object} pageUrl			窗口打开页面的URL
 * @param {Object} dialogWidth		窗口宽度
 * @param {Object} dialogHeight		窗口高度
 * @param {Object} parentWindow		父窗口
 */
Sys.showModalessDialog = function(dialogParams, dialogName, pageUrl, dialogWidth, dialogHeight, parentWindow) {
	if ( !parentWindow )
		parentWindow = window;

	var params;
	if ((dialogParams == null) || (dialogParams == '')) {
		var index = pageUrl.indexOf("?");
		if (index == -1) {
			index = pageUrl.indexOf("&");
		}
		
		if (index == -1)
			params = '';
		else 
			params = pageUrl.substring(index + 1);
	} else {
		params = dialogParams;
	}
	params = Trim(params);
	var paramArr = new Array();
	paramArr = [window, params];
	
	dialogWidth = dialogWidth + 10;
	dialogHeight = dialogHeight + 58;
	parentWindow.showModelessDialog(pageUrl, paramArr, "dialogWidth:" + dialogWidth + "px;dialogHeight:" + 
									dialogHeight + "px;help:no;scroll:yes;status:yes");
}

/**
 * 从<a>label</a>字符串中取出label,lookup回填中常用到
 * @param {String} aStr		需解析的字符串
 */
Sys.getLabelFromAStr = function (aStr) {
	var begin = aStr.indexOf(">") + 1;
	var end = aStr.indexOf("<",begin);
	var label = "";
	label = aStr.substring(begin,end);
	return label;
}

/**
 * 
 * @param {String} _mainTabId
 
 */
Sys.OpenRelatedGrid = function(_mainTabId, _div) {
	var mainTab = $(_mainTabId);
	if (mainTab.style.display == "") {
		mainTab.style.display = "none";
		_div.className = "iframe-hide";
	} else {
		mainTab.style.display = "";
		_div.className = "iframe-show";
		try {
			var frame1 = $("tab-1").lastChild.firstChild;
			if (frame1.getAttribute("src") == "")
				frame1.setAttribute("src", frame1.getAttribute("mysrc"));
		} catch (e) {
			alert("Load default iFrame Error!!!");
		}
	}
} 

Sys.OpenOperatePage = function(url) {
	var style = 'height=600,width=750,top=' + getRandom(screen.height * 0.1) + ', left=' + getRandom(screen.width * 0.1) + ',location=no,menubar=no,resizable=yes,scrollbars=no,status=yes,toolbar=no';
	window.open(url, '', style);
}

/**
 * 获取一个36位字符串的随机数
 */
Sys.getUUID = function() {
	var r1 = Math.random() + "";
	var r2 = Math.random() + "";
	var r3 = Math.random() + "";
	var r = "RC" + r1.substring(2, 19) + "-" + r2.substring(2, 19) + "-" + r3.substring(2, 19);
	var sIdx = Math.random() * 15;
	return r.substring(sIdx, sIdx + 36);
}

/**
 * 得到页面元素的位置
 * @param {Object} elem  有效的元素
 * @param {Object} attr	 有效值为：offsetTop/offsetLeft
 */
function calculatePlace(elem, attr) {
	var offset = 0;
	while (elem) {
		offset += elem[attr];
		elem = elem.offsetParent;
	}
	return offset;
}

/**
 * 将指定字符从URL最后除去, (ZHAO, 08/27/07)
 * 在'审核'操作中，由于切换TAB时，会在URL后面加上一个'#'，这时就必须将其移除，否则刷新时可能出现问题
 * @param {String} _url
 * @param {String} _char
 */
//function removeEndsChar(_url, _char) {
//	if (!_url || !_url.startsWith("http://"))
//		throw new Error("未知或无效的 URL 参数：" + _url);
//	if (!_char)
//		throw new Error("未知或无效的 CHAR 参数：" + _char);
//	
//	if (_url.endsWith(_char)) {
//		_url = _url.substring( 0, (_url.length - _char.length) );
//	}
//	
//	if (_url.indexOf("&nothing=nothing") > -1) {
//	}
//	else {
//		_url = _url + "&nothing=nothing";
//	}
////	if (_url.indexOf("&system___datetime___id=") <= -1) {
////		_url = _url + "&system___datetime___id=" + new Date().formatDateTime();
////	}
//	return _url;
//}

/**
 * 库存模块(采购, 出库, 入库, 盘点, 调拨, 发货)主从关联页面
 */
var EntityPageURLMap = new Map();
EntityPageURLMap.put("Purchase",	"app?service=page/stock.purchase.PurchaseLineItemDetail");
EntityPageURLMap.put("StockOut",	"app?service=page/stock.stockout.StockOutLineItemDetail");
EntityPageURLMap.put("StockIn",		"app?service=page/stock.stockinlineitem.StockInLineItemDetail");
EntityPageURLMap.put("StockBalance","app?service=page/stock.stockbalance.StockBalanceLineItemDetail");
EntityPageURLMap.put("StockAllot",	"app?service=page/stock.stockallot.StockAllotLineItemDetail");
EntityPageURLMap.put("Invoice",		"app?service=page/stock.invoice.InvoiceLineItemDetail");
/**
 * 根据主实体名称获取明细实体所在页面
 * @param {String} entityName	实体名称，此名称必须要在EntityPageURLMap中定义
 * @param {String} tabId		页签ID(可选参数)，默认情况下都是'detailTabId'
 */
function setDetailEntityURL(entityName, tabId) {
	var detailURL = EntityPageURLMap.get(entityName);
	var detailTab = null;
	if (tabId)
		detailTab = $(tabId);
	if (!detailTab)
		detailTab = $("detailTabId");
		
	if (!detailURL || !detailTab)
		throw new Error("Invalid parameters! [ entityName:" + entityName + ", tabId:" + tabId + " ]");
		
	var id = Sys.getParameter("id");
    if (id != null && id != "null") {
		if (detailTab && !detailTab.src)
			detailTab.src= detailURL + "&relatedId=" + id;
    } else {
		if (detailTab && !detailTab.src)
			detailTab.src = detailURL;
    }
}


// == 方便构造后台所需要的数据（规范格式） ==============================
/**
 * 
 * @param {String} entity
 */
function XMLData() {
	var _doc = XmlDocument.create();
	_doc.loadXML('<entities></entities>');
	
	this.doc = _doc;
	this.root = _doc.selectSingleNode('entities');
}

XMLData.prototype = {
	/**
	 * 添加一个实体
	 * @param {XMLEntity} entity
	 */
	addEntity: function(entity) {
		this.root.appendChild(entity);
	},
	
	// 返回XML字符串
	toString: function() {
		return this.doc.xml;
	}
}

function XMLEntity(name) {
	var _doc = XmlDocument.create();
	_doc.loadXML('<entity name="' + name + '"></entity>');
	
	this.doc = _doc;
	this.entity = _doc.selectSingleNode('entity');
}
XMLEntity.prototype = {
	// 为实体添加一个字段
	addField: function(name, value) {
		var field = this.doc.createElement(name);
		field.setAttribute("value", value);
		this.entity.appendChild(field);
	},
	
	toXML: function() {
		return this.entity;
	},
	
	toString: function() {
		return this.doc.xml;
	},
	
	toWarpString: function() {
		var str = this.toString();
		if ( str.startsWith('<entities>') && str.endsWith('</entities>') )
			return str;
		return '<entities>' + str + '</entities>';
	}
}

/*页面较友善的alert函数 wangx add 08-03-31 
*非弹出窗口调用方式：window.top.Sys.sAlert(“需显示的字符串”);暂不推荐使用
*弹出窗口调用方式：Sys.sAlert(“需显示的字符串”)
*/
Sys.sAlert = function(str){
	var msgw,msgh,bordercolor; 
    msgw=400;//提示窗口的宽度 
    msgh=100;//提示窗口的高度 
    titleheight=25 //提示窗口标题高度 
    bordercolor="#4A4AFF";//提示窗口的边框颜色 
    titlecolor="#99CCFF";//提示窗口的标题颜色 
     
    var sWidth,sHeight; 
    sWidth=document.body.offsetWidth; 
    sHeight=screen.height; 

    var bgObj=document.createElement("div"); 
    bgObj.setAttribute('id','bgDiv'); 
    bgObj.style.position="absolute"; 
    bgObj.style.top="0"; 
    bgObj.style.background="#7B7B7B"; 
    bgObj.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=2,opacity=25,finishOpacity=75"; 
    bgObj.style.opacity="0.6"; 
    bgObj.style.left="0"; 
    bgObj.style.width=sWidth + "px"; 
    bgObj.style.height=sHeight + "px"; 
    bgObj.style.zIndex = "10000"; 
    document.body.appendChild(bgObj); 
     
    var msgObj=document.createElement("div") 
    msgObj.setAttribute("id","msgDiv"); 
    msgObj.setAttribute("align","center"); 
    msgObj.style.background="white"; 
    msgObj.style.border="1px solid " + bordercolor; 
	//msgObj.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=50,finishOpacity=100"; //该层不透明
    msgObj.style.position = "absolute"; 
    msgObj.style.left = "50%"; 
    msgObj.style.top = "50%"; 
    msgObj.style.font="12px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif"; 
    msgObj.style.marginLeft = "-225px" ; 
    msgObj.style.marginTop = -75+document.documentElement.scrollTop+"px"; 
    msgObj.style.width = msgw + "px"; 
    msgObj.style.height =msgh + "px"; 
    msgObj.style.textAlign = "center"; 
    msgObj.style.lineHeight ="25px"; 
    msgObj.style.zIndex = "10001"; 

   var title=document.createElement("h4"); 
   title.setAttribute("id","msgTitle"); 
   title.setAttribute("align","right"); 
   title.style.margin="0"; 
   title.style.padding="3px"; 
   title.style.background=bordercolor; 
   title.style.filter="progid:DXImageTransform.Microsoft.Alpha(startX=20, startY=20, finishX=100, finishY=100,style=1,opacity=75,finishOpacity=100);"; 
   title.style.opacity="0.75"; 
   title.style.border="1px solid " + bordercolor; 
   title.style.height="18px"; 
   title.style.font="12px Verdana, Geneva, Arial, Helvetica, sans-serif"; 
   title.style.color="white"; 
   title.style.cursor="pointer"; 
   title.innerHTML=Sys.getString("Close"); 
   title.onclick=function(){ 
       document.body.removeChild(bgObj); 
       document.getElementById("msgDiv").removeChild(title); 
       document.body.removeChild(msgObj); 
       } 
   document.body.appendChild(msgObj); 
   document.getElementById("msgDiv").appendChild(title); 
   var txt=document.createElement("<a href='#'>"); 
   txt.style.margin="1em 0" 
   txt.setAttribute("id","msgTxt"); 
   txt.innerHTML=str; 
   document.getElementById("msgDiv").appendChild(txt); 
   txt.onclick=function(){ 
       document.body.removeChild(bgObj); 
       document.getElementById("msgDiv").removeChild(title); 
       document.body.removeChild(msgObj); 
       } 
} 

