/*
 文件名：pub_fun.js
 功能：公共函数库
 时间：2007-4-2 add by linzc
 */
/*
 ****************涵数列表************************
 功能：封装了document.getElementById(idVal)和return document.all[idVal];
 function getElById(idVal)
 功能： 用于全选Select栏所有的option.
 function sltAll(sId)
 功能：禁用或者启用相对应的控件，如Select栏，Text栏等等。
 function enbWin(obj, bSta)
 功能： 判断字符串是否为空,为空返回true,否则返回false
 function isEmpty(str)
 功能：如果输入是数字,返回true,否则返回false
 function isNumber(str)
 功能：如果输入是合法字符串,返回true,否则返回false
 function isValidChar(sStr)
 功能：
 function isCH(sStr)
 功能：对输入的IP地址进行校验,格式为xx.xx.xx.xx
 function validateIP(IPstr)
 功能：对输入的Mask地址进行校验
 function validateMask(sMask)
 ??:MAC?????
 function validateMAC(MACstr)
 功能：是否是空串
 function isZeroStr(szVal)
 功能：去除字符串两边空格
 function Trim(szVal)
 功能：端口合法性验证，合法返回TRUE。
 function validatePort(port)
 功能：返回产品名称，用来区分产品
 function gerproduce()
 功能：返回所有物理接口描述字符串
 function get_intf_all()
 功能：返回指定物理接口描述字符串
 function get_intf_single(intfname)
 功能：返回LAN口数目
 function get_lan_port_num()
 功能：验证IP掩码是否匹配
 function ip_mask_match(ipstr,maskstr)
 功能：检查字符串中是否包含空格
 function has_space(str_in)
 function QueryString(name)
 ??:??url???name???????
 function get_url_par()
 ??:?????url???????(?????)
 function set_url_par(name,value,urlpar)
 ??:?url??????????name???value
 */
/********************
 控件相关的公用函数集
 *********************/
/*
 function enCtl(vId)
 function foCtl(vId)
 function diCtl(vId)
 */

/**
 * 添加npe 内网口是否加入链路聚合口判读
 * @type {Object}
 */
var PF = PF || {};
PF = {
    getHardtype: function(){
        var data = request('exec','show version\r\n'), SYS_DESP = 'System description', ret, len = data && data.length;

        for(var i = 0;i < len;i++){
            var n = data[i];
            if(n.indexOf(SYS_DESP) != -1){
                var match = n.match(/\((\w+)\)/);
                ret = match && match[1];
                return false;
            }
        }
        return ret;
    },
    isBridge: function(){
        var data = request('exec','show sys-mode')[1];
        if(!data) return false;
        if(data.indexOf('gateway') != -1){
            return false;
        }else{
            return true;
        }
    },
    /**
     * 存储聚合口数据
     */
    renderAgSummary: function(){
        var DEVICE_NPE = 'NPE40/NPE50E/NPE60E';
        if(DEVICE_NPE.indexOf(PF.getHardtype() != -1 && !PF.isBridge())){
            var data = request('exec','sh aggregatePort summary\r\n');

            data = data.slice(2);
            data.pop();
            PF.agData = data;
        }
    },
    isJoinAg: function(port){
        var ret = false, data;

        if(typeof PF.agData == 'undefined'){
            this.renderAgSummary();
        }
        data = PF.agData;
        if(data){
            var len, aPort = [], sPort = '';

            len = data.length;
            for(var i = 0;i < len;i++ ){
                var item = $.trim(data[i]).replace(/\s+/g,' ').split(' ');
                if(item[0].indexOf('Ag') != -1){
                    aPort.push(item[2]);
                }else{
                    aPort.push(item[1]);
                }
            }
            sPort = aPort.join('&');
            if(sPort.indexOf(port) != -1){
                return true;
            }
        }
        return ret;
    },
    filter: function(v){
        return v.indexOf("(") != -1 ? v.substring(0, v.indexOf("(")) : v;
    }
};

var bridgeMap = null;

function reLogin() {
	parent.parent.window.location = getUrl();
}

function getUrl() {
	var url = location.href;
	if (url.search(/^http/) != -1) {
		return url.substring(0, url.indexOf("\/", url.indexOf("\/\/") + 2) + 1) + "index.htm";
	}
	else {
		return "index.htm";
	}
}

function GetServerDate(){
	var DateStr = request("exec", "show clock")[0]
	var DateArr = DateStr.split(/\s/);
	var YearStr = DateArr[5];
	var MonthStr = GetMonthNum(DateArr[3]);
	var DayStr = DateArr[4].replace(',', "");
	var NewDate = new Date();
	NewDate.setDate(DayStr);
	NewDate.setMonth(MonthStr);
	NewDate.setFullYear(YearStr);
	return NewDate;
}

function GetMonthNum(MonthStr){
	if (MonthStr.indexOf("Jan") != -1){
		return 0;
	}else if (MonthStr.indexOf("Feb") != -1){
		return 1;
	}else if (MonthStr.indexOf("Mar") != -1){
		return 2;
	}else if (MonthStr.indexOf("Apr") != -1){
		return 3;
	}else if (MonthStr.indexOf("May") != -1){
		return 4;
	}else if (MonthStr.indexOf("Jun") != -1){
		return 5;
	}else if (MonthStr.indexOf("Jul") != -1){
		return 6;
	}else if (MonthStr.indexOf("Aug") != -1){
		return 7;
	}else if (MonthStr.indexOf("Sep") != -1){
		return 8;
	}else if (MonthStr.indexOf("Oct") != -1){
		return 9;
	}else if (MonthStr.indexOf("Nov") != -1){
		return 10;
	}else if (MonthStr.indexOf("Dec") != -1){
		return 11;
	}
}

/*
 * 解析内容审计格式的数据的函数
 * 参数 o {info : 源数据 array, stencil : 模版 array, reg : 分割的正则 reg, startLine : 开始行 int}
 * 返回records数组 成员是根据模版解析的对象
 */
function analyzeInfo (o) {
	var info = o.info.splice(o.startLine, o.info.length - 1);
	var res = info.join().split(o.reg), records = [];

	for (var i = 0; i < res.length; i++) {
		var r = {}, data = res[i].split(/,\r/g);
		if (data.length < o.stencil.length) continue;
		for (var j = 0; j < o.stencil.length; j++) {
			r[o.stencil[j].name] = $.trim(data[o.stencil[j].mapping] && data[o.stencil[j].mapping].slice(data[o.stencil[j].mapping].indexOf(':') + 1) || '');
		}
		records.push(r);
	}
	return records;
}

/*
 * 解析URL审计格式的数据的函数
 * 参数 o {info : 源数据 array, stencil : 模版 array, startLine : 开始行 int, entityLine : 每条记录行数}
 * 返回records数组 成员是根据模版解析的对象
 */
function analyzeCli (o) {
	var info = o.info.splice(o.startLine, o.info.length - 1), records = [];

	for (var i = 0; i < info.length; i = i + o.entityLine) {
		var res = info.slice(records.length * o.entityLine, records.length * o.entityLine + o.entityLine).join('');
		if (o.filter && o.filter.test($.trim(res))) continue;
		var r = {}, data = res.split(/\s+|(,\r)/g);
		if (data.length < o.stencil.length) continue;
		for (var j = 0; j < o.stencil.length; j++) {
			r[o.stencil[j].name] = $.trim(data[o.stencil[j].mapping] || '');
		}
		records.push(r);
	}
	return records;
}
 /*
 * 验证内容审计页面的高级查询form表单
 * 
 * 
 */
Validate = {
	//日期的验证
	date		:		function (start, end) {
		if (start == '' || end == '') {
			return {
				info	:	'日期不能为空',
				isRight	:	false	
			}
		}
	
		var s = start.split(/-/g), e = end.split(/-/g);
		
		if ((parseInt(s[0], 10) < parseInt(e[0], 10)) || 
			(parseInt(s[0], 10) == parseInt(e[0], 10) && parseInt(s[1], 10) < parseInt(e[1], 10)) || 
			(s[0] == e[0] && s[1] == e[1] && parseInt(s[2], 10) <= parseInt(e[2], 10))) 
		{
			return {
				info	:	'',
				isRight	:	true
			}	
		}
		
		return {
			info	:	'起始日期不能小于结束日期',
			isRight	:	false	
		}
	},

//时间段的验证
	time		:		function (start, end) {
		//只选择一个时间
		if(isNaN(start) ^ isNaN(end)) {
			return {
				info	:	'请选择' +　['开始', '结束'][!!isNaN(start) ? 0 : 1] + '时间',
				isRight	:	false	
			}
		}
		
		var isRight = true, info = '';
		//两个都选
		if (!isNaN(start) && !isNaN(end)) {
			
			if (parseInt(start, 10) > parseInt(end, 10)) {
				isRight = false,
				info = '起始时间不能大于结束时间';
			}
		}
		
		return {
			info	:	info,
			isRight	:	isRight
		}
	},

//多IP的验证

	mIP			:		function (str) {
		var ips = str.replace(/，/g, ',').replace(/\s+/g, '').split(',');
		for (var i = 0; i < ips.length; i++) {
			if (ips[i] == '') continue;
			if (!validateIP(ips[i])) {
				return {
					info	:	'IP格式错误',
					isRight	:	false
				};
			}
		}
		return {
			info	:	'',
			isRight	:	true
		};
	},

//关键字验证
	keyword		:		function (str) {
		var isRight = !(/["?]/.test(str));
		return {
			isRight		:	isRight,
			info		:	'关键字中不能含有双引号(")和问号(?)，请重新输入！'
		}
	},
//验证文件名
	fileName	:		function (name) {
		var isRight = !(/[\\\/:\*?<>\|]/.test(name));
		return {
			isRight		:	isRight,
			info		:	'文件名不能包这些字符(/ \ : * ? " < > |)，请重新输入！'	
		}
	},
//验证数字及范围
	number		:		function (num, min, max) {
		if (isNaN(num) || parseInt(num, 10) < min || parseInt(num, 10) > max) {
			return {
				isRight		:		false,
				info		:		'必须为' + min + '到' + max + '之间的数字'	
			}	
		}
		
		return {
			isRight		:		true,
			info		:		''
		}
	}
}

var UrlAudit = (function(){
	var auditName = ['work', 'illegal', 'forbid', 'unwork'], info = {}, intfs, intf, RuleId = {0 : 901, 1 : 900, 2 : 905, 3 : 902};
	
	return {
		isOpen	:	function(str) {
			if (!str || typeof str != 'string' || $.inArray(str, auditName) == -1) return 'error';
			if (typeof info[str] != 'boolean') {
				this.init();
			}
			return info[str];	
		},
		init	:	function() {
			if (intfs == null) {
				intfs = Util.getInterface('wan&up');
				intf = intfs[0];
			}
			var s = Util.request('exec', 'show  url-rule content-policy ' + intf.get('port'));
			for (var i = 0; i < auditName.length; i++) {
				info[auditName[i]] = false;	
			}
			for (var i = 0; i < s.length; i++) {
				if (s[i].indexOf('(active)url-rule 902') != -1 && s[i].indexOf('url-object unwork') != -1 && s[i].indexOf('deny audit') != -1) {
					info['unwork'] = true;
				} else if (s[i].indexOf('(active)url-rule 901') != -1 && s[i].indexOf('url-object work') != -1 && s[i].indexOf('permit audit') != -1) {
					info['work'] = true;
 				} else if (s[i].indexOf('(active)url-rule 900') != -1 && s[i].indexOf('url-object illegal') != -1 && s[i].indexOf('deny audit') != -1) {
					info['illegal'] = true;
				} else if (s[i].indexOf('(active)url-rule 905') != -1 && s[i].indexOf('url-object forbid') != -1 && s[i].indexOf('deny audit') != -1) {
					info['forbid'] = true;
				}
			}
		},
		getTotal	:	function(name) {
			var cmd = 'show url-audit detail time-range from ' + Time.start + ' to ' + Time.end + ' url-object ' + name + ' total-count\r\n';
			var s = Util.request('exec', cmd);
			return parseInt(s[0], 10) || 0;
		},
		setClose	:	function(str) {
			var count = $.inArray(str, auditName);
			if (!str || typeof str != 'string' || count == -1) return 'error';
			var cmd = '';
			for (var i = 0; i < intfs.length; i++) {
				cmd += 'content-policy ' + intfs[i].get('port') + '\r\n';
				cmd += 'no url-rule ' + RuleId[count] + '\r\n';
				cmd += 'exit\r\n';
			}
			Util.request('config', cmd);
			info[str] = false;
		},
		setOpen		:	function(str) {
			var count = $.inArray(str, auditName);
			if (!str || typeof str != 'string' || count == -1) return 'error';
			if (!!info[str]) return true;
			
			var cmdPart = this._getCmd(count), cmd = '';
			
			for (var i = 0; i < intfs.length; i++) {
				cmd += 'content-policy ' + intfs[i].get('port') + '\r\n';
				cmd += cmdPart;
				cmd += 'exit\r\n';
				cmd += 'int ' + intfs[i].get('port') + '\r\n';
				cmd += 'no content-policy-map\r\n content-policy-map ' + intfs[i].get('port') + '\r\n';
			}
			if (count == 2) {
				if (window.navigator.userLanguage.indexOf('zh-cn') != -1) {
					cmd += 'url-class forbidClass\r\n comment 您手动阻断的URL分类\r\n exit\r\n'
					cmd += 'url-object forbid\r\n class forbidClass\r\n comment 您手动阻断的网站分类对象\r\n exit\r\n';
					cmd += 'url-filter-notice display 您访问的网页已被禁止，请与管理员联系！\r\n';
				} else {
					cmd += 'url-class forbidClass\r\n comment "The URL you manually block classification"\r\n exit\r\n'
					cmd += 'url-object forbid\r\n class forbidClass\r\n comment "You manually block the site classification object"\r\n exit\r\n';
					cmd += 'url-filter-notice display "You visit the page has been prohibited, please contact your administrator!"\r\n';	
				}
			}
			var s = Util.request('config', cmd);
			info[str] = true;
		},
		_getCmd		:	function (count) {
			var cmd = 'no url-rule ' + RuleId[count] + '\r\n';
			cmd += {
				0		:		'url-rule 901 subscriber any url-object work time-range any action permit audit comment work\r\n',
				1		:		'url-rule 900 subscriber any url-object illegal time-range any action deny audit comment illegal\r\n',
				2		:		'url-rule 905 subscriber any url-object forbid time-range any action deny audit comment block\r\n',
				3		:		'url-rule 902 subscriber any url-object unwork time-range any action deny audit comment unwork\r\n'
			}[count];
			return cmd;
		}
	}
})();
 
function Name2Port(p) {
	if (p.indexOf("Ten") != -1) {
		p = p.replace("TenGigabitEthernet", "Te");
	}
	else if (p.indexOf("dia") != -1) {
		p = p.replace("dialer", "di");
	}
	else {
		p = p.replace("GigabitEthernet", "Gi");
	}
	p = p.replace(/\s+/g, "");
	return p;
}
 
function getSfcIntf() {
	var data = request("exec", "show intelligent-fc info"), info = [], key = "";
	for (var i = 0; i < data.length; i++) {
		key = data[i].indexOf(":") != -1 ? $.trim(data[i].split(":")[0]) : key;
		var getValue = function (data) {
			return data.indexOf(":") != -1 ? $.trim(data.split(":")[1]) : data;
		};
		var value = getValue(data[i]);
		
		if (key == "intf") {
			info.push({
				name	:	Name2Port(value),
				"in"	:	getValue(data[i + 1]).split(/\s+/),
				key		:	getValue(data[i + 2]).split(/\s+/),
				other	:	getValue(data[i + 3]).split(/\s+/),
				total	:	getValue(data[i + 5]),
				user	:	getValue(data[i + 6]),
				perIP	:	getValue(data[i + 7])
			});
		}
	}
	return info;
}
 
//添加新接口类
function filterIntf(intf) {
	if (intf.indexOf("(") != -1) {
		return intf.substring(0, intf.indexOf("("));
	}
	else {
		return intf;
	}
}
function isInOpenAll() {
	var ins = getSfcIntf(), str = '', wans = get_wan_intf();
	for (var i = 0; i < ins.length; i++) {
		str += '+' + ins[i].name + '+';	
	}
	for (var i = 0; i < wans.length; i++) {
		var o = wans[i];
		if (o.indexOf('(') != -1) o = o.substring(0, o.lastIndexOf('('));
		if (str.indexOf('+' + o + '+') == -1) return false;	
	}
	return true;
}
function initIntelligent(intf, isOpen) {
	var cmd = "";
	if (isOpen) {
		cmd += "intelligent-fc total-bandwidth " + intf + " " + 10000 + " \r\n ";
		cmd += "intelligent-fc inhibitive-bandwidth " + intf + " 1 " + 20 + " 1 " + 10 + " \r\n ";
		cmd += "intelligent-fc other-bandwidth " + intf + " " + 20 + " " + 30 + " " + 15 + " " + 15 + " \r\n ";
		cmd += "intelligent-fc total-user " + intf + " " + 500 + " \r\n ";
		cmd += "intelligent-fc per-ip " + intf + " " + 5 + " \r\n ";
	}
	else {
		cmd += "no intelligent-fc total-bandwidth " + intf + " \r\n ";
		cmd += "no intelligent-fc inhibitive-bandwidth " + intf + " \r\n ";
		cmd += "no intelligent-fc other-bandwidth " + intf + " \r\n ";
		cmd += "no intelligent-fc total-user " + intf + " \r\n ";
		cmd += "no intelligent-fc per-ip " + intf + " \r\n ";
	}
	asy_request("config", cmd, null);
}

function isNumber(v){
	return typeof v === 'number' && isFinite(v);
}

function isDefined(value) {
	return typeof value !== 'undefined';
}

function isObject(value) {
	return !!value && Object.prototype.toString.call(value) === '[object Object]';
}

function isArray(value) {
	return Object.prototype.toString.apply(value) === '[object Array]';
}
Interface = function (data) {
	this.data = data || {};
	this.configed = false;
	this.init();
}

Interface.prototype = {
	init		:		function () {
		this.initInfo();
	},
	
	initInfo	:		function () {
		if (this.data.info) {
			var data = this.data.info.split("#");
			var json = {};
			json.port = PF.filter(data[1]);
			json.ip = data[2];
			json.mask = data[3];
			json.gateway = data[4];
			json.mac = data[5];
			if (data[6] == "LAN" || data[6] == "WAN") {
				json.type = data[6] + json.port.split("/")[1];
			}
			else {
				json.type = data[6];
			}
			json.isOptical = !!parseInt(data[9]);
			json.isUp = data[10] == "UP";
			json.width = parseInt(data[11]);
			if (data[1].indexOf('Gi') != -1) {
				json.number = parseInt(data[1].substr(data[1].indexOf('/') + 1, 1), 10);
			} else {
				json.number = parseInt(data[1].substr(-1), 10);	
			}
			$.extend(this.data, json);
		}
	},
	
	hasControl	:		function () {
		this.initConfig();
		return isDefined(this.data["flow-policy"]);
	},
	
	initConfig	:		function () {
		if (!this.configed) {
			var data = request("exec", "show run interface " + this.data["port"]);
			for (var i = 3; i < data.length - 1; i++) {
				var map = data[i].split(/\s+/);
				if (map.length > 2) continue;
				this.data[map[0]] = map[1];
			}
			this.configed = true;
		}
	},
	
	getFlowID	:		function () {
		var cmd = "flow-control " + this.data["port"] + " \r\n ex \r\n ";
		request("config", cmd);
		cmd = "show flow-control-policy free-num group " + this.data["port"] + " \r\n ";
		var data = request("exec", cmd)[0].split(/\s+/);
		return data[data.length - 1];
	},
	
	change			:		function(str) {
		var v = this.data.port, v = v.indexOf("(") != -1 ? v.substring(0, v.indexOf("(")) : v;;
		if (!str || v.indexOf(str) != -1) return this;
		if (str == 'gi') {
			str = 'Gi0/';
		}
		return getOneIntf(str + this.data.number);
	},
	
	applyFlow	:		function (isApply) {
		var cmd = "";
		if (isApply) {
			cmd += "flow-control " + this.data["port"] + " \r\n ex \r\n ";
			cmd += "interface " + this.data["port"] + " \r\n flow-policy " + this.data["port"] + " \r\n ";
		}
		else {
			cmd	+= "interface " + this.data["port"] + " \r\n no flow-policy \r\n ";
		}
		request("config", cmd);
		this.write();
	},
	
	write		:		function () {
		request("exec", "write \r\n ");
	}
};

function getInterface(str) {
	var filter = ["all"], relation = "||", func = {
			"up"	:	function (intf) {return intf.data["isUp"];},
			"down"	:	function (intf) {return !intf.data["isUp"];},
			"wan"	:	function (intf) {return intf.data["type"].indexOf("WAN") != -1;},
			"lan"	:	function (intf) {return intf.data["type"].indexOf("LAN") != -1;},
			"all"	:	function () {return true;}
		};
	if (str) {
		if (str.indexOf("&") != -1) {
			relation = "&&";
			filter = str.split("&");
		}
		else {
			filter = str.split("|");
		}
	}
	
	for (var i = 0; i < filter.length; i++) {
		filter[i] = func[filter[i]];
	}

	var data = request("exec", "show html interface info");
	if (!__ToolCookie.getCookie('intf')) {
		//__ToolCookie.setCookie({key : 'intf', value : data.join('88888888')});	
	} 
	var result = [];
	for (var i = 0; i < data.length - 1; i++) {
		var intf = new Interface({info:data[i]});
		var condition = "";
		for (var j = 0; j < filter.length; j++) {
			condition += filter[j](intf);
			if (j != filter.length - 1) {
				condition += relation;
			}
		}
		condition = eval(condition);
		if (condition && !PF.isJoinAg(intf.data.port)) {
			result.push(intf);
		}
	}
	return result;
}

function getOneIntf(name){
	if (!name || typeof name != 'string') return null;
	var intfs = getInterface();
	for (var i = 0; i < intfs.length; i++) {
		var v = intfs[i].data.port, v = v.indexOf("(") != -1 ? v.substring(0, v.indexOf("(")) : v;;
		if (v == name) {
			return intfs[i];	
		}
	}
	return null;
}

function getFirstUp(str) {
	var intf = getInterface(str);
	for (var i = 0; i < intf.length; i++) {
		if (intf[i].data.isUp) {
			return intf[i].data.port;
		}
	}
}
 
function filterUser(users) {
	var groups = [];
	if (users.length == 0 || users[0].length == 1) {
		return users;
	}
	if (users[0][1] == "any") {
		return ["所有用户"];
	}
	if (users[0][1] == "All users") {
		return ["All users"];
	}
	for (var i = 0; i < users.length; i++) {
		if (users[i].length && users[i][0]) {
			var j = 0
			for (; j < groups.length; j++) {
				if (users[i][2].indexOf(groups[j][2]) != -1) {
					break;
				}
			}
			if (j == groups.length) {
				groups.push(users[i]);
			}
		}
	}
	
	for (var j = 0; j < users.length; j++) {
		for (var k = 0; k < groups.length; k++) {
			if (users[j].length && users[j][2] != groups[k][2] && users[j][2].indexOf(groups[k][2]) != -1) {
				users.splice(j, 1);
				j--;
				break;
			}
		}
		if (k == groups.length && users[j].length) {
			users[j] = users[j][1];
		}
	}
	
	return users;
}

function filterApp(app) {
	var groups = [], res = [];
	if (app.length == 0 || app[0].length == 1) {
		return app;
	}
	if (app[0][0] == "所有应用") {
		return ["所有应用"];
	}
	if (app[0][0] == "any") {
		return ["any"];
	}
/*
	for (var i = 0; i < app.length; i++) {
		if (app[i].length && app[i][0]) {
			var j = 0
			for (; j < groups.length; j++) {
				if (app[i][2].indexOf(groups[j][2]) != -1) {
					break;
				}
			}
			if (j == groups.length) {
				groups.push(app[i]);
			}
		}
	}
*/
	for (var j = 0; j < app.length; j++) {
		/*for (var k = 0; k < groups.length; k++) {
			if (app[j].length && app[j][2] != groups[k][2] && app[j][2].indexOf(groups[k][2]) != -1) {
				app.splice(j, 1);
				j--;
				break;
			}
		}
		if (k == groups.length && app[j].length) {
			app[j] = app[j][1];
		}*/
		if (!app[j][1]) {
			res.push(app[j][0]);
		}
	}
	
	return res;
}
 //t90设置通道对象
function setChannel(flowName, in_out, channelName, limit) {
	if (arguments.length != 4) return 1;
	var Stencil = {
		'100kbps'	:	100,	
		'200kbps'	:	200,	
		'300kbps'	:	300,	
		'500kbps'	:	500,	
		'1mbps'		:	1000
	}
	if (!Stencil[channelName]) return 2;

	var s = request('exec', 'show flow-c ' + flowName + ' ' + in_out), r = {}, root = getRootChannel(flowName, in_out);
	for (var i = 2; i < s.length - 1; i++) {
		if (!s[i]) break;
		if (i == 3) root == s[i].split(/\s+/)[0] || '';
		r[s[i].split(/\s+/)[0] || ''] = i;
	}
	if (r[channelName]) return true;
	var cmd = 'flow-c ' + flowName + '\r\n';
	cmd += 'channel-tree ' + in_out + '\r\n';
	if (!root) { 
		var cir = pir = getRootBandwidth(flowName);
		if (cir == '') return 3;
		cmd += 'channel-g root parent null cir ' + cir + ' pir ' + pir + '\r\n';
		root = 'root';
	}
	
	cmd += 'channel-g ' + channelName + ' parent ' + root + ' cir ' + /* + Stencil[channelName] + */' 100 ' + ' pir ' + Stencil[channelName] + '\r\n';
	var l = request('config', cmd);
	if (l[0] != '') {
		alert('限速通道已经配满，请先到通道对象页面删除多余通道!');
	}
	return l[0] == '';
}

function getRootBandwidth(intf){
	if (!intf) return '10000';
	var s = get_intf_info();
	if (intf.indexOf('di') != -1) {
		intf = 'Gi0/' + intf.replace('di', '') + '(' + intf + ')';
	}
	for (var i = 0; i < s.length; i++) {
		if (s[i].intf_name == intf || intf.indexOf(s[i].intf_name) != -1) {
			return s[i].bandwidth;
		}
	}
	return '10000';
}

function getRootChannel(flowName, in_out, isCir) {
	var s = request('exec', 'show flow-c ' + flowName + ' ' + in_out);
	if (s.length < 4) {
		return false;	
	} else {
		var cir = s[2].split(/\s+/)[1] || 0;
		if (isCir) {
			return cir;
		} else {
			return 	s[2].split(/\s+/)[0] || '';
		}
	}
}
function setFlowObj(wans, isBandwidth){
	var cmd = '', limit = '';
	for (var i = 0; i < wans.length; i++) {
		var root_in = getRootChannel(wans[i], 'inbound', true), root_out = getRootChannel(wans[i], 'outbound', true);
		limit = getRootBandwidth(wans[i]);
		cmd += 'flow-control ' + wans[i] + '\r\n' + 'channel-tree inbound\r\n';
		if (!root_in || (!!isBandwidth && parseInt(limit, 10) > parseInt(root_in, 10))) cmd += 'channel-g root parent null cir ' + limit + ' pir ' + limit + '\r\n';
		cmd += 'exit\r\n';
		cmd += 'channel-tree outbound\r\n';
		if (!root_out || (!!isBandwidth && parseInt(limit, 10) > parseInt(root_out, 10))) cmd += 'channel-g root parent null cir ' + limit + ' pir ' + limit + '\r\n';
		cmd += 'exit\r\n';
	}
	asy_request('config', cmd);
}
//t90设置时间对象
function setTimeObj(){
	var Name = {
		en	:	{
			any		:	'any',
			work	:	'work_time',
			unwork	:	'unwork_time',
			weekend	:	'weekend'
		},
		zh	:	{
			any		:	'所有时间',
			work	:	'工作时间',
			unwork	:	'非工作时间',
			weekend	:	'周末'
		}
	};
	/*
	var time = Name.zh;
	if (window.navigator.userLanguage.indexOf('zh-cn') == -1) {
		time = Name.en;
	}
	*/
	var time = Name.en, cmd = '';
	
	var isExit = function (n) {
		return $.trim(request('exec', 'show time-range ' + n)[0]) != '';
	}
	if (!isExit(time.any)) {
		cmd += 'time-range ' + time.any + '\r\n' + 'periodic daily 00:00 to 23:59\r\n' + 'exit\r\n';
	}
	if (!isExit(time.work)) {
		cmd += 'time-range ' + time.work + '\r\n' + 'periodic weekdays 08:00 to 12:00\r\n' + 'periodic weekdays 13:00 to 18:00\r\n' + 'exit\r\n';
	}
	if (!isExit(time.unwork)) {
		cmd += 'time-range ' + time.unwork + '\r\n' + 'periodic weekdays 00:00 to 08:00\r\n' + 'periodic weekdays 12:00 to 13:00\r\n' + 'periodic weekdays 18:00 to 23:59\r\n' + 'exit\r\n';
	}
	if (!isExit(time.weekend)) {
		cmd += 'time-range ' + time.weekend + '\r\n' + 'periodic weekend 00:00 to 23:59\r\n';
	}
	asy_request('config', cmd);
}
function setTimeRange (cfg) {
	if (typeof cfg != 'string') return;
	var name = {'any' : 1, 'work_time' : 2, 'unwork_time' : 3, 'weekend' : 4};
	if (!name[cfg]) return;
	
	var isExit = function (n) {
		return $.trim(request('exec', 'show time-range ' + n)[0]) != '';
	}
	if (isExit(cfg)) return;
	
	var cmd = {
		1	:	'time-range any\r\n' + 'periodic daily 00:00 to 23:59\r\n' + 'exit\r\n',
		2	:	'time-range work_time\r\n' + 'periodic weekdays 08:00 to 12:00\r\n' + 'periodic weekdays 13:00 to 18:00\r\n' + 'exit\r\n',
		3	:	'time-range unwork_time\r\n' + 'periodic weekdays 00:00 to 08:00\r\n' + 'periodic weekdays 12:00 to 13:00\r\n' + 'periodic weekdays 18:00 to 23:59\r\n' + 'exit\r\n',
		4	:	'time-range weekend\r\n' + 'periodic weekend 00:00 to 23:59\r\n'
	}
	request('config', cmd[name[cfg]]);
}
function initURLObj() {
	var cmd = 'url-object illegal\r\n';
	cmd += 'exit\r\n';
	cmd += 'url-object work\r\n'
	cmd += 'exit\r\n';
	cmd += 'url-object unwork\r\n'
	cmd += 'exit\r\n';
	cmd += 'url-object other\r\n'
	asy_request('config', cmd);
}
function getVer() {
	var data = request("exec", "sh ver");
	return data[0].substring(data[0].indexOf("(") + 1, data[0].indexOf(")"));
}

function getScene() {
	var data = request("exec", "show intelligent-fc type"), result = [];
	for (var i = 0; i < data.length - 1; i++) {
		result.push(data[i].split(/\s+/)[1]);
	}
	return result;
}

function getCode() {
	var data = request("exec", "show sys-mode");
	if (!__ToolCookie.getCookie('mode')) {
		//__ToolCookie.setCookie({key : 'mode', value : data[0]});
	}
	for (var i = 0; i < data.length; i++) {
		if (data[i].indexOf("web-coding") != -1) {
			return data[i].split(/\s+/)[1];
		}
	}
	return "";
}

function isEG() {
	return getVer().indexOf("EG") != -1;
}

function isNPE() {
	return getVer().indexOf("NPE") != -1;
}

var pub_intelligent = "none";

function isIntelligent() {
	if (pub_intelligent == "none") {
		var data = request("exec", "show intelligent-fc info");
		pub_intelligent = data.length != 1 && data.toString().indexOf("%") == -1;
	}
	return pub_intelligent;
}

function intelligentType() {
	var data = request("exec", "show intelligent-fc info");
	return data[0].split(/\s+/)[2];
}
 
function getElById(idVal){
    if (document.getElementById != null) 
        return document.getElementById(idVal);
    if (document.all != null) 
        return document.all[idVal];
    alert("getting element by id error!");
    return null;
}

/* 用于全选Select栏所有的option. */
function sltAll(sId){
    var oSel = document.getElementById(sId);
    
    if (oSel == null) {
        return;
    }
    var iLen = oSel.options.length;
    
    for (var i = 0; i < iLen; i++) {
        oSel.options[i].selected = true;
    }
}

/* 禁用或者启用相对应的控件，如Select栏，Text栏等等。*/
function enbWin(obj, bSta){
    if (obj != null) {
        obj.disabled = !bSta;
    }
}

/* 判断字符串是否为空,为空返回true,否则返回false */
function isEmpty(str){
    if ((str == null) || (str.length == 0)) {
        return true;
    }
    return false;
}

/* 如果输入是数字,返回true,否则返回false */
function isNumber(str){
    var i;
    if (str==undefined||str.length <= 0) {
        return false;
    }
    for (i = 0; i < str.length; i++) {
        var c = str.charCodeAt(i);
        if (c < 48 || c > 57) 
            return false;
    }
    return true;
}

function isCH(sStr){
    signCode = new RegExp("[[*?+()<>]");
    
    var codeList = "`1234567890-=\\qwertyuiop[]asdfghjkl;'zxcvbnm,./" +
    "~!@#$%^&*()_+| QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?";
    
    for (var i = 0; i < sStr.length; i++) {
        if (sStr.substr(i, 1) == "\\") 
            continue;
        
        if (signCode.test(sStr.substr(i, 1))) {
            continue;
        }
        
        if (codeList.search(sStr.substr(i, 1)) == -1) {
            return true;
        }
    }
    
    return false;
}

function isValidChar(sStr){
    var re = "/:*?\"<> \\|";
    
    for (var i = 0; i < sStr.length; i++) {
        if (re.indexOf(sStr.substr(i, 1)) >= 0) {
            return false;
        }
    }
    
    return true;
}
/* 验证用户名，是否合法(包含空格和非法字符验证)*/
function validateUser(str) {
	var reg = /[~`!@#$%^&*?？ ]/g;
	return !reg.test(str);
}
/* 对输入的IP地址进行校验,格式为xx.xx.xx.xx */
function validateIP(IPstr){
    /* 有效性校验 */
    var IPPattern = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
    if (!IPPattern.test(IPstr)) 
        return false;
    /* 检查域值 */
    var IPArray = IPstr.split(".");
    if (IPArray.length != 4) 
        return false;
	if(IPArray[0]==127 || parseInt(IPArray[0])>=224){
		return false;
	}
    var tInt = 0;
    var iInt = 0;
    for (iInt = 0; iInt < 4; iInt++) {
        /* 每个域值范围0-255 */
        tInt = parseInt(IPArray[iInt]);
        if (tInt < 0 || tInt > 255) 
            return false;
    }
    return true;
}

function validateMask_this(sMask){
    /* 有效性校验 */
    var IPPattern = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
    if (!IPPattern.test(sMask)) 
        return false;
    
    /* 检查域值 */
    var IPArray = sMask.split(".");
    if (IPArray.length != 4) 
        return false;
    
    /* 网络掩码的第一字节最小为192,第四字节最大为252 */
    if (parseInt(IPArray[0]) < 192 && parseInt(IPArray[0]) != 0) 
        return false;
    
    for (var i = 0; i < 4; i++) {
        /* 每项值必须是以下值才能通过 */
        switch (parseInt(IPArray[i])) {
            case 0:
                break;
            case 128:
            case 192:
            case 224:
            case 240:
            case 248:
            case 252:
            case 254:
            case 255:{
                if (i > 0) {
                    if (parseInt(IPArray[i - 1]) != 255) {
                        return false;
                    }
                }
                break;
            }
            default:
                return false;
        }
    }
    
    return true;
}

function validateMask(sMask){
    /* 有效性校验 */
    var IPPattern = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
    if (!IPPattern.test(sMask)) 
        return false;
    
    /* 检查域值 */
    var IPArray = sMask.split(".");
    if (IPArray.length != 4) 
        return false;
    
    /* 网络掩码的第一字节最小为192,第四字节最大为252 */
    if (parseInt(IPArray[0]) < 192 && parseInt(IPArray[0]) != 0) 
        return false;
    
    for (var i = 0; i < 4; i++) {
        /* 每项值必须是以下值才能通过 */
        switch (parseInt(IPArray[i])) {
            case 0:
                break;
            case 128:
            case 192:
            case 224:
            case 240:
            case 248:
            case 252:
            case 254:
            case 255:{
                if (i > 0) {
                    if (parseInt(IPArray[i - 1]) != 255) {
                        return false;
                    }
                }
                break;
            }
            default:
                return false;
        }
    }
    
    return true;
}

function isZeroStr(szVal){
    if (szVal == null || szVal.length == 0) {
        return true;
    }
    
    return false;
}

function lTrim(szVal){
    for (i = 0; i < szVal.length && szVal.charAt(i) == " "; i++) 
        ;
    return szVal.substring(i);
}

function rTrim(szVal){
    for (i = szVal.length - 1; i >= 0 && szVal.charAt(i) == ' '; i--) 
        ;
    
    return szVal.substr(0, i + 1);
}

function Trim(szVal){
    if (isZeroStr(szVal)) {
        return "";
    }
    
    return rTrim(lTrim(szVal));
    
}

function validatePort(port){
    /*先判断是不是数字*/
    if (isNumber(port) == false) {
        return false;
    }
    
    if (port >= 1 && port <= 65535) 
        return true;
    else 
        return false;
}
//判断字符串所占字节数
function getByteLen(str){
	return   str.replace(/[^\x00-\xff]/g,"**").length;}



/* 控件相关的公用函数集 */

function enCtl(vId){
    var oCtl = vId;
    
    if (vId == null) 
        return false;
    
    if (typeof(vId) == "string") 
        oCtl = getElById(vId);
    
    if (oCtl != null) 
        oCtl.disabled = false;
}

function foCtl(vId){
    var oCtl = vId;
    
    if (vId == null) 
        return false;
    
    if (typeof(vId) == "string") 
        oCtl = getElById(vId);
    
    if (oCtl != null) 
        oCtl.focus();
}

function diCtl(vId){
    var oCtl = vId;
    
    if (vId == null) 
        return false;
    
    if (typeof(vId) == "string") 
        oCtl = getElById(vId);
    
    if (oCtl != null) 
        oCtl.disabled = true;
}

/*
 功能：返回产品名称，用来区分产品
 */
function gerproduce(){
    var cmdstr = "show basic-info d\r\n"
    var modestr = "exec";
    var result = new Array;
    
    /*
     var produce=new Array(
     "NBR2000",
     "NBR200",
     "NBR300",
     "NBR1000",
     "NBR1100",
     "NBR1200"
     );*/
    var index = -1;
    result = request(modestr, cmdstr);
    if (result == null) 
        return;
	if (result.join().indexOf('EG1000-CM') != -1 || result.join().indexOf('EG1000CM') != -1) {
		return 'EG1000C';	
	}
    return result[2].substring(63);
    //return null;
}

function intf(intf_name, ip, mask, gateway, mac, lan_wan, isp, desc, sfp_utp, up_down, bandwidth){
    this.intf_name = Trim(intf_name);
	if (this.intf_name.indexOf('(') != -1) {
		this.intf_name = this.intf_name.substring(0, this.intf_name.indexOf('('));
	}
    this.ip = Trim(ip)
    this.mask = Trim(mask)
    this.gateway = Trim(gateway)
    this.mac = Trim(mac);
    this.lan_wan = Trim(lan_wan);
    this.isp = Trim(isp) == 'CUCC' ? 'CNC' : Trim(isp);
    this.desc = Trim(desc);
    this.sfp_utp = Trim(sfp_utp);//1为电口，0为光口
    this.up_down = Trim(up_down)
    this.bandwidth = Trim(bandwidth);
    var dialer = /di(\d+)/g.exec(intf_name);
    this.dialer = dialer && dialer[1];
}

function intf2(board_num,slot_num,intf_num,intf_name, ip, mask, mac, lan_wan, mtu, type, up_down, bandwidth){
    this.intf_name = Trim(intf_name);
	if (this.intf_name.indexOf('(') != -1) {
		this.intf_name = this.intf_name.substring(0, this.intf_name.indexOf('('));
	}
	if(this.intf_name.indexOf('GigabitEthernet ') != -1)
		this.intf_name = this.intf_name.replace("GigabitEthernet ", "Gi");
	if(this.intf_name.indexOf('TenGigabitEthernet ') != -1)
		this.intf_name = this.intf_name.replace("TenGigabitEthernet ", "Te");
	if(this.intf_name.indexOf('dialer') != -1)
		this.intf_name = this.intf_name.replace("dialer ", "di");
	
    this.ip = Trim(ip)
    this.mask = Trim(mask)
    this.mac = Trim(mac);
    this.lan_wan = Trim(lan_wan);
    this.type = Trim(type);//1为电口，0为光口
    this.up_down = Trim(up_down)
    this.bandwidth = Trim(bandwidth);
    this.board_num = Trim(board_num);
	this.slot_num = Trim(slot_num);
	this.intf_num = Trim(intf_num);
	this.mtu = Trim(mtu);
}


///////////////////////////////////////////////////////////////////////////////////获取接口信息
//示例：
//var inter_arr = get_intf_info();
//for(var i=0;i<inter_arr.length;i++){
//if(inter_arr[i].lan_wan == 'NAT_OUTSIDE'){
//alert('ee');
//}
 //show route html inter info依次的元素是board_num,slot_num,intf_num,intf_name, ip, mask, mac, lan_wan, mtu, type, up_down, bandwidth
function get_intf_info(){
    var intf_str = request("exec", "show route html inter info");
    if (intf_str == null)
        return;
    var i, arr;
    var intf_array = [];
    for (i = 0; i < intf_str.length - 1; i++) {
        var arr = intf_str[i].split("#");
        //var full = arr[1].replace(/Gi/,"Gidad");
        arr[1] = PF.filter(arr[1]);
		if (arr[1].indexOf('vlan') != -1 || PF.isJoinAg(arr[1])) {
			continue;
		}
        var obj = new intf2(arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9],arr[10],arr[11]);
		//intf_array[i] = obj;
        intf_array.push(obj)
    }
	if (!__ToolCookie.getCookie('intf')) {
		intf_str.pop();
		//__ToolCookie.setCookie({key : 'intf', value : intf_str.join('88888888')});
	}
    return intf_array;
}

/*
 功能：返回所有up的外网接口。
 */
function get_up_intf(){
    var ints = get_intf_info();
    var inters = new Array();
    var j = 0;
    for (var i = 0; i < ints.length; i++) {
        if (ints[i].up_down == "UP" && ints[i].lan_wan == "WAN") {
            inters[j] = ints[i].intf_name;
            j++;
        }
    }
    return inters;
}

/*
 功能：返回所有up的网桥。
 */
function get_up_bri(){
    var bridges = new Array();
    var j = -1;
    var strCommand = "show bridge-map";
    var result = request("exec", strCommand);
    for (var i = 0; i < result.length - 5; i = i + 5) {
        if (result[i].toString().indexOf("UP") >= 0) {
            j++;
			bridges[j]=result[i].replace(/\r\n/g,"").split(" ")[0].toLowerCase()+" "+result[i].replace(/\r\n/g,"").split(",")[0].split(" ")[2];
        }
    }
    return bridges;
}
/*
 功能：返回所有up的网桥。
 */
function get_config_bri(){
    var bridges = new Array();
    var strCommand = "show bridge-map";
    var result = request("exec", strCommand);
    for (var i = 0; i < result.length - 5; i = i + 5) {
        if (result[i+1].toString().indexOf("GigabitEthernet") !=-1) {
			bridges.push(result[i].replace(/\r\n/g,"").split(" ")[0].toLowerCase()+" "+result[i].replace(/\r\n/g,"").split(",")[0].split(" ")[2]);
        }
    }
    return bridges;
}
/*
 功能：返回指定网桥的外网口。
 */
function get_up_bri_wan(bri){
    if (!isNumber(parseInt(bri))) {
        return bri;
    }
    var inter;
    var strCommand = "show bridge-map", result;
    if (bridgeMap) {
    	result = bridgeMap;
    }
    else {
    	result = request("exec", strCommand);
    	bridgeMap = result;
    }
    for (var i = 0; i < result.length - 5; i = i + 5) {
        if (result[i].toString().indexOf(bri) >= 0) {
            var len = result[i + 1].split(" ").length;
            inter = result[i + 1].split(" ")[len - 2] + " " + result[i + 1].split(" ")[len - 1];
        }
    }
    return intf_name_to_brief(inter);
}

/*
 功能：判断是否是网关模式，是返回true，不是返回false。
 */
function isGatewayMode(){
    var result = request("exec", "show sys-mode");
	if (!__ToolCookie.getCookie('mode')) {
		result.pop();
		//__ToolCookie.setCookie({key : 'mode', value : result[0]});
	}
    return result[0].indexOf("gateway") != -1;
}

/*
 功能：获取带宽，返回单位为M的数字。
 */
function getBandwidth(interName){
    var bandwidth;
    var strCommand = "show html interface info";
	if (!__ToolCookie.getCookie('intf')) {
		//__ToolCookie.setCookie({key : 'intf', value : strCommand.join('88888888')});	
	} 
    var result = request("exec", strCommand);
    var interInfos = new Array();
    
    for (var i = 0; i < result.length; i++) {
        interInfos = result[i].split("#");
        if (interInfos[1] == interName) {
            bandwidth = interInfos[interInfos.length - 1];
            break;
        }
    }
    if (isNumber(bandwidth)) {
        return (bandwidth / 1000);
    }
    else {
        return (120);
    }
}

/*
 功能：获取指定接口的IP。
 */
function getInterIP(inter){
    var strCommand = "show ip interface " + inter;
    var result = request("exec", strCommand);
    for (var i = 0; i < result.length; i++) {
        if (Trim(result[i].replace(/\r\n/g, "")) == "IP address is:") {
            result[i + 1] = Trim(result[i + 1].replace(/\r\n/g, ""));
            return (result[i + 1].split("/")[0]);
        }
    }
    return null;
}

/*
 功能：获取指定接口IP的掩码。
 */
function getInterIPMask(inter){
    var strCommand = "show ip interface " + inter;
    var result = request("exec", strCommand);
    var mask = null;
    for (var i = 0; i < result.length; i++) {
        if (Trim(result[i].replace(/\r\n/g, "")) == "IP address is:") {
            result[i + 1] = Trim(result[i + 1].replace(/\r\n/g, ""));
            mask = result[i + 1].split(" ")[0];
            mask = getSubnetMaskString(mask);
            break;
        }
    }
    return mask;
}

/*
 函数名：get_intf_all()
 输入：无
 输出：包含所有物理接口字符串描述符的数组
 描  述：获取所有物理接口，返回包含所有物理接口的数组，数组元素按LAN,WAN0,WAN1顺序排列
 */
function get_intf_all(){
    var intf_str = new Array();
    var g_all_intf = new Array();
    var cmdstr;
    var i;
    var intf_pos;
    var start;
    var end;
    var pos;
    var type;
    var exist_5;
    var exist_19;
    var exist_wz;
    var intf_pos = 0;
    
    
    cmdstr = "show html interface status";
    intf_str = request("exec", cmdstr);
    if (intf_str == null) 
        return;
    for (i = 0; i < intf_str.length - 1; i++) {
        exist_5 = intf_str[i].indexOf("Fa");
        exist_19 = intf_str[i].indexOf("Gi");
        exist_wz = intf_str[i].indexOf("Te");
        
        if (exist_5 != -1 || exist_19 != -1 || exist_wz != -1) {
            pos = intf_str[i].indexOf("\/");
            //intf_pos = parseInt(intf_str[i].charAt(pos-1)) + parseInt(intf_str[i].charAt(pos+1));
            //alert(intf_pos);
            start = intf_str[i].indexOf("#");
            end = intf_str[i].indexOf("#", start + 1);
            g_all_intf[intf_pos] = intf_str[i].substring(start + 1, end);
            intf_pos++;
            
            
        }
    	
        if (g_all_intf[i] == null) 
            continue;
        
        if (exist_5 != -1) {
            g_all_intf[i] = "FastEthernet " + g_all_intf[i].substr(2);
        }
        else if (exist_19 != -1) {
            g_all_intf[i] = "GigabitEthernet " + g_all_intf[i].substr(2);
        }
        else {
            g_all_intf[i] = "TenGigabitEthernet " + g_all_intf[i].substr(2);
        }
    }
    return g_all_intf;
}

//////////////////////////////////////////////////获取lan口
function get_lan_intf(){
    var value = get_intf_info();
    var intf = new Array();
    for (var i = 0; i < value.length; i++) {
        if (value[i].lan_wan == "LAN") {
            intf.push(value[i].intf_name);
        }
    }
    return intf;
}

//////////////////////////////////////////////////获取wan口
function get_wan_intf(){
    var value = get_intf_info();
    var intf = new Array();
    for (var i = 0; i < value.length; i++) {
        if (value[i].lan_wan == "WAN") {
			var t = value[i].intf_name;
            intf.push(t.indexOf('(') != -1 ? t.substring(0, t.indexOf('(')) : t);
        }
    }
    return intf;
}
////////////////////////////////////////////////////获取第一个UP的wan口，若没有，返回第一个wan口
function get_wan_first_up(){
	var data = __ToolCookie.getCookie('intf');
	if (!data) {
		var value = getWans();
		for (var i = 0; i < value.length; i++) {
			if (value[i].up_down == "UP") {
				return value[i];
			}
		}
		return value[0];
	} else {
		data = data.split('88888888');
		var o = {};
		for (var i = 0; i < data.length; i++) {
			var t = data[i].split('#');
			if (t[6] && t[6] == 'WAN' && t[10] && t[10] == 'UP') {
				o.intf_name = t[1];
				return o;	
			}
		}
		o.intf_name = getWanFromCookie()[0];
		return o;
	}
}
//////////////////////////////////////////////////获取lan口对象数组
function getLans(){
    var value = get_intf_info();
    var intf = new Array();
    for (var i = 0; i < value.length; i++) {
        if (value[i].lan_wan == "LAN") {
            intf.push(value[i]);
        }
    }
    return intf;
}

//////////////////////////////////////////////////获取wan口对象数组
function getWans(){
    var value = get_intf_info();
    var intf = new Array();
    for (var i = 0; i < value.length; i++) {
        if (value[i].lan_wan == "WAN") {
            intf.push(value[i]);
        }
    }
    return intf;
}
//////////////////////////////////////////////////获取mgmt口对象数组
function getMgmt(){
	var value = get_intf_info();
    var intf = new Array();
    for (var i = 0; i < value.length; i++) {
        if (value[i].intf_name.indexOf("Mg") !== -1) {
            intf.push(value[i]);
        }
    }
    return intf[0] || null;
}

//////////////////////////////////////////将GigabitEthernet 0/0 转换成Gi0/0

function intf_name_to_brief(intf_name){
	var brief_name;
	if (intf_name.indexOf("Ten") != -1) {
		brief_name = intf_name.replace("TenGigabitEthernet", "Te");
	}
	else {
		brief_name = intf_name.replace("GigabitEthernet", "Gi");
	}
    var reg = /\s/g;
    brief_name = brief_name.replace(reg, "");
    return brief_name;
}

/*
 函数名：get_intf_single()
 输入：要获取的接口名，LAN，WAN0,WAN1
 输出：指定接口的描述符
 */
function get_intf_single(intf){
    var g_all_intf = new Array();
    g_all_intf = get_intf_all();
    if (intf == "LAN0") {
        return get_real_intf(g_all_intf[0]);
    }
    if (intf == "LAN1") {
        return get_real_intf(g_all_intf[1]);
    }
    if (intf == "WAN0") {
        return get_real_intf(g_all_intf[2]);
    }
    if (intf == "WAN1") {
        return get_real_intf(g_all_intf[3]);
    }
    if (intf == "WAN2") {
        return get_real_intf(g_all_intf[4]);
    }
    if (intf == "WAN3") {
        return get_real_intf(g_all_intf[5]);
    }
    return intf;
}


/*
 函数名：get_vir_intf()
 输入：指定接口的描述符
 输出：要获取的接口名，LAN，WAN0,WAN1
 */
function get_vir_intf(intf){
    var g_all_intf = new Array();
    g_all_intf = get_intf_all();
    if (intf == g_all_intf[0]) {
        return "LAN0";
    }
    if (intf == get_real_intf(g_all_intf[1])) {
        return "LAN1";
    }
    if (intf == get_real_intf(g_all_intf[2])) {
        return "WAN0";
    }
    if (intf == get_real_intf(g_all_intf[3])) {
        return "WAN1";
    }
    if (intf == get_real_intf(g_all_intf[4])) {
        return "WAN2";
    }
    if (intf == get_real_intf(g_all_intf[5])) {
        return "WAN3";
    }
    return intf;
}

/*
 函数名：get_lan_port_num()
 输入：无
 输出：获取lan端口个数
 */
function get_lan_port_num(){
    var device;
    device = gerproduce();
    if (device == "NBR2000" || device == "NBR28-21") {
        return 1;
    }
    else 
        if (device == "NBR2500" || device == "NBR3000") {
            return 5;
        }
        else {
            return 4;
        }
    //此处添加其他设备
}

/*页面刷新*/
function refresh(destination){
    window.location = destination;
}


/*192.168.62.230/24中获取192.168.62.230*/
function getIPString(strIP){
    var findIndex;
    var strInterfaceIP;
    findIndex = strIP.indexOf('/');
    if (findIndex == -1) 
        return null;
    strInterfaceIP = strIP.substring(0, findIndex);
    return strInterfaceIP;
}

/*192.168.62.230/24中获取255.255.255.0*/
function getSubnetMaskString(strIP){
    var findIndex;
    var strSubnetMask = "";
    var mask;
    findIndex = strIP.indexOf('/');
    if (findIndex == -1) 
        return null;
    mask = strIP.substring(findIndex + 1);
    //parse
    var maskvalue = Trim(mask);
    maskvalue = parseInt(maskvalue);
    var bValue = 0xffffffff;
    if (maskvalue != 0) 
        bValue = bValue << (32 - maskvalue);
    else 
        bValue = 0;
    for (var i = 0; i < 4; i++) {
        var b = bValue & 0xff;
        strSubnetMask = "." + b + strSubnetMask;
        bValue = bValue >> 8;
    }
    strSubnetMask = strSubnetMask.substring(1, strSubnetMask.length);
    return strSubnetMask;
}

/*MAC验证*/
function validateMAC(MACstr){
    var MACPattern = /^[0-9,a-f,A-F]{4}\.[0-9,a-f,A-F]{4}\.[0-9,a-f,A-F]{4}$/
    if (MACstr == "0000.0000.0000") {
        return false;
    }
    if (!MACPattern.test(MACstr)) 
        return false;
    var unicastPattern = /^[0-9,a-f,A-F]{1}[1,3,5,7,9,b,d,f]{1}.*$/
    if (unicastPattern.test(MACstr)) 
        return false;
    return true;
}

/*设置成功提示*/
function op_finished(info){
    alert(info + "成功!");
}

/*IP地址转换成整型*/
function ip_to_long(ipstr){
    var iplong=0;
    var ipArr = new Array();
	
	if ($.trim(ipstr)==''){
		 return iplong;	
	}

    ipArr = ipstr.split(".");
    iplong = parseInt(ipArr[0]) * 256 * 256 * 256 + parseInt(ipArr[1]) * 256 * 256 +
    parseInt(ipArr[2]) * 256 +
    parseInt(ipArr[3]);
    return iplong;
}

/*ip掩码匹配验证,匹配返回true,不匹配返回false*/
/*输入:ip和mask字符串*/
function ip_mask_match(ipstr, maskstr){
    var ip;
    var mask;
    ip = ip_to_long(ipstr);
    mask = ip_to_long(maskstr);
    if (ip == 0 && mask == 0) {
        return true;
    }
    if ((ip & (mask)) == 0) {
        return false;
    }
    if ((ip & (~ mask)) == 0) {
        return false;
    }
    return true;
}

/*ip网段掩码匹配验证,匹配返回true,不匹配返回false*/
/*输入:ipnet和mask字符串*/
function ipnet_mask_match(ipstr, maskstr){
    var ip;
    var mask;
    ip = ip_to_long(ipstr);
    mask = ip_to_long(maskstr);
    if (ip == 0 && mask == 0) {
        return true;
    }
    if ((ip & (mask)) == 0) {
        return false;
    }
    if ((ip & (~ mask)) != 0) {
        return false;
    }
    return true;
}


/*判断字符串中是否包含空格*/
/*输入：待检查的字符串*/
/*输出:包含空格，返回true,不包含返回false*/
function has_space(str_in){
    var pos;
    pos = str_in.indexOf(" ");
    if (pos != -1) {
        return true;
    }
    else {
        return false;
    }
}

/*判断字符串中是否包含问号*/
/*输入：待检查的字符串*/
/*输出:包含空格，返回true,不包含返回false*/
function has_quest(str_in){
    var pos;
    pos = str_in.indexOf("?");
    if (pos != -1) {
        return true;
    }
    else {
        return false;
    }
}


/*判断用户名合法性，目前只判断是否包含空格和问号*/
/*输入：待检查的字符串*/
/*输出:包含空格，返回true,不包含返回false*/
function validate_username(str_in){
    if (has_space(str_in) == true || has_quest(str_in) == true) {
        return false;
    }
    return true;
}


/*
 ???:QueryString(name)
 ???:lj
 ????:2007,3,28
 ??:????url?????
 ??:??name??
 ?  ?:??????url?????????????
 */
function QueryString(name){
    var qs = name + "=";
    var str = location.search;
    if (str.length > 0) {
        begin = str.indexOf(qs);
        if (begin != -1) {
            begin += qs.length;
            end = str.indexOf("&", begin);
            if (end == -1) 
                end = str.length;
            return (str.substring(begin, end).replace("%20", " "));
        }
    }
    return "";
}


function QueryPar(name, urlpar){
    var qs = name + "=";
    var str = urlpar;
    if (str.length > 0) {
        begin = str.indexOf(qs);
        if (begin != -1) {
            begin += qs.length;
            end = str.indexOf("&", begin);
            if (end == -1) 
                end = str.length;
            return (str.substring(begin, end));
        }
    }
    return "";
}

//??????url???????
function get_url_par(){
    var str = location.search;
    var begin = str.indexOf("?");
    if (begin == -1) {
        return "";
    }
    return (str.substring(begin));
}

//??url,?????name???,?????value,?????,???
//??value????(???),???url???name??
function set_url_par(name, value, urlpar){
    var newurlpar;
    var oldvalue;
    var newvalue;
    var pos;
    var endpos;
    var check_value;
    //check_value = Trim(value);
    
    if (value == "") {
        return urlpar;
    }
    
    if (urlpar == "") {
        urlpar = "?";
    }
	var name1 = "[?&]"+name+"="+value+"[&]*";
	
    pos = urlpar.search(new RegExp(name1));
	
	

    if (pos == -1) {
        if (urlpar == "?") {
            newurlpar = urlpar + name + "=" + value;
        }
        else {
            newurlpar = urlpar + "&" + name + "=" + value;
        }
        return newurlpar;
    }
    //??name???value
    endpos = urlpar.indexOf("&", pos + 1);
    if (endpos == -1) {
        //??name???????
        endpos = urlpar.length;
		
    }
	oldvalue = urlpar.substring(pos+1, endpos);
	    newvalue = name + "=" + value;
	    newurlpar = urlpar.replace(oldvalue, newvalue);
	    return newurlpar;
    
}
function str2array(str){
	var result="";
	if(str.length>0)
	   for(i=0;i<str.length;i++)
	      result+=str[i];
    return result;		  
		
}
/*判断线路接口类型*/
/*输入：接口描述符
 * 输出：静态、动态、pppoe分别返回"static"、"dhcp"、"pppoe"
 */
function get_wan_type(intf_str){
    var cmdstr;
    var pos;
    var resultstr;
    var result = new Array();
    
    cmdstr = "show run interface " + intf_str;
    result = request("exec", cmdstr);
    resultstr = str2array(result);
    
    pos = resultstr.indexOf("ip address");
    if (pos != -1) {
        pos = resultstr.indexOf("ip address dhcp");
        if (pos != -1) {
            return "dhcp"; //dhcp
        }
        else { //static
            return "static";
        }
    }
    else {
        pos = resultstr.indexOf("pppoe");
        if (pos != -1) {
            return "pppoe";
        }
        else {
            /*没配任何接口*/
            return "";
        }
    }
}


/*验证数字是否合法
 *输入：待验证的数字字符串，数字下界，数字上界
 *输出：合法返回TRUE，否则返回FALSE
 */
function validate_number(numstr, down, up){
    var num;
    /*先判断是不是数字*/
    if (isNumber(numstr) == false) {
        return false;
    }
    num = parseInt(numstr);
    if (num >= down && num <= up) 
        return true;
    else 
        return false;
}

/*根据值，设定select控件的选中项
 *输入：控件id，选项值
 *输出：将select控件的选中项设置成值等于entry的项
 */
function set_selected_as(selectid, entry){
    var i;
    var select_obj;
    select_obj = document.getElementById(selectid);
    for (i = 0; i < select_obj.length; i++) {
        if (select_obj.options[i].text == entry) {
            select_obj.options[i].selected = true;
        }
    }
}


/*根据输入接口名，如fa1/0,返回真实接口，针对pppoe返回对应dialer口，其他返回以太口（原值返回）*/
function get_real_intf(intf){
    var ret_intf = intf;
    var pppoe_par = new Array();
    if (get_wan_type(intf) == "pppoe") {
        pppoe_par = get_pppoe_par(intf);
        if (pppoe_par == null || pppoe_par == "") 
            return;
        if (pppoe_par.length > 1) {
            //alert(pppoe_par);
            ret_intf = "dialer " + pppoe_par[1];
        }
    }
    return ret_intf;
}


function get_pppoe_par(intf){
    var result = new Array();
    var pppoe_par = new Array();
    var cmdstr;
    var i;
    cmdstr = "show html ip interface " + intf + " pppoe";
    /*最后有一空行*/
    result = request("exec", cmdstr);
    
    if (result.length == 1) {
        pppoe_par[0] = "";
        return pppoe_par;
    }
    
    for (i = 0; i < result.length - 1; i++) {
        pppoe_par[i] = get_value(result[i]);
    }
    
    return pppoe_par;
}


function get_value(str){
    var result;
    var pos;
    pos = str.indexOf(":");
    result = str.substr(pos + 2); //一个冒号和一个空格
    //如果是IP，空值会返回0.0.0.0，需修正为空字符串
    if (result == "0.0.0.0") {
        result = "";
    }
    return result;
}

/*返回系统所处模式，分别返回NAT，PUBLIC，NONE*/
function get_sys_mode(){
    var result = new Array();
    var i, pos, pos1;
    var intf_lan = get_intf_single("LAN0");
    var cmdstr = "show run interface " + intf_lan;
    result = request("exec", cmdstr);
    
    for (i = 0; i < result.length; i++) {
        pos = result[i].indexOf("ip nat inside");
        if (pos != -1) {
            return "NAT";
        }
        pos = result[i].indexOf("ip rate-limit in");
        pos1 = result[i].indexOf("ip area inside");
        if ((pos != -1) || (pos1 != -1)) {
            return "PUBLIC";
        }
    }
    return "NONE";
}


/*判断是否配置了防内网攻击，配置了返回所配命令，否则返回空串*/
function defence_lan_is_configed(){
    var cmdstr = "show run";
    var result = new Array();
    var i, pos;
    
    result = request("exec", cmdstr);
    for (i = 0; i < result.length; i++) {
        pos = result[i].indexOf("security anti-lan-attack");
        if (pos != -1) {
            return result[i];
        }
    }
    return "";
}
var lang = window.top.SysLan || 'en';
var Const = lang == 'en'?{
    linkError:'Unable to establish a connection！',
    servError:'Get server IP address error！',
    netError:'Please check your network connection is normal'
}:{
    linkError:'无法建立连接！',
    servError:'获取服务器IP地址错误！',
    netError:'请检查您的网络连接是否正常'
};
/* 从pub_fun_for_switch.js移过来的 */
function request_with_ip(ipstr,strCLIMode,strCLICommand){
    var ip_request = false;
    var commandStr;
    var resultall,resultArray;
    var ipadd_get;

    if(window.ActiveXObject) {
        try {
            ip_request = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e) {
            try {
                ip_request = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e) {
                ip_request = false;
            }
        }
    }
    if(ip_request) {
        if(ipstr!=null){
            ipadd_get= _getProtocol() + "//"+ipstr+"/WEB_VMS/LEVEL15/";
            try {
                ip_request.open("POST", ipadd_get, false);
            }
            catch(e) {
                alert(Const.linkError);
                return;
            }
        }
        else{
            alert(Const.servError);
        }
        commandStr="command="+strCLICommand+"&strurl="+strCLIMode+"%04&mode=%02PRIV_EXEC&signname=Red-Giant."
        try {
            ip_request.send(commandStr);
        }
        catch(e) {
            alert(Const.servError);
            return;
        }
        //debug(commandStr);
        resultall = ip_request.ResponseText;
        resultArray=parseResult(resultall);
    }
    //debug(resultall);
    return resultArray;
}

function get_sw_produce(sw_ip){
    var cmdstr = "show basic-info d\r\n"
    var result = request_with_ip(sw_ip, "exec", cmdstr);
    if (result == null || result == "") 
        return "";
    
    var produce = result[2].substr(60);
    produce = Trim(produce);
    return produce;
}

function get_sw_hostname(sw_ip){
    var cmdstr = "show basic-info \r\n"
    var result = request_with_ip(sw_ip, "exec", cmdstr);
    
    if (result == null || result == "") 
        return "";
    
    var pos = result[0].indexOf(":");
    if (pos == -1) {
        return "";
    }
    var hosts = Trim(result[0].substr(pos + 1));
    return hosts;
}

/*删除公网模式限速和弹性带宽命令*/
function del_all_rate_public(){
    var cmdstr = "";
    var result = new Array();
    var cmdtmp = new Array();
    var i;
    var pos;
    var pool_name = "";
    
    result = request("exec", "show run");
    for (i = 0; i < result.length; i++) {
        pos = result[i].indexOf("ip rate-limit default");
        if (pos != -1) {
            cmdstr += "no ip rate-limit default\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip rate-limit iprange");
        if (pos != -1) {
            cmdtmp = result[i].split(" ");
            cmdstr += "no ip rate-limit iprange " + cmdtmp[3] + " " + cmdtmp[4] + "\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip rate-limit ip");
        if (pos != -1) {
            cmdtmp = result[i].split(" ");
            cmdstr += "no ip rate-limit ip " + cmdtmp[3] + "\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip bandwidth-auto-adjust total-bandwidth");
        if (pos != -1) {
            cmdstr += "no ip bandwidth-auto-adjust total-bandwidth\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip bandwidth-auto-adjust default");
        if (pos != -1) {
            cmdstr += "no ip bandwidth-auto-adjust default\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip bandwidth-auto-adjust iprange");
        if (pos != -1) {
            cmdtmp = result[i].split(" ");
            cmdstr += "no ip bandwidth-auto-adjust iprange " + cmdtmp[3] + " " + cmdtmp[4] + "\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip bandwidth-auto-adjust ip");
        if (pos != -1) {
            cmdtmp = result[i].split(" ");
            cmdstr += "no ip bandwidth-auto-adjust ip " + cmdtmp[3] + "\r\n";
            continue;
        }
        
        pos = result[i].indexOf("ip bandwidth-auto-adjust disable");
        if (pos != -1) {
            cmdstr += "no ip bandwidth-auto-adjust disable\r\n";
            continue;
        }
    }
    return cmdstr;
}


/*返回弹性带宽及IP限速是基于接口及ACL还是基于全局*/
function get_bw_auto_mode(){

    var result = new Array();
    var i;
    var pos;
    var pos0;
    var pos1;
    var pos2;
    
    result = request("exec", "show run");
    for (i = 0; i < result.length; i++) {
        pos = result[i].indexOf("ip nat translation rate-limit");
        pos1 = result[i].indexOf("ip nat translation bandwidth-auto-adjust");
        pos0 = result[i].indexOf("ip nat translation netflow");
        if (pos != -1 || pos1 != -1) {
            pos2 = result[i].indexOf("interface");
            if (pos2 != -1) 
                return 2;
            else 
                return 1;
        }
        if (pos0 != -1) {
            pos2 = result[i].indexOf("interface");
            if (pos2 != -1) 
                return 4;
            else 
                return 3;
        }
    }
    
    return 0;
    
    
}


/*IP地址由整型转换成字符串*/
function long_to_ip(ip_num){
    var ipstr;
    ipstr = ((ip_num & 0xFF000000) >>> 24).toString() + "." +
    ((ip_num & 0x00FF0000) >>> 16).toString() +
    "." +
    ((ip_num & 0x0000FF00) >>> 8).toString() +
    "." +
    ((ip_num & 0x000000FF)).toString();
    return ipstr;
}


function update_timer(timer_func){
    timer_func();
    setTimeout("update_timer(" + timer_func + ")", 5000);
    
    
}


function add_option(id, text, value){
    var Option;
    Option = document.createElement("OPTION");
    id.options.add(Option);
    Option.innerText = text;
    Option.value = value;
}


/*返回wan口所处模式，分别返回NAT，PUBLIC，NONE*/
function get_interface_mode(intf){
    var result = new Array();
    var cmdstr = "show run interface " + intf;
    result = request("exec", cmdstr);
    
    for (i = 0; i < result.length; i++) {
        pos = result[i].indexOf("ip nat ");
        if (pos != -1) {
            return "NAT";
        }
        pos = result[i].indexOf("ip area ");
        if (pos != -1) {
            return "PUBLIC";
        }
    }
    return "NONE";
}


/*获取限速模式，公网返回ip，nat返回ip nat translation，其他返回空*/
function get_ratelimit_mode(){
    var rate_mode = "";
    var cmdstr = "show run interface "
    var result = new Array();
    var g_intf = new Array();
    var i, pos;
    
    g_intf = get_intf_all();
    cmdstr += g_intf[0];
    result = request("exec", cmdstr);
    
    for (i = 0; i < result.length; i++) {
        pos = result[i].indexOf("ip nat inside");
        if (pos != -1) {
            rate_mode = "ip nat translation ";
            break;
        }
        else {
            pos = result[i].indexOf("ip rate-limit in");
            if (pos != -1) {
                rate_mode = "ip ";
                break;
            }
        }
    }
    
    /*rate_mode为空，不一定就不是nat或公网模式（cli直接no掉lan口的模式）*/
    if (rate_mode == "") {
        cmdstr = "show html nat mode";
        result = request("exec", cmdstr);
        if (result[0].substr(6) == "1") {
            rate_mode = "ip nat translation ";
        }
        if (result[0].substr(6) == "2") {
            rate_mode = "ip ";
        }
    }
    return rate_mode;
}

/* 保留小数 */
function ForDight(Dight, How){
    Dight = Math.round(Dight * Math.pow(10, How)) / Math.pow(10, How);
    return Dight;
}

function isfloatNumeric(str){
    if (isEmpty(str)) 
        return true
    if ((isNaN(str)) || (str.indexOf("-") != -1)) 
        return false
    return true
}


function get_intf_vir_ppp(){
    var intf_str = new Array();
    var g_all_intf = new Array();
    var cmdstr;
    var i;
    var intf_pos;
    var start;
    var end;
    var pos;
    var type;
    var exist_17;
    var intf_pos = 0;
    
    cmdstr = "show html interface status";
    intf_str = request("exec", cmdstr);
    
    if (intf_str == null) 
        return;
    
    for (i = 0; i < intf_str.length; i++) {
        exist_17 = intf_str[i].indexOf("Vi");
        
        if (exist_17 != -1) {
            start = intf_str[i].indexOf("#");
            end = intf_str[i].indexOf("#", start + 1);
            g_all_intf[intf_pos++] = intf_str[i].substring(start + 1, end);
            
        }
        
    }
    
    for (i = 0; i < g_all_intf.length; i++) {
        pos = g_all_intf[i].indexOf("Vi");
        if (pos != -1) {
            g_all_intf[i] = "virtual-ppp " + g_all_intf[i].substr(2);
        }
    }
    
    return g_all_intf;
}


function vpn_stats_trans(flag){
    var val_str;
    
    switch (flag) {
        case "1":
            val_str = "拨号成功";
            break;
        case "2":
            val_str = "处于人工关闭状态，需要打开才能拨号";
            break;
        case "3":
            val_str = "拨号未成功：隧道认证失败，请检查密码";
            break;
        case "4":
            val_str = "拨号未成功：pap认证失败,请检查用户名密码";
            break;
        case "5":
            val_str = "拨号未成功：chap认证失败,请检查用户名密码";
            break;
        case "6":
            val_str = "拨号未成功：ppp认证超时,可能是线路问题";
            break;
        case "7":
            val_str = "拨号未成功：对端需要隧道认证，或者本端没配置隧道认证密码";
            break;
        case "8":
            val_str = "正在拨号中......\r\n如长时间无法连接,可能是线路问题,请和线路提供商联系";
            break;
        default:
            val_str = "";
            break;
    }
    
    return val_str;
}

function get_acl_lists(){
    var lists = new Array();
    var result = request("exec", "show access-lists");
    if (result.length == 0) 
        return ""
    var i;
    var pos;
    for (i = 0; i < result.length; i++) {
        if (result[i].indexOf("ip access-list") == -1) 
            continue;
        var pos = result[i].lastIndexOf(" ");
        var a = Trim(result[i].substr(pos));
        lists.push(a);
    }
    return lists;
}

//计算每个刻度值，然后返回六个刻度值。
function getCalibration(band, val, unit){
    var cals = new Array();
    if (unit == "K" || unit == "k") {
        for (var i = 300; i < band; i = i * 2) {
            if (val < i) {
                val = i;
                break;
            }
        }
    }
    else {
        for (var i = 6; i < band; i = i * 2) {
            if (val < i) {
                val = i;
                break;
            }
        }
    }
    var oneCal = Math.ceil(val / 6);
    for (var i = 0; i < 6; i++) {
        cals[i] = oneCal * (i + 1);
    }
    return cals;
}

//获取数组最大值
function maxValue(vals){
    var max = 0;
    for (var i = 0; i < vals.length; i++) {
        if (parseInt(vals[i]) > max) {
            max = parseInt(vals[i]);
            continue;
        }
    }
    return max;
}

//验证str中是否含有非法字符（`~%^&*+?）,有的话return true else return false
function testValue(str){
	var reg = /[\,\`\"\'\~\#\$\%\^\&\*\?\+\？\……\·\￥]+/g;
	return reg.test(str);
}//定义字符串分隔符
var g_split_str = "★ワЁ";


//信息存储到cookie
var __ToolCookie = {
	/**
	 * cfg : {key : key, value : value}
	 * 
	 */
	setCookie	:	function (cfg) {
		var d = new Date();
		d.setTime(d.getTime() + 3600*1000);
		document.cookie = cfg.key + '=' + escape(cfg.value) + ';expire=' + d.toGMTString();
	},
	getCookie	:	function (key) {
		var cookie = document.cookie || '', pos = cookie.indexOf(key + '=');
		if (pos == -1) {
			return null;
		}
		var end = cookie.indexOf(';', pos);
		return unescape(cookie.slice(pos, end == -1 ? cookie.length : end));
	}
}

var getWanFromCookie = function () {
	var source = __ToolCookie.getCookie('intf') && __ToolCookie.getCookie('intf').split('88888888'), result = [];
	
	if (!source){
		source = request('exec', 'show html int info');
		source.pop();
		//__ToolCookie.setCookie({key : 'intf', value : source.join('88888888')});
	}
	
	for (var i = 0; i < source.length; i++) {
		var t = source[i].split('#');
		if (t[6] && (t[6] == 'WAN')) {
			result.push(t[1]);	
		}	
	}
	return result;
}

var getSysModeFromCookie = function () {
	var source = __ToolCookie.getCookie('mode') && __ToolCookie.getCookie('mode').split('88888888'), result = [];

	if (!source){
		source = request('exec', 'show sys-mode');
		//source.pop();
		//__ToolCookie.setCookie({key : 'mode', value : source[0]});
	}

	return source[0].indexOf('gateway') == -1 ? 'bridge' : 'gateway';
}

var isOpenIllegal = function (auditName) {
	var s = request('exec', 'show ' + auditName + ' config ' + get_wan_first_up().intf_name);
	for (var i = 0, length = s.length - 1; i < length; i++) {
		if (s[i].indexOf(auditName + ' 100') != -1 && s[i].indexOf('illegal') != -1) {
			return true;
		}
	}
	return false;
}

function isAuthOpen () {
	var res = request("exec", "show web-auth port-control");
	return res[2] && Trim(res[2]) == 'On';
}


/**
 *提取正则表达式匹配的信息
 *Author:wubanghua 2010-4-7
 ×@input_str :为要匹配的的字符串
 *@reg :为正则表达式
 ×@cat_num:为正则表达式内的括号数 范围(0~8)
 ×@return : 匹配正则表达式括号内的结果，为数组，数组为一维数组
 *         如果都没有匹配到数据那么返回的数组==0
 *description: 正则表达式应该是全局模式，否则有可能提取失败，当提取一块的时候
 */
function match_info(input_str,reg,cap_num)
{

	if(cap_num >8 && cap_num<0){
        debug("Error:cap_num must be 0~8 ");
        return 0;
	}

	if(input_str==null || reg==null){
        debug("input_str or reg is NULL");
        return 0;
	}
	
    var ret_array = new Array();
	var r=reg.exec(input_str);     
	if(r != null)    //zhulin 2010-08-20
	  switch(cap_num){
		case 0 : ret_array.push(r);
			break;
		case 1 : ret_array.push(RegExp.$1);
			break;
		case 2 : ret_array.push(RegExp.$1,RegExp.$2);
			break;
		case 3 : ret_array.push(RegExp.$1,RegExp.$2,RegExp.$3);
			break;
		case 4 : ret_array.push(RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4);
			break;
		case 5 : ret_array.push(RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5);
			break;
		case 6 : ret_array.push(RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6);
			break;
		case 7 : ret_array.push(RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6,RegExp.$7);
			break;
		case 8 : ret_array.push(RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6,RegExp.$7,RegExp.$8);
			break;
		default : 
			debug("Error:cap_num overflow");	
	  }
	
	return ret_array;
}

/**
 *提取正则表达式匹配的信息,返回结果在数组中，数组【1】为第一个匹配项，数组【2】为第二个匹配项，以此类推,即数组【1】为某一列数据，数组【2】为第二列数据
 *author:wubanghua 2010-4-7
 *@input_str :为要匹配的的字符串
 *@reg :为正则表达式
 *@cat_num:为正则表达式内的括号数 范围(0~9)
 *@return : 匹配正则表达式括号内的结果，为数组，数组【1】为第一个匹配项，数组【2】为第二个匹配项，以此类推，即数组【1】为某一列数据，数据【2】为第二列数据
 ×          如果都没有匹配到数据那么返回的数组[0]==0
 **description: 正则表达式必须是全局模式，否则循环无法退出，因为没有了标志信息lastindex
*/
function match_info_array(input_str,reg,cap_num)
{
	if(cap_num >9&&cap_num<0){
	  alert("Error:cap_num must be 0~9 ");
	  return false;
	}
	if(input_str==null||reg==null){
	  alert("input_str or reg is NULL");
	  return false;
	}
    var ret_array = new Array();
	
	/*zhulin 2010-08-20*/
	for (var i = 0; i<=cap_num ; i++) {
		ret_array[i] = new Array();
	}

	var r;
	while((r=reg.exec(input_str))!=null){
		switch(cap_num){
      case 0 : ret_array[0].push(r);
        break;
      case 1 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        break;
      case 2 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        break;
      case 3 : 
        ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        break;
      case 4 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        ret_array[4].push(RegExp.$4);
        break;
      case 5 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        ret_array[4].push(RegExp.$4);
        ret_array[5].push(RegExp.$5);
        break;
      case 6 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        ret_array[4].push(RegExp.$4);
        ret_array[5].push(RegExp.$5);
        ret_array[6].push(RegExp.$6);
        break;
      case 7 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        ret_array[4].push(RegExp.$4);
        ret_array[5].push(RegExp.$5);
        ret_array[6].push(RegExp.$6);
        ret_array[7].push(RegExp.$7);
        break;
      case 8 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        ret_array[4].push(RegExp.$4);
        ret_array[5].push(RegExp.$5);
        ret_array[6].push(RegExp.$6);
        ret_array[7].push(RegExp.$7);
        ret_array[8].push(RegExp.$8);
        break;
      case 9 : ret_array[0].push(r);
        ret_array[1].push(RegExp.$1);
        ret_array[2].push(RegExp.$2);
        ret_array[3].push(RegExp.$3);
        ret_array[4].push(RegExp.$4);
        ret_array[5].push(RegExp.$5);
        ret_array[6].push(RegExp.$6);
        ret_array[7].push(RegExp.$7);
        ret_array[8].push(RegExp.$8);
        ret_array[9].push(RegExp.$9);
        break;
		default : alert("Error:cap_num overflow");
    }
 	}
	return ret_array;
}

/**
 *提取正则表达式匹配的信息
 *Author:wubanghua 2010-4-7
 ×@input_str :为要匹配的的字符串
 *@reg :为正则表达式
 ×@cat_num:为正则表达式内的括号数 范围(0~8)
 ×@return : 匹配正则表达式括号内的结果，为数组，数组为一维数组
 *         如果都没有匹配到数据那么返回的数组==0
 *description: 正则表达式应该是全局模式，否则有可能提取失败，当提取一块的时候
 */
function match_to_array(input_str,reg,cap_num)
{

	if(cap_num >8 && cap_num<0){
        debug("Error:cap_num must be 0~8 ");
        return 0;
	}

	if(input_str==null || reg==null){
        debug("input_str or reg is NULL");
        return 0;
	}
	
    var ret_array = new Array();
	while((r=reg.exec(input_str))!=null){
	  switch(cap_num){
		case 0 : ret_array.push([r]);
			break;
		case 1 : ret_array.push([RegExp.$1]);
			break;
		case 2 : ret_array.push([RegExp.$1,RegExp.$2]);
			break;
		case 3 : ret_array.push([RegExp.$1,RegExp.$2,RegExp.$3]);
			break;
		case 4 : ret_array.push([RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4]);
			break;
		case 5 : ret_array.push([RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5]);
			break;
		case 6 : ret_array.push([RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6]);
			break;
		case 7 : ret_array.push([RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6,RegExp.$7]);
			break;
		case 8 : ret_array.push([RegExp.$1,RegExp.$2,RegExp.$3,RegExp.$4,RegExp.$5,RegExp.$6,RegExp.$7,RegExp.$8]);
			break;
		default :
			debug("Error:cap_num overflow");	
	  }
	}
	
	return ret_array;
}
/*web key 获取值
 * wubanghua
 */

function get_webkey(key){
	var cmd  = 'show webkey '+ key+ '\r\n' ;
	var res = request('exec', cmd);
	var ret='';
	res = /value:\s*(.+),/ig.exec(res);

	if(res != null){
		ret = res[1];
	}else{
		ret = '';	
	}
	return ret;	
}


function singleIP(ip){
    if(!validateIP(ip)){
        return false ;
    }
    ip=ip.split(".");
    if(ip[3]==0 || ip[3]==255){
        return false ;
    }
    return true ;
}

function autoMask(obj,ip_id){
	//obj.focus();
	//obj.select();

    if((Trim(obj.value)!="") && (/\d+\.\d+\.\d+\.\d+/i.test(obj.value))){
        return ;
    }
	
	var ip = $(ip_id).val();

	if(Trim(ip)=="" || !validateIP(ip)){
        return ;
    }

	var zeroNum = 0;

	for (var i = 3; i >=0; i--) {

		if (parseInt(ip.split('.')[i]) == 0) {
			zeroNum++;
			continue;
		}

		break;
	}
	
	var mask='';

	switch (zeroNum) {
		case 0:
			mask = '255.255.255.0';
			break;
		case 1:
			mask = '255.255.255.0';
			break;
		case 2:
			mask = '255.255.0.0';
			break;
		case 3:
			mask = '255.0.0.0';
			break;
		case 4:
			mask = '0.0.0.0';
			break;
		default:
			mask='';
			break;
	}

	//$('#'+mkHTML+'').val(mask)
	
   /* var ip = $(ip_id).val();
	var origMask = $(obj).attr('data-origMask');
	var MASK = '255.255.255.0';
    origMask = origMask == '' || origMask ==undefined ? MASK:origMask;
    if(Trim(ip)=="" || !singleIP(ip)){
        return ;
    }*/
    obj.value = mask;
}

function wildcardMask(obj,ip_id){
	obj.focus();
	obj.select();

    if((Trim(obj.value)!="") && (/\d+\.\d+\.\d+\.\d+/i.test(obj.value))){
        return ;
    }
	
	var ip = $(ip_id).val();

	if(Trim(ip)=="" || !validateIP(ip)){
        return ;
    }

	var zeroNum = 0;

	for (var i = 3; i >=0; i--) {

		if (parseInt(ip.split('.')[i]) == 0) {
			zeroNum++;
			continue;
		}

		break;
	}
	
	var mask='';

	switch (zeroNum) {
		case 0:
			mask = '255.255.255.255';
			break;
		case 1:
			mask = '255.255.255.0';
			break;
		case 2:
			mask = '255.255.0.0';
			break;
		case 3:
			mask = '255.0.0.0';
			break;
		case 4:
			mask = '0.0.0.0';
			break;
		default:
			mask='';
			break;
	}

    obj.value = mask;
}

function autoGateway(obj,ip,mask){
	obj.focus();
	obj.select();
    if(Trim(obj.value)!=""){
        return ;
    }
   /* var temp = obj ;
    while(temp.tagName!="UL"){
        temp = temp.parentNode ;
    }
    var ip = Trim(temp.childNodes[0].childNodes[1].value) ;
    var mask = Trim(temp.childNodes[1].childNodes[1].value) ;*/
    ip = $('#'+ip).val();
    mask = $('#'+mask).val();
    if(Trim(ip)=="" || Trim(mask)=="" || !singleIP(Trim(ip)) || !validateMask_this(Trim(mask)) || !ip_mask_match(Trim(ip),Trim(mask))){
        return false ;
    }
    ip = ip_to_long(ip);
	var mask_arr = mask.split('.');
	var j = 0;
	for (var i = 0; i < mask_arr.length; i++) {
		if (mask_arr[i] == 255) {
			j++;
		}
	}
    mask = ip_to_long(mask);
	var str = long_to_ip((ip & mask));
	//str = str.substring(0, str.indexOf('0'));
	switch (j) {
	case 0:
		str = '';
		break;
	case 1:
		str = str.substring(0, str.lastIndexOf('.'));
		str = str.substring(0, str.lastIndexOf('.'));
		str = str.substring(0, str.lastIndexOf('.') + 1);
		break;
	case 2:
		str = str.substring(0, str.lastIndexOf('.'));
		str = str.substring(0, str.lastIndexOf('.') + 1);
		break;
	case 3:
		str = str.substring(0, str.lastIndexOf('.') + 1);
		break;
	default:
		str = '';
		break;
	}
    obj.value = str;//long_to_ip((ip & mask) + 1);

}
//记录日志
function doLog(logString){
	var cmd  = 'user-log ';
	cmd += logString+'\r\n';
	request('exec',cmd);
}
//反掩码转换正掩码，掩码转反掩码
function tranMask(str){
	if(str == '')
	return;
	
	var temp = str.split(".");
	var value = "";
	for(var i=0;i<temp.length;i++){
		temp[i] = 255-parseInt(temp[i]);
	}
	for(var i=0;i<temp.length-1;i++){
		value+=temp[i]+".";
	}
	value+=temp[temp.length-1];
	return value;
}
function autoWriteAddr(htmlobj,inputId){
	var val=htmlobj.value;
	var idx=val.lastIndexOf('.');
	var _end=val.substring(0,idx+1)

	if (/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/.test(val)){
		$('#'+inputId+'').val(_end);
		return true;
	}
	
	$('#'+inputId+'').val(val);
}
function changeIntfToAlias(intnm){
	var alias='';
	/*if (/dialer\s*1/i.test(intnm)
		|| (/Gi\s*0\/0/i.test(intnm))
		|| (/GigabitEthernet\s*0\/0/i.test(intnm))){
		alias='WAN0(GE0/0)';
	}else if (/dialer\s*2/i.test(intnm)
		|| (/Gi\s*0\/1/i.test(intnm))
		|| (/GigabitEthernet\s*0\/1/i.test(intnm))){
		alias='WAN1(GE0/1)';
	}else{
		alias=intnm;
	}*/
	alias=intnm.replace(/GigabitEthernet/i,'GE');
	return alias;
}
function getIntfsFromRouter(){
	var regexp  =/\d+#\d+#\d+#([^#]+)#[0-9.]+#[0-9.]+#[0-9a-f.]+#\w+#\d+#\w+#\w+#\d+#/i
	var runcmd = 'show router html int info\r\n';
	var rsp=request('exec',runcmd);
	var ret=null;
	var html='<option value = "">'+__LANGUAGE('pubSelectItemTxt','请选择')+'</option>';
	
	for (var i=0; i<rsp.length; i++){
		ret=regexp.exec(rsp[i]);
		if (ret != null){
			if ((/sic\-3g/i.test(ret[1])) 
				|| (/RSR1001G/i.test(ret[1]))
				|| (/virtual\-access/i.test(ret[1]))
				|| (/RSR$/i.test(ret[1]))
				|| (/VLAN\s+1$/i.test(ret[1]))
				|| (/virtual\-pppoe/i.test(ret[1]))){
				continue;
			}
		
			var result=request('exec','show running-config interface '+ret[1]+' | include pppoe-client dial\r\n');
			var dialer_id=/pppoe\-client\s+dial\-pool\-number\s+(\d+)\s+no\-ddr/i.exec(result.toString());
			
			if (dialer_id!=null&&dialer_id.length>0){
				continue;	
			}
			
			html+='<option  value="'+ret[1]+'">'+changeIntfToAlias(ret[1])+'</option>';
		}
	}
	
	return html;
}

function getAclListFromDevice(element_id){
	var viewcmd='show access-lists | include ip access-list\r\n';
	var viewexp=/ip\s+access\-list\s+([a-z]+)\s+([^ \?]+)/i;
	var viewace=null;
	var viewret=TABEVENT.RESPONSE(viewcmd, viewexp, false, false);
	var HTMLText='';
	var _options=$('#'+element_id+' option');
	//判断从CLI获取的ACL是否在Select-List中存在，若不存在则加入Select-List
	//用于在子窗口创建ACL的的动态检测
	if(viewret.length>=_options.length){
		for (var i=0; i<viewret.length; i++){
			var isExist=false;
			for (var k=0; k<_options.length; k++){
				if (viewret[i][1]==_options[k].value){
					isExist=true;
					break;	
				}	
			}
			
			if (!isExist){
				HTMLText+='<option name="'+viewret[i][0]+'" value="'+viewret[i][1]+'">'+viewret[i][1]+'</option>';
			}
		}
		
		$('#'+element_id+'').append(HTMLText);
	}
	
	//判断在Select-List中的ACL与实时获取的ACL进行对比，若不存在则从Select-List中删除
	//用于在子窗口删除ACL的的动态检测
	if (_options.length>=viewret.length){
		for (var k=0; k<_options.length; k++){
			var isExist=false;
			if (_options[k].value==''){
				isExist=true;
				continue;
			}

			for (var i=0; i<viewret.length; i++){
				if (viewret[i][1]==_options[k].value){
					isExist=true;
					break;	
				}	
			}

			if (!isExist){
				$(_options[k]).remove();
			}
		}
	}
}

function trans_number_to_str(num){

	if (typeof (num)=='undefined'){
		return '';	
	}

	var str=num.toString();
	var bw=''; 
	for(var i=str.length; i>0;){
		if (bw==''){
			bw=str.substring(i-3,i);
		}else{
			bw=str.substring(i-3,i)+','+bw;
		}
		
		i-=3;
	}
	
	return bw;
}

function reversemaskaddr(v){
	if(v == '')
	return;
	
	var temp = v.split(".");
	var value = "";
	for(var i=0;i<temp.length;i++){
		temp[i] = 255-parseInt(temp[i]);
	}
	for(var i=0;i<temp.length-1;i++){
		value+=temp[i]+".";
	}
	value+=temp[temp.length-1];
	return value;
}

function prefix_to_mask(prefix){
	var strSubnetMask = "";
	var maskvalue = parseInt(prefix);
	var bValue = 0xffffffff;
	if (maskvalue != 0) {
		bValue = bValue << (32 - maskvalue);
	}else{
		bValue = 0;
	}
	for (var i = 0; i < 4; i++) {
		var b = bValue & 0xff;
		strSubnetMask = "." + b + strSubnetMask;
		bValue = bValue >> 8;
	}
	strSubnetMask = strSubnetMask.substring(1, strSubnetMask.length);
	return strSubnetMask;
}
function get_mask_prefixlen(mask){
	var _mk=mask.split('.');
	var len=32;
	for (var i=_mk.length-1; i>=0; i--){
		if (_mk[i]=='0'){
			len-=8;
		} else{
			var k=0;
			var bite=parseInt(_mk[i]);
			while(k<9){
			var move_to_r=bite>>(++k);
			var move_to_l=move_to_r<<k;
				if(bite==move_to_l){
					len-=1;
					continue;
				}
				
				return len;
			} 
		}
	}
	
	return len;
}