/* ================================================================================
 * dever.js v1.0
 * http://git.shemic.com/dever/script
 * ================================================================================
 * Copyright 2017-2018 Dever(dever.cc)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ================================================================================
 */

 //<filter><script src="../script/lib/jquery/jquery.min.js"></script><script src="../script/dever/core.js"></script></filter>

$(function()
{
    Dever.Init();
});

//公共类库
var Dever = 
{
    countdown : -1,
    modal : false,
    Init : function()
    {
        this.Import();
        this.Page().Init();
        this.User().Init();
        this.Editor().Init();
        this.Upload().Init();
        this.Change();
        this.LoadPage();
        this.Extend();
        //this.Target();
        //this.Pjax();
        this.AutoComplete();
    }

    ,AutoComplete : function()
    {
        if ($("input").length) {
            $("input").each(function()
            {
                $(this).attr('autocomplete', 'new-password');
                /*
                $(this).attr('readonly', true);
                $(this).focus(function()
                {
                    $(this).attr('readonly', false);
                });
                */
            });
        }
    }
    
    ,Pjax : function()
    {
		$(document).pjax('a', '.container');
		//$.pjax.reload('.container');
	}

    ,Page : function()
    {
        return _Dever_Page;
    }

    ,Template : function()
    {
        return _Dever_Template;
    }
    
    ,Editor : function()
    {
        return _Dever_Editor;
    }

    ,User : function()
    {
        return _Dever_User;
    }
    
    ,Modal : function()
    {
        return new _Dever_Modal();
    }

    ,Upload : function()
    {
        return _Dever_Upload;
    }
    
    ,Proxy : function(uri)
    {
        return config.proxy + 'proxy_method=' + encodeURIComponent(uri);
    }

    ,Jump : function(url)
    {
        location.href = url;
    }
    
    ,BackRun : function(url)
    {
        $.post(url);
    }

    ,Reload : function(e)
    {
        e.attr('src', e.attr('src'));
    }
    
    ,Target : function()
    {
		var link = config.host;
		$("a").each(function() {
			if (!$(this).attr('onclick')) {
				var url = $(this).attr('href');
				
				if (url && url.indexOf(link) == -1) {
					//$(this).attr('target', '_blank');
				}
			}
		})
	}
    
    ,Time : function(e, time, text)
    {
        var self = this;
        if (this.countdown < 0) {
            this.countdown = time;
        }
        if (this.countdown == 0) {
            e.attr("disabled", false);
            e.html(text);
            self.Init();
            this.countdown = time;
        } else {
            e.attr("disabled", true);
            e.html(this.countdown + 's后' + text);
            this.countdown--;
            e.unbind('click');
            setTimeout(function() {
                self.Time(e, time, text)
            },1000)
        }
    }
    ,Import : function()
	{
        var self = this;
        var include = $("include");
        var count = include.length-1;
        if (include.length) {
            include.each(function(i){
                var dom = $(this);
                var system  = dom.attr('system');
                var path    = dom.attr('path');
                var name    = dom.attr('file');

                var file = '';
                if(path) file = path;
                if(system) file = file + '/' + system;
                
                file += name + '.html';
                dom.load(file, function(){
                    $("html").find("include").eq(i).get(0).outerHTML = dom.html();

                    if (i == count) {
                        self.Template().Init();
                    }
                });
            })
        } else {
            self.Template().Init();
        }
	}
    
    ,LoadPage : function()
    {
		if ($('.dever-loadpage').length) {
            $('.dever-loadpage').each(function() {
				var url = $(this).attr('dever-url');
				var self = $(this);
                $.getJSON(Dever.CallUrl(url), function(t) {
					self.html(t.msg);
					_Dever_Page.Ajax(self);
				});
            });
        }
    }
    
    ,CallUrl : function(url)
    {
		if (url.indexOf('callback') == -1) {
			if (url.indexOf('=') != -1) {
				url += '&json=1&callback=?';
			} else {
				url += '?json=1&callback=?';
			}
		}
		
		return url;
	}

    ,Change : function()
    {
        if ($('.dever-change').length) {
            $('.dever-change').change(function() {
                Dever.Jump($(this).attr('dever-change')+$(this).val());
            });

            //$('.dever-change').val($('.dever-change').attr('dever-value'));
        }
    }

    ,Host : function(host, uri)
    {
        var result = '';
        
        uri = uri ? uri : '';
    
        result = config.host.replace('www', host);
        result = result.replace('main', host);
        
        if (config.proxy) {
			return this.Proxy(host + '/' + uri);
		}

        return result + uri;
    }

    // 输出数据，提示框
    ,Out : function(content, callback, title)
    {
        if (content && content.indexOf('登录') != -1 && $("#login_url").length) {
            var href = $("#login_url").val();
            location.href = href;
            return;
        } else {
            if (this.modal) {
                this.modal.Alert(content, {'yes':callback, 'no':callback}, title);
            } else {
                this.Modal().Alert(content, {'yes':callback, 'no':callback}, title);
            }
        }
    }

    // 将数据解析，并进行下一步操作
    ,Msg : function(result, error_callback, success_callback)
    {
        if (result.status == 2) {
            if (result.data) {
                if (result.data.element) {
                    if (result.data.attr) {
                        $(result.data.element).attr(result.data.attr, result.data.value);
                    } else {
                        $(result.data.element).val(result.data.value);
                    }
                } else if (result.data.url) {
                    location.href = result.data.url;
                }
            }
            if (error_callback) {
                return error_callback(result.msg);
            }
            this.Out(result.msg);
        } else {
            if (typeof(result.data) != 'object') {
                result.msg = result.data;
            }
            if (success_callback) {
                return success_callback(result.msg);
            }
            if (result.msg.indexOf('http://') != -1) {
                this.Jump(result.msg);
            } else if (parseInt(result.msg) > 0) {
                this.Out('操作成功', function() {
                    location.reload();
                });
            } else {
                this.Out(result.msg);
            }
        }
    }

    ,Confirm : function(content, callback, title)
    {
        if (this.modal) {
            this.modal.Confirm(content, {'yes':callback}, title);
        } else {
            this.Modal().Confirm(content, {'yes':callback}, title);
        }
    }
    
    ,Extend : function()
	{
		Array.prototype.indexIn = function(val) {
			for (var i = 0; i < this.length; i++) {
				if (this[i] == val) return i;
			}
			return -1;
		};
		Array.prototype.remove = function(val) {
			var index = this.indexIn(val);
			if (index > -1) {
				this.splice(index, 1);
			}
		};

        $("select option").each(function() {
            if ($(this).attr('select') && $(this).attr('select') == 'true') {
                $(this).attr('selected', 'true');
            } else {
                $(this).removeAttr('selected');
            }
        });
	}

    ,Ucfirst : function(str)
    {
        var str = str.toLowerCase();
        var strarr = str.split(' ');
        var result = '';
        for (var i in strarr){
            result += strarr[i].substring(0,1).toUpperCase()+strarr[i].substring(1)+' ';
        }
        return result;
    }
};

//瀑布流分页
var _Dever_Page = 
{
    name : '',
    loading : '',
    Init : function()
    {
        if ($(this.name).length) {
            var self = this;
            $(window).scroll(function() {  
                if ($(window).scrollTop() >= $(document).height() - $(window).height()) {
                    self.Start(self.name, self.loading);
                }
            });  
        }
    }

    ,Start : function(page, loading)
    {
        page = page ? page : this.name;
        loading = loading ? loading : this.loading;
        if ($(page).length) {
            $(page).hide();
            var url = $(page).attr('dever-page-link');
            if (url) {
                var key = $(page).attr('dever-page-list');
                if ($(loading).length) {
                    $(loading).show();
                }
                $.get(url, function(t) {
                    t = '<div>' + t + '</div>';
                    var c = $(t).find(key).html();
                    if ($(loading).length) {
                        $(loading).hide();
                    }
                    if (c) {
                        $(key).append(c);
                        var l = $(t).find(page).attr('dever-page-link');
                        $(page).attr('dever-page-link', l);
                    }
                });
            }
        }
    }
    
    ,Ajax : function(e)
    {
		var self = this;
		e.find('a').each(function() {
			var url = $(this).attr('href');
			
			$(this).attr('href', 'javascript:;');
			
			$(this).unbind('click').bind('click', function() {
				$.get(url.replace('callback', ''), function(t) {
					e.html(t);
					self.Ajax(e);
				});
			});
		});
	}
}

//模态框 非静态类
var _Dever_Modal = function()
{
    var self = this;
    self.state = false;
    self.html = '';
    self.box = '';
    self.title = '';
    self.content = '';
    self.yes = '';
    self.no = '';
    self.setting = '';
    self.confirm = '';
    self.open = false;

    self.Init = function()
    {
        this.state = false;
        if (this.html) {
            $('body').append(this.html);
        }
        if (this.box && this.content) {
            this.box = $(this.box);
            if (this.box.length) {
                this.box.hide();
                this.content = $(this.content);

                if(this.title) this.title = $(this.title);
                if(this.yes) this.yes = $(this.yes);
                if(this.no) this.no = $(this.no);
                if(this.setting) this.setting = $(this.setting);
                if(this.confirm) this.confirm = $(this.confirm);
                if(!this.timeout) this.timeout = 3000;

                this.state = true;
            }
        }
    };
    
    self.Alert = function(content, callback, title)
    {
        if (self.open == true) {
            return;
        }
        self.open = true;
        if (this.state == false) {
            alert(content);
            if (callback) {
                callback.yes();
            }
        } else {
            if (this.setting.length && this.setting.html()) {
                if (this.confirm) this.confirm.hide();
                this.setting.show();
            } else {
                if (this.setting) this.setting.hide();
                if (this.confirm) this.confirm.show();
            }
            this.content.html(content);
            if (title) {
                this.title.html(title);
            }
            this.box.show();
            if (this.yes && callback.yes) {
                this.Bind(callback);
            } else {
                this.TimeOut(callback);
            }
        }
    };
    
    self.Confirm = function(content, callback, title)
    {
        if (self.open == true) {
            return;
        }
        self.open = true;
        if (this.state == false) {
            if (confirm(content)) {
                callback.yes();
            }
        } else {
            if (this.confirm) this.confirm.show();
            if (this.setting) this.setting.hide();
            
            this.content.html(content);
            if (title) {
                this.title.html(title);
            }
            this.box.show();
            if (callback.yes) {
                this.Bind(callback);
            }
        }
    }
    
    self.Bind = function(callback)
    {
        if (this.yes.length && callback.yes) {
            this.yes.unbind('click').bind('click', callback.yes);
        }
        
        if (this.no.length) {
            if (callback.no) {
                this.no.unbind('click').bind('click', callback.no);
            } else {
                var self = this;
                this.no.unbind('click').bind('click', function()
                {
                    self.Close();
                });
            }
        }
    };

    self.TimeOut = function(callback)
    {
        var self = this;
        setTimeout(function()
        {
            if (callback && callback.yes) {
                callback.yes();
            } else {
                self.Close();
            }
            
        }, self.timeout);
    }
    
    self.Close = function()
    {
        this.open = false;
        this.box.hide();
    }

    return self;
};

//用户相关 静态类
var _Dever_User = 
{
    config : [],
    uid : -1,
    name : '匿名用户',
    //按钮不可点击的样式
    disable : '',

    Init : function()
    {
        var self = this;
        if (this.config.click) {
            for (var i in this.config.click) {
                var e = self.config.click[i];
                var c = 1;
                if (e.indexOf('|') != -1) {
                    var t = e.split('|');
                    e = t[0];
                    c = 2;
                }
                var e = $(e);
                if (e.length) {
                    e.attr('data-i', i);
                    e.attr('data-c', c);
                    if (self.disable) {
                        e.addClass(self.disable);
                        self.DisableCheck(e);
                    } else {
                        self.Bind(e);
                    }
                }
            }
        }
    }

    ,Bind : function(e)
    {
        var self = this;
        e.unbind('click').bind('click', function() {
            if ($(this).attr('data-c') == 2) {
                Dever.Confirm(function() {
                    self.Save($(this), config);
                });
            } else {
                self.Save($(this), config);
            }
        });
    }

    ,DisableCheck : function(e)
    {
        var self = this;
        var key = e.attr('data-i');
        var config = self.config[key];

        var callback = function(msg,state) {
            e.addClass(self.disable);
        }

        var blur = function() {
            var send = self.Check(e, callback, config);
            if (!send) {
                e.addClass(self.disable);
                return;
            }
            e.removeClass(self.disable);
            self.Bind(e);
        }

        var send = self.Check(e, callback, config, blur);
        if (!send) {
            callback(config.error);
            return;
        }

        e.removeClass(self.disable);
        self.Bind(e);
    }

    ,Check : function(e, callback, config, blur)
    {
        var self = this;
        var send = {};
        if (typeof(config.input) != 'undefined') {
            if (typeof(config.input) == 'string' && config.input == 'parent') {
                if (e.attr('dever-send')) {
                    send[e.attr('dever-send')] = e.attr('dever-' + e.attr('dever-send'));
                }
                send.id = e.attr('dever-id');
                send.value = e.parent().find('input').val();

                if (!send.id || !send.value) {
                    callback(config.error);
                    return false;
                }
            } else if (typeof(config.input) == 'string' && config.input == 'click') {
                if (e.attr('dever-send')) {
                    var a = e.attr('dever-send').split('&');
                    for (var i in a) {
                        if (typeof(a[i]) == 'string') {
                            var b = a[i].split('=');
                            send[b[0]] = b[1];
                        }
                    }
                }
            } else if (typeof(config.input) == 'object') {

                if (blur) {
                    for (var i in config.input) {
                        var input = config.input[i];
                        if (typeof(input) == 'string') {
                            if (input.indexOf('|') != -1) {
                                var t = input.split('|');
                                input = t[0];
                            }
                            var el = $(input);
                            el.on('input',function()
                            {
                                blur();
                            });
                            el.blur(function()
                            {
                                blur();
                            });
                        }
                    }
                }
                
                for (var i in config.input) {
                    var option = false;
                    var input = config.input[i];
                    if (typeof(input) == 'object' || typeof(input) == 'function') {
                        send[i] = input();
                    } else {
                        var select = [];
                        if (input.indexOf('|') != -1) {
                            var t = input.split('|');
                            input = t[0];
                            option = true;
                            if (t[1]) {
                                select = t;
                            }
                        }
                        var el = $(input);
                        //e.get(0).tagName == 'TEXTAREA'
                        send[i] = el.val();

                        if (option == false) {
                            state = self.Match(el, send[i], callback, config);
                            if (!state) {
                                return state;
                            }
                        } else if(select) {
                            //只要有一个为真即可
                            var result = false;
                            if (select.length <= 0) {
                                result = true;
                            }
                            for (var i in select) {
                                if (typeof(select[i]) == 'string') {
                                    var el = $(select[i]);
                                    state = self.Match($(el), $(el).val(), false, config);
                                    if (state) {
                                        result = true;
                                    }
                                }
                            }

                            if (result == false) {
                                return result;
                            }
                        }
                    }
                }
            }
        }
        return send;
    }

    ,Match : function(e, value, callback, config)
    {
        var m = true;
        if (value && e.attr('dever-match')) {
            var r = new RegExp(e.attr('dever-match'));
            m = r.test(value);
        }

        if (value && e.attr('dever-value')) {
            m = $(e.attr('dever-value')).val() == value;
        }

        if (!value || m != true) {
            if (callback) {
                var error = e.attr('dever-error') ? e.attr('dever-error') : config.error;
                callback(error);
            }
            
            return false;
        }
        return true;
    }

    //通用的保存数据功能
    ,Save : function(e, setting)
    {
        var self = this;
        var key = e.attr('data-i');
        var config = self.config[key];
        if (config.start) {
            config.start.call();
        }
        
        var callback = function(msg,state) {
            if (config.status && $(config.status).length) {
                //$(config.status).html(msg).css('visibility','initial');
                state ? $(config.status).html(msg).hide() : $(config.status).html(msg).show();
            } else if(!state) {
                Dever.Out(msg);
            }
        }

        var send = self.Check(e, callback, config);

        if (!send) {
            callback(config.error);
            return;
        }
        
        if (!config.url) {
			config.url = e.attr('dever-send');
		}

        if (e.attr('dever-refresh')) {
            config.url = e.attr('dever-refresh');
        }
		
		callback(1,1);
		
		config.url = Dever.CallUrl(config.url);

		if (setting.proxy) {
			$.post(config.url, send, function(t) {
				t = eval('(' + t + ')');
				Dever.Msg(t, callback, (config.callback ? function(msg){config.callback(e,msg,t)} : false));
			});
		} else {
			$.getJSON(config.url, send, function(t) {
				Dever.Msg(t, callback, (config.callback ? function(msg){config.callback(e,msg,t)} : false));
			});
		}
    }
};

//编辑器相关
var _Dever_Editor = 
{
	state : false,
    editors : [],
    Init : function()
    {
		if (typeof marked == 'function') {
			this.state = true;
		} else {
			this.state = false;
		}
		this.SetMark();
        var self = this;
		
		if ($('.dever-note').length) {
			$('.dever-note').each(function() {
				self.InitEditor($(this));
			})
        }
	}

    ,InitEditor : function(e)
    {
        var id = e.attr('id');
        var key = e.attr('key');
        if (config.uid && config.uid > 0) {
            var toolbar = [
              'title'
              ,'bold'
              ,'italic'
              ,'underline'
              ,'strikethrough'
              ,'fontScale'
              ,'color'
              ,'ol'
              ,'ul'
              ,'blockquote'
              ,'code'
              ,'table'
              ,'link'
              ,'image'
              ,'hr'
              ,'indent'
              ,'outdent'
              ,'alignment'
              //,'emoji'
            ];
        } else {
            var toolbar = [
              'title'
              ,'bold'
              ,'fontScale'
              ,'color'
              ,'ol'
              ,'ul'
              ,'blockquote'
              ,'indent'
              ,'outdent'
              ,'alignment'
            ];
        }
        
        if (typeof(this.editors[id]) == "undefined")  {
            this.editors[id] = new Simditor({
                textarea: e,
                upload:
                {
                    url: config.upload + '.simditor',
                    params: {key:key},
                    fileKey: 'file',
                    connectionCount: 10,
                    leaveConfirm: 'Uploading is in progress, are you sure to leave this page?'
                },
                toolbar : toolbar
                /*
                ,emoji: 
                {
                    imagePath: config.lib + 'simditor/plugins/emoji/images/emoji/'
                }
                */
            });
        }
    }
	
	,SetMark : function()
	{
        return;
	}
	
	,GetMark : function(content)
	{
		if (this.state == true) {
			return marked(content);
		}
		
		return content;
	}
};

//模板
var _Dever_Template = 
{
    state : false,
    method : '',
    element : '',
    data : '',
    param : '',
    attr : '',
    Init : function()
    {
        if (this.Check()) {
            var url = config.proxyTemplateUrl;
            var send = {};
            var parsing = [];
            $("dever").each(function(){
                parsing.push($(this).html());
                $(this).remove();
            });
            send.url = location.href;
            send.parsing = parsing.join('');
            send.html = $("html").html();
            //$("html").html('dever template loading...');
            $.ajax({
                type: "POST",
                url: url,
                data: send,
                dataType: "json",
                success: function(result){
                    $("html").html(result.data);
                }
            });
        }
    }

    ,Check : function()
    {
        if ($("dever").length) {
            this.state = true;
        } else {
            this.state = false;
        }
        return this.state;
    }
}

//上传 请载入layui
var _Dever_Upload = 
{
    upload : [],
    upload_file : [],
    upload_pic : [],
    callback : {},

    Init : function()
    {
        var self = this;
        if ($(".dever-upload-drag").length) {
            $(".dever-upload-drag").each(function() {
                var key = $(this).attr('key');
                
                if (config.proxy) {
                    var url = Dever.Proxy('upload/save.drag') + '&key=' + key;
                } else {
                    var url = config.upload + '.drag?key='+ key;
                }
                $(this).inlineattachment({
                    uploadUrl: url,
                    progressText: '![文件上传中...]()',
                    urlText: "![文件描述]({filename})\n",
                    errorText: '上传失败'
                });
            });
        }

        if ($(".dever-upload").length) {
            $(".dever-upload").each(function(i) {
                self.Load(i,$(this));
            })
        }
    }
    ,Load : function(i,e)
    {
        var self = this;
        var id = e.attr('id');
        var value = e.attr('dever-upload-value');
        var key = e.attr('dever-upload-key');
        var type = e.attr('dever-upload-type');
        var callback = e.attr('dever-upload-callback');
        var input = $("#" + value);
        if (!input.length) {
            return;
        }
        var url = config.upload + '.start';
        if (typeof(this.upload[value]) != "undefined") {
            return;
        }
        if (!key) {
            key = 1;
        }
        self.upload[value] = true;
        self.upload_pic[value] = [];
        self.upload_file[value] = [];

        var input_value = input.val();
        if (input_value && type == 'mul') {
            var input_value_array = input_value.split(',');
            for (var i in input_value_array) {
                self.Set(type, e, input, value, callback, input_value_array[i]);
            }
        }
        
        layui.use(['upload','layer'], function() {
            var layer = layui.layer;
            var layuiUpload = layui.upload;
            var uploadInst = layuiUpload.render({
                elem: '#' + id
                ,data: {'key' : key}
                ,field: 'file'
                ,url: url
                ,multiple: true
                ,before: function(obj) {
                    layer.load();
                }
                ,done: function(data) {
                    layer.closeAll('loading');
                    if (data.status == 1) {
                        self.Set(type, e, input, value, callback, data.url);
                    } else {
                        layer.msg(data.msg, {icon: 4});
                        return false;
                    }
                }
                ,error: function() {
                    layer.closeAll('loading');
                    layer.msg('上传失败', {icon: 4});
                    return false;
                }
            });
        });
    }

    ,Set : function(type, e, input, value, callback, url)
    {
        if (type == 'mul') {
            this.SetMul(e, input, value, callback, url);
        } else {
            this.SetOne(e, input, value, callback, url);
        }
    }

    ,SetOne : function(e, input, value, callback, url)
    {
        var html = '';
        if (this.callback && this.callback[callback]) {
            html = this.callback[callback].call(this, e, url, 'dever-upload-close');
        } else {
            html = '<img src="'+url+'" class="pics">';
        }

        if (html) {
            e.html(html);
        }

        var input_value = input.val();
        if (input_value != url) {
            input.val(url);
            this.Blur(input);
        }
    }

    ,SetMul : function(e, input, value, callback, url)
    {
        var html = '';
        var input_value = input.val();
        if (this.upload_pic[value].length <= 0 && input_value) {
            this.upload_pic[value] = input_value.split(',');
        }
        if (this.callback && this.callback[callback]) {
            html += this.callback[callback].call(this, e, url, 'dever-upload-close');
        } else {
            html += '<li><img src="'+url+'" class="pics"><em class="dever-upload-close"></em></li>';
        }

        if (html) {
            e.before(html);
        }
        this.Close(value);
        if (input_value.indexOf(url) == -1) {
            this.upload_pic[value].push(url);
            input.val(this.upload_pic[value].join(','));
            this.Blur(input);
        }
    }

    ,Blur : function(input)
    {
        var events = $._data(input[0], 'events');
        if (events && events["blur"]) {
            input.blur();
        }
    }

    ,Close : function(v)
    {
        var self = this;
        $('.dever-upload-close').each(function()
        {
            $(this).unbind('click').bind('click', function() {
                var e = $(this).parent();
                var p = e.find('img').attr('src');
                e.remove();
                self.upload_pic[v].remove(p);
                $("#" + v).val(self.upload_pic[v].join(','));
            });
        });
    }
}