Ext.ns('Ext.ux');

Ext.ux.alert = function(msg, fn, scope) {
	Ext.Msg.alert(SR.系统信息, msg, fn, scope);
};

Ext.ux.progress = function(msg) {
	Ext.Msg.progress(SR.系统信息, msg);
};

Ext.ux.alertWithCheck = function(r) {
	if (r.msg == 'RELOGIN') {
		if (r.obj.err)
			alert(r.obj.err);
		document.location = 'login.htm';
	} else if (r.responseText)
		Ext.ux.alert(r.responseText);
	else if (r.msg) // 有时success返回false，但并不想弹出信息框，例如计划任务没有权限查看时
		Ext.ux.alert(r.msg.replacen());
};

/**
 * 如果返回object.success == true，表示需要调用回调函数
 */
Ext.ux.alertResp = function(success, response, isMenu) {
	var r = {
		success : false
	};
	if (!success) {
		if (response.responseText)
			Ext.ux.alert(response.responseText.replacen());
		else {
			/*
			 * var s = ''; for(var i in response) s += i + ':' + response[i] +
			 * ','; alert(s);
			 */
			Ext.ux.alert(response.statusText);
		}
	} else {
		try {
			if (isMenu)
				var a = Ext.decode(response.responseText.replace(
						/"onMenuClick"/g, 'onMenuClick'));
			else
				var a = Ext.decode(response.responseText);
			if (Ext.isArray(a))
				return a; // TreeLoader返回数组
		} catch (e) {
			Ext.ux.alert(response.responseText.replacen());
			return r;
		}
		Ext.apply(r, a); // 服务器返回属性中也包含success
		if (!r.success)
			Ext.ux.alertWithCheck(r);
	}
	return r;
};

Ext.ux.confirm = function(msg, fn, scope) {
	Ext.Msg.confirm(SR.系统信息, msg, fn, scope);
};

Ext.ux.prompt = function(msg, fn, scope) {
	Ext.Msg.prompt(SR.系统信息, msg, fn, scope);
};

Mydb = {
	/**
	 * 传入：<br/> action: 请求类型字符串，必须提供<br/> params: 请求数据，可省略<br/> fn:
	 * 如果提供，不论成功与否，操作完成后都自动调用该函数，传入的参数：result：{success:bool, ...}<br />
	 * scope: 调用fn的上下文，默认为window<br />
	 * 
	 * 说明：如果失败，在此处会弹出消息框，不用另行弹出
	 */
	doAjax : function(config) { // setobj, action, req
		var req = config.params;
		if (!req)
			req = {};
		Ext.apply(req, {
					action : config.action
				});

		Ext.Ajax.request({
					params : req,
					callback : function(options, success, response) {
						var r = Ext.ux.alertResp(success, response,
								config.action == 'get_my_menu');
						if (r.success && config.fn)
							config.fn.call(config.scope || window, r); // 如果定义了set函数，则调用它
					}
				});
	}
};

roundn = function(a, n) {
	for (var i = 0, v = 1; i < n; i++)
		v *= 10;
	return Math.round(a * v) / v;
};

round2 = function(a) {
	return Math.round(a * 100) / 100;
};

isEmpty2 = function(o) {
	for (var i in o)
		return false;
	return true;
};

getTableAttrs = function(addStyle) {
	return {
		cellspacing : 3,
		style : Ext.apply({
					'font-size' : '12px',
					width : '100%',
					padding : '5px'
				}, addStyle)
	};
};

closeWindow = function() {
	this.getWindow().close();
};

getCheckState = function(event) {
	var scr = event.getTarget();
	if (scr.tagName != 'INPUT')
		return null;
	return scr.checked; // 复选框状态
};

// **************** 以下为原有类新增的函数
/**
 * 计算相差天数
 */
Date.prototype.daysAfter = function(d) {
	return (this - d) / 1000 / 3600 / 24;
};

Date.prototype.addDays = function(n) {
	return this.add(Date.DAY, n);
};

String.prototype.endsWith = function(s) {
	return this.substr(this.length - s.length) == s;
};
String.prototype.getIf = function(s) {
	return Ext.isEmpty(s, true) ? this : s;
};
String.prototype.replacen = function(s) {
	return this == '' ? '' : this.replace(/\n/g, '<br/>');
};
String.prototype.mysplit = function(sep) {
	var ss = this.split(sep);
	for (var i = ss.length - 2; i > 0; i--) {
		if (ss[i] == '') {
			ss[i - 1] += sep + ss[i + 1];
			ss.splice(i, 2);
		}
	}
	return ss;
};
Boolean.prototype.toS = function() {
	return this == true ? '√' : '';
};

Ext.apply(Ext.grid.ColumnModel.prototype, {
			get : function(f) {
				var i = this.findColumnIndex(f);
				if (i < 0)
					alert('找不到字段' + f);
				else
					return this.config[i];
			},
			/**
			 * 如果列f找不到，则不隐藏
			 */
			setHidden2 : function(f, b) {
				var i = this.findColumnIndex(f);
				if (i >= 0)
					this.setHidden(i, b);
			},

			getFirstEditableCol : function() {
				for (var i in this.config)
					if (this.isCellEditable(i, 0))
						return parseInt(i); // 不parse的话返回字符串，那会引起行为异常
			},

			getLastEditableCol : function() {
				for (var i = this.config.length - 1; i >= 0; i--)
					if (this.isCellEditable(i, 0))
						return parseInt(i); // 不parse的话返回字符串，那会引起行为异常
			},
			getFirstVisibleCol : function() {
				for (var i in this.config)
					if (!this.config[i].hidden)
						return parseInt(i); // 不parse的话返回字符串，那会引起行为异常
			},
			getLastVisibleCol : function() {
				for (var i = this.config.length - 1; i >= 0; i--)
					if (!this.config[i].hidden)
						return parseInt(i); // 不parse的话返回字符串，那会引起行为异常
			}
		});

Ext.apply(Ext.grid.GridPanel.prototype, {
			getSel : function(silent) {
				var r = this.getSelectionModel();
				if (!r.getSelected)
					return null; // 例如Cell模式

				r = r.getSelected();
				if (!r && !silent)
					Ext.ux.alert(SR.请选择记录);
				return r;
			},

			getSelIds : function(silent, fld) {
				var r = this.getSelectionModel().getSelections();
				if (r.length == 0 && !silent) {
					Ext.ux.alert(SR.请选择记录);
					return [];
				}

				fld = fld || 'id';
				if (r.length == 1)
					return [r[0].data[fld]];

				var s = [];
				Ext.each(r, function(r) {
							s.push(r.data[fld]);
						});
				return s;
			}
		});

Ext.Component.prototype.getWindow = function() {
	return this.findParentBy(function(c) {
				return c.baseCls == 'x-window';
			});
};

Ext.override(Array, {
			getComponent : function(itemId) {
				for (var i in this)
					if (this[i].itemId == itemId)
						return this[i];
			}
		});

