/**
 * @namespace
 */
(function () {
    "use strict";

    /**
     * 유틸리티 스태틱 클래스.
     * @namespace
     */
    emart24.util = new (emart24.Class(/** @lends emart24.util */{
        /**
         * POST 방식의 Ajax 호출을 통해서 json을 받아오는 메소드
         * fnPost(url, dataBody, 성공시 호출될 function)
         *
         * @param {string} url - server url.
         * @param {string} dataBody - dataBody.
         * @param {string} func - func.
         * @param {string} dataType - dataType.
         */
        fnPost : function(url, dataBody, dataType, func) {
            if (dataType == null) {
                dataType = 'json';
            }

            $.ajax(url, {
                type : 'POST',
                data : dataBody,
                dataType : dataType,
                timeout : 30000,
                success : func,
                error : function(xhr, err) {
//                    console.log("오류", "오류발생 : "+xhr.statusText+"/err:"+err);
                }
            });
        },
        /**
         * GET 방식의 Ajax 호출을 통해서 json을 받아오는 메소드
         * fnPost(url, dataBody, 성공시 호출될 function)
         *
         * @param {string} url - server url.
         * @param {string} dataBody - dataBody.
         * @param {string} func - func.
         * @param {string} dataType - dataType.
         */
        fnGet : function(url, dataBody, dataType, func) {
            if (dataType == null) {
                dataType = 'json';
            }

            $.ajax(url, {
                type : 'GET',
                data : dataBody,
                dataType : dataType,
                timeout : 30000,
                success : func,
                error : function(xhr, err) {
//                    console.log("오류", "오류발생 : "+xhr.statusText+"/err:"+err);
                }
            });
        },
        /**
         * 폼 입력 내용을 json 형태로 담는다.
         * ajax 전송시 data 항목에 넣을 때 유용.
         * var searchParam = emart24.util.serializeObject($('#myFormId'));
         *
         * @param {jqSelector} obj - form selector
         */
        serializeObject : function(obj) {
            var o = {};
            var a = obj.serializeArray();
            $.each(a, function() {
                if (o[this.name] !== undefined) {
                    if (!o[this.name].push) {
                        o[this.name] = [o[this.name]];
                    }
                    o[this.name].push(this.value || '');
                } else {
                    o[this.name] = this.value || '';
                }
            });
            return o;
        },
        callFunctionByName : function(name, data) {
            if(jQuery.type(name) === "function") {
                return name(data);
            }else {
                return window[name](data);
            }
        },
        download : function(uri, param) {
            var ifr = $('<iframe />').attr('src', uri + '?' + $.param(param, true)).hide().appendTo('body');
            setTimeout(function () {ifr.remove();}, 5000);
        },
        confirm : function(msg) {
            return confirm(msg);
        },
        alert : function(msg) {
            alert(msg);
        },
        numComma : function (x) {
            return x == null ? 0 : x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
        },
        /**
         * 휴대 전화번호를 입력 받아 3개로 나눔
         * return 을 Ojbect 로 받고 싶으면 number 만 넘기고,
         * return 을 String 형태로 받고 싶으면, isObject 파라미터에 false 를 줄 것
         * 기본적으로 12 자리임.
         * @param number
         * @param isObject
         */
        seperatePhoneNumber : function(number, isObject) {
            if (number == null) return null;
            isObject = typeof isObject !== 'undefined' ? isObject : true;
            number = number.replace('\-\g', '');
            var num = new Object();
            if (number.length < 10) {
                return num;
            } else if (number.length == 10) {
                num.FST = number.substring(0, 3);
                num.SND = number.substring(3, 6);
                num.TRD = number.substring(6, 10);
            } else if (number.length == 11) {
                num.FST = number.substring(0, 3);
                num.SND = number.substring(3, 7);
                num.TRD = number.substring(7, 11);
            } else if (number.length == 12) {
                num.FST = number.substring(0, 4);
                num.SND = number.substring(4, 8);
                num.TRD = number.substring(8, 12);
            }

            if (!isObject) {
                return num.FST + '-' + num.SND + '-' + num.TRD;
            } else {
                return num;
            }
        },
        lpad : function(str, padLen, padStr) {
            if (padStr.length > padLen) {
//                console.log("오류 : 채우고자 하는 문자열이 요청 길이보다 큽니다");
                return str;
            }
            str += ""; // 문자로
            padStr += ""; // 문자로
            while (str.length < padLen)
                str = padStr + str;
            str = str.length >= padLen ? str.substring(0, padLen) : str;
            return str;
        },
        rpad : function(str, padLen, padStr) {
            if (padStr.length > padLen) {
//                console.log("오류 : 채우고자 하는 문자열이 요청 길이보다 큽니다");
                return str + "";
            }
            str += ""; // 문자로
            padStr += ""; // 문자로
            while (str.length < padLen)
                str += padStr;
            str = str.length >= padLen ? str.substring(0, padLen) : str;
            return str;
        }
        /**
         * 랜덤 문자열 생성
         * @param len
         * @returns {string}
         */
        , makeRndString: function(len){
            var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
            var str = "";
            for (var i=0; i<len; i++) {
                var r = Math.floor(Math.random() * chars.length);
                str += chars.substring(r, r+1);
            }
            return str;
        }
        /**
         * Query String Parsing to JSON
         * @returns {{}}
         */
        , getUrlParams: function() {
            var params = {};
            window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(str, key, value) { params[key] = value; });
            return params;
        }

        /**
         * 예약픽업 N+1 행사 증정 수량 및 본품 수량 계산
         * @param nowQty
         * @param giftQtyAmt
         * @param giftGdsSupyQty
         * @returns {{buyOriQty: number, giftQty: number, baseQty: number, condQty: number}}
         */
        , preorderGiftQtyProc: function (nowQty, giftQtyAmt, giftGdsSupyQty) {
            /** 현재 구매 수량 */
            var buyQty = parseInt(nowQty, 10);

            /** 증정 체크 수량 */
            var checkQty = parseInt(giftQtyAmt, 10);

            /** 증정 지급 기준 수량 */
            var addQty = parseInt(giftGdsSupyQty, 10);

            /** 증정 수량 */
            var giftQty = Math.floor( buyQty / checkQty ) * addQty;

            /** 본품기준 수량 */
            var baseQty = parseInt(checkQty - addQty, 10);

            /** 증정 조건 수량 */
            var condQty = 0;
            if ( buyQty > checkQty ) {
                condQty = (buyQty%checkQty);
            } else {
                if (checkQty - nowQty == addQty) {
                    condQty = baseQty;
                }
            }

            /** 본품수량 */
            var buyOriQty = parseInt(buyQty-giftQty);

            var result = {
                condQty: condQty,
                baseQty: baseQty,
                giftQty: giftQty,
                buyOriQty: buyOriQty
            }
            return result;
        },basketCnt: function() {
        	$.ajax({
                type: "GET",
                url: "/mypage/preorder/cart/cartListCnt",
                async: false,
                success: function (result){
                	if(result != 0){
                		$("#headerBasketBtn").next().show();
                	}else{
                		$("#headerBasketBtn").next().hide();
                	}
                	$("#headerBasketBtn").next().html(result);
                },
                error: function (xhr, ajaxOptions, thrownError) {
                	openAlertPopup("일시적으로 서비스를 사용할 수 없습니다. 잠시 후 다시 시도해 주세요.");
//                    console.log("rsvt_pay cartListCnt 에러");
//                    console.log("xhr :: ", xhr);
//                    console.log("thrownError :: ", thrownError);
                }
            });
        }
        /**
         * 홈페이지 전환 여부 체크
         * @returns {string}
         */
        , checkIgnoreRedirectToWeb: function () {
            var ignorePath = ['/preorder/result', '/24con/result'];
            var location = document.location.pathname;
            var isIgnoreYn = 'N';
            $(ignorePath).each(function (index, item) {
                if (item == location) {
                    isIgnoreYn = 'Y';
                    return;
                }
            });
            return isIgnoreYn;
        }
    }));

    /**
     *  유효성 체크
     *  @namespace
     */
    emart24.validate = new (emart24.Class(/** @lends emart24.validate */{
        /**
         * 아이디 확인
         * (영문 대소문자와 숫자조합, 6자~20자) -> 숫자 조합 필수 제외
         */
        // id : function(value) {
        //     var re = /[^a-z0-9]+|^([a-z]+|[0-9]+)$/i;
        //     // var re = /[^a-z0-9]$/i;
        //     return !re.test(value) && value.length >=6 && value.length <= 20;
        // },
        /**
         * 아이디 확인
         * (영문 소문자, 6자~20자)
         */
        id : function(value) {
            var re = /^[a-z|0-9|]+$/; // 영어 소문자와 숫자만
            return re.test(value) && (value.length >=6 && value.length <= 20);
        },
        /**
         * 비밀번호 확인
         * (영문 대소문자와(대소문자구별), 숫자, 특수문자 조합하여 8자~20자)
         * var re = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{8,20}$/;
         *
         * TODO :: NEW 비밀번호 정책 ( 2023.07.20 )
         * ( 8자~9자 : 영문 대소문자, 숫자, 특수문자 3종 조합 )
         * ( 10자~20자 : 영문 대소문자, 숫자, 특수문자 2종 조합 )
         */
        password : function(value) {
            var re = "";
            if(value.length < 10) {
                re = /^.*(?=^.{8,10}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).*$/; //3종 조합
            } else {
                re = /^(?!((?:[A-Za-z]+)|(?:[$`~!@$!%*#^?&\\(\\)\-_=+]+)|(?:[0-9]+))$)[A-Za-z\d$`~!@$!%*#^?&\\(\\)\-_=+]{10,20}$/; //2종 조합
            }
            return re.test(value);
        },
        /**
         * 비밀번호 입력 불가 문자 확인
         * @param value
         * @returns {boolean}
         */
        invalidPassword: function(value) {
            var reg = /[%\^&*]/gi;
            if (reg.test(value)) {
                return true;
            } else {
                return false;
            }
        },
        /**
         * 이메일 확인
         */
        email : function(value) {
            var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
            return re.test(value);
        },
        /**
         * 일반전화번호 확인
         */
        tel : function(value) {
            value = value.replace(/-/g,"");
            // var re = /^(0(2|3[1-3]|4[1-4|9]|5[1-5]|6[1-4]|70))(\d{7,8})$/;
            var re = /^(0(2|3[1-3]|4[1-4|9]|5[1-5]|6[1-4]|70|50[0-9]))(\d{7,8})$/;     // 안심번호 추가(050~9 까지)
            return re.test(value);
        },
        /**
         * 휴대전화번호 확인
         */
        phone : function(value) {
            value = value.replace(/-/g,"");
            // var re = /^(?:(010-\d{4})|(01[1|6|7|8|9]-\d{3,4}))-(\d{4})$/;
            var re = /^(?:(010\d{8})|(01[1|6|7|8|9]\d{7,8}))$/;
            return re.test(value);
        },
        tel2: function(value) {
            return this.tel(value) || this.phone(value);
        }
        /**
         * 글자수 체크
         * @param oId
         * @returns {number}
         */
        , checkByte: function(oId) {
            var byte = function(str){
                var byteNum=0;
                for(var i=0;i<str.length;i++){
                    byteNum+=(str.charCodeAt(i)>127)?2:1;
                };
                return Math.round( byteNum/2 );
            };
            return byte($("#"+ oId).val());
        }
        /**
         * 불량 단어 체크
         * @param txt
         * @returns {boolean}
         */
        , checkBadWords: function(txt) {
            var badWords = [
                "8억","새끼","개새끼","소새끼","병신","지랄","씨팔","십팔","니기미","찌랄","쌍년","쌍놈","빙신","좆까","니기미","좆같은게",
                "잡놈","벼엉신","바보새끼","씹새끼","씨발","씨팔","시벌","씨벌","떠그랄","좆밥","추천인","추천id","추천아이디","추/천/인",
                "쉐이","등신","싸가지","미친놈","미친넘","찌랄","죽습니다","아님들아","씨밸넘","폰섹","카섹","번섹","조건만남","빠구리",
                "현금","포커","맞고","엔조이파트너","성인화상채팅","화상채팅메신저","성인만남","벙개팅","벙개","공개채팅","비공개채팅",
                "폰팅","전화채팅","문자채팅","1:1채팅","만남","얼짱","번개","급만남","중국여자엔조이","매칭서비스","파트너구함","술집여자구함",
                "만남주선","비밀스러운대화","성인동영상","파트너구함","남자중국엔조이","즉시만남","일대일만남","성인동영상","몸파는여자","동거정보",
                "미녀만남","태국남자파트너","여자중국파트너","여자대딸파트너","러시아여자","sex","섹스","섹파","매춘","애인대행","계약동거","무조건만남",
                "후배위","체위","리얼게임","현찰게임","성인PC","인터넷룰렛게임","현금게임","하룻밤","깊은만남","조건관광","성매매"
                ,"맛대가리","맛/대/가/리","맛.대.가.리","맛 대 가 리","맛대 가리","맛 대가 리"
                ,"쓰레기","쓰/레/기","쓰.레.기","쓰 레 기","쓰 레기","쓰레 기"
            ];
            var pattern = new RegExp(badWords.join("|"), "i");
            return pattern.test(txt);
        }
    }));

    /**
     *  UI Element 관련 편의성 함수
     *  @namespace
     */
    emart24.ui = new (emart24.Class(/** @lends emart24.ui */{

        /**
         * Select Element의 Item을 Text로 선택
         */
        setSelectByText : function(elementId, text) {
            $('#' + elementId + ' option:contains(' + text + ')').each(function(){
                if ($(this).text() == text) {
                    $(this).prop('selected', 'selected');
                    return false;
                }
                return true;
            });
        },


        /**
         * Select Element의 Item을 Value로 선택
         */
        setSelectByValue : function(elementId, value) {
            $('#' + elementId + ' option[value=' + value + ']').prop('selected', 'selected');
        }
    }));
})();
