//封装好一系列常用的方法 dever
import config from './config';

//http网络请求
var http = {
	//token的key
	token : 'signature',
	//获取token
	getToken: function() {
		return uni.getStorageSync('prev1_' + this.token);
	},
	
	//设置token
	setToken: function(value) {
		return uni.setStorageSync('prev1_' + this.token, value);
	},
	
	//设置http的option
	option: function(options) {
		if (!options) {
			options = {};
		}
		options[this.token] = this.getToken();
		options['json'] = 1;
		return options;
	},
	
	//request请求
	request: function(vue, url, options, callback, err_callback, type) {
		var self = this;
		if (vue == 'post') {
			config.request.method = 'POST';
			//config.request.method = 'GET';
			vue = false;
		} else {
			config.request.method = 'GET';
		}
		var method = config.request.method;
		if (typeof(url) == 'object') {
			vue = url[1];
			url = url[0];
		}
		if (typeof(vue) == 'object') {
			vue.isDisabled = true;
		}
		
		self.core(url, options, type, method).then((result, state) => {
			if (typeof(vue) == 'object') {
				if (!vue.fetch) {
					vue.fetch = {}
				}
				vue.isDisabled = false;
				vue.fetch = Object.assign({}, vue.fetch, result)
			}
			
			if (callback) {
				callback(result, state);
			}
		}).catch((result) => {
			if (typeof(vue) == 'object') {
				vue.isDisabled = false;
			}
			if (err_callback) {
				err_callback(result);
			} else {
				if (result.code == '2') {
					dever.location(dever.login);
				} else {
					dever.alert(result.msg)
				}
			}
		})
	},
	
	core : function(url, options, type, method) {
		var self = this;
		options = this.option(options);
		if (!options.noconcat) {
			options.noconcat = false;
		}
		if (config.server[url]) {
			config.request.url = config.server[url];
		} else {
			config.request.url = url;
		}
		var loading_method = config.request.method;
		if (options && options.page && options.page > 0) {
			options.pg = options.page;
			loading_method = 'page';
		}
		if (config.request.url.indexOf('http') == -1) {
			if (type == 'im') {
				config.request.url = config.im.api + config.request.url;
			} else {
				config.request.url = config.request.host + config.request.url;
			}
		}
		config.request.data = options;
		return new Promise((resolve, reject) => {
			config.request.complete = (response) => {
				dever.debug(response);
				if (response.statusCode === 200) {
					if (response.data.code == '0') {
						if (response.data.page) {
							dever.pageData = response.data.page;
						} else {
							dever.pageData = {};
						}
						if (options.page && options.page > 0 && !options.noconcat) {
							page.state = true;
							if (page.key && response.data.data[page.key].length > 0) {
								if (options && options.concat && options.concat == -1) {
									page.data = response.data.data[page.key].concat(page.data);
								} else {
									page.data = page.data.concat(response.data.data[page.key]);
								}
								response.data.data[page.key] = page.data;
							} else if (response.data.data.length > 0) {
								if (options && options.concat && options.concat == -1) {
									response.data.data = response.data.data.reverse();
									page.data = response.data.data.concat(page.data);
								} else {
									page.data = page.data.concat(response.data.data);
								}
								response.data.data = page.data;
							} else {
								page.state = false;
								if (page.key) {
									if (options && options.concat && options.concat == -1) {
										response.data.data[page.key] = page.data;
										resolve(response.data.data, false);
									} else {
										resolve(response.data.data[page.key], false);
									}
								} else {
									if (options && options.concat && options.concat == -1) {
										response.data.data = page.data;
									}
									resolve(response.data.data, false);
								}
							   if (options && options.noloading) {
							   	
							   } else {
									dever.hideLoading(loading_method, options, url);
							   }
								return;
							}
						}
						
						resolve(response.data.data);
					} else if (response.data.code == '-1') {
						//退出登录
						self.setToken('');
						dever.location('index/index', 'go');
						reject(response.data)
					} else if (response.data.code == '-2') {
						//跳转到登录页面
						dever.checkLogin();
						/*
						self.setToken('');
						dever.location('index/index', 'go');
						reject(response.data)
						*/
					} else {
						reject(response.data)
					}
					if (options && options.noloading) {
						
					} else {
						dever.hideLoading(loading_method, options, url);
					}
				} else {
					// 处理catch 请求，不在本页面之外处理，统一在这里处理
					if (options && options.handle) {
						reject(response)
					} else {
						try {
							Promise.reject(response).catch(err => {
								self.error(response.statusCode || response.errMsg);
							});
						} catch (e) {
							dever.alert(e)
						}
					}
					if (options && options.noloading) {
						
					} else {
						dever.hideLoading(loading_method, options, url);
					}
				}
			}
			//uni.request(Object.assign({}, config, options));
			dever.debug(config.request);
			if (options.noloading) {
				uni.stopPullDownRefresh();
			} else {
				dever.loading(loading_method, options, url);
			}
			
			uni.request(config.request);
		})
	},
	
	error : function(err) {
		//console.error("请求背拒绝" + err)
		/*
		dever.data('web_error', err);
		var path = '/components/dever/pages/web_error';

		uni.navigateTo({
			url: path
		})
		return;
		*/

		switch (err) {
			case 401:
				// 错误码404的处理方式
				console.error("请求拒绝" + err)
				break;
			case 404:
				// 错误码404的处理方式
				console.error("没有找到页面"  + err)
				break;
			case 500:
				// 错误码404的处理方式
				console.error("500服务器错误"  + err)
				break;
			case 405:
				console.error("错误的请求"  + err)
				break;
		}
	},
}

var im = {
	socket : {},
	status : false,
	//host
	url : 'ws://me.5dev.cn:8282',
	//推送路径
	push_path : '',
	init : function(key, url, callback, connect) {
		if (url) {
			this.url = url;
		} else {
			this.url = config.im.host;
		}
		this.connect(key, callback, connect);
	},
	
	connect : function(key, callback, connect) {
		var self = this;
		this.close(key);
		this.socket[key] = uni.connectSocket({
			url: this.url,
			complete: (res)=> {
				
			}
		});
		this.socket[key].onOpen(function (res) {
		  if (connect) {
		  	connect(true, res);
		  }
		  console.info('open');
		  self.status = true;
		  
		  self.socket[key].onMessage(function (res) {
		  	if (res.data.indexOf('{') != -1) {
		  		var data = eval("("+res.data+")");
		  	} else {
		  		var data = res.data;
		  	}
		  	
		  	if (callback) {
		  		callback(data);
		  	}
		  });
		});
		this.socket[key].onClose(function (res) {
		  if (connect) {
		  	connect(false, res);
		  }
		  console.info('close');
		  self.status = false;
		});
		
		this.socket[key].onError(function (res) {
			console.info('error');
			self.connect(callback, connect);
		});
	},
	
	close : function(key) {
		var self = this;
		if (this.socket[key]) {
			this.socket[key].close({
				success(res) {
					self.status = false;
				},
				fail(err) {
					self.status = true;
				}
			})
		}
	},
	
	get : function(vue, url, options, callback, err_callback) {
		this.request(vue, url, options, callback, err_callback); 
	},
	
	post : function(url, options, callback, err_callback) {
		this.request('post', url, options, callback, err_callback); 
	},
	
	request : function(vue, url, options, callback, err_callback) {
		if (!options) {
			options = {};
		}
		var param = options;
		param.noloading = 1;
		dever.post(this.push_path, param, function(t) {
			url += '?timestamp=' + t.timestamp + '&pop_token=' + t.token + '&login_uid=' + t.login_uid;
			dever.config.im = t;
			options.login_uid = t.login_uid;
			if (t.friend_uid) {
				options.friend_uid = t.friend_uid;
			}
			delete options.noloading;
			http.request(vue, url, options, callback, err_callback, 'im');
		});
	}
}

var page = {
	//分页控制
	value : 1,
	//分页数据
	data : [],
	//分页所属的key
	key : '',
	//分页状态 true可以分页，false不能分页
	state : true,
	
	//通用的获取数据方法：瀑布流分页 (1,'level')
	get : function(config, vue, url, options, callback, err_callback) {
		options = http.option(options);
		if (typeof(config) == 'object') {
			var state = config[0];
			this.key = config[1];
		} else {
			var state = config;
			this.key = '';
		}
		if (state == 1) {
			this.value = 1;
			this.data = [];
		} else {
			this.value++;
		}
		
		if (this.state == false && state != 1) {
			return;
		}
		
		options.page = this.value;
		http.request(vue, url, options, callback, err_callback);
	},
}

var upload = {
	data : {},
	formatDate : function(date) {
		var date = new Date(date);
		var YY = date.getFullYear() + '-';
		var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
		var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
		var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
		var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
		var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
		return YY + MM + DD +" "+hh + mm + ss;
	},
	handle : function(key, count, callback) {
		var self = this;
		count = parseInt(count);
		uni.chooseImage({
			count: count,
			sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有
			sourceType: ['album'], //从相册选择
			success: res => {
				uni.showLoading();
				res.tempFilePaths.forEach(function(item, index) {
					//请求上传接口
					self.uploadFile(item, key, count, callback);
				});
			},
			fail: () => {
				uni.showToast({ title: '图片上传失败，请重试', icon: 'none' });
				uni.hideLoading();
			}
		});
	},
	
	uploadFile : function(item, key, count, callback) {
		var self = this;
		if (!count) {
			count = 1;
		}
		var type = 1;
		if (count > 1) {
			type = 2;
		}
		uni.uploadFile({
			url: config.upload.url,
			filePath: item,
			name: config.upload.name,
			formData: { token: http.getToken() },
			success: res => {
				dever.debug(res);
				var data = JSON.parse(res.data);
				uni.hideLoading();
				if (data.uploaded) {
					var backUrl = data.url;
					if (count > 1) {
						if (!self.data[key]) {
							self.data[key] = [];
						}
						if (self.data[key].length < count) {
							self.data[key].push(backUrl);
						}
					} else {
						self.data[key] = backUrl;
					}
					if (callback) {
						callback(type, self.data[key]);
					}
				} else if (data.uploaded == false) {
					uni.showToast({ title: data.error.message, icon: 'none' });
				}
			}
		});
	},
	
	upfile : function(e, key, count, callback, ext, title, style) {
		if (!count) {
			count = 1;
		}
		var type = 1;
		if (count > 1) {
			type = 2;
		}
		if (!title) {
			title = '点击这里上传文件';
		}
		var self = this;
		count = parseInt(count);
		var a = document.createElement('button');
		a.className = 'file';
		if (style) {
			a.style.cssText = style;
		} else {
			a.style.cssText = 'padding: 4px 10px;height: 20px;line-height: 20px;position: relative;cursor: pointer;color: #888;background: #fafafa;border: 1px solid #ddd;border-radius: 4px;overflow: hidden;display: inline-block;*display: inline;*zoom: 1;';
		}
		var style = 'position: absolute;opacity: 0;filter: alpha(opacity=0);cursor: pointer';
		a.innerHTML = '<input style="'+style+'" type="file" name="upload_file" id="upload_file" />' + title;
		e.$refs.input.$el.appendChild(a)
		var input = document.getElementById('upload_file');
		
		input.onchange = (event) => {
			uni.showLoading();
			var reader = new FileReader();
			var type = input.files[0].type;
			var temp = type.split('/');
			type = temp[1];
			//console.info(input.files[0]);
			if (ext && ext.indexOf(type) == -1) {
				uni.showToast({ title: '您上传的文件类型错误,请上传带有' + ext + '这些后缀的文件', icon: 'none' });
			} else {
				reader.readAsDataURL(input.files[0]);
				reader.onload = function(){
					//读取完成后，数据保存在对象的result属性中
					var pic = this.result;
					var temp = pic.split('base64,');
					pic = temp[1];
					dever.debug(pic);
					var url = "http://up.qiniu.com/putb64/-1";
					var xhr = new XMLHttpRequest();
					xhr.onreadystatechange=function(){
						if (xhr.readyState==4){
							dever.debug(xhr.responseText);
							var data = JSON.parse(xhr.responseText);
							uni.hideLoading();
							if (data.uploaded) {
								var backUrl = data.url;
								if (count > 1) {
									if (!self.data[key]) {
										self.data[key] = [];
									}
									self.data[key].push(backUrl);
								} else {
									self.data[key] = backUrl;
								}
								if (callback) {
									callback(type, self.data[key], input.files[0]);
								}
							} else if (data.uploaded == false) {
								uni.showToast({ title: data.error.message, icon: 'none' });
							}
						}
					}
					xhr.open("POST", url, true); 
					xhr.setRequestHeader("Content-Type", "application/octet-stream");
					xhr.setRequestHeader("Authorization", "UpToken " + e.token);
					xhr.send(pic);
				}
			}
			
		}
	},
	
	qnUpload : function(qn, config, key, count, callback) {
		if (!count) {
			count = 1;
		}
		var type = 1;
		if (count > 1) {
			type = 2;
		}
		var self = this;
		count = parseInt(count);
		var call = function(data) {
			var backUrl = data.url;
			if (count > 1) {
				if (!self.data[key]) {
					self.data[key] = [];
				}
				self.data[key].push(backUrl);
			} else {
				self.data[key] = backUrl;
			}
			if (callback) {
				callback(type, self.data[key]);
			}
		}
		uni.chooseImage({
			count: count,
			//sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图，默认二者都有
			sizeType: ['compressed'], //可以指定是原图还是压缩图，默认二者都有
			sourceType: ['album'], //从相册选择
			success: res => {
				uni.showLoading();
				res.tempFilePaths.forEach(function(item, index) {
					self.qiniu(qn, item, config.domain, config.token, call);
				});
			},
			fail: () => {
				uni.showToast({ title: '图片上传失败，请重试', icon: 'none' });
				uni.hideLoading();
			}
		});
	},
	
	qiniu : function(qn, file, domain, token, call, handle) {
		//请求上传接口
		var config = {};
		config = {
			region: 'ECN',
			domain: domain,
			//key: 'test.mp4',
		};
		if (token.indexOf('http') == -1) {
			config.uptoken = token;
		} else {
			config.uptokenURL = token;
		}
		uni.showLoading({title: '上传中', mask: true});
		qn.upload(
			file,
			res => {
				dever.debug(res);
				var data = res;
				uni.hideLoading();
				if (data.uploaded) {
					call(data);
				} else {
					uni.showToast({title: data.error.message, icon: 'none' });
				}
			},
			error => {
				uni.showToast({title: '上传失败，请重试', icon: 'none' });
				uni.hideLoading();
			},
			config,
			res => {
				//上传进度
				if (handle) {
					handle(res.progress);
				} else {
					uni.showToast({title: '上传进度：%' + res.progress, icon: 'none' });
				}
			}
		);
	},
	
	uploadDel : function(key, index, callback) {
		var self = this;
		uni.showModal({
			content: '确定要删除吗？',
			cancelText: '取消',
			confirmText: '确定',
			success: res => {
				if (res.confirm) {
					// self.data[key].splice(index, 1);
					if (callback) {
						callback(res, index);
					}
				}
			}
		});
	}
}

var share = 
{
    wechat : false,
    url : '',
    project : '',
    token : '',
    param : {
        title : '',
        pic : '',
        content : '',
        link : '',
    },
	wx : {},
    init : function(wx, project, host, param)
    {
        var self = this;
		self.wx = wx;
        self.wechat = dever.is_weixin();
        self.project = project;
		self.url = host;
		if (!host) {
			self.url = config.share.host;
		}
        
        self.token = http.getToken();
        self.param = param;
		self.param.timelineCallback = function() {};
		self.param.sendMessageCallback = function() {};
		self.param.shareQQCallback = function() {};
		if (!self.param.source_link) {
			self.param.source_link = location.href;
		}

        if (self.wechat) {
            self.wechatInit();
        }
        self.reflux();
    }

    ,wechatInit: function()
    {
        var self = this;
        var url = this.url + 'init?callback=?';
        var param = this.param;
        var project = this.project;
		var options = {};
		options.project = project;
		options.url = location.href.split('#')[0];
		options.noloading = 1;
		options.token = this.token;
		http.request('post', url, options, function(data) {
			self.wx.config({ 
			    //debug:true,
			    appId: data.appId,
			    timestamp: data.timestamp,
			    nonceStr: data.nonceStr,
			    signature: data.signature,
			    jsApiList: [
			        'onMenuShareTimeline',
			        'onMenuShareAppMessage',
			        'onMenuShareQQ'
			    ]
			});
			
			self.wx.ready(function() {
			    self.wx.onMenuShareAppMessage({
			        title: param.title,
			        desc: param.content,
			        link: param.source_link,
			        imgUrl: param.pic,
			        success: function(res) {
			            self.shareLog(1, 1);
			        },
			        cancel: function(res) {
			            self.shareLog(1, 2);
			        },
			        fail: function(res) {
			            self.shareLog(1, 3);
			        }
			    });
			    self.wx.onMenuShareTimeline({
			        title: param.title,
			        link: param.source_link,
			        imgUrl: param.img,
			        success: function(res) {
			            self.shareLog(2, 1);
			        },
			        cancel: function(res) {
			            self.shareLog(2, 2);
			        },
			        fail: function(res) {
			            self.shareLog(2, 3);
			        }
			    });
			    self.wx.onMenuShareQQ({
			        title: param.title,
			        link: param.source_link,
			        imgUrl: param.img,
			        success: function(res) {
			            self.shareLog(3, 1);
			        },
			        cancel: function(res) {
			            self.shareLog(3, 2);
			        },
			        fail: function(res) {
			            self.shareLog(3, 3);
			        }
			    });
			});
		});
    }

    ,reflux: function() {
        var refer = document.referrer,
            url = encodeURIComponent(document.location.href),
            param = location.search.substr(1),
            ua = encodeURIComponent(navigator.userAgent),
            project = this.project,
            token = this.token,
            wechat = this.wechat;

        if (param.indexOf("tsina-") > -1 || param.indexOf("timeline") > -1 || param.indexOf("singlemessage") > -1 || param.indexOf("groupmessage") > -1) {
            var url = this.url + 'reflux&callback=?' + '&project='+project+'&url=' + url + '&ua=' + ua + '&param=' + encodeURIComponent(param) + '&token=' + token + '&type=' + wechat;
			http.request('post', url, {noloading:1});
        }
    }

    ,shareLog: function(actType, actResult) {
        var project = this.project;
        var token = this.token;
        var wechat = this.wechat;
        var ua = encodeURIComponent(navigator.userAgent);
        var url = encodeURIComponent(document.location.href);
		var url = this.url + 'collect&callback=?' + '&project='+project+'&url=' + url + '&actType=' + actType + '&actResult=' + actResult + '&ua=' + ua + '&token=' + token + '&type=' + wechat
		http.request('post', url, {noloading:1});
    }
}

var bgm = {
	show : false,
	playing : false,
	manager : false,
	control : false,
	dever : false,
	vue : false,
	
	init : function(vue, music, title, signer, pic, autoplay) {
		if (this.manager) {
			return;
		}
		this.vue = vue;
		this.vue.bgm = {
			show : false,
			playing : false,
		};
		if (music) {
			this.show = true;
			this.vue.bgm.show = true;
			if (this.dever.source == 'h5') {
				this.manager = uni.createInnerAudioContext()
				this.manager.src = music;
				this.manager.obeyMuteSwitch = false;
				this.manager.loop = true;
			} else {
				this.manager = uni.getBackgroundAudioManager()
				this.manager.title = title;
				this.manager.singer = signer;
				this.manager.coverImgUrl = pic;
				this.manager.src = music;
				this.manager.loop = true;
			}
			
			if (autoplay == 1) {
				if (this.dever.source == 'h5') {
					this.manager.autoplay = true;
					this.start();
				} else {
					this.start();
				}
			} else {
				this.stop();
			}
		} else {
			this.show = false;
			this.vue.bgm.show = false;
		}
	},
	
	control : function() {
		if (this.playing) {
			this.stop();
		} else {
			this.start();
		}
	},
	
	start : function() {
		if (this.manager) {
			if (this.vue.control) {
				var i = 0;
				for (i in this.vue.control) {
					if (this.vue.control[i].load) {
						this.vue.control[i].stop();
					}
				}
			}
			this.manager.play();
			this.playing = true;
			this.vue.bgm.playing = true;
		}
	},
	
	stop : function() {
		if (this.manager) {
			this.manager.pause();
			this.playing = false;
			this.vue.bgm.playing = false;
		}
	}
};

var dever = {
	login : 'user/login',
	web_view : '/lib/dever/pages/web_view',
	source : 'h5',
	source_id : 1,
	host : '',
	api_host : '',
	doc : false,
	config : {},
	vue : false,
	cur : false,
	getLoadingState : {},
	getLoadingCall : false,
	postLoadingCall : false,
	pageLoadingCall : false,
	pageData : {},
	lastGetUrl : '',
	showLoad : false,
	btnText : '确定提交',
	switchTab : [],
	switchTabCall : {},
	slideValue : {},
	
	//获取当前时间戳
	curTime : function() {
		var time = Date.parse(new Date())/1000;
		return time;
	},
	//载入全局配置
	init : function(url, vue, value, set) {
		this.vue = vue;
		vue.prototype.$config = value;
		var self = this;
		this.api_host = config.request.host;
		var dever_config = self.data('dever_config');
		var state = false;
		if (dever_config && !set) {
			self.config = dever_config;
			vue.prototype.$config = self.config;
			if (self.config.update_time) {
				var time = this.curTime();
				if (!self.config.update_time || time - self.config.update_time >= value.set_update) {
					state = true;
				}
			} else {
				state = false;
			}
			
		} else {
			state = true;
		}

		if (state) {
			this.setConfig(url, value);
		}
		
		return this;
	},
	//设置全局变量
	setConfig : function(url, config, key, value) {
		var self = this;
		if (!config && key && value) {
			config = self.data('dever_config');
			config[key] = value;
		}
		self.config = config;
		self.vue.prototype.$config = self.config;
		self.data('dever_config', self.config);
		if (url) {
			self.post(url, {noloading:1}, function(t) {
				self.config = t;
				self.config.update_time = self.curTime();
				self.data('dever_config', self.config);
				self.vue.prototype.$config = self.config;
			});
		}
	},
	//加载通用的方法
	common : function(func) {
		this.source = 'h5';
		this.source_id = 1;
		this.host = '';
		//#ifdef H5
		this.source = 'h5';
		this.source_id = 1;
		this.host = window.location.protocol + '//' + window.location.host + '/web/#';
		//#endif
		//#ifdef APP-PLUS
		this.source = uni.getSystemInfoSync().platform;
		if (this.source == 'ios') {
			this.source_id = 3;
		} else {
			this.source_id = 2;
		}
		//#endif
		//#ifdef MP-WEIXIN
		this.source = 'wx_applet';
		this.source_id = 5;
		//#endif
		
		if (func) {
			for (var i in func) {
				this.vue.prototype[i] = func[i];
			}
		}
	},
	//设置提交的按钮
	btnLoad : function(cur) {
		if (!cur) {
			cur = this.cur;
		}
		if (!cur) {
			return;
		}
		cur.btn = this.btn(cur);
	},
	//设置提交的按钮
	btnFinish : function() {
		var cur = this.cur;
		if (!cur) {
			return;
		}
		cur.btn = {
			disabled:false,
			loading:false,
			text:this.btnText,
		};
	},
	//设置提交的按钮
	btn : function(cur, text) {
		this.cur = cur;
		if (text) {
			this.btnText = text;
		}
		return {
			disabled:true,
			loading:true,
			text:'加载中...',
		};
	},
	//设置loading
	setGetLoading : function(yes, no) {
		this.getLoadingCall = {'yes': yes, 'no' : no};
	},
	setPostLoading : function(yes, no) {
		this.postLoadingCall = {'yes': yes, 'no' : no};
	},
	setPageLoading : function(yes, no) {
		this.pageLoadingCall = {'yes': yes, 'no' : no};
	},
	//获取当前route
	route : function() {
		var page = this.getPage();
		if (!page) {
			return '';
		}
		var route = page.route;
		return route;
	},
	//获取当前param
	param : function() {
		var page = this.getPage();
		if (!page) {
			return '';
		}
		var options = page.options;
		return options;
	},
	//获取当前url
	url : function() {
		var page = this.getPage();
		if (!page) {
			return '';
		}
		var route = page.route;
		var options = page.options;
		
		
		// 拼接参数
		let param = []
		if (options) {
			for (let key in options) {
				param.push(key + '=' + options[key]);
			}
		}
		param = param.join('&');
		if (param) {
			param = '?' + param;
		}

		return '/' + route + param;
	},
	//获取当前page
	getPage : function() {
		var pages = getCurrentPages();
		if (pages.length > 0) {
			return pages[pages.length - 1];
		} else {
			return false;
		}
	},
	//loading
	loading : function(method, options, url) {
		var state = false;
		if (method == 'POST') {
			if (this.postLoadingCall && this.postLoadingCall.yes) {
				state = true;
				var callback = this.postLoadingCall.yes;
				callback(this);
			}
		} else if (method == 'page') {
			//state = true;
			if (options.page && options.page > 1) {
				state = false;
			}
			if (this.pageLoadingCall && this.pageLoadingCall.yes) {
				
				state = true;
				var callback = this.pageLoadingCall.yes;
				callback(this);
			}
		} else {
			url = this.route();
			if (this.lastGetUrl && this.lastGetUrl != url && this.getLoadingState[this.lastGetUrl]) {
				this.getLoadingState[this.lastGetUrl] = false;
			}
			if (this.getLoadingState && this.getLoadingState[url]) {
				state = false;
			} else {
				if (this.getLoadingCall && this.getLoadingCall.yes) {
					state = true;
					var callback = this.getLoadingCall.yes;
					callback(this);
				}
			}
		}
		if (!state) {
			var title = '加载中';
			if (method == 'POST') {
				title = '提交中';
			}
			uni.showLoading({title: title, mask: true});
			//uni.showNavigationBarLoading();
			this.showLoad = true;
		}
		uni.stopPullDownRefresh();
	},
	//取消loading
	hideLoading : function(method, options, url) {
		var state = false;
		if (method == 'POST' || method == 'post') {
			if (this.postLoadingCall && this.postLoadingCall.no) {
				state = true;
				var callback = this.postLoadingCall.no;
				callback(this);
			}
		} else if (method == 'page') {
			//state = true;
			if (options.page && options.page > 1) {
				state = false;
			}
			if (this.pageLoadingCall && this.pageLoadingCall.no) {
				state = true;
				var callback = this.pageLoadingCall.no;
				callback(this);
			}
		} else {
			url = this.route();
			if (!this.lastGetUrl || (this.lastGetUrl && this.lastGetUrl != url)) {
				this.lastGetUrl = url;
			}
			if (this.getLoadingState && this.getLoadingState[url]) {
				state = false;
			} else {
				this.getLoadingState[url] = true;
				if (this.getLoadingCall && this.getLoadingCall.no) {
					state = true;
					var callback = this.getLoadingCall.no;
					callback(this);
				}
			}
		}
		
		if (!state && this.showLoad) {
			uni.hideLoading();
			this.showLoad = false;
			this.btnFinish();
			//uni.hideNavigationBarLoading();
		}
	},
	//data数据获取
	dataset : function(e) {
		if (e.currentTarget) {
			var dataset = e.currentTarget.dataset;
		} else {
			var dataset = e.target.dataset;
		}
		
		return dataset;
	},
	//view中的页面提示
	viewAlert : function(e) {
		if (e) {
			var dataset = this.dataset(e);
			var msg = dataset.msg;
			var icon = dataset.icon;
			var callback = dataset.callback;
			
			this.alert(msg, icon, callback);
		} else {
			this.alert('敬请期待');
		}
	},
	//view中的页面跳转
	viewLocation : function(e) {
		var page = '';
		var to = '';
		var option = '';
		if (e) {
			var dataset = this.dataset(e);
			page = dataset.page;
			to = dataset.to;
			option = []
			
			for (var i in dataset) {
				if (i.indexOf('save_') != -1) {
					var v = dataset[i];
					i = i.replace('save_', '');
					this.data(i, v);
				} else if (i != 'page' && i != 'to') {
					option.push(i + '=' + dataset[i]);
				}
			}
			if (option) {
				option = option.join('&');
			}
		}
		
		if (!page) {
			uni.navigateBack({});
		} else {
			var go = '';
			if (to) {
				go = 'to';
			}
			if (option) {
				page = page + '?' + option;
			}
			this.location(page, go);
		}
	},
	//页面跳转
	location : function(path, go, title) {
		var self = this;
		if (path.indexOf('http') > -1) {
			this.debug('http:' + path);
			this.data('web_view', path);
			if (title) {
				this.data('web_view_title', title);
			}
			if (this.source == 'app' || this.source == 'applet' || go == 'webview') {
				uni.navigateTo({
					url: this.web_view
				})
			} else {
				if (!go) {
					go = '';
				}
				if (go && go == 'location') {
					window.location.href = path;
				} else {
					var url = window.location.href;
					if (go.indexOf('/') != -1) {
						url = this.host + go
					} else {
						url = url + go;
					}
					url = window.btoa(url);
					if (path.indexOf('?') == -1) {
						path = path + '?';
					} else {
						path = path + '&';
					}
					window.location.href = path + 'refer=' + url;
				}
			}
		} else {
			this.debug('navigateTo:' + go + ':' + path);
			if (path.indexOf('/pages/') == -1) {
				path = '/pages/' + path;
			}
			if (this.switchTab.indexOf(path) != -1) {
				uni.switchTab({
					url: path,
					success: function(e) {
						if (self.source != 'app' && self.switchTabCall[path]) {
							var call = self.switchTabCall[path];
							call(self, e);
						}
					}
				})
			} else if (go && go != 'webview') {
				uni.redirectTo({
					url: path
				})
			} else {
				uni.navigateTo({
					url: path
				})
			}
		}
	},
	
	//提示信息
	alert : function(info, icon, callback) {
		if (!icon) {
			icon = 'none'
		}
		if (info) {
			uni.showToast({title: info, icon: icon});
		}
		this.debug('alert:' + info)
		if (callback) {
			this.debug('callback:' + callback)
			setTimeout(function(){
				callback();
			}, 1000)
		}
	},
	
	//询问信息
	confirm : function(text, callback) {
		uni.showModal({
			content: text,
			cancelText: '取消',
			confirmText: '确定',
			success: res => {
				if (res.confirm) {
					callback();
				}
			}
		});
	},
	
	//debug调试
	debug : function(string) {
		if (config.base.debug) {
			this.log(string);
		}
	},
	
	//记录日志
	log : function(string) {
		console.log(string);
	},
	
	//获取token
	getToken: function() {
		return http.getToken();
	},
	
	//设置token
	setToken: function(value) {
		return http.setToken(value);
	},
	
	//通用的提交数据的方法
	post : function(url, options, callback, err_callback) {
		http.request('post', url, options, callback, err_callback);
	},
	
	//通用的获取数据方法
	get : function(vue, url, options, callback, err_callback) {
		http.request(vue, url, options, callback, err_callback);
	},
	
	//通用的获取数据方法
	page : function(config, vue, url, options, callback, err_callback) {
		page.get(config, vue, url, options, callback, err_callback);
	},

	//选择图片并上传
	upload : function(id, count, callback) {
		this.getUpload().handle(id, count, callback);
	},
	
	//上传到七牛
	qiniu : function(qn, self, id, count, callback, handle) {
		this.getUpload().qiniu(qn, self, id, count, callback, handle);
	},
	
	//html上传文件
	upfile : function(self, key, count, callback, ext, title, style) {
		this.getUpload().upfile(self, key, count, callback, ext, title, style);
	},
	
	//直接上传文件
	uploadFile : function(path, id, count, callback) {
		this.getUpload().uploadFile(path, id, count, callback);
	},
	
	//获取upload
	getUpload : function() {
		return upload;
	},
	
	//im聊天
	im : function(key, url, callback, connect) {
		im.init(key, url, callback, connect);
	},
	
	//im聊天关闭
	im_close : function(key) {
		im.close(key);
	},
	
	//im聊天 get请求
	im_get : function(vue, url, options, callback, err_callback) {
		im.get(vue, url, options, callback, err_callback);
	},
	
	//im聊天 post请求
	im_post : function(url, options, callback, err_callback) {
		im.post(url, options, callback, err_callback);
	},
	
	//删除上传
	uploadDel : function(id, index, callback) {
		upload.uploadDel(id, index, callback);
	},
	
	//验证登录
	checkLogin : function(refer) {
		if (!this.getToken()) {
			this.goLogin(refer);
		}
	},
	
	//去登录
	goLogin : function(refer) {
		this.data('login_refer', this.getRefer(refer));
		//this.hideLoading();
		if (this.source == 'h5') {
			this.location(this.login, 'go');
		} else {
			this.location(this.login, 'go');
		}
	},
	
	//获取refer
	getRefer : function(refer) {
		if (!refer) {
			refer = this.url();
		}
		return refer;
	},
	
	//数据存储
	data : function(key, value) {
		if (value) {
			if (value == 'del') {
				uni.removeStorageSync(key);
				return true;
			} else {
				uni.setStorageSync(key, value);
				return value;
			}
		} else {
			return uni.getStorageSync(key);
		}
	},
	
	//插入html代码，初始化
	initHtml : function(doc) {
		this.doc = doc.$refs.initHtml.$el;
	},
	
	//插入html代码
	html : function(html) {
		var self = this;
		var div = document.createElement('div');
		div.innerHTML = html;
		this.doc.appendChild(div);
		var scripts = div.querySelectorAll('script');
		return Array.prototype.slice.apply(scripts).reduce((chain, script) => {
			return chain.then(() => self.runScript(script));
		}, Promise.resolve());
	},
	
	//微信提醒
	wxTip : function(type) {
		var wx = this.is_weixin();
		if (wx) {
			var img = 'live_weixin';
			if (type) {
				img = 'weixin-guide';
			}
			var tip = '<div id="weixin-tip" style="position: fixed; left:0; top:0; background: rgba(0,0,0,0.8); filter:alpha(opacity=80); width: 100%; height:100%; z-index: 100;"  onclick="document.getElementById(\'weixin-tip\').remove()"><p style="text-align: center; margin-top: 10%; padding:0 5%;"><img src="static/dever/'+img+'.png" alt="微信打开" style="max-width: 100%; height: auto;"/></p></div>';
			this.html(tip);
			return true;
		}
		return false;
	},
	
	is_weixin: function() {
		if (this.source != 'h5') {
			return false;
		}
		var ua = navigator.userAgent.toLowerCase();  
		if(ua.match(/MicroMessenger/i)=="micromessenger") {  
			return true;  
		} else {  
			return false;  
		}
	},
	
	//执行script代码
	runScript : function(script) {
		return new Promise((reslove, rejected) => {
			const newScript = document.createElement('script');
			newScript.innerHTML = script.innerHTML;
			const src = script.getAttribute('src');
			if (src) newScript.setAttribute('src', src);
			// script 加载完成和错误处理
			newScript.onload = () => reslove();
			newScript.onerror = err => rejected();
			document.head.appendChild(newScript);
			document.head.removeChild(newScript);
			if (!src) {
				// 如果是 inline script 执行是同步的
				reslove();
			}
	  })
	},
	
	//拉起支付
	pay : function(result, location, error) {
		var self = this;
		if (!error) {
			if (location.indexOf('?') == -1) {
				var fix = '?';
			} else {
				var fix = '&';
			}
			location = location + fix + 'order_id=' + result.order_id;
		}
		
		if (result.type == 'test') {
			self.alert('支付成功','none', function() {
				self.location(location, 'to');
			})
		} else if (self.source == 'h5') {
			uni.hideLoading();
			uni.showLoading({title: '跳转中', mask: true});
			self.html(result.order);
		} else if (self.source == 'app') {
			self.appPayment(result.type, result.order, function() {
				self.location(location, 'to');
			}, function() {
				if (!error) {
					self.location(location + '&error=1', 'to');
				} else {
					self.alert(error);
				}
			});
		}
	},
	
	//app支付
	appPayment : function(type, order, callback, errorCallback) {
		uni.requestPayment({
		    provider: type,
		    orderInfo: order, //微信、支付宝订单数据
		    success: function (res) {
		        //console.log('success:' + JSON.stringify(res));
				callback(res);
		    },
		    fail: function (err) {
		        //console.log('fail:' + JSON.stringify(err));
				errorCallback(err)
		    }
		});
	},
	
	//跳转到refer
	jump : function() {
		var refer = this.data('login_refer');
		var id = this.data('invite_id');
		var type = this.data('invite_type');
		if (id && refer != 'index/index') {
			refer = refer + '?id=' + id + '&type=' + type;
		}
		this.data('login_refer', 'del');
		this.data('invite_id', 'del');
		this.data('invite_type', 'del');
		if (!refer) {
			refer = 'index/index';
		}
		this.location(refer, 'go');
	},
	//转星号
	xing : function(s) {
		return s.replace(s, function(sMatch){
			return sMatch.replace(/./g,"*");
		});
	},
	
	//检查更新
	checkUpdate : function() {
		this.update();
	},
	update : function(path, call) {
		var self = this;
		var source = this.source;
		if (source != 'app') {
			return;
		}
		var type = plus.os.name.toLowerCase();
		//var type = 'android';
		//var config = this.config.version;
		
		self.post('isUpdate', {t:1}, function(res) {
			if (type == 'android') {
				res.downloadUrl = res.androidUrl;
			} else {
				res.downloadUrl = res.iosUrl;
			}
			self.data('dever_update_link', res.downloadUrl);
			plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
				var version = widgetInfo.versionCode;
				var state = false;
				state = widgetInfo.versionCode < res.versionCode;
				if (state) {
					//强制更新
					var txt = '正在为您下载更新，下载完成将重启应用';
					if (res.forceUpdate == true) {
						self.down(res, res.downloadUrl, txt, type);
					} else if(call) {
						call(res, txt, type);
					} else {
						uni.showModal({
							title: '发现新版本',
							content: '有新版本可用 (版本号:' + res.versionName + ')，请问您是否更新？',
							success: (t) => {
								if (t.confirm) {
									if (path) {
										self.location(path);
									} else {
										self.down(res, res.downloadUrl, txt, type);
									}
								}
							}
						})
					}
				}
			});
		});
	},
	uploadCall : function(config, type, packgePath) {
		// 保存更新记录到stroage，下次启动app时安装更新
		var self = this;
		self.data('dever_update', 1);
		self.data('dever_update_down', packgePath);
		// 任务完成，关闭下载任务，开始安装
		plus.runtime.install(packgePath, {force: true}, function() {
			self.data('dever_update', 2);
			self.data('dever_update_down', 'del');
			uni.showModal({
			  title: '提示',
			  content: '应用将重启以完成更新',
			  showCancel: false,
			  complete: () => {
				plus.runtime.restart();
			  }
			})
		});
	},
	down : function(config, url, txt, type, call) {
		if (!url) {
			return false;
		}
		if (txt) {
			this.alert(txt);
		}
		if (type != 'android' && !url.match(RegExp(/.wgt/))) {
			plus.runtime.openURL(url);
			return false;
		}
		var self = this;
		var packgePath = self.data('dever_update_down');
		if (packgePath) {
			self.uploadCall(config, type, packgePath);
			return false;
		}
		var downloadTask = uni.downloadFile({
		    url: url,
		    success: (res) => {
		        if (res.statusCode === 200) {
		            // 保存下载的安装包
		            uni.saveFile({
		                tempFilePath: res.tempFilePath,
		                success: (res) => {
		                    var packgePath = res.savedFilePath;
							if (call) {
								call();
							}
		                    self.uploadCall(config, type, packgePath);
							downloadTask.abort();
							downloadTask = null;
		                }
		            })
		        }
		    }
		});
		return downloadTask;
	},
	
	//预览图片
	viewPic : function(imgs, img, key) {
		if (imgs && imgs.length > 0) {
			if (key) {
				var temp = [];
				var i;
				for(i in imgs) {
					temp.push(imgs[i][key]);
				}
				imgs = temp;
			}
			// 检测图片是否原图
			img = this.getImg(img);
			if (imgs.length > 0)  {
				for (i in imgs) {
					imgs[i] = this.getImg(imgs[i]);
				}
			}
			uni.previewImage({
				current:img,
				urls: imgs,
				indicator : 'default',
				loop : true,
				/*
				longPressActions : {
					itemList: ['发送给朋友', '保存图片', '收藏'],
					success: function(data) {
						console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片');
					},
					fail: function(err) {
						console.log(err.errMsg);
					}
				}
				*/
				
			});
		}
	},
	
	//获取原图
	getImg : function(img) {
		if (img.indexOf('?') != -1) {
			var t = img.split('?');
			img = t[0];
		} else if (img.indexOf('_t') != -1) {
			var t = img.split('.');
			var ext = t[1];
			t = img.split('_t');
			img = t[0] + '.' + ext;
		}
		
		return img;
	},
	
	//截取APP退出功能
	quit : function(page, call) {
		var self = this;
		if (self.source == 'app') {
			var main = plus.android.runtimeMainActivity();
			//为了防止快速点按返回键导致程序退出重写quit方法改为隐藏至后台 
			/*
			plus.runtime.quit = function(){  
				main.moveTaskToBack(false);  
			};  
			*/
			//重写toast方法如果内容为 ‘再按一次退出应用’ 就隐藏应用，其他正常toast  
			plus.nativeUI.toast = (function(str){  
				if(str == '再按一次退出应用') {
					if (call) {
						call(main);
					} else {
						var webview = page.$mp.page.$getAppWebview();
						var child = webview.children();
						child[0].back();
					}
					
					return false;  
				}else{  
					self.alert(str);
				}  
			});
		}
	},
	
	//滑动
	slide : function(e) {
		dever.slideValue = {};
		if (e.changedTouches[0].clientX) {
			dever.slideValue.clientX = e.changedTouches[0].clientX;
			dever.slideValue.clientY = e.changedTouches[0].clientY;
		} else {
			dever.slideValue.clientX = e.changedTouches[0].screenX;
			dever.slideValue.clientY = e.changedTouches[0].screenY; 
		}
		
	},
	
	//滑动结束
	slideEnd : function(e) {
		if (e.changedTouches[0].clientX) {
			var subX = e.changedTouches[0].clientX - dever.slideValue.clientX;
			var subY = e.changedTouches[0].clientY - dever.slideValue.clientY;
		} else {
			var subX = e.changedTouches[0].screenX - dever.slideValue.clientX;
			var subY = e.changedTouches[0].screenY - dever.slideValue.clientY;
		}
		
		if (subY > 20) {
			//上滑
		    return 1;
		} else if (subY < -20) {
			//下滑
			return 2;
		} else if (subX > 20) {
			//左滑
		    return 3;
		} else if(subX < -20) {
			//右滑
			return 4;
		}
		return 
	},
	
	//计算图片宽高比
	getImage : function(imgWidth, imgHeight, containerWidth, containerHeight) {
	  let [
	    // 用于设定图片的宽和高
	    tempWidth,
	    tempHeight,
	  ] = [
	    undefined,
	    undefined
	  ]
	  try {
	    imgWidth = parseFloat(imgWidth)
	    imgHeight = parseFloat(imgHeight)
	    containerWidth = parseFloat(containerWidth)
	    containerHeight = parseFloat(containerHeight)
	  } catch (error) {
	    throw new Error('抱歉，我只接收数值类型或者可以转成数值类型的参数')
	  }
	
	  if (imgWidth > 0 && imgHeight > 0) {
	    //原图片宽高比例 大于 指定的宽高比例，这就说明了原图片的宽度必然 > 高度
	    if (imgWidth / imgHeight >= containerWidth / containerHeight) {
	      if (imgWidth > containerWidth) {
	        // alert('aaaaaaaa')
	        tempWidth = containerWidth
	        // 按原图片的比例进行缩放
	        tempHeight = (imgHeight * containerWidth) / imgWidth
	      } else {
	        // 按照图片的大小进行缩放
	        tempWidth = imgWidth
	        tempHeight = imgHeight
	      }
	    } else {  // 原图片的高度必然 > 宽度
	      if (imgHeight > containerHeight) {
	
	        tempHeight = containerHeight
	        // 按原图片的比例进行缩放
	        tempWidth = (imgWidth * containerHeight) / imgHeight
	      } else {
	        // 按原图片的大小进行缩放
	        tempWidth = imgWidth
	        tempHeight = imgHeight
	      }
	    }
	  }
	
	  return [tempWidth,  tempHeight]
	},
	
	sleep : function(time) {
		return new Promise((resolve) => setTimeout(resolve, time));
	},
	
	//分享功能初始化
	shareInit : function(wx, project, host, data) {
		share.init(wx, project, host, data);
	},
	
	//通用的分享功能
	share : function(provider, scene, type, data, success, error) {
		if (this.source == 'h5') {
			var weixin = this.wxTip(1);
			if (!weixin) {
				this.alert('请点击复制按钮');
			}
		} else {
			var config = {
				provider: provider,
				type: type,
				scene: scene,
				href: data.link,
				title: data.title,
				summary: data.content,
				imageUrl: data.pic,
				success: function(res) {
					if (success) {
						success(res);
					} else {
						console.log("success:" + JSON.stringify(res));
					}
				},
				fail: function(err) {
					if (error) {
						success(err);
					} else {
						console.log("fail:" + JSON.stringify(err));
					}
				}
			};
			if (data.media) {
				config.mediaUrl = media;
			}
			if (this.source == 'applet') {
				if (!data.path) {
					console.log('data.path未定义！');
					return;
				}
				if (!data.applet_id) {
					console.log('data.applet_id未定义！');
					return;
				}
				config.miniProgram = {};
				config.miniProgram.id = data.applet_id;
				config.miniProgram.path = data.path;
				config.miniProgram.type = 0;
				config.miniProgram.webUrl = data.link;
			}
			uni.share(config);
		}
	},
	
	// 获取地理位置
	getLocation : function(type, text, success) {
		if (!type) {
			type = 'wgs84';
		}
		if (!text) {
			text = '需要获得您的位置，请您授权';
		}
		var self = this;
		if (self.source != 'h5') {
			uni.getSetting({
				success(res) {
					if (res.authSetting['scope.userLocation']) {
						self.getAltitude(type, success);
					} else {
						uni.authorize({
							scope: 'scope.userLocation',
							success(res) {
								self.getAltitude(type, success);
							},
							// 授权失败
							fail(err) {
								uni.showModal({
									title: '提示',
									content: text,
									showCancel: false,
									confirmText: '确认授权',
									success() {
										uni.openSetting({
											success(res) {
												self.getAltitude(type, success);
											},
											fail(err) {
												self.alert('授权失败');
											}
										})
									}
								})
							}
						})
					}
				}
			})
		} else {
			self.getAltitude(type, success);
		}
	},
	
	getAltitude : function(type, success) {
		uni.getLocation({
			type: type,
			altitude: true,
			success(res) {
				if (success) {
					success(res);
				} else {
					console.info(res);
				}
			}
		})
	},
	
	//bgm
	bgm : function() {
		bgm.dever = this;
		return bgm;
	}
}

module.exports = dever