/* ================================================================================
 * 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="../js/jquery.min.js"></script><script src="../js/dever.js"></script></filter>

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

//公共类库
var Dever = 
{
    Init : function()
    {
        this.Import();
        this.Page().Init();
        this.User().Init();
        this.Editor().Init();
        this.Change();
        this.Upload();
        this.LoadPage();
        this.Extend();
        //this.Target();
        //this.Pjax();
    }
    
    ,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 _Dever_Modal;
    }
    
    ,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');
				}
			}
		})
	}
    
    ,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(){
                    dom.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 : '';

        if (config.type == '?') {
            result = config.host.replace('?', host + '?');
        } else {
            result = config.host.replace('www', host);
        }
        
        result = result.replace('main', host);

        result = result + config.type;
        
        result = result.replace('??', '?');
        
        if (config.proxy) {
			return this.Proxy(host + '/' + uri);
		}

        return result + uri;
    }

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

            if (ele && callback) {
                ele.unbind('click').bind('click', callback);
            } else if (callback) {
                callback();
            }
        }
    }

    // 将数据解析，并进行下一步操作
    ,Msg : function(result, error_callback, success_callback)
    {
        if (result.status == 2) {
            if (error_callback) {
                return error_callback(result.msg);
            }
            this.Out(result.msg);
        } else {
            if (result.data) {
                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(callback)
    {
        if (confirm('确定进行此项操作吗？')) {
            callback();
        }
    }

    //上传组件加载
    ,Upload : function()
    {
        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) {
                loadUpload(i,$(this),$(this).attr('key'),config.upload + '.start', config.assets + 'image/');//三个参数说明1:第几个上传框2：文件对象3：图片的基本配置标题
            })
        }
    }

    ,Load : function(filename,filetype)
    {
        if (filetype == "js") {
            var fileref = document.createElement('script');
            fileref.setAttribute("type","text/javascript");
            fileref.setAttribute("src",filename + '.' + filetype);
        } else if (filetype == "css") {
            var fileref = document.createElement('link');
            fileref.setAttribute("rel","stylesheet");
            fileref.setAttribute("type","text/css");
            fileref.setAttribute("href",filename + '.' + filetype);
        }
        if (typeof fileref != "undefined") {
            document.getElementsByTagName("head")[0].appendChild(fileref);
        }
    }
    
    ,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 : '',
    Init : function()
    {
        if ($(this.name).length) {
            var self = this;
            $(window).scroll(function() {  
                if ($(window).scrollTop() >= $(document).height() - $(window).height()) {
                    self.Start(self.name);
                }
            });  
        }
    }

    ,Start : function(page)
    {
        page = page ? page : this.name;
        if ($(page).length) {
            $(page).hide();
            var url = $(page).attr('link');
            if (url) {
                var key = $(page).attr('dever-list');
                $.get(url, function(t) {
                    t = '<div>' + t + '</div>';
                    var c = $(t).find(key).html();
                    if (c) {
                        $(key).append(c);

                        var l = $(t).find(page).attr('link');
                        $(page).attr('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 =
{
    state : false,
    html : '',
    box : '',
    title : '',
    content : '',
    yes : '',
    no : '',
    setting : '',
    confirm : '',
    
    Init : function()
    {
        this.state = false;
        if (this.html) {
            $('body').append(this.html);
            if(this.box) this.box = $(this.box);
            if(this.title) this.title = $(this.title);
            if(this.content) this.content = $(this.content);
            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);

            this.state = true;
        }
    }
    
    ,Alert : function(content, callback)
    {
        if (this.state == false) {
            alert(content);
            return;
        } else {
            if (this.setting.length && this.setting.html()) {
                this.confirm.hide();
                this.setting.show();
            } else {
                this.setting.hide();
                this.confirm.show();
            }
            this.title.html(content);
            this.box.show();
            if (callback) {
                this.Bind(callback);
            }
        }
    }
    
    ,Confirm : function(content, callback)
    {
        if (this.state == false) {
            alert(content);
            return;
        } else {
            this.confirm.show();
            this.setting.hide();
            
            this.title.html(content);
            this.box.show();
            if(callback)
            {
                this.Bind(callback);
            }
        }
    }
    
    ,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();
                });
            }
        }
    }
    
    ,Close : function()
    {
        this.box.hide();
    }
}

//用户相关
var _Dever_User = 
{
    config : [],
    uid : -1,
    name : '匿名用户',

    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;
                }
                if ($(e).length) {
                    $(e).attr('data-i', i);
                    $(e).attr('data-c', c);
                    
                    $(e).unbind('click').bind('click', function() {
                        if ($(this).attr('data-c') == 2) {
                            var t1 = $(this);
                            Dever.Confirm(function() {
                                self.Save($(this).attr('data-i'), t1, config);
                            });
                        } else {
                            self.Save($(this).attr('data-i'), $(this), config);
                        }
                    });
                }
            }
        }
    }

    //通用的保存数据功能
    ,Save : function(key, e, setting)
    {
        var self = this;
        var config = self.config[key];
        if (config.start) {
            config.start.call();
        }
        var send = {};
        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);
            }
        }

        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;
                }
            } 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') {
                for (var i in config.input) {
                    var option = false;
                    var input = config.input[i];
                    if (input.indexOf('|') != -1) {
                        var t = input.split('|');
                        input = t[0];
                        option = true;
                    }
                    var m = true;
                    var el = $(input);
                    //e.get(0).tagName == 'TEXTAREA'
                    send[i] = el.val();

                    if (option == false) {
                        if (send[i] && el.attr('dever-match')) {
                            var r = new RegExp(el.attr('dever-match'));
                            m = r.test(send[i]);
                        }

                        if (send[i] && el.attr('dever-value')) {
                            m = $(el.attr('dever-value')).val() == send[i];
                        }

                        if (!send[i] || m != true) {
                            var error = el.attr('dever-error') ? el.attr('dever-error') : config.error;
                            callback(error);
                            return;
                        }
                    }
                }
            }
        }

        if (!send) {
            callback(config.error);
            return;
        }
        
        if (!config.url) {
			config.url = e.attr('dever-send');
		}
		
		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;
    }
}