// =========================== sa对象封装一系列工具方法 ===========================  
var sa = {
	version: '2.4.3',
	update_time: '2020-10-2',
	info: '新增双击layer标题处全屏'
};
// ===========================  当前环境配置  ======================================= 
(function(){
	// 公司开发环境
	var cfg_dev = {
		api_url: 'http://127.0.0.1:8099/pro',	// 所有ajax请求接口父地址
		web_url: 'http://www.baidu.com'		// 此项目前台地址 (此配置项非必须)
	}
	// 服务器测试环境
	var cfg_test = {
		api_url: 'https://pco.aseanbusiness.cn/pro',
		web_url: 'http://www.baidu.com'
	}
	// 正式生产环境
	var cfg_prod = {
		api_url: 'https://dxkaa1.bgigc.com/pro',
		web_url: 'http://www.baidu.com'
	}
	sa.cfg = cfg_test; // 最终环境 , 上线前请选择正确的环境
})();
// ===========================  ajax的封装  ======================================= 
(function(){
	
	sa.ajaxNoLoading = function(url, data, success200, cfg){
		
		// 如果是简写模式(省略了data参数)
		if(typeof data === 'function'){
			cfg = success200;
			success200 = data;
			data = {};
		}
		
		// 默认配置
		var defaultCfg = {
			baseUrl: (url.indexOf('http') === 0 ? '' : sa.cfg.api_url),// 父url,拼接在url前面
			sleep: 0,	// 休眠n毫秒处理回调函数 
			type: 'post',	// 默认请求类型 
			success200: success200,			// code=200, 代表成功 
			success500: function(res){		// code=500, 代表失败 
				return layer.alert('失败:' + res.msg);
			},
			success403: function(res){		// code=403, 代表权限不足
				return layer.alert("权限不足," + res.msg, {icon: 5});
			},
			success401: function(res){		// code=401, 代表未登录
				return layer.confirm("您当前暂未登录,是否立即登录?", {}, function(){
					layer.closeAll();
					return sa.$page.openLogin(cfg.login_url);
				});
			},
			errorfn: function(xhr, type, errorThrown){		// ajax发生异常时的默认处理函数
				if(xhr.status == 0){
					return layer.alert('无法连接到服务器,请检查网络');
				}
				return layer.alert("异常:" + JSON.stringify(xhr));
			},
			complete: function(xhr, ts) {	// 成功失败都会执行 
				
			}
		}
		
		// 将调用者的配置和默认配置合并 
		cfg = sa.extendJson(cfg, defaultCfg);
		
		// 开始显示loading图标 
		if(cfg.msg != null){
			sa.loading(cfg.msg);
		}
		
		// 开始请求ajax 
		return $.ajax({
			url: cfg.baseUrl + url,
			type: cfg.type, 
			data: data,
			dataType: 'json',
			// xhrFields: {
			// 	withCredentials: true // 携带跨域cookie
			// },
			// crossDomain: true,
			beforeSend: function(xhr) {
				xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
				// 追加token
				if(localStorage.tokenName) {
					xhr.setRequestHeader(localStorage.tokenName, localStorage.tokenValue);
				}
			},
			success: function(res){
				setTimeout(function() {
					sa.hideLoading();
					// 如果相应的处理函数存在
					if(cfg['success' + res.code] != undefined) {
						return cfg['success' + res.code](res);
					}
					layer.alert('未知状态码:' + JSON.stringify(res));
				}, cfg.sleep);
			},
			error: function(xhr, type, errorThrown){
				setTimeout(function() {
					sa.hideLoading();
					return cfg.errorfn(xhr, type, errorThrown);
				}, cfg.sleep);
			},
			complete: cfg.complete
		});
		
	};
	/** 对ajax的再封装, 这个ajax假设你的接口会返回以下格式的内容 
		{
			"code": 200,
			"msg": "ok",
			"data": []
		}
		如果返回的不是这个格式, 你可能需要改动一下源码, 要么改动服务端适应此ajax, 要么改动这个ajax适应你的服务端 
	 * @param {Object} url 请求地址
	 * @param {Object} data 请求参数
	 * @param {Object} success200 当返回的code码==200时的回调函数  
	 * @param {Object} 其它配置,可配置项有:
		{
			msg: '',		// 默认的提示文字 填null为不提示 
			type: 'get',	// 设定请求类型 默认post
			baseUrl: '',	// ajax请求拼接的父路径 默认取 sa.cfg.api_url 
			sleep: 0,		// ajax模拟的延时毫秒数, 默认0 
			success500: fn,	// code码等于500时的回调函数 (一般代表服务器错误)
			success403: fn,	// code码等于403时的回调函数 (一般代表无权限)
			success401: fn,	// code码等于401时的回调函数 (一般代表未登录)
			errorfn: fn,	// ajax发生错误时的回调函数 (一般是ajax请求本身发生了错误)
			complete: fn,	// ajax无论成功还是失败都会执行的回调函数  
		}
	 */
	sa.ajax = function(url, data, success200, cfg){
		
		// 如果是简写模式(省略了data参数)
		if(typeof data === 'function'){
			cfg = success200;
			success200 = data;
			data = {};
		}
		
		// 默认配置
		var defaultCfg = {
			msg: '努力加载中...',	// 提示语
			baseUrl: (url.indexOf('http') === 0 ? '' : sa.cfg.api_url),// 父url,拼接在url前面
			sleep: 0,	// 休眠n毫秒处理回调函数 
			type: 'post',	// 默认请求类型 
			success200: success200,			// code=200, 代表成功 
			success500: function(res){		// code=500, 代表失败 
				return layer.alert('失败:' + res.msg);
			},
			success403: function(res){		// code=403, 代表权限不足
				return layer.alert("权限不足," + res.msg, {icon: 5});
			},
			success401: function(res){		// code=401, 代表未登录
				return layer.confirm("您当前暂未登录,是否立即登录?", {}, function(){
					layer.closeAll();
					return sa.$page.openLogin(cfg.login_url);
				});
			},
			errorfn: function(xhr, type, errorThrown){		// ajax发生异常时的默认处理函数
				if(xhr.status == 0){
					return layer.alert('无法连接到服务器,请检查网络');
				}
				return layer.alert("异常:" + JSON.stringify(xhr));
			},
			complete: function(xhr, ts) {	// 成功失败都会执行 
				
			}
		}
		
		// 将调用者的配置和默认配置合并 
		cfg = sa.extendJson(cfg, defaultCfg);
		
		// 开始显示loading图标 
		if(cfg.msg != null){
			sa.loading(cfg.msg);
		}
		
		// 开始请求ajax 
		return $.ajax({
			url: cfg.baseUrl + url,
			type: cfg.type, 
			data: data,
			dataType: 'json',
			// xhrFields: {
			// 	withCredentials: true // 携带跨域cookie
			// },
			// crossDomain: true,
			beforeSend: function(xhr) {
				xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');
				// 追加token
				if(localStorage.tokenName) {
					xhr.setRequestHeader(localStorage.tokenName, localStorage.tokenValue);
				}
			},
			success: function(res){
				setTimeout(function() {
					sa.hideLoading();
					// 如果相应的处理函数存在
					if(cfg['success' + res.code] != undefined) {
						return cfg['success' + res.code](res);
					}
					layer.alert('未知状态码:' + JSON.stringify(res));
				}, cfg.sleep);
			},
			error: function(xhr, type, errorThrown){
				setTimeout(function() {
					sa.hideLoading();
					return cfg.errorfn(xhr, type, errorThrown);
				}, cfg.sleep);
			},
			complete: cfg.complete
		});
		
	};
	
	// 模拟一个ajax 
	// 请注意: 本模板中所有ajax请求调用的均为此模拟函数 
	sa.ajax2 = function(url, data, success200, cfg){
		// 如果是简写模式(省略了data参数)
		if(typeof data === 'function'){
			cfg = success200;
			success200 = data;
			data = {};
		}
		// 几个默认配置 
		cfg = cfg || {};
		cfg.baseUrl = (url.indexOf('http') === 0 ? '' : sa.cfg.api_url);	// 父url,拼接在url前面
		// 设定一个默认的提示文字 
		if(cfg.msg == undefined || cfg.msg == null || cfg.msg == '') {
			cfg.msg = '正在努力加载...';
		}
		// 默认延时函数 
		if(cfg.sleep == undefined || cfg.sleep == null || cfg.sleep == '' || cfg.sleep == 0) {
			cfg.sleep = 600;
		}
		// 默认的模拟数据
		cfg.res = cfg.res || {
			code: 200,
			msg: 'ok',
			data: []
		}
		// 开始loding 
		sa.loading(cfg.msg);
		
		// 模拟ajax的延时 
		setTimeout(function() {
			sa.hideLoading();	// 隐藏掉转圈圈 
			success200(cfg.res);
		}, cfg.sleep)
	};
	
})();
// ===========================  封装弹窗相关函数   ======================================= 
(function() {
	
	var me = sa;
	if(window.layer) {
		layer.ready(function(){});
	}
	
	
	
	// tips提示文字  
	me.msg = function(msg, cfg) {
		msg = msg || '操作成功';
		layer.msg(msg, cfg);
	};
	
	// 操作成功的提示  
	me.ok = function(msg) {
		msg = msg || '操作成功';
		layer.msg(msg, {anim: 0, icon: 1 }); 
	}
	me.ok2 = function(msg) {
		msg = msg || '操作成功';
		layer.msg(msg, {anim: 0, icon: 6 }); 
	}
	
	// 操作失败的提示  
	me.error = function(msg) {
		msg = msg || '操作失败';
		layer.msg(msg, {anim: 6, icon: 2 }); 
	}
	me.error2 = function(msg) {
		msg = msg || '操作失败';
		layer.msg(msg, {anim: 6, icon: 5 }); 
	}
	
	// alert弹窗 [text=提示文字, okFn=点击确定之后的回调函数]
	me.alert = function(text, okFn) {
		// 开始弹窗 
		layer.alert(text, function(index) {
			layer.close(index);
			if(okFn) {
				okFn();
			}
		});
	};
	// 询问框 [text=提示文字, okFn=点击确定之后的回调函数]
	me.confirm = function(text, okFn) {
		layer.confirm(text, {}, function(index) {
			layer.close(index);
			if(okFn) {
				okFn();
			}
		}.bind(this));
	};
	
	// 输入框 [title=提示文字, okFn=点击确定后的回调函数, formType=输入框类型(0=文本,1=密码,2=多行文本域) 可省略, value=默认值 可省略 ]  
	me.prompt = function(title, okFn, formType, value) {
		layer.prompt({
			title: title,
			formType: formType, 
			value: value
		}, function(pass, index){
			layer.close(index);
			if(okFn) {
				okFn(pass);
			}
		});
	}
	
	// 打开loading
	me.loading = function(msg) {
		layer.closeAll();	// 开始前先把所有弹窗关了
		return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load' });
	};
	
	// 隐藏loading
	me.hideLoading = function() {
		layer.closeAll();
	};
	
	// ============== 一些常用弹窗 ===================== 
	
	// 大窗显示一个图片 
	// 参数: src=地址、w=宽度(默认80%)、h=高度(默认80%)
	me.showImage = function(src, w, h) {
		w = w || '80%';
		h = h || '80%';
		var content = '
' + 
			'

' + 
		 '