/**
 *
 *  Basic
 *  所有页面的共用基础功能
 *
 * */


function utils_get_param(name){
    var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if(r!=null)return  unescape(r[2]); return null;
}

function reloadPage(){
    location.reload()
}

let Queue = {THRESHOLD: 1000,
    IS_LOADED : false,
    nowuse : 0, SVR_URL:"http://localhost:8803/server/",
    groupsCount : 0, groups:[],
    shouldStop : false,
    backup:["http://localhost:8803/server/",
        "/server/",
        "http://172.30.84.3:8803/server/","https://1.niimei.com/server/"] ,
    list:[], temporary:0, errorCount:0};

let Users = {list : []};
let Sectors = {list : []};

function get_server_url() {
    let output = $.ajax({url: Queue.SVR_URL + "/fcFlow/list", timeout:1000 }).fail(on_check_fail).done(function(){
        Queue.IS_LOADED = true;
        console.warn("Using SERVER : ");
        console.warn(Queue.SVR_URL);
        setTimeout(parse_queue, 50);
    });
}

function on_check_fail(){
    if(Queue.nowuse === Queue.backup.length - 1){
        console.warn("Backup Failed : " + Queue.backup[Queue.nowuse]);
        console.warn(this);
        var out = "";
        Queue.backup.forEach(function(val,index,arr){
            out += val + "\n";
        });
        send_alert("抱歉, 服务器连接失败! \n 请确认 " + out + "其中之一可用");
    }else{
        Queue.nowuse ++;
        Queue.SVR_URL = Queue.backup[Queue.nowuse];
        $.ajax({url: Queue.SVR_URL + "/fcFlow/list", timeout:1000 }).fail(on_check_fail).done(function(){
            Queue.IS_LOADED = true;
            console.warn("Using SERVER : ");
            console.warn(Queue.SVR_URL);
            setTimeout(parse_queue, 50);
        });
    }
}

function get_data(url, callback, scope) {
    Queue.list.push({url:url, callback:callback, gid:-1, scope:scope});
}

function new_data_group(groupName, callback){
    var gid = -1;
    Queue.groups.forEach(function(val,index,arr){
        if(val.groupName === groupName){
            gid = val.gid;
        }
    });
    if(gid === -1) {
        gid = Queue.groupsCount;
        Queue.groupsCount++;
        Queue.groups.push({
            gid: gid, groupName:groupName, callme: callback, counter:0
        });
    }
    return gid;
}

function group_get_data(groupName, url, callback){
    var gid = -1;
    Queue.groups.forEach(function(val,index,arr){
        if(val.groupName === groupName){
            gid = val.gid;
        }
    });
    if(gid === -1) {
        send_alert("Group 方法使用错误!!!")
    }
    Queue.list.push({url:url, callback:callback, gid:gid});
}

function parse_queue(){
    console.log("Queue Length : " + Queue.list.length);

    if(Queue.temporary > new Date().getTime()){
        for(i = 0; i < Queue.list.length; i++) {
            Queue.list.pop();
        }
    }

    Queue.temporary = 0;

    if(Queue.list.length > 0){
        let one = Queue.list.pop();
        if(one.gid === -1) {
            request_data(one.url, one.callback, one.scope);
        }else{
            g_request_data(one.url, one.callback, one.gid, one.scope);
        }
    }
    if(Queue.shouldStop == false) {
        setTimeout(parse_queue, 50);
    }
}

function request_data(url, callback, scope){
    $.ajax({
        url: Queue.SVR_URL + url,
        apiName: url,
        sendTime: new Date(),
        callme: callback,
        callerThis: scope
    }).done(on_dat_success).fail(on_fail);
}

function g_request_data(url, callback, gid){
    $.ajax({
        url: Queue.SVR_URL + url,
        apiName: url,
        sendTime: new Date(),
        gid: gid,
        callme: callback
    }).done(on_gp_success).fail(on_fail);
}

function on_gp_success(a,b) {
    var gid = this.gid;
    if(check_if_success(a,b)) {
        this.callme(a,b);
        Queue.groups.forEach(function(v,i,a){
            if(v.gid === gid){
                v.counter ++;
                v.callme(v);
            }
        });
    }
}

function on_dat_success(a,b){
    if(check_if_authfail(a,b)){
        setCookieWithTimeout("doibyUser","",-10);
        location.href = "sign-in1.html?from=entrance-5&msg=server-redirect-detected";
        return;
    }
    if(check_if_success(a,b)) {
        this.callme(a,b);
    }
}

function check_if_authfail(a){
    if(a == null || typeof a !== "string") {
        return false;
    }else{
        if(a.indexOf("login?from=") > 0 || a.startsWith("<!DOCTYPE html>") || a.indexOf("<!-- SME::LOGINPAGE -->") > 0){
            return true;
        }
    }
    return false;
}

function check_if_success(a,b){
    if(typeof a === "string"){
        try {
            a = JSON.parse(a);
        }catch (e) {
            console.warn("=----------   异常   -----------=");
            console.warn(a);
            console.warn("=----------------------------=");
            send_alert("信息失败 : "+e);
            return;
        }
    }else if(typeof a === "undefined"){
        console.warn("=----------   异常   -----------=");
        console.warn(a);
        console.warn("=------------------------------=");
        send_alert("信息失败 : "+e);
        return;
    }
    if(a.ret === "10000") {
        return true;
    }else{
        console.trace();
        console.error(b);
        console.error(JSON.stringify(a));
        send_alert("查询失败 : 请参阅控制台输出! ");
    }

    return false;
}

function on_fail(msg, sta) {
    Queue.errorCount += 1;
    if(Queue.errorCount >= 10){
        Queue.errorCount = 0;
        Queue.temporary = new Date().getTime() + 30*1000;
        Queue.shouldStop = true;
        console.warn("-----  Too many failure, temporary stop HTTP ------");
        send_alert("很抱歉,网络错误数量过多,暂时终止HTTP功能30s");
    }
    let vurl = "";
    try {
        vurl = " : "+this.url.substring(7, 12);
    }catch (e) {
        vurl = "";
    }
    send_alert("很抱歉,网络错误,请查看 Console" + vurl);
    console.warn("-----   网络请求失败 ---------");
    console.warn(JSON.stringify(this));
    console.warn("-----------msg-------------");
    console.warn(JSON.stringify(msg));
    console.warn("-----------sta--------------");
    console.warn(JSON.stringify(sta));
    console.warn("----------------------------");
}

function first_parse(ajax, obj) {
    if (typeof obj === "string") {
        obj = JSON.parse(obj);
    }

    if (typeof obj !== "object") {
        console.warn(ajax);
        throw "Error ! Parsing JSON failed ." + JSON.stringify(obj);
    }

    if (obj.ret === "10000") {
        return obj.model;
    } else {
        console.warn(ajax);
        throw "Error ! Server returned error." + JSON.stringify(obj);
    }
}


function on_document_load() {
    if(typeof (page_document_load) !== "undefined"){
        page_document_load();
    }
    if(typeof (resizeAll) !== "undefined"){
        resizeAll();
    }
}

var AlertClosingTimeout = 0;

function send_alert(a, b){

    if(Queue.shouldStop) return;
    $("#mpAlert").html(a);
    $("#mpAlert").show();

    if(AlertClosingTimeout > 0) {
        clearTimeout(AlertClosingTimeout);
    }

    AlertClosingTimeout = setTimeout(function(){
        if ($("#mpAlert").html().indexOf("<") >= 0) {
            return;
        }
        $("#mpAlert").hide();
    }, 10000);

    return;

    var q = "<!-- Modal 部分开始 -->\n<div class=\"modal fade\" id=\"alertModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n    <div class=\"modal-dialog\" role=\"document\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h5 class=\"modal-title\" id=\"alertModalLabel\">New message</h5>\n                <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <form>\n                    <div class=\"form-group\">\n                        <label for=\"recipient-name\" class=\"col-form-label\">Recipient:</label>\n                        <input type=\"text\" class=\"form-control\" id=\"recipient-name\">\n                    </div>\n                    <div class=\"form-group\">\n                        <label for=\"message-text\" class=\"col-form-label\">Message:</label>\n                        <textarea class=\"form-control\" id=\"message-text\"></textarea>\n                    </div>\n                </form>\n            </div>\n            <div class=\"modal-footer\">\n                <button type=\"button\" class=\"btn btn-secondary\" data-dismiss=\"modal\">Close</button>\n                <button type=\"button\" class=\"btn btn-primary\">Send message</button>\n            </div>\n        </div>\n    </div>\n</div>";
    //var model = document.createElement("div");
    if($("#modalContainer").length <= 0){
        alert(a);
        return ;
    }
    $("#modalContainer").html(q);
    var modalO = $("alertModal");
    if(modalO.length === 0){
        alert(a);
    }else{
        $("#alertModelLabel").text(b);
        $("#message-text").text(b);
        modalO.modal('show');
    }

}

function getUserName(uid){
    var uname = null;
    Users.list.forEach(function(val, aid, arr){
       if(val.worker.staffId === uid){
           uname = val.worker.staffName;
       }
    });
    if(uname == null) {
        get_data("oaStaff/list?staffId=" + uid, on_username_retn);
        return "[用户:"+uid+"]";
    }else{
        return uname;
    }
}

function on_username_retn(obj, sta) {
    var uid = this.url.substring(this.url.indexOf("staffId=") + 8);
    let ruid = parseInt(uid);
    var out = first_parse(this, obj);
    if(out.list.length > 0){
        Users.list.push({
            uid : ruid, worker: out.list[0]
        });
    }
}

function getSectorName(sectorId){
    var secName = null;
    Sectors.list.forEach(function(val, aid, arr){
        if(val.sector.sectorId === sectorId){
            secName = val.sector.sectorName;
        }
    });
    if(secName == null) {
        get_data("fcSector/list?sectorId=" + sectorId, on_secname_retn);
        return "[工位:"+sectorId+"]";
    }else{
        return secName;
    }
}

function on_secname_retn(obj, sta) {
    var secid = this.url.substring(this.url.indexOf("sectorId=") + 9);
    let rsecid = parseInt(secid);
    var out = first_parse(this, obj);
    if(out.list.length > 0){
        Sectors.list.push({
            secid : rsecid, sector: out.list[0]
        });
    }
}

function getSectorId(spotId){
    var secId = null;
    Sectors.list.forEach(function(val, aid, arr){
        if(val.sector.spotId === spotId){
            secId = val.sector.sectorId;
        }
    });
    if(secId == null) {
        get_data("fcSectorSpot/list?spotId=" + spotId, on_secid_retn);
        return -1;
    }else{
        return secId;
    }
}

function on_secid_retn(obj, sta) {
    var spotId = this.url.substring(this.url.indexOf("spotId=") + 7);
    let rsecid = parseInt(spotId);
    var out = first_parse(this, obj);
    if(out.list.length > 0){
        Sectors.list.push({
            secid : rsecid, sector: out.list[0]
        });
    }
}

/**
 *  Calc b/a+b * 100(precision = 2), when b is zero, return zero
 * @param a (pass)
 * @param b (fail)
 */
function get_factor(a,b){
    if(a+b === 0){
        return 0;
    }else{
        return Math.floor(10000* b / (a+b) ) / 100;
    }
}

function setCookieWithTimeout(name, value, liveMinutes) {
    if (liveMinutes == undefined || liveMinutes == null) {
        liveMinutes = 60 * 2;
    }
    if (typeof (liveMinutes) != 'number') {
        liveMinutes = 60 * 2;//默认120分钟
    }
    var minutes = liveMinutes * 60 * 1000;
    var exp = new Date();
    exp.setTime(exp.getTime() + minutes + 8 * 3600 * 1000);
    //path=/表示全站有效,而不是当前页
    document.cookie = name + "=" + value + ";path=/;expires=" + exp.toUTCString();
}

function setCookie(c_name,value,expiredays)
{
    var exdate=new Date()
    exdate.setDate(exdate.getDate()+expiredays)
    document.cookie=c_name+ "=" +escape(value)+
        ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())
}

function getCookie(c_name)
{
    if (document.cookie.length>0)
    {
        c_start=document.cookie.indexOf(c_name + "=")
        if (c_start!=-1)
        {
            c_start=c_start + c_name.length+1
            c_end=document.cookie.indexOf(";",c_start)
            if (c_end==-1) c_end=document.cookie.length
            return unescape(document.cookie.substring(c_start,c_end))
        }
    }
    return "";
}

var userId = utils_get_param("userId");

function getUserId() {
    console.log("Original  USERID : " + userId);
    var use = getCookie("doibyUser");
    if (use == null || use === undefined || use.length <= 0) {
        location.href = "sign-in1.html?from=entrance-1&msg=nologin-mustauth";
        return;
    }
    console.log("Got UID From COOKIE : " + use);
    try{
        var mm = parseInt(use);
        if(mm <= 0){
        }else{
            userId = mm;
        }
    }catch (e) {
        location.href = "sign-in1.html?from=entrance-1&msg=cookie-wrong-format";
        return;
    }

    console.log("Got UserId Eventually : " + userId);
}


$(document).ready(on_document_load);
get_server_url();