/**
 * UI v1.1.0
 * Copyright 2017-2018 Muyao
 * Licensed under the Muyao License 1.0 
 */
(function (window, document, $) {
    'use strict';
    
    // 项目名称
    $.ctx = location.pathname.substring(0,location.pathname.lastIndexOf("/")+1);
    

    // 获取颜色配置信息
    $.colors = function (name, level) {
        if (!$.configs.colors && typeof $.configs.colors[name] === 'undefined') {
            return null;
        }

        if (level && typeof $.configs.colors[name][level] !== 'undefined') {
            return $.configs.colors[name][level];
        } else {
            return $.configs.colors[name];
        }
    };

    // 3rd调用参数
    $.po = function (name, options) {
        var defaults = $.components.getDefaults(name);
        return $.extend(true, {}, defaults, options);
    };

    // 配置信息存储管理
    $.configs = $.configs || {};

    $.extend($.configs, {
        _data: {},
        get: function () {
            var data = this._data, name,
                _argLen = arguments.length;

            if (_argLen === 0) {
                return;
            }
            for (var i = 0; i < _argLen; i++) {
                name = arguments[i];

                data = data[name];
            }

            return data;
        },
        set: function (name, value) {
            if (this.get(name)) {
                console.error('configs:' + name + '对象已经存在了');
            } else {
                this._data[name] = value;
            }
        },
        extend: function (name, options) {
            return $.extend(true, this.get(name), options);
        }
    });

    // 实现插件的提前检测和调用
    $.components = $.components || {};

    $.extend($.components, {
        _components: {},
        register: function (name, obj) {
            this._components[name] = obj;
        },
        init: function (context, iframe, name, args) {
            var self = this, obj;
            args = args || true;

            if (typeof name === 'undefined') {
                $.each(this._components, function (name) {
                    self.init(context, iframe, name, args);
                });
            } else {
                context = context || document;

                obj = this.get(name);

                if (!obj) {
                    return;
                }

                switch (obj.mode) {
                    case 'default':
                        return this._initDefault(name, context, iframe);
                    case 'init':
                        return this._initComponent(obj, context, iframe);
                    case 'api':
                        return this._initApi(obj, context, args, iframe);
                    default:
                        this._initApi(obj, context, args, iframe);
                        this._initComponent(obj, context, iframe);
                        return;
                }
            }
        },
        _initDefault: function (name, context, iframe) { // jquery 3rd的基本用法
            var iframe$ = iframe ? iframe.$ : $, defaults;

            if (!iframe$.fn[name]) {
                return;
            }

            defaults = this.getDefaults(name);

            $('[data-plugin=' + name + ']', context).each(function () {
                var $this = iframe$(this),
                    options = $.extend(true, {}, defaults, $this.data());

                $this[name](options);
            });
        },
        _initComponent: function (obj, context, iframe) { // jquery 3rd的高级用法
            if ($.isFunction(obj.init)) {
                obj.init.call(obj, context, iframe);
            }
        },
        _initApi: function (obj, context, args, iframe) { // 其他处理
            if (args && $.isFunction(obj.api)) {
                obj.api.call(obj, context, iframe);
            }
        },
        getDefaults: function (name) {
            var component = this.get(name);

            return component && typeof component.defaults !== "undefined" ? component.defaults : {};
        },
        get: function (name) {
            if (typeof this._components[name] !== "undefined") {
                return this._components[name];
            } else {
                console.error('component:' + name + ' 脚本文件没有注册任何信息！');
                return undefined;
            }
        }
    });

    // 本地存储对象操作 localStorage
    $.storage = $.storage || {};

    $.extend($.storage, {
        set: function (key, value, time) { //存入缓存
            var cacheExpireDate, cacheVal;

            if (!localStorage) {
                console.error('该浏览器不支持localStorage对象');
            }

            if (!key || !value) {
                return null;
            }

            // 定时情况
            if (!time || isNaN(time)) {
                cacheExpireDate = null;
            } else {
                cacheExpireDate = (new Date() - 1) + time * 1000 * 60;
            }

            cacheVal = {val: value, exp: cacheExpireDate};

            if (typeof value === "object") {
                cacheVal = JSON.stringify(cacheVal);
            }

            localStorage.setItem(key, cacheVal);
        },
        get: function (key) { // 获取存储内容
            var value, now, exp;

            if (!localStorage) {
                console.error('该浏览器不支持localStorage对象');
            }

            value = localStorage.getItem(key);

            if (!value) {
                return null;
            }

            if (typeof value === 'string') {
                value = JSON.parse(value);
            }

            now = new Date() - 1;
            exp = value.exp;

            if (exp && now > exp) { // 缓存内容已过期
                this.remove(key);
                return null;
            }

            return value.val;
        },
        remove: function (key) { // 删除指定缓存
            if (!localStorage) {
                console.error('该浏览器不支持localStorage对象');
            }

            localStorage.removeItem(key);
        }
    });

    // 本地存储对象操作 sessionStorage
    $.sessionStorage = $.sessionStorage || {};

    $.extend($.sessionStorage, {
        set: function (key, value) { //存入缓存
            if (!sessionStorage) {
                console.error('该浏览器不支持sessionStorage对象');
            }

            if (!key || !value) {
                return null;
            }

            if (typeof value === "object") {
                value = JSON.stringify(value);
            }

            sessionStorage.setItem(key, value);
        },
        get: function (key) { // 获取存储内容
            var value;

            if (!sessionStorage) {
                console.error('该浏览器不支持sessionStorage对象');
            }

            value = sessionStorage.getItem(key);

            if (!value) {
                return null;
            }

            if (typeof value === 'string') {
                value = JSON.parse(value);
            }

            return value;
        },
        remove: function (key) { // 删除指定缓存
            if (!sessionStorage) {
                console.error('该浏览器不支持sessionStorage对象');
            }

            sessionStorage.removeItem(key);
        }
    });

    // 网站基础设置
    $.site = $.site || {};

    function dataAttr(elem, key, data, iJquery) {
        var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
            rmultiDash = /([A-Z])/g;

        // If nothing was found internally, try to fetch any
        // data from the HTML5 data-* attribute
        if (data === undefined && elem.nodeType === 1) {

            var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();

            data = elem.getAttribute(name);

            if (typeof data === "string") {
                try {
                    data = data === "true" ? true :
                        data === "false" ? false :
                            data === "null" ? null :

                                // Only convert to a number if it doesn't change the string
                                +data + "" === data ? +data :
                                    rbrace.test(data) ? $.parseJSON(data) :
                                        data;
                } catch (e) {
                }

                // Make sure we set the data so it isn't changed later
                iJquery.data(elem, key, data);

            } else {
                data = undefined;
            }
        }

        return data;
    }

    $.fn.extend({
        data: function (key, value, iJquery) {
            var i, name, data,
                elem = this[0],
                attrs = elem && elem.attributes;

            // Special expections of .data basically thwart jQuery.access,
            // so implement the relevant behavior ourselves

            // Gets all values
            if (key === undefined || $.isFunction(key)) {
                iJquery = key || $;

                if (this.length) {
                    data = iJquery.data(elem);

                    if (elem.nodeType === 1 && !iJquery._data(elem, "parsedAttrs")) {
                        i = attrs.length;
                        while (i--) {

                            // Support: IE11+
                            // The attrs elements can be null (#14894)
                            if (attrs[i]) {
                                name = attrs[i].name;
                                if (name.indexOf("data-") === 0) {
                                    name = iJquery.camelCase(name.slice(5));
                                    dataAttr(elem, name, data[name], iJquery);
                                }
                            }
                        }
                        iJquery._data(elem, "parsedAttrs", true);
                    }
                }

                return data;
            }

            if($.isFunction(value) && value.fn.jquery){
                return elem ? dataAttr(elem, key, value.data(elem, key), value) : undefined;
            }

            // Sets multiple values
            if (typeof key === "object") {
                return this.each(function () {
                    value && value.data(this, key);
                });
            }

            iJquery = iJquery || $;

            return arguments.length > 1 ?

                // Sets one value
                this.each(function () {
                    iJquery.data(this, key, value);
                }) :

                // Gets one value
                // Try to fetch any internally stored data first
                elem ? dataAttr(elem, key, iJquery.data(elem, key), iJquery) : undefined;
        }
    });

})(window, document, jQuery);