MarkJane
4/12/2017 - 7:16 AM

php.js

// 绑定console.log
var log = console.log.bind(console);
// 函数名说明
// browser变量浏览器语言和版本判断对象 {"version":{"ie":false,"opera":false,"webKit":false,"firefox":true,"mobile":false,"ios":false,"android":false,"iphone":false,"ipad":false,"weixin":false},"language":"zh-cn","wifi",true}
// htmlencode(str)/htmldecode(str) 转换或还原实体
// date()Y-m-d H:i:s返回带0 Y-n-j不带0 z一年中第几天要+1才正确 w星期0是周日 N 7是周日D三个字母星期 l英语星期 W周 F月份英语 L闰年判断 c带时区日期时间 r英文形式
// time()返回php形式10位时间
// strtotime()转换成时间戳 支持'06:08:59' "2014-2-3" "now" "+1 day" "+1 week" "+2 days"
// microtime()微秒返回 "0.992 1434963474" microtime().split(" ")[1]
// intval(9.2,8)floatval(1.2) 浮点型 转换成整形 第二个表示数据的进制 转换不了返回0
// empty()是否为空 0 false null '' [] {} undefined
// isset()是否赋值 undefined返回false
// urlencode()urldecode()编解码
// base64_encode()base64_decode()64编码转换
// function_exists('alert') 检测函数是否存在
// in_array(1, ['1', '2', '3']); 是否在数组中
// range ( 0, 12 ); 生成数组 range( 'a', 'i' ); range( 0, 100, 10 );第三个参数步长
// strip_tags("111") 去除html
// round(1.456,1) 四舍五入
// rand(1,10) 生成随机数1-10 前后都包含
// ceil(1.2) 进1 floor(3.555) 舍去法
// strtolower()转大写strtoupper()小写ucfirst()首字母大写
// base_convert(99,16,2) 进制之间转换
// utf8_encode(str)编码成utf8 utf8_decode(str)解码
// is_eq(str1,str2) 是否相等 is_num("1") 是否数字 is_phone("1") 是否手机号 is_qq() is_id(str) 是否身份证 is_chinese(str) 是否中文 is_reg(str) //是否由字母和数字,下划线,点号组成.且开头的只能是下划线和字母 is_tel(str) 电话测试 校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-” is_ip(str) 是否IP is_zipcode(str) 是否邮编 is_email(邮箱) is_english(str) 是否英文 is_url(str) 是否url is_int(1,0,100) 是否在0到100之间 is_float(1.2,1.1,1.9) 是否在1.1-1.9之间 is_http() 是否包含http或https
// preg_replace(/N/,"32","分数是N分") strlen('1我2') 中文2个字符 strtrim(var) 去除多空格 timeline()时间线 strfind(string, find) 查找子字符串 json2str() str2json() setcookie('v',1,60)设置cookie 获取 默认60s implode(',',[1,2,3]) 转换成字符串 explode(",","1,2,3") 分割成数组 strcut("我爱中国人",4,"...") 截取字符串汉字占两个 英文一个
// setcookie( "foo" ); 获取 setcookie( "foo", "bar", 5 ); 5天过期 setcookie( "foo", false ); 删除
// date_eq(strDate1,strDate2) 判断是否第一个日期大于第二个
function time() {
    return Math.floor(new Date().getTime() / 1000)
} //10位时间戳
 
function date(format, timestamp) {
    var that = this;
    var jsdate, f;
    var txt_words = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur", "January", "February", "March", "April",
            "May", "June", "July", "August", "September", "October", "November", "December"];
    var formatChr = /\\?(.?)/gi;
    var formatChrCb = function (t, s) {
        return f[t] ? f[t]() : s
    };
    var _pad = function (n, c) {
        n = String(n);
        while (n.length < c) {
            n = "0" + n
        }
        return n
    };
    f = {
        d: function () {
            return _pad(f.j(), 2)
        },
        D: function () {
            return f.l().slice(0, 3)
        },
        j: function () {
            return jsdate.getDate()
        },
        l: function () {
            return txt_words[f.w()] + "day"
        },
        N: function () {
            return f.w() || 7
        },
        S: function () {
            var j = f.j();
            var i = j % 10;
            if (i <= 3 && parseInt((j % 100) / 10, 10) == 1) {
                i = 0
            }
            return ["st", "nd", "rd"][i - 1] || "th"
        },
        w: function () {
            return jsdate.getDay()
        },
        z: function () {
            var a = new Date(f.Y(), f.n() - 1, f.j());
            var b = new Date(f.Y(), 0, 1);
            return Math.round((a - b) / 86400000)
        },
        W: function () {
            var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3);
            var b = new Date(a.getFullYear(), 0, 4);
            return _pad(1 + Math.round((a - b) / 86400000 / 7), 2)
        },
        F: function () {
            return txt_words[6 + f.n()]
        },
        m: function () {
            return _pad(f.n(), 2)
        },
        M: function () {
            return f.F().slice(0, 3)
        },
        n: function () {
            return jsdate.getMonth() + 1
        },
        t: function () {
            return (new Date(f.Y(), f.n(), 0)).getDate()
        },
        L: function () {
            var j = f.Y();
            return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0
        },
        o: function () {
            var n = f.n();
            var W = f.W();
            var Y = f.Y();
            return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0)
        },
        Y: function () {
            return jsdate.getFullYear()
        },
        y: function () {
            return f.Y().toString().slice(-2)
        },
        a: function () {
            return jsdate.getHours() > 11 ? "pm" : "am"
        },
        A: function () {
            return f.a().toUpperCase()
        },
        B: function () {
            var H = jsdate.getUTCHours() * 3600;
            var i = jsdate.getUTCMinutes() * 60;
            var s = jsdate.getUTCSeconds();
            return _pad(Math.floor((H + i + s + 3600) / 86.4) % 1000, 3)
        },
        g: function () {
            return f.G() % 12 || 12
        },
        G: function () {
            return jsdate.getHours()
        },
        h: function () {
            return _pad(f.g(), 2)
        },
        H: function () {
            return _pad(f.G(), 2)
        },
        i: function () {
            return _pad(jsdate.getMinutes(), 2)
        },
        s: function () {
            return _pad(jsdate.getSeconds(), 2)
        },
        u: function () {
            return _pad(jsdate.getMilliseconds() * 1000, 6)
        },
        e: function () {
            throw "Not supported (see source code of date() for timezone on how to add support)"
        },
        I: function () {
            var a = new Date(f.Y(), 0);
            var c = Date.UTC(f.Y(), 0);
            var b = new Date(f.Y(), 6);
            var d = Date.UTC(f.Y(), 6);
            return ((a - c) !== (b - d)) ? 1 : 0
        },
        O: function () {
            var tzo = jsdate.getTimezoneOffset();
            var a = Math.abs(tzo);
            return (tzo > 0 ? "-" : "+") + _pad(Math.floor(a / 60) * 100 + a % 60, 4)
        },
        P: function () {
            var O = f.O();
            return (O.substr(0, 3) + ":" + O.substr(3, 2))
        },
        T: function () {
            return "UTC"
        },
        Z: function () {
            return -jsdate.getTimezoneOffset() * 60
        },
        c: function () {
            return "Y-m-d\\TH:i:sP".replace(formatChr, formatChrCb)
        },
        r: function () {
            return "D, d M Y H:i:s O".replace(formatChr, formatChrCb)
        },
        U: function () {
            return jsdate / 1000 | 0
        }
    };
    this.date = function (format, timestamp) {
        that = this;
        jsdate = (timestamp === undefined ? new Date() : (timestamp instanceof Date) ? new Date(timestamp) : new Date(
            timestamp * 1000));
        return format.replace(formatChr, formatChrCb)
    };
    return this.date(format, timestamp)
};
 
function microtime(get_as_float) {
    if (typeof performance !== "undefined" && performance.now) {
        var now = (performance.now() + performance.timing.navigationStart) / 1000;
        if (get_as_float) {
            return now
        }
        var s = now | 0;
        return (Math.round((now - s) * 1000000) / 1000000) + " " + s
    } else {
        var now = (Date.now ? Date.now() : new Date().getTime()) / 1000;
        if (get_as_float) {
            return now
        }
        var s = now | 0;
        return (Math.round((now - s) * 1000) / 1000) + " " + s
    }
};
 
function strtotime(text, now) {
    var parsed, match, today, year, date, days, ranges, len, times, regex, i, fail = false;
    if (!text) {
        return fail
    }
    text = text.replace(/^\s+|\s+$/g, "").replace(/\s{2,}/g, " ").replace(/[\t\r\n]/g, "").toLowerCase();
    match = text.match(
        /^(\d{1,4})([\-\.\/\:])(\d{1,2})([\-\.\/\:])(\d{1,4})(?:\s(\d{1,2}):(\d{2})?:?(\d{2})?)?(?:\s([A-Z]+)?)?$/);
    if (match && match[2] === match[4]) {
        if (match[1] > 1901) {
            switch (match[2]) {
            case "-":
                if (match[3] > 12 || match[5] > 31) {
                    return fail
                }
                return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] ||
                    0, match[9] || 0) / 1000;
            case ".":
                return fail;
            case "/":
                if (match[3] > 12 || match[5] > 31) {
                    return fail
                }
                return new Date(match[1], parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] ||
                    0, match[9] || 0) / 1000
            }
        } else {
            if (match[5] > 1901) {
                switch (match[2]) {
                case "-":
                    if (match[3] > 12 || match[1] > 31) {
                        return fail
                    }
                    return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[
                        8] || 0, match[9] || 0) / 1000;
                case ".":
                    if (match[3] > 12 || match[1] > 31) {
                        return fail
                    }
                    return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0, match[
                        8] || 0, match[9] || 0) / 1000;
                case "/":
                    if (match[1] > 12 || match[3] > 31) {
                        return fail
                    }
                    return new Date(match[5], parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[
                        8] || 0, match[9] || 0) / 1000
                }
            } else {
                switch (match[2]) {
                case "-":
                    if (match[3] > 12 || match[5] > 31 || (match[1] < 70 && match[1] > 38)) {
                        return fail
                    }
                    year = match[1] >= 0 && match[1] <= 38 ? +match[1] + 2000 : match[1];
                    return new Date(year, parseInt(match[3], 10) - 1, match[5], match[6] || 0, match[7] || 0, match[8] ||
                        0, match[9] || 0) / 1000;
                case ".":
                    if (match[5] >= 70) {
                        if (match[3] > 12 || match[1] > 31) {
                            return fail
                        }
                        return new Date(match[5], parseInt(match[3], 10) - 1, match[1], match[6] || 0, match[7] || 0,
                            match[8] || 0, match[9] || 0) / 1000
                    }
                    if (match[5] < 60 && !match[6]) {
                        if (match[1] > 23 || match[3] > 59) {
                            return fail
                        }
                        today = new Date();
                        return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] ||
                            0, match[5] || 0, match[9] || 0) / 1000
                    }
                    return fail;
                case "/":
                    if (match[1] > 12 || match[3] > 31 || (match[5] < 70 && match[5] > 38)) {
                        return fail
                    }
                    year = match[5] >= 0 && match[5] <= 38 ? +match[5] + 2000 : match[5];
                    return new Date(year, parseInt(match[1], 10) - 1, match[3], match[6] || 0, match[7] || 0, match[8] ||
                        0, match[9] || 0) / 1000;
                case ":":
                    if (match[1] > 23 || match[3] > 59 || match[5] > 59) {
                        return fail
                    }
                    today = new Date();
                    return new Date(today.getFullYear(), today.getMonth(), today.getDate(), match[1] || 0, match[3] ||
                        0, match[5] || 0) / 1000
                }
            }
        }
    }
    if (text === "now") {
        return now === null || isNaN(now) ? new Date().getTime() / 1000 | 0 : now | 0
    }
    if (!isNaN(parsed = Date.parse(text))) {
        return parsed / 1000 | 0
    }
    date = now ? new Date(now * 1000) : new Date();
    days = {
        "sun": 0,
        "mon": 1,
        "tue": 2,
        "wed": 3,
        "thu": 4,
        "fri": 5,
        "sat": 6
    };
    ranges = {
        "yea": "FullYear",
        "mon": "Month",
        "day": "Date",
        "hou": "Hours",
        "min": "Minutes",
        "sec": "Seconds"
    };
 
    function lastNext(type, range, modifier) {
        var diff, day = days[range];
        if (typeof day !== "undefined") {
            diff = day - date.getDay();
            if (diff === 0) {
                diff = 7 * modifier
            } else {
                if (diff > 0 && type === "last") {
                    diff -= 7
                } else {
                    if (diff < 0 && type === "next") {
                        diff += 7
                    }
                }
            }
            date.setDate(date.getDate() + diff)
        }
    }
    function process(val) {
        var splt = val.split(" "),
            type = splt[0],
            range = splt[1].substring(0, 3),
            typeIsNumber = /\d+/.test(type),
            ago = splt[2] === "ago",
            num = (type === "last" ? -1 : 1) * (ago ? -1 : 1);
        if (typeIsNumber) {
            num *= parseInt(type, 10)
        }
        if (ranges.hasOwnProperty(range) && !splt[1].match(/^mon(day|\.)?$/i)) {
            return date["set" + ranges[range]](date["get" + ranges[range]]() + num)
        }
        if (range === "wee") {
            return date.setDate(date.getDate() + (num * 7))
        }
        if (type === "next" || type === "last") {
            lastNext(type, range, num)
        } else {
            if (!typeIsNumber) {
                return false
            }
        }
        return true
    }
    times = "(years?|months?|weeks?|days?|hours?|minutes?|min|seconds?|sec" +
        "|sunday|sun\\.?|monday|mon\\.?|tuesday|tue\\.?|wednesday|wed\\.?" +
        "|thursday|thu\\.?|friday|fri\\.?|saturday|sat\\.?)";
    regex = "([+-]?\\d+\\s" + times + "|" + "(last|next)\\s" + times + ")(\\sago)?";
    match = text.match(new RegExp(regex, "gi"));
    if (!match) {
        return fail
    }
    for (i = 0, len = match.length; i < len; i++) {
        if (!process(match[i])) {
            return fail
        }
    }
    return (date.getTime() / 1000)
};
/*html编码函数和解码函数,转换成实体和还原实体,同名php函数*/
function htmlspecialchars_decode(e, E) {
    var T = 0,
        _ = 0,
        r = !1;
    "undefined" == typeof E && (E = 2), e = e.toString().replace(/</g, "<").replace(/>/g, ">");
    var t = {
        ENT_NOQUOTES: 0,
        ENT_HTML_QUOTE_SINGLE: 1,
        ENT_HTML_QUOTE_DOUBLE: 2,
        ENT_COMPAT: 2,
        ENT_QUOTES: 3,
        ENT_IGNORE: 4
    };
    if (0 === E && (r = !0), "number" != typeof E) {
        for (E = [].concat(E), _ = 0; _ < E.length; _++) 0 === t[E[_]] ? r = !0 : t[E[_]] && (T |= t[E[_]]);
        E = T
    }
    return E & t.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/�*39;/g, "'")), r || (e = e.replace(/"/g, '"')), e = e
        .replace(/&/g, "&")
}
 
function htmlspecialchars(e, E, T, _) {
    var r = 0,
        t = 0,
        a = !1;
    ("undefined" == typeof E || null === E) && (E = 2), e = e.toString(), _ !== !1 && (e = e.replace(/&/g, "&")), e =
        e.replace(/</g, "<").replace(/>/g, ">");
    var N = {
        ENT_NOQUOTES: 0,
        ENT_HTML_QUOTE_SINGLE: 1,
        ENT_HTML_QUOTE_DOUBLE: 2,
        ENT_COMPAT: 2,
        ENT_QUOTES: 3,
        ENT_IGNORE: 4
    };
    if (0 === E && (a = !0), "number" != typeof E) {
        for (E = [].concat(E), t = 0; t < E.length; t++) 0 === N[E[t]] ? a = !0 : N[E[t]] && (r |= N[E[t]]);
        E = r
    }
    return E & N.ENT_HTML_QUOTE_SINGLE && (e = e.replace(/'/g, "'")), a || (e = e.replace(/"/g, """)), e
};
var htmlencode = function (sStr) {
    return htmlspecialchars(sStr);
};
var htmldecode = function (sStr) {
    return htmlspecialchars_decode(sStr)
};
 
/*浏览器判断和网络判断*/
var browser = {
    version: function () {
        var u = navigator.userAgent.toLowerCase(),
            app = navigator.appVersion;
        return {
            ie: u.indexOf("trident") > -1,
            opera: u.indexOf("tresto") > -1,
            webKit: u.indexOf("applewebkit") > -1,
            firefox: u.indexOf("gecko") > -1 && u.indexOf("khtml") == -1,
            mobile: !! u.match(/applewebkit.*mobile.*/),
            ios: !! u.match(/\(i[^;]+;( u;)? cpu.+mac os x/),
            android: u.indexOf("android") > -1 || u.indexOf("linux") > -1,
            iphone: u.indexOf("iphone") > -1,
            ipad: u.indexOf("ipad") > -1,
            weixin: u.match(/micromessenger/i) == "micromessenger"
        }
    }(),
    language: (navigator.browserLanguage || navigator.language).toLowerCase(),
    wifi: ! function (t) {
        var e = !0,
            n = t.navigator.userAgent,
            i = t.navigator.connection;
        if (/MicroMessenger/.test(n)) if (/NetType/.test(n)) {
                var o = n.match(/NetType\/(\S)+/)[0].replace("NetType/", "");
                o && "WIFI" != o && (e = !1)
            } else document.addEventListener("WeixinJSBridgeReady", function () {
                    WeixinJSBridge.invoke("getNetworkType", {}, function (t) {
                        "network_type:wifi" != t.err_msg && (e = !1)
                    })
                });
            else if (i) {
            var a = i.type;
            "wifi" != a && "2" != a && "unknown" != a && (e = !1)
        }
        t.wifi = e
    }(window)
};
 
/*变量处理*/
function isset() {
    var a = arguments,
        l = a.length,
        i = 0,
        undef;
    if (l === 0) {
        throw new Error("Empty isset")
    }
    while (i !== l) {
        if (a[i] === undef || a[i] === null) {
            return false
        }
        i++
    }
    return true
};
 
function empty(mixed_var) {
    var undef, key, i, len;
    var emptyValues = [undef, null, false, 0, "", "0"];
    for (i = 0, len = emptyValues.length; i < len; i++) {
        if (mixed_var === emptyValues[i]) {
            return true
        }
    }
    if (typeof mixed_var === "object") {
        for (key in mixed_var) {
            return false
        }
        return true
    }
    return false
};
 
function intval(mixed_var, base) {
    var tmp;
    var type = typeof mixed_var;
    if (type === "boolean") {
        return +mixed_var
    } else {
        if (type === "string") {
            tmp = parseInt(mixed_var, base || 10);
            return (isNaN(tmp) || !isFinite(tmp)) ? 0 : tmp
        } else {
            if (type === "number" && isFinite(mixed_var)) {
                return mixed_var | 0
            } else {
                return 0
            }
        }
    }
};
 
function function_exists(func_name) {
    if (typeof func_name === "string") {
        func_name = this.window[func_name]
    }
    return typeof func_name === "function"
};
 
function in_array(needle, haystack, argStrict) {
    var key = "",
        strict = !! argStrict;
    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true
            }
        }
    }
    return false
};
 
function range(low, high, step) {
    var matrix = [];
    var inival, endval, plus;
    var walker = step || 1;
    var chars = false;
    if (!isNaN(low) && !isNaN(high)) {
        inival = low;
        endval = high
    } else {
        if (isNaN(low) && isNaN(high)) {
            chars = true;
            inival = low.charCodeAt(0);
            endval = high.charCodeAt(0)
        } else {
            inival = (isNaN(low) ? 0 : low);
            endval = (isNaN(high) ? 0 : high)
        }
    }
    plus = ((inival > endval) ? false : true);
    if (plus) {
        while (inival <= endval) {
            matrix.push(((chars) ? String.fromCharCode(inival) : inival));
            inival += walker
        }
    } else {
        while (inival >= endval) {
            matrix.push(((chars) ? String.fromCharCode(inival) : inival));
            inival -= walker
        }
    }
    return matrix
};
 
function strip_tags(input, allowed) {
    allowed = (((allowed || "") + "").toLowerCase().match(/<[a-z][a-z0-9]*>/g) || []).join("");
    var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
        commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
    return input.replace(commentsAndPhpTags, "").replace(tags, function ($0, $1) {
        return allowed.indexOf("<" + $1.toLowerCase() + ">") > -1 ? $0 : ""
    })
};
 
function rand(min, max) {
    var argc = arguments.length;
    if (argc === 0) {
        min = 0;
        max = 2147483647
    } else {
        if (argc === 1) {
            throw new Error("Warning: rand() expects exactly 2 parameters, 1 given")
        }
    }
    return Math.floor(Math.random() * (max - min + 1)) + min
};
 
function round(value, precision, mode) {
    var m, f, isHalf, sgn;
    precision |= 0;
    m = Math.pow(10, precision);
    value *= m;
    sgn = (value > 0) | -(value < 0);
    isHalf = value % 1 === 0.5 * sgn;
    f = Math.floor(value);
    if (isHalf) {
        switch (mode) {
        case "PHP_ROUND_HALF_DOWN":
            value = f + (sgn < 0);
            break;
        case "PHP_ROUND_HALF_EVEN":
            value = f + (f % 2 * sgn);
            break;
        case "PHP_ROUND_HALF_ODD":
            value = f + !(f % 2);
            break;
        default:
            value = f + (sgn > 0)
        }
    }
    return (isHalf ? value : Math.round(value)) / m
};
 
function strtolower(str) {
    return (str + "").toLowerCase()
};
 
function strtoupper(str) {
    return (str + "").toUpperCase()
};
 
function floatval(mixed_var) {
    return (parseFloat(mixed_var) || 0)
};
 
function ucfirst(str) {
    str += "";
    var f = str.charAt(0).toUpperCase();
    return f + str.substr(1)
};
 
function base_convert(number, frombase, tobase) {
    return parseInt(number + "", frombase | 0).toString(tobase | 0)
};
 
function floor(value) {
    return Math.floor(value)
};
 
function ceil(value) {
    return Math.ceil(value)
};
 
function utf8_encode(argString) {
    if (argString === null || typeof argString === "undefined") {
        return ""
    }
    var string = (argString + "");
    var utftext = "",
        start, end, stringl = 0;
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
        if (c1 < 128) {
            end++
        } else {
            if (c1 > 127 && c1 < 2048) {
                enc = String.fromCharCode((c1 >> 6) | 192, (c1 & 63) | 128)
            } else {
                if ((c1 & 63488) != 55296) {
                    enc = String.fromCharCode((c1 >> 12) | 224, ((c1 >> 6) & 63) | 128, (c1 & 63) | 128)
                } else {
                    if ((c1 & 64512) != 55296) {
                        throw new RangeError("Unmatched trail surrogate at " + n)
                    }
                    var c2 = string.charCodeAt(++n);
                    if ((c2 & 64512) != 56320) {
                        throw new RangeError("Unmatched lead surrogate at " + (n - 1))
                    }
                    c1 = ((c1 & 1023) << 10) + (c2 & 1023) + 65536;
                    enc = String.fromCharCode((c1 >> 18) | 240, ((c1 >> 12) & 63) | 128, ((c1 >> 6) & 63) | 128, (c1 &
                        63) | 128)
                }
            }
        } if (enc !== null) {
            if (end > start) {
                utftext += string.slice(start, end)
            }
            utftext += enc;
            start = end = n + 1
        }
    }
    if (end > start) {
        utftext += string.slice(start, stringl)
    }
    return utftext
};
 
function utf8_decode(str_data) {
    var tmp_arr = [],
        i = 0,
        c1 = 0,
        seqlen = 0;
    str_data += "";
    while (i < str_data.length) {
        c1 = str_data.charCodeAt(i) & 255;
        seqlen = 0;
        if (c1 <= 191) {
            c1 = (c1 & 127);
            seqlen = 1
        } else {
            if (c1 <= 223) {
                c1 = (c1 & 31);
                seqlen = 2
            } else {
                if (c1 <= 239) {
                    c1 = (c1 & 15);
                    seqlen = 3
                } else {
                    c1 = (c1 & 7);
                    seqlen = 4
                }
            }
        }
        for (var ai = 1; ai < seqlen; ++ai) {
            c1 = ((c1 << 6) | (str_data.charCodeAt(ai + i) & 63))
        }
        if (seqlen == 4) {
            c1 -= 65536;
            tmp_arr.push(String.fromCharCode(55296 | ((c1 >> 10) & 1023)), String.fromCharCode(56320 | (c1 & 1023)))
        } else {
            tmp_arr.push(String.fromCharCode(c1))
        }
        i += seqlen
    }
    return tmp_arr.join("")
};
/*URL编码解码*/
function urlencode(str) {
    str = (str + "").toString();
    return encodeURIComponent(str).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29")
        .replace(/\*/g, "%2A").replace(/%20/g, "+")
};
 
function urldecode(str) {
    return decodeURIComponent((str + "").replace(/%(?![\da-f]{2})/gi, function () {
        return "%25"
    }).replace(/\+/g, "%20"))
};
 
/*base64*/
function base64_encode(data) {
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        enc = "",
        tmp_arr = [];
    if (!data) {
        return data
    }
    data = unescape(encodeURIComponent(data));
    do {
        o1 = data.charCodeAt(i++);
        o2 = data.charCodeAt(i++);
        o3 = data.charCodeAt(i++);
        bits = o1 << 16 | o2 << 8 | o3;
        h1 = bits >> 18 & 63;
        h2 = bits >> 12 & 63;
        h3 = bits >> 6 & 63;
        h4 = bits & 63;
        tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)
    } while (i < data.length);
    enc = tmp_arr.join("");
    var r = data.length % 3;
    return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3)
};
 
function base64_decode(data) {
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        dec = "",
        tmp_arr = [];
    if (!data) {
        return data
    }
    data += "";
    do {
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
        o1 = bits >> 16 & 255;
        o2 = bits >> 8 & 255;
        o3 = bits & 255;
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1)
        } else {
            if (h4 == 64) {
                tmp_arr[ac++] = String.fromCharCode(o1, o2)
            } else {
                tmp_arr[ac++] = String.fromCharCode(o1, o2, o3)
            }
        }
    } while (i < data.length);
    dec = tmp_arr.join("");
    return decodeURIComponent(escape(dec.replace(/\0+$/, "")))
};
 
function preg_replace(pattern, replacement, subject, limit) {
    if (typeof limit === 'undefined') limit = -1;
    if (subject.match(eval(pattern))) {
        if (limit == -1) {
            return subject.replace(eval(pattern + 'g'), replacement);
        } else {
            for (x = 0; x < limit; x++) {
                subject = subject.replace(eval(pattern), replacement);
            }
            return subject;
        }
    } else {
        return subject;
    }
}
var strcut = function (str, iMaxBytes, sSuffix) {
    if (isNaN(iMaxBytes)) {
        return str
    }
    if (strlen(str) <= iMaxBytes) {
        return str
    }
    var i = 0,
        bytes = 0;
    for (; i < str.length && bytes < iMaxBytes; ++i, ++bytes) {
        if (str.charCodeAt(i) > 255) {
            ++bytes
        }
    }
    sSuffix = sSuffix || "";
    return (bytes - iMaxBytes == 1 ? str.substr(0, i - 1) : str.substr(0, i)) + sSuffix
};
var strlen = function (str) {
    var bytes = 0,
        i = 0;
    for (; i < str.length; ++i, ++bytes) {
        if (str.charCodeAt(i) > 255) {
            ++bytes
        }
    }
    return bytes
};
var implode = function (c, a) {
    return a.join(c);
};
var explode = function (separator, str, limit) {
    if (typeof limit == 'undefined') {
        return str.split(separator);
    }
    return str.split(separator, limit);
}
var setcookie = function (c, e, g) {
    if (e === undefined) {
        var f = "; " + document.cookie;
        var d = f.split("; " + c + "=");
        if (d.length === 2) {
            return d.pop().split(";").shift()
        }
        return null
    } else {
        if (e === false) {
            g = -1
        }
        var a = "";
        if (g) {
            var b = new Date();
            b.setTime(b.getTime() + (g * 24 * 60 * 60 * 1000));
            a = "; expires=" + b.toGMTString()
        }
        document.cookie = c + "=" + e + a + "; path=/"
    }
};
/*json与字符串转换*/
var json2str = function (oJson) {
    if (typeof (oJson) == typeof (false)) {
        return oJson
    }
    if (oJson == null) {
        return "null"
    }
    if (typeof (oJson) == typeof (0)) {
        return oJson.toString()
    }
    if (typeof (oJson) == typeof ("") || oJson instanceof String) {
        oJson = oJson.toString();
        oJson = oJson.replace(/\\r\\n/, "\\\\r\\\\n");
        oJson = oJson.replace(/\\n/, "\\\\n");
        oJson = oJson.replace(/\\"/, '\\\\"');
        return '"' + oJson + '"'
    }
    if (oJson instanceof Array) {
        var strRet = "[";
        for (var i = 0; i < oJson.length; i++) {
            if (strRet.length > 1) {
                strRet += ","
            }
            strRet += json2str(oJson[i])
        }
        strRet += "]";
        return strRet
    }
    if (typeof (oJson) == typeof ({})) {
        var strRet = "{";
        for (var p in oJson) {
            if (strRet.length > 1) {
                strRet += ","
            }
            strRet += '"' + p.toString() + '":' + json2str(oJson[p])
        }
        strRet += "}";
        return strRet
    }
};
var str2json = function (str) {
    return JSON.stringify(str)
};
 
/*验证判断*/
var is_eq = function (str1, str2) {
    if (str1 == str2) {
        return (true)
    } else {
        return (false)
    }
};
var is_num = function (num) {
    var reg = new RegExp("^[0-9]*$");
    return reg.test(num)
};
var is_phone = function (num) {
    var reg = /^1\d{10}$/;
    return reg.test(num)
};
var is_qq = function (num) {
    var reg = /^[1-9]{1}\d{4,11}$/;
    return reg.test(num)
};
var is_email = function (num) {
    var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
    return reg.test(num)
};
var is_id = function (num) {
    var reg = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
    return reg.test(num)
};
var is_chinese = function (num) {
    var reg = /[\u4e00-\u9fa5]/g;
    return reg.test(num)
};
var is_reg = function (num) {
    var reg = /^([a-zA-z_]{1})([\w]*)$/g;
    return reg.test(num)
};
var is_tel = function (str) {
    var reg = /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
    return reg.test(str)
};
var is_ip = function (strIP) {
    if (isNull(strIP)) {
        return false
    }
    var re = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g;
    if (re.test(strIP)) {
        if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) {
            return true
        }
    }
    return false
};
var is_zipcode = function (str) {
    var reg = /^(\d){6}$/;
    return reg.test(str)
};
var is_english = function (str) {
    var reg = /^[A-Za-z]+$/;
    return reg.test(str)
};
var is_url = function (str) {
    var reg = /^http:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/;
    return reg.test(str)
};
var is_int = function (n, iMin, iMax) {
    if (!isFinite(n)) {
        return false
    }
    if (!/^[+-]?\d+$/.test(n)) {
        return false
    }
    if (iMin != undefined && parseInt(n) < parseInt(iMin)) {
        return false
    }
    if (iMax != undefined && parseInt(n) > parseInt(iMax)) {
        return false
    }
    return true
};
var is_float = function (n, fMin, fMax) {
    if (!isFinite(n)) {
        return false
    }
    if (fMin != undefined && parseFloat(n) < parseFloat(fMin)) {
        return false
    }
    if (fMax != undefined && parseFloat(n) > parseFloat(fMax)) {
        return false
    }
    return true
};
var is_http = function (url) {
    if (url.indexOf("http://") === -1 && url.indexOf("https://") === -1) {
        return false
    }
    return true
};
 
function strfind(string, find) {
    return !(string.indexOf(find) === -1);
};
 
function date_eq(strDate1, strDate2) {
    var date1 = new Date(strDate1.replace(/\-/g, "\/"));
    var date2 = new Date(strDate2.replace(/\-/g, "\/"));
    if ((date1 - date2) >= 0) {
        return true;
    } else {
        return false;
    }
}
var timeline = function (tt) {
    var today = new Date();
    var d = new Date(tt);
    var m = today.getTime() - d.getTime();
    if (m <= 0) {
        m = 1000
    }
    if (m < 60 * 1000) {
        return Math.floor(m / 1000) + "秒前"
    } else {
        if (m < 60 * 60 * 1000) {
            return Math.floor(m / (1000 * 60)) + "分钟前"
        } else {
            if (m < 60 * 60 * 1000 * 24) {
                return Math.floor(m / (1000 * 60 * 60)) + "小时前"
            } else {
                if (m < 60 * 60 * 1000 * 24 * 7) {
                    return Math.floor(m / (1000 * 60 * 60 * 24)) + "天前"
                } else {
                    if (m < 60 * 60 * 1000 * 24 * 7 * 56) {
                        return Math.floor(m / (1000 * 60 * 60 * 24 * 7)) + "周前"
                    } else {
                        return Math.floor(m / (1000 * 60 * 60 * 24 * 7 * 52)) + "年前"
                    }
                }
            }
        }
    }
};
 
function strtrim(a) {
    return a.replace(/\s+/g, " ");
};